diff --git a/app.json b/app.json index c4b7898..677a39b 100644 --- a/app.json +++ b/app.json @@ -114,7 +114,8 @@ "recordAudioAndroid": true } ], - "expo-audio" + "expo-audio", + "expo-video" ], "extra": { "eas": { diff --git a/dragNdropScreen.png b/dragNdropScreen.png new file mode 100644 index 0000000..7cd09c7 Binary files /dev/null and b/dragNdropScreen.png differ diff --git a/functions/index.js b/functions/index.js index 02cc511..fc689ff 100644 --- a/functions/index.js +++ b/functions/index.js @@ -2,7 +2,7 @@ const admin = require("firebase-admin"); const serviceAccount = require("./serviceAccountKey.json"); const { googleAI } = require("@genkit-ai/googleai"); const { GEMINI_API_KEY } = require("./config/keys"); -const { genkit, z } = require("genkit"); +const { genkit } = require("genkit"); const axios = require("axios"); admin.initializeApp({ diff --git a/functions/package-lock.json b/functions/package-lock.json index f95a0fd..7b2dc4c 100644 --- a/functions/package-lock.json +++ b/functions/package-lock.json @@ -6,12 +6,11 @@ "": { "name": "functions", "dependencies": { - "@genkit-ai/googleai": "^1.16.0", + "@genkit-ai/googleai": "^1.18.0", "axios": "^1.6.0", "firebase-admin": "^12.1.0", "firebase-functions": "^5.0.0", - "genkit": "^1.16.0", - "zod": "3.23.8" + "genkit": "^1.18.0" }, "devDependencies": { "eslint": "^8.15.0", @@ -21,6 +20,28 @@ "node": "18" } }, + "node_modules/@colors/colors": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", + "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@dabh/diagnostics": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz", + "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==", + "license": "MIT", + "optional": true, + "dependencies": { + "colorspace": "1.1.x", + "enabled": "2.0.x", + "kuler": "^2.0.0" + } + }, "node_modules/@eslint-community/eslint-utils": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", @@ -176,12 +197,12 @@ } }, "node_modules/@genkit-ai/ai": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/@genkit-ai/ai/-/ai-1.16.0.tgz", - "integrity": "sha512-Up1xdX1Ha4zE27E4ql6hEiLLlaZQXFCmynkqAko5P8SOxF/s39Oyj95cX/0wULxRsh6XJqv+Pqi/tMDdQuq+bw==", + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/@genkit-ai/ai/-/ai-1.18.0.tgz", + "integrity": "sha512-/rkMAtn3voQ3MhvGult863mrDRf0p86koyYk5Rfh8DSPffy/ir2QVzT1UCmNP/VaXEZig9+vfKh//8COsygUVg==", "license": "Apache-2.0", "dependencies": { - "@genkit-ai/core": "1.16.0", + "@genkit-ai/core": "1.18.0", "@opentelemetry/api": "^1.9.0", "@types/node": "^20.11.19", "colorette": "^2.0.20", @@ -194,9 +215,9 @@ } }, "node_modules/@genkit-ai/ai/node_modules/@types/node": { - "version": "20.19.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.10.tgz", - "integrity": "sha512-iAFpG6DokED3roLSP0K+ybeDdIX6Bc0Vd3mLW5uDqThPWtNos3E+EqOM11mPQHKzfWHqEBuLjIlsBQQ8CsISmQ==", + "version": "20.19.11", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.11.tgz", + "integrity": "sha512-uug3FEEGv0r+jrecvUUpbY8lLisvIjg6AAic6a2bSP5OEOLeJsDSnvhCDov7ipFFMXS3orMpzlmi0ZcuGkBbow==", "license": "MIT", "dependencies": { "undici-types": "~6.21.0" @@ -221,14 +242,15 @@ } }, "node_modules/@genkit-ai/core": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/@genkit-ai/core/-/core-1.16.0.tgz", - "integrity": "sha512-Avfb0Dh/Zuflcst5HShBHfEcEQFv3NZ6PsSFvLXDAMeocj3Gfn6Rec2K2qAoSbLTtYvFXeXzjMi8eFnMS3QrOg==", + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/@genkit-ai/core/-/core-1.18.0.tgz", + "integrity": "sha512-meuc5A4cJWI+vMXeaELLRKDx+vytyvVvBSjD6pz6tD66j5H6I25Y9iGmM/UIAHqbrarM5Kl4bKLI8MtD+QSXdA==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/api": "^1.9.0", "@opentelemetry/context-async-hooks": "~1.25.0", "@opentelemetry/core": "~1.25.0", + "@opentelemetry/exporter-jaeger": "^1.25.0", "@opentelemetry/sdk-metrics": "~1.25.0", "@opentelemetry/sdk-node": "^0.52.0", "@opentelemetry/sdk-trace-base": "~1.25.0", @@ -244,6 +266,9 @@ "json-schema": "^0.4.0", "zod": "^3.23.8", "zod-to-json-schema": "^3.22.4" + }, + "optionalDependencies": { + "@genkit-ai/firebase": "^1.16.1" } }, "node_modules/@genkit-ai/core/node_modules/ajv": { @@ -268,10 +293,79 @@ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "license": "MIT" }, + "node_modules/@genkit-ai/firebase": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/@genkit-ai/firebase/-/firebase-1.18.0.tgz", + "integrity": "sha512-UJVR2Z8839ptPqO+I7WICALlOZdDl4RbYDEaPjK8FpQmyJBjdpToevi6c2MoAXg8wTEd68i1b0cGPKXk9HPTyg==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@genkit-ai/google-cloud": "^1.18.0" + }, + "peerDependencies": { + "@google-cloud/firestore": "^7.11.0", + "firebase": ">=11.5.0", + "firebase-admin": ">=12.2", + "genkit": "^1.18.0" + }, + "peerDependenciesMeta": { + "firebase": { + "optional": true + } + } + }, + "node_modules/@genkit-ai/google-cloud": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/@genkit-ai/google-cloud/-/google-cloud-1.18.0.tgz", + "integrity": "sha512-gVKYmtDl/QiWnOq2qWnzY4SsaP1h1rS2HmHibjM1DHc9qNfBOk1dkGL4shmX7N4R/fcFWFLt7nXQiPJKu6NngQ==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@google-cloud/logging-winston": "^6.0.0", + "@google-cloud/opentelemetry-cloud-monitoring-exporter": "^0.19.0", + "@google-cloud/opentelemetry-cloud-trace-exporter": "^2.4.1", + "@google-cloud/opentelemetry-resource-util": "^2.4.0", + "@opentelemetry/api": "^1.9.0", + "@opentelemetry/auto-instrumentations-node": "^0.49.1", + "@opentelemetry/core": "~1.25.0", + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/instrumentation-pino": "^0.41.0", + "@opentelemetry/instrumentation-winston": "^0.39.0", + "@opentelemetry/resources": "~1.25.0", + "@opentelemetry/sdk-metrics": "~1.25.0", + "@opentelemetry/sdk-node": "^0.52.0", + "@opentelemetry/sdk-trace-base": "~1.25.0", + "google-auth-library": "^9.6.3", + "node-fetch": "^3.3.2", + "winston": "^3.12.0" + }, + "peerDependencies": { + "genkit": "^1.18.0" + } + }, + "node_modules/@genkit-ai/google-cloud/node_modules/node-fetch": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "license": "MIT", + "optional": true, + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" + } + }, "node_modules/@genkit-ai/googleai": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/@genkit-ai/googleai/-/googleai-1.16.0.tgz", - "integrity": "sha512-0GTR+d9HIvaMXSpA4SfhkZkkRQrMC+LGfgJPqbJ+iDequlqu8szd4LKQyvNsIb1eFA8bXP6w0T4+AILtDRmYyw==", + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/@genkit-ai/googleai/-/googleai-1.18.0.tgz", + "integrity": "sha512-W9gNgkb5dA2CZYQ++CKekTR1Al99dMSvjBF73l1EPmDC211CCBbq1metj6QkeSkFfSGhVFLveKUCC7RxIsoPxA==", "license": "Apache-2.0", "dependencies": { "@google/generative-ai": "^0.24.0", @@ -279,7 +373,7 @@ "node-fetch": "^3.3.2" }, "peerDependencies": { - "genkit": "^1.16.0" + "genkit": "^1.18.0" } }, "node_modules/@genkit-ai/googleai/node_modules/node-fetch": { @@ -300,6 +394,27 @@ "url": "https://opencollective.com/node-fetch" } }, + "node_modules/@google-cloud/common": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-5.0.2.tgz", + "integrity": "sha512-V7bmBKYQyu0eVG2BFejuUjlBt+zrya6vtsKdY+JxMM/dNntPF41vZ9+LhOshEUH01zOHEqBSvI7Dad7ZS6aUeA==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@google-cloud/projectify": "^4.0.0", + "@google-cloud/promisify": "^4.0.0", + "arrify": "^2.0.1", + "duplexify": "^4.1.1", + "extend": "^3.0.2", + "google-auth-library": "^9.0.0", + "html-entities": "^2.5.2", + "retry-request": "^7.0.0", + "teeny-request": "^9.0.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/@google-cloud/firestore": { "version": "7.11.3", "resolved": "https://registry.npmjs.org/@google-cloud/firestore/-/firestore-7.11.3.tgz", @@ -317,6 +432,128 @@ "node": ">=14.0.0" } }, + "node_modules/@google-cloud/logging": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/@google-cloud/logging/-/logging-11.2.0.tgz", + "integrity": "sha512-Ma94jvuoMpbgNniwtelOt8w82hxK62FuOXZonEv0Hyk3B+/YVuLG/SWNyY9yMso/RXnPEc1fP2qo9kDrjf/b2w==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@google-cloud/common": "^5.0.0", + "@google-cloud/paginator": "^5.0.0", + "@google-cloud/projectify": "^4.0.0", + "@google-cloud/promisify": "^4.0.0", + "@opentelemetry/api": "^1.7.0", + "arrify": "^2.0.1", + "dot-prop": "^6.0.0", + "eventid": "^2.0.0", + "extend": "^3.0.2", + "gcp-metadata": "^6.0.0", + "google-auth-library": "^9.0.0", + "google-gax": "^4.0.3", + "on-finished": "^2.3.0", + "pumpify": "^2.0.1", + "stream-events": "^1.0.5", + "uuid": "^9.0.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@google-cloud/logging-winston": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@google-cloud/logging-winston/-/logging-winston-6.0.1.tgz", + "integrity": "sha512-tgA/qe/aGZITMrJ/5Tuykv234pLb/Qo6iDZ8SDkjbsiIy69mLQmbphrUd/IqnE17BSDfrwDUckvWdghiy8b+Qg==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@google-cloud/logging": "^11.0.0", + "google-auth-library": "^9.0.0", + "lodash.mapvalues": "^4.6.0", + "winston-transport": "^4.3.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "winston": ">=3.2.1" + } + }, + "node_modules/@google-cloud/logging/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "optional": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@google-cloud/opentelemetry-cloud-monitoring-exporter": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@google-cloud/opentelemetry-cloud-monitoring-exporter/-/opentelemetry-cloud-monitoring-exporter-0.19.0.tgz", + "integrity": "sha512-5SOPXwC6RET4ZvXxw5D97dp8fWpqWEunHrzrUUGXhG4UAeedQe1KvYV8CK+fnaAbN2l2ha6QDYspT6z40TVY0g==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@google-cloud/opentelemetry-resource-util": "^2.3.0", + "@google-cloud/precise-date": "^4.0.0", + "google-auth-library": "^9.0.0", + "googleapis": "^137.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0", + "@opentelemetry/core": "^1.0.0", + "@opentelemetry/resources": "^1.0.0", + "@opentelemetry/sdk-metrics": "^1.0.0" + } + }, + "node_modules/@google-cloud/opentelemetry-cloud-trace-exporter": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@google-cloud/opentelemetry-cloud-trace-exporter/-/opentelemetry-cloud-trace-exporter-2.4.1.tgz", + "integrity": "sha512-Dq2IyAyA9PCjbjLOn86i2byjkYPC59b5ic8k/L4q5bBWH0Jro8lzMs8C0G5pJfqh2druj8HF+oAIAlSdWQ+Z9Q==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@google-cloud/opentelemetry-resource-util": "^2.4.0", + "@grpc/grpc-js": "^1.1.8", + "@grpc/proto-loader": "^0.7.0", + "google-auth-library": "^9.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0", + "@opentelemetry/core": "^1.0.0", + "@opentelemetry/resources": "^1.0.0", + "@opentelemetry/sdk-trace-base": "^1.0.0" + } + }, + "node_modules/@google-cloud/opentelemetry-resource-util": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@google-cloud/opentelemetry-resource-util/-/opentelemetry-resource-util-2.4.0.tgz", + "integrity": "sha512-/7ujlMoKtDtrbQlJihCjQnm31n2s2RTlvJqcSbt2jV3OkCzPAdo3u31Q13HNugqtIRUSk7bUoLx6AzhURkhW4w==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.22.0", + "gcp-metadata": "^6.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/resources": "^1.0.0" + } + }, "node_modules/@google-cloud/paginator": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/@google-cloud/paginator/-/paginator-5.0.2.tgz", @@ -331,6 +568,16 @@ "node": ">=14.0.0" } }, + "node_modules/@google-cloud/precise-date": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@google-cloud/precise-date/-/precise-date-4.0.0.tgz", + "integrity": "sha512-1TUx3KdaU3cN7nfCdNf+UVqA/PSX29Cjcox3fZZBtINlRrXVTmUkQnCKv2MbBUbCopbK4olAT1IHl76uZyCiVA==", + "license": "Apache-2.0", + "optional": true, + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/@google-cloud/projectify": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@google-cloud/projectify/-/projectify-4.0.0.tgz", @@ -535,6 +782,68 @@ "node": ">=14" } }, + "node_modules/@opentelemetry/auto-instrumentations-node": { + "version": "0.49.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/auto-instrumentations-node/-/auto-instrumentations-node-0.49.2.tgz", + "integrity": "sha512-xtETEPmAby/3MMmedv8Z/873sdLTWg+Vq98rtm4wbwvAiXBB/ao8qRyzRlvR2MR6puEr+vIB/CXeyJnzNA3cyw==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/instrumentation-amqplib": "^0.41.0", + "@opentelemetry/instrumentation-aws-lambda": "^0.43.0", + "@opentelemetry/instrumentation-aws-sdk": "^0.43.1", + "@opentelemetry/instrumentation-bunyan": "^0.40.0", + "@opentelemetry/instrumentation-cassandra-driver": "^0.40.0", + "@opentelemetry/instrumentation-connect": "^0.38.0", + "@opentelemetry/instrumentation-cucumber": "^0.8.0", + "@opentelemetry/instrumentation-dataloader": "^0.11.0", + "@opentelemetry/instrumentation-dns": "^0.38.0", + "@opentelemetry/instrumentation-express": "^0.41.1", + "@opentelemetry/instrumentation-fastify": "^0.38.0", + "@opentelemetry/instrumentation-fs": "^0.14.0", + "@opentelemetry/instrumentation-generic-pool": "^0.38.1", + "@opentelemetry/instrumentation-graphql": "^0.42.0", + "@opentelemetry/instrumentation-grpc": "^0.52.0", + "@opentelemetry/instrumentation-hapi": "^0.40.0", + "@opentelemetry/instrumentation-http": "^0.52.0", + "@opentelemetry/instrumentation-ioredis": "^0.42.0", + "@opentelemetry/instrumentation-kafkajs": "^0.2.0", + "@opentelemetry/instrumentation-knex": "^0.39.0", + "@opentelemetry/instrumentation-koa": "^0.42.0", + "@opentelemetry/instrumentation-lru-memoizer": "^0.39.0", + "@opentelemetry/instrumentation-memcached": "^0.38.0", + "@opentelemetry/instrumentation-mongodb": "^0.46.0", + "@opentelemetry/instrumentation-mongoose": "^0.41.0", + "@opentelemetry/instrumentation-mysql": "^0.40.0", + "@opentelemetry/instrumentation-mysql2": "^0.40.0", + "@opentelemetry/instrumentation-nestjs-core": "^0.39.0", + "@opentelemetry/instrumentation-net": "^0.38.0", + "@opentelemetry/instrumentation-pg": "^0.43.0", + "@opentelemetry/instrumentation-pino": "^0.41.0", + "@opentelemetry/instrumentation-redis": "^0.41.0", + "@opentelemetry/instrumentation-redis-4": "^0.41.1", + "@opentelemetry/instrumentation-restify": "^0.40.0", + "@opentelemetry/instrumentation-router": "^0.39.0", + "@opentelemetry/instrumentation-socket.io": "^0.41.0", + "@opentelemetry/instrumentation-tedious": "^0.13.0", + "@opentelemetry/instrumentation-undici": "^0.5.0", + "@opentelemetry/instrumentation-winston": "^0.39.0", + "@opentelemetry/resource-detector-alibaba-cloud": "^0.29.0", + "@opentelemetry/resource-detector-aws": "^1.6.0", + "@opentelemetry/resource-detector-azure": "^0.2.10", + "@opentelemetry/resource-detector-container": "^0.4.0", + "@opentelemetry/resource-detector-gcp": "^0.29.10", + "@opentelemetry/resources": "^1.24.0", + "@opentelemetry/sdk-node": "^0.52.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.4.1" + } + }, "node_modules/@opentelemetry/context-async-hooks": { "version": "1.25.1", "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-1.25.1.tgz", @@ -571,6 +880,81 @@ "node": ">=14" } }, + "node_modules/@opentelemetry/exporter-jaeger": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-jaeger/-/exporter-jaeger-1.30.1.tgz", + "integrity": "sha512-7Ki+x7cZ/PEQxp3UyB+CWkWBqLk22yRGQ4AWIGwZlEs6rpCOdWwIFOyQDO9DdeyWtTPTvO3An/7chPZcRHOgzQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.30.1", + "@opentelemetry/sdk-trace-base": "1.30.1", + "@opentelemetry/semantic-conventions": "1.28.0", + "jaeger-client": "^3.15.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/exporter-jaeger/node_modules/@opentelemetry/core": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.30.1.tgz", + "integrity": "sha512-OOCM2C/QIURhJMuKaekP3TRBxBKxG/TWWA0TL2J6nXUtDnuCtccy49LUJF8xPFXMX+0LMcxFpCo8M9cGY1W6rQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "1.28.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-jaeger/node_modules/@opentelemetry/resources": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.30.1.tgz", + "integrity": "sha512-5UxZqiAgLYGFjS4s9qm5mBVo433u+dSPUFWVWXmLAD4wB65oMCoXaJP1KJa9DIYYMeHu3z4BZcStG3LC593cWA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.30.1", + "@opentelemetry/semantic-conventions": "1.28.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-jaeger/node_modules/@opentelemetry/sdk-trace-base": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.30.1.tgz", + "integrity": "sha512-jVPgBbH1gCy2Lb7X0AVQ8XAfgg0pJ4nvl8/IiQA6nxOsPvS+0zMJaFSs2ltXe0J6C8dqjcnpyqINDJmU30+uOg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.30.1", + "@opentelemetry/resources": "1.30.1", + "@opentelemetry/semantic-conventions": "1.28.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-jaeger/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.28.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz", + "integrity": "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, "node_modules/@opentelemetry/exporter-trace-otlp-grpc": { "version": "0.52.1", "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-grpc/-/exporter-trace-otlp-grpc-0.52.1.tgz", @@ -676,16 +1060,722 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "node_modules/@opentelemetry/instrumentation-amqplib": { + "version": "0.41.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-amqplib/-/instrumentation-amqplib-0.41.0.tgz", + "integrity": "sha512-00Oi6N20BxJVcqETjgNzCmVKN+I5bJH/61IlHiIWd00snj1FdgiIKlpE4hYVacTB2sjIBB3nTbHskttdZEE2eg==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/semantic-conventions": "^1.22.0" }, "engines": { - "node": ">=10" + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-aws-lambda": { + "version": "0.43.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-aws-lambda/-/instrumentation-aws-lambda-0.43.0.tgz", + "integrity": "sha512-pSxcWlsE/pCWQRIw92sV2C+LmKXelYkjkA7C5s39iPUi4pZ2lA1nIiw+1R/y2pDEhUHcaKkNyljQr3cx9ZpVlQ==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/propagator-aws-xray": "^1.3.1", + "@opentelemetry/resources": "^1.8.0", + "@opentelemetry/semantic-conventions": "^1.22.0", + "@types/aws-lambda": "8.10.122" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-aws-sdk": { + "version": "0.43.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-aws-sdk/-/instrumentation-aws-sdk-0.43.1.tgz", + "integrity": "sha512-qLT2cCniJ5W+6PFzKbksnoIQuq9pS83nmgaExfUwXVvlwi0ILc50dea0tWBHZMkdIDa/zZdcuFrJ7+fUcSnRow==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/propagation-utils": "^0.30.10", + "@opentelemetry/semantic-conventions": "^1.22.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-bunyan": { + "version": "0.40.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-bunyan/-/instrumentation-bunyan-0.40.0.tgz", + "integrity": "sha512-aZ4cXaGWwj79ZXSYrgFVsrDlE4mmf2wfvP9bViwRc0j75A6eN6GaHYHqufFGMTCqASQn5pIjjP+Bx+PWTGiofw==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@opentelemetry/api-logs": "^0.52.0", + "@opentelemetry/instrumentation": "^0.52.0", + "@types/bunyan": "1.8.9" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-cassandra-driver": { + "version": "0.40.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-cassandra-driver/-/instrumentation-cassandra-driver-0.40.0.tgz", + "integrity": "sha512-JxbM39JU7HxE9MTKKwi6y5Z3mokjZB2BjwfqYi4B3Y29YO3I42Z7eopG6qq06yWZc+nQli386UDQe0d9xKmw0A==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/semantic-conventions": "^1.22.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-connect": { + "version": "0.38.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-connect/-/instrumentation-connect-0.38.0.tgz", + "integrity": "sha512-2/nRnx3pjYEmdPIaBwtgtSviTKHWnDZN3R+TkRUnhIVrvBKVcq+I5B2rtd6mr6Fe9cHlZ9Ojcuh7pkNh/xdWWg==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/semantic-conventions": "^1.22.0", + "@types/connect": "3.4.36" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-connect/node_modules/@types/connect": { + "version": "3.4.36", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.36.tgz", + "integrity": "sha512-P63Zd/JUGq+PdrM1lv0Wv5SBYeA2+CORvbrXbngriYY0jzLUWfQMQQxOhjONEz/wlHOAxOdY7CY65rgQdTjq2w==", + "license": "MIT", + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@opentelemetry/instrumentation-cucumber": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-cucumber/-/instrumentation-cucumber-0.8.0.tgz", + "integrity": "sha512-ieTm4RBIlZt2brPwtX5aEZYtYnkyqhAVXJI9RIohiBVMe5DxiwCwt+2Exep/nDVqGPX8zRBZUl4AEw423OxJig==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/semantic-conventions": "^1.22.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/instrumentation-dataloader": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-dataloader/-/instrumentation-dataloader-0.11.0.tgz", + "integrity": "sha512-27urJmwkH4KDaMJtEv1uy2S7Apk4XbN4AgWMdfMJbi7DnOduJmeuA+DpJCwXB72tEWXo89z5T3hUVJIDiSNmNw==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@opentelemetry/instrumentation": "^0.52.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-dns": { + "version": "0.38.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-dns/-/instrumentation-dns-0.38.0.tgz", + "integrity": "sha512-Um07I0TQXDWa+ZbEAKDFUxFH40dLtejtExDOMLNJ1CL8VmOmA71qx93Qi/QG4tGkiI1XWqr7gF/oiMCJ4m8buQ==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@opentelemetry/instrumentation": "^0.52.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-express": { + "version": "0.41.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-express/-/instrumentation-express-0.41.1.tgz", + "integrity": "sha512-uRx0V3LPGzjn2bxAnV8eUsDT82vT7NTwI0ezEuPMBOTOsnPpGhWdhcdNdhH80sM4TrWrOfXm9HGEdfWE3TRIww==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/semantic-conventions": "^1.22.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-fastify": { + "version": "0.38.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-fastify/-/instrumentation-fastify-0.38.0.tgz", + "integrity": "sha512-HBVLpTSYpkQZ87/Df3N0gAw7VzYZV3n28THIBrJWfuqw3Or7UqdhnjeuMIPQ04BKk3aZc0cWn2naSQObbh5vXw==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/semantic-conventions": "^1.22.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-fs": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-fs/-/instrumentation-fs-0.14.0.tgz", + "integrity": "sha512-pVc8P5AgliC1DphyyBUgsxXlm2XaPH4BpYvt7rAZDMIqUpRk8gs19SioABtKqqxvFzg5jPtgJfJsdxq0Y+maLw==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.52.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-generic-pool": { + "version": "0.38.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-generic-pool/-/instrumentation-generic-pool-0.38.1.tgz", + "integrity": "sha512-WvssuKCuavu/hlq661u82UWkc248cyI/sT+c2dEIj6yCk0BUkErY1D+9XOO+PmHdJNE+76i2NdcvQX5rJrOe/w==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@opentelemetry/instrumentation": "^0.52.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-graphql": { + "version": "0.42.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-graphql/-/instrumentation-graphql-0.42.0.tgz", + "integrity": "sha512-N8SOwoKL9KQSX7z3gOaw5UaTeVQcfDO1c21csVHnmnmGUoqsXbArK2B8VuwPWcv6/BC/i3io+xTo7QGRZ/z28Q==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@opentelemetry/instrumentation": "^0.52.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-grpc": { + "version": "0.52.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-grpc/-/instrumentation-grpc-0.52.1.tgz", + "integrity": "sha512-EdSDiDSAO+XRXk/ZN128qQpBo1I51+Uay/LUPcPQhSRGf7fBPIEUBeOLQiItguGsug5MGOYjql2w/1wCQF3fdQ==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@opentelemetry/instrumentation": "0.52.1", + "@opentelemetry/semantic-conventions": "1.25.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-grpc/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.25.1.tgz", + "integrity": "sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ==", + "license": "Apache-2.0", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/instrumentation-hapi": { + "version": "0.40.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-hapi/-/instrumentation-hapi-0.40.0.tgz", + "integrity": "sha512-8U/w7Ifumtd2bSN1OLaSwAAFhb9FyqWUki3lMMB0ds+1+HdSxYBe9aspEJEgvxAqOkrQnVniAPTEGf1pGM7SOw==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/semantic-conventions": "^1.22.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-http": { + "version": "0.52.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-http/-/instrumentation-http-0.52.1.tgz", + "integrity": "sha512-dG/aevWhaP+7OLv4BQQSEKMJv8GyeOp3Wxl31NHqE8xo9/fYMfEljiZphUHIfyg4gnZ9swMyWjfOQs5GUQe54Q==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@opentelemetry/core": "1.25.1", + "@opentelemetry/instrumentation": "0.52.1", + "@opentelemetry/semantic-conventions": "1.25.1", + "semver": "^7.5.2" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-http/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.25.1.tgz", + "integrity": "sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ==", + "license": "Apache-2.0", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/instrumentation-ioredis": { + "version": "0.42.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-ioredis/-/instrumentation-ioredis-0.42.0.tgz", + "integrity": "sha512-P11H168EKvBB9TUSasNDOGJCSkpT44XgoM6d3gRIWAa9ghLpYhl0uRkS8//MqPzcJVHr3h3RmfXIpiYLjyIZTw==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/redis-common": "^0.36.2", + "@opentelemetry/semantic-conventions": "^1.23.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-kafkajs": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-kafkajs/-/instrumentation-kafkajs-0.2.0.tgz", + "integrity": "sha512-uKKmhEFd0zR280tJovuiBG7cfnNZT4kvVTvqtHPxQP7nOmRbJstCYHFH13YzjVcKjkmoArmxiSulmZmF7SLIlg==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/semantic-conventions": "^1.24.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-knex": { + "version": "0.39.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-knex/-/instrumentation-knex-0.39.0.tgz", + "integrity": "sha512-lRwTqIKQecPWDkH1KEcAUcFhCaNssbKSpxf4sxRTAROCwrCEnYkjOuqJHV+q1/CApjMTaKu0Er4LBv/6bDpoxA==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/semantic-conventions": "^1.22.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-koa": { + "version": "0.42.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-koa/-/instrumentation-koa-0.42.0.tgz", + "integrity": "sha512-H1BEmnMhho8o8HuNRq5zEI4+SIHDIglNB7BPKohZyWG4fWNuR7yM4GTlR01Syq21vODAS7z5omblScJD/eZdKw==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/semantic-conventions": "^1.22.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-lru-memoizer": { + "version": "0.39.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-lru-memoizer/-/instrumentation-lru-memoizer-0.39.0.tgz", + "integrity": "sha512-eU1Wx1RRTR/2wYXFzH9gcpB8EPmhYlNDIUHzUXjyUE0CAXEJhBLkYNlzdaVCoQDw2neDqS+Woshiia6+emWK9A==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@opentelemetry/instrumentation": "^0.52.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-memcached": { + "version": "0.38.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-memcached/-/instrumentation-memcached-0.38.0.tgz", + "integrity": "sha512-tPmyqQEZNyrvg6G+iItdlguQEcGzfE+bJkpQifmBXmWBnoS5oU3UxqtyYuXGL2zI9qQM5yMBHH4nRXWALzy7WA==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/semantic-conventions": "^1.23.0", + "@types/memcached": "^2.2.6" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-mongodb": { + "version": "0.46.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongodb/-/instrumentation-mongodb-0.46.0.tgz", + "integrity": "sha512-VF/MicZ5UOBiXrqBslzwxhN7TVqzu1/LN/QDpkskqM0Zm0aZ4CVRbUygL8d7lrjLn15x5kGIe8VsSphMfPJzlA==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/sdk-metrics": "^1.9.1", + "@opentelemetry/semantic-conventions": "^1.22.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-mongoose": { + "version": "0.41.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongoose/-/instrumentation-mongoose-0.41.0.tgz", + "integrity": "sha512-ivJg4QnnabFxxoI7K8D+in7hfikjte38sYzJB9v1641xJk9Esa7jM3hmbPB7lxwcgWJLVEDvfPwobt1if0tXxA==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/semantic-conventions": "^1.22.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-mysql": { + "version": "0.40.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql/-/instrumentation-mysql-0.40.0.tgz", + "integrity": "sha512-d7ja8yizsOCNMYIJt5PH/fKZXjb/mS48zLROO4BzZTtDfhNCl2UM/9VIomP2qkGIFVouSJrGr/T00EzY7bPtKA==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/semantic-conventions": "^1.22.0", + "@types/mysql": "2.15.22" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-mysql2": { + "version": "0.40.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql2/-/instrumentation-mysql2-0.40.0.tgz", + "integrity": "sha512-0xfS1xcqUmY7WE1uWjlmI67Xg3QsSUlNT+AcXHeA4BDUPwZtWqF4ezIwLgpVZfHOnkAEheqGfNSWd1PIu3Wnfg==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/semantic-conventions": "^1.22.0", + "@opentelemetry/sql-common": "^0.40.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-nestjs-core": { + "version": "0.39.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-nestjs-core/-/instrumentation-nestjs-core-0.39.0.tgz", + "integrity": "sha512-mewVhEXdikyvIZoMIUry8eb8l3HUjuQjSjVbmLVTt4NQi35tkpnHQrG9bTRBrl3403LoWZ2njMPJyg4l6HfKvA==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/semantic-conventions": "^1.23.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-net": { + "version": "0.38.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-net/-/instrumentation-net-0.38.0.tgz", + "integrity": "sha512-stjow1PijcmUquSmRD/fSihm/H61DbjPlJuJhWUe7P22LFPjFhsrSeiB5vGj3vn+QGceNAs+kioUTzMGPbNxtg==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/semantic-conventions": "^1.23.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-pg": { + "version": "0.43.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pg/-/instrumentation-pg-0.43.0.tgz", + "integrity": "sha512-og23KLyoxdnAeFs1UWqzSonuCkePUzCX30keSYigIzJe/6WSYA8rnEI5lobcxPEzg+GcU06J7jzokuEHbjVJNw==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/semantic-conventions": "^1.22.0", + "@opentelemetry/sql-common": "^0.40.1", + "@types/pg": "8.6.1", + "@types/pg-pool": "2.0.4" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-pino": { + "version": "0.41.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pino/-/instrumentation-pino-0.41.0.tgz", + "integrity": "sha512-Kpv0fJRk/8iMzMk5Ue5BsUJfHkBJ2wQoIi/qduU1a1Wjx9GLj6J2G17PHjPK5mnZjPNzkFOXFADZMfgDioliQw==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@opentelemetry/api-logs": "^0.52.0", + "@opentelemetry/core": "^1.25.0", + "@opentelemetry/instrumentation": "^0.52.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-redis": { + "version": "0.41.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-redis/-/instrumentation-redis-0.41.0.tgz", + "integrity": "sha512-RJ1pwI3btykp67ts+5qZbaFSAAzacucwBet5/5EsKYtWBpHbWwV/qbGN/kIBzXg5WEZBhXLrR/RUq0EpEUpL3A==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/redis-common": "^0.36.2", + "@opentelemetry/semantic-conventions": "^1.22.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-redis-4": { + "version": "0.41.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-redis-4/-/instrumentation-redis-4-0.41.1.tgz", + "integrity": "sha512-UqJAbxraBk7s7pQTlFi5ND4sAUs4r/Ai7gsAVZTQDbHl2kSsOp7gpHcpIuN5dpcI2xnuhM2tkH4SmEhbrv2S6Q==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/redis-common": "^0.36.2", + "@opentelemetry/semantic-conventions": "^1.22.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-restify": { + "version": "0.40.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-restify/-/instrumentation-restify-0.40.0.tgz", + "integrity": "sha512-sm/rH/GysY/KOEvZqYBZSLYFeXlBkHCgqPDgWc07tz+bHCN6mPs9P3otGOSTe7o3KAIM8Nc6ncCO59vL+jb2cA==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/semantic-conventions": "^1.22.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-router": { + "version": "0.39.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-router/-/instrumentation-router-0.39.0.tgz", + "integrity": "sha512-LaXnVmD69WPC4hNeLzKexCCS19hRLrUw3xicneAMkzJSzNJvPyk7G6I7lz7VjQh1cooObPBt9gNyd3hhTCUrag==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/semantic-conventions": "^1.22.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-socket.io": { + "version": "0.41.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-socket.io/-/instrumentation-socket.io-0.41.0.tgz", + "integrity": "sha512-7fzDe9/FpO6NFizC/wnzXXX7bF9oRchsD//wFqy5g5hVEgXZCQ70IhxjrKdBvgjyIejR9T9zTvfQ6PfVKfkCAw==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/semantic-conventions": "^1.22.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-tedious": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-tedious/-/instrumentation-tedious-0.13.0.tgz", + "integrity": "sha512-Pob0+0R62AqXH50pjazTeGBy/1+SK4CYpFUBV5t7xpbpeuQezkkgVGvLca84QqjBqQizcXedjpUJLgHQDixPQg==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/semantic-conventions": "^1.22.0", + "@types/tedious": "^4.0.14" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-undici": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-undici/-/instrumentation-undici-0.5.0.tgz", + "integrity": "sha512-aNTeSrFAVcM9qco5DfZ9DNXu6hpMRe8Kt8nCDHfMWDB3pwgGVUE76jTdohc+H/7eLRqh4L7jqs5NSQoHw7S6ww==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.52.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.7.0" + } + }, + "node_modules/@opentelemetry/instrumentation-winston": { + "version": "0.39.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-winston/-/instrumentation-winston-0.39.0.tgz", + "integrity": "sha512-v/1xziLJ9CyB3YDjBSBzbB70Qd0JwWTo36EqWK5m3AR0CzsyMQQmf3ZIZM6sgx7hXMcRQ0pnEYhg6nhrUQPm9A==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@opentelemetry/api-logs": "^0.52.0", + "@opentelemetry/instrumentation": "^0.52.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" } }, "node_modules/@opentelemetry/otlp-exporter-base": { @@ -743,6 +1833,32 @@ "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, + "node_modules/@opentelemetry/propagation-utils": { + "version": "0.30.16", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagation-utils/-/propagation-utils-0.30.16.tgz", + "integrity": "sha512-ZVQ3Z/PQ+2GQlrBfbMMMT0U7MzvYZLCPP800+ooyaBqm4hMvuQHfP028gB9/db0mwkmyEAMad9houukUVxhwcw==", + "license": "Apache-2.0", + "optional": true, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/propagator-aws-xray": { + "version": "1.26.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-aws-xray/-/propagator-aws-xray-1.26.2.tgz", + "integrity": "sha512-k43wxTjKYvwfce9L4eT8fFYy/ATmCfPHZPZsyT/6ABimf2KE1HafoOsIcxLOtmNSZt6dCvBIYCrXaOWta20xJg==", + "license": "Apache-2.0", + "optional": true, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, "node_modules/@opentelemetry/propagator-b3": { "version": "1.25.1", "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-b3/-/propagator-b3-1.25.1.tgz", @@ -773,6 +1889,159 @@ "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, + "node_modules/@opentelemetry/redis-common": { + "version": "0.36.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/redis-common/-/redis-common-0.36.2.tgz", + "integrity": "sha512-faYX1N0gpLhej/6nyp6bgRjzAKXn5GOEMYY7YhciSfCoITAktLUtQ36d24QEWNA1/WA1y6qQunCe0OhHRkVl9g==", + "license": "Apache-2.0", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/resource-detector-alibaba-cloud": { + "version": "0.29.7", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-alibaba-cloud/-/resource-detector-alibaba-cloud-0.29.7.tgz", + "integrity": "sha512-PExUl/R+reSQI6Y/eNtgAsk6RHk1ElYSzOa8/FHfdc/nLmx9sqMasBEpLMkETkzDP7t27ORuXe4F9vwkV2uwwg==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@opentelemetry/core": "^1.26.0", + "@opentelemetry/resources": "^1.10.0", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/resource-detector-alibaba-cloud/node_modules/@opentelemetry/core": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.30.1.tgz", + "integrity": "sha512-OOCM2C/QIURhJMuKaekP3TRBxBKxG/TWWA0TL2J6nXUtDnuCtccy49LUJF8xPFXMX+0LMcxFpCo8M9cGY1W6rQ==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@opentelemetry/semantic-conventions": "1.28.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/resource-detector-alibaba-cloud/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.28.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz", + "integrity": "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==", + "license": "Apache-2.0", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/resource-detector-aws": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-aws/-/resource-detector-aws-1.12.0.tgz", + "integrity": "sha512-Cvi7ckOqiiuWlHBdA1IjS0ufr3sltex2Uws2RK6loVp4gzIJyOijsddAI6IZ5kiO8h/LgCWe8gxPmwkTKImd+Q==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@opentelemetry/core": "^1.0.0", + "@opentelemetry/resources": "^1.10.0", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/resource-detector-azure": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-azure/-/resource-detector-azure-0.2.12.tgz", + "integrity": "sha512-iIarQu6MiCjEEp8dOzmBvCSlRITPFTinFB2oNKAjU6xhx8d7eUcjNOKhBGQTvuCriZrxrEvDaEEY9NfrPQ6uYQ==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@opentelemetry/core": "^1.25.1", + "@opentelemetry/resources": "^1.10.1", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/resource-detector-container": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-container/-/resource-detector-container-0.4.4.tgz", + "integrity": "sha512-ZEN2mq7lIjQWJ8NTt1umtr6oT/Kb89856BOmESLSvgSHbIwOFYs7cSfSRH5bfiVw6dXTQAVbZA/wLgCHKrebJA==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@opentelemetry/core": "^1.26.0", + "@opentelemetry/resources": "^1.10.0", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/resource-detector-container/node_modules/@opentelemetry/core": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.30.1.tgz", + "integrity": "sha512-OOCM2C/QIURhJMuKaekP3TRBxBKxG/TWWA0TL2J6nXUtDnuCtccy49LUJF8xPFXMX+0LMcxFpCo8M9cGY1W6rQ==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@opentelemetry/semantic-conventions": "1.28.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/resource-detector-container/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.28.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz", + "integrity": "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==", + "license": "Apache-2.0", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/resource-detector-gcp": { + "version": "0.29.13", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-gcp/-/resource-detector-gcp-0.29.13.tgz", + "integrity": "sha512-vdotx+l3Q+89PeyXMgKEGnZ/CwzwMtuMi/ddgD9/5tKZ08DfDGB2Npz9m2oXPHRCjc4Ro6ifMqFlRyzIvgOjhg==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@opentelemetry/core": "^1.0.0", + "@opentelemetry/resources": "^1.10.0", + "@opentelemetry/semantic-conventions": "^1.27.0", + "gcp-metadata": "^6.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, "node_modules/@opentelemetry/resources": { "version": "1.25.1", "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.25.1.tgz", @@ -914,16 +2183,30 @@ "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, - "node_modules/@opentelemetry/sdk-trace-node/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "node_modules/@opentelemetry/semantic-conventions": { + "version": "1.36.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.36.0.tgz", + "integrity": "sha512-TtxJSRD8Ohxp6bKkhrm27JRHAxPczQA7idtcTOMYI+wQRRrfgqxHv1cFbCApcSnNjtXkmzFozn6jQtFrOmbjPQ==", + "license": "Apache-2.0", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/sql-common": { + "version": "0.40.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sql-common/-/sql-common-0.40.1.tgz", + "integrity": "sha512-nSDlnHSqzC3pXn/wZEZVLuAuJ1MYMXPBwtv2qAbCa3847SaHItdE7SzUq/Jtb0KZmh1zfAbNi3AAMjztTT4Ugg==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@opentelemetry/core": "^1.1.0" }, "engines": { - "node": ">=10" + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0" } }, "node_modules/@protobufjs/aspromise": { @@ -1000,6 +2283,13 @@ "node": ">= 10" } }, + "node_modules/@types/aws-lambda": { + "version": "8.10.122", + "resolved": "https://registry.npmjs.org/@types/aws-lambda/-/aws-lambda-8.10.122.tgz", + "integrity": "sha512-vBkIh9AY22kVOCEKo5CJlyCgmSWvasC+SWUxL/x/vOwRobMpI/HG1xp/Ae3AqmSiZeLUbOhW0FCD3ZjqqUxmXw==", + "license": "MIT", + "optional": true + }, "node_modules/@types/body-parser": { "version": "1.19.6", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", @@ -1010,6 +2300,16 @@ "@types/node": "*" } }, + "node_modules/@types/bunyan": { + "version": "1.8.9", + "resolved": "https://registry.npmjs.org/@types/bunyan/-/bunyan-1.8.9.tgz", + "integrity": "sha512-ZqS9JGpBxVOvsawzmVt30sP++gSQMTejCkIAQ3VdadOcRE8izTyW66hufvwLeH+YEGP6Js2AW7Gz+RMyvrEbmw==", + "license": "MIT", + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/caseless": { "version": "0.12.5", "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.5.tgz", @@ -1098,6 +2398,16 @@ "license": "MIT", "optional": true }, + "node_modules/@types/memcached": { + "version": "2.2.10", + "resolved": "https://registry.npmjs.org/@types/memcached/-/memcached-2.2.10.tgz", + "integrity": "sha512-AM9smvZN55Gzs2wRrqeMHVP7KE8KWgCJO/XL5yCly2xF6EKa4YlbpK+cLSAH4NG/Ah64HrlegmGqW8kYws7Vxg==", + "license": "MIT", + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/mime": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", @@ -1110,6 +2420,16 @@ "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", "license": "MIT" }, + "node_modules/@types/mysql": { + "version": "2.15.22", + "resolved": "https://registry.npmjs.org/@types/mysql/-/mysql-2.15.22.tgz", + "integrity": "sha512-wK1pzsJVVAjYCSZWQoWHziQZbNggXFDUEIGf54g4ZM/ERuP86uGdWeKZWMYlqTPMZfHJJvLPyogXGvCOg87yLQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/node": { "version": "22.17.0", "resolved": "https://registry.npmjs.org/@types/node/-/node-22.17.0.tgz", @@ -1119,6 +2439,28 @@ "undici-types": "~6.21.0" } }, + "node_modules/@types/pg": { + "version": "8.6.1", + "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.6.1.tgz", + "integrity": "sha512-1Kc4oAGzAl7uqUStZCDvaLFqZrW9qWSjXOmBfdgyBP5La7Us6Mg4GBvRlSoaZMhQF/zSj1C8CtKMBkoiT8eL8w==", + "license": "MIT", + "optional": true, + "dependencies": { + "@types/node": "*", + "pg-protocol": "*", + "pg-types": "^2.2.0" + } + }, + "node_modules/@types/pg-pool": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/pg-pool/-/pg-pool-2.0.4.tgz", + "integrity": "sha512-qZAvkv1K3QbmHHFYSNRYPkRjOWRLBYrL4B9c+wG0GSVGBw0NtJwPcgx/DSddeDJvRGMHCEQ4VMEVfuJ/0gZ3XQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "@types/pg": "*" + } + }, "node_modules/@types/qs": { "version": "6.14.0", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", @@ -1171,6 +2513,16 @@ "integrity": "sha512-UE7oxhQLLd9gub6JKIAhDq06T0F6FnztwMNRvYgjeQSBeMc1ZG/tA47EwfduvkuQS8apbkM/lpLpWsaCeYsXVg==", "license": "MIT" }, + "node_modules/@types/tedious": { + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/@types/tedious/-/tedious-4.0.14.tgz", + "integrity": "sha512-KHPsfX/FoVbUGbyYvk1q9MMQHLPeRZhRJZdO45Q4YjvFkv4hMNghCWTvy7rdKessBsmtz4euWCWAB6/tVpI1Iw==", + "license": "MIT", + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/tough-cookie": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", @@ -1178,6 +2530,13 @@ "license": "MIT", "optional": true }, + "node_modules/@types/triple-beam": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", + "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==", + "license": "MIT", + "optional": true + }, "node_modules/@ungap/structured-clone": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", @@ -1307,6 +2666,14 @@ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "license": "MIT" }, + "node_modules/ansi-color": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/ansi-color/-/ansi-color-0.2.1.tgz", + "integrity": "sha512-bF6xLaZBLpOQzgYUtYEhJx090nPSZk1BQ/q2oyBK9aMMcJHzx9uXGCjI2Y+LebsN4Jwoykr0V9whbPiogdyHoQ==", + "engines": { + "node": "*" + } + }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -1354,6 +2721,13 @@ "node": ">=8" } }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "license": "MIT", + "optional": true + }, "node_modules/async-mutex": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/async-mutex/-/async-mutex-0.5.0.tgz", @@ -1498,6 +2872,20 @@ "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", "license": "BSD-3-Clause" }, + "node_modules/bufrw": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/bufrw/-/bufrw-1.4.0.tgz", + "integrity": "sha512-sWm8iPbqvL9+5SiYxXH73UOkyEbGQg7kyHQmReF89WJHQJw2eV4P/yZ0E+b71cczJ4pPobVhXxgQcmfSTgGHxQ==", + "dependencies": { + "ansi-color": "^0.2.1", + "error": "^7.0.0", + "hexer": "^1.5.0", + "xtend": "^4.0.0" + }, + "engines": { + "node": ">= 0.10.x" + } + }, "node_modules/bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", @@ -1563,6 +2951,12 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/cjs-module-lexer": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", + "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==", + "license": "MIT" + }, "node_modules/cliui": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", @@ -1614,6 +3008,17 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/color": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", + "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", + "license": "MIT", + "optional": true, + "dependencies": { + "color-convert": "^1.9.3", + "color-string": "^1.6.0" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -1632,12 +3037,51 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "license": "MIT" }, + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "license": "MIT", + "optional": true, + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/color/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "license": "MIT", + "optional": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "license": "MIT", + "optional": true + }, "node_modules/colorette": { "version": "2.0.20", "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", "license": "MIT" }, + "node_modules/colorspace": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz", + "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==", + "license": "MIT", + "optional": true, + "dependencies": { + "color": "^3.1.3", + "text-hex": "1.0.x" + } + }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -1795,6 +3239,22 @@ "node": ">=6.0.0" } }, + "node_modules/dot-prop": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", + "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", + "license": "MIT", + "optional": true, + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/dotprompt": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/dotprompt/-/dotprompt-1.1.1.tgz", @@ -1848,6 +3308,13 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", "license": "MIT" }, + "node_modules/enabled": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", + "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==", + "license": "MIT", + "optional": true + }, "node_modules/encodeurl": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", @@ -1867,6 +3334,15 @@ "once": "^1.4.0" } }, + "node_modules/error": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/error/-/error-7.0.2.tgz", + "integrity": "sha512-UtVv4l5MhijsYUxPJo4390gzfZvAnTHreNnDjnTZaKIiZ/SemXxAhBkYSKtWa5RtBXbLP8tMgn/n0RUa/H7jXw==", + "dependencies": { + "string-template": "~0.2.1", + "xtend": "~4.0.0" + } + }, "node_modules/es-define-property": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", @@ -2123,6 +3599,29 @@ "node": ">=6" } }, + "node_modules/eventid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/eventid/-/eventid-2.0.1.tgz", + "integrity": "sha512-sPNTqiMokAvV048P2c9+foqVJzk49o6d4e0D/sq5jog3pw+4kBgyR0gaM1FM7Mx6Kzd9dztesh9oYz1LWWOpzw==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "uuid": "^8.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eventid/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "license": "MIT", + "optional": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/express": { "version": "4.21.2", "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", @@ -2220,9 +3719,9 @@ "license": "MIT" }, "node_modules/fast-uri": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", - "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", "funding": [ { "type": "github", @@ -2276,6 +3775,13 @@ "node": ">=0.8.0" } }, + "node_modules/fecha": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", + "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==", + "license": "MIT", + "optional": true + }, "node_modules/fetch-blob": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", @@ -2441,6 +3947,13 @@ "dev": true, "license": "ISC" }, + "node_modules/fn.name": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", + "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==", + "license": "MIT", + "optional": true + }, "node_modules/follow-redirects": { "version": "1.15.11", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", @@ -2576,13 +4089,13 @@ } }, "node_modules/genkit": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/genkit/-/genkit-1.16.0.tgz", - "integrity": "sha512-2zj8S3zfOz5zY7QsPyn/R4WfCfRIp1iV0w5r6YEnKI3FhA/avPqN9+fodnJcdv4jI5dnuVoaVgS6K8YpexmWCA==", + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/genkit/-/genkit-1.18.0.tgz", + "integrity": "sha512-vu7i25e6f8YV3j4UfxPER2QXWVqY/kpYlw3sexuGOS60a0md/pwlQlIhg++cPAPlvvAb9eQ7ZxlFlUtrHJaiRQ==", "license": "Apache-2.0", "dependencies": { - "@genkit-ai/ai": "1.16.0", - "@genkit-ai/core": "1.16.0", + "@genkit-ai/ai": "1.18.0", + "@genkit-ai/core": "1.18.0", "uuid": "^10.0.0" } }, @@ -2737,6 +4250,52 @@ "node": ">=14" } }, + "node_modules/googleapis": { + "version": "137.1.0", + "resolved": "https://registry.npmjs.org/googleapis/-/googleapis-137.1.0.tgz", + "integrity": "sha512-2L7SzN0FLHyQtFmyIxrcXhgust77067pkkduqkbIpDuj9JzVnByxsRrcRfUMFQam3rQkWW2B0f1i40IwKDWIVQ==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "google-auth-library": "^9.0.0", + "googleapis-common": "^7.0.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/googleapis-common": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/googleapis-common/-/googleapis-common-7.2.0.tgz", + "integrity": "sha512-/fhDZEJZvOV3X5jmD+fKxMqma5q2Q9nZNSF3kn1F18tpxmA86BcTxAGBQdM0N89Z3bEaIs+HVznSmFJEAmMTjA==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "extend": "^3.0.2", + "gaxios": "^6.0.3", + "google-auth-library": "^9.7.0", + "qs": "^6.7.0", + "url-template": "^2.0.8", + "uuid": "^9.0.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/googleapis-common/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "optional": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/gopd": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", @@ -2839,6 +4398,23 @@ "node": ">= 0.4" } }, + "node_modules/hexer": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/hexer/-/hexer-1.5.0.tgz", + "integrity": "sha512-dyrPC8KzBzUJ19QTIo1gXNqIISRXQ0NwteW6OeQHRN4ZuZeHkdODfj0zHBdOlHbRY8GqbqK57C9oWSvQZizFsg==", + "dependencies": { + "ansi-color": "^0.2.1", + "minimist": "^1.1.0", + "process": "^0.10.0", + "xtend": "^4.0.0" + }, + "bin": { + "hexer": "cli.js" + }, + "engines": { + "node": ">= 0.10.x" + } + }, "node_modules/html-entities": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.6.0.tgz", @@ -2970,12 +4546,6 @@ "module-details-from-path": "^1.0.3" } }, - "node_modules/import-in-the-middle/node_modules/cjs-module-lexer": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", - "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==", - "license": "MIT" - }, "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -3013,6 +4583,13 @@ "node": ">= 0.10" } }, + "node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "license": "MIT", + "optional": true + }, "node_modules/is-core-module": { "version": "2.16.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", @@ -3060,6 +4637,16 @@ "node": ">=0.10.0" } }, + "node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=8" + } + }, "node_modules/is-path-inside": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", @@ -3089,6 +4676,31 @@ "dev": true, "license": "ISC" }, + "node_modules/jaeger-client": { + "version": "3.19.0", + "resolved": "https://registry.npmjs.org/jaeger-client/-/jaeger-client-3.19.0.tgz", + "integrity": "sha512-M0c7cKHmdyEUtjemnJyx/y9uX16XHocL46yQvyqDlPdvAcwPDbHrIbKjQdBqtiE4apQ/9dmr+ZLJYYPGnurgpw==", + "license": "Apache-2.0", + "dependencies": { + "node-int64": "^0.4.0", + "opentracing": "^0.14.4", + "thriftrw": "^3.5.0", + "uuid": "^8.3.2", + "xorshift": "^1.1.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jaeger-client/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/jose": { "version": "4.15.9", "resolved": "https://registry.npmjs.org/jose/-/jose-4.15.9.tgz", @@ -3202,18 +4814,6 @@ "safe-buffer": "^5.0.1" } }, - "node_modules/jsonwebtoken/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/jwa": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz", @@ -3262,6 +4862,13 @@ "json-buffer": "3.0.1" } }, + "node_modules/kuler": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", + "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==", + "license": "MIT", + "optional": true + }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -3345,6 +4952,13 @@ "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", "license": "MIT" }, + "node_modules/lodash.mapvalues": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz", + "integrity": "sha512-JPFqXFeZQ7BfS00H58kClY7SPVeHertPE0lNuCyZ26/XlN8TvakYD7b9bGyNmXbT/D3BbtPAAmq90gPWqLkxlQ==", + "license": "MIT", + "optional": true + }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -3357,6 +4971,24 @@ "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", "license": "MIT" }, + "node_modules/logform": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/logform/-/logform-2.7.0.tgz", + "integrity": "sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "@colors/colors": "1.6.0", + "@types/triple-beam": "^1.3.2", + "fecha": "^4.2.0", + "ms": "^2.1.1", + "safe-stable-stringify": "^2.3.1", + "triple-beam": "^1.3.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, "node_modules/long": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", @@ -3566,6 +5198,12 @@ "node": ">= 6.13.0" } }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "license": "MIT" + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -3619,6 +5257,25 @@ "wrappy": "1" } }, + "node_modules/one-time": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", + "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", + "license": "MIT", + "optional": true, + "dependencies": { + "fn.name": "1.x.x" + } + }, + "node_modules/opentracing": { + "version": "0.14.7", + "resolved": "https://registry.npmjs.org/opentracing/-/opentracing-0.14.7.tgz", + "integrity": "sha512-vz9iS7MJ5+Bp1URw8Khvdyw1H/hGvzHWlKQ7eRrQojSCDL1/SrWfrY9QebLw97n2deyRtzHRC3MkQfVNUCo91Q==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.10" + } + }, "node_modules/optionator": { "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", @@ -3739,6 +5396,83 @@ "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", "license": "MIT" }, + "node_modules/pg-int8": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", + "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", + "license": "ISC", + "optional": true, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/pg-protocol": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.10.3.tgz", + "integrity": "sha512-6DIBgBQaTKDJyxnXaLiLR8wBpQQcGWuAESkRBX/t6OwA8YsqP+iVSiond2EDy6Y/dsGk8rh/jtax3js5NeV7JQ==", + "license": "MIT", + "optional": true + }, + "node_modules/pg-types": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", + "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", + "license": "MIT", + "optional": true, + "dependencies": { + "pg-int8": "1.0.1", + "postgres-array": "~2.0.0", + "postgres-bytea": "~1.0.0", + "postgres-date": "~1.0.4", + "postgres-interval": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postgres-array": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", + "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/postgres-bytea": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", + "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-date": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", + "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-interval": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", + "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "xtend": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -3749,6 +5483,14 @@ "node": ">= 0.8.0" } }, + "node_modules/process": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/process/-/process-0.10.1.tgz", + "integrity": "sha512-dyIett8dgGIZ/TXKUzeYExt7WA6ldDzys9vTDU/cCA9L17Ypme+KzS+NjQCjpn9xsvi/shbMC+yP/BcFMBz0NA==", + "engines": { + "node": ">= 0.6.0" + } + }, "node_modules/proto3-json-serializer": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/proto3-json-serializer/-/proto3-json-serializer-2.0.2.tgz", @@ -3805,6 +5547,29 @@ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", "license": "MIT" }, + "node_modules/pump": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", + "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", + "license": "MIT", + "optional": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/pumpify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-2.0.1.tgz", + "integrity": "sha512-m7KOje7jZxrmutanlkS1daj1dS6z6BgslzOXmcSEpIlCxM3VJH7lG5QLeck/6hgF6F4crFf01UtQmNsJfweTAw==", + "license": "MIT", + "optional": true, + "dependencies": { + "duplexify": "^4.1.1", + "inherits": "^2.0.3", + "pump": "^3.0.0" + } + }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -4071,12 +5836,34 @@ ], "license": "MIT" }, + "node_modules/safe-stable-stringify": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", + "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=10" + } + }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "license": "MIT" }, + "node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/send": { "version": "0.19.0", "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", @@ -4259,6 +6046,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "license": "MIT", + "optional": true, + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -4268,6 +6065,16 @@ "node": ">=0.10.0" } }, + "node_modules/stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", + "license": "MIT", + "optional": true, + "engines": { + "node": "*" + } + }, "node_modules/statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", @@ -4304,6 +6111,11 @@ "safe-buffer": "~5.2.0" } }, + "node_modules/string-template": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/string-template/-/string-template-0.2.1.tgz", + "integrity": "sha512-Yptehjogou2xm4UJbxJ4CxgZx12HBfeystp0y3x7s4Dj32ltVVG1Gg8YhKjHZkHicuKpZX/ffilA8505VbUbpw==" + }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -4432,6 +6244,13 @@ "uuid": "dist/bin/uuid" } }, + "node_modules/text-hex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", + "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==", + "license": "MIT", + "optional": true + }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -4439,6 +6258,31 @@ "dev": true, "license": "MIT" }, + "node_modules/thriftrw": { + "version": "3.11.4", + "resolved": "https://registry.npmjs.org/thriftrw/-/thriftrw-3.11.4.tgz", + "integrity": "sha512-UcuBd3eanB3T10nXWRRMwfwoaC6VMk7qe3/5YIWP2Jtw+EbHqJ0p1/K3x8ixiR5dozKSSfcg1W+0e33G1Di3XA==", + "dependencies": { + "bufrw": "^1.2.1", + "error": "7.0.2", + "long": "^2.4.0" + }, + "bin": { + "thrift2json": "thrift2json.js" + }, + "engines": { + "node": ">= 0.10.x" + } + }, + "node_modules/thriftrw/node_modules/long": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/long/-/long-2.4.0.tgz", + "integrity": "sha512-ijUtjmO/n2A5PaosNG9ZGDsQ3vxJg7ZW8vsY8Kp0f2yIZWhSJvjmegV7t+9RPQKxKrvj8yKGehhS+po14hPLGQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.6" + } + }, "node_modules/toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", @@ -4454,6 +6298,16 @@ "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", "license": "MIT" }, + "node_modules/triple-beam": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz", + "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 14.0.0" + } + }, "node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", @@ -4543,6 +6397,13 @@ "integrity": "sha512-EWkjYEN0L6KOfEoOH6Wj4ghQqU7eBZMJqRHQnxQAq+dSEzRPClkWjf8557HkWQXF6BrAUoLSAyy9i3RVTliaNg==", "license": "http://geraintluff.github.io/tv4/LICENSE.txt" }, + "node_modules/url-template": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/url-template/-/url-template-2.0.8.tgz", + "integrity": "sha512-XdVKMF4SJ0nP/O7XIPB0JwAEuT9lDIYnNsK8yGVe43y0AWoKeJNdv3ZNWh7ksJ6KqQFjOO6ox/VEitLnaVNufw==", + "license": "BSD", + "optional": true + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -4645,6 +6506,44 @@ "node": ">= 8" } }, + "node_modules/winston": { + "version": "3.17.0", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.17.0.tgz", + "integrity": "sha512-DLiFIXYC5fMPxaRg832S6F5mJYvePtmO5G9v9IgUFPhXm9/GkXarH/TUrBAVzhTCzAj9anE/+GjrgXp/54nOgw==", + "license": "MIT", + "optional": true, + "dependencies": { + "@colors/colors": "^1.6.0", + "@dabh/diagnostics": "^2.0.2", + "async": "^3.2.3", + "is-stream": "^2.0.0", + "logform": "^2.7.0", + "one-time": "^1.0.0", + "readable-stream": "^3.4.0", + "safe-stable-stringify": "^2.3.1", + "stack-trace": "0.0.x", + "triple-beam": "^1.3.0", + "winston-transport": "^4.9.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/winston-transport": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.9.0.tgz", + "integrity": "sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==", + "license": "MIT", + "optional": true, + "dependencies": { + "logform": "^2.7.0", + "readable-stream": "^3.6.2", + "triple-beam": "^1.3.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, "node_modules/word-wrap": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", @@ -4668,6 +6567,21 @@ "devOptional": true, "license": "ISC" }, + "node_modules/xorshift": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/xorshift/-/xorshift-1.2.0.tgz", + "integrity": "sha512-iYgNnGyeeJ4t6U11NpA/QiKy+PXn5Aa3Azg5qkwIFz1tBLllQrjjsk9yzD7IAK0naNU4JxdeDgqW9ov4u/hc4g==", + "license": "MIT" + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", @@ -4750,9 +6664,9 @@ } }, "node_modules/zod": { - "version": "3.23.8", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", - "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" diff --git a/functions/package.json b/functions/package.json index 978a237..dc55963 100644 --- a/functions/package.json +++ b/functions/package.json @@ -14,19 +14,15 @@ }, "main": "index.js", "dependencies": { - "@genkit-ai/googleai": "^1.16.0", + "@genkit-ai/googleai": "^1.18.0", "axios": "^1.6.0", "firebase-admin": "^12.1.0", "firebase-functions": "^5.0.0", - "genkit": "^1.16.0", - "zod": "3.23.8" + "genkit": "^1.18.0" }, "devDependencies": { "eslint": "^8.15.0", "eslint-config-google": "^0.14.0" }, - "overrides": { - "zod": "3.23.8" - }, "private": true } diff --git a/package.json b/package.json index 077316e..042226d 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ "@expo/config-plugins": "~9.0.0", "@expo/metro-runtime": "~4.0.1", "@expo/react-native-action-sheet": "^4.0.1", + "@expo/vector-icons": "~14.0.4", "@gorhom/bottom-sheet": "^4", "@gorhom/portal": "^1.0.14", "@legendapp/motion": "^2.2.1", @@ -36,7 +37,6 @@ "deprecated-react-native-prop-types": "^3.0.1", "expo": "~52.0.47", "expo-audio": "~0.3.5", - "expo-av": "~15.0.2", "expo-blur": "~14.0.3", "expo-build-properties": "~0.13.3", "expo-camera": "~16.0.18", @@ -56,6 +56,7 @@ "expo-splash-screen": "~0.29.24", "expo-status-bar": "~2.0.1", "expo-system-ui": "~4.0.9", + "expo-video": "~2.0.6", "firebase": "^9.20.0", "lodash": "^4.17.21", "moment": "^2.29.4", @@ -78,6 +79,7 @@ "react-native-reanimated-carousel": "^4.0.3", "react-native-responsive-dimensions": "^3.1.1", "react-native-safe-area-context": "4.12.0", + "react-native-sortables": "^1.8.0", "react-native-store-review": "^0.3.0", "react-native-super-grid": "^5.0.0", "react-native-svg": "15.8.0", diff --git a/src/assets/icons/dragDots.png b/src/assets/icons/dragDots.png new file mode 100644 index 0000000..901c501 Binary files /dev/null and b/src/assets/icons/dragDots.png differ diff --git a/src/assets/index.js b/src/assets/index.js index ee58f0f..12a95b5 100644 --- a/src/assets/index.js +++ b/src/assets/index.js @@ -10,20 +10,6 @@ import ribbon from "./UI/tabs/ribbon.png"; import mic from "./UI/tabs/mic.png"; import person from "./UI/tabs/person.png"; -export const tabs = { - home, - tasks, - settings, - quotes, - chat, - design, - addTab, - albums, - ribbon, - mic, - person, -}; - import bell from "./UI/bell.png"; import sort from "./UI/sort.png"; @@ -86,9 +72,66 @@ import hitParadeLogo from "./icons/hitParadeLogo.png"; import calendar from "./icons/calendar.png"; import coin from "./icons/coin.png"; +import triangle from "./art/triangle.png"; +import circle from "./art/circle.png"; +import square from "./art/square.png"; +import gradientTriangle from "./art/gradientTriangle.png"; + +import threeCoins from "./art/threeCoins.png"; +import boost from "./art/boost.png"; +import boostBig from "./art/boostBig.png"; + +import welcome from "./tutorial/welcome.png"; +import tutorialChat from "./tutorial/chat.png"; +import coins from "./tutorial/coins.png"; +import followProgress from "./tutorial/followProgress.png"; +import tutorialTasks from "./tutorial/tasks.png"; + +import loginAppDashboard from "./mockups/loginAppDashboard.png"; + +import writingBG from "./UI/writingBG.png"; +import studioBG from "./UI/studioBG.png"; +import studioBG2 from "./UI/studioBG2.png"; +import productionBG from "./UI/productionBG.png"; +import productionBG2 from "./UI/productionBG2.png"; +import playbackBG from "./UI/playbackBG.png"; +import playbackBG2 from "./UI/playbackBG2.png"; +import libraryBG from "./UI/libraryBG.png"; +import libraryBG2 from "./UI/libraryBG2.png"; +import profileBG from "./UI/profileBG.png"; +import hitParadeBG from "./UI/hitParadeBG.png"; +import homeBG from "./UI/homeBG.png"; + +import nathalie from "./UI/nathalie.png"; +import theo from "./UI/theo.png"; +import bena from "./UI/bena.png"; +import john from "./UI/john.png"; + +import placeholder from "./UI/placeholder.jpg"; +import placeholder2 from "./UI/placeholder2.jpg"; +import placeholder3 from "./UI/placeholder3.png"; +import placeholder4 from "./UI/placeholder4.jpg"; +import profile from "./UI/profile.jpg"; +import goodVibe from "./UI/goodVibe.png"; + +export const tabs = { + home, + tasks, + settings, + quotes, + chat, + design, + addTab, + albums, + ribbon, + mic, + person, +}; + export const icons = { bell, sort, + dragDots: require("./icons/dragDots.png"), chevronDown, arrowRight, @@ -149,15 +192,6 @@ export const icons = { coin, }; -import triangle from "./art/triangle.png"; -import circle from "./art/circle.png"; -import square from "./art/square.png"; -import gradientTriangle from "./art/gradientTriangle.png"; - -import threeCoins from "./art/threeCoins.png"; -import boost from "./art/boost.png"; -import boostBig from "./art/boostBig.png"; - export const art = { triangle, circle, @@ -168,12 +202,6 @@ export const art = { boostBig, }; -import welcome from "./tutorial/welcome.png"; -import tutorialChat from "./tutorial/chat.png"; -import coins from "./tutorial/coins.png"; -import followProgress from "./tutorial/followProgress.png"; -import tutorialTasks from "./tutorial/tasks.png"; - export const tutorial = { welcome, chat: tutorialChat, @@ -182,25 +210,10 @@ export const tutorial = { tasks: tutorialTasks, }; -import loginAppDashboard from "./mockups/loginAppDashboard.png"; - export const mockups = { loginAppDashboard, }; -import writingBG from "./UI/writingBG.png"; -import studioBG from "./UI/studioBG.png"; -import studioBG2 from "./UI/studioBG2.png"; -import productionBG from "./UI/productionBG.png"; -import productionBG2 from "./UI/productionBG2.png"; -import playbackBG from "./UI/playbackBG.png"; -import playbackBG2 from "./UI/playbackBG2.png"; -import libraryBG from "./UI/libraryBG.png"; -import libraryBG2 from "./UI/libraryBG2.png"; -import profileBG from "./UI/profileBG.png"; -import hitParadeBG from "./UI/hitParadeBG.png"; -import homeBG from "./UI/homeBG.png"; - export const background = { writingBG, studioBG, @@ -216,11 +229,6 @@ export const background = { homeBG, }; -import nathalie from "./UI/nathalie.png"; -import theo from "./UI/theo.png"; -import bena from "./UI/bena.png"; -import john from "./UI/john.png"; - export const ai = { nathalie, theo, @@ -228,13 +236,6 @@ export const ai = { john, }; -import placeholder from "./UI/placeholder.jpg"; -import placeholder2 from "./UI/placeholder2.jpg"; -import placeholder3 from "./UI/placeholder3.png"; -import placeholder4 from "./UI/placeholder4.jpg"; -import profile from "./UI/profile.jpg"; -import goodVibe from './UI/goodVibe.png' - export const img = { placeholder, placeholder2, diff --git a/src/components/AppBlurView.js b/src/components/AppBlurView.js new file mode 100644 index 0000000..b1e6acd --- /dev/null +++ b/src/components/AppBlurView.js @@ -0,0 +1 @@ +export class AppBlurView {} diff --git a/src/components/BorderGradientButton.js b/src/components/BorderGradientButton.js index a61a93a..ae4a511 100644 --- a/src/components/BorderGradientButton.js +++ b/src/components/BorderGradientButton.js @@ -16,7 +16,11 @@ const BorderGradientButton = ({ disabled = false, }) => { return ( - + - - + - - {inPlaylist && ( - - - - Supprimer de la playlist - - - - )} - - - - - Ajouter à une playlist - - - - - {Array.isArray(extraItems) && - extraItems.map((item, idx) => ( - { - try { - item?.onPress?.(); - } finally { - onClose?.(); - } - }} - > + {/* Background overlay to close on outside press */} + + + + {inPlaylist && ( + - {item?.label || "Action"} + Supprimer de la playlist - ))} - - - + )} + + + + + Ajouter à une playlist + + + + + {Array.isArray(extraItems) && + extraItems.map((item, idx) => ( + { + try { + item?.onPress?.(); + } finally { + onClose?.(); + } + }} + > + + + {item?.label || "Action"} + + + + ))} + + + + ); }; diff --git a/src/components/ProjectIcon.js b/src/components/ProjectIcon.js index 00195bc..0bb293d 100644 --- a/src/components/ProjectIcon.js +++ b/src/components/ProjectIcon.js @@ -1,4 +1,5 @@ -import { Image, Text, View } from "react-native"; +import { Text, View } from "react-native"; +import { Image as ExpoImage } from "expo-image"; import { responsiveWidth } from "../actions/responsiveSizes.js"; import { getInitials } from "../helpers"; import { Fonts, Style } from "../styles"; @@ -62,8 +63,12 @@ export default ({ }} > {url ? ( - { const { setWebViewUrl } = useContext(WebViewContext); diff --git a/src/components/modal/PlaylistModal.js b/src/components/modal/PlaylistModal.js index ca970a8..3641b6c 100644 --- a/src/components/modal/PlaylistModal.js +++ b/src/components/modal/PlaylistModal.js @@ -1,4 +1,4 @@ -import React, { useRef, useState } from "react"; +import React, { useMemo, useRef, useState } from "react"; import { Dimensions, FlatList, @@ -33,6 +33,13 @@ const PlaylistModal = (props) => { const startAtCreate = props?.payload?.startAtCreate || false; const { setTooltip } = useMinuit(); + const isDuplicateName = useMemo(() => { + const lower = (playlist || "").trim().toLowerCase(); + if (!lower) return false; + const list = Array.isArray(userPlaylists) ? userPlaylists : []; + return list.some((p) => (p?.name || "").trim().toLowerCase() === lower); + }, [playlist, JSON.stringify(userPlaylists)]); + return ( { musics: arrayUnion(projectId), updatedAt: new Date(), }); - const addedPlaylist = (Array.isArray(userPlaylists) - ? userPlaylists - : [] + const addedPlaylist = ( + Array.isArray(userPlaylists) ? userPlaylists : [] ).find((p) => p?.id === selectedId); const name = addedPlaylist?.name || "la playlist"; setTooltip({ @@ -118,7 +124,10 @@ const PlaylistModal = (props) => { } } catch (e) { console.log("Add to playlist error", e?.message); - setTooltip({ type: "error", text: e?.message || "Ajout impossible" }); + setTooltip({ + type: "error", + text: e?.message || "Ajout impossible", + }); } finally { SheetManager.hide("Playlist"); } @@ -160,6 +169,7 @@ const PlaylistModal = (props) => { Nommer la playlist { onChangeText={setPlaylist} textAlign="center" /> + {isDuplicateName && ( + + Ce nom de playlist existe déjà + + )} { try { setIsCreating(true); const name = playlist.trim(); + const lower = name.toLowerCase(); + // Unicité du nom pour l'utilisateur courant (insensible à la casse) + const exists = ( + Array.isArray(userPlaylists) ? userPlaylists : [] + ).some((p) => (p?.name || "").trim().toLowerCase() === lower); + if (exists) { + setTooltip({ + type: "error", + text: "Ce nom de playlist existe déjà", + }); + return; + } await createPlaylist({ createdBy: currentUID, name, @@ -208,7 +242,10 @@ const PlaylistModal = (props) => { scrollRef.current.scrollToIndex({ index: 0, animated: true }); } catch (e) { console.log(e); - setTooltip({ type: "error", text: e?.message || "Création impossible" }); + setTooltip({ + type: "error", + text: e?.message || "Création impossible", + }); } finally { setIsCreating(false); } diff --git a/src/config/firebase.js b/src/config/firebase.js index 1054af1..d6ec54a 100644 --- a/src/config/firebase.js +++ b/src/config/firebase.js @@ -49,9 +49,6 @@ try { export const usersRef = firestore.collection("users"); export const projectsRef = firestore.collection("projects"); export const playlistsRef = firestore.collection("playlists"); -export const followsRef = firestore.collection("follows"); -export const notificationsRef = firestore.collection("notifications"); -export const documentsRef = firestore.collection("documents"); export const chatsRef = firestore.collection("chats"); export const { arrayUnion, arrayRemove, increment, serverTimestamp } = diff --git a/src/navigation/HomeStack.js b/src/navigation/HomeStack.js index 80b0818..b1eb67b 100644 --- a/src/navigation/HomeStack.js +++ b/src/navigation/HomeStack.js @@ -37,7 +37,7 @@ export default function HomeStackScreen() { component={Home} options={{ headerShown: false }} /> - { const [currentUID] = useGlobal("currentUID"); const [currentUserData, setCurrentUserData] = useGlobal("currentUserData"); const [currentUserRoles] = useGlobal("currentUserRoles"); - const [userProjects, setUserProjects] = useState([]); - const [userLikedProjects, setUserLikedProjects] = useState([]); - const [userPlaylists, setUserPlaylists] = useState([]); - useDataFromRef({ + // Current user document (live) + const { data: currentUserDoc = null } = useDataFromRef({ ref: currentUID ? usersRef.doc(currentUID) : null, + updateGlobalState: "currentUserData", simpleRef: true, listener: true, - condition: currentUID, + condition: !!currentUID, refreshArray: [currentUID], - onUpdate: (data) => { - if (data) { - setCurrentUserData(data); - } else { - setCurrentUserData(null); - } - }, }); // Subscribe to user's projects (musics) - useDataFromRef({ + const { data: userProjects = [] } = useDataFromRef({ ref: currentUID ? projectsRef .where("userId", "==", currentUID) @@ -53,11 +46,10 @@ export default ({ children }) => { listener: true, condition: !!currentUID, refreshArray: [currentUID], - onUpdate: (list) => setUserProjects(Array.isArray(list) ? list : []), }); // Subscribe to user's liked projects - useDataFromRef({ + const { data: userLikedProjects = [] } = useDataFromRef({ ref: currentUID ? projectsRef .where("likedBy", "array-contains", currentUID) @@ -67,17 +59,26 @@ export default ({ children }) => { listener: true, condition: !!currentUID, refreshArray: [currentUID], - onUpdate: (list) => setUserLikedProjects(Array.isArray(list) ? list : []), }); // Subscribe to user's playlists - useDataFromRef({ + const { data: userPlaylists = [] } = useDataFromRef({ ref: currentUID ? playlistsRef.where("createdBy", "==", currentUID) : null, simpleRef: false, listener: true, condition: !!currentUID, refreshArray: [currentUID], - onUpdate: (list) => setUserPlaylists(Array.isArray(list) ? list : []), + }); + + // Live list of users that the current user is following ("abonnements") + const { data: userFollowing = [] } = useDataFromRef({ + ref: currentUID + ? usersRef.where("followedBy", "array-contains", currentUID) + : null, + simpleRef: false, + listener: true, + condition: !!currentUID, + refreshArray: [currentUID], }); const updatePendingUserData = (newData) => { @@ -89,13 +90,12 @@ export default ({ children }) => { const followUser = async (userId) => { try { if (currentUID && userId) { - await followsRef.doc(`${currentUID}_${userId}`).set( + await usersRef.doc(userId).set( { - followerId: currentUID, - followeeId: userId, - createdAt: new Date(), + followedBy: arrayUnion(currentUID), + lastFollowersUpdateAt: new Date(), }, - { merge: true } + { merge: true }, ); setTooltip({ type: "success", text: "Abonnement mis à jour" }); } @@ -108,7 +108,13 @@ export default ({ children }) => { const unfollowUser = async (userId) => { try { if (currentUID && userId) { - await followsRef.doc(`${currentUID}_${userId}`).delete(); + await usersRef.doc(userId).set( + { + followedBy: arrayRemove(currentUID), + lastFollowersUpdateAt: new Date(), + }, + { merge: true }, + ); setTooltip({ type: "success", text: "Vous ne suivez plus cet utilisateur", @@ -234,10 +240,11 @@ export default ({ children }) => { currentUserRoles, currentUID, - currentUserData, + currentUserData: currentUserDoc, userProjects, userLikedProjects, userPlaylists, + followingCount: userFollowing?.length || 0, setCurrentUserData, getUserByUid, diff --git a/src/screens/HitParade/components/SongCard.js b/src/screens/HitParade/components/SongCard.js index e1a6d42..201871d 100644 --- a/src/screens/HitParade/components/SongCard.js +++ b/src/screens/HitParade/components/SongCard.js @@ -1,4 +1,5 @@ -import { View, Text, Image, Platform, Pressable } from "react-native"; +import { View, Text, Platform, Pressable, Image as RNImage } from "react-native"; +import { Image as ExpoImage } from "expo-image"; import React from "react"; import { img } from "../../../assets"; import { BlurView } from "expo-blur"; @@ -16,10 +17,21 @@ const SongCard = ({ rank = 1, title = "Sans titre", artist = "MusicLand", coverU gap: 6, }} > - + {coverUrl ? ( + + ) : ( + + )} { + const { userProjects = [] } = useUser(); + const projects = useMemo( + () => (Array.isArray(userProjects) ? userProjects : []), + [userProjects], + ); + const [, setTooltip] = useGlobal("_tooltip"); + const [menuTop, setMenuTop] = useState(0); + const [showMenu, setShowMenu] = useState(false); + const [selectedProjectId, setSelectedProjectId] = useState(null); + return ( @@ -55,89 +34,112 @@ const Home = () => { source={img.goodVibe} style={{ alignSelf: "center", position: "absolute" }} /> - - - {CREATE_DATA.map((item, index) => ( - { - switch (index) { - case 0: - navigate(Routes.Create, { - action: item.type, - }); - break; - case 1: - navigate(Routes.Studio, { - action: item.type, - }); - break; - } + {projects.length > 0 && ( + + - - - {item.label}, {item.type} - - - {item.desc} - - - + item.id} + contentContainerStyle={{ gap: 10, paddingBottom: 10 }} + renderItem={({ item }) => ( + + navigate(Routes.FlowSelection, { projectId: item.id }) + } + onPressMore={(posTop) => { + setSelectedProjectId(item.id); + setMenuTop(posTop); + setShowMenu((prev) => !prev || posTop !== menuTop); + }} + /> + )} /> - setShowMenu(false)} + inPlaylist={false} + projectId={selectedProjectId} + extraItems={[ + { + label: "Supprimer", + onPress: () => + Alert.alert( + "Confirmer la suppression", + "Cette action supprimera définitivement ce projet.", + [ + { text: "Annuler", style: "cancel" }, + { + text: "Supprimer", + style: "destructive", + onPress: async () => { + try { + if (!selectedProjectId) return; + await projectsRef + .doc(selectedProjectId) + .delete(); + setTooltip({ + type: "success", + text: "Projet supprimé", + }); + } catch (e) { + setTooltip({ + type: "error", + text: e?.message || "Suppression impossible", + }); + } + }, + }, + ], + { cancelable: true }, + ), + }, + ]} /> - - ))} - + + + )} + + navigate(Routes.FlowSelection)} + /> + ); diff --git a/src/screens/Library/AllMyMusic.js b/src/screens/Library/AllMyMusic.js index aa33b6d..03d587e 100644 --- a/src/screens/Library/AllMyMusic.js +++ b/src/screens/Library/AllMyMusic.js @@ -1,4 +1,5 @@ -import { View, Text, FlatList, Image, Pressable } from "react-native"; +import { View, Text, FlatList, Pressable, Image as RNImage } from "react-native"; +import { Image as ExpoImage } from "expo-image"; import React, { useState } from "react"; import Page from "../../layouts/Page"; import { background, img } from "../../assets"; @@ -56,12 +57,21 @@ const AllMyMusic = () => { navigate(Routes.MusicDetails, { projectId: item.id }) } > - + {item?.coverUrl ? ( + + ) : ( + + )} { navigate(Routes.Research), }} /> diff --git a/src/screens/Library/MusicDetails.js b/src/screens/Library/MusicDetails.js index 65b3a34..ee86413 100644 --- a/src/screens/Library/MusicDetails.js +++ b/src/screens/Library/MusicDetails.js @@ -1,14 +1,8 @@ import { useRoute } from "@react-navigation/core"; -import { Audio } from "expo-av"; +import { Audio } from "expo-audio"; import React, { useEffect, useMemo, useState } from "react"; -import { - Image, - Pressable, - ScrollView, - StyleSheet, - Text, - View, -} from "react-native"; +import { Pressable, ScrollView, StyleSheet, Text, View, Image as RNImage } from "react-native"; +import { Image as ExpoImage } from "expo-image"; import { SheetManager } from "react-native-actions-sheet"; import { useGlobal } from "reactn"; import { background, icons, img } from "../../assets"; @@ -78,7 +72,7 @@ const MusicDetails = () => { const soundRef = React.useRef(null); - // Load/unload audio with expo-av for reliable status updates on iOS/Android + // Load/unload audio with expo-audio for reliable status updates on iOS/Android useEffect(() => { let isMounted = true; const load = async () => { @@ -95,16 +89,16 @@ const MusicDetails = () => { if (!songUrl) return; const { sound } = await Audio.Sound.createAsync( { uri: songUrl }, - { shouldPlay: false }, - (status) => { - if (!isMounted) return; - if (!status || !status.isLoaded) return; - const pos = status.positionMillis || 0; - const dur = status.durationMillis || 0; - setProgressInfo({ pos, dur }); - setIsPlaying(!!status.isPlaying); - } + { shouldPlay: false } ); + sound.setOnPlaybackStatusUpdate((status) => { + if (!isMounted) return; + if (!status || !status.isLoaded) return; + const pos = status.positionMillis || 0; + const dur = status.durationMillis || 0; + setProgressInfo({ pos, dur }); + setIsPlaying(!!status.isPlaying); + }); soundRef.current = sound; } catch (e) { console.log("Audio load error", e?.message); @@ -236,7 +230,7 @@ const MusicDetails = () => { }, rightComponent: () => ( SheetManager.show("DeleteAudio")}> - + ), })} @@ -250,10 +244,18 @@ const MusicDetails = () => { // stickyHeaderIndices={[1]} > - + {coverUrl ? ( + + ) : ( + + )} {title} @@ -276,7 +278,7 @@ const MusicDetails = () => { } }} > - { SheetManager.show("Playlist", { payload: { projectId } }) } > - { /> {/* Previous (rewind 10s) */} - seekBy(-10)}> - seekBy(-10)}> + { }} onPress={togglePlay} > - { {/* Next (forward 10s) */} seekBy(10)}> - { + const [, setTooltip] = useGlobal("_tooltip"); const route = useRoute(); const playlistId = route?.params?.playlistId; @@ -37,11 +39,43 @@ const PlaylistDetails = () => { const [showMenu, setShowMenu] = useState(false); const [selectedProjectId, setSelectedProjectId] = useState(null); + const confirmDelete = () => { + Alert.alert( + "Supprimer la playlist", + "Es-tu sûr de vouloir supprimer cette playlist ?", + [ + { text: "Annuler", style: "cancel" }, + { + text: "Supprimer", + style: "destructive", + onPress: async () => { + try { + if (playlistId) { + await playlistsRef.doc(playlistId).delete(); + setTooltip({ type: "success", text: "Playlist supprimée" }); + } + } catch (e) { + console.log("Delete playlist error", e?.message); + setTooltip({ type: "error", text: e?.message || "Suppression impossible" }); + } finally { + goBack(); + } + }, + }, + ], + ); + }; + return ( ( + + + + )} contentContainerStyle={{ paddingBottom: gutters * 2 }} > diff --git a/src/screens/Library/Research.js b/src/screens/Library/Research.js index a660cdf..4c91a41 100644 --- a/src/screens/Library/Research.js +++ b/src/screens/Library/Research.js @@ -1,5 +1,6 @@ import React, { useEffect, useMemo, useState } from "react"; import { Image, Pressable, ScrollView, Text, View } from "react-native"; +import { Image as ExpoImage } from "expo-image"; import { background, img } from "../../assets"; import MoreMenu from "../../components/MoreMenu"; import { usersRef, projectsRef } from "../../config/firebase"; @@ -19,32 +20,53 @@ const Research = () => { const [selected, setSelected] = useState(null); const [search, setSearch] = useState(""); const queryText = useMemo(() => search.trim(), [search]); + const queryLower = useMemo( + () => (search || "").toLowerCase().trim(), + [search], + ); const [currentUID] = useGlobal("currentUID"); const [autoLoads, setAutoLoads] = useState(0); const usersQueryRef = useMemo(() => { try { - if (queryText) { + const lower = queryLower; + if (lower) { return usersRef - .orderBy("userName") - .startAt(queryText) - .endAt(queryText + "\uf8ff"); + .orderBy("userNameLower") + .startAt(lower) + .endAt(lower + "\uf8ff"); } - return usersRef.orderBy("userName"); + return usersRef.orderBy("userNameLower"); + } catch (e) { + return null; + } + }, [queryLower]); + + const projectsQueryRefLower = useMemo(() => { + try { + const lower = queryText ? queryText.toLowerCase() : ""; + if (lower) { + return projectsRef + .orderBy("titleLower") + .startAt(lower) + .endAt(lower + "\uf8ff"); + } + return null; } catch (e) { return null; } }, [queryText]); - const projectsQueryRef = useMemo(() => { + const projectsQueryRefCase = useMemo(() => { try { - if (queryText) { + const raw = queryText || ""; + if (raw) { return projectsRef .orderBy("title") - .startAt(queryText) - .endAt(queryText + "\uf8ff"); + .startAt(raw) + .endAt(raw + "\uf8ff"); } - return projectsRef.orderBy("updatedAt", "desc"); + return null; } catch (e) { return null; } @@ -59,12 +81,19 @@ const Research = () => { simpleRef: false, listener: false, condition: !!usersQueryRef, - refreshArray: [queryText], + refreshArray: [queryLower], usePagination: true, batchSize: 5, }); const filteredUsers = useMemo(() => { - const arr = Array.isArray(userResults) ? userResults : []; + let arr = Array.isArray(userResults) ? userResults : []; + // Client-side safety filter to guarantee match on pseudo + if (queryLower) { + arr = arr.filter((u) => { + const nameLower = (u?.userNameLower || u?.userName || "").toLowerCase(); + return nameLower.includes(queryLower); + }); + } const seen = new Set(); const unique = []; for (const u of arr) { @@ -75,24 +104,83 @@ const Research = () => { unique.push(u); } return unique; - }, [JSON.stringify(userResults), currentUID]); + }, [JSON.stringify(userResults), queryLower, currentUID]); const { - data: projectResults = [], - loading: projectsLoading, - loadMore: loadMoreProjects, + data: projectResultsLower = [], + loading: projectsLoadingLower, + loadMore: loadMoreProjectsLower, } = useDataFromRef({ - ref: projectsQueryRef, + ref: projectsQueryRefLower, simpleRef: false, listener: false, - condition: !!projectsQueryRef, + condition: !!projectsQueryRefLower, refreshArray: [queryText], usePagination: true, batchSize: 6, }); + const { + data: projectResultsCase = [], + loading: projectsLoadingCase, + loadMore: loadMoreProjectsCase, + } = useDataFromRef({ + ref: projectsQueryRefCase, + simpleRef: false, + listener: false, + condition: !!projectsQueryRefCase, + refreshArray: [queryText], + usePagination: true, + batchSize: 6, + }); + const { + data: projectResultsDefault = [], + loading: projectsLoadingDefault, + loadMore: loadMoreProjectsDefault, + } = useDataFromRef({ + ref: !queryText ? projectsRef.orderBy("updatedAt", "desc") : null, + simpleRef: false, + listener: false, + condition: !queryText, + refreshArray: [queryText], + usePagination: true, + batchSize: 6, + }); + + const projectsLoading = queryText + ? projectsLoadingLower || projectsLoadingCase + : projectsLoadingDefault; + const loadMoreProjects = () => { + if (queryText) { + loadMoreProjectsLower?.(); + loadMoreProjectsCase?.(); + } else { + loadMoreProjectsDefault?.(); + } + }; const filteredProjects = useMemo(() => { - return Array.isArray(projectResults) ? projectResults : []; - }, [JSON.stringify(projectResults)]); + const arr = queryText + ? [ + ...(Array.isArray(projectResultsLower) ? projectResultsLower : []), + ...(Array.isArray(projectResultsCase) ? projectResultsCase : []), + ] + : Array.isArray(projectResultsDefault) + ? projectResultsDefault + : []; + const seen = new Set(); + const unique = []; + for (const p of arr) { + const id = p?.id; + if (!id || seen.has(id)) continue; + seen.add(id); + unique.push(p); + } + return unique; + }, [ + queryText, + JSON.stringify(projectResultsLower), + JSON.stringify(projectResultsCase), + JSON.stringify(projectResultsDefault), + ]); useEffect(() => { setAutoLoads(0); @@ -105,13 +193,7 @@ const Research = () => { loadMoreUsers(); } } - }, [ - filteredUsers.length, - usersLoading, - usersQueryRef, - autoLoads, - loadMoreUsers, - ]); + }, [filteredUsers.length, usersLoading, usersQueryRef, autoLoads]); const [menuTop, setMenuTop] = useState(0); const [showMenu, setShowMenu] = useState(false); const [selectedProjectId, setSelectedProjectId] = useState(null); @@ -124,6 +206,21 @@ const Research = () => { } }; + const EmptyText = ({ text }) => ( + + + {text} + + + ); + return ( { /> - {(!selected || selected === "Musiques") && ( + {(!selected && + !projectsLoading && + !usersLoading && + filteredProjects.length === 0 && + filteredUsers.length === 0) && ( + + )} + {((!selected && (filteredProjects.length > 0 || projectsLoading)) || + selected === "Musiques") && ( { end: { x: 0, y: 1 }, }} > - - {Array.isArray(filteredProjects) && - filteredProjects.slice(0, 6).map((p) => ( - - navigate(Routes.MusicDetails, { projectId: p.id }) - } - onPressMore={(posTop) => { - setSelectedProjectId(p.id); - setMenuTop(posTop); - setShowMenu((prev) => !prev || posTop !== menuTop); - }} - /> - ))} - {(filteredProjects.length >= 6 || projectsLoading) && ( - - - {projectsLoading ? "Chargement…" : "Charger plus"} - - - )} - - - - )} - {(!selected || selected === "Clips") && ( - - - - {Array.from({ length: 3 }).map((_, index) => ( - - - - Pour Lili - - - ))} - - - - )} - {(!selected || selected === "Profils") && ( - - - - {Array.isArray(filteredUsers) && - filteredUsers.slice(0, 5).map((u) => ( - - navigate(Routes.SingerProfile, { userId: u.id }) - } - > - 0 ? ( + + {Array.isArray(filteredProjects) && + filteredProjects.slice(0, 6).map((p) => ( + + navigate(Routes.MusicDetails, { projectId: p.id }) } - style={{ ...size({ size: 60 }), borderRadius: 100 }} + onPressMore={(posTop) => { + setSelectedProjectId(p.id); + setMenuTop(posTop); + setShowMenu( + (prev) => !prev || posTop !== menuTop, + ); + }} /> + ))} + {(filteredProjects.length >= 6 || projectsLoading) && ( + - {u?.userName || "Utilisateur"} + {projectsLoading ? "Chargement…" : "Charger plus"} - ))} - {(filteredUsers.length >= 5 || usersLoading) && ( - - + ) : ( + !projectsLoading && ( + + ) + )} + + + )} + {((!selected && (filteredUsers.length > 0 || usersLoading)) || + selected === "Profils") && ( + + + {filteredUsers.length > 0 ? ( + + {Array.isArray(filteredUsers) && + filteredUsers.slice(0, 5).map((u) => ( + + navigate(Routes.SingerProfile, { userId: u.id }) + } + > + + + {u?.userName || "Utilisateur"} + + + ))} + {(filteredUsers.length >= 5 || usersLoading) && ( + - {usersLoading ? "Chargement…" : "Charger plus"} - - - )} - + + {usersLoading ? "Chargement…" : "Charger plus"} + + + )} + + ) : ( + !usersLoading && + )} + + + )} + {selected === "Playbacks" && ( + + + + + + )} + {selected === "Clips" && ( + + + )} diff --git a/src/screens/Library/components/LikedMusic.js b/src/screens/Library/components/LikedMusic.js index bad262d..de5c311 100644 --- a/src/screens/Library/components/LikedMusic.js +++ b/src/screens/Library/components/LikedMusic.js @@ -1,5 +1,6 @@ import React from "react"; -import { FlatList, Image, Pressable, useWindowDimensions } from "react-native"; +import { FlatList, Pressable, useWindowDimensions, Image as RNImage } from "react-native"; +import { Image as ExpoImage } from "expo-image"; import { img } from "../../../assets"; import { Routes } from "../../../navigation"; import { navigate } from "../../../navigation/NavigationService"; @@ -36,15 +37,27 @@ const LikedMusic = () => { navigate(Routes.MusicDetails, { projectId: item.id }) } > - + {item?.coverUrl ? ( + + ) : ( + + )} )} /> diff --git a/src/screens/Library/components/MusicCard.js b/src/screens/Library/components/MusicCard.js index 4af0435..912afe9 100644 --- a/src/screens/Library/components/MusicCard.js +++ b/src/screens/Library/components/MusicCard.js @@ -1,13 +1,7 @@ import { BlurView } from "expo-blur"; -import React, { useEffect, useState } from "react"; -import { - Image, - Platform, - Pressable, - StyleSheet, - Text, - View, -} from "react-native"; +import React, { useEffect, useRef, useState } from "react"; +import { Platform, Pressable, StyleSheet, Text, View, Image as RNImage } from "react-native"; +import { Image as ExpoImage } from "expo-image"; import { useGlobal } from "reactn"; import { icons, img } from "../../../assets"; import { arrayRemove, arrayUnion, projectsRef } from "../../../config/firebase"; @@ -28,6 +22,7 @@ const MusicCard = ({ const [selected, setSelected] = useState(false); const [layout, setLayout] = useState(null); const [menuPos, setMenuPos] = useState(0); + const cardRef = useRef(null); useEffect(() => { if (layout) { @@ -57,6 +52,19 @@ const MusicCard = ({ }; const onPressMenu = () => { + // Prefer absolute screen position when available (Portal rendering) + if (cardRef?.current?.measureInWindow) { + try { + cardRef.current.measureInWindow((x, y, width, height) => { + const top = (y || 0) + 45; + setMenuPos(top); + onPressMore?.(top); + }); + return; + } catch (e) { + // fallback to relative layout position + } + } onPressMore?.(menuPos); }; @@ -67,13 +75,25 @@ const MusicCard = ({ ...Style.containerRow, gap: 6, }} + ref={cardRef} onPress={onPress} onLayout={(e) => setLayout(e.nativeEvent.layout)} > - + {imageUri ? ( + + ) : ( + + )} - - + diff --git a/src/screens/Library/components/ResearchHeader.js b/src/screens/Library/components/ResearchHeader.js index 78e6191..967e4f3 100644 --- a/src/screens/Library/components/ResearchHeader.js +++ b/src/screens/Library/components/ResearchHeader.js @@ -6,13 +6,19 @@ import BorderGradient from "../../../components/BorderGradient/BorderGradient"; import { BlurView } from "expo-blur"; import { FONT_FAMILY } from "../../../styles/Fonts"; -const ResearchHeader = ({ onPress, selected, searchValue = "", onChangeSearch = () => {} }) => { +const ResearchHeader = ({ + onPress, + selected, + searchValue = "", + onChangeSearch = () => {}, +}) => { return ( { + const { userProjects } = useUserData(); + const { projectId = null } = route?.params || {}; + + const currentProjet = useMemo(() => { + if (!projectId) { + return null; + } + return userProjects?.find((p) => p.id === projectId) || null; + }, [projectId, userProjects]); + + const hasProject = !!currentProjet; + const hasLyrics = Array.isArray(currentProjet?.lyrics) + ? currentProjet.lyrics.length > 0 + : !!currentProjet?.lyrics; + const hasCover = !!currentProjet?.coverUrl; + + const isLocked = (index) => { + // 0: Songwriter, 1: Beatmaker, 2: Producer, 3: Director + if (index === 3) return true; // Director toujours verrouillé + if (!hasProject) return index !== 0; // seulement Songwriter + if (hasCover) return index !== 2; // seulement Producer + if (hasLyrics) return !(index === 0 || index === 1); // Songwriter + Beatmaker + return index !== 0; // par défaut seulement Songwriter + }; + + const onPressOption = (index, item) => { + if (isLocked(index)) return; + switch (index) { + case 0: + navigate(Routes.WritingLyrics, {}); + break; + case 1: + navigate(Routes.Studio, { action: item.type }); + break; + case 2: + navigate(Routes.Production, { action: item.type }); + break; + default: + break; + } + }; + + return ( + + + {CREATE_DATA.map((item, index) => { + const locked = isLocked(index); + return ( + onPressOption(index, item)}> + + + {item.label}, {item.type} + + + {item.desc} + + + + + {locked && ( + + + + + + )} + + ); + })} + + + ); +}; + +export default NewMusicOptions; diff --git a/src/screens/Profile/EditProfile.js b/src/screens/Profile/EditProfile.js index 5593ffe..b27f26d 100644 --- a/src/screens/Profile/EditProfile.js +++ b/src/screens/Profile/EditProfile.js @@ -1,7 +1,8 @@ import { BlurView } from "expo-blur"; import * as ImagePicker from "expo-image-picker"; import React, { useEffect, useState } from "react"; -import { Image, Platform, Pressable, Text, View } from "react-native"; +import { Platform, Pressable, Text, View, Image as RNImage } from "react-native"; +import { Image as ExpoImage } from "expo-image"; import { responsiveHeight } from "react-native-responsive-dimensions"; import { useGlobal } from "reactn"; import { background, img } from "../../assets"; @@ -145,7 +146,7 @@ const EditProfile = () => { } > - { } : img.profile } + cachePolicy="memory-disk" + priority="high" + contentFit="cover" + transition={100} style={{ ...size({ size: 108 }), borderRadius: 100, diff --git a/src/screens/Profile/Follows.js b/src/screens/Profile/Follows.js new file mode 100644 index 0000000..07a389e --- /dev/null +++ b/src/screens/Profile/Follows.js @@ -0,0 +1,174 @@ +import React, { useMemo, useState } from "react"; +import { Pressable, Text, View } from "react-native"; +import { Image as ExpoImage } from "expo-image"; +import Page from "../../layouts/Page"; +import { background, img } from "../../assets"; +import { Palette, Style } from "../../styles"; +import { FONT_FAMILY } from "../../styles/Fonts"; +import { size } from "../../styles/Style"; +import { useUser } from "../../providers/UserDataProvider"; +import { usersRef } from "../../config/firebase"; +import useDataFromArrayId from "react-native-minuit/src/hooks/useDataFromArrayId"; +import useDataFromRef from "../../hooks/useDataFromRef"; +import { Routes } from "../../navigation"; +import { useRoute } from "@react-navigation/native"; +import { navigate } from "../../navigation/NavigationService"; + +const Follows = () => { + const { params } = useRoute(); + const initial = params?.selected || "Abonnés"; // "Abonnés" | "Abonnements" + const targetUserId = params?.userId || null; + const [selected, setSelected] = useState(initial); + const { currentUID, currentUserData } = useUser(); + + // Abonnés (followers): docs for IDs in currentUserData.followedBy + // If viewing another user's profile, subscribe to that user's doc + const { data: targetUserDoc = null } = useDataFromRef({ + ref: targetUserId ? usersRef.doc(targetUserId) : null, + simpleRef: true, + listener: true, + condition: !!targetUserId, + refreshArray: [targetUserId], + }); + + const followerIds = useMemo(() => { + if (targetUserId) { + return Array.isArray(targetUserDoc?.followedBy) + ? targetUserDoc.followedBy + : []; + } + return Array.isArray(currentUserData?.followedBy) + ? currentUserData.followedBy + : []; + }, [ + targetUserId, + targetUserDoc?.followedBy?.length || 0, + currentUserData?.followedBy?.length || 0, + ]); + const { data: followers = [], loading: followersLoading } = + useDataFromArrayId({ + ref: usersRef, + arrayId: followerIds, + condition: followerIds.length > 0, + refreshArray: [followerIds.length], + }); + + // Abonnements (following): users whose followedBy includes currentUID + const { data: following = [], loading: followingLoading } = useDataFromRef({ + ref: + targetUserId || currentUID + ? usersRef.where( + "followedBy", + "array-contains", + targetUserId || currentUID, + ) + : null, + simpleRef: false, + listener: true, + condition: !!(targetUserId || currentUID), + refreshArray: [targetUserId || currentUID], + }); + + const EmptyText = ({ text }) => ( + + + {text} + + + ); + + const UserRow = ({ user }) => ( + navigate(Routes.SingerProfile, { userId: user?.id })} + > + + + {user?.userName || "Utilisateur"} + + + ); + + const list = selected === "Abonnés" ? followers : following; + const loading = selected === "Abonnés" ? followersLoading : followingLoading; + + return ( + + + + {["Abonnés", "Abonnements"].map((item) => ( + setSelected(item)} + style={{ flex: 1 }} + > + + + {item} + + + + ))} + + + {Array.isArray(list) && list.length > 0 ? ( + list.map((u) => ) + ) : !loading ? ( + + ) : null} + + + + ); +}; + +export default Follows; diff --git a/src/screens/Profile/Profile.js b/src/screens/Profile/Profile.js index ab0666c..6b514aa 100644 --- a/src/screens/Profile/Profile.js +++ b/src/screens/Profile/Profile.js @@ -1,5 +1,4 @@ -import { BlurView } from "expo-blur"; -import React, { useEffect, useState } from "react"; +import React, { useState } from "react"; import { FlatList, Image, @@ -10,6 +9,7 @@ import { Text, View, } from "react-native"; +import { Image as ExpoImage } from "expo-image"; import { SheetManager } from "react-native-actions-sheet"; import { responsiveHeight } from "react-native-responsive-dimensions"; import { useGlobal } from "reactn"; @@ -20,31 +20,40 @@ import MoreMenu from "../../components/MoreMenu"; import { projectsRef } from "../../config/firebase"; import Page from "../../layouts/Page"; import { Routes } from "../../navigation"; -import { navigate } from "../../navigation/NavigationService"; +import { navigate, push } from "../../navigation/NavigationService"; import { useUser } from "../../providers/UserDataProvider"; -import { getFollowersCount, getFollowingCount } from "../../services/follows"; import { Palette } from "../../styles"; import { FONT_FAMILY } from "../../styles/Fonts"; import Style, { gutters, size } from "../../styles/Style"; import MusicCard from "../Library/components/MusicCard"; +import { BlurView } from "expo-blur"; + const Profile = () => { const [selected, setSelected] = useState("Chansons"); - const [currentUserData] = useGlobal("currentUserData"); - const { userProjects, currentUID } = useUser(); + const { userProjects, followingCount, currentUserData } = useUser(); const [, setTooltip] = useGlobal("_tooltip"); const [menuTop, setMenuTop] = useState(0); const [showMenu, setShowMenu] = useState(false); const [selectedProjectId, setSelectedProjectId] = useState(null); - const [following, setFollowing] = useState(0); - const [followers, setFollowers] = useState(0); const onPressMenu = (item) => { setSelected(item); }; - useEffect(() => { - if (!currentUID) return; - getFollowersCount(currentUID).then(setFollowers); - getFollowingCount(currentUID).then(setFollowing); - }, [currentUID]); + + const EmptyText = ({ text }) => ( + + + {text} + + + ); + return ( { } > - { } : img.profile } + cachePolicy="memory-disk" + priority="high" + contentFit="cover" + transition={100} style={{ ...size({ size: 108 }), borderRadius: 100, @@ -101,19 +114,27 @@ const Profile = () => { + {userProjects?.length || 0} + projets + + push(Routes.Follows, { selected: "Abonnés" })} + > - {currentUserData?.playlist?.length || 0} + {currentUserData?.followedBy?.length || 0} - playbacks - - - {followers} abonnés - - - {following} + + + push(Routes.Follows, { selected: "Abonnements" }) + } + > + {followingCount} abonnements - + @@ -157,64 +178,39 @@ const Profile = () => { {selected === "Playbacks" && ( - ( - navigate(Routes.Reels)} - > - - - Pour Lili - - - )} - /> + )} {selected === "Chansons" && ( - item.id} - renderItem={({ item }) => ( - - navigate(Routes.MusicDetails, { projectId: item.id }) - } - onPressMore={(posTop) => { - setSelectedProjectId(item.id); - setMenuTop(posTop); - setShowMenu((prev) => !prev || posTop !== menuTop); - }} - /> - )} - /> + {Array.isArray(userProjects) && userProjects.length > 0 ? ( + item.id} + renderItem={({ item }) => ( + + navigate(Routes.MusicDetails, { projectId: item.id }) + } + onPressMore={(posTop) => { + setSelectedProjectId(item.id); + setMenuTop(posTop); + setShowMenu((prev) => !prev || posTop !== menuTop); + }} + /> + )} + /> + ) : ( + + )} { }, }, ], - { cancelable: true } + { cancelable: true }, ), }, ]} /> )} + + {selected === "Clips" && ( + + + + )} ); diff --git a/src/screens/Profile/SingerProfile.js b/src/screens/Profile/SingerProfile.js index 714400d..fc70484 100644 --- a/src/screens/Profile/SingerProfile.js +++ b/src/screens/Profile/SingerProfile.js @@ -1,4 +1,3 @@ -import { BlurView } from "expo-blur"; import React, { useEffect, useMemo, useState } from "react"; import { FlatList, @@ -9,23 +8,26 @@ import { Text, View, } from "react-native"; +import { Image as ExpoImage } from "expo-image"; import { responsiveHeight } from "react-native-responsive-dimensions"; import { useGlobal } from "reactn"; import { background, icons, img } from "../../assets"; import BorderGradient from "../../components/BorderGradient/BorderGradient"; import GradientButton from "../../components/GradientButton"; import MoreMenu from "../../components/MoreMenu"; -import { followsRef, projectsRef } from "../../config/firebase"; -import useDataFromRef from "../../hooks/useDataFromRef"; +import { projectsRef } from "../../config/firebase"; import Page from "../../layouts/Page"; import { Routes } from "../../navigation"; -import { navigate } from "../../navigation/NavigationService"; +import { navigate, push } from "../../navigation/NavigationService"; import { useUser } from "../../providers/UserDataProvider"; -import { getFollowersCount, getFollowingCount } from "../../services/follows"; +import useDataFromRef from "../../hooks/useDataFromRef"; +import { usersRef } from "../../config/firebase"; import { gutters, Palette } from "../../styles"; import { FONT_FAMILY } from "../../styles/Fonts"; import Style, { size } from "../../styles/Style"; import MusicCard from "../Library/components/MusicCard"; +import { BlurView } from "expo-blur"; + const SingerProfile = ({ route }) => { const { userId } = route.params; const { getUserByUid, followUser, unfollowUser } = useUser(); @@ -37,25 +39,32 @@ const SingerProfile = ({ route }) => { const fetchUserData = async () => { const data = userId ? await getUserByUid(userId) : {}; setUserData(data); + const list = Array.isArray(data?.followedBy) ? data.followedBy : []; + setFollowers(list.length); + setIsFollowing(currentUID ? list.includes(currentUID) : false); }; useEffect(() => { fetchUserData(); }, [userId]); - useEffect(() => { - if (!userId) return; - getFollowersCount(userId).then(setFollowers); - getFollowingCount(userId).then(setFollowing); - (async () => { - try { - if (currentUID && userId) { - const doc = await followsRef.doc(`${currentUID}_${userId}`).get(); - setIsFollowing(!!doc?.exists); - } else { - setIsFollowing(false); - } - } catch (_) {} - })(); - }, [userId, currentUID]); + // Live following count for the viewed user + const followingQueryRef = React.useMemo(() => { + try { + return userId + ? usersRef.where("followedBy", "array-contains", userId) + : null; + } catch (e) { + return null; + } + }, [userId]); + + useDataFromRef({ + ref: followingQueryRef, + simpleRef: false, + listener: true, + condition: !!followingQueryRef, + refreshArray: [userId], + onUpdate: (list) => setFollowing(Array.isArray(list) ? list.length : 0), + }); const onPressMenu = (item) => { if (selected === item) { setSelected(null); @@ -85,6 +94,21 @@ const SingerProfile = ({ route }) => { condition: !!userProjectsQueryRef, refreshArray: [userId], }); + + const EmptyText = ({ text }) => ( + + + {text} + + + ); const handleFollowUser = async () => { if (!currentUID || !userId || currentUID === userId) return; if (isFollowing) { @@ -127,7 +151,7 @@ const SingerProfile = ({ route }) => { } > - { } : img.profile } + cachePolicy="memory-disk" + priority="high" + contentFit="cover" + transition={100} style={{ ...size({ size: 108 }), borderRadius: 100, @@ -155,16 +183,26 @@ const SingerProfile = ({ route }) => { {Array.isArray(userProjects) ? userProjects.length : 0} - playbacks + projets - + + push(Routes.Follows, { selected: "Abonnés", userId }) + } + > {followers} abonnés - - + + + push(Routes.Follows, { selected: "Abonnements", userId }) + } + > {following} abonnements - + {currentUID !== userId && ( { {selected === "Playbacks" && ( - ( - - - - Pour Lili - - - )} - /> + )} {selected === "Chansons" && ( - item.id} - renderItem={({ item }) => ( - - navigate(Routes.MusicDetails, { projectId: item.id }) - } - onPressMore={(posTop) => { - setSelectedProjectId(item.id); - setMenuTop(posTop); - setShowMenu((prev) => !prev || posTop !== menuTop); - }} - /> - )} - /> + {Array.isArray(userProjects) && userProjects.length > 0 ? ( + item.id} + renderItem={({ item }) => ( + + navigate(Routes.MusicDetails, { projectId: item.id }) + } + onPressMore={(posTop) => { + setSelectedProjectId(item.id); + setMenuTop(posTop); + setShowMenu((prev) => !prev || posTop !== menuTop); + }} + /> + )} + /> + ) : ( + + )} + + )} + + {selected === "Clips" && ( + + )} { {coverUrl ? ( - ) : ( diff --git a/src/screens/Studio/Studio.js b/src/screens/Studio/Studio.js index bed3d55..208df82 100644 --- a/src/screens/Studio/Studio.js +++ b/src/screens/Studio/Studio.js @@ -6,8 +6,6 @@ import GradientButton from "../../components/GradientButton"; import { navigate } from "../../navigation/NavigationService"; import { Routes } from "../../navigation"; import { gutters } from "../../styles"; -import firebase from "../../config/firebase"; -import useMinuit from "react-native-minuit/src/hooks/useMinuit.js"; import { useUser } from "../../providers/UserDataProvider"; import { responsiveHeight } from "react-native-responsive-dimensions"; diff --git a/src/screens/Writing/CreateLyricsWithAi.js b/src/screens/Writing/CreateLyricsWithAi.js index e67d9a8..bfddb2d 100644 --- a/src/screens/Writing/CreateLyricsWithAi.js +++ b/src/screens/Writing/CreateLyricsWithAi.js @@ -1,13 +1,13 @@ import { View, Dimensions } from "react-native"; import React, { useMemo, useRef, useState } from "react"; -import { useRoute } from "@react-navigation/native"; import Page from "../../layouts/Page"; import MusicLandHeader from "../../components/MusicLandHeader"; import GradientButton from "../../components/GradientButton"; import { gutters } from "../../styles"; import { SwiperFlatList } from "react-native-swiper-flatlist"; import Goals from "./Goals"; -import { goBack } from "../../navigation/NavigationService"; +import { goBack, navigate } from "../../navigation/NavigationService"; +import { Routes } from "../../navigation"; import SpecificityContext from "./SpecificityContext"; import EmotionConvey from "./EmotionConvey"; import SongStyle from "./SongStyle"; @@ -20,42 +20,24 @@ import { responsiveHeight } from "react-native-responsive-dimensions"; const { width } = Dimensions.get("window"); -const CreateLyricsWithAi = () => { +const CreateLyricsWithAi = ({ route }) => { + const { hasLyrics = false, regenerateKey } = route?.params || {}; const scrollRef = useRef(null); - const route = useRoute(); - const regenerateKey = route?.params?.regenerateKey; - const [selectedIndex, setSelectedIndex] = useState(0); + // If user already has lyrics, start at SongStructure (index 5) + const [selectedIndex, setSelectedIndex] = useState(hasLyrics ? 5 : 0); const [progress, setProgress] = useState(16); const [parentLayout, setparentLayout] = useState(null); // Collected state across steps - const [objective, setObjective] = useState( - __DEV__ ? "Pour mon entreprise" : null, - ); // from Goals list + const [objective, setObjective] = useState(null); // from Goals list const [otherObjective, setOtherObjective] = useState(""); - const [context, setContext] = useState( - __DEV__ - ? "L'agence minuit est une agence de développement mobile et web qui accompagnes ses client dans la réalisations de projets divers et variés" - : "", - ); - const [emotion, setEmotion] = useState( - __DEV__ - ? { - title: "La Joie", - description: - "expose un bonheur profond, l'émerveillement, la gratitude, satisfaction intense, énergie positive", - } - : null, - ); // { title, description } - const [style, setStyle] = useState(__DEV__ ? "Upbeat" : null); // from list + const [context, setContext] = useState(""); + const [emotion, setEmotion] = useState(null); + const [style, setStyle] = useState(null); // from list const [otherStyle, setOtherStyle] = useState(""); - const [audience, setAudience] = useState( - __DEV__ ? "Aux clients de l'agence minuit" : "", - ); - const [structure, setStructure] = useState( - __DEV__ ? "1 couplet, 1 refrain, 1 couplet, 1 refrain" : null, - ); // selected structure string - const [rhymes, setRhymes] = useState(__DEV__ ? "Avec rimes" : null); + const [audience, setAudience] = useState(""); + const [structure, setStructure] = useState(null); // selected structure string + const [rhymes, setRhymes] = useState(null); const [customStructure, setCustomStructure] = useState(null); // array like ['couplet','refrain'] const parsedStructure = useMemo(() => { @@ -117,27 +99,61 @@ const CreateLyricsWithAi = () => { ]); const onPressNext = () => { - setSelectedIndex(selectedIndex + 1); - setProgress(progress + 9); - scrollRef.current.scrollToIndex({ - index: selectedIndex + 1, - animated: true, - }); + // If user already has lyrics and just finished CustomizeSongStructure (index 6), + // skip AI generation and go straight to Lyrics editor + if (hasLyrics && selectedIndex === 6) { + const chosenStructure = + (customStructure && + parsedStructure && + customStructure.length === parsedStructure.length + ? customStructure + : parsedStructure) || []; + navigate(Routes.Lyrics, { + config: { structure: chosenStructure }, + selections: { + objective, + otherObjective, + context, + emotion, + style, + otherStyle, + audience, + structure, + parsedStructure, + customStructure, + rhymes, + }, + hasLyrics: true, + }); + return; + } + setSelectedIndex((idx) => idx + 1); }; const onPressBack = () => { - if (selectedIndex > 0) { - setSelectedIndex(selectedIndex - 1); - setProgress(progress - 9); - scrollRef.current.scrollToIndex({ - index: selectedIndex - 1, - animated: true, - }); + // If currently on SongStructure, go back to previous screen instead of previous step + if (selectedIndex === 5) { + goBack(); + } else if (selectedIndex > 0) { + setSelectedIndex((idx) => Math.max(0, idx - 1)); } else { goBack(); } }; + // Sync scroll position and progress with selectedIndex + React.useEffect(() => { + if (!parentLayout?.height) return; + try { + const nextProgress = 16 + selectedIndex * 9; + setProgress(nextProgress); + scrollRef.current?.scrollToIndex?.({ + index: selectedIndex, + animated: true, + }); + } catch (_) {} + }, [selectedIndex, parentLayout?.height]); + return ( { style={{ width, left: -gutters }} ref={scrollRef} disableGesture + index={selectedIndex} > { lyricsData: result, config, selections, + hasLyrics: false, }) } /> diff --git a/src/screens/Writing/CustomizeSongStructure.js b/src/screens/Writing/CustomizeSongStructure.js index 72fd2a7..1709bd5 100644 --- a/src/screens/Writing/CustomizeSongStructure.js +++ b/src/screens/Writing/CustomizeSongStructure.js @@ -1,84 +1,93 @@ -import { View, Text, StyleSheet, ScrollView } from "react-native"; -import React, { useMemo, useState } from "react"; -import CreateLyricsHeader from "./components/CreateLyricsHeader"; +import { View, StyleSheet, Image, Platform, Text } from "react-native"; +import React, { useMemo, useState, useCallback, useEffect } from "react"; import { BlurView } from "expo-blur"; -import { Palette } from "../../styles"; +import CreateLyricsHeader from "./components/CreateLyricsHeader"; +import { Palette, Style } from "../../styles"; import { FONT_FAMILY } from "../../styles/Fonts"; -import ItemContainer from "../../components/ItemContainer/ItemContainer"; -import { CUSTOM_SONG_STRUCTURE } from "../../data/data"; -import SongStructureDragDrop from "../../components/SongStructureDragDrop"; +import Sortable from "react-native-sortables"; +import { icons } from "../../assets"; // baseStructure: array like ['couplet','refrain',...] // onChange: callback that receives array like ['couplet','refrain',...] const CustomizeSongStructure = ({ baseStructure = [], onChange }) => { const [containerLayout, setContainerLayout] = useState(null); - const sourceItems = useMemo(() => { - // create unique ids for duplicates + // Build stable keyed data like { 'couplet-1': { label, value }, ... } + const data = useMemo(() => { const counters = { couplet: 0, refrain: 0 }; - return (baseStructure || []).map((type) => { - const key = (type || '').toLowerCase(); + const out = {}; + (baseStructure || []).forEach((type) => { + const key = (type || "").toLowerCase(); counters[key] = (counters[key] || 0) + 1; const idx = counters[key]; - return { - id: `${key}-${idx}`, - label: `${type} ${idx}`, + const id = `${key}-${idx}`; + out[id] = { + id, + label: `${key === "couplet" ? "Couplet" : "Refrain"} ${idx}`, value: key, }; }); + return out; }, [baseStructure]); + const items = useMemo(() => Object.values(data), [data]); + + // Initialize parent with current order (so it's saved even without drag) + useEffect(() => { + const initialValues = (items || []).map((it) => it?.value).filter(Boolean); + onChange?.(initialValues); + // We only want to run when baseStructure-derived items change + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [items.length]); + + const Row = ({ item: rowData }) => ( + + + + + + + + + + + + + + + + {rowData?.label || ""} + + + + + + + + + ); + return ( - {/* - { - setContainerLayout(e.nativeEvent.layout); + setContainerLayout(e.nativeEvent.layout)}> + } + customHandle + onDragEnd={({ data: newData }) => { + const values = (newData || []).map((it) => it?.value).filter(Boolean); + onChange?.(values); }} - > - - - {["Couplet", "Refrain", "Couplet", "Refrain"].map( - (item, index) => ( - - {item} - - ) - )} - - - - - - - {CUSTOM_SONG_STRUCTURE.map((item, index) => ( - - - {item} - - - ))} - - - - */} - - onChange?.(arr)} /> @@ -88,17 +97,6 @@ const CustomizeSongStructure = ({ baseStructure = [], onChange }) => { export default CustomizeSongStructure; const styles = StyleSheet.create({ - dropzoneContainer: { - paddingVertical: 14, - paddingHorizontal: 12, - backgroundColor: "#00000080", - borderRadius: 14, - }, - dropzone: { - fontSize: 16, - color: Palette.white, - fontFamily: FONT_FAMILY.InterRegular, - }, itemContainer: { height: 54, backgroundColor: Palette.glass, @@ -113,4 +111,21 @@ const styles = StyleSheet.create({ shadowRadius: 3.84, elevation: 5, }, + rowBlur: { + flex: 1, + backgroundColor: Palette.glass, + justifyContent: "center", + paddingHorizontal: 12, + height: "100%", + }, + rowText: { + fontSize: 16, + color: Palette.white, + fontFamily: FONT_FAMILY.InterRegular, + }, + handleIcon: { + width: 22, + height: 22, + tintColor: Palette.white, + }, }); diff --git a/src/screens/Writing/EmotionConvey.js b/src/screens/Writing/EmotionConvey.js index a447f45..444c61f 100644 --- a/src/screens/Writing/EmotionConvey.js +++ b/src/screens/Writing/EmotionConvey.js @@ -1,13 +1,15 @@ import { View, Text, FlatList } from "react-native"; import React, { useState } from "react"; import CreateLyricsHeader from "./components/CreateLyricsHeader"; -import { responsiveHeight } from "react-native-responsive-dimensions"; import { Palette } from "../../styles"; import { FONT_FAMILY } from "../../styles/Fonts"; import { EMOTION_CONVEY } from "../../data/data"; import ItemContainer from "../../components/ItemContainer/ItemContainer"; -const EmotionConvey = ({ selected: selectedProp, setSelected: setSelectedProp }) => { +const EmotionConvey = ({ + selected: selectedProp, + setSelected: setSelectedProp, +}) => { const [containerLayout, setContainerLayout] = useState(null); const [internalSelected, setInternalSelected] = useState(null); const selected = selectedProp ?? internalSelected; @@ -25,8 +27,8 @@ const EmotionConvey = ({ selected: selectedProp, setSelected: setSelectedProp }) return ( { @@ -20,17 +19,30 @@ const Lyrics = ({ navigation }) => { const lyricsData = route?.params?.lyricsData; const config = route?.params?.config; const selections = route?.params?.selections; + const hasLyrics = !!route?.params?.hasLyrics; const { setIsLoading } = useMinuit(); const initial = useMemo(() => { const title = lyricsData?.title || ""; - const aiSections = Array.isArray(lyricsData?.lyrics) ? lyricsData.lyrics : []; + const aiSections = Array.isArray(lyricsData?.lyrics) + ? lyricsData.lyrics + : []; // Respecter l'ordre de la structure choisie si disponible const targetStructure = Array.isArray(config?.structure) ? config.structure.map((t) => (t || "").toLowerCase()) : null; - if (aiSections.length && targetStructure && aiSections.length === targetStructure.length) { - return { title, sections: aiSections.map((s) => ({ type: (s?.type || "").toLowerCase(), lyrics: s?.lyrics || "" })) }; + if ( + aiSections.length && + targetStructure && + aiSections.length === targetStructure.length + ) { + return { + title, + sections: aiSections.map((s) => ({ + type: (s?.type || "").toLowerCase(), + lyrics: s?.lyrics || "", + })), + }; } // Sinon, créer à partir de la structure if (targetStructure && targetStructure.length) { @@ -77,9 +89,23 @@ const Lyrics = ({ navigation }) => { const onValidate = useCallback(async () => { try { await setIsLoading(true); + const titleTrimmed = (titleValue || "").trim(); + if (!titleTrimmed) { + Alert.alert("Titre manquant", "Veuillez renseigner un titre."); + return; + } + const invalid = (sections || []).some((s) => !(s?.lyrics || "").trim()); + if (invalid) { + Alert.alert( + "Champs incomplets", + "Chaque couplet et refrain doit contenir du texte.", + ); + return; + } const user = firebase.auth().currentUser; const payload = { - title: titleValue?.trim() || "", + title: titleTrimmed, + titleLower: titleTrimmed.toLowerCase(), lyrics: (sections || []).map((s) => ({ type: (s?.type || "").toLowerCase(), lyrics: s?.lyrics || "", @@ -89,9 +115,10 @@ const Lyrics = ({ navigation }) => { userId: user ? user.uid : null, createdAt: firebase.firestore.FieldValue.serverTimestamp(), updatedAt: firebase.firestore.FieldValue.serverTimestamp(), + hasLyrics, }; - await firebase.firestore().collection("projects").add(payload); - navigate(Routes.Studio); + const { id: projectId } = await projectsRef.add(payload); + navigate(Routes.FlowSelection, { projectId }); } catch (e) { console.log(e); Alert.alert("Erreur", "Échec de l'enregistrement dans le projet."); @@ -157,10 +184,12 @@ const Lyrics = ({ navigation }) => { gap: 12, }} > - + {!hasLyrics && ( + + )} diff --git a/src/screens/Writing/SongStructure.js b/src/screens/Writing/SongStructure.js index 0151bdd..d12c0a1 100644 --- a/src/screens/Writing/SongStructure.js +++ b/src/screens/Writing/SongStructure.js @@ -1,13 +1,15 @@ -import { View, Text, StyleSheet, FlatList, Pressable } from "react-native"; +import { View, Text, StyleSheet, FlatList } from "react-native"; import React, { useState } from "react"; import CreateLyricsHeader from "./components/CreateLyricsHeader"; -import { BlurView } from "expo-blur"; -import { GOALS, SONG_STRUCTURE } from "../../data/data"; -import { Palette, Style } from "../../styles"; +import { SONG_STRUCTURE } from "../../data/data"; +import { Palette } from "../../styles"; import { FONT_FAMILY } from "../../styles/Fonts"; import ItemContainer from "../../components/ItemContainer/ItemContainer"; -const SongStructure = ({ selected: selectedProp, setSelected: setSelectedProp }) => { +const SongStructure = ({ + selected: selectedProp, + setSelected: setSelectedProp, +}) => { const [internalSelected, setInternalSelected] = useState(null); const selected = selectedProp ?? internalSelected; const setSelected = setSelectedProp ?? setInternalSelected; diff --git a/src/screens/Writing/SongStyle.js b/src/screens/Writing/SongStyle.js index 5559701..7d6cbbe 100644 --- a/src/screens/Writing/SongStyle.js +++ b/src/screens/Writing/SongStyle.js @@ -8,7 +8,12 @@ import CustomInput from "./components/CustomInput"; import { FONT_FAMILY } from "../../styles/Fonts"; import ItemContainer from "../../components/ItemContainer/ItemContainer"; -const SongStyle = ({ selected: selectedProp, setSelected: setSelectedProp, otherStyle, setOtherStyle }) => { +const SongStyle = ({ + selected: selectedProp, + setSelected: setSelectedProp, + otherStyle, + setOtherStyle, +}) => { const [internalSelected, setInternalSelected] = useState(null); const selected = selectedProp ?? internalSelected; const setSelected = setSelectedProp ?? setInternalSelected; diff --git a/src/screens/Writing/WritingLyrics.js b/src/screens/Writing/WritingLyrics.js index 12aa40c..2b22bc7 100644 --- a/src/screens/Writing/WritingLyrics.js +++ b/src/screens/Writing/WritingLyrics.js @@ -13,7 +13,7 @@ const WritingLyrics = () => { return ( - + @@ -24,7 +24,13 @@ const WritingLyrics = () => { gap: 12, }} > - + { + navigate(Routes.CreateLyricsWithAi, { + hasLyrics: true, + }); + }} + /> navigate(Routes.CreateLyricsWithAi)} diff --git a/src/services/follows.js b/src/services/follows.js deleted file mode 100644 index 7989ff5..0000000 --- a/src/services/follows.js +++ /dev/null @@ -1,20 +0,0 @@ -import { followsRef } from "../config/firebase"; - -export const getFollowersCount = async (userId) => { - if (!userId) return 0; - const snap = await followsRef.where("followeeId", "==", userId).get(); - return snap?.size || 0; -}; - -export const getFollowingCount = async (userId) => { - if (!userId) return 0; - const snap = await followsRef.where("followerId", "==", userId).get(); - return snap?.size || 0; -}; - -export const unfollowUser = async ({ followerId, followeeId }) => { - if (!followerId || !followeeId) throw new Error("Erreur lors du unfollow"); - const id = `${followerId}_${followeeId}`; - await followsRef.doc(id).delete(); - return id; -}; diff --git a/yarn.lock b/yarn.lock index 1f01943..5983b04 100644 --- a/yarn.lock +++ b/yarn.lock @@ -981,24 +981,24 @@ "@types/hammerjs" "^2.0.36" "@emnapi/core@^1.4.3": - version "1.4.5" - resolved "https://registry.yarnpkg.com/@emnapi/core/-/core-1.4.5.tgz#bfbb0cbbbb9f96ec4e2c4fd917b7bbe5495ceccb" - integrity sha512-XsLw1dEOpkSX/WucdqUhPWP7hDxSvZiY+fsUC14h+FtQ2Ifni4znbBt8punRX+Uj2JG/uDb8nEHVKvrVlvdZ5Q== + version "1.5.0" + resolved "https://registry.yarnpkg.com/@emnapi/core/-/core-1.5.0.tgz#85cd84537ec989cebb2343606a1ee663ce4edaf0" + integrity sha512-sbP8GzB1WDzacS8fgNPpHlp6C9VZe+SJP3F90W9rLemaQj2PzIuTEl1qDOYQf58YIpyjViI24y9aPWCjEzY2cg== dependencies: - "@emnapi/wasi-threads" "1.0.4" + "@emnapi/wasi-threads" "1.1.0" tslib "^2.4.0" "@emnapi/runtime@^1.4.3": - version "1.4.5" - resolved "https://registry.yarnpkg.com/@emnapi/runtime/-/runtime-1.4.5.tgz#c67710d0661070f38418b6474584f159de38aba9" - integrity sha512-++LApOtY0pEEz1zrd9vy1/zXVaVJJ/EbAF3u0fXIzPJEDtnITsBGbbK0EkM72amhl/R5b+5xx0Y/QhcVOpuulg== + version "1.5.0" + resolved "https://registry.yarnpkg.com/@emnapi/runtime/-/runtime-1.5.0.tgz#9aebfcb9b17195dce3ab53c86787a6b7d058db73" + integrity sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ== dependencies: tslib "^2.4.0" -"@emnapi/wasi-threads@1.0.4": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@emnapi/wasi-threads/-/wasi-threads-1.0.4.tgz#703fc094d969e273b1b71c292523b2f792862bf4" - integrity sha512-PJR+bOmMOPH8AtcTGAyYNiuJ3/Fcoj2XN/gBEWzDIKh254XO+mM9XoXHk5GNEhodxeMznbg7BlRojVbKN+gC6g== +"@emnapi/wasi-threads@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz#60b2102fddc9ccb78607e4a3cf8403ea69be41bf" + integrity sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ== dependencies: tslib "^2.4.0" @@ -2608,78 +2608,78 @@ "@types/yargs-parser" "*" "@typescript-eslint/eslint-plugin@^8.9.0": - version "8.40.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.40.0.tgz#19f959f273b32f5082c891903645e6a85328db4e" - integrity sha512-w/EboPlBwnmOBtRbiOvzjD+wdiZdgFeo17lkltrtn7X37vagKKWJABvyfsJXTlHe6XBzugmYgd4A4nW+k8Mixw== + version "8.41.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.41.0.tgz#42209e2ce3e2274de0f5f9b75c777deedacaa558" + integrity sha512-8fz6oa6wEKZrhXWro/S3n2eRJqlRcIa6SlDh59FXJ5Wp5XRZ8B9ixpJDcjadHq47hMx0u+HW6SNa6LjJQ6NLtw== dependencies: "@eslint-community/regexpp" "^4.10.0" - "@typescript-eslint/scope-manager" "8.40.0" - "@typescript-eslint/type-utils" "8.40.0" - "@typescript-eslint/utils" "8.40.0" - "@typescript-eslint/visitor-keys" "8.40.0" + "@typescript-eslint/scope-manager" "8.41.0" + "@typescript-eslint/type-utils" "8.41.0" + "@typescript-eslint/utils" "8.41.0" + "@typescript-eslint/visitor-keys" "8.41.0" graphemer "^1.4.0" ignore "^7.0.0" natural-compare "^1.4.0" ts-api-utils "^2.1.0" "@typescript-eslint/parser@^8.9.0": - version "8.40.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.40.0.tgz#1bc9f3701ced29540eb76ff2d95ce0d52ddc7e69" - integrity sha512-jCNyAuXx8dr5KJMkecGmZ8KI61KBUhkCob+SD+C+I5+Y1FWI2Y3QmY4/cxMCC5WAsZqoEtEETVhUiUMIGCf6Bw== + version "8.41.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.41.0.tgz#677f5b2b3fa947ee1eac4129220c051b1990d898" + integrity sha512-gTtSdWX9xiMPA/7MV9STjJOOYtWwIJIYxkQxnSV1U3xcE+mnJSH3f6zI0RYP+ew66WSlZ5ed+h0VCxsvdC1jJg== dependencies: - "@typescript-eslint/scope-manager" "8.40.0" - "@typescript-eslint/types" "8.40.0" - "@typescript-eslint/typescript-estree" "8.40.0" - "@typescript-eslint/visitor-keys" "8.40.0" + "@typescript-eslint/scope-manager" "8.41.0" + "@typescript-eslint/types" "8.41.0" + "@typescript-eslint/typescript-estree" "8.41.0" + "@typescript-eslint/visitor-keys" "8.41.0" debug "^4.3.4" -"@typescript-eslint/project-service@8.40.0": - version "8.40.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/project-service/-/project-service-8.40.0.tgz#1b7ba6079ff580c3215882fe75a43e5d3ed166b9" - integrity sha512-/A89vz7Wf5DEXsGVvcGdYKbVM9F7DyFXj52lNYUDS1L9yJfqjW/fIp5PgMuEJL/KeqVTe2QSbXAGUZljDUpArw== +"@typescript-eslint/project-service@8.41.0": + version "8.41.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/project-service/-/project-service-8.41.0.tgz#08ebf882d413a038926e73fda36e00c3dba84882" + integrity sha512-b8V9SdGBQzQdjJ/IO3eDifGpDBJfvrNTp2QD9P2BeqWTGrRibgfgIlBSw6z3b6R7dPzg752tOs4u/7yCLxksSQ== dependencies: - "@typescript-eslint/tsconfig-utils" "^8.40.0" - "@typescript-eslint/types" "^8.40.0" + "@typescript-eslint/tsconfig-utils" "^8.41.0" + "@typescript-eslint/types" "^8.41.0" debug "^4.3.4" -"@typescript-eslint/scope-manager@8.40.0": - version "8.40.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.40.0.tgz#2fbfcc8643340d8cd692267e61548b946190be8a" - integrity sha512-y9ObStCcdCiZKzwqsE8CcpyuVMwRouJbbSrNuThDpv16dFAj429IkM6LNb1dZ2m7hK5fHyzNcErZf7CEeKXR4w== +"@typescript-eslint/scope-manager@8.41.0": + version "8.41.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.41.0.tgz#c8aba12129cb9cead1f1727f58e6a0fcebeecdb5" + integrity sha512-n6m05bXn/Cd6DZDGyrpXrELCPVaTnLdPToyhBoFkLIMznRUQUEQdSp96s/pcWSQdqOhrgR1mzJ+yItK7T+WPMQ== dependencies: - "@typescript-eslint/types" "8.40.0" - "@typescript-eslint/visitor-keys" "8.40.0" + "@typescript-eslint/types" "8.41.0" + "@typescript-eslint/visitor-keys" "8.41.0" -"@typescript-eslint/tsconfig-utils@8.40.0", "@typescript-eslint/tsconfig-utils@^8.40.0": - version "8.40.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.40.0.tgz#8e8fdb9b988854aedd04abdde3239c4bdd2d26e4" - integrity sha512-jtMytmUaG9d/9kqSl/W3E3xaWESo4hFDxAIHGVW/WKKtQhesnRIJSAJO6XckluuJ6KDB5woD1EiqknriCtAmcw== +"@typescript-eslint/tsconfig-utils@8.41.0", "@typescript-eslint/tsconfig-utils@^8.41.0": + version "8.41.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.41.0.tgz#134dee36eb16cdd78095a20bca0516d10b5dda75" + integrity sha512-TDhxYFPUYRFxFhuU5hTIJk+auzM/wKvWgoNYOPcOf6i4ReYlOoYN8q1dV5kOTjNQNJgzWN3TUUQMtlLOcUgdUw== -"@typescript-eslint/type-utils@8.40.0": - version "8.40.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.40.0.tgz#a7e4a1f0815dd0ba3e4eef945cc87193ca32c422" - integrity sha512-eE60cK4KzAc6ZrzlJnflXdrMqOBaugeukWICO2rB0KNvwdIMaEaYiywwHMzA1qFpTxrLhN9Lp4E/00EgWcD3Ow== +"@typescript-eslint/type-utils@8.41.0": + version "8.41.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.41.0.tgz#68d401e38fccf239925447e97bdbd048a9891ae5" + integrity sha512-63qt1h91vg3KsjVVonFJWjgSK7pZHSQFKH6uwqxAH9bBrsyRhO6ONoKyXxyVBzG1lJnFAJcKAcxLS54N1ee1OQ== dependencies: - "@typescript-eslint/types" "8.40.0" - "@typescript-eslint/typescript-estree" "8.40.0" - "@typescript-eslint/utils" "8.40.0" + "@typescript-eslint/types" "8.41.0" + "@typescript-eslint/typescript-estree" "8.41.0" + "@typescript-eslint/utils" "8.41.0" debug "^4.3.4" ts-api-utils "^2.1.0" -"@typescript-eslint/types@8.40.0", "@typescript-eslint/types@^8.29.1", "@typescript-eslint/types@^8.40.0": - version "8.40.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.40.0.tgz#0b580fdf643737aa5c01285314b5c6e9543846a9" - integrity sha512-ETdbFlgbAmXHyFPwqUIYrfc12ArvpBhEVgGAxVYSwli26dn8Ko+lIo4Su9vI9ykTZdJn+vJprs/0eZU0YMAEQg== +"@typescript-eslint/types@8.41.0", "@typescript-eslint/types@^8.29.1", "@typescript-eslint/types@^8.41.0": + version "8.41.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.41.0.tgz#9935afeaae65e535abcbcee95383fa649c64d16d" + integrity sha512-9EwxsWdVqh42afLbHP90n2VdHaWU/oWgbH2P0CfcNfdKL7CuKpwMQGjwev56vWu9cSKU7FWSu6r9zck6CVfnag== -"@typescript-eslint/typescript-estree@8.40.0": - version "8.40.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.40.0.tgz#295149440ce7da81c790a4e14e327599a3a1e5c9" - integrity sha512-k1z9+GJReVVOkc1WfVKs1vBrR5MIKKbdAjDTPvIK3L8De6KbFfPFt6BKpdkdk7rZS2GtC/m6yI5MYX+UsuvVYQ== +"@typescript-eslint/typescript-estree@8.41.0": + version "8.41.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.41.0.tgz#7c9cff8b4334ce96f14e9689692e8cf426ce4d59" + integrity sha512-D43UwUYJmGhuwHfY7MtNKRZMmfd8+p/eNSfFe6tH5mbVDto+VQCayeAt35rOx3Cs6wxD16DQtIKw/YXxt5E0UQ== dependencies: - "@typescript-eslint/project-service" "8.40.0" - "@typescript-eslint/tsconfig-utils" "8.40.0" - "@typescript-eslint/types" "8.40.0" - "@typescript-eslint/visitor-keys" "8.40.0" + "@typescript-eslint/project-service" "8.41.0" + "@typescript-eslint/tsconfig-utils" "8.41.0" + "@typescript-eslint/types" "8.41.0" + "@typescript-eslint/visitor-keys" "8.41.0" debug "^4.3.4" fast-glob "^3.3.2" is-glob "^4.0.3" @@ -2687,22 +2687,22 @@ semver "^7.6.0" ts-api-utils "^2.1.0" -"@typescript-eslint/utils@8.40.0", "@typescript-eslint/utils@^8.29.1": - version "8.40.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.40.0.tgz#8d0c6430ed2f5dc350784bb0d8be514da1e54054" - integrity sha512-Cgzi2MXSZyAUOY+BFwGs17s7ad/7L+gKt6Y8rAVVWS+7o6wrjeFN4nVfTpbE25MNcxyJ+iYUXflbs2xR9h4UBg== +"@typescript-eslint/utils@8.41.0", "@typescript-eslint/utils@^8.29.1": + version "8.41.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.41.0.tgz#17cb3b766c1626311004ea41ffd8c27eb226b953" + integrity sha512-udbCVstxZ5jiPIXrdH+BZWnPatjlYwJuJkDA4Tbo3WyYLh8NvB+h/bKeSZHDOFKfphsZYJQqaFtLeXEqurQn1A== dependencies: "@eslint-community/eslint-utils" "^4.7.0" - "@typescript-eslint/scope-manager" "8.40.0" - "@typescript-eslint/types" "8.40.0" - "@typescript-eslint/typescript-estree" "8.40.0" + "@typescript-eslint/scope-manager" "8.41.0" + "@typescript-eslint/types" "8.41.0" + "@typescript-eslint/typescript-estree" "8.41.0" -"@typescript-eslint/visitor-keys@8.40.0": - version "8.40.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.40.0.tgz#c1b45196981311fed7256863be4bfb2d3eda332a" - integrity sha512-8CZ47QwalyRjsypfwnbI3hKy5gJDPmrkLjkgMxhi0+DZZ2QNx2naS6/hWoVYUHU7LU2zleF68V9miaVZvhFfTA== +"@typescript-eslint/visitor-keys@8.41.0": + version "8.41.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.41.0.tgz#16eb99b55d207f6688002a2cf425e039579aa9a9" + integrity sha512-+GeGMebMCy0elMNg67LRNoVnUFPIm37iu5CmHESVx56/9Jsfdpsvbv605DQ81Pi/x11IdKUsS5nzgTYbCQU9fg== dependencies: - "@typescript-eslint/types" "8.40.0" + "@typescript-eslint/types" "8.41.0" eslint-visitor-keys "^4.2.1" "@ungap/structured-clone@^1.2.0": @@ -3437,12 +3437,12 @@ braces@^3.0.3: fill-range "^7.1.1" browserslist@^4.24.0, browserslist@^4.25.3: - version "4.25.3" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.25.3.tgz#9167c9cbb40473f15f75f85189290678b99b16c5" - integrity sha512-cDGv1kkDI4/0e5yON9yM5G/0A5u8sf5TnmdX5C9qHzI9PPu++sQ9zjm1k9NiOrf3riY4OkK0zSGqfvJyJsgCBQ== + version "4.25.4" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.25.4.tgz#ebdd0e1d1cf3911834bab3a6cd7b917d9babf5af" + integrity sha512-4jYpcjabC606xJ3kw2QwGEZKX0Aw7sgQdZCvIK9dhVSPh76BKo+C+btT1RRofH7B+8iNpEbgGNVWiLki5q93yg== dependencies: - caniuse-lite "^1.0.30001735" - electron-to-chromium "^1.5.204" + caniuse-lite "^1.0.30001737" + electron-to-chromium "^1.5.211" node-releases "^2.0.19" update-browserslist-db "^1.1.3" @@ -3603,10 +3603,10 @@ camelcase@^6.2.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -caniuse-lite@^1.0.30001735: - version "1.0.30001737" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001737.tgz#8292bb7591932ff09e9a765f12fdf5629a241ccc" - integrity sha512-BiloLiXtQNrY5UyF0+1nSJLXUENuhka2pzy2Fx5pGxqavdrxSCW4U6Pn/PoG3Efspi2frRbHpBV2XsrPE6EDlw== +caniuse-lite@^1.0.30001737: + version "1.0.30001739" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001739.tgz#b34ce2d56bfc22f4352b2af0144102d623a124f4" + integrity sha512-y+j60d6ulelrNSwpPyrHdl+9mJnQzHBr08xm48Qno0nSk4h3Qojh+ziv2qE6rXf4k3tadF4o1J/1tAbVm1NtnA== caw@^2.0.0, caw@^2.0.1: version "2.0.1" @@ -4386,10 +4386,10 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== -electron-to-chromium@^1.5.204: - version "1.5.208" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.208.tgz#609c29502fd7257b4d721e3446f3ae391a0ca1b3" - integrity sha512-ozZyibehoe7tOhNaf16lKmljVf+3npZcJIEbJRVftVsmAg5TeA1mGS9dVCZzOwr2xT7xK15V0p7+GZqSPgkuPg== +electron-to-chromium@^1.5.211: + version "1.5.211" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.211.tgz#749317bf9cf894c06f67980940cf8074e5eb08ca" + integrity sha512-IGBvimJkotaLzFnwIVgW9/UD/AOJ2tByUmeOrtqBfACSbAw5b1G0XpvdaieKyc7ULmbwXVx+4e4Be8pOPBrYkw== emoji-regex@^8.0.0: version "8.0.0" @@ -5007,11 +5007,6 @@ expo-audio@~0.3.5: resolved "https://registry.yarnpkg.com/expo-audio/-/expo-audio-0.3.5.tgz#1f151ec9919e163019f1aa76a117657e0ea6b613" integrity sha512-gzpDH3vZI1FDL1Q8pXryACtNIW+idZ/zIZ8WqdTRzJuzxucazrG2gLXUS2ngcXQBn09Jyz4RUnU10Tu2N7/Hgg== -expo-av@~15.0.2: - version "15.0.2" - resolved "https://registry.yarnpkg.com/expo-av/-/expo-av-15.0.2.tgz#65bb08658a7fe3a67aa47da614abbfae9adb684e" - integrity sha512-AHIHXdqLgK1dfHZF0JzX3YSVySGMrWn9QtPzaVjw54FAzvXfMt4sIoq4qRL/9XWCP9+ICcCs/u3EcvmxQjrfcA== - expo-blur@~14.0.3: version "14.0.3" resolved "https://registry.yarnpkg.com/expo-blur/-/expo-blur-14.0.3.tgz#656d6b2442bfbbfb2a6608c6bc1151b29bce6698" @@ -5220,6 +5215,11 @@ expo-updates-interface@~1.0.0: resolved "https://registry.yarnpkg.com/expo-updates-interface/-/expo-updates-interface-1.0.0.tgz#b98c66b800d29561c62409556948b2af3d5316e5" integrity sha512-93oWtvULJOj+Pp+N/lpTcFfuREX1wNeHtp7Lwn8EbzYYmdn37MvZU3TPW2tYYCZuhzmKEXnUblYcruYoDu7IrQ== +expo-video@~2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/expo-video/-/expo-video-2.0.6.tgz#4da4e4d427ad42649881a5336697b5a7164aaab3" + integrity sha512-oDorKwjreHT596oY6ZfktbDa3VF+Sq7gVsTbnQ4QVqGYL13mIO0s+h4y9xMyG/cDWyFpiRc4UT8KkPdxL0wViQ== + expo@~52.0.47: version "52.0.47" resolved "https://registry.yarnpkg.com/expo/-/expo-52.0.47.tgz#b2a25bdcbd2059094396750e896946d2e2e61753" @@ -5313,9 +5313,9 @@ fast-loops@^1.1.3: integrity sha512-8dbd3XWoKCTms18ize6JmQF1SFnnfj5s0B7rRry22EofgMu7B6LKHVh+XfFqFGsqnbH54xgeO83PzpKI+ODhlg== fast-uri@^3.0.1: - version "3.0.6" - resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.0.6.tgz#88f130b77cfaea2378d56bf970dea21257a68748" - integrity sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw== + version "3.1.0" + resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.1.0.tgz#66eecff6c764c0df9b762e62ca7edcfb53b4edfa" + integrity sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA== fast-xml-parser@^4.4.1: version "4.5.3" @@ -5600,9 +5600,9 @@ flow-enums-runtime@^0.0.6: integrity sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw== flow-parser@0.*: - version "0.279.0" - resolved "https://registry.yarnpkg.com/flow-parser/-/flow-parser-0.279.0.tgz#30cfb614b2a5157a3c40640c1c5ee90f888fade7" - integrity sha512-41VremrzImoLcZuqY18U86ojcVy2Stuq4VnjdAcxHjGanvx3VmKVUITIVMt2PM1RvmRJtgtJWvCxVpQ1E9OGDw== + version "0.280.0" + resolved "https://registry.yarnpkg.com/flow-parser/-/flow-parser-0.280.0.tgz#d19efc98528556597c2d184cf14b4e597c108f67" + integrity sha512-BblDQXb41t9gwFHJNR8EhLdS/9fqK/mCBZLRHiUccA2V1VoYIKuutglO/TAuJfUU3tolQlvMaW1S/KbRDR0rNQ== fontfaceobserver@^2.1.0: version "2.3.0" @@ -8704,6 +8704,11 @@ react-native-gesture-handler@~2.20.2: invariant "^2.2.4" prop-types "^15.7.2" +react-native-haptic-feedback@>=2.0.0: + version "2.3.3" + resolved "https://registry.yarnpkg.com/react-native-haptic-feedback/-/react-native-haptic-feedback-2.3.3.tgz#88b6876e91399a69bd1b551fe1681b2f3dc1214e" + integrity sha512-svS4D5PxfNv8o68m9ahWfwje5NqukM3qLS48+WTdhbDkNUkOhP9rDfDSRHzlhk4zq+ISjyw95EhLeh8NkKX5vQ== + react-native-hyperlink@^0.0.22: version "0.0.22" resolved "https://registry.yarnpkg.com/react-native-hyperlink/-/react-native-hyperlink-0.0.22.tgz#9f553390b5f96ae473d942639c40bce6579abc89" @@ -8797,6 +8802,13 @@ react-native-safe-area-context@4.5.0: resolved "https://registry.yarnpkg.com/react-native-safe-area-context/-/react-native-safe-area-context-4.5.0.tgz#9208313236e8f49e1920ac1e2a2c975f03aed284" integrity sha512-0WORnk9SkREGUg2V7jHZbuN5x4vcxj/1B0QOcXJjdYWrzZHgLcUzYWWIUecUPJh747Mwjt/42RZDOaFn3L8kPQ== +react-native-sortables@^1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/react-native-sortables/-/react-native-sortables-1.8.0.tgz#fabdc8a757eb1e847eda3b4af1f9d349780a1079" + integrity sha512-uoNY0uiHikq3eKJoF85CATMPpo9jS7t37XUlunxSGjjbGi4L05os8eJBGNZSR+3NQgK2FtYGGkQtFbeSJIwmDg== + optionalDependencies: + react-native-haptic-feedback ">=2.0.0" + react-native-store-review@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/react-native-store-review/-/react-native-store-review-0.3.0.tgz#67480b9736c10bd00ad8d4d80324d2146e18d7dd"