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"