From a326f7c833cdadcdb3019c9ec31793b3c6c96454 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 11 Mar 2024 21:15:57 -0400 Subject: [PATCH 01/45] chore(deps): update open-api (#7867) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- open-api/typescript-sdk/package-lock.json | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/open-api/typescript-sdk/package-lock.json b/open-api/typescript-sdk/package-lock.json index 0c2230835..62412fdd4 100644 --- a/open-api/typescript-sdk/package-lock.json +++ b/open-api/typescript-sdk/package-lock.json @@ -15,24 +15,24 @@ } }, "node_modules/@oazapfts/runtime": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@oazapfts/runtime/-/runtime-1.0.1.tgz", - "integrity": "sha512-CMl7f1gXYpjIyEtDhg4YfXwr2MXfbadbvqwKbMsaHkVtSglmuz5A8jSyefTqaJlmh0MOA2ZNS9jnbfIdtcoDiw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@oazapfts/runtime/-/runtime-1.0.2.tgz", + "integrity": "sha512-V33FjR6V+AkGRWYQW3XPm5BLn2loGl2ujSeja1TzdjjEn2zjGgl3ve0dcFf/jEwPZEOqQZl6YwIgIB/clXVqWw==", "dev": true }, "node_modules/@types/node": { - "version": "20.11.24", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.24.tgz", - "integrity": "sha512-Kza43ewS3xoLgCEpQrsT+xRo/EJej1y0kVYGiLFE1NEODXGzTfwiC6tXTLMQskn1X4/Rjlh0MQUvx9W+L9long==", + "version": "20.11.25", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.25.tgz", + "integrity": "sha512-TBHyJxk2b7HceLVGFcpAUjsa5zIdsPWlR6XHfyGzd0SFu+/NFgQgMAl96MSDZgQDvJAvV6BKsFOrt6zIL09JDw==", "dev": true, "dependencies": { "undici-types": "~5.26.4" } }, "node_modules/typescript": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", - "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", + "version": "5.4.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.2.tgz", + "integrity": "sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==", "dev": true, "bin": { "tsc": "bin/tsc", From cfece3164911ba7acaa6aa9f3937bfa33352852b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 11 Mar 2024 21:16:22 -0400 Subject: [PATCH 02/45] chore(deps): update @immich/cli (#7866) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- cli/package-lock.json | 216 +++++++++++++++++++++--------------------- 1 file changed, 108 insertions(+), 108 deletions(-) diff --git a/cli/package-lock.json b/cli/package-lock.json index 38fe3c6f1..a9dfd9d49 100644 --- a/cli/package-lock.json +++ b/cli/package-lock.json @@ -1281,9 +1281,9 @@ } }, "node_modules/@types/node": { - "version": "20.11.24", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.24.tgz", - "integrity": "sha512-Kza43ewS3xoLgCEpQrsT+xRo/EJej1y0kVYGiLFE1NEODXGzTfwiC6tXTLMQskn1X4/Rjlh0MQUvx9W+L9long==", + "version": "20.11.25", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.25.tgz", + "integrity": "sha512-TBHyJxk2b7HceLVGFcpAUjsa5zIdsPWlR6XHfyGzd0SFu+/NFgQgMAl96MSDZgQDvJAvV6BKsFOrt6zIL09JDw==", "dev": true, "dependencies": { "undici-types": "~5.26.4" @@ -1302,16 +1302,16 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.1.0.tgz", - "integrity": "sha512-j6vT/kCulhG5wBmGtstKeiVr1rdXE4nk+DT1k6trYkwlrvW9eOF5ZbgKnd/YR6PcM4uTEXa0h6Fcvf6X7Dxl0w==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.1.1.tgz", + "integrity": "sha512-zioDz623d0RHNhvx0eesUmGfIjzrk18nSBC8xewepKXbBvN/7c1qImV7Hg8TI1URTxKax7/zxfxj3Uph8Chcuw==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "7.1.0", - "@typescript-eslint/type-utils": "7.1.0", - "@typescript-eslint/utils": "7.1.0", - "@typescript-eslint/visitor-keys": "7.1.0", + "@typescript-eslint/scope-manager": "7.1.1", + "@typescript-eslint/type-utils": "7.1.1", + "@typescript-eslint/utils": "7.1.1", + "@typescript-eslint/visitor-keys": "7.1.1", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", @@ -1337,15 +1337,15 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.1.0.tgz", - "integrity": "sha512-V1EknKUubZ1gWFjiOZhDSNToOjs63/9O0puCgGS8aDOgpZY326fzFu15QAUjwaXzRZjf/qdsdBrckYdv9YxB8w==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.1.1.tgz", + "integrity": "sha512-ZWUFyL0z04R1nAEgr9e79YtV5LbafdOtN7yapNbn1ansMyaegl2D4bL7vHoJ4HPSc4CaLwuCVas8CVuneKzplQ==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "7.1.0", - "@typescript-eslint/types": "7.1.0", - "@typescript-eslint/typescript-estree": "7.1.0", - "@typescript-eslint/visitor-keys": "7.1.0", + "@typescript-eslint/scope-manager": "7.1.1", + "@typescript-eslint/types": "7.1.1", + "@typescript-eslint/typescript-estree": "7.1.1", + "@typescript-eslint/visitor-keys": "7.1.1", "debug": "^4.3.4" }, "engines": { @@ -1365,13 +1365,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.1.0.tgz", - "integrity": "sha512-6TmN4OJiohHfoOdGZ3huuLhpiUgOGTpgXNUPJgeZOZR3DnIpdSgtt83RS35OYNNXxM4TScVlpVKC9jyQSETR1A==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.1.1.tgz", + "integrity": "sha512-cirZpA8bJMRb4WZ+rO6+mnOJrGFDd38WoXCEI57+CYBqta8Yc8aJym2i7vyqLL1vVYljgw0X27axkUXz32T8TA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.1.0", - "@typescript-eslint/visitor-keys": "7.1.0" + "@typescript-eslint/types": "7.1.1", + "@typescript-eslint/visitor-keys": "7.1.1" }, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -1382,13 +1382,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.1.0.tgz", - "integrity": "sha512-UZIhv8G+5b5skkcuhgvxYWHjk7FW7/JP5lPASMEUoliAPwIH/rxoUSQPia2cuOj9AmDZmwUl1usKm85t5VUMew==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.1.1.tgz", + "integrity": "sha512-5r4RKze6XHEEhlZnJtR3GYeCh1IueUHdbrukV2KSlLXaTjuSfeVF8mZUVPLovidCuZfbVjfhi4c0DNSa/Rdg5g==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "7.1.0", - "@typescript-eslint/utils": "7.1.0", + "@typescript-eslint/typescript-estree": "7.1.1", + "@typescript-eslint/utils": "7.1.1", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" }, @@ -1409,9 +1409,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.1.0.tgz", - "integrity": "sha512-qTWjWieJ1tRJkxgZYXx6WUYtWlBc48YRxgY2JN1aGeVpkhmnopq+SUC8UEVGNXIvWH7XyuTjwALfG6bFEgCkQA==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.1.1.tgz", + "integrity": "sha512-KhewzrlRMrgeKm1U9bh2z5aoL4s7K3tK5DwHDn8MHv0yQfWFz/0ZR6trrIHHa5CsF83j/GgHqzdbzCXJ3crx0Q==", "dev": true, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -1422,13 +1422,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.1.0.tgz", - "integrity": "sha512-k7MyrbD6E463CBbSpcOnwa8oXRdHzH1WiVzOipK3L5KSML92ZKgUBrTlehdi7PEIMT8k0bQixHUGXggPAlKnOQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.1.1.tgz", + "integrity": "sha512-9ZOncVSfr+sMXVxxca2OJOPagRwT0u/UHikM2Rd6L/aB+kL/QAuTnsv6MeXtjzCJYb8PzrXarypSGIPx3Jemxw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.1.0", - "@typescript-eslint/visitor-keys": "7.1.0", + "@typescript-eslint/types": "7.1.1", + "@typescript-eslint/visitor-keys": "7.1.1", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -1474,17 +1474,17 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.1.0.tgz", - "integrity": "sha512-WUFba6PZC5OCGEmbweGpnNJytJiLG7ZvDBJJoUcX4qZYf1mGZ97mO2Mps6O2efxJcJdRNpqweCistDbZMwIVHw==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.1.1.tgz", + "integrity": "sha512-thOXM89xA03xAE0lW7alstvnyoBUbBX38YtY+zAUcpRPcq9EIhXPuJ0YTv948MbzmKh6e1AUszn5cBFK49Umqg==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "7.1.0", - "@typescript-eslint/types": "7.1.0", - "@typescript-eslint/typescript-estree": "7.1.0", + "@typescript-eslint/scope-manager": "7.1.1", + "@typescript-eslint/types": "7.1.1", + "@typescript-eslint/typescript-estree": "7.1.1", "semver": "^7.5.4" }, "engines": { @@ -1499,12 +1499,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.1.0.tgz", - "integrity": "sha512-FhUqNWluiGNzlvnDZiXad4mZRhtghdoKW6e98GoEOYSu5cND+E39rG5KwJMUzeENwm1ztYBRqof8wMLP+wNPIA==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.1.1.tgz", + "integrity": "sha512-yTdHDQxY7cSoCcAtiBzVzxleJhkGB9NncSIyMYe2+OGON1ZsP9zOPws/Pqgopa65jvknOjlk/w7ulPlZ78PiLQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.1.0", + "@typescript-eslint/types": "7.1.1", "eslint-visitor-keys": "^3.4.1" }, "engines": { @@ -4384,9 +4384,9 @@ } }, "node_modules/typescript": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", - "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", + "version": "5.4.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.2.tgz", + "integrity": "sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -4472,9 +4472,9 @@ } }, "node_modules/vite": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.1.4.tgz", - "integrity": "sha512-n+MPqzq+d9nMVTKyewqw6kSt+R3CkvF9QAKY8obiQn8g1fwTscKxyfaYnC632HtBXAQGc1Yjomphwn1dtwGAHg==", + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.1.5.tgz", + "integrity": "sha512-BdN1xh0Of/oQafhU+FvopafUp6WaYenLU/NFoL5WyJL++GxkNfieKzBhM24H3HVsPQrlAqB7iJYTHabzaRed5Q==", "dev": true, "dependencies": { "esbuild": "^0.19.3", @@ -4748,9 +4748,9 @@ "dev": true }, "node_modules/yaml": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.0.tgz", - "integrity": "sha512-j9iR8g+/t0lArF4V6NE/QCfT+CO7iLqrXAHZbJdo+LfjqP1vR8Fg5bSiaq6Q2lOD1AUEVrEVIgABvBFYojJVYQ==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.1.tgz", + "integrity": "sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==", "dev": true, "bin": { "yaml": "bin.mjs" @@ -5487,9 +5487,9 @@ } }, "@types/node": { - "version": "20.11.24", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.24.tgz", - "integrity": "sha512-Kza43ewS3xoLgCEpQrsT+xRo/EJej1y0kVYGiLFE1NEODXGzTfwiC6tXTLMQskn1X4/Rjlh0MQUvx9W+L9long==", + "version": "20.11.25", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.25.tgz", + "integrity": "sha512-TBHyJxk2b7HceLVGFcpAUjsa5zIdsPWlR6XHfyGzd0SFu+/NFgQgMAl96MSDZgQDvJAvV6BKsFOrt6zIL09JDw==", "dev": true, "requires": { "undici-types": "~5.26.4" @@ -5508,16 +5508,16 @@ "dev": true }, "@typescript-eslint/eslint-plugin": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.1.0.tgz", - "integrity": "sha512-j6vT/kCulhG5wBmGtstKeiVr1rdXE4nk+DT1k6trYkwlrvW9eOF5ZbgKnd/YR6PcM4uTEXa0h6Fcvf6X7Dxl0w==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.1.1.tgz", + "integrity": "sha512-zioDz623d0RHNhvx0eesUmGfIjzrk18nSBC8xewepKXbBvN/7c1qImV7Hg8TI1URTxKax7/zxfxj3Uph8Chcuw==", "dev": true, "requires": { "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "7.1.0", - "@typescript-eslint/type-utils": "7.1.0", - "@typescript-eslint/utils": "7.1.0", - "@typescript-eslint/visitor-keys": "7.1.0", + "@typescript-eslint/scope-manager": "7.1.1", + "@typescript-eslint/type-utils": "7.1.1", + "@typescript-eslint/utils": "7.1.1", + "@typescript-eslint/visitor-keys": "7.1.1", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", @@ -5527,54 +5527,54 @@ } }, "@typescript-eslint/parser": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.1.0.tgz", - "integrity": "sha512-V1EknKUubZ1gWFjiOZhDSNToOjs63/9O0puCgGS8aDOgpZY326fzFu15QAUjwaXzRZjf/qdsdBrckYdv9YxB8w==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.1.1.tgz", + "integrity": "sha512-ZWUFyL0z04R1nAEgr9e79YtV5LbafdOtN7yapNbn1ansMyaegl2D4bL7vHoJ4HPSc4CaLwuCVas8CVuneKzplQ==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "7.1.0", - "@typescript-eslint/types": "7.1.0", - "@typescript-eslint/typescript-estree": "7.1.0", - "@typescript-eslint/visitor-keys": "7.1.0", + "@typescript-eslint/scope-manager": "7.1.1", + "@typescript-eslint/types": "7.1.1", + "@typescript-eslint/typescript-estree": "7.1.1", + "@typescript-eslint/visitor-keys": "7.1.1", "debug": "^4.3.4" } }, "@typescript-eslint/scope-manager": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.1.0.tgz", - "integrity": "sha512-6TmN4OJiohHfoOdGZ3huuLhpiUgOGTpgXNUPJgeZOZR3DnIpdSgtt83RS35OYNNXxM4TScVlpVKC9jyQSETR1A==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.1.1.tgz", + "integrity": "sha512-cirZpA8bJMRb4WZ+rO6+mnOJrGFDd38WoXCEI57+CYBqta8Yc8aJym2i7vyqLL1vVYljgw0X27axkUXz32T8TA==", "dev": true, "requires": { - "@typescript-eslint/types": "7.1.0", - "@typescript-eslint/visitor-keys": "7.1.0" + "@typescript-eslint/types": "7.1.1", + "@typescript-eslint/visitor-keys": "7.1.1" } }, "@typescript-eslint/type-utils": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.1.0.tgz", - "integrity": "sha512-UZIhv8G+5b5skkcuhgvxYWHjk7FW7/JP5lPASMEUoliAPwIH/rxoUSQPia2cuOj9AmDZmwUl1usKm85t5VUMew==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.1.1.tgz", + "integrity": "sha512-5r4RKze6XHEEhlZnJtR3GYeCh1IueUHdbrukV2KSlLXaTjuSfeVF8mZUVPLovidCuZfbVjfhi4c0DNSa/Rdg5g==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "7.1.0", - "@typescript-eslint/utils": "7.1.0", + "@typescript-eslint/typescript-estree": "7.1.1", + "@typescript-eslint/utils": "7.1.1", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" } }, "@typescript-eslint/types": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.1.0.tgz", - "integrity": "sha512-qTWjWieJ1tRJkxgZYXx6WUYtWlBc48YRxgY2JN1aGeVpkhmnopq+SUC8UEVGNXIvWH7XyuTjwALfG6bFEgCkQA==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.1.1.tgz", + "integrity": "sha512-KhewzrlRMrgeKm1U9bh2z5aoL4s7K3tK5DwHDn8MHv0yQfWFz/0ZR6trrIHHa5CsF83j/GgHqzdbzCXJ3crx0Q==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.1.0.tgz", - "integrity": "sha512-k7MyrbD6E463CBbSpcOnwa8oXRdHzH1WiVzOipK3L5KSML92ZKgUBrTlehdi7PEIMT8k0bQixHUGXggPAlKnOQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.1.1.tgz", + "integrity": "sha512-9ZOncVSfr+sMXVxxca2OJOPagRwT0u/UHikM2Rd6L/aB+kL/QAuTnsv6MeXtjzCJYb8PzrXarypSGIPx3Jemxw==", "dev": true, "requires": { - "@typescript-eslint/types": "7.1.0", - "@typescript-eslint/visitor-keys": "7.1.0", + "@typescript-eslint/types": "7.1.1", + "@typescript-eslint/visitor-keys": "7.1.1", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -5604,27 +5604,27 @@ } }, "@typescript-eslint/utils": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.1.0.tgz", - "integrity": "sha512-WUFba6PZC5OCGEmbweGpnNJytJiLG7ZvDBJJoUcX4qZYf1mGZ97mO2Mps6O2efxJcJdRNpqweCistDbZMwIVHw==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.1.1.tgz", + "integrity": "sha512-thOXM89xA03xAE0lW7alstvnyoBUbBX38YtY+zAUcpRPcq9EIhXPuJ0YTv948MbzmKh6e1AUszn5cBFK49Umqg==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "7.1.0", - "@typescript-eslint/types": "7.1.0", - "@typescript-eslint/typescript-estree": "7.1.0", + "@typescript-eslint/scope-manager": "7.1.1", + "@typescript-eslint/types": "7.1.1", + "@typescript-eslint/typescript-estree": "7.1.1", "semver": "^7.5.4" } }, "@typescript-eslint/visitor-keys": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.1.0.tgz", - "integrity": "sha512-FhUqNWluiGNzlvnDZiXad4mZRhtghdoKW6e98GoEOYSu5cND+E39rG5KwJMUzeENwm1ztYBRqof8wMLP+wNPIA==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.1.1.tgz", + "integrity": "sha512-yTdHDQxY7cSoCcAtiBzVzxleJhkGB9NncSIyMYe2+OGON1ZsP9zOPws/Pqgopa65jvknOjlk/w7ulPlZ78PiLQ==", "dev": true, "requires": { - "@typescript-eslint/types": "7.1.0", + "@typescript-eslint/types": "7.1.1", "eslint-visitor-keys": "^3.4.1" } }, @@ -7682,9 +7682,9 @@ "dev": true }, "typescript": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", - "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", + "version": "5.4.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.2.tgz", + "integrity": "sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==", "dev": true }, "ufo": { @@ -7740,9 +7740,9 @@ } }, "vite": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.1.4.tgz", - "integrity": "sha512-n+MPqzq+d9nMVTKyewqw6kSt+R3CkvF9QAKY8obiQn8g1fwTscKxyfaYnC632HtBXAQGc1Yjomphwn1dtwGAHg==", + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.1.5.tgz", + "integrity": "sha512-BdN1xh0Of/oQafhU+FvopafUp6WaYenLU/NFoL5WyJL++GxkNfieKzBhM24H3HVsPQrlAqB7iJYTHabzaRed5Q==", "dev": true, "requires": { "esbuild": "^0.19.3", @@ -7880,9 +7880,9 @@ "dev": true }, "yaml": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.0.tgz", - "integrity": "sha512-j9iR8g+/t0lArF4V6NE/QCfT+CO7iLqrXAHZbJdo+LfjqP1vR8Fg5bSiaq6Q2lOD1AUEVrEVIgABvBFYojJVYQ==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.1.tgz", + "integrity": "sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==", "dev": true }, "yocto-queue": { From 7aa75d5643e75f7e2bfd527cc59dc4e8af15637b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 11 Mar 2024 21:16:42 -0400 Subject: [PATCH 03/45] chore(deps): update dependency typescript to v5.4.2 (#7861) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- e2e/package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/e2e/package-lock.json b/e2e/package-lock.json index f3d06eacc..16a181ae1 100644 --- a/e2e/package-lock.json +++ b/e2e/package-lock.json @@ -4795,9 +4795,9 @@ } }, "node_modules/typescript": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", - "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", + "version": "5.4.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.2.tgz", + "integrity": "sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==", "dev": true, "bin": { "tsc": "bin/tsc", From 4023c665cc9a060a02db60f34371d5ddfea63d50 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 11 Mar 2024 21:17:09 -0400 Subject: [PATCH 04/45] chore(deps): update dependency @types/node to v20.11.25 (#7860) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- e2e/package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/e2e/package-lock.json b/e2e/package-lock.json index 16a181ae1..51f51a1c6 100644 --- a/e2e/package-lock.json +++ b/e2e/package-lock.json @@ -1155,9 +1155,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.11.24", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.24.tgz", - "integrity": "sha512-Kza43ewS3xoLgCEpQrsT+xRo/EJej1y0kVYGiLFE1NEODXGzTfwiC6tXTLMQskn1X4/Rjlh0MQUvx9W+L9long==", + "version": "20.11.25", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.25.tgz", + "integrity": "sha512-TBHyJxk2b7HceLVGFcpAUjsa5zIdsPWlR6XHfyGzd0SFu+/NFgQgMAl96MSDZgQDvJAvV6BKsFOrt6zIL09JDw==", "dev": true, "dependencies": { "undici-types": "~5.26.4" From b7e5407822ee0b61844e656298440e91d0c5bd01 Mon Sep 17 00:00:00 2001 From: Michel Heusschen <59014050+michelheusschen@users.noreply.github.com> Date: Tue, 12 Mar 2024 02:18:47 +0100 Subject: [PATCH 05/45] fix(web): small fixes for empty placeholder (#7859) --- .../empty-placeholder.svelte | 26 ++++++++----------- web/src/routes/(user)/albums/+page.svelte | 6 +---- web/src/routes/(user)/archive/+page.svelte | 6 +---- web/src/routes/(user)/favorites/+page.svelte | 6 +---- web/src/routes/(user)/photos/+page.svelte | 6 +---- web/src/routes/(user)/sharing/+page.svelte | 1 - web/src/routes/(user)/trash/+page.svelte | 7 +---- .../admin/library-management/+page.svelte | 3 +-- web/src/routes/admin/repair/+page.svelte | 7 +---- 9 files changed, 18 insertions(+), 50 deletions(-) diff --git a/web/src/lib/components/shared-components/empty-placeholder.svelte b/web/src/lib/components/shared-components/empty-placeholder.svelte index fc234aa4d..781f7821f 100644 --- a/web/src/lib/components/shared-components/empty-placeholder.svelte +++ b/web/src/lib/components/shared-components/empty-placeholder.svelte @@ -1,28 +1,24 @@ -
- -

{text}

-
+ +

{text}

+ diff --git a/web/src/routes/(user)/albums/+page.svelte b/web/src/routes/(user)/albums/+page.svelte index d14be267e..c8d591f91 100644 --- a/web/src/routes/(user)/albums/+page.svelte +++ b/web/src/routes/(user)/albums/+page.svelte @@ -375,11 +375,7 @@ {:else} - + {/if} diff --git a/web/src/routes/(user)/archive/+page.svelte b/web/src/routes/(user)/archive/+page.svelte index 227835354..93dc09a50 100644 --- a/web/src/routes/(user)/archive/+page.svelte +++ b/web/src/routes/(user)/archive/+page.svelte @@ -45,10 +45,6 @@ - + diff --git a/web/src/routes/(user)/favorites/+page.svelte b/web/src/routes/(user)/favorites/+page.svelte index 21b563a50..067859b69 100644 --- a/web/src/routes/(user)/favorites/+page.svelte +++ b/web/src/routes/(user)/favorites/+page.svelte @@ -50,10 +50,6 @@ - + diff --git a/web/src/routes/(user)/photos/+page.svelte b/web/src/routes/(user)/photos/+page.svelte index df2328aaa..9e80c71e0 100644 --- a/web/src/routes/(user)/photos/+page.svelte +++ b/web/src/routes/(user)/photos/+page.svelte @@ -88,10 +88,6 @@ {#if $user.memoriesEnabled} {/if} - openFileUploadDialog()} - slot="empty" - /> + openFileUploadDialog()} slot="empty" /> diff --git a/web/src/routes/(user)/sharing/+page.svelte b/web/src/routes/(user)/sharing/+page.svelte index b50cb5089..2d6e5b532 100644 --- a/web/src/routes/(user)/sharing/+page.svelte +++ b/web/src/routes/(user)/sharing/+page.svelte @@ -92,7 +92,6 @@ {#if data.sharedAlbums.length === 0} {/if} diff --git a/web/src/routes/(user)/trash/+page.svelte b/web/src/routes/(user)/trash/+page.svelte index 6ce6c5423..fd176b7a1 100644 --- a/web/src/routes/(user)/trash/+page.svelte +++ b/web/src/routes/(user)/trash/+page.svelte @@ -91,12 +91,7 @@

Trashed items will be permanently deleted after {$serverConfig.trashDays} days.

- + {/if} diff --git a/web/src/routes/admin/library-management/+page.svelte b/web/src/routes/admin/library-management/+page.svelte index ea681acc0..e6f4332ee 100644 --- a/web/src/routes/admin/library-management/+page.svelte +++ b/web/src/routes/admin/library-management/+page.svelte @@ -462,8 +462,7 @@ {:else} (toCreateLibrary = true)} - alt="Empty albums" + onClick={() => (toCreateLibrary = true)} /> {/if} diff --git a/web/src/routes/admin/repair/+page.svelte b/web/src/routes/admin/repair/+page.svelte index 939e151f5..fa0f66ec3 100644 --- a/web/src/routes/admin/repair/+page.svelte +++ b/web/src/routes/admin/repair/+page.svelte @@ -203,12 +203,7 @@
{#if matches.length + extras.length + orphans.length === 0}
- +
{:else}
From de28f83d0d3afdaec559abe5f320fc2154345951 Mon Sep 17 00:00:00 2001 From: martyfuhry Date: Mon, 11 Mar 2024 23:02:28 -0400 Subject: [PATCH 06/45] fix(mobile): Fixes immersive mode not ending for memory lane (#7767) Fixes immersive mode not ending for memory lane --- .../modules/memories/views/memory_page.dart | 222 +++++++++--------- 1 file changed, 109 insertions(+), 113 deletions(-) diff --git a/mobile/lib/modules/memories/views/memory_page.dart b/mobile/lib/modules/memories/views/memory_page.dart index d06bb959e..aa968303b 100644 --- a/mobile/lib/modules/memories/views/memory_page.dart +++ b/mobile/lib/modules/memories/views/memory_page.dart @@ -39,11 +39,13 @@ class MemoryPage extends HookConsumerWidget { /// The main vertically scrolling page controller with each list of memories final memoryPageController = usePageController(initialPage: memoryIndex); - // The Page Controller that scrolls horizontally with all of the assets useEffect(() { // Memories is an immersive activity SystemChrome.setEnabledSystemUIMode(SystemUiMode.immersive); - return null; + return () { + // Clean up to normal edge to edge when we are done + SystemChrome.setEnabledSystemUIMode(SystemUiMode.edgeToEdge); + }; }); toNextMemory() { @@ -159,127 +161,121 @@ class MemoryPage extends HookConsumerWidget { }, child: Scaffold( backgroundColor: bgColor, - body: PopScope( - onPopInvoked: (didPop) { - // Remove immersive mode and go back to normal mode - SystemChrome.setEnabledSystemUIMode(SystemUiMode.edgeToEdge); - }, - child: SafeArea( - child: PageView.builder( - physics: const BouncingScrollPhysics( - parent: AlwaysScrollableScrollPhysics(), - ), - scrollDirection: Axis.vertical, - controller: memoryPageController, - onPageChanged: (pageNumber) { - HapticFeedback.mediumImpact(); - if (pageNumber < memories.length) { - currentMemoryIndex.value = pageNumber; - currentMemory.value = memories[pageNumber]; - } + body: SafeArea( + child: PageView.builder( + physics: const BouncingScrollPhysics( + parent: AlwaysScrollableScrollPhysics(), + ), + scrollDirection: Axis.vertical, + controller: memoryPageController, + onPageChanged: (pageNumber) { + HapticFeedback.mediumImpact(); + if (pageNumber < memories.length) { + currentMemoryIndex.value = pageNumber; + currentMemory.value = memories[pageNumber]; + } - currentAssetPage.value = 0; + currentAssetPage.value = 0; - updateProgressText(); - }, - itemCount: memories.length + 1, - itemBuilder: (context, mIndex) { - // Build last page - if (mIndex == memories.length) { - return MemoryEpilogue( - onStartOver: () => memoryPageController.animateToPage( - 0, - duration: const Duration(seconds: 1), - curve: Curves.easeInOut, + updateProgressText(); + }, + itemCount: memories.length + 1, + itemBuilder: (context, mIndex) { + // Build last page + if (mIndex == memories.length) { + return MemoryEpilogue( + onStartOver: () => memoryPageController.animateToPage( + 0, + duration: const Duration(seconds: 1), + curve: Curves.easeInOut, + ), + ); + } + // Build horizontal page + final assetController = memoryAssetPageControllers[mIndex]; + return Column( + children: [ + Padding( + padding: const EdgeInsets.only( + left: 24.0, + right: 24.0, + top: 8.0, + bottom: 2.0, ), - ); - } - // Build horizontal page - final assetController = memoryAssetPageControllers[mIndex]; - return Column( - children: [ - Padding( - padding: const EdgeInsets.only( - left: 24.0, - right: 24.0, - top: 8.0, - bottom: 2.0, - ), - child: AnimatedBuilder( - animation: assetController, - builder: (context, child) { - double value = 0.0; - if (assetController.hasClients) { - // We can only access [page] if this has clients - value = assetController.page ?? 0; - } - return MemoryProgressIndicator( - ticks: memories[mIndex].assets.length, - value: (value + 1) / memories[mIndex].assets.length, - ); - }, - ), + child: AnimatedBuilder( + animation: assetController, + builder: (context, child) { + double value = 0.0; + if (assetController.hasClients) { + // We can only access [page] if this has clients + value = assetController.page ?? 0; + } + return MemoryProgressIndicator( + ticks: memories[mIndex].assets.length, + value: (value + 1) / memories[mIndex].assets.length, + ); + }, ), - Expanded( - child: Stack( - children: [ - PageView.builder( - physics: const BouncingScrollPhysics( - parent: AlwaysScrollableScrollPhysics(), - ), - controller: assetController, - onPageChanged: onAssetChanged, - scrollDirection: Axis.horizontal, - itemCount: memories[mIndex].assets.length, - itemBuilder: (context, index) { - final asset = memories[mIndex].assets[index]; - return GestureDetector( - behavior: HitTestBehavior.translucent, - onTap: () { - toNextAsset(index); - }, - child: Container( - color: Colors.black, - child: MemoryCard( - asset: asset, - title: memories[mIndex].title, - showTitle: index == 0, - ), + ), + Expanded( + child: Stack( + children: [ + PageView.builder( + physics: const BouncingScrollPhysics( + parent: AlwaysScrollableScrollPhysics(), + ), + controller: assetController, + onPageChanged: onAssetChanged, + scrollDirection: Axis.horizontal, + itemCount: memories[mIndex].assets.length, + itemBuilder: (context, index) { + final asset = memories[mIndex].assets[index]; + return GestureDetector( + behavior: HitTestBehavior.translucent, + onTap: () { + toNextAsset(index); + }, + child: Container( + color: Colors.black, + child: MemoryCard( + asset: asset, + title: memories[mIndex].title, + showTitle: index == 0, ), + ), + ); + }, + ), + Positioned( + top: 8, + left: 8, + child: MaterialButton( + minWidth: 0, + onPressed: () { + // auto_route doesn't invoke pop scope, so + // turn off full screen mode here + // https://github.com/Milad-Akarie/auto_route_library/issues/1799 + context.popRoute(); + SystemChrome.setEnabledSystemUIMode( + SystemUiMode.edgeToEdge, ); }, - ), - Positioned( - top: 8, - left: 8, - child: MaterialButton( - minWidth: 0, - onPressed: () { - // auto_route doesn't invoke pop scope, so - // turn off full screen mode here - // https://github.com/Milad-Akarie/auto_route_library/issues/1799 - context.popRoute(); - SystemChrome.setEnabledSystemUIMode( - SystemUiMode.edgeToEdge, - ); - }, - shape: const CircleBorder(), - color: Colors.white.withOpacity(0.2), - elevation: 0, - child: const Icon( - Icons.close_rounded, - color: Colors.white, - ), + shape: const CircleBorder(), + color: Colors.white.withOpacity(0.2), + elevation: 0, + child: const Icon( + Icons.close_rounded, + color: Colors.white, ), ), - ], - ), + ), + ], ), - MemoryBottomInfo(memory: memories[mIndex]), - ], - ); - }, - ), + ), + MemoryBottomInfo(memory: memories[mIndex]), + ], + ); + }, ), ), ), From a1130b3e27201141312af9eff43580342d45690e Mon Sep 17 00:00:00 2001 From: martyfuhry Date: Mon, 11 Mar 2024 23:04:52 -0400 Subject: [PATCH 07/45] fix(mobile): Fixes local thumbnail image provider key (#7766) * Fixes large and small image cache * Fixes local thumb provider key format * format --------- Co-authored-by: Alex Tran --- .../immich_local_thumbnail_provider.dart | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/mobile/lib/modules/asset_viewer/image_providers/immich_local_thumbnail_provider.dart b/mobile/lib/modules/asset_viewer/image_providers/immich_local_thumbnail_provider.dart index bb86cfafd..0c97ab01c 100644 --- a/mobile/lib/modules/asset_viewer/image_providers/immich_local_thumbnail_provider.dart +++ b/mobile/lib/modules/asset_viewer/image_providers/immich_local_thumbnail_provider.dart @@ -10,7 +10,8 @@ import 'package:photo_manager/photo_manager.dart'; /// The local image provider for an asset /// Only viable -class ImmichLocalThumbnailProvider extends ImageProvider { +class ImmichLocalThumbnailProvider + extends ImageProvider { final Asset asset; final int height; final int width; @@ -24,15 +25,20 @@ class ImmichLocalThumbnailProvider extends ImageProvider { /// Converts an [ImageProvider]'s settings plus an [ImageConfiguration] to a key /// that describes the precise image to load. @override - Future obtainKey(ImageConfiguration configuration) { - return SynchronousFuture(asset); + Future obtainKey( + ImageConfiguration configuration, + ) { + return SynchronousFuture(this); } @override - ImageStreamCompleter loadImage(Asset key, ImageDecoderCallback decode) { + ImageStreamCompleter loadImage( + ImmichLocalThumbnailProvider key, + ImageDecoderCallback decode, + ) { final chunkEvents = StreamController(); return MultiImageStreamCompleter( - codec: _codec(key, decode, chunkEvents), + codec: _codec(key.asset, decode, chunkEvents), scale: 1.0, chunkEvents: chunkEvents.stream, informationCollector: () sync* { From faab3aab0a3fc5fe6ad912157e68a17c69a07ae5 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 11 Mar 2024 23:21:29 -0400 Subject: [PATCH 08/45] fix(deps): update docs (#7870) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- docs/package-lock.json | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/docs/package-lock.json b/docs/package-lock.json index 9a55af7f5..9fbcc56a4 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -4264,9 +4264,9 @@ } }, "node_modules/autoprefixer": { - "version": "10.4.17", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.17.tgz", - "integrity": "sha512-/cpVNRLSfhOtcGflT13P2794gVSgmPgTR+erw5ifnMLZb0UnSlkK4tquLmkd3BhA+nLo5tX8Cu0upUsGKvKbmg==", + "version": "10.4.18", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.18.tgz", + "integrity": "sha512-1DKbDfsr6KUElM6wg+0zRNkB/Q7WcKYAaK+pzXn+Xqmszm/5Xa9coeNdtP88Vi+dPzZnMjhge8GIV49ZQkDa+g==", "funding": [ { "type": "opencollective", @@ -4282,8 +4282,8 @@ } ], "dependencies": { - "browserslist": "^4.22.2", - "caniuse-lite": "^1.0.30001578", + "browserslist": "^4.23.0", + "caniuse-lite": "^1.0.30001591", "fraction.js": "^4.3.7", "normalize-range": "^0.1.2", "picocolors": "^1.0.0", @@ -4565,9 +4565,9 @@ } }, "node_modules/browserslist": { - "version": "4.22.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz", - "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==", + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", + "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", "funding": [ { "type": "opencollective", @@ -4583,8 +4583,8 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001565", - "electron-to-chromium": "^1.4.601", + "caniuse-lite": "^1.0.30001587", + "electron-to-chromium": "^1.4.668", "node-releases": "^2.0.14", "update-browserslist-db": "^1.0.13" }, @@ -4728,9 +4728,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001580", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001580.tgz", - "integrity": "sha512-mtj5ur2FFPZcCEpXFy8ADXbDACuNFXg6mxVDqp7tqooX6l3zwm+d8EPoeOSIFRDvHs8qu7/SLFOGniULkcH2iA==", + "version": "1.0.30001597", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001597.tgz", + "integrity": "sha512-7LjJvmQU6Sj7bL0j5b5WY/3n7utXUJvAe1lxhsHDbLmwX9mdL86Yjtr+5SRCyf8qME4M7pU2hswj0FpyBVCv9w==", "funding": [ { "type": "opencollective", @@ -6348,9 +6348,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { - "version": "1.4.647", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.647.tgz", - "integrity": "sha512-Z/fTNGwc45WrYQhPaEcz5tAJuZZ8G7S/DBnhS6Kgp4BxnS40Z/HqlJ0hHg3Z79IGVzuVartIlTcjw/cQbPLgOw==" + "version": "1.4.701", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.701.tgz", + "integrity": "sha512-K3WPQ36bUOtXg/1+69bFlFOvdSm0/0bGqmsfPDLRXLanoKXdA+pIWuf/VbA9b+2CwBFuONgl4NEz4OEm+OJOKA==" }, "node_modules/emoji-regex": { "version": "9.2.2", @@ -16141,9 +16141,9 @@ } }, "node_modules/typescript": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", - "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", + "version": "5.4.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.2.tgz", + "integrity": "sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" From 4b6206b32df7d18089505078226ef4e122ad8a74 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 11 Mar 2024 23:22:55 -0400 Subject: [PATCH 09/45] chore(deps): update server (#7869) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- server/package-lock.json | 223 +++++++++++++++++++++------------------ 1 file changed, 121 insertions(+), 102 deletions(-) diff --git a/server/package-lock.json b/server/package-lock.json index 2468c0c97..f9c4eca26 100644 --- a/server/package-lock.json +++ b/server/package-lock.json @@ -2375,6 +2375,19 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/@nestjs/cli/node_modules/typescript": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", + "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, "node_modules/@nestjs/common": { "version": "10.3.3", "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-10.3.3.tgz", @@ -3183,9 +3196,9 @@ } }, "node_modules/@types/node": { - "version": "20.11.24", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.24.tgz", - "integrity": "sha512-Kza43ewS3xoLgCEpQrsT+xRo/EJej1y0kVYGiLFE1NEODXGzTfwiC6tXTLMQskn1X4/Rjlh0MQUvx9W+L9long==", + "version": "20.11.25", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.25.tgz", + "integrity": "sha512-TBHyJxk2b7HceLVGFcpAUjsa5zIdsPWlR6XHfyGzd0SFu+/NFgQgMAl96MSDZgQDvJAvV6BKsFOrt6zIL09JDw==", "dependencies": { "undici-types": "~5.26.4" } @@ -3402,16 +3415,16 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.1.0.tgz", - "integrity": "sha512-j6vT/kCulhG5wBmGtstKeiVr1rdXE4nk+DT1k6trYkwlrvW9eOF5ZbgKnd/YR6PcM4uTEXa0h6Fcvf6X7Dxl0w==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.1.1.tgz", + "integrity": "sha512-zioDz623d0RHNhvx0eesUmGfIjzrk18nSBC8xewepKXbBvN/7c1qImV7Hg8TI1URTxKax7/zxfxj3Uph8Chcuw==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "7.1.0", - "@typescript-eslint/type-utils": "7.1.0", - "@typescript-eslint/utils": "7.1.0", - "@typescript-eslint/visitor-keys": "7.1.0", + "@typescript-eslint/scope-manager": "7.1.1", + "@typescript-eslint/type-utils": "7.1.1", + "@typescript-eslint/utils": "7.1.1", + "@typescript-eslint/visitor-keys": "7.1.1", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", @@ -3437,15 +3450,15 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.1.0.tgz", - "integrity": "sha512-V1EknKUubZ1gWFjiOZhDSNToOjs63/9O0puCgGS8aDOgpZY326fzFu15QAUjwaXzRZjf/qdsdBrckYdv9YxB8w==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.1.1.tgz", + "integrity": "sha512-ZWUFyL0z04R1nAEgr9e79YtV5LbafdOtN7yapNbn1ansMyaegl2D4bL7vHoJ4HPSc4CaLwuCVas8CVuneKzplQ==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "7.1.0", - "@typescript-eslint/types": "7.1.0", - "@typescript-eslint/typescript-estree": "7.1.0", - "@typescript-eslint/visitor-keys": "7.1.0", + "@typescript-eslint/scope-manager": "7.1.1", + "@typescript-eslint/types": "7.1.1", + "@typescript-eslint/typescript-estree": "7.1.1", + "@typescript-eslint/visitor-keys": "7.1.1", "debug": "^4.3.4" }, "engines": { @@ -3465,13 +3478,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.1.0.tgz", - "integrity": "sha512-6TmN4OJiohHfoOdGZ3huuLhpiUgOGTpgXNUPJgeZOZR3DnIpdSgtt83RS35OYNNXxM4TScVlpVKC9jyQSETR1A==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.1.1.tgz", + "integrity": "sha512-cirZpA8bJMRb4WZ+rO6+mnOJrGFDd38WoXCEI57+CYBqta8Yc8aJym2i7vyqLL1vVYljgw0X27axkUXz32T8TA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.1.0", - "@typescript-eslint/visitor-keys": "7.1.0" + "@typescript-eslint/types": "7.1.1", + "@typescript-eslint/visitor-keys": "7.1.1" }, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -3482,13 +3495,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.1.0.tgz", - "integrity": "sha512-UZIhv8G+5b5skkcuhgvxYWHjk7FW7/JP5lPASMEUoliAPwIH/rxoUSQPia2cuOj9AmDZmwUl1usKm85t5VUMew==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.1.1.tgz", + "integrity": "sha512-5r4RKze6XHEEhlZnJtR3GYeCh1IueUHdbrukV2KSlLXaTjuSfeVF8mZUVPLovidCuZfbVjfhi4c0DNSa/Rdg5g==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "7.1.0", - "@typescript-eslint/utils": "7.1.0", + "@typescript-eslint/typescript-estree": "7.1.1", + "@typescript-eslint/utils": "7.1.1", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" }, @@ -3509,9 +3522,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.1.0.tgz", - "integrity": "sha512-qTWjWieJ1tRJkxgZYXx6WUYtWlBc48YRxgY2JN1aGeVpkhmnopq+SUC8UEVGNXIvWH7XyuTjwALfG6bFEgCkQA==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.1.1.tgz", + "integrity": "sha512-KhewzrlRMrgeKm1U9bh2z5aoL4s7K3tK5DwHDn8MHv0yQfWFz/0ZR6trrIHHa5CsF83j/GgHqzdbzCXJ3crx0Q==", "dev": true, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -3522,13 +3535,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.1.0.tgz", - "integrity": "sha512-k7MyrbD6E463CBbSpcOnwa8oXRdHzH1WiVzOipK3L5KSML92ZKgUBrTlehdi7PEIMT8k0bQixHUGXggPAlKnOQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.1.1.tgz", + "integrity": "sha512-9ZOncVSfr+sMXVxxca2OJOPagRwT0u/UHikM2Rd6L/aB+kL/QAuTnsv6MeXtjzCJYb8PzrXarypSGIPx3Jemxw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.1.0", - "@typescript-eslint/visitor-keys": "7.1.0", + "@typescript-eslint/types": "7.1.1", + "@typescript-eslint/visitor-keys": "7.1.1", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -3574,17 +3587,17 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.1.0.tgz", - "integrity": "sha512-WUFba6PZC5OCGEmbweGpnNJytJiLG7ZvDBJJoUcX4qZYf1mGZ97mO2Mps6O2efxJcJdRNpqweCistDbZMwIVHw==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.1.1.tgz", + "integrity": "sha512-thOXM89xA03xAE0lW7alstvnyoBUbBX38YtY+zAUcpRPcq9EIhXPuJ0YTv948MbzmKh6e1AUszn5cBFK49Umqg==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "7.1.0", - "@typescript-eslint/types": "7.1.0", - "@typescript-eslint/typescript-estree": "7.1.0", + "@typescript-eslint/scope-manager": "7.1.1", + "@typescript-eslint/types": "7.1.1", + "@typescript-eslint/typescript-estree": "7.1.1", "semver": "^7.5.4" }, "engines": { @@ -3599,12 +3612,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.1.0.tgz", - "integrity": "sha512-FhUqNWluiGNzlvnDZiXad4mZRhtghdoKW6e98GoEOYSu5cND+E39rG5KwJMUzeENwm1ztYBRqof8wMLP+wNPIA==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.1.1.tgz", + "integrity": "sha512-yTdHDQxY7cSoCcAtiBzVzxleJhkGB9NncSIyMYe2+OGON1ZsP9zOPws/Pqgopa65jvknOjlk/w7ulPlZ78PiLQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.1.0", + "@typescript-eslint/types": "7.1.1", "eslint-visitor-keys": "^3.4.1" }, "engines": { @@ -7165,9 +7178,9 @@ } }, "node_modules/i18n-iso-countries": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/i18n-iso-countries/-/i18n-iso-countries-7.10.0.tgz", - "integrity": "sha512-Y4wkIS2MzYk7cvaV665qcHpBUK4FaMcAhSfsggu9SPV9VpWvmH8NklofWvPPFWG1ZXmxqZ0Ubgr+ZtqddxG4ag==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/i18n-iso-countries/-/i18n-iso-countries-7.10.1.tgz", + "integrity": "sha512-9DXmAMkfGcGNE+E/2fE85UUjjkPeT0LHMA8d+kcxXiO+s50W28lxiICel8f8qWZmCNic1cuhN1+nw7ZazMQJFA==", "dependencies": { "diacritics": "1.3.0" }, @@ -12205,9 +12218,9 @@ } }, "node_modules/typescript": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", - "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", + "version": "5.4.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.2.tgz", + "integrity": "sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==", "devOptional": true, "bin": { "tsc": "bin/tsc", @@ -14299,6 +14312,12 @@ } } } + }, + "typescript": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", + "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", + "dev": true } } }, @@ -14929,9 +14948,9 @@ } }, "@types/node": { - "version": "20.11.24", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.24.tgz", - "integrity": "sha512-Kza43ewS3xoLgCEpQrsT+xRo/EJej1y0kVYGiLFE1NEODXGzTfwiC6tXTLMQskn1X4/Rjlh0MQUvx9W+L9long==", + "version": "20.11.25", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.25.tgz", + "integrity": "sha512-TBHyJxk2b7HceLVGFcpAUjsa5zIdsPWlR6XHfyGzd0SFu+/NFgQgMAl96MSDZgQDvJAvV6BKsFOrt6zIL09JDw==", "requires": { "undici-types": "~5.26.4" } @@ -15135,16 +15154,16 @@ "dev": true }, "@typescript-eslint/eslint-plugin": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.1.0.tgz", - "integrity": "sha512-j6vT/kCulhG5wBmGtstKeiVr1rdXE4nk+DT1k6trYkwlrvW9eOF5ZbgKnd/YR6PcM4uTEXa0h6Fcvf6X7Dxl0w==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.1.1.tgz", + "integrity": "sha512-zioDz623d0RHNhvx0eesUmGfIjzrk18nSBC8xewepKXbBvN/7c1qImV7Hg8TI1URTxKax7/zxfxj3Uph8Chcuw==", "dev": true, "requires": { "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "7.1.0", - "@typescript-eslint/type-utils": "7.1.0", - "@typescript-eslint/utils": "7.1.0", - "@typescript-eslint/visitor-keys": "7.1.0", + "@typescript-eslint/scope-manager": "7.1.1", + "@typescript-eslint/type-utils": "7.1.1", + "@typescript-eslint/utils": "7.1.1", + "@typescript-eslint/visitor-keys": "7.1.1", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", @@ -15154,54 +15173,54 @@ } }, "@typescript-eslint/parser": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.1.0.tgz", - "integrity": "sha512-V1EknKUubZ1gWFjiOZhDSNToOjs63/9O0puCgGS8aDOgpZY326fzFu15QAUjwaXzRZjf/qdsdBrckYdv9YxB8w==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.1.1.tgz", + "integrity": "sha512-ZWUFyL0z04R1nAEgr9e79YtV5LbafdOtN7yapNbn1ansMyaegl2D4bL7vHoJ4HPSc4CaLwuCVas8CVuneKzplQ==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "7.1.0", - "@typescript-eslint/types": "7.1.0", - "@typescript-eslint/typescript-estree": "7.1.0", - "@typescript-eslint/visitor-keys": "7.1.0", + "@typescript-eslint/scope-manager": "7.1.1", + "@typescript-eslint/types": "7.1.1", + "@typescript-eslint/typescript-estree": "7.1.1", + "@typescript-eslint/visitor-keys": "7.1.1", "debug": "^4.3.4" } }, "@typescript-eslint/scope-manager": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.1.0.tgz", - "integrity": "sha512-6TmN4OJiohHfoOdGZ3huuLhpiUgOGTpgXNUPJgeZOZR3DnIpdSgtt83RS35OYNNXxM4TScVlpVKC9jyQSETR1A==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.1.1.tgz", + "integrity": "sha512-cirZpA8bJMRb4WZ+rO6+mnOJrGFDd38WoXCEI57+CYBqta8Yc8aJym2i7vyqLL1vVYljgw0X27axkUXz32T8TA==", "dev": true, "requires": { - "@typescript-eslint/types": "7.1.0", - "@typescript-eslint/visitor-keys": "7.1.0" + "@typescript-eslint/types": "7.1.1", + "@typescript-eslint/visitor-keys": "7.1.1" } }, "@typescript-eslint/type-utils": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.1.0.tgz", - "integrity": "sha512-UZIhv8G+5b5skkcuhgvxYWHjk7FW7/JP5lPASMEUoliAPwIH/rxoUSQPia2cuOj9AmDZmwUl1usKm85t5VUMew==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.1.1.tgz", + "integrity": "sha512-5r4RKze6XHEEhlZnJtR3GYeCh1IueUHdbrukV2KSlLXaTjuSfeVF8mZUVPLovidCuZfbVjfhi4c0DNSa/Rdg5g==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "7.1.0", - "@typescript-eslint/utils": "7.1.0", + "@typescript-eslint/typescript-estree": "7.1.1", + "@typescript-eslint/utils": "7.1.1", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" } }, "@typescript-eslint/types": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.1.0.tgz", - "integrity": "sha512-qTWjWieJ1tRJkxgZYXx6WUYtWlBc48YRxgY2JN1aGeVpkhmnopq+SUC8UEVGNXIvWH7XyuTjwALfG6bFEgCkQA==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.1.1.tgz", + "integrity": "sha512-KhewzrlRMrgeKm1U9bh2z5aoL4s7K3tK5DwHDn8MHv0yQfWFz/0ZR6trrIHHa5CsF83j/GgHqzdbzCXJ3crx0Q==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.1.0.tgz", - "integrity": "sha512-k7MyrbD6E463CBbSpcOnwa8oXRdHzH1WiVzOipK3L5KSML92ZKgUBrTlehdi7PEIMT8k0bQixHUGXggPAlKnOQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.1.1.tgz", + "integrity": "sha512-9ZOncVSfr+sMXVxxca2OJOPagRwT0u/UHikM2Rd6L/aB+kL/QAuTnsv6MeXtjzCJYb8PzrXarypSGIPx3Jemxw==", "dev": true, "requires": { - "@typescript-eslint/types": "7.1.0", - "@typescript-eslint/visitor-keys": "7.1.0", + "@typescript-eslint/types": "7.1.1", + "@typescript-eslint/visitor-keys": "7.1.1", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -15231,27 +15250,27 @@ } }, "@typescript-eslint/utils": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.1.0.tgz", - "integrity": "sha512-WUFba6PZC5OCGEmbweGpnNJytJiLG7ZvDBJJoUcX4qZYf1mGZ97mO2Mps6O2efxJcJdRNpqweCistDbZMwIVHw==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.1.1.tgz", + "integrity": "sha512-thOXM89xA03xAE0lW7alstvnyoBUbBX38YtY+zAUcpRPcq9EIhXPuJ0YTv948MbzmKh6e1AUszn5cBFK49Umqg==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "7.1.0", - "@typescript-eslint/types": "7.1.0", - "@typescript-eslint/typescript-estree": "7.1.0", + "@typescript-eslint/scope-manager": "7.1.1", + "@typescript-eslint/types": "7.1.1", + "@typescript-eslint/typescript-estree": "7.1.1", "semver": "^7.5.4" } }, "@typescript-eslint/visitor-keys": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.1.0.tgz", - "integrity": "sha512-FhUqNWluiGNzlvnDZiXad4mZRhtghdoKW6e98GoEOYSu5cND+E39rG5KwJMUzeENwm1ztYBRqof8wMLP+wNPIA==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.1.1.tgz", + "integrity": "sha512-yTdHDQxY7cSoCcAtiBzVzxleJhkGB9NncSIyMYe2+OGON1ZsP9zOPws/Pqgopa65jvknOjlk/w7ulPlZ78PiLQ==", "dev": true, "requires": { - "@typescript-eslint/types": "7.1.0", + "@typescript-eslint/types": "7.1.1", "eslint-visitor-keys": "^3.4.1" } }, @@ -17917,9 +17936,9 @@ "dev": true }, "i18n-iso-countries": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/i18n-iso-countries/-/i18n-iso-countries-7.10.0.tgz", - "integrity": "sha512-Y4wkIS2MzYk7cvaV665qcHpBUK4FaMcAhSfsggu9SPV9VpWvmH8NklofWvPPFWG1ZXmxqZ0Ubgr+ZtqddxG4ag==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/i18n-iso-countries/-/i18n-iso-countries-7.10.1.tgz", + "integrity": "sha512-9DXmAMkfGcGNE+E/2fE85UUjjkPeT0LHMA8d+kcxXiO+s50W28lxiICel8f8qWZmCNic1cuhN1+nw7ZazMQJFA==", "requires": { "diacritics": "1.3.0" } @@ -21655,9 +21674,9 @@ } }, "typescript": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", - "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", + "version": "5.4.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.2.tgz", + "integrity": "sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==", "devOptional": true }, "ua-parser-js": { From 7b5ff397b30c304a0e6e040950e49ac19256c452 Mon Sep 17 00:00:00 2001 From: Nicholas Flamy <30300649+NicholasFlamy@users.noreply.github.com> Date: Mon, 11 Mar 2024 23:25:55 -0400 Subject: [PATCH 10/45] Fix trash permanent delete dialog (#7805) * Fix Outdated Info for Deletion * Undo Flutter Updating Dependencies --- mobile/assets/i18n/en-US.json | 8 ++++---- mobile/assets/i18n/ru-RU.json | 10 +++++----- mobile/lib/modules/trash/views/trash_page.dart | 1 + 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/mobile/assets/i18n/en-US.json b/mobile/assets/i18n/en-US.json index eda783891..200b46ccc 100644 --- a/mobile/assets/i18n/en-US.json +++ b/mobile/assets/i18n/en-US.json @@ -164,9 +164,9 @@ "daily_title_text_date": "E, MMM dd", "daily_title_text_date_year": "E, MMM dd, yyyy", "date_format": "E, LLL d, y • h:mm a", - "delete_dialog_alert": "These items will be permanently deleted from Immich and from your device", - "delete_dialog_alert_local": "These items will be permanently removed from your device but still be available on the Immich server", - "delete_dialog_alert_local_non_backed_up": "Some of the items aren't backed up to Immich and will be permanently removed from your device", + "delete_dialog_alert": "These items will be permanently deleted from the Immich server and from your device", + "delete_dialog_alert_local": "These items will be permanently deleted from your device but still be available on the Immich server", + "delete_dialog_alert_local_non_backed_up": "Some of the items aren't backed up to Immich and will be permanently deleted from your device", "delete_dialog_alert_remote": "These items will be permanently deleted from the Immich server", "delete_dialog_cancel": "Cancel", "delete_dialog_ok": "Delete", @@ -477,4 +477,4 @@ "viewer_remove_from_stack": "Remove from Stack", "viewer_stack_use_as_main_asset": "Use as Main Asset", "viewer_unstack": "Un-Stack" -} \ No newline at end of file +} diff --git a/mobile/assets/i18n/ru-RU.json b/mobile/assets/i18n/ru-RU.json index 23028f9ef..3a6ccd250 100644 --- a/mobile/assets/i18n/ru-RU.json +++ b/mobile/assets/i18n/ru-RU.json @@ -164,9 +164,9 @@ "daily_title_text_date": "E, MMM dd", "daily_title_text_date_year": "E, MMM dd, yyyy", "date_format": "E, LLL d, y • h:mm a", - "delete_dialog_alert": "Эти элементы будут безвозвратно удалены из приложения, а также с вашего устройства", - "delete_dialog_alert_local": "Эти объекты будут безвозвратно удалены с Вашего устройства, но по-прежнему будут доступны на сервере Immich", - "delete_dialog_alert_local_non_backed_up": "Резервные копии некоторых объектов не были загружены в Immich и будут безвозвратно удалены с Вашего устройства", + "delete_dialog_alert": "Эти объекты будут безвозвратно удалены с сервера Immich и вашего устройства.", + "delete_dialog_alert_local": "Эти объекты будут безвозвратно удалены с вашего устройства, но по-прежнему будут доступны на сервере Immich", + "delete_dialog_alert_local_non_backed_up": "Некоторые объекты не были скопированы на сервера Immich и будут безвозвратно удалены с вашего устройства", "delete_dialog_alert_remote": "Эти объекты будут безвозвратно удалены с сервера Immich", "delete_dialog_cancel": "Отменить", "delete_dialog_ok": "Удалить", @@ -457,7 +457,7 @@ "trash_page_empty_trash_btn": "Очистить корзину", "trash_page_empty_trash_dialog_content": "Вы хотите очистить свою корзину? Эти объекты будут навсегда удалены из Immich.", "trash_page_empty_trash_dialog_ok": "ОК", - "trash_page_info": "Удаленные элементы будут окончательно удалены через {} дней", + "trash_page_info": "Удаленные объекты будут окончательно удалены через {} дней", "trash_page_no_assets": "Удаленные объекты отсутсвуют", "trash_page_restore": "Восстановить", "trash_page_restore_all": "Восстановить все", @@ -477,4 +477,4 @@ "viewer_remove_from_stack": "Удалить из стека", "viewer_stack_use_as_main_asset": "Использовать в качестве основного объекта", "viewer_unstack": "Разобрать стек" -} \ No newline at end of file +} diff --git a/mobile/lib/modules/trash/views/trash_page.dart b/mobile/lib/modules/trash/views/trash_page.dart index d99cacc0b..1ec982560 100644 --- a/mobile/lib/modules/trash/views/trash_page.dart +++ b/mobile/lib/modules/trash/views/trash_page.dart @@ -93,6 +93,7 @@ class TrashPage extends HookConsumerWidget { await showDialog( context: context, builder: (context) => DeleteDialog( + alert: "delete_dialog_alert_remote", onDelete: () => onPermanentlyDelete(), ), ); From 4b4ebe4f80a462512bc3c98eb67900693ad623f9 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 11 Mar 2024 23:26:43 -0400 Subject: [PATCH 11/45] fix(deps): update machine-learning (#7871) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- machine-learning/poetry.lock | 42 ++++++++++++++++++------------------ 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/machine-learning/poetry.lock b/machine-learning/poetry.lock index ac5dfd2bf..955a64f8e 100644 --- a/machine-learning/poetry.lock +++ b/machine-learning/poetry.lock @@ -1274,13 +1274,13 @@ socks = ["socksio (==1.*)"] [[package]] name = "huggingface-hub" -version = "0.21.3" +version = "0.21.4" description = "Client library to download and publish models, datasets and other repos on the huggingface.co hub" optional = false python-versions = ">=3.8.0" files = [ - {file = "huggingface_hub-0.21.3-py3-none-any.whl", hash = "sha256:b183144336fdf2810a8c109822e0bb6ef1fd61c65da6fb60e8c3f658b7144016"}, - {file = "huggingface_hub-0.21.3.tar.gz", hash = "sha256:26a15b604e4fc7bad37c467b76456543ec849386cbca9cd7e1e135f53e500423"}, + {file = "huggingface_hub-0.21.4-py3-none-any.whl", hash = "sha256:df37c2c37fc6c82163cdd8a67ede261687d80d1e262526d6c0ce73b6b3630a7b"}, + {file = "huggingface_hub-0.21.4.tar.gz", hash = "sha256:e1f4968c93726565a80edf6dc309763c7b546d0cfe79aa221206034d50155531"}, ] [package.dependencies] @@ -2843,28 +2843,28 @@ files = [ [[package]] name = "ruff" -version = "0.3.0" +version = "0.3.2" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" files = [ - {file = "ruff-0.3.0-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:7deb528029bacf845bdbb3dbb2927d8ef9b4356a5e731b10eef171e3f0a85944"}, - {file = "ruff-0.3.0-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:e1e0d4381ca88fb2b73ea0766008e703f33f460295de658f5467f6f229658c19"}, - {file = "ruff-0.3.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f7dbba46e2827dfcb0f0cc55fba8e96ba7c8700e0a866eb8cef7d1d66c25dcb"}, - {file = "ruff-0.3.0-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:23dbb808e2f1d68eeadd5f655485e235c102ac6f12ad31505804edced2a5ae77"}, - {file = "ruff-0.3.0-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ef655c51f41d5fa879f98e40c90072b567c666a7114fa2d9fe004dffba00932"}, - {file = "ruff-0.3.0-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:d0d3d7ef3d4f06433d592e5f7d813314a34601e6c5be8481cccb7fa760aa243e"}, - {file = "ruff-0.3.0-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b08b356d06a792e49a12074b62222f9d4ea2a11dca9da9f68163b28c71bf1dd4"}, - {file = "ruff-0.3.0-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9343690f95710f8cf251bee1013bf43030072b9f8d012fbed6ad702ef70d360a"}, - {file = "ruff-0.3.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a1f3ed501a42f60f4dedb7805fa8d4534e78b4e196f536bac926f805f0743d49"}, - {file = "ruff-0.3.0-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:cc30a9053ff2f1ffb505a585797c23434d5f6c838bacfe206c0e6cf38c921a1e"}, - {file = "ruff-0.3.0-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:5da894a29ec018a8293d3d17c797e73b374773943e8369cfc50495573d396933"}, - {file = "ruff-0.3.0-py3-none-musllinux_1_2_i686.whl", hash = "sha256:755c22536d7f1889be25f2baf6fedd019d0c51d079e8417d4441159f3bcd30c2"}, - {file = "ruff-0.3.0-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:dd73fe7f4c28d317855da6a7bc4aa29a1500320818dd8f27df95f70a01b8171f"}, - {file = "ruff-0.3.0-py3-none-win32.whl", hash = "sha256:19eacceb4c9406f6c41af806418a26fdb23120dfe53583df76d1401c92b7c14b"}, - {file = "ruff-0.3.0-py3-none-win_amd64.whl", hash = "sha256:128265876c1d703e5f5e5a4543bd8be47c73a9ba223fd3989d4aa87dd06f312f"}, - {file = "ruff-0.3.0-py3-none-win_arm64.whl", hash = "sha256:e3a4a6d46aef0a84b74fcd201a4401ea9a6cd85614f6a9435f2d33dd8cefbf83"}, - {file = "ruff-0.3.0.tar.gz", hash = "sha256:0886184ba2618d815067cf43e005388967b67ab9c80df52b32ec1152ab49f53a"}, + {file = "ruff-0.3.2-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:77f2612752e25f730da7421ca5e3147b213dca4f9a0f7e0b534e9562c5441f01"}, + {file = "ruff-0.3.2-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:9966b964b2dd1107797be9ca7195002b874424d1d5472097701ae8f43eadef5d"}, + {file = "ruff-0.3.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b83d17ff166aa0659d1e1deaf9f2f14cbe387293a906de09bc4860717eb2e2da"}, + {file = "ruff-0.3.2-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bb875c6cc87b3703aeda85f01c9aebdce3d217aeaca3c2e52e38077383f7268a"}, + {file = "ruff-0.3.2-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:be75e468a6a86426430373d81c041b7605137a28f7014a72d2fc749e47f572aa"}, + {file = "ruff-0.3.2-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:967978ac2d4506255e2f52afe70dda023fc602b283e97685c8447d036863a302"}, + {file = "ruff-0.3.2-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1231eacd4510f73222940727ac927bc5d07667a86b0cbe822024dd00343e77e9"}, + {file = "ruff-0.3.2-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2c6d613b19e9a8021be2ee1d0e27710208d1603b56f47203d0abbde906929a9b"}, + {file = "ruff-0.3.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c8439338a6303585d27b66b4626cbde89bb3e50fa3cae86ce52c1db7449330a7"}, + {file = "ruff-0.3.2-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:de8b480d8379620cbb5ea466a9e53bb467d2fb07c7eca54a4aa8576483c35d36"}, + {file = "ruff-0.3.2-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:b74c3de9103bd35df2bb05d8b2899bf2dbe4efda6474ea9681280648ec4d237d"}, + {file = "ruff-0.3.2-py3-none-musllinux_1_2_i686.whl", hash = "sha256:f380be9fc15a99765c9cf316b40b9da1f6ad2ab9639e551703e581a5e6da6745"}, + {file = "ruff-0.3.2-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:0ac06a3759c3ab9ef86bbeca665d31ad3aa9a4b1c17684aadb7e61c10baa0df4"}, + {file = "ruff-0.3.2-py3-none-win32.whl", hash = "sha256:9bd640a8f7dd07a0b6901fcebccedadeb1a705a50350fb86b4003b805c81385a"}, + {file = "ruff-0.3.2-py3-none-win_amd64.whl", hash = "sha256:0c1bdd9920cab5707c26c8b3bf33a064a4ca7842d91a99ec0634fec68f9f4037"}, + {file = "ruff-0.3.2-py3-none-win_arm64.whl", hash = "sha256:5f65103b1d76e0d600cabd577b04179ff592064eaa451a70a81085930e907d0b"}, + {file = "ruff-0.3.2.tar.gz", hash = "sha256:fa78ec9418eb1ca3db392811df3376b46471ae93792a81af2d1cbb0e5dcb5142"}, ] [[package]] From e732cb68a7edf1a880dddf0ea63a80fb66abc5e1 Mon Sep 17 00:00:00 2001 From: Slavik Date: Mon, 11 Mar 2024 23:27:31 -0400 Subject: [PATCH 12/45] docs: backup-and-restore.md: fix broken link (#7806) backup-and-restore.md: fix broken link --- docs/docs/administration/backup-and-restore.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/administration/backup-and-restore.md b/docs/docs/administration/backup-and-restore.md index a37b1bd8a..6d7ee6f15 100644 --- a/docs/docs/administration/backup-and-restore.md +++ b/docs/docs/administration/backup-and-restore.md @@ -101,7 +101,7 @@ Some storage locations are impacted by the Storage Template. See below for more :::note -`UPLOAD_LOCATION/library` folder is not used by default on new machines running version 1.92.0. These are if the system administrator activated the storage template engine, for [more info](https://github.com/immich-app/immich/releases#:~:text=the%20partner%E2%80%99s%20assets.-,Hardening%20storage%20template,-We%20have%20further). +`UPLOAD_LOCATION/library` folder is not used by default on new machines running version 1.92.0. These are if the system administrator activated the storage template engine, for [more info](https://github.com/immich-app/immich/releases/tag/v1.92.0#:~:text=the%20partner%E2%80%99s%20assets.-,Hardening%20storage%20template). ::: **1. User-Specific Folders:** From d09980f6461067ff2fadc91467b8931aac801131 Mon Sep 17 00:00:00 2001 From: Mert <101130780+mertalev@users.noreply.github.com> Date: Mon, 11 Mar 2024 23:30:13 -0400 Subject: [PATCH 13/45] chore(cli): clarify use of concurrency option (#7840) * add * add e2e tests * add test with number --- cli/src/index.ts | 2 +- e2e/src/cli/specs/upload.e2e-spec.ts | 38 ++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/cli/src/index.ts b/cli/src/index.ts index 1aab0386a..e9485190a 100644 --- a/cli/src/index.ts +++ b/cli/src/index.ts @@ -44,7 +44,7 @@ program .default(false), ) .addOption( - new Option('-c, --concurrency', 'Number of assets to upload at the same time') + new Option('-c, --concurrency ', 'Number of assets to upload at the same time') .env('IMMICH_UPLOAD_CONCURRENCY') .default(4), ) diff --git a/e2e/src/cli/specs/upload.e2e-spec.ts b/e2e/src/cli/specs/upload.e2e-spec.ts index 27362ef23..bc4382f98 100644 --- a/e2e/src/cli/specs/upload.e2e-spec.ts +++ b/e2e/src/cli/specs/upload.e2e-spec.ts @@ -142,4 +142,42 @@ describe(`immich upload`, () => { expect(assets.length).toBe(9); }); }); + + describe('immich upload --concurrency ', () => { + it('should work', async () => { + const { stderr, stdout, exitCode } = await immichCli([ + 'upload', + `${testAssetDir}/albums/nature/`, + '--concurrency', + '2', + ]); + + expect(stderr).toBe(''); + expect(stdout.split('\n')).toEqual( + expect.arrayContaining([expect.stringContaining('Successfully uploaded 9 assets')]), + ); + expect(exitCode).toBe(0); + + const assets = await getAllAssets({}, { headers: asKeyAuth(key) }); + expect(assets.length).toBe(9); + }); + + it('should reject string argument', async () => { + const { stderr, exitCode } = await immichCli([ + 'upload', + `${testAssetDir}/albums/nature/`, + '--concurrency string', + ]); + + expect(stderr).toContain('unknown option'); + expect(exitCode).not.toBe(0); + }); + + it('should reject command without number', async () => { + const { stderr, exitCode } = await immichCli(['upload', `${testAssetDir}/albums/nature/`, '--concurrency']); + + expect(stderr).toContain('argument missing'); + expect(exitCode).not.toBe(0); + }); + }); }); From bbed14a9ff3467032fcbfd231761890532db54de Mon Sep 17 00:00:00 2001 From: Dhrumil Shah Date: Mon, 11 Mar 2024 23:32:00 -0400 Subject: [PATCH 14/45] feat(server): Add OAuth auto-redirect enable/disable CLI commands (#7841) * Rebase * format fix * docs format * Change to enable/disable oauth master * spell change for oauth * Fix filename --- docs/docs/administration/server-commands.md | 18 +++++++++- server/src/immich-admin/app.module.ts | 3 ++ .../src/immich-admin/commands/oauth-login.ts | 36 +++++++++++++++++++ 3 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 server/src/immich-admin/commands/oauth-login.ts diff --git a/docs/docs/administration/server-commands.md b/docs/docs/administration/server-commands.md index fc235f5a5..2594da44b 100644 --- a/docs/docs/administration/server-commands.md +++ b/docs/docs/administration/server-commands.md @@ -8,6 +8,8 @@ The `immich-server` docker image comes preinstalled with an administrative CLI ( | `reset-admin-password` | Reset the password for the admin user | | `disable-password-login` | Disable password login | | `enable-password-login` | Enable password login | +| `enable-oauth-login` | Enable OAuth login | +| `disable-oauth-login` | Disable OAuth login | | `list-users` | List Immich users | ## How to run a command @@ -36,13 +38,27 @@ immich-admin disable-password-login Password login has been disabled. ``` -Enabled Password Login +Enable Password Login ``` immich-admin enable-password-login Password login has been enabled. ``` +Enable OAuth login + +``` +immich-admin enable-oauth-login +OAuth login has been enabled. +``` + +Disable OAuth login + +``` +immich-admin disable-oauth-login +OAuth login has been disabled. +``` + List Users ``` diff --git a/server/src/immich-admin/app.module.ts b/server/src/immich-admin/app.module.ts index 293e43c09..b350aec83 100644 --- a/server/src/immich-admin/app.module.ts +++ b/server/src/immich-admin/app.module.ts @@ -2,6 +2,7 @@ import { DomainModule } from '@app/domain'; import { InfraModule } from '@app/infra'; import { Module } from '@nestjs/common'; import { ListUsersCommand } from './commands/list-users.command'; +import { DisableOAuthLogin, EnableOAuthLogin } from './commands/oauth-login'; import { DisablePasswordLoginCommand, EnablePasswordLoginCommand } from './commands/password-login'; import { PromptPasswordQuestions, ResetAdminPasswordCommand } from './commands/reset-admin-password.command'; @@ -12,6 +13,8 @@ import { PromptPasswordQuestions, ResetAdminPasswordCommand } from './commands/r PromptPasswordQuestions, EnablePasswordLoginCommand, DisablePasswordLoginCommand, + EnableOAuthLogin, + DisableOAuthLogin, ListUsersCommand, ], }) diff --git a/server/src/immich-admin/commands/oauth-login.ts b/server/src/immich-admin/commands/oauth-login.ts new file mode 100644 index 000000000..23747bf03 --- /dev/null +++ b/server/src/immich-admin/commands/oauth-login.ts @@ -0,0 +1,36 @@ +import { SystemConfigService } from '@app/domain'; +import { Command, CommandRunner } from 'nest-commander'; + +@Command({ + name: 'enable-oauth-login', + description: 'Enable OAuth login', +}) +export class EnableOAuthLogin extends CommandRunner { + constructor(private configService: SystemConfigService) { + super(); + } + + async run(): Promise { + const config = await this.configService.getConfig(); + config.oauth.enabled = true; + await this.configService.updateConfig(config); + console.log('OAuth login has been enabled.'); + } +} + +@Command({ + name: 'disable-oauth-login', + description: 'Disable OAuth login', +}) +export class DisableOAuthLogin extends CommandRunner { + constructor(private configService: SystemConfigService) { + super(); + } + + async run(): Promise { + const config = await this.configService.getConfig(); + config.oauth.enabled = false; + await this.configService.updateConfig(config); + console.log('OAuth login has been disabled.'); + } +} From a94e45260ef51de473673b37804c806c7b30680d Mon Sep 17 00:00:00 2001 From: DeclanE <160616898+declan8010@users.noreply.github.com> Date: Tue, 12 Mar 2024 03:36:34 +0000 Subject: [PATCH 15/45] fix: Hide play bar when there's only one image in memory (#7764) * fix: Hide play bar when there's only one image in memory This commit introduces a fixto hide the play bar at the top of the memory viewer when there's only one image in the memory. Previously, the play bar was displayed regardless of the number of images, leading to unnecessary UI elements for single-image memories. * Update web/src/lib/components/memory-page/memory-viewer.svelte Co-authored-by: Michel Heusschen <59014050+michelheusschen@users.noreply.github.com> --------- Co-authored-by: Michel Heusschen <59014050+michelheusschen@users.noreply.github.com> Co-authored-by: Alex Tran --- web/src/lib/components/memory-page/memory-viewer.svelte | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/web/src/lib/components/memory-page/memory-viewer.svelte b/web/src/lib/components/memory-page/memory-viewer.svelte index 7b6bd4aae..0ed583878 100644 --- a/web/src/lib/components/memory-page/memory-viewer.svelte +++ b/web/src/lib/components/memory-page/memory-viewer.svelte @@ -112,7 +112,7 @@

- {#if !galleryInView} + {#if canGoForward}
(paused = !paused)} /> @@ -268,7 +268,7 @@
- +
Date: Mon, 11 Mar 2024 23:46:42 -0400 Subject: [PATCH 16/45] docs: config-file.md update config to current (v1.98) state (#7808) * docs: config-file.md update config to current (v1.98) state * fix format --------- Co-authored-by: Alex Tran --- docs/docs/install/config-file.md | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/docs/docs/install/config-file.md b/docs/docs/install/config-file.md index 0d7c8dafc..78f2663b5 100644 --- a/docs/docs/install/config-file.md +++ b/docs/docs/install/config-file.md @@ -14,7 +14,9 @@ The default configuration looks like this: "threads": 0, "preset": "ultrafast", "targetVideoCodec": "h264", + "acceptedVideoCodecs": ["h264"], "targetAudioCodec": "aac", + "acceptedAudioCodecs": ["aac", "mp3", "libopus"], "targetResolution": "720", "maxBitrate": "0", "bframes": -1, @@ -24,6 +26,7 @@ The default configuration looks like this: "temporalAQ": false, "cqMode": "auto", "twoPass": false, + "preferredHwDevice": "auto", "transcode": "required", "tonemap": "hable", "accel": "disabled" @@ -38,7 +41,7 @@ The default configuration looks like this: "metadataExtraction": { "concurrency": 5 }, - "recognizeFaces": { + "faceDetection": { "concurrency": 2 }, "search": { @@ -50,9 +53,6 @@ The default configuration looks like this: "library": { "concurrency": 5 }, - "storageTemplateMigration": { - "concurrency": 5 - }, "migration": { "concurrency": 5 }, @@ -110,6 +110,8 @@ The default configuration looks like this: "enabled": true }, "storageTemplate": { + "enabled": false, + "hashVerificationEnabled": true, "template": "{{y}}/{{y}}-{{MM}}-{{dd}}/{{filename}}" }, "thumbnail": { @@ -141,6 +143,13 @@ The default configuration looks like this: "usePolling": false, "interval": 10000 } + }, + "server": { + "externalDomain": "", + "loginPageMessage": "" + }, + "user": { + "deleteDelay": 7 } } ``` From a097e903c950bd28316b78be3929977aaebab9d7 Mon Sep 17 00:00:00 2001 From: Mert <101130780+mertalev@users.noreply.github.com> Date: Tue, 12 Mar 2024 01:19:12 -0400 Subject: [PATCH 17/45] feat(server): OpenTelemetry integration (#7356) * wip * span class decorator fix typing * improvements * noisy postgres logs formatting * add source * strict string comparison Co-authored-by: Daniel Dietzler <36593685+danieldietzler@users.noreply.github.com> * remove debug code * execution time histogram * remove prometheus stuff remove prometheus data * disable by default disable nestjs-otel stuff by default update imports * re-add postgres instrumentation formatting formatting * refactor: execution time histogram * decorator alias * formatting * keep original method order in filesystem repo * linting * enable otel sdk in e2e * actually enable otel sdk in e2e * share exclude paths * formatting * fix rebase * more buckets * add example setup * add envs fix actual fix * linting * update comments * update docker env * use more specific env --------- Co-authored-by: Daniel Dietzler <36593685+danieldietzler@users.noreply.github.com> Co-authored-by: Jason Rasmussen --- docker/docker-compose.dev.yml | 23 + docker/docker-compose.prod.yml | 23 + docker/prometheus.yml | 12 + e2e/docker-compose.yml | 1 + server/e2e/docker-compose.server-e2e.yml | 1 + server/package-lock.json | 3008 ++++++++++++++++- server/package.json | 4 + server/src/domain/domain.config.ts | 15 +- server/src/immich/main.ts | 5 +- server/src/infra/infra.config.ts | 2 + server/src/infra/infra.module.ts | 3 + server/src/infra/infra.utils.ts | 21 + server/src/infra/instrumentation.ts | 106 + .../infra/repositories/access.repository.ts | 2 + .../infra/repositories/activity.repository.ts | 2 + .../infra/repositories/album.repository.ts | 2 + .../infra/repositories/api-key.repository.ts | 2 + .../repositories/asset-stack.repository.ts | 2 + .../infra/repositories/asset.repository.ts | 2 + .../infra/repositories/audit.repository.ts | 2 + .../repositories/communication.repository.ts | 2 + .../infra/repositories/crypto.repository.ts | 20 +- .../infra/repositories/database.repository.ts | 2 + .../infra/repositories/filesystem.provider.ts | 28 +- .../src/infra/repositories/job.repository.ts | 2 + .../infra/repositories/library.repository.ts | 2 + .../machine-learning.repository.ts | 4 +- .../infra/repositories/media.repository.ts | 28 +- .../infra/repositories/metadata.repository.ts | 2 + .../src/infra/repositories/move.repository.ts | 2 + .../infra/repositories/partner.repository.ts | 2 + .../infra/repositories/person.repository.ts | 2 + .../infra/repositories/search.repository.ts | 2 + .../repositories/server-info.repository.ts | 2 + .../repositories/shared-link.repository.ts | 2 + .../repositories/system-config.repository.ts | 3 + .../system-metadata.repository.ts | 3 + .../src/infra/repositories/tag.repository.ts | 2 + .../repositories/user-token.repository.ts | 2 + .../src/infra/repositories/user.repository.ts | 2 + server/src/microservices/app.service.ts | 2 + server/src/microservices/main.ts | 3 +- 42 files changed, 3268 insertions(+), 89 deletions(-) create mode 100644 docker/prometheus.yml create mode 100644 server/src/infra/instrumentation.ts diff --git a/docker/docker-compose.dev.yml b/docker/docker-compose.dev.yml index d344329a5..2541a1a20 100644 --- a/docker/docker-compose.dev.yml +++ b/docker/docker-compose.dev.yml @@ -114,6 +114,29 @@ services: - ${UPLOAD_LOCATION}/postgres:/var/lib/postgresql/data ports: - 5432:5432 + + # set IMMICH_METRICS=true in .env to enable metrics + # immich-prometheus: + # container_name: immich_prometheus + # ports: + # - 9090:9090 + # image: prom/prometheus + # volumes: + # - ./prometheus.yml:/etc/prometheus/prometheus.yml + # - prometheus-data:/prometheus + + # first login uses admin/admin + # add data source for http://immich-prometheus:9090 to get started + # immich-grafana: + # container_name: immich_grafana + # command: ['./run.sh', '-disable-reporting'] + # ports: + # - 3000:3000 + # image: grafana/grafana:10.3.3-ubuntu + # volumes: + # - grafana-data:/var/lib/grafana volumes: model-cache: + prometheus-data: + grafana-data: diff --git a/docker/docker-compose.prod.yml b/docker/docker-compose.prod.yml index b0a19274d..7cd2e6a0e 100644 --- a/docker/docker-compose.prod.yml +++ b/docker/docker-compose.prod.yml @@ -73,5 +73,28 @@ services: ports: - 5432:5432 + # set IMMICH_METRICS=true in .env to enable metrics + immich-prometheus: + container_name: immich_prometheus + ports: + - 9090:9090 + image: prom/prometheus + volumes: + - ./prometheus.yml:/etc/prometheus/prometheus.yml + - prometheus-data:/prometheus + + # first login uses admin/admin + # add data source for http://immich-prometheus:9090 to get started + immich-grafana: + container_name: immich_grafana + command: ['./run.sh', '-disable-reporting'] + ports: + - 3000:3000 + image: grafana/grafana:10.3.3-ubuntu + volumes: + - grafana-data:/var/lib/grafana + volumes: model-cache: + prometheus-data: + grafana-data: diff --git a/docker/prometheus.yml b/docker/prometheus.yml new file mode 100644 index 000000000..e25bb7db6 --- /dev/null +++ b/docker/prometheus.yml @@ -0,0 +1,12 @@ +global: + scrape_interval: 15s + evaluation_interval: 15s + +scrape_configs: + - job_name: immich_server + static_configs: + - targets: ['immich-server:8081'] + + - job_name: immich_microservices + static_configs: + - targets: ['immich-microservices:8081'] diff --git a/e2e/docker-compose.yml b/e2e/docker-compose.yml index 6e2d4b78d..7cda6a12c 100644 --- a/e2e/docker-compose.yml +++ b/e2e/docker-compose.yml @@ -14,6 +14,7 @@ x-server-build: &server-common - DB_DATABASE_NAME=immich - REDIS_HOSTNAME=redis - IMMICH_MACHINE_LEARNING_ENABLED=false + - IMMICH_METRICS=true volumes: - upload:/usr/src/app/upload - ../server/test/assets:/data/assets diff --git a/server/e2e/docker-compose.server-e2e.yml b/server/e2e/docker-compose.server-e2e.yml index 09db7ecf3..61b38e1ee 100644 --- a/server/e2e/docker-compose.server-e2e.yml +++ b/server/e2e/docker-compose.server-e2e.yml @@ -18,6 +18,7 @@ services: - DB_USERNAME=postgres - DB_PASSWORD=postgres - DB_DATABASE_NAME=e2e_test + - IMMICH_METRICS=true depends_on: - database diff --git a/server/package-lock.json b/server/package-lock.json index f9c4eca26..a7e9125d7 100644 --- a/server/package-lock.json +++ b/server/package-lock.json @@ -21,6 +21,9 @@ "@nestjs/swagger": "^7.1.8", "@nestjs/typeorm": "^10.0.0", "@nestjs/websockets": "^10.2.2", + "@opentelemetry/auto-instrumentations-node": "^0.41.1", + "@opentelemetry/exporter-prometheus": "^0.48.0", + "@opentelemetry/sdk-node": "^0.48.0", "@socket.io/postgres-adapter": "^0.3.1", "@types/picomatch": "^2.3.3", "archiver": "^7.0.0", @@ -44,6 +47,7 @@ "lodash": "^4.17.21", "luxon": "^3.4.2", "nest-commander": "^3.11.1", + "nestjs-otel": "^5.1.5", "node-addon-api": "^7.0.0", "openid-client": "^5.4.3", "pg": "^8.11.3", @@ -1089,11 +1093,148 @@ "@nestjs/core": "^10.x" } }, + "node_modules/@grpc/grpc-js": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.10.1.tgz", + "integrity": "sha512-55ONqFytZExfOIjF1RjXPcVmT/jJqFzbbDqxK9jmRV4nxiYWtL9hENSW1Jfx0SdZfrvoqd44YJ/GJTqfRrawSQ==", + "dependencies": { + "@grpc/proto-loader": "^0.7.8", + "@types/node": ">=12.12.47" + }, + "engines": { + "node": "^8.13.0 || >=10.10.0" + } + }, + "node_modules/@grpc/proto-loader": { + "version": "0.7.10", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.10.tgz", + "integrity": "sha512-CAqDfoaQ8ykFd9zqBDn4k6iWT9loLAlc2ETmDFS9JCD70gDcnA4L3AFEo2iV7KyAtAAHFW9ftq1Fz+Vsgq80RQ==", + "dependencies": { + "lodash.camelcase": "^4.3.0", + "long": "^5.0.0", + "protobufjs": "^7.2.4", + "yargs": "^17.7.2" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@grpc/proto-loader/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@grpc/proto-loader/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@grpc/proto-loader/node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@hapi/b64": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@hapi/b64/-/b64-5.0.0.tgz", + "integrity": "sha512-ngu0tSEmrezoiIaNGG6rRvKOUkUuDdf4XTPnONHGYfSGRmDqPZX5oJL6HAdKTo1UQHECbdB4OzhWrfgVppjHUw==", + "dependencies": { + "@hapi/hoek": "9.x.x" + } + }, + "node_modules/@hapi/boom": { + "version": "9.1.4", + "resolved": "https://registry.npmjs.org/@hapi/boom/-/boom-9.1.4.tgz", + "integrity": "sha512-Ls1oH8jaN1vNsqcaHVYJrKmgMcKsC1wcp8bujvXrHaAqD2iDYq3HoOwsxwo09Cuda5R5nC0o0IxlrlTuvPuzSw==", + "dependencies": { + "@hapi/hoek": "9.x.x" + } + }, + "node_modules/@hapi/bourne": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-2.1.0.tgz", + "integrity": "sha512-i1BpaNDVLJdRBEKeJWkVO6tYX6DMFBuwMhSuWqLsY4ufeTKGVuV5rBsUhxPayXqnnWHgXUAmWK16H/ykO5Wj4Q==" + }, + "node_modules/@hapi/cryptiles": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@hapi/cryptiles/-/cryptiles-5.1.0.tgz", + "integrity": "sha512-fo9+d1Ba5/FIoMySfMqPBR/7Pa29J2RsiPrl7bkwo5W5o+AN1dAYQRi4SPrPwwVxVGKjgLOEWrsvt1BonJSfLA==", + "dependencies": { + "@hapi/boom": "9.x.x" + }, + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/@hapi/hoek": { "version": "9.3.0", "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==" }, + "node_modules/@hapi/iron": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@hapi/iron/-/iron-6.0.0.tgz", + "integrity": "sha512-zvGvWDufiTGpTJPG1Y/McN8UqWBu0k/xs/7l++HVU535NLHXsHhy54cfEMdW7EjwKfbBfM9Xy25FmTiobb7Hvw==", + "dependencies": { + "@hapi/b64": "5.x.x", + "@hapi/boom": "9.x.x", + "@hapi/bourne": "2.x.x", + "@hapi/cryptiles": "5.x.x", + "@hapi/hoek": "9.x.x" + } + }, + "node_modules/@hapi/podium": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@hapi/podium/-/podium-4.1.3.tgz", + "integrity": "sha512-ljsKGQzLkFqnQxE7qeanvgGj4dejnciErYd30dbrYzUOF/FyS/DOF97qcrT3bhoVwCYmxa6PEMhxfCPlnUcD2g==", + "dependencies": { + "@hapi/hoek": "9.x.x", + "@hapi/teamwork": "5.x.x", + "@hapi/validate": "1.x.x" + } + }, + "node_modules/@hapi/teamwork": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@hapi/teamwork/-/teamwork-5.1.1.tgz", + "integrity": "sha512-1oPx9AE5TIv+V6Ih54RP9lTZBso3rP8j4Xhb6iSVwPXtAM+sDopl5TFMv5Paw73UnpZJ9gjcrTE1BXrWt9eQrg==", + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/@hapi/topo": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", @@ -1102,6 +1243,15 @@ "@hapi/hoek": "^9.0.0" } }, + "node_modules/@hapi/validate": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@hapi/validate/-/validate-1.1.3.tgz", + "integrity": "sha512-/XMR0N0wjw0Twzq2pQOzPBZlDzkekGcoCtzO314BpIEsbXdYGthQUbxgkGDf4nhk1+IPDAsXqWjMohRQYO06UA==", + "dependencies": { + "@hapi/hoek": "^9.0.0", + "@hapi/topo": "^5.0.0" + } + }, "node_modules/@humanwhocodes/config-array": { "version": "0.11.14", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", @@ -2716,6 +2866,1143 @@ "npm": ">=5.0.0" } }, + "node_modules/@opentelemetry/api": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.7.0.tgz", + "integrity": "sha512-AdY5wvN0P2vXBi3b29hxZgSFvdhdxPB9+f0B6s//P9Q8nibRWeA3cHm8UmLpio9ABigkVHJ5NMPk+Mz8VCCyrw==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@opentelemetry/api-logs": { + "version": "0.48.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.48.0.tgz", + "integrity": "sha512-1/aMiU4Eqo3Zzpfwu51uXssp5pzvHFObk8S9pKAiXb1ne8pvg1qxBQitYL1XUiAMEXFzgjaidYG2V6624DRhhw==", + "dependencies": { + "@opentelemetry/api": "^1.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/auto-instrumentations-node": { + "version": "0.41.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/auto-instrumentations-node/-/auto-instrumentations-node-0.41.1.tgz", + "integrity": "sha512-gQG0mHlPVBQveuemqNYkrL4IB3T6v2e5sMiDI6FQzFWeLzzFrC04R4fY6AE1YmkhOyteCDpHL/U6CULP2mkt8w==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/instrumentation-amqplib": "^0.34.0", + "@opentelemetry/instrumentation-aws-lambda": "^0.38.0", + "@opentelemetry/instrumentation-aws-sdk": "^0.38.1", + "@opentelemetry/instrumentation-bunyan": "^0.35.0", + "@opentelemetry/instrumentation-cassandra-driver": "^0.35.0", + "@opentelemetry/instrumentation-connect": "^0.33.0", + "@opentelemetry/instrumentation-cucumber": "^0.3.0", + "@opentelemetry/instrumentation-dataloader": "^0.6.0", + "@opentelemetry/instrumentation-dns": "^0.33.0", + "@opentelemetry/instrumentation-express": "^0.35.0", + "@opentelemetry/instrumentation-fastify": "^0.33.0", + "@opentelemetry/instrumentation-fs": "^0.9.0", + "@opentelemetry/instrumentation-generic-pool": "^0.33.0", + "@opentelemetry/instrumentation-graphql": "^0.37.0", + "@opentelemetry/instrumentation-grpc": "^0.48.0", + "@opentelemetry/instrumentation-hapi": "^0.34.0", + "@opentelemetry/instrumentation-http": "^0.48.0", + "@opentelemetry/instrumentation-ioredis": "^0.37.0", + "@opentelemetry/instrumentation-knex": "^0.33.0", + "@opentelemetry/instrumentation-koa": "^0.37.0", + "@opentelemetry/instrumentation-lru-memoizer": "^0.34.0", + "@opentelemetry/instrumentation-memcached": "^0.33.0", + "@opentelemetry/instrumentation-mongodb": "^0.39.0", + "@opentelemetry/instrumentation-mongoose": "^0.35.0", + "@opentelemetry/instrumentation-mysql": "^0.35.0", + "@opentelemetry/instrumentation-mysql2": "^0.35.0", + "@opentelemetry/instrumentation-nestjs-core": "^0.34.0", + "@opentelemetry/instrumentation-net": "^0.33.0", + "@opentelemetry/instrumentation-pg": "^0.38.0", + "@opentelemetry/instrumentation-pino": "^0.35.0", + "@opentelemetry/instrumentation-redis": "^0.36.0", + "@opentelemetry/instrumentation-redis-4": "^0.36.0", + "@opentelemetry/instrumentation-restify": "^0.35.0", + "@opentelemetry/instrumentation-router": "^0.34.0", + "@opentelemetry/instrumentation-socket.io": "^0.36.0", + "@opentelemetry/instrumentation-tedious": "^0.7.0", + "@opentelemetry/instrumentation-winston": "^0.34.0", + "@opentelemetry/resource-detector-alibaba-cloud": "^0.28.6", + "@opentelemetry/resource-detector-aws": "^1.3.6", + "@opentelemetry/resource-detector-container": "^0.3.6", + "@opentelemetry/resource-detector-gcp": "^0.29.6", + "@opentelemetry/resources": "^1.12.0", + "@opentelemetry/sdk-node": "^0.48.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.4.1" + } + }, + "node_modules/@opentelemetry/context-async-hooks": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-1.21.0.tgz", + "integrity": "sha512-t0iulGPiMjG/NrSjinPQoIf8ST/o9V0dGOJthfrFporJlNdlKIQPfC7lkrV+5s2dyBThfmSbJlp/4hO1eOcDXA==", + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.8.0" + } + }, + "node_modules/@opentelemetry/core": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.21.0.tgz", + "integrity": "sha512-KP+OIweb3wYoP7qTYL/j5IpOlu52uxBv5M4+QhSmmUfLyTgu1OIS71msK3chFo1D6Y61BIH3wMiMYRCxJCQctA==", + "dependencies": { + "@opentelemetry/semantic-conventions": "1.21.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.8.0" + } + }, + "node_modules/@opentelemetry/exporter-prometheus": { + "version": "0.48.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-prometheus/-/exporter-prometheus-0.48.0.tgz", + "integrity": "sha512-n1cSdC7/AWkyTZD5WgK4FP0oxgRZUIjjquM6QqNOX9TLALbsg5RxiiBCqiHcbmABt7ZABZKhd8OH3t/GqTayLw==", + "dependencies": { + "@opentelemetry/core": "1.21.0", + "@opentelemetry/resources": "1.21.0", + "@opentelemetry/sdk-metrics": "1.21.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-grpc": { + "version": "0.48.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-grpc/-/exporter-trace-otlp-grpc-0.48.0.tgz", + "integrity": "sha512-+qRQXUbdRW6aNRT5yWOG3G6My1VxxKeqgUyLkkdIjkT20lvymjiN2RpBfGMtAf/oqnuRknf9snFl9VSIO2gniw==", + "dependencies": { + "@grpc/grpc-js": "^1.7.1", + "@opentelemetry/core": "1.21.0", + "@opentelemetry/otlp-grpc-exporter-base": "0.48.0", + "@opentelemetry/otlp-transformer": "0.48.0", + "@opentelemetry/resources": "1.21.0", + "@opentelemetry/sdk-trace-base": "1.21.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-http": { + "version": "0.48.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-http/-/exporter-trace-otlp-http-0.48.0.tgz", + "integrity": "sha512-QEZKbfWqXrbKVpr2PHd4KyKI0XVOhUYC+p2RPV8s+2K5QzZBE3+F9WlxxrXDfkrvGmpQAZytBoHQQYA3AGOtpw==", + "dependencies": { + "@opentelemetry/core": "1.21.0", + "@opentelemetry/otlp-exporter-base": "0.48.0", + "@opentelemetry/otlp-transformer": "0.48.0", + "@opentelemetry/resources": "1.21.0", + "@opentelemetry/sdk-trace-base": "1.21.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-proto": { + "version": "0.48.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-proto/-/exporter-trace-otlp-proto-0.48.0.tgz", + "integrity": "sha512-hVXr/8DYlAKAzQYMsCf3ZsGweS6NTK3IHIEqmLokJZYcvJQBEEazeAdISfrL/utWnapg1Qnpw8u+W6SpxNzmTw==", + "dependencies": { + "@opentelemetry/core": "1.21.0", + "@opentelemetry/otlp-exporter-base": "0.48.0", + "@opentelemetry/otlp-proto-exporter-base": "0.48.0", + "@opentelemetry/otlp-transformer": "0.48.0", + "@opentelemetry/resources": "1.21.0", + "@opentelemetry/sdk-trace-base": "1.21.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/exporter-zipkin": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-zipkin/-/exporter-zipkin-1.21.0.tgz", + "integrity": "sha512-J0ejrOx52s1PqvjNalIHvY/4v9ZxR2r7XS7WZbwK3qpVYZlGVq5V1+iCNweqsKnb/miUt/4TFvJBc9f5Q/kGcA==", + "dependencies": { + "@opentelemetry/core": "1.21.0", + "@opentelemetry/resources": "1.21.0", + "@opentelemetry/sdk-trace-base": "1.21.0", + "@opentelemetry/semantic-conventions": "1.21.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/host-metrics": { + "version": "0.32.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/host-metrics/-/host-metrics-0.32.2.tgz", + "integrity": "sha512-zrnls0CWMAYEUHQbdplY0M6v3L/cgEoiwpjAnHAaG7M3ICs7K4/Hms1UlVMDydEvNDkQilx63scpDcE1/M5V4A==", + "dependencies": { + "@opentelemetry/sdk-metrics": "^1.8.0", + "systeminformation": "^5.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation": { + "version": "0.48.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.48.0.tgz", + "integrity": "sha512-sjtZQB5PStIdCw5ovVTDGwnmQC+GGYArJNgIcydrDSqUTdYBnMrN9P4pwQZgS3vTGIp+TU1L8vMXGe51NVmIKQ==", + "dependencies": { + "@types/shimmer": "^1.0.2", + "import-in-the-middle": "1.7.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-amqplib": { + "version": "0.34.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-amqplib/-/instrumentation-amqplib-0.34.0.tgz", + "integrity": "sha512-lVGRkyGnjFJv9O8oO/+uT40nrNj4UO+UN0k8708guy/toVgxsVpv4PtdWJTjbtu89UDk9gUxq62jpHxqrVaNnw==", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/semantic-conventions": "^1.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-aws-lambda": { + "version": "0.38.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-aws-lambda/-/instrumentation-aws-lambda-0.38.0.tgz", + "integrity": "sha512-MIPvM8S4LqGKE+IAnYVCRUnEjaWbPsbqL4p2BnGcox08e6+JQe+0d16DI0cKVSFZOzV5T/or3ewQ/bB0lPm8yg==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/propagator-aws-xray": "^1.3.1", + "@opentelemetry/resources": "^1.8.0", + "@opentelemetry/semantic-conventions": "^1.0.0", + "@types/aws-lambda": "8.10.122" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-aws-sdk": { + "version": "0.38.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-aws-sdk/-/instrumentation-aws-sdk-0.38.1.tgz", + "integrity": "sha512-/Tupb4UfVVkmcopq2H2nr2D/pHLF0riVw2biQQUJ/jGIkfrOgUMMKbShi2RQE4Zy8NFv3xaDn4/pNxzodLBy3w==", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/propagation-utils": "^0.30.6", + "@opentelemetry/semantic-conventions": "^1.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-bunyan": { + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-bunyan/-/instrumentation-bunyan-0.35.0.tgz", + "integrity": "sha512-bQ8OzV7nVTA+oGiTzLjUmRFAbnXi0U/Z4VJCpj+1DRsaAaMT17eRpAOh22LQR0JBnv2vBm8CvIQl4CcAnsB46g==", + "dependencies": { + "@opentelemetry/api-logs": "^0.48.0", + "@opentelemetry/instrumentation": "^0.48.0", + "@types/bunyan": "1.8.9" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-cassandra-driver": { + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-cassandra-driver/-/instrumentation-cassandra-driver-0.35.0.tgz", + "integrity": "sha512-NlJkEiP37/WQvtSyYe4zxaBcaoweO/2+UtDssldk9NFmFutLHyMT/P5q5fe8i73ylmkPOAZnN8P48oHOhZHM1g==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/semantic-conventions": "^1.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-connect": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-connect/-/instrumentation-connect-0.33.0.tgz", + "integrity": "sha512-EAMmUC2/KfeZl4qNgUsiVqT5Jti0jDl4GHi4TpDg41VBEJkRX/0+JcPBWgdFUgEfeiZr0GPVQud4i8jAwJ+ORw==", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/semantic-conventions": "^1.0.0", + "@types/connect": "3.4.36" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-cucumber": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-cucumber/-/instrumentation-cucumber-0.3.0.tgz", + "integrity": "sha512-nM9BL0t2Nxwbb41MXxNXTDL0zq7FXhOX9F3OiAqYUJHqb7BHyzV9KoQ+Ao1BjqJR91hUm1OFNgHAk3y8uiuq4w==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/semantic-conventions": "^1.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/instrumentation-dataloader": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-dataloader/-/instrumentation-dataloader-0.6.0.tgz", + "integrity": "sha512-jkPdn83WV/TcnhQ5bOIoYcJGvMxXyYlCzbqfuB6HsMqf3CqpdgBQYlMuKi6qIfD4QWYt2R992yglNxPLuJ7xeg==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.48.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-dns": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-dns/-/instrumentation-dns-0.33.0.tgz", + "integrity": "sha512-QDJadJOQg9CLqMC79r4T5ugN4C4lb6eJYLmHgnLg3fh1JUGfyjQHtD3T7lH0P8251Mnt5m8zjDDbPKcqK2aGcw==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/semantic-conventions": "^1.0.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-express": { + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-express/-/instrumentation-express-0.35.0.tgz", + "integrity": "sha512-ZmSB4WMd88sSecOL7DlghzdBl56/8ymb02n+xEJ/6zUgONuw/1uoTh1TAaNPKfEWdNLoLKXQm+Gd2zBrUVOX0w==", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/semantic-conventions": "^1.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-fastify": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-fastify/-/instrumentation-fastify-0.33.0.tgz", + "integrity": "sha512-sl3q9Mt+yM6GlZJKhfLUIRrVEYqfmI0hqYLha5OFG5rLrgnZCCZVy8ra4+Pa40ecH1409cvwwBPf7k9AHEQBTw==", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/semantic-conventions": "^1.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-fs": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-fs/-/instrumentation-fs-0.9.0.tgz", + "integrity": "sha512-Xp31lb2Sj50ppsJ393650HxSi5IJIgddXxrUeVljmsabdmECPUj0YAt/Wwb1oIHFn04iL9Tq4VkF/otlLaI9ww==", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/semantic-conventions": "^1.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-generic-pool": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-generic-pool/-/instrumentation-generic-pool-0.33.0.tgz", + "integrity": "sha512-QMSSOfIqMJhXqFryLVbAMsgRktNHdhMEpsOgEiHurLfvAJhyEOBcTTUuo6Laqt50IIzIm3YuHL9ZtEl9fve2ag==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/semantic-conventions": "^1.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-graphql": { + "version": "0.37.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-graphql/-/instrumentation-graphql-0.37.0.tgz", + "integrity": "sha512-WL5Qn1aRudJDxVN0Ao73/yzXBGBJAH1Fd2tteuGXku/Qw9hYQ936CgoO66GWmSiq2lyjsojAk1t5f+HF9j3NXw==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.48.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-grpc": { + "version": "0.48.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-grpc/-/instrumentation-grpc-0.48.0.tgz", + "integrity": "sha512-MmJHkbqaulqfECjotRtco9AXOq+D1HLq53wI7UFeE8bl8kISP9iMkt+A7PrtPFpRGCglwFvSa0djId6EWsP0DQ==", + "dependencies": { + "@opentelemetry/instrumentation": "0.48.0", + "@opentelemetry/semantic-conventions": "1.21.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-hapi": { + "version": "0.34.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-hapi/-/instrumentation-hapi-0.34.0.tgz", + "integrity": "sha512-qUENVxwCYbRbJ8HBY54ZL1Z9q1guCEurW6tCFFJJKQFu/MKEw7GSFImy5DR2Mp8b5ggZO36lYFcx0QUxfy4GJg==", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/semantic-conventions": "^1.0.0", + "@types/hapi__hapi": "20.0.13" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-http": { + "version": "0.48.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-http/-/instrumentation-http-0.48.0.tgz", + "integrity": "sha512-uXqOsLhW9WC3ZlGm6+PSX0xjSDTCfy4CMjfYj6TPWusOO8dtdx040trOriF24y+sZmS3M+5UQc6/3/ZxBJh4Mw==", + "dependencies": { + "@opentelemetry/core": "1.21.0", + "@opentelemetry/instrumentation": "0.48.0", + "@opentelemetry/semantic-conventions": "1.21.0", + "semver": "^7.5.2" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-ioredis": { + "version": "0.37.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-ioredis/-/instrumentation-ioredis-0.37.0.tgz", + "integrity": "sha512-xBPfu03IIG8x1pmt1Dx+XrBO4ZB4UjEcrouGbp6eV3dLQ7eJPYZgfNXmsqkpsxgNQuVCi2a3WEAwZ5Wl2hk7Vw==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/redis-common": "^0.36.1", + "@opentelemetry/semantic-conventions": "^1.0.0", + "@types/ioredis4": "npm:@types/ioredis@^4.28.10" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-knex": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-knex/-/instrumentation-knex-0.33.0.tgz", + "integrity": "sha512-7L3Q8Yy5vY4W4zpRrjKEc0OpVPYyERtDz5dAumKjkJsEVPANr7E8Cc+No6VjZGeN+HgFFwEo+jcQCTWJzdxvRw==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/semantic-conventions": "^1.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-koa": { + "version": "0.37.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-koa/-/instrumentation-koa-0.37.0.tgz", + "integrity": "sha512-EfuGv1RJCSZh77dDc3PtvZXGwcsTufn9tU6T9VOTFcxovpyJ6w0og73eD0D02syR8R+kzv6rg1TeS8+lj7pyrQ==", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/semantic-conventions": "^1.0.0", + "@types/koa": "2.14.0", + "@types/koa__router": "12.0.3" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-lru-memoizer": { + "version": "0.34.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-lru-memoizer/-/instrumentation-lru-memoizer-0.34.0.tgz", + "integrity": "sha512-m1kXrc11XNj7cC6sfcsYqd+kuCcN2wI9LXpB2l2BZCogqxHCgjuVoiXvT6K9LfO4tLefcvhoK0N8XuVJ8xyyOw==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.48.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-memcached": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-memcached/-/instrumentation-memcached-0.33.0.tgz", + "integrity": "sha512-TdGT5ytt8o7FTIsQvx010ykYbqu+IfGoOKA+IXLHdX1+l7vFWyv3ZOzQbRDmA4rxujJAAPf/n4/D7QECyedE/g==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/semantic-conventions": "^1.0.0", + "@types/memcached": "^2.2.6" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-mongodb": { + "version": "0.39.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongodb/-/instrumentation-mongodb-0.39.0.tgz", + "integrity": "sha512-m9dMj39pcCshzlfCEn2lGrlNo7eV5fb9pGBnPyl/Am9Crh7Or8vOqvByCNd26Dgf5J978zTdLGF+6tM8j1WOew==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/sdk-metrics": "^1.9.1", + "@opentelemetry/semantic-conventions": "^1.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-mongoose": { + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongoose/-/instrumentation-mongoose-0.35.0.tgz", + "integrity": "sha512-gReBMWD2Oa/wBGRWyg6B2dbPHhgkpOqDio31gE3DbC4JaqCsMByyeix75rZSzZ71RQmVh3d4jRLsqUtNVBzcyg==", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/semantic-conventions": "^1.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-mysql": { + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql/-/instrumentation-mysql-0.35.0.tgz", + "integrity": "sha512-QKRHd3aFA2vKOPzIZ9Q3UIxYeNPweB62HGlX2l3shOKrUhrtTg2/BzaKpHQBy2f2nO2mxTF/mOFeVEDeANnhig==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/semantic-conventions": "^1.0.0", + "@types/mysql": "2.15.22" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-mysql2": { + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql2/-/instrumentation-mysql2-0.35.0.tgz", + "integrity": "sha512-DI9NXYJBbQ72rjz1KCKerQFQE+Z4xRDoyYek6JpITv5BlhPboA8zKkltxyQLL06Y2RTFYslw1gvg+x9CWlRzJw==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/semantic-conventions": "^1.0.0", + "@opentelemetry/sql-common": "^0.40.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-nestjs-core": { + "version": "0.34.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-nestjs-core/-/instrumentation-nestjs-core-0.34.0.tgz", + "integrity": "sha512-HvbcCVAMZEIFrJ0Si9AfjxOr14KcH5h/lq5zLQ8AjZJpW0WaeO/ox5UgFi3J73Br91WbZHRgbXxMeodNycJJuA==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/semantic-conventions": "^1.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-net": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-net/-/instrumentation-net-0.33.0.tgz", + "integrity": "sha512-x6awrqF0YfEhGGNE2JtEWvB+zEls7mFvLDii54DnWxpQU69+AqKCW/ZwC91EDefOMGSYBckL0uEn6XNOgkTTbw==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/semantic-conventions": "^1.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-pg": { + "version": "0.38.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pg/-/instrumentation-pg-0.38.0.tgz", + "integrity": "sha512-Q7V/OJ1OZwaWYNOP/E9S6sfS03Z+PNU1SAjdAoXTj5j4u4iJSMSieLRWXFaHwsbefIOMkYvA00EBKF9IgbgbLA==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/semantic-conventions": "^1.0.0", + "@opentelemetry/sql-common": "^0.40.0", + "@types/pg": "8.6.1", + "@types/pg-pool": "2.0.4" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-pg/node_modules/@types/pg": { + "version": "8.6.1", + "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.6.1.tgz", + "integrity": "sha512-1Kc4oAGzAl7uqUStZCDvaLFqZrW9qWSjXOmBfdgyBP5La7Us6Mg4GBvRlSoaZMhQF/zSj1C8CtKMBkoiT8eL8w==", + "dependencies": { + "@types/node": "*", + "pg-protocol": "*", + "pg-types": "^2.2.0" + } + }, + "node_modules/@opentelemetry/instrumentation-pino": { + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pino/-/instrumentation-pino-0.35.0.tgz", + "integrity": "sha512-gMfJ5Qy793mbaAGnQE3yp1Cb0y4np74rBPu20Oy/v8TTgPQOEV5PyNI0GNGggmZQIJSkdtYa8Ndb3huH3iZE5g==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.48.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-redis": { + "version": "0.36.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-redis/-/instrumentation-redis-0.36.0.tgz", + "integrity": "sha512-rKFylIacEBwLxKFrPvxpVi8hHY9qXfQSybYnYNyF/VxUWMGYDPMpbCnTQkiVR5u+tIhwSvhSDG2YQEq6syHUIQ==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/redis-common": "^0.36.1", + "@opentelemetry/semantic-conventions": "^1.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-redis-4": { + "version": "0.36.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-redis-4/-/instrumentation-redis-4-0.36.0.tgz", + "integrity": "sha512-XO0EV2TxUsaRdcp79blyLGG5JWWl7NWVd/XNbU8vY7CuYUfRhWiTXYoM4PI+lwkAnUPvPtyiOzYs9px23GnibA==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/redis-common": "^0.36.1", + "@opentelemetry/semantic-conventions": "^1.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-restify": { + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-restify/-/instrumentation-restify-0.35.0.tgz", + "integrity": "sha512-0ghtxsGJxHEwJfIzxDN3FCbNiTXqwv2jV6ip716jyjWN3f6MuRHm7NPWI/KNvu+IjqDj16KRGZG7nUAEB1ojog==", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/semantic-conventions": "^1.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-router": { + "version": "0.34.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-router/-/instrumentation-router-0.34.0.tgz", + "integrity": "sha512-7LsonkdnQi35eF7CWl8394QDgyd811gCawJ6QuS8GbWNIvZ3S2f9j+Zy0fWSmFgO28ruW1pUG51ql8xdXWa8TA==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/semantic-conventions": "^1.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-socket.io": { + "version": "0.36.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-socket.io/-/instrumentation-socket.io-0.36.0.tgz", + "integrity": "sha512-c9Zc6WKxTZtMaOj01kmJGLKabEj805YgTav4l9vgojHrf6MH1fTlw+SGvOKhfPfzmu2QhNORAfqPAB1poDwqEQ==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/semantic-conventions": "^1.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-tedious": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-tedious/-/instrumentation-tedious-0.7.0.tgz", + "integrity": "sha512-o/5my8ZOuxACPSzMaXdPnQiMpmOPIJoTj+DRcs4vEJxk+KwlVNucoafSMpWQEyTNNuq2JI87Ru6Di2mp5T20EQ==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/semantic-conventions": "^1.0.0", + "@types/tedious": "^4.0.10" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-winston": { + "version": "0.34.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-winston/-/instrumentation-winston-0.34.0.tgz", + "integrity": "sha512-Ejssv6Uih7ipoNGYQLXd+cKZdEfTfTJ/vzpUSeYiJZ36mVYER1f8fs9Kb7jTKjHD55g2s6cUJj9lifbDFI4EEw==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.48.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/otlp-exporter-base": { + "version": "0.48.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.48.0.tgz", + "integrity": "sha512-T4LJND+Ugl87GUONoyoQzuV9qCn4BFIPOnCH1biYqdGhc2JahjuLqVD9aefwLzGBW638iLAo88Lh68h2F1FLiA==", + "dependencies": { + "@opentelemetry/core": "1.21.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/otlp-grpc-exporter-base": { + "version": "0.48.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-grpc-exporter-base/-/otlp-grpc-exporter-base-0.48.0.tgz", + "integrity": "sha512-Vdp56RK9OU+Oeoy3YQC/UMOWglKQ9qvgGr49FgF4r8vk5DlcTUgVS0m3KG8pykmRPA+5ZKaDuqwPw5aTvWmHFw==", + "dependencies": { + "@grpc/grpc-js": "^1.7.1", + "@opentelemetry/core": "1.21.0", + "@opentelemetry/otlp-exporter-base": "0.48.0", + "protobufjs": "^7.2.3" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/otlp-proto-exporter-base": { + "version": "0.48.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-proto-exporter-base/-/otlp-proto-exporter-base-0.48.0.tgz", + "integrity": "sha512-14GSTvPZPfrWsB54fYMGb8v+Uge5xGXyz0r2rf4SzcRnO2hXCPHEuL3yyL50emaKPAY+fj29Dm0bweawe8UA6A==", + "dependencies": { + "@opentelemetry/core": "1.21.0", + "@opentelemetry/otlp-exporter-base": "0.48.0", + "protobufjs": "^7.2.3" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/otlp-transformer": { + "version": "0.48.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.48.0.tgz", + "integrity": "sha512-yuoS4cUumaTK/hhxW3JUy3wl2U4keMo01cFDrUOmjloAdSSXvv1zyQ920IIH4lymp5Xd21Dj2/jq2LOro56TJg==", + "dependencies": { + "@opentelemetry/api-logs": "0.48.0", + "@opentelemetry/core": "1.21.0", + "@opentelemetry/resources": "1.21.0", + "@opentelemetry/sdk-logs": "0.48.0", + "@opentelemetry/sdk-metrics": "1.21.0", + "@opentelemetry/sdk-trace-base": "1.21.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.8.0" + } + }, + "node_modules/@opentelemetry/propagation-utils": { + "version": "0.30.6", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagation-utils/-/propagation-utils-0.30.6.tgz", + "integrity": "sha512-qvnYee5I/xrBY5XClUlOASIOdoTbnFGNI6+ViKqdoErF2xKmhysXcmxlJNzQFNDK0muTfjvJMZcFyEielARk7g==", + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/propagator-aws-xray": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-aws-xray/-/propagator-aws-xray-1.3.1.tgz", + "integrity": "sha512-6fDMzFlt5r6VWv7MUd0eOpglXPFqykW8CnOuUxJ1VZyLy6mV1bzBlzpsqEmhx1bjvZYvH93vhGkQZqrm95mlrQ==", + "dependencies": { + "@opentelemetry/core": "^1.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/propagator-b3": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-b3/-/propagator-b3-1.21.0.tgz", + "integrity": "sha512-3ZTobj2VDIOzLsIvvYCdpw6tunxUVElPxDvog9lS49YX4hohHeD84A8u9Ns/6UYUcaN5GSoEf891lzhcBFiOLA==", + "dependencies": { + "@opentelemetry/core": "1.21.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.8.0" + } + }, + "node_modules/@opentelemetry/propagator-jaeger": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-jaeger/-/propagator-jaeger-1.21.0.tgz", + "integrity": "sha512-8TQSwXjBmaDx7JkxRD7hdmBmRK2RGRgzHX1ArJfJhIc5trzlVweyorzqQrXOvqVEdEg+zxUMHkL5qbGH/HDTPA==", + "dependencies": { + "@opentelemetry/core": "1.21.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.8.0" + } + }, + "node_modules/@opentelemetry/redis-common": { + "version": "0.36.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/redis-common/-/redis-common-0.36.1.tgz", + "integrity": "sha512-YjfNEr7DK1Ymc5H0bzhmqVvMcCs+PUEUerzrpTFdHfZxj3HpnnjZTIFKx/gxiL/sajQ8dxycjlreoYTVYKBXlw==", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/resource-detector-alibaba-cloud": { + "version": "0.28.6", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-alibaba-cloud/-/resource-detector-alibaba-cloud-0.28.6.tgz", + "integrity": "sha512-VuJXc+oDQ/SYRHBCQbEshl0WJtEMvgfSkTDBq+WSxj6y9sKe0HCt55Sxeb5nLmBdtCYWMQFniHe2K4GLSjDZVw==", + "dependencies": { + "@opentelemetry/resources": "^1.0.0", + "@opentelemetry/semantic-conventions": "^1.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/resource-detector-aws": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-aws/-/resource-detector-aws-1.3.6.tgz", + "integrity": "sha512-hFJ19yFwChqGCv1uMkXtjZU9BG8GcChe8cRCAkGWg1RZADse5S2ausf3D8pYw1cR3ktJtuAmRrGZniT6TDUPDw==", + "dependencies": { + "@opentelemetry/core": "^1.0.0", + "@opentelemetry/resources": "^1.0.0", + "@opentelemetry/semantic-conventions": "^1.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/resource-detector-container": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-container/-/resource-detector-container-0.3.6.tgz", + "integrity": "sha512-psxtzQakVuZKFl/ukn+nPW4Ixn+KPHGsWJMYKndmXrsgdFri78X+MHR0wLOO41Zn79sc35DiSk+GdJ24cCylbg==", + "dependencies": { + "@opentelemetry/resources": "^1.0.0", + "@opentelemetry/semantic-conventions": "^1.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/resource-detector-gcp": { + "version": "0.29.6", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-gcp/-/resource-detector-gcp-0.29.6.tgz", + "integrity": "sha512-cx03fXPknmiVW0hpWAJr0Nr8xwkwRB8VNWPvNrmP7UzJ8eEztY9lHnVke4ZVFaVGvm/4EFxk2y5hPNggbIezoA==", + "dependencies": { + "@opentelemetry/core": "^1.0.0", + "@opentelemetry/resources": "^1.0.0", + "@opentelemetry/semantic-conventions": "^1.0.0", + "gcp-metadata": "^6.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/resources": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.21.0.tgz", + "integrity": "sha512-1Z86FUxPKL6zWVy2LdhueEGl9AHDJcx+bvHStxomruz6Whd02mE3lNUMjVJ+FGRoktx/xYQcxccYb03DiUP6Yw==", + "dependencies": { + "@opentelemetry/core": "1.21.0", + "@opentelemetry/semantic-conventions": "1.21.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.8.0" + } + }, + "node_modules/@opentelemetry/sdk-logs": { + "version": "0.48.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.48.0.tgz", + "integrity": "sha512-lRcA5/qkSJuSh4ItWCddhdn/nNbVvnzM+cm9Fg1xpZUeTeozjJDBcHnmeKoOaWRnrGYBdz6UTY6bynZR9aBeAA==", + "dependencies": { + "@opentelemetry/core": "1.21.0", + "@opentelemetry/resources": "1.21.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.4.0 <1.8.0", + "@opentelemetry/api-logs": ">=0.39.1" + } + }, + "node_modules/@opentelemetry/sdk-metrics": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-1.21.0.tgz", + "integrity": "sha512-on1jTzIHc5DyWhRP+xpf+zrgrREXcHBH4EDAfaB5mIG7TWpKxNXooQ1JCylaPsswZUv4wGnVTinr4HrBdGARAQ==", + "dependencies": { + "@opentelemetry/core": "1.21.0", + "@opentelemetry/resources": "1.21.0", + "lodash.merge": "^4.6.2" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.8.0" + } + }, + "node_modules/@opentelemetry/sdk-node": { + "version": "0.48.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-node/-/sdk-node-0.48.0.tgz", + "integrity": "sha512-3o3GS6t+VLGVFCV5bqfGOcWIgOdkR/UE6Qz7hHksP5PXrVBeYsPqts7cPma5YXweaI3r3h26mydg9PqQIcqksg==", + "dependencies": { + "@opentelemetry/api-logs": "0.48.0", + "@opentelemetry/core": "1.21.0", + "@opentelemetry/exporter-trace-otlp-grpc": "0.48.0", + "@opentelemetry/exporter-trace-otlp-http": "0.48.0", + "@opentelemetry/exporter-trace-otlp-proto": "0.48.0", + "@opentelemetry/exporter-zipkin": "1.21.0", + "@opentelemetry/instrumentation": "0.48.0", + "@opentelemetry/resources": "1.21.0", + "@opentelemetry/sdk-logs": "0.48.0", + "@opentelemetry/sdk-metrics": "1.21.0", + "@opentelemetry/sdk-trace-base": "1.21.0", + "@opentelemetry/sdk-trace-node": "1.21.0", + "@opentelemetry/semantic-conventions": "1.21.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.8.0" + } + }, + "node_modules/@opentelemetry/sdk-trace-base": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.21.0.tgz", + "integrity": "sha512-yrElGX5Fv0umzp8Nxpta/XqU71+jCAyaLk34GmBzNcrW43nqbrqvdPs4gj4MVy/HcTjr6hifCDCYA3rMkajxxA==", + "dependencies": { + "@opentelemetry/core": "1.21.0", + "@opentelemetry/resources": "1.21.0", + "@opentelemetry/semantic-conventions": "1.21.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.8.0" + } + }, + "node_modules/@opentelemetry/sdk-trace-node": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-node/-/sdk-trace-node-1.21.0.tgz", + "integrity": "sha512-1pdm8jnqs+LuJ0Bvx6sNL28EhC8Rv7NYV8rnoXq3GIQo7uOHBDAFSj7makAfbakrla7ecO1FRfI8emnR4WvhYA==", + "dependencies": { + "@opentelemetry/context-async-hooks": "1.21.0", + "@opentelemetry/core": "1.21.0", + "@opentelemetry/propagator-b3": "1.21.0", + "@opentelemetry/propagator-jaeger": "1.21.0", + "@opentelemetry/sdk-trace-base": "1.21.0", + "semver": "^7.5.2" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.8.0" + } + }, + "node_modules/@opentelemetry/semantic-conventions": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.21.0.tgz", + "integrity": "sha512-lkC8kZYntxVKr7b8xmjCVUgE0a8xgDakPyDo9uSWavXPyYqLgYYGdEd2j8NxihRyb6UwpX3G/hFUF4/9q2V+/g==", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/sql-common": { + "version": "0.40.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sql-common/-/sql-common-0.40.0.tgz", + "integrity": "sha512-vSqRJYUPJVjMFQpYkQS3ruexCPSZJ8esne3LazLwtCPaPRvzZ7WG3tX44RouAn7w4wMp8orKguBqtt+ng2UTnw==", + "dependencies": { + "@opentelemetry/core": "^1.1.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0" + } + }, "node_modules/@photostructure/tz-lookup": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/@photostructure/tz-lookup/-/tz-lookup-9.0.1.tgz", @@ -2747,6 +4034,60 @@ "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.25.tgz", "integrity": "sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==" }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" + }, "node_modules/@sideway/address": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz", @@ -2880,6 +4221,14 @@ "url": "https://opencollective.com/turf" } }, + "node_modules/@types/accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/@types/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Pay9fq2lM2wXPWbteBsRAGiWH2hig4ZE2asK+mm7kUzlxRTfL961rj89I6zV/E3PcIkDqyuBEcMxFT7rccugeQ==", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/archiver": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/@types/archiver/-/archiver-6.0.2.tgz", @@ -2895,6 +4244,11 @@ "integrity": "sha512-HlZ6Dcr205BmNhwkdXqrg2vkFMN2PluI7Lgr8In3B3wE5PiQHhjRqtW/lGdVU9gw+sM0JcIDx2AN+cW8oSWIcw==", "dev": true }, + "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==" + }, "node_modules/@types/babel__core": { "version": "7.20.2", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.2.tgz", @@ -2949,21 +4303,32 @@ "version": "1.19.3", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.3.tgz", "integrity": "sha512-oyl4jvAfTGX9Bt6Or4H9ni1Z447/tQuxnZsytsCaExKlmJiU8sFgnIBRzJUpKwB5eWn9HuBYlUlVA74q/yN0eQ==", - "dev": true, "dependencies": { "@types/connect": "*", "@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==", + "dependencies": { + "@types/node": "*" + } + }, "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==", - "dev": true, "dependencies": { "@types/node": "*" } }, + "node_modules/@types/content-disposition": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/@types/content-disposition/-/content-disposition-0.5.8.tgz", + "integrity": "sha512-QVSSvno3dE0MgO76pJhmv4Qyi/j0Yk9pBp0Y7TJ2Tlj+KCgJWY6qX7nnxCOLkZ3VYRSIk1WTxCvwUSdx6CCLdg==" + }, "node_modules/@types/cookie": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", @@ -2984,6 +4349,17 @@ "integrity": "sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q==", "dev": true }, + "node_modules/@types/cookies": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@types/cookies/-/cookies-0.9.0.tgz", + "integrity": "sha512-40Zk8qR147RABiQ7NQnBzWzDcjKzNrntB5BAmeGCb2p/MIyOE+4BVvc17wumsUqUw00bJYqoXFHYygQnEFh4/Q==", + "dependencies": { + "@types/connect": "*", + "@types/express": "*", + "@types/keygrip": "*", + "@types/node": "*" + } + }, "node_modules/@types/cors": { "version": "2.8.14", "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.14.tgz", @@ -3042,7 +4418,6 @@ "version": "4.17.21", "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", - "dev": true, "dependencies": { "@types/body-parser": "*", "@types/express-serve-static-core": "^4.17.33", @@ -3054,7 +4429,6 @@ "version": "4.17.37", "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.37.tgz", "integrity": "sha512-ZohaCYTgGFcOP7u6aJOhY9uIZQgZ2vxC2yWoArY+FeDXlqeH66ZVBjgvg+RLVAS/DWNq4Ap9ZXu1+SUQiiWYMg==", - "dev": true, "dependencies": { "@types/node": "*", "@types/qs": "*", @@ -3080,11 +4454,51 @@ "@types/node": "*" } }, + "node_modules/@types/hapi__catbox": { + "version": "10.2.6", + "resolved": "https://registry.npmjs.org/@types/hapi__catbox/-/hapi__catbox-10.2.6.tgz", + "integrity": "sha512-qdMHk4fBlwRfnBBDJaoaxb+fU9Ewi2xqkXD3mNjSPl2v/G/8IJbDpVRBuIcF7oXrcE8YebU5M8cCeKh1NXEn0w==" + }, + "node_modules/@types/hapi__hapi": { + "version": "20.0.13", + "resolved": "https://registry.npmjs.org/@types/hapi__hapi/-/hapi__hapi-20.0.13.tgz", + "integrity": "sha512-LP4IPfhIO5ZPVOrJo7H8c8Slc0WYTFAUNQX1U0LBPKyXioXhH5H2TawIgxKujIyOhbwoBbpvOsBf6o5+ToJIrQ==", + "dependencies": { + "@hapi/boom": "^9.0.0", + "@hapi/iron": "^6.0.0", + "@hapi/podium": "^4.1.3", + "@types/hapi__catbox": "*", + "@types/hapi__mimos": "*", + "@types/hapi__shot": "*", + "@types/node": "*", + "joi": "^17.3.0" + } + }, + "node_modules/@types/hapi__mimos": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@types/hapi__mimos/-/hapi__mimos-4.1.4.tgz", + "integrity": "sha512-i9hvJpFYTT/qzB5xKWvDYaSXrIiNqi4ephi+5Lo6+DoQdwqPXQgmVVOZR+s3MBiHoFqsCZCX9TmVWG3HczmTEQ==", + "dependencies": { + "@types/mime-db": "*" + } + }, + "node_modules/@types/hapi__shot": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@types/hapi__shot/-/hapi__shot-4.1.6.tgz", + "integrity": "sha512-h33NBjx2WyOs/9JgcFeFhkxnioYWQAZxOHdmqDuoJ1Qjxpcs+JGvSjEEoDeWfcrF+1n47kKgqph5IpfmPOnzbg==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/http-assert": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@types/http-assert/-/http-assert-1.5.5.tgz", + "integrity": "sha512-4+tE/lwdAahgZT1g30Jkdm9PzFRde0xwxBNUyRsCitRvCQB90iuA2uJYdUnhnANRcqGXaWOGY4FEoxeElNAK2g==" + }, "node_modules/@types/http-errors": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.2.tgz", - "integrity": "sha512-lPG6KlZs88gef6aD85z3HNkztpj7w2R7HmR3gygjfXCQmsLloWNARFkMuzKiiY8FGdh1XDpgBdrSf4aKDiA7Kg==", - "dev": true + "integrity": "sha512-lPG6KlZs88gef6aD85z3HNkztpj7w2R7HmR3gygjfXCQmsLloWNARFkMuzKiiY8FGdh1XDpgBdrSf4aKDiA7Kg==" }, "node_modules/@types/imagemin": { "version": "8.0.5", @@ -3105,6 +4519,15 @@ "rxjs": "^7.2.0" } }, + "node_modules/@types/ioredis4": { + "name": "@types/ioredis", + "version": "4.28.10", + "resolved": "https://registry.npmjs.org/@types/ioredis/-/ioredis-4.28.10.tgz", + "integrity": "sha512-69LyhUgrXdgcNDv7ogs1qXZomnfOEnSmrmMFqKgt1XMJxmoOSG/u3wYy13yACIfKuMJ8IhKgHafDO3sx19zVQQ==", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", @@ -3154,6 +4577,42 @@ "integrity": "sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ==", "dev": true }, + "node_modules/@types/keygrip": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/keygrip/-/keygrip-1.0.6.tgz", + "integrity": "sha512-lZuNAY9xeJt7Bx4t4dx0rYCDqGPW8RXhQZK1td7d4H6E9zYbLoOtjBvfwdTKpsyxQI/2jv+armjX/RW+ZNpXOQ==" + }, + "node_modules/@types/koa": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/@types/koa/-/koa-2.14.0.tgz", + "integrity": "sha512-DTDUyznHGNHAl+wd1n0z1jxNajduyTh8R53xoewuerdBzGo6Ogj6F2299BFtrexJw4NtgjsI5SMPCmV9gZwGXA==", + "dependencies": { + "@types/accepts": "*", + "@types/content-disposition": "*", + "@types/cookies": "*", + "@types/http-assert": "*", + "@types/http-errors": "*", + "@types/keygrip": "*", + "@types/koa-compose": "*", + "@types/node": "*" + } + }, + "node_modules/@types/koa__router": { + "version": "12.0.3", + "resolved": "https://registry.npmjs.org/@types/koa__router/-/koa__router-12.0.3.tgz", + "integrity": "sha512-5YUJVv6NwM1z7m6FuYpKfNLTZ932Z6EF6xy2BbtpJSyn13DKNQEkXVffFVSnJHxvwwWh2SAeumpjAYUELqgjyw==", + "dependencies": { + "@types/koa": "*" + } + }, + "node_modules/@types/koa-compose": { + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/@types/koa-compose/-/koa-compose-3.2.8.tgz", + "integrity": "sha512-4Olc63RY+MKvxMwVknCUDhRQX1pFQoBZ/lXcRLP69PQkEpze/0cr8LNqJQe5NFb/b19DWi2a5bTi2VAlQzhJuA==", + "dependencies": { + "@types/koa": "*" + } + }, "node_modules/@types/lodash": { "version": "4.14.202", "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.202.tgz", @@ -3165,6 +4624,14 @@ "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.3.7.tgz", "integrity": "sha512-gKc9P2d4g5uYwmy4s/MO/yOVPmvHyvzka1YH6i5dM03UrFofHSmgc0D0ymbDRStFWHusk6cwwF6nhLm/ckBbbQ==" }, + "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==", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/methods": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/@types/methods/-/methods-1.1.4.tgz", @@ -3174,8 +4641,12 @@ "node_modules/@types/mime": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.3.tgz", - "integrity": "sha512-Ys+/St+2VF4+xuY6+kDIXGxbNRO0mesVg0bbxEfB97Od1Vjpjx9KD1qxs64Gcb3CWPirk9Xe+PT4YiiHQ9T+eg==", - "dev": true + "integrity": "sha512-Ys+/St+2VF4+xuY6+kDIXGxbNRO0mesVg0bbxEfB97Od1Vjpjx9KD1qxs64Gcb3CWPirk9Xe+PT4YiiHQ9T+eg==" + }, + "node_modules/@types/mime-db": { + "version": "1.43.5", + "resolved": "https://registry.npmjs.org/@types/mime-db/-/mime-db-1.43.5.tgz", + "integrity": "sha512-/bfTiIUTNPUBnwnYvUxXAre5MhD88jgagLEQiQtIASjU+bwxd8kS/ASDA4a8ufd8m0Lheu6eeMJHEUpLHoJ28A==" }, "node_modules/@types/mock-fs": { "version": "4.13.4", @@ -3195,6 +4666,14 @@ "@types/express": "*" } }, + "node_modules/@types/mysql": { + "version": "2.15.22", + "resolved": "https://registry.npmjs.org/@types/mysql/-/mysql-2.15.22.tgz", + "integrity": "sha512-wK1pzsJVVAjYCSZWQoWHziQZbNggXFDUEIGf54g4ZM/ERuP86uGdWeKZWMYlqTPMZfHJJvLPyogXGvCOg87yLQ==", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/node": { "version": "20.11.25", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.25.tgz", @@ -3219,6 +4698,14 @@ "pg-types": "^4.0.1" } }, + "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==", + "dependencies": { + "@types/pg": "*" + } + }, "node_modules/@types/pg/node_modules/pg-types": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-4.0.1.tgz", @@ -3279,14 +4766,12 @@ "node_modules/@types/qs": { "version": "6.9.8", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.8.tgz", - "integrity": "sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg==", - "dev": true + "integrity": "sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg==" }, "node_modules/@types/range-parser": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.5.tgz", - "integrity": "sha512-xrO9OoVPqFuYyR/loIHjnbvvyRZREYKLjxV4+dY6v3FQR3stQ9ZxIGkaclF7YhI9hfjpuTbu14hZEy94qKLtOA==", - "dev": true + "integrity": "sha512-xrO9OoVPqFuYyR/loIHjnbvvyRZREYKLjxV4+dY6v3FQR3stQ9ZxIGkaclF7YhI9hfjpuTbu14hZEy94qKLtOA==" }, "node_modules/@types/readdir-glob": { "version": "1.1.2", @@ -3307,7 +4792,6 @@ "version": "0.17.2", "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.2.tgz", "integrity": "sha512-aAG6yRf6r0wQ29bkS+x97BIs64ZLxeE/ARwyS6wrldMm3C1MdKwCcnnEwMC1slI8wuxJOpiUH9MioC0A0i+GJw==", - "dev": true, "dependencies": { "@types/mime": "^1", "@types/node": "*" @@ -3317,7 +4801,6 @@ "version": "1.15.3", "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.3.tgz", "integrity": "sha512-yVRvFsEMrv7s0lGhzrggJjNOSmZCdgCjw9xWrPr/kNNLp6FaDfMC1KaYl3TSJ0c58bECwNBMoQrZJ8hA8E1eFg==", - "dev": true, "dependencies": { "@types/http-errors": "*", "@types/mime": "*", @@ -3333,6 +4816,11 @@ "@types/node": "*" } }, + "node_modules/@types/shimmer": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/shimmer/-/shimmer-1.0.5.tgz", + "integrity": "sha512-9Hp0ObzwwO57DpLFF0InUjUm/II8GmKAvzbefxQTihCb7KI6yc9yzf0nLc4mVdby5N4DRCgQM2wCup9KTieeww==" + }, "node_modules/@types/ssh2": { "version": "0.5.52", "resolved": "https://registry.npmjs.org/@types/ssh2/-/ssh2-0.5.52.tgz", @@ -3379,6 +4867,14 @@ "@types/superagent": "^8.1.0" } }, + "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==", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/through": { "version": "0.0.31", "resolved": "https://registry.npmjs.org/@types/through/-/through-0.0.31.tgz", @@ -3824,7 +5320,6 @@ "version": "8.10.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", - "devOptional": true, "bin": { "acorn": "bin/acorn" }, @@ -3836,7 +5331,6 @@ "version": "1.9.0", "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", - "dev": true, "peerDependencies": { "acorn": "^8" } @@ -4388,6 +5882,14 @@ "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz", "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==" }, + "node_modules/bignumber.js": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", + "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==", + "engines": { + "node": "*" + } + }, "node_modules/binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -4804,8 +6306,7 @@ "node_modules/cjs-module-lexer": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", - "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", - "dev": true + "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==" }, "node_modules/class-transformer": { "version": "0.5.1", @@ -6322,6 +7823,11 @@ "node": ">= 0.8" } }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, "node_modules/external-editor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", @@ -6769,6 +8275,55 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, + "node_modules/gaxios": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-6.2.0.tgz", + "integrity": "sha512-H6+bHeoEAU5D6XNc6mPKeN5dLZqEDs9Gpk6I+SZBEzK5So58JVrHPmevNi35fRl1J9Y5TaeLW0kYx3pCJ1U2mQ==", + "dependencies": { + "extend": "^3.0.2", + "https-proxy-agent": "^7.0.1", + "is-stream": "^2.0.0", + "node-fetch": "^2.6.9" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/gaxios/node_modules/agent-base": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", + "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/gaxios/node_modules/https-proxy-agent": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", + "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/gcp-metadata": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-6.1.0.tgz", + "integrity": "sha512-Jh/AIwwgaxan+7ZUUmRLCjtchyDiqh4KjBJ5tW3plBZb5iL/BPcso8A5DlzeD9qlw0duCamnNdpFjxwaT0KyKg==", + "dependencies": { + "gaxios": "^6.0.0", + "json-bigint": "^1.0.0" + }, + "engines": { + "node": ">=14" + } + }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -7030,7 +8585,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, "dependencies": { "function-bind": "^1.1.1" }, @@ -7242,6 +8796,17 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/import-in-the-middle": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.7.1.tgz", + "integrity": "sha512-1LrZPDtW+atAxH42S6288qyDFNQ2YCty+2mxEPRtfazH6Z5QwkaBSTS2ods7hnVJioF6rkRfNoA6A/MstpFXLg==", + "dependencies": { + "acorn": "^8.8.2", + "acorn-import-assertions": "^1.9.0", + "cjs-module-lexer": "^1.2.2", + "module-details-from-path": "^1.0.3" + } + }, "node_modules/import-local": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", @@ -7393,7 +8958,6 @@ "version": "2.13.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", - "dev": true, "dependencies": { "has": "^1.0.3" }, @@ -7466,7 +9030,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, "engines": { "node": ">=8" }, @@ -8342,6 +9905,14 @@ "node": ">=4" } }, + "node_modules/json-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "dependencies": { + "bignumber.js": "^9.0.0" + } + }, "node_modules/json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", @@ -8512,6 +10083,11 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" + }, "node_modules/lodash.defaults": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", @@ -8549,8 +10125,7 @@ "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" }, "node_modules/lodash.union": { "version": "4.6.0", @@ -8573,6 +10148,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/long": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" + }, "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -8837,6 +10417,11 @@ "node": ">=12.0.0" } }, + "node_modules/module-details-from-path": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.3.tgz", + "integrity": "sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A==" + }, "node_modules/moo": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/moo/-/moo-0.5.2.tgz", @@ -9048,6 +10633,20 @@ "node": ">=16" } }, + "node_modules/nestjs-otel": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/nestjs-otel/-/nestjs-otel-5.1.5.tgz", + "integrity": "sha512-4u87aSy/GpbwuYvb5OAm0Zk3CP/q9QATI2bb9DQNpLYC5uYsqNkLHL3AdLBMVueNIMqp8rZui67XW0WTM8rr6g==", + "dependencies": { + "@opentelemetry/api": "^1.4.1", + "@opentelemetry/host-metrics": "^0.32.2", + "response-time": "^2.3.2" + }, + "peerDependencies": { + "@nestjs/common": "^9.0.0 || ^10.0.0", + "@nestjs/core": "^9.0.0 || ^10.0.0" + } + }, "node_modules/node-abort-controller": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz", @@ -9226,6 +10825,14 @@ "node": ">= 0.8" } }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -9459,8 +11066,7 @@ "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, "node_modules/path-scurry": { "version": "1.10.1", @@ -9901,6 +11507,29 @@ "node": ">=10" } }, + "node_modules/protobufjs": { + "version": "7.2.6", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.6.tgz", + "integrity": "sha512-dgJaEDDL6x8ASUZ1YqWciTRrdOuYNzoOf27oHNfdyvKqHr5i0FV7FSLU+aIeFjyFgVxrpTOtQUi0BLLBymZaBw==", + "hasInstallScript": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/protocol-buffers-schema": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/protocol-buffers-schema/-/protocol-buffers-schema-3.6.0.tgz", @@ -10308,11 +11937,23 @@ "node": ">=0.10.0" } }, + "node_modules/require-in-the-middle": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-7.2.0.tgz", + "integrity": "sha512-3TLx5TGyAY6AOqLBoXmHkNql0HIf2RGbuMgCDT2WO/uGVAPJs6h7Kl+bN6TIZGd9bWhWPwnDnTHGtW8Iu77sdw==", + "dependencies": { + "debug": "^4.1.1", + "module-details-from-path": "^1.0.3", + "resolve": "^1.22.1" + }, + "engines": { + "node": ">=8.6.0" + } + }, "node_modules/resolve": { "version": "1.22.6", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz", "integrity": "sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==", - "dev": true, "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", @@ -10371,6 +12012,26 @@ "node": ">=10" } }, + "node_modules/response-time": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/response-time/-/response-time-2.3.2.tgz", + "integrity": "sha512-MUIDaDQf+CVqflfTdQ5yam+aYCkXj1PY8fjlPDQ6ppxJlmgZb864pHtA750mayywNg8tx4rS7qH9JXd/OF+3gw==", + "dependencies": { + "depd": "~1.1.0", + "on-headers": "~1.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/response-time/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/restore-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", @@ -10801,6 +12462,11 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/shimmer": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.1.tgz", + "integrity": "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==" + }, "node_modules/side-channel": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", @@ -11260,7 +12926,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, "engines": { "node": ">= 0.4" }, @@ -11298,6 +12963,31 @@ "url": "https://opencollective.com/unts" } }, + "node_modules/systeminformation": { + "version": "5.22.0", + "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-5.22.0.tgz", + "integrity": "sha512-oAP80ymt8ssrAzjX8k3frbL7ys6AotqC35oikG6/SG15wBw+tG9nCk4oPaXIhEaAOAZ8XngxUv3ORq2IuR3r4Q==", + "os": [ + "darwin", + "linux", + "win32", + "freebsd", + "openbsd", + "netbsd", + "sunos", + "android" + ], + "bin": { + "systeminformation": "lib/cli.js" + }, + "engines": { + "node": ">=8.0.0" + }, + "funding": { + "type": "Buy me a coffee", + "url": "https://www.buymeacoffee.com/systeminfo" + } + }, "node_modules/tapable": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", @@ -13537,11 +15227,123 @@ "lodash": "^4.17.21" } }, + "@grpc/grpc-js": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.10.1.tgz", + "integrity": "sha512-55ONqFytZExfOIjF1RjXPcVmT/jJqFzbbDqxK9jmRV4nxiYWtL9hENSW1Jfx0SdZfrvoqd44YJ/GJTqfRrawSQ==", + "requires": { + "@grpc/proto-loader": "^0.7.8", + "@types/node": ">=12.12.47" + } + }, + "@grpc/proto-loader": { + "version": "0.7.10", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.10.tgz", + "integrity": "sha512-CAqDfoaQ8ykFd9zqBDn4k6iWT9loLAlc2ETmDFS9JCD70gDcnA4L3AFEo2iV7KyAtAAHFW9ftq1Fz+Vsgq80RQ==", + "requires": { + "lodash.camelcase": "^4.3.0", + "long": "^5.0.0", + "protobufjs": "^7.2.4", + "yargs": "^17.7.2" + }, + "dependencies": { + "cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + } + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "requires": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + } + } + } + }, + "@hapi/b64": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@hapi/b64/-/b64-5.0.0.tgz", + "integrity": "sha512-ngu0tSEmrezoiIaNGG6rRvKOUkUuDdf4XTPnONHGYfSGRmDqPZX5oJL6HAdKTo1UQHECbdB4OzhWrfgVppjHUw==", + "requires": { + "@hapi/hoek": "9.x.x" + } + }, + "@hapi/boom": { + "version": "9.1.4", + "resolved": "https://registry.npmjs.org/@hapi/boom/-/boom-9.1.4.tgz", + "integrity": "sha512-Ls1oH8jaN1vNsqcaHVYJrKmgMcKsC1wcp8bujvXrHaAqD2iDYq3HoOwsxwo09Cuda5R5nC0o0IxlrlTuvPuzSw==", + "requires": { + "@hapi/hoek": "9.x.x" + } + }, + "@hapi/bourne": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-2.1.0.tgz", + "integrity": "sha512-i1BpaNDVLJdRBEKeJWkVO6tYX6DMFBuwMhSuWqLsY4ufeTKGVuV5rBsUhxPayXqnnWHgXUAmWK16H/ykO5Wj4Q==" + }, + "@hapi/cryptiles": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@hapi/cryptiles/-/cryptiles-5.1.0.tgz", + "integrity": "sha512-fo9+d1Ba5/FIoMySfMqPBR/7Pa29J2RsiPrl7bkwo5W5o+AN1dAYQRi4SPrPwwVxVGKjgLOEWrsvt1BonJSfLA==", + "requires": { + "@hapi/boom": "9.x.x" + } + }, "@hapi/hoek": { "version": "9.3.0", "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==" }, + "@hapi/iron": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@hapi/iron/-/iron-6.0.0.tgz", + "integrity": "sha512-zvGvWDufiTGpTJPG1Y/McN8UqWBu0k/xs/7l++HVU535NLHXsHhy54cfEMdW7EjwKfbBfM9Xy25FmTiobb7Hvw==", + "requires": { + "@hapi/b64": "5.x.x", + "@hapi/boom": "9.x.x", + "@hapi/bourne": "2.x.x", + "@hapi/cryptiles": "5.x.x", + "@hapi/hoek": "9.x.x" + } + }, + "@hapi/podium": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@hapi/podium/-/podium-4.1.3.tgz", + "integrity": "sha512-ljsKGQzLkFqnQxE7qeanvgGj4dejnciErYd30dbrYzUOF/FyS/DOF97qcrT3bhoVwCYmxa6PEMhxfCPlnUcD2g==", + "requires": { + "@hapi/hoek": "9.x.x", + "@hapi/teamwork": "5.x.x", + "@hapi/validate": "1.x.x" + } + }, + "@hapi/teamwork": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@hapi/teamwork/-/teamwork-5.1.1.tgz", + "integrity": "sha512-1oPx9AE5TIv+V6Ih54RP9lTZBso3rP8j4Xhb6iSVwPXtAM+sDopl5TFMv5Paw73UnpZJ9gjcrTE1BXrWt9eQrg==" + }, "@hapi/topo": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", @@ -13550,6 +15352,15 @@ "@hapi/hoek": "^9.0.0" } }, + "@hapi/validate": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@hapi/validate/-/validate-1.1.3.tgz", + "integrity": "sha512-/XMR0N0wjw0Twzq2pQOzPBZlDzkekGcoCtzO314BpIEsbXdYGthQUbxgkGDf4nhk1+IPDAsXqWjMohRQYO06UA==", + "requires": { + "@hapi/hoek": "^9.0.0", + "@hapi/topo": "^5.0.0" + } + }, "@humanwhocodes/config-array": { "version": "0.11.14", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", @@ -14492,6 +16303,738 @@ "node-fetch": "^2.6.1" } }, + "@opentelemetry/api": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.7.0.tgz", + "integrity": "sha512-AdY5wvN0P2vXBi3b29hxZgSFvdhdxPB9+f0B6s//P9Q8nibRWeA3cHm8UmLpio9ABigkVHJ5NMPk+Mz8VCCyrw==" + }, + "@opentelemetry/api-logs": { + "version": "0.48.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.48.0.tgz", + "integrity": "sha512-1/aMiU4Eqo3Zzpfwu51uXssp5pzvHFObk8S9pKAiXb1ne8pvg1qxBQitYL1XUiAMEXFzgjaidYG2V6624DRhhw==", + "requires": { + "@opentelemetry/api": "^1.0.0" + } + }, + "@opentelemetry/auto-instrumentations-node": { + "version": "0.41.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/auto-instrumentations-node/-/auto-instrumentations-node-0.41.1.tgz", + "integrity": "sha512-gQG0mHlPVBQveuemqNYkrL4IB3T6v2e5sMiDI6FQzFWeLzzFrC04R4fY6AE1YmkhOyteCDpHL/U6CULP2mkt8w==", + "requires": { + "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/instrumentation-amqplib": "^0.34.0", + "@opentelemetry/instrumentation-aws-lambda": "^0.38.0", + "@opentelemetry/instrumentation-aws-sdk": "^0.38.1", + "@opentelemetry/instrumentation-bunyan": "^0.35.0", + "@opentelemetry/instrumentation-cassandra-driver": "^0.35.0", + "@opentelemetry/instrumentation-connect": "^0.33.0", + "@opentelemetry/instrumentation-cucumber": "^0.3.0", + "@opentelemetry/instrumentation-dataloader": "^0.6.0", + "@opentelemetry/instrumentation-dns": "^0.33.0", + "@opentelemetry/instrumentation-express": "^0.35.0", + "@opentelemetry/instrumentation-fastify": "^0.33.0", + "@opentelemetry/instrumentation-fs": "^0.9.0", + "@opentelemetry/instrumentation-generic-pool": "^0.33.0", + "@opentelemetry/instrumentation-graphql": "^0.37.0", + "@opentelemetry/instrumentation-grpc": "^0.48.0", + "@opentelemetry/instrumentation-hapi": "^0.34.0", + "@opentelemetry/instrumentation-http": "^0.48.0", + "@opentelemetry/instrumentation-ioredis": "^0.37.0", + "@opentelemetry/instrumentation-knex": "^0.33.0", + "@opentelemetry/instrumentation-koa": "^0.37.0", + "@opentelemetry/instrumentation-lru-memoizer": "^0.34.0", + "@opentelemetry/instrumentation-memcached": "^0.33.0", + "@opentelemetry/instrumentation-mongodb": "^0.39.0", + "@opentelemetry/instrumentation-mongoose": "^0.35.0", + "@opentelemetry/instrumentation-mysql": "^0.35.0", + "@opentelemetry/instrumentation-mysql2": "^0.35.0", + "@opentelemetry/instrumentation-nestjs-core": "^0.34.0", + "@opentelemetry/instrumentation-net": "^0.33.0", + "@opentelemetry/instrumentation-pg": "^0.38.0", + "@opentelemetry/instrumentation-pino": "^0.35.0", + "@opentelemetry/instrumentation-redis": "^0.36.0", + "@opentelemetry/instrumentation-redis-4": "^0.36.0", + "@opentelemetry/instrumentation-restify": "^0.35.0", + "@opentelemetry/instrumentation-router": "^0.34.0", + "@opentelemetry/instrumentation-socket.io": "^0.36.0", + "@opentelemetry/instrumentation-tedious": "^0.7.0", + "@opentelemetry/instrumentation-winston": "^0.34.0", + "@opentelemetry/resource-detector-alibaba-cloud": "^0.28.6", + "@opentelemetry/resource-detector-aws": "^1.3.6", + "@opentelemetry/resource-detector-container": "^0.3.6", + "@opentelemetry/resource-detector-gcp": "^0.29.6", + "@opentelemetry/resources": "^1.12.0", + "@opentelemetry/sdk-node": "^0.48.0" + } + }, + "@opentelemetry/context-async-hooks": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-1.21.0.tgz", + "integrity": "sha512-t0iulGPiMjG/NrSjinPQoIf8ST/o9V0dGOJthfrFporJlNdlKIQPfC7lkrV+5s2dyBThfmSbJlp/4hO1eOcDXA==", + "requires": {} + }, + "@opentelemetry/core": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.21.0.tgz", + "integrity": "sha512-KP+OIweb3wYoP7qTYL/j5IpOlu52uxBv5M4+QhSmmUfLyTgu1OIS71msK3chFo1D6Y61BIH3wMiMYRCxJCQctA==", + "requires": { + "@opentelemetry/semantic-conventions": "1.21.0" + } + }, + "@opentelemetry/exporter-prometheus": { + "version": "0.48.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-prometheus/-/exporter-prometheus-0.48.0.tgz", + "integrity": "sha512-n1cSdC7/AWkyTZD5WgK4FP0oxgRZUIjjquM6QqNOX9TLALbsg5RxiiBCqiHcbmABt7ZABZKhd8OH3t/GqTayLw==", + "requires": { + "@opentelemetry/core": "1.21.0", + "@opentelemetry/resources": "1.21.0", + "@opentelemetry/sdk-metrics": "1.21.0" + } + }, + "@opentelemetry/exporter-trace-otlp-grpc": { + "version": "0.48.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-grpc/-/exporter-trace-otlp-grpc-0.48.0.tgz", + "integrity": "sha512-+qRQXUbdRW6aNRT5yWOG3G6My1VxxKeqgUyLkkdIjkT20lvymjiN2RpBfGMtAf/oqnuRknf9snFl9VSIO2gniw==", + "requires": { + "@grpc/grpc-js": "^1.7.1", + "@opentelemetry/core": "1.21.0", + "@opentelemetry/otlp-grpc-exporter-base": "0.48.0", + "@opentelemetry/otlp-transformer": "0.48.0", + "@opentelemetry/resources": "1.21.0", + "@opentelemetry/sdk-trace-base": "1.21.0" + } + }, + "@opentelemetry/exporter-trace-otlp-http": { + "version": "0.48.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-http/-/exporter-trace-otlp-http-0.48.0.tgz", + "integrity": "sha512-QEZKbfWqXrbKVpr2PHd4KyKI0XVOhUYC+p2RPV8s+2K5QzZBE3+F9WlxxrXDfkrvGmpQAZytBoHQQYA3AGOtpw==", + "requires": { + "@opentelemetry/core": "1.21.0", + "@opentelemetry/otlp-exporter-base": "0.48.0", + "@opentelemetry/otlp-transformer": "0.48.0", + "@opentelemetry/resources": "1.21.0", + "@opentelemetry/sdk-trace-base": "1.21.0" + } + }, + "@opentelemetry/exporter-trace-otlp-proto": { + "version": "0.48.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-proto/-/exporter-trace-otlp-proto-0.48.0.tgz", + "integrity": "sha512-hVXr/8DYlAKAzQYMsCf3ZsGweS6NTK3IHIEqmLokJZYcvJQBEEazeAdISfrL/utWnapg1Qnpw8u+W6SpxNzmTw==", + "requires": { + "@opentelemetry/core": "1.21.0", + "@opentelemetry/otlp-exporter-base": "0.48.0", + "@opentelemetry/otlp-proto-exporter-base": "0.48.0", + "@opentelemetry/otlp-transformer": "0.48.0", + "@opentelemetry/resources": "1.21.0", + "@opentelemetry/sdk-trace-base": "1.21.0" + } + }, + "@opentelemetry/exporter-zipkin": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-zipkin/-/exporter-zipkin-1.21.0.tgz", + "integrity": "sha512-J0ejrOx52s1PqvjNalIHvY/4v9ZxR2r7XS7WZbwK3qpVYZlGVq5V1+iCNweqsKnb/miUt/4TFvJBc9f5Q/kGcA==", + "requires": { + "@opentelemetry/core": "1.21.0", + "@opentelemetry/resources": "1.21.0", + "@opentelemetry/sdk-trace-base": "1.21.0", + "@opentelemetry/semantic-conventions": "1.21.0" + } + }, + "@opentelemetry/host-metrics": { + "version": "0.32.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/host-metrics/-/host-metrics-0.32.2.tgz", + "integrity": "sha512-zrnls0CWMAYEUHQbdplY0M6v3L/cgEoiwpjAnHAaG7M3ICs7K4/Hms1UlVMDydEvNDkQilx63scpDcE1/M5V4A==", + "requires": { + "@opentelemetry/sdk-metrics": "^1.8.0", + "systeminformation": "^5.0.0" + } + }, + "@opentelemetry/instrumentation": { + "version": "0.48.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.48.0.tgz", + "integrity": "sha512-sjtZQB5PStIdCw5ovVTDGwnmQC+GGYArJNgIcydrDSqUTdYBnMrN9P4pwQZgS3vTGIp+TU1L8vMXGe51NVmIKQ==", + "requires": { + "@types/shimmer": "^1.0.2", + "import-in-the-middle": "1.7.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" + } + }, + "@opentelemetry/instrumentation-amqplib": { + "version": "0.34.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-amqplib/-/instrumentation-amqplib-0.34.0.tgz", + "integrity": "sha512-lVGRkyGnjFJv9O8oO/+uT40nrNj4UO+UN0k8708guy/toVgxsVpv4PtdWJTjbtu89UDk9gUxq62jpHxqrVaNnw==", + "requires": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/semantic-conventions": "^1.0.0" + } + }, + "@opentelemetry/instrumentation-aws-lambda": { + "version": "0.38.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-aws-lambda/-/instrumentation-aws-lambda-0.38.0.tgz", + "integrity": "sha512-MIPvM8S4LqGKE+IAnYVCRUnEjaWbPsbqL4p2BnGcox08e6+JQe+0d16DI0cKVSFZOzV5T/or3ewQ/bB0lPm8yg==", + "requires": { + "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/propagator-aws-xray": "^1.3.1", + "@opentelemetry/resources": "^1.8.0", + "@opentelemetry/semantic-conventions": "^1.0.0", + "@types/aws-lambda": "8.10.122" + } + }, + "@opentelemetry/instrumentation-aws-sdk": { + "version": "0.38.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-aws-sdk/-/instrumentation-aws-sdk-0.38.1.tgz", + "integrity": "sha512-/Tupb4UfVVkmcopq2H2nr2D/pHLF0riVw2biQQUJ/jGIkfrOgUMMKbShi2RQE4Zy8NFv3xaDn4/pNxzodLBy3w==", + "requires": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/propagation-utils": "^0.30.6", + "@opentelemetry/semantic-conventions": "^1.0.0" + } + }, + "@opentelemetry/instrumentation-bunyan": { + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-bunyan/-/instrumentation-bunyan-0.35.0.tgz", + "integrity": "sha512-bQ8OzV7nVTA+oGiTzLjUmRFAbnXi0U/Z4VJCpj+1DRsaAaMT17eRpAOh22LQR0JBnv2vBm8CvIQl4CcAnsB46g==", + "requires": { + "@opentelemetry/api-logs": "^0.48.0", + "@opentelemetry/instrumentation": "^0.48.0", + "@types/bunyan": "1.8.9" + } + }, + "@opentelemetry/instrumentation-cassandra-driver": { + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-cassandra-driver/-/instrumentation-cassandra-driver-0.35.0.tgz", + "integrity": "sha512-NlJkEiP37/WQvtSyYe4zxaBcaoweO/2+UtDssldk9NFmFutLHyMT/P5q5fe8i73ylmkPOAZnN8P48oHOhZHM1g==", + "requires": { + "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/semantic-conventions": "^1.0.0" + } + }, + "@opentelemetry/instrumentation-connect": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-connect/-/instrumentation-connect-0.33.0.tgz", + "integrity": "sha512-EAMmUC2/KfeZl4qNgUsiVqT5Jti0jDl4GHi4TpDg41VBEJkRX/0+JcPBWgdFUgEfeiZr0GPVQud4i8jAwJ+ORw==", + "requires": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/semantic-conventions": "^1.0.0", + "@types/connect": "3.4.36" + } + }, + "@opentelemetry/instrumentation-cucumber": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-cucumber/-/instrumentation-cucumber-0.3.0.tgz", + "integrity": "sha512-nM9BL0t2Nxwbb41MXxNXTDL0zq7FXhOX9F3OiAqYUJHqb7BHyzV9KoQ+Ao1BjqJR91hUm1OFNgHAk3y8uiuq4w==", + "requires": { + "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/semantic-conventions": "^1.0.0" + } + }, + "@opentelemetry/instrumentation-dataloader": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-dataloader/-/instrumentation-dataloader-0.6.0.tgz", + "integrity": "sha512-jkPdn83WV/TcnhQ5bOIoYcJGvMxXyYlCzbqfuB6HsMqf3CqpdgBQYlMuKi6qIfD4QWYt2R992yglNxPLuJ7xeg==", + "requires": { + "@opentelemetry/instrumentation": "^0.48.0" + } + }, + "@opentelemetry/instrumentation-dns": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-dns/-/instrumentation-dns-0.33.0.tgz", + "integrity": "sha512-QDJadJOQg9CLqMC79r4T5ugN4C4lb6eJYLmHgnLg3fh1JUGfyjQHtD3T7lH0P8251Mnt5m8zjDDbPKcqK2aGcw==", + "requires": { + "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/semantic-conventions": "^1.0.0", + "semver": "^7.5.4" + } + }, + "@opentelemetry/instrumentation-express": { + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-express/-/instrumentation-express-0.35.0.tgz", + "integrity": "sha512-ZmSB4WMd88sSecOL7DlghzdBl56/8ymb02n+xEJ/6zUgONuw/1uoTh1TAaNPKfEWdNLoLKXQm+Gd2zBrUVOX0w==", + "requires": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/semantic-conventions": "^1.0.0" + } + }, + "@opentelemetry/instrumentation-fastify": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-fastify/-/instrumentation-fastify-0.33.0.tgz", + "integrity": "sha512-sl3q9Mt+yM6GlZJKhfLUIRrVEYqfmI0hqYLha5OFG5rLrgnZCCZVy8ra4+Pa40ecH1409cvwwBPf7k9AHEQBTw==", + "requires": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/semantic-conventions": "^1.0.0" + } + }, + "@opentelemetry/instrumentation-fs": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-fs/-/instrumentation-fs-0.9.0.tgz", + "integrity": "sha512-Xp31lb2Sj50ppsJ393650HxSi5IJIgddXxrUeVljmsabdmECPUj0YAt/Wwb1oIHFn04iL9Tq4VkF/otlLaI9ww==", + "requires": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/semantic-conventions": "^1.0.0" + } + }, + "@opentelemetry/instrumentation-generic-pool": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-generic-pool/-/instrumentation-generic-pool-0.33.0.tgz", + "integrity": "sha512-QMSSOfIqMJhXqFryLVbAMsgRktNHdhMEpsOgEiHurLfvAJhyEOBcTTUuo6Laqt50IIzIm3YuHL9ZtEl9fve2ag==", + "requires": { + "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/semantic-conventions": "^1.0.0" + } + }, + "@opentelemetry/instrumentation-graphql": { + "version": "0.37.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-graphql/-/instrumentation-graphql-0.37.0.tgz", + "integrity": "sha512-WL5Qn1aRudJDxVN0Ao73/yzXBGBJAH1Fd2tteuGXku/Qw9hYQ936CgoO66GWmSiq2lyjsojAk1t5f+HF9j3NXw==", + "requires": { + "@opentelemetry/instrumentation": "^0.48.0" + } + }, + "@opentelemetry/instrumentation-grpc": { + "version": "0.48.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-grpc/-/instrumentation-grpc-0.48.0.tgz", + "integrity": "sha512-MmJHkbqaulqfECjotRtco9AXOq+D1HLq53wI7UFeE8bl8kISP9iMkt+A7PrtPFpRGCglwFvSa0djId6EWsP0DQ==", + "requires": { + "@opentelemetry/instrumentation": "0.48.0", + "@opentelemetry/semantic-conventions": "1.21.0" + } + }, + "@opentelemetry/instrumentation-hapi": { + "version": "0.34.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-hapi/-/instrumentation-hapi-0.34.0.tgz", + "integrity": "sha512-qUENVxwCYbRbJ8HBY54ZL1Z9q1guCEurW6tCFFJJKQFu/MKEw7GSFImy5DR2Mp8b5ggZO36lYFcx0QUxfy4GJg==", + "requires": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/semantic-conventions": "^1.0.0", + "@types/hapi__hapi": "20.0.13" + } + }, + "@opentelemetry/instrumentation-http": { + "version": "0.48.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-http/-/instrumentation-http-0.48.0.tgz", + "integrity": "sha512-uXqOsLhW9WC3ZlGm6+PSX0xjSDTCfy4CMjfYj6TPWusOO8dtdx040trOriF24y+sZmS3M+5UQc6/3/ZxBJh4Mw==", + "requires": { + "@opentelemetry/core": "1.21.0", + "@opentelemetry/instrumentation": "0.48.0", + "@opentelemetry/semantic-conventions": "1.21.0", + "semver": "^7.5.2" + } + }, + "@opentelemetry/instrumentation-ioredis": { + "version": "0.37.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-ioredis/-/instrumentation-ioredis-0.37.0.tgz", + "integrity": "sha512-xBPfu03IIG8x1pmt1Dx+XrBO4ZB4UjEcrouGbp6eV3dLQ7eJPYZgfNXmsqkpsxgNQuVCi2a3WEAwZ5Wl2hk7Vw==", + "requires": { + "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/redis-common": "^0.36.1", + "@opentelemetry/semantic-conventions": "^1.0.0", + "@types/ioredis4": "npm:@types/ioredis@^4.28.10" + } + }, + "@opentelemetry/instrumentation-knex": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-knex/-/instrumentation-knex-0.33.0.tgz", + "integrity": "sha512-7L3Q8Yy5vY4W4zpRrjKEc0OpVPYyERtDz5dAumKjkJsEVPANr7E8Cc+No6VjZGeN+HgFFwEo+jcQCTWJzdxvRw==", + "requires": { + "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/semantic-conventions": "^1.0.0" + } + }, + "@opentelemetry/instrumentation-koa": { + "version": "0.37.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-koa/-/instrumentation-koa-0.37.0.tgz", + "integrity": "sha512-EfuGv1RJCSZh77dDc3PtvZXGwcsTufn9tU6T9VOTFcxovpyJ6w0og73eD0D02syR8R+kzv6rg1TeS8+lj7pyrQ==", + "requires": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/semantic-conventions": "^1.0.0", + "@types/koa": "2.14.0", + "@types/koa__router": "12.0.3" + } + }, + "@opentelemetry/instrumentation-lru-memoizer": { + "version": "0.34.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-lru-memoizer/-/instrumentation-lru-memoizer-0.34.0.tgz", + "integrity": "sha512-m1kXrc11XNj7cC6sfcsYqd+kuCcN2wI9LXpB2l2BZCogqxHCgjuVoiXvT6K9LfO4tLefcvhoK0N8XuVJ8xyyOw==", + "requires": { + "@opentelemetry/instrumentation": "^0.48.0" + } + }, + "@opentelemetry/instrumentation-memcached": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-memcached/-/instrumentation-memcached-0.33.0.tgz", + "integrity": "sha512-TdGT5ytt8o7FTIsQvx010ykYbqu+IfGoOKA+IXLHdX1+l7vFWyv3ZOzQbRDmA4rxujJAAPf/n4/D7QECyedE/g==", + "requires": { + "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/semantic-conventions": "^1.0.0", + "@types/memcached": "^2.2.6" + } + }, + "@opentelemetry/instrumentation-mongodb": { + "version": "0.39.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongodb/-/instrumentation-mongodb-0.39.0.tgz", + "integrity": "sha512-m9dMj39pcCshzlfCEn2lGrlNo7eV5fb9pGBnPyl/Am9Crh7Or8vOqvByCNd26Dgf5J978zTdLGF+6tM8j1WOew==", + "requires": { + "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/sdk-metrics": "^1.9.1", + "@opentelemetry/semantic-conventions": "^1.0.0" + } + }, + "@opentelemetry/instrumentation-mongoose": { + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongoose/-/instrumentation-mongoose-0.35.0.tgz", + "integrity": "sha512-gReBMWD2Oa/wBGRWyg6B2dbPHhgkpOqDio31gE3DbC4JaqCsMByyeix75rZSzZ71RQmVh3d4jRLsqUtNVBzcyg==", + "requires": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/semantic-conventions": "^1.0.0" + } + }, + "@opentelemetry/instrumentation-mysql": { + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql/-/instrumentation-mysql-0.35.0.tgz", + "integrity": "sha512-QKRHd3aFA2vKOPzIZ9Q3UIxYeNPweB62HGlX2l3shOKrUhrtTg2/BzaKpHQBy2f2nO2mxTF/mOFeVEDeANnhig==", + "requires": { + "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/semantic-conventions": "^1.0.0", + "@types/mysql": "2.15.22" + } + }, + "@opentelemetry/instrumentation-mysql2": { + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql2/-/instrumentation-mysql2-0.35.0.tgz", + "integrity": "sha512-DI9NXYJBbQ72rjz1KCKerQFQE+Z4xRDoyYek6JpITv5BlhPboA8zKkltxyQLL06Y2RTFYslw1gvg+x9CWlRzJw==", + "requires": { + "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/semantic-conventions": "^1.0.0", + "@opentelemetry/sql-common": "^0.40.0" + } + }, + "@opentelemetry/instrumentation-nestjs-core": { + "version": "0.34.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-nestjs-core/-/instrumentation-nestjs-core-0.34.0.tgz", + "integrity": "sha512-HvbcCVAMZEIFrJ0Si9AfjxOr14KcH5h/lq5zLQ8AjZJpW0WaeO/ox5UgFi3J73Br91WbZHRgbXxMeodNycJJuA==", + "requires": { + "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/semantic-conventions": "^1.0.0" + } + }, + "@opentelemetry/instrumentation-net": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-net/-/instrumentation-net-0.33.0.tgz", + "integrity": "sha512-x6awrqF0YfEhGGNE2JtEWvB+zEls7mFvLDii54DnWxpQU69+AqKCW/ZwC91EDefOMGSYBckL0uEn6XNOgkTTbw==", + "requires": { + "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/semantic-conventions": "^1.0.0" + } + }, + "@opentelemetry/instrumentation-pg": { + "version": "0.38.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pg/-/instrumentation-pg-0.38.0.tgz", + "integrity": "sha512-Q7V/OJ1OZwaWYNOP/E9S6sfS03Z+PNU1SAjdAoXTj5j4u4iJSMSieLRWXFaHwsbefIOMkYvA00EBKF9IgbgbLA==", + "requires": { + "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/semantic-conventions": "^1.0.0", + "@opentelemetry/sql-common": "^0.40.0", + "@types/pg": "8.6.1", + "@types/pg-pool": "2.0.4" + }, + "dependencies": { + "@types/pg": { + "version": "8.6.1", + "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.6.1.tgz", + "integrity": "sha512-1Kc4oAGzAl7uqUStZCDvaLFqZrW9qWSjXOmBfdgyBP5La7Us6Mg4GBvRlSoaZMhQF/zSj1C8CtKMBkoiT8eL8w==", + "requires": { + "@types/node": "*", + "pg-protocol": "*", + "pg-types": "^2.2.0" + } + } + } + }, + "@opentelemetry/instrumentation-pino": { + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pino/-/instrumentation-pino-0.35.0.tgz", + "integrity": "sha512-gMfJ5Qy793mbaAGnQE3yp1Cb0y4np74rBPu20Oy/v8TTgPQOEV5PyNI0GNGggmZQIJSkdtYa8Ndb3huH3iZE5g==", + "requires": { + "@opentelemetry/instrumentation": "^0.48.0" + } + }, + "@opentelemetry/instrumentation-redis": { + "version": "0.36.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-redis/-/instrumentation-redis-0.36.0.tgz", + "integrity": "sha512-rKFylIacEBwLxKFrPvxpVi8hHY9qXfQSybYnYNyF/VxUWMGYDPMpbCnTQkiVR5u+tIhwSvhSDG2YQEq6syHUIQ==", + "requires": { + "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/redis-common": "^0.36.1", + "@opentelemetry/semantic-conventions": "^1.0.0" + } + }, + "@opentelemetry/instrumentation-redis-4": { + "version": "0.36.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-redis-4/-/instrumentation-redis-4-0.36.0.tgz", + "integrity": "sha512-XO0EV2TxUsaRdcp79blyLGG5JWWl7NWVd/XNbU8vY7CuYUfRhWiTXYoM4PI+lwkAnUPvPtyiOzYs9px23GnibA==", + "requires": { + "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/redis-common": "^0.36.1", + "@opentelemetry/semantic-conventions": "^1.0.0" + } + }, + "@opentelemetry/instrumentation-restify": { + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-restify/-/instrumentation-restify-0.35.0.tgz", + "integrity": "sha512-0ghtxsGJxHEwJfIzxDN3FCbNiTXqwv2jV6ip716jyjWN3f6MuRHm7NPWI/KNvu+IjqDj16KRGZG7nUAEB1ojog==", + "requires": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/semantic-conventions": "^1.0.0" + } + }, + "@opentelemetry/instrumentation-router": { + "version": "0.34.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-router/-/instrumentation-router-0.34.0.tgz", + "integrity": "sha512-7LsonkdnQi35eF7CWl8394QDgyd811gCawJ6QuS8GbWNIvZ3S2f9j+Zy0fWSmFgO28ruW1pUG51ql8xdXWa8TA==", + "requires": { + "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/semantic-conventions": "^1.0.0" + } + }, + "@opentelemetry/instrumentation-socket.io": { + "version": "0.36.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-socket.io/-/instrumentation-socket.io-0.36.0.tgz", + "integrity": "sha512-c9Zc6WKxTZtMaOj01kmJGLKabEj805YgTav4l9vgojHrf6MH1fTlw+SGvOKhfPfzmu2QhNORAfqPAB1poDwqEQ==", + "requires": { + "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/semantic-conventions": "^1.0.0" + } + }, + "@opentelemetry/instrumentation-tedious": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-tedious/-/instrumentation-tedious-0.7.0.tgz", + "integrity": "sha512-o/5my8ZOuxACPSzMaXdPnQiMpmOPIJoTj+DRcs4vEJxk+KwlVNucoafSMpWQEyTNNuq2JI87Ru6Di2mp5T20EQ==", + "requires": { + "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/semantic-conventions": "^1.0.0", + "@types/tedious": "^4.0.10" + } + }, + "@opentelemetry/instrumentation-winston": { + "version": "0.34.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-winston/-/instrumentation-winston-0.34.0.tgz", + "integrity": "sha512-Ejssv6Uih7ipoNGYQLXd+cKZdEfTfTJ/vzpUSeYiJZ36mVYER1f8fs9Kb7jTKjHD55g2s6cUJj9lifbDFI4EEw==", + "requires": { + "@opentelemetry/instrumentation": "^0.48.0" + } + }, + "@opentelemetry/otlp-exporter-base": { + "version": "0.48.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.48.0.tgz", + "integrity": "sha512-T4LJND+Ugl87GUONoyoQzuV9qCn4BFIPOnCH1biYqdGhc2JahjuLqVD9aefwLzGBW638iLAo88Lh68h2F1FLiA==", + "requires": { + "@opentelemetry/core": "1.21.0" + } + }, + "@opentelemetry/otlp-grpc-exporter-base": { + "version": "0.48.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-grpc-exporter-base/-/otlp-grpc-exporter-base-0.48.0.tgz", + "integrity": "sha512-Vdp56RK9OU+Oeoy3YQC/UMOWglKQ9qvgGr49FgF4r8vk5DlcTUgVS0m3KG8pykmRPA+5ZKaDuqwPw5aTvWmHFw==", + "requires": { + "@grpc/grpc-js": "^1.7.1", + "@opentelemetry/core": "1.21.0", + "@opentelemetry/otlp-exporter-base": "0.48.0", + "protobufjs": "^7.2.3" + } + }, + "@opentelemetry/otlp-proto-exporter-base": { + "version": "0.48.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-proto-exporter-base/-/otlp-proto-exporter-base-0.48.0.tgz", + "integrity": "sha512-14GSTvPZPfrWsB54fYMGb8v+Uge5xGXyz0r2rf4SzcRnO2hXCPHEuL3yyL50emaKPAY+fj29Dm0bweawe8UA6A==", + "requires": { + "@opentelemetry/core": "1.21.0", + "@opentelemetry/otlp-exporter-base": "0.48.0", + "protobufjs": "^7.2.3" + } + }, + "@opentelemetry/otlp-transformer": { + "version": "0.48.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.48.0.tgz", + "integrity": "sha512-yuoS4cUumaTK/hhxW3JUy3wl2U4keMo01cFDrUOmjloAdSSXvv1zyQ920IIH4lymp5Xd21Dj2/jq2LOro56TJg==", + "requires": { + "@opentelemetry/api-logs": "0.48.0", + "@opentelemetry/core": "1.21.0", + "@opentelemetry/resources": "1.21.0", + "@opentelemetry/sdk-logs": "0.48.0", + "@opentelemetry/sdk-metrics": "1.21.0", + "@opentelemetry/sdk-trace-base": "1.21.0" + } + }, + "@opentelemetry/propagation-utils": { + "version": "0.30.6", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagation-utils/-/propagation-utils-0.30.6.tgz", + "integrity": "sha512-qvnYee5I/xrBY5XClUlOASIOdoTbnFGNI6+ViKqdoErF2xKmhysXcmxlJNzQFNDK0muTfjvJMZcFyEielARk7g==", + "requires": {} + }, + "@opentelemetry/propagator-aws-xray": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-aws-xray/-/propagator-aws-xray-1.3.1.tgz", + "integrity": "sha512-6fDMzFlt5r6VWv7MUd0eOpglXPFqykW8CnOuUxJ1VZyLy6mV1bzBlzpsqEmhx1bjvZYvH93vhGkQZqrm95mlrQ==", + "requires": { + "@opentelemetry/core": "^1.0.0" + } + }, + "@opentelemetry/propagator-b3": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-b3/-/propagator-b3-1.21.0.tgz", + "integrity": "sha512-3ZTobj2VDIOzLsIvvYCdpw6tunxUVElPxDvog9lS49YX4hohHeD84A8u9Ns/6UYUcaN5GSoEf891lzhcBFiOLA==", + "requires": { + "@opentelemetry/core": "1.21.0" + } + }, + "@opentelemetry/propagator-jaeger": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-jaeger/-/propagator-jaeger-1.21.0.tgz", + "integrity": "sha512-8TQSwXjBmaDx7JkxRD7hdmBmRK2RGRgzHX1ArJfJhIc5trzlVweyorzqQrXOvqVEdEg+zxUMHkL5qbGH/HDTPA==", + "requires": { + "@opentelemetry/core": "1.21.0" + } + }, + "@opentelemetry/redis-common": { + "version": "0.36.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/redis-common/-/redis-common-0.36.1.tgz", + "integrity": "sha512-YjfNEr7DK1Ymc5H0bzhmqVvMcCs+PUEUerzrpTFdHfZxj3HpnnjZTIFKx/gxiL/sajQ8dxycjlreoYTVYKBXlw==" + }, + "@opentelemetry/resource-detector-alibaba-cloud": { + "version": "0.28.6", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-alibaba-cloud/-/resource-detector-alibaba-cloud-0.28.6.tgz", + "integrity": "sha512-VuJXc+oDQ/SYRHBCQbEshl0WJtEMvgfSkTDBq+WSxj6y9sKe0HCt55Sxeb5nLmBdtCYWMQFniHe2K4GLSjDZVw==", + "requires": { + "@opentelemetry/resources": "^1.0.0", + "@opentelemetry/semantic-conventions": "^1.0.0" + } + }, + "@opentelemetry/resource-detector-aws": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-aws/-/resource-detector-aws-1.3.6.tgz", + "integrity": "sha512-hFJ19yFwChqGCv1uMkXtjZU9BG8GcChe8cRCAkGWg1RZADse5S2ausf3D8pYw1cR3ktJtuAmRrGZniT6TDUPDw==", + "requires": { + "@opentelemetry/core": "^1.0.0", + "@opentelemetry/resources": "^1.0.0", + "@opentelemetry/semantic-conventions": "^1.0.0" + } + }, + "@opentelemetry/resource-detector-container": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-container/-/resource-detector-container-0.3.6.tgz", + "integrity": "sha512-psxtzQakVuZKFl/ukn+nPW4Ixn+KPHGsWJMYKndmXrsgdFri78X+MHR0wLOO41Zn79sc35DiSk+GdJ24cCylbg==", + "requires": { + "@opentelemetry/resources": "^1.0.0", + "@opentelemetry/semantic-conventions": "^1.0.0" + } + }, + "@opentelemetry/resource-detector-gcp": { + "version": "0.29.6", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-gcp/-/resource-detector-gcp-0.29.6.tgz", + "integrity": "sha512-cx03fXPknmiVW0hpWAJr0Nr8xwkwRB8VNWPvNrmP7UzJ8eEztY9lHnVke4ZVFaVGvm/4EFxk2y5hPNggbIezoA==", + "requires": { + "@opentelemetry/core": "^1.0.0", + "@opentelemetry/resources": "^1.0.0", + "@opentelemetry/semantic-conventions": "^1.0.0", + "gcp-metadata": "^6.0.0" + } + }, + "@opentelemetry/resources": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.21.0.tgz", + "integrity": "sha512-1Z86FUxPKL6zWVy2LdhueEGl9AHDJcx+bvHStxomruz6Whd02mE3lNUMjVJ+FGRoktx/xYQcxccYb03DiUP6Yw==", + "requires": { + "@opentelemetry/core": "1.21.0", + "@opentelemetry/semantic-conventions": "1.21.0" + } + }, + "@opentelemetry/sdk-logs": { + "version": "0.48.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.48.0.tgz", + "integrity": "sha512-lRcA5/qkSJuSh4ItWCddhdn/nNbVvnzM+cm9Fg1xpZUeTeozjJDBcHnmeKoOaWRnrGYBdz6UTY6bynZR9aBeAA==", + "requires": { + "@opentelemetry/core": "1.21.0", + "@opentelemetry/resources": "1.21.0" + } + }, + "@opentelemetry/sdk-metrics": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-1.21.0.tgz", + "integrity": "sha512-on1jTzIHc5DyWhRP+xpf+zrgrREXcHBH4EDAfaB5mIG7TWpKxNXooQ1JCylaPsswZUv4wGnVTinr4HrBdGARAQ==", + "requires": { + "@opentelemetry/core": "1.21.0", + "@opentelemetry/resources": "1.21.0", + "lodash.merge": "^4.6.2" + } + }, + "@opentelemetry/sdk-node": { + "version": "0.48.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-node/-/sdk-node-0.48.0.tgz", + "integrity": "sha512-3o3GS6t+VLGVFCV5bqfGOcWIgOdkR/UE6Qz7hHksP5PXrVBeYsPqts7cPma5YXweaI3r3h26mydg9PqQIcqksg==", + "requires": { + "@opentelemetry/api-logs": "0.48.0", + "@opentelemetry/core": "1.21.0", + "@opentelemetry/exporter-trace-otlp-grpc": "0.48.0", + "@opentelemetry/exporter-trace-otlp-http": "0.48.0", + "@opentelemetry/exporter-trace-otlp-proto": "0.48.0", + "@opentelemetry/exporter-zipkin": "1.21.0", + "@opentelemetry/instrumentation": "0.48.0", + "@opentelemetry/resources": "1.21.0", + "@opentelemetry/sdk-logs": "0.48.0", + "@opentelemetry/sdk-metrics": "1.21.0", + "@opentelemetry/sdk-trace-base": "1.21.0", + "@opentelemetry/sdk-trace-node": "1.21.0", + "@opentelemetry/semantic-conventions": "1.21.0" + } + }, + "@opentelemetry/sdk-trace-base": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.21.0.tgz", + "integrity": "sha512-yrElGX5Fv0umzp8Nxpta/XqU71+jCAyaLk34GmBzNcrW43nqbrqvdPs4gj4MVy/HcTjr6hifCDCYA3rMkajxxA==", + "requires": { + "@opentelemetry/core": "1.21.0", + "@opentelemetry/resources": "1.21.0", + "@opentelemetry/semantic-conventions": "1.21.0" + } + }, + "@opentelemetry/sdk-trace-node": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-node/-/sdk-trace-node-1.21.0.tgz", + "integrity": "sha512-1pdm8jnqs+LuJ0Bvx6sNL28EhC8Rv7NYV8rnoXq3GIQo7uOHBDAFSj7makAfbakrla7ecO1FRfI8emnR4WvhYA==", + "requires": { + "@opentelemetry/context-async-hooks": "1.21.0", + "@opentelemetry/core": "1.21.0", + "@opentelemetry/propagator-b3": "1.21.0", + "@opentelemetry/propagator-jaeger": "1.21.0", + "@opentelemetry/sdk-trace-base": "1.21.0", + "semver": "^7.5.2" + } + }, + "@opentelemetry/semantic-conventions": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.21.0.tgz", + "integrity": "sha512-lkC8kZYntxVKr7b8xmjCVUgE0a8xgDakPyDo9uSWavXPyYqLgYYGdEd2j8NxihRyb6UwpX3G/hFUF4/9q2V+/g==" + }, + "@opentelemetry/sql-common": { + "version": "0.40.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sql-common/-/sql-common-0.40.0.tgz", + "integrity": "sha512-vSqRJYUPJVjMFQpYkQS3ruexCPSZJ8esne3LazLwtCPaPRvzZ7WG3tX44RouAn7w4wMp8orKguBqtt+ng2UTnw==", + "requires": { + "@opentelemetry/core": "^1.1.0" + } + }, "@photostructure/tz-lookup": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/@photostructure/tz-lookup/-/tz-lookup-9.0.1.tgz", @@ -14514,6 +17057,60 @@ "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.25.tgz", "integrity": "sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==" }, + "@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" + }, + "@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" + }, + "@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "requires": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" + }, + "@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" + }, + "@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" + }, + "@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" + }, + "@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" + }, "@sideway/address": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz", @@ -14632,6 +17229,14 @@ "@turf/helpers": "^6.5.0" } }, + "@types/accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/@types/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Pay9fq2lM2wXPWbteBsRAGiWH2hig4ZE2asK+mm7kUzlxRTfL961rj89I6zV/E3PcIkDqyuBEcMxFT7rccugeQ==", + "requires": { + "@types/node": "*" + } + }, "@types/archiver": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/@types/archiver/-/archiver-6.0.2.tgz", @@ -14647,6 +17252,11 @@ "integrity": "sha512-HlZ6Dcr205BmNhwkdXqrg2vkFMN2PluI7Lgr8In3B3wE5PiQHhjRqtW/lGdVU9gw+sM0JcIDx2AN+cW8oSWIcw==", "dev": true }, + "@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==" + }, "@types/babel__core": { "version": "7.20.2", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.2.tgz", @@ -14701,21 +17311,32 @@ "version": "1.19.3", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.3.tgz", "integrity": "sha512-oyl4jvAfTGX9Bt6Or4H9ni1Z447/tQuxnZsytsCaExKlmJiU8sFgnIBRzJUpKwB5eWn9HuBYlUlVA74q/yN0eQ==", - "dev": true, "requires": { "@types/connect": "*", "@types/node": "*" } }, + "@types/bunyan": { + "version": "1.8.9", + "resolved": "https://registry.npmjs.org/@types/bunyan/-/bunyan-1.8.9.tgz", + "integrity": "sha512-ZqS9JGpBxVOvsawzmVt30sP++gSQMTejCkIAQ3VdadOcRE8izTyW66hufvwLeH+YEGP6Js2AW7Gz+RMyvrEbmw==", + "requires": { + "@types/node": "*" + } + }, "@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==", - "dev": true, "requires": { "@types/node": "*" } }, + "@types/content-disposition": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/@types/content-disposition/-/content-disposition-0.5.8.tgz", + "integrity": "sha512-QVSSvno3dE0MgO76pJhmv4Qyi/j0Yk9pBp0Y7TJ2Tlj+KCgJWY6qX7nnxCOLkZ3VYRSIk1WTxCvwUSdx6CCLdg==" + }, "@types/cookie": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", @@ -14736,6 +17357,17 @@ "integrity": "sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q==", "dev": true }, + "@types/cookies": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@types/cookies/-/cookies-0.9.0.tgz", + "integrity": "sha512-40Zk8qR147RABiQ7NQnBzWzDcjKzNrntB5BAmeGCb2p/MIyOE+4BVvc17wumsUqUw00bJYqoXFHYygQnEFh4/Q==", + "requires": { + "@types/connect": "*", + "@types/express": "*", + "@types/keygrip": "*", + "@types/node": "*" + } + }, "@types/cors": { "version": "2.8.14", "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.14.tgz", @@ -14794,7 +17426,6 @@ "version": "4.17.21", "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", - "dev": true, "requires": { "@types/body-parser": "*", "@types/express-serve-static-core": "^4.17.33", @@ -14806,7 +17437,6 @@ "version": "4.17.37", "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.37.tgz", "integrity": "sha512-ZohaCYTgGFcOP7u6aJOhY9uIZQgZ2vxC2yWoArY+FeDXlqeH66ZVBjgvg+RLVAS/DWNq4Ap9ZXu1+SUQiiWYMg==", - "dev": true, "requires": { "@types/node": "*", "@types/qs": "*", @@ -14832,11 +17462,51 @@ "@types/node": "*" } }, + "@types/hapi__catbox": { + "version": "10.2.6", + "resolved": "https://registry.npmjs.org/@types/hapi__catbox/-/hapi__catbox-10.2.6.tgz", + "integrity": "sha512-qdMHk4fBlwRfnBBDJaoaxb+fU9Ewi2xqkXD3mNjSPl2v/G/8IJbDpVRBuIcF7oXrcE8YebU5M8cCeKh1NXEn0w==" + }, + "@types/hapi__hapi": { + "version": "20.0.13", + "resolved": "https://registry.npmjs.org/@types/hapi__hapi/-/hapi__hapi-20.0.13.tgz", + "integrity": "sha512-LP4IPfhIO5ZPVOrJo7H8c8Slc0WYTFAUNQX1U0LBPKyXioXhH5H2TawIgxKujIyOhbwoBbpvOsBf6o5+ToJIrQ==", + "requires": { + "@hapi/boom": "^9.0.0", + "@hapi/iron": "^6.0.0", + "@hapi/podium": "^4.1.3", + "@types/hapi__catbox": "*", + "@types/hapi__mimos": "*", + "@types/hapi__shot": "*", + "@types/node": "*", + "joi": "^17.3.0" + } + }, + "@types/hapi__mimos": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@types/hapi__mimos/-/hapi__mimos-4.1.4.tgz", + "integrity": "sha512-i9hvJpFYTT/qzB5xKWvDYaSXrIiNqi4ephi+5Lo6+DoQdwqPXQgmVVOZR+s3MBiHoFqsCZCX9TmVWG3HczmTEQ==", + "requires": { + "@types/mime-db": "*" + } + }, + "@types/hapi__shot": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@types/hapi__shot/-/hapi__shot-4.1.6.tgz", + "integrity": "sha512-h33NBjx2WyOs/9JgcFeFhkxnioYWQAZxOHdmqDuoJ1Qjxpcs+JGvSjEEoDeWfcrF+1n47kKgqph5IpfmPOnzbg==", + "requires": { + "@types/node": "*" + } + }, + "@types/http-assert": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@types/http-assert/-/http-assert-1.5.5.tgz", + "integrity": "sha512-4+tE/lwdAahgZT1g30Jkdm9PzFRde0xwxBNUyRsCitRvCQB90iuA2uJYdUnhnANRcqGXaWOGY4FEoxeElNAK2g==" + }, "@types/http-errors": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.2.tgz", - "integrity": "sha512-lPG6KlZs88gef6aD85z3HNkztpj7w2R7HmR3gygjfXCQmsLloWNARFkMuzKiiY8FGdh1XDpgBdrSf4aKDiA7Kg==", - "dev": true + "integrity": "sha512-lPG6KlZs88gef6aD85z3HNkztpj7w2R7HmR3gygjfXCQmsLloWNARFkMuzKiiY8FGdh1XDpgBdrSf4aKDiA7Kg==" }, "@types/imagemin": { "version": "8.0.5", @@ -14857,6 +17527,14 @@ "rxjs": "^7.2.0" } }, + "@types/ioredis4": { + "version": "npm:@types/ioredis@4.28.10", + "resolved": "https://registry.npmjs.org/@types/ioredis/-/ioredis-4.28.10.tgz", + "integrity": "sha512-69LyhUgrXdgcNDv7ogs1qXZomnfOEnSmrmMFqKgt1XMJxmoOSG/u3wYy13yACIfKuMJ8IhKgHafDO3sx19zVQQ==", + "requires": { + "@types/node": "*" + } + }, "@types/istanbul-lib-coverage": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", @@ -14906,6 +17584,42 @@ "integrity": "sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ==", "dev": true }, + "@types/keygrip": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/keygrip/-/keygrip-1.0.6.tgz", + "integrity": "sha512-lZuNAY9xeJt7Bx4t4dx0rYCDqGPW8RXhQZK1td7d4H6E9zYbLoOtjBvfwdTKpsyxQI/2jv+armjX/RW+ZNpXOQ==" + }, + "@types/koa": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/@types/koa/-/koa-2.14.0.tgz", + "integrity": "sha512-DTDUyznHGNHAl+wd1n0z1jxNajduyTh8R53xoewuerdBzGo6Ogj6F2299BFtrexJw4NtgjsI5SMPCmV9gZwGXA==", + "requires": { + "@types/accepts": "*", + "@types/content-disposition": "*", + "@types/cookies": "*", + "@types/http-assert": "*", + "@types/http-errors": "*", + "@types/keygrip": "*", + "@types/koa-compose": "*", + "@types/node": "*" + } + }, + "@types/koa__router": { + "version": "12.0.3", + "resolved": "https://registry.npmjs.org/@types/koa__router/-/koa__router-12.0.3.tgz", + "integrity": "sha512-5YUJVv6NwM1z7m6FuYpKfNLTZ932Z6EF6xy2BbtpJSyn13DKNQEkXVffFVSnJHxvwwWh2SAeumpjAYUELqgjyw==", + "requires": { + "@types/koa": "*" + } + }, + "@types/koa-compose": { + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/@types/koa-compose/-/koa-compose-3.2.8.tgz", + "integrity": "sha512-4Olc63RY+MKvxMwVknCUDhRQX1pFQoBZ/lXcRLP69PQkEpze/0cr8LNqJQe5NFb/b19DWi2a5bTi2VAlQzhJuA==", + "requires": { + "@types/koa": "*" + } + }, "@types/lodash": { "version": "4.14.202", "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.202.tgz", @@ -14917,6 +17631,14 @@ "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.3.7.tgz", "integrity": "sha512-gKc9P2d4g5uYwmy4s/MO/yOVPmvHyvzka1YH6i5dM03UrFofHSmgc0D0ymbDRStFWHusk6cwwF6nhLm/ckBbbQ==" }, + "@types/memcached": { + "version": "2.2.10", + "resolved": "https://registry.npmjs.org/@types/memcached/-/memcached-2.2.10.tgz", + "integrity": "sha512-AM9smvZN55Gzs2wRrqeMHVP7KE8KWgCJO/XL5yCly2xF6EKa4YlbpK+cLSAH4NG/Ah64HrlegmGqW8kYws7Vxg==", + "requires": { + "@types/node": "*" + } + }, "@types/methods": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/@types/methods/-/methods-1.1.4.tgz", @@ -14926,8 +17648,12 @@ "@types/mime": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.3.tgz", - "integrity": "sha512-Ys+/St+2VF4+xuY6+kDIXGxbNRO0mesVg0bbxEfB97Od1Vjpjx9KD1qxs64Gcb3CWPirk9Xe+PT4YiiHQ9T+eg==", - "dev": true + "integrity": "sha512-Ys+/St+2VF4+xuY6+kDIXGxbNRO0mesVg0bbxEfB97Od1Vjpjx9KD1qxs64Gcb3CWPirk9Xe+PT4YiiHQ9T+eg==" + }, + "@types/mime-db": { + "version": "1.43.5", + "resolved": "https://registry.npmjs.org/@types/mime-db/-/mime-db-1.43.5.tgz", + "integrity": "sha512-/bfTiIUTNPUBnwnYvUxXAre5MhD88jgagLEQiQtIASjU+bwxd8kS/ASDA4a8ufd8m0Lheu6eeMJHEUpLHoJ28A==" }, "@types/mock-fs": { "version": "4.13.4", @@ -14947,6 +17673,14 @@ "@types/express": "*" } }, + "@types/mysql": { + "version": "2.15.22", + "resolved": "https://registry.npmjs.org/@types/mysql/-/mysql-2.15.22.tgz", + "integrity": "sha512-wK1pzsJVVAjYCSZWQoWHziQZbNggXFDUEIGf54g4ZM/ERuP86uGdWeKZWMYlqTPMZfHJJvLPyogXGvCOg87yLQ==", + "requires": { + "@types/node": "*" + } + }, "@types/node": { "version": "20.11.25", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.25.tgz", @@ -15010,6 +17744,14 @@ } } }, + "@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==", + "requires": { + "@types/pg": "*" + } + }, "@types/picomatch": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/@types/picomatch/-/picomatch-2.3.3.tgz", @@ -15018,14 +17760,12 @@ "@types/qs": { "version": "6.9.8", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.8.tgz", - "integrity": "sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg==", - "dev": true + "integrity": "sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg==" }, "@types/range-parser": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.5.tgz", - "integrity": "sha512-xrO9OoVPqFuYyR/loIHjnbvvyRZREYKLjxV4+dY6v3FQR3stQ9ZxIGkaclF7YhI9hfjpuTbu14hZEy94qKLtOA==", - "dev": true + "integrity": "sha512-xrO9OoVPqFuYyR/loIHjnbvvyRZREYKLjxV4+dY6v3FQR3stQ9ZxIGkaclF7YhI9hfjpuTbu14hZEy94qKLtOA==" }, "@types/readdir-glob": { "version": "1.1.2", @@ -15046,7 +17786,6 @@ "version": "0.17.2", "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.2.tgz", "integrity": "sha512-aAG6yRf6r0wQ29bkS+x97BIs64ZLxeE/ARwyS6wrldMm3C1MdKwCcnnEwMC1slI8wuxJOpiUH9MioC0A0i+GJw==", - "dev": true, "requires": { "@types/mime": "^1", "@types/node": "*" @@ -15056,7 +17795,6 @@ "version": "1.15.3", "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.3.tgz", "integrity": "sha512-yVRvFsEMrv7s0lGhzrggJjNOSmZCdgCjw9xWrPr/kNNLp6FaDfMC1KaYl3TSJ0c58bECwNBMoQrZJ8hA8E1eFg==", - "dev": true, "requires": { "@types/http-errors": "*", "@types/mime": "*", @@ -15072,6 +17810,11 @@ "@types/node": "*" } }, + "@types/shimmer": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/shimmer/-/shimmer-1.0.5.tgz", + "integrity": "sha512-9Hp0ObzwwO57DpLFF0InUjUm/II8GmKAvzbefxQTihCb7KI6yc9yzf0nLc4mVdby5N4DRCgQM2wCup9KTieeww==" + }, "@types/ssh2": { "version": "0.5.52", "resolved": "https://registry.npmjs.org/@types/ssh2/-/ssh2-0.5.52.tgz", @@ -15118,6 +17861,14 @@ "@types/superagent": "^8.1.0" } }, + "@types/tedious": { + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/@types/tedious/-/tedious-4.0.14.tgz", + "integrity": "sha512-KHPsfX/FoVbUGbyYvk1q9MMQHLPeRZhRJZdO45Q4YjvFkv4hMNghCWTvy7rdKessBsmtz4euWCWAB6/tVpI1Iw==", + "requires": { + "@types/node": "*" + } + }, "@types/through": { "version": "0.0.31", "resolved": "https://registry.npmjs.org/@types/through/-/through-0.0.31.tgz", @@ -15463,14 +18214,12 @@ "acorn": { "version": "8.10.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", - "devOptional": true + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==" }, "acorn-import-assertions": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", - "dev": true, "requires": {} }, "acorn-jsx": { @@ -15891,6 +18640,11 @@ "tweetnacl": "^0.14.3" } }, + "bignumber.js": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", + "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==" + }, "binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -16173,8 +18927,7 @@ "cjs-module-lexer": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", - "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", - "dev": true + "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==" }, "class-transformer": { "version": "0.5.1", @@ -17296,6 +20049,11 @@ } } }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, "external-editor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", @@ -17656,6 +20414,45 @@ } } }, + "gaxios": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-6.2.0.tgz", + "integrity": "sha512-H6+bHeoEAU5D6XNc6mPKeN5dLZqEDs9Gpk6I+SZBEzK5So58JVrHPmevNi35fRl1J9Y5TaeLW0kYx3pCJ1U2mQ==", + "requires": { + "extend": "^3.0.2", + "https-proxy-agent": "^7.0.1", + "is-stream": "^2.0.0", + "node-fetch": "^2.6.9" + }, + "dependencies": { + "agent-base": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", + "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", + "requires": { + "debug": "^4.3.4" + } + }, + "https-proxy-agent": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", + "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", + "requires": { + "agent-base": "^7.0.2", + "debug": "4" + } + } + } + }, + "gcp-metadata": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-6.1.0.tgz", + "integrity": "sha512-Jh/AIwwgaxan+7ZUUmRLCjtchyDiqh4KjBJ5tW3plBZb5iL/BPcso8A5DlzeD9qlw0duCamnNdpFjxwaT0KyKg==", + "requires": { + "gaxios": "^6.0.0", + "json-bigint": "^1.0.0" + } + }, "gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -17833,7 +20630,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, "requires": { "function-bind": "^1.1.1" } @@ -17971,6 +20767,17 @@ "resolve-from": "^4.0.0" } }, + "import-in-the-middle": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.7.1.tgz", + "integrity": "sha512-1LrZPDtW+atAxH42S6288qyDFNQ2YCty+2mxEPRtfazH6Z5QwkaBSTS2ods7hnVJioF6rkRfNoA6A/MstpFXLg==", + "requires": { + "acorn": "^8.8.2", + "acorn-import-assertions": "^1.9.0", + "cjs-module-lexer": "^1.2.2", + "module-details-from-path": "^1.0.3" + } + }, "import-local": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", @@ -18082,7 +20889,6 @@ "version": "2.13.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", - "dev": true, "requires": { "has": "^1.0.3" } @@ -18130,8 +20936,7 @@ "is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" }, "is-unicode-supported": { "version": "0.1.0", @@ -18798,6 +21603,14 @@ "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "dev": true }, + "json-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "requires": { + "bignumber.js": "^9.0.0" + } + }, "json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", @@ -18941,6 +21754,11 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, + "lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" + }, "lodash.defaults": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", @@ -18978,8 +21796,7 @@ "lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" }, "lodash.union": { "version": "4.6.0", @@ -18996,6 +21813,11 @@ "is-unicode-supported": "^0.1.0" } }, + "long": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" + }, "lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -19191,6 +22013,11 @@ "integrity": "sha512-2dF2R6YMSZbpip1V1WHKGLNjr/k48uQClqMVb5H3MOvwc9qhYis3/IWbj02qIg/Y8MDXKFF4c5v0rxx2o6xTZw==", "dev": true }, + "module-details-from-path": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.3.tgz", + "integrity": "sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A==" + }, "moo": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/moo/-/moo-0.5.2.tgz", @@ -19369,6 +22196,16 @@ } } }, + "nestjs-otel": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/nestjs-otel/-/nestjs-otel-5.1.5.tgz", + "integrity": "sha512-4u87aSy/GpbwuYvb5OAm0Zk3CP/q9QATI2bb9DQNpLYC5uYsqNkLHL3AdLBMVueNIMqp8rZui67XW0WTM8rr6g==", + "requires": { + "@opentelemetry/api": "^1.4.1", + "@opentelemetry/host-metrics": "^0.32.2", + "response-time": "^2.3.2" + } + }, "node-abort-controller": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz", @@ -19500,6 +22337,11 @@ "ee-first": "1.1.1" } }, + "on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" + }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -19674,8 +22516,7 @@ "path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, "path-scurry": { "version": "1.10.1", @@ -19989,6 +22830,25 @@ } } }, + "protobufjs": { + "version": "7.2.6", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.6.tgz", + "integrity": "sha512-dgJaEDDL6x8ASUZ1YqWciTRrdOuYNzoOf27oHNfdyvKqHr5i0FV7FSLU+aIeFjyFgVxrpTOtQUi0BLLBymZaBw==", + "requires": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + } + }, "protocol-buffers-schema": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/protocol-buffers-schema/-/protocol-buffers-schema-3.6.0.tgz", @@ -20289,11 +23149,20 @@ "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "dev": true }, + "require-in-the-middle": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-7.2.0.tgz", + "integrity": "sha512-3TLx5TGyAY6AOqLBoXmHkNql0HIf2RGbuMgCDT2WO/uGVAPJs6h7Kl+bN6TIZGd9bWhWPwnDnTHGtW8Iu77sdw==", + "requires": { + "debug": "^4.1.1", + "module-details-from-path": "^1.0.3", + "resolve": "^1.22.1" + } + }, "resolve": { "version": "1.22.6", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz", "integrity": "sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==", - "dev": true, "requires": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", @@ -20336,6 +23205,22 @@ "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", "dev": true }, + "response-time": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/response-time/-/response-time-2.3.2.tgz", + "integrity": "sha512-MUIDaDQf+CVqflfTdQ5yam+aYCkXj1PY8fjlPDQ6ppxJlmgZb864pHtA750mayywNg8tx4rS7qH9JXd/OF+3gw==", + "requires": { + "depd": "~1.1.0", + "on-headers": "~1.0.1" + }, + "dependencies": { + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==" + } + } + }, "restore-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", @@ -20661,6 +23546,11 @@ } } }, + "shimmer": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.1.tgz", + "integrity": "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==" + }, "side-channel": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", @@ -21029,8 +23919,7 @@ "supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" }, "swagger-ui-dist": { "version": "5.11.2", @@ -21053,6 +23942,11 @@ "tslib": "^2.6.2" } }, + "systeminformation": { + "version": "5.22.0", + "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-5.22.0.tgz", + "integrity": "sha512-oAP80ymt8ssrAzjX8k3frbL7ys6AotqC35oikG6/SG15wBw+tG9nCk4oPaXIhEaAOAZ8XngxUv3ORq2IuR3r4Q==" + }, "tapable": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", diff --git a/server/package.json b/server/package.json index 70d647989..f6baa5969 100644 --- a/server/package.json +++ b/server/package.json @@ -45,6 +45,9 @@ "@nestjs/swagger": "^7.1.8", "@nestjs/typeorm": "^10.0.0", "@nestjs/websockets": "^10.2.2", + "@opentelemetry/auto-instrumentations-node": "^0.41.1", + "@opentelemetry/exporter-prometheus": "^0.48.0", + "@opentelemetry/sdk-node": "^0.48.0", "@socket.io/postgres-adapter": "^0.3.1", "@types/picomatch": "^2.3.3", "archiver": "^7.0.0", @@ -68,6 +71,7 @@ "lodash": "^4.17.21", "luxon": "^3.4.2", "nest-commander": "^3.11.1", + "nestjs-otel": "^5.1.5", "node-addon-api": "^7.0.0", "openid-client": "^5.4.3", "pg": "^8.11.3", diff --git a/server/src/domain/domain.config.ts b/server/src/domain/domain.config.ts index b77fd7412..b0471080d 100644 --- a/server/src/domain/domain.config.ts +++ b/server/src/domain/domain.config.ts @@ -14,16 +14,23 @@ export const immichAppConfig: ConfigModuleOptions = { isGlobal: true, validationSchema: Joi.object({ NODE_ENV: Joi.string().optional().valid('development', 'production', 'staging').default('development'), + LOG_LEVEL: Joi.string() + .optional() + .valid(...Object.values(LogLevel)), + DB_USERNAME: WHEN_DB_URL_SET, DB_PASSWORD: WHEN_DB_URL_SET, DB_DATABASE_NAME: WHEN_DB_URL_SET, DB_URL: Joi.string().optional(), DB_VECTOR_EXTENSION: Joi.string().optional().valid('pgvector', 'pgvecto.rs').default('pgvecto.rs'), - LOG_LEVEL: Joi.string() - .optional() - .valid(...Object.values(LogLevel)), + MACHINE_LEARNING_PORT: Joi.number().optional(), MICROSERVICES_PORT: Joi.number().optional(), - SERVER_PORT: Joi.number().optional(), + IMMICH_METRICS_PORT: Joi.number().optional(), + + IMMICH_METRICS: Joi.boolean().optional().default(false), + IMMICH_HOST_METRICS: Joi.boolean().optional().default(false), + IMMICH_API_METRICS: Joi.boolean().optional().default(false), + IMMICH_IO_METRICS: Joi.boolean().optional().default(false), }), }; diff --git a/server/src/immich/main.ts b/server/src/immich/main.ts index d2fe44f1f..60e323e6a 100644 --- a/server/src/immich/main.ts +++ b/server/src/immich/main.ts @@ -1,5 +1,6 @@ import { WEB_ROOT, envName, isDev, serverVersion } from '@app/domain'; -import { WebSocketAdapter } from '@app/infra'; +import { WebSocketAdapter, excludePaths } from '@app/infra'; +import { otelSDK } from '@app/infra/instrumentation'; import { ImmichLogger } from '@app/infra/logger'; import { NestFactory } from '@nestjs/core'; import { NestExpressApplication } from '@nestjs/platform-express'; @@ -15,6 +16,7 @@ const logger = new ImmichLogger('ImmichServer'); const port = Number(process.env.SERVER_PORT) || 3001; export async function bootstrap() { + otelSDK.start(); const app = await NestFactory.create(AppModule, { bufferLogs: true }); app.useLogger(app.get(ImmichLogger)); @@ -28,7 +30,6 @@ export async function bootstrap() { app.useWebSocketAdapter(new WebSocketAdapter(app)); useSwagger(app, isDev); - const excludePaths = ['/.well-known/immich', '/custom.css']; app.setGlobalPrefix('api', { exclude: excludePaths }); if (existsSync(WEB_ROOT)) { // copied from https://github.com/sveltejs/kit/blob/679b5989fe62e3964b9a73b712d7b41831aa1f07/packages/adapter-node/src/handler.js#L46 diff --git a/server/src/infra/infra.config.ts b/server/src/infra/infra.config.ts index f72f33334..9ea570953 100644 --- a/server/src/infra/infra.config.ts +++ b/server/src/infra/infra.config.ts @@ -34,3 +34,5 @@ export const bullConfig: QueueOptions = { }; export const bullQueues: RegisterQueueOptions[] = Object.values(QueueName).map((name) => ({ name })); + +export const excludePaths = ['/.well-known/immich', '/custom.css', '/favicon.ico']; diff --git a/server/src/infra/infra.module.ts b/server/src/infra/infra.module.ts index b36fdf6f0..cdd5ab442 100644 --- a/server/src/infra/infra.module.ts +++ b/server/src/infra/infra.module.ts @@ -33,9 +33,11 @@ import { Global, Module, Provider } from '@nestjs/common'; import { ConfigModule } from '@nestjs/config'; import { ScheduleModule, SchedulerRegistry } from '@nestjs/schedule'; import { TypeOrmModule } from '@nestjs/typeorm'; +import { OpenTelemetryModule } from 'nestjs-otel'; import { databaseConfig } from './database.config'; import { databaseEntities } from './entities'; import { bullConfig, bullQueues } from './infra.config'; +import { otelConfig } from './instrumentation'; import { AccessRepository, ActivityRepository, @@ -106,6 +108,7 @@ const providers: Provider[] = [ ScheduleModule, BullModule.forRoot(bullConfig), BullModule.registerQueue(...bullQueues), + OpenTelemetryModule.forRoot(otelConfig), ], providers: [...providers], exports: [...providers, BullModule], diff --git a/server/src/infra/infra.utils.ts b/server/src/infra/infra.utils.ts index 636d78ab7..247244108 100644 --- a/server/src/infra/infra.utils.ts +++ b/server/src/infra/infra.utils.ts @@ -121,6 +121,27 @@ export function ChunkedSet(options?: { paramIndex?: number }): MethodDecorator { return Chunked({ ...options, mergeFn: setUnion }); } +// https://stackoverflow.com/a/74898678 +export function DecorateAll( + decorator: ( + target: any, + propertyKey: string, + descriptor: TypedPropertyDescriptor, + ) => TypedPropertyDescriptor | void, +) { + return (target: any) => { + const descriptors = Object.getOwnPropertyDescriptors(target.prototype); + for (const [propName, descriptor] of Object.entries(descriptors)) { + const isMethod = typeof descriptor.value == 'function' && propName !== 'constructor'; + if (!isMethod) { + continue; + } + decorator({ ...target, constructor: { ...target.constructor, name: target.name } as any }, propName, descriptor); + Object.defineProperty(target.prototype, propName, descriptor); + } + }; +} + export function searchAssetBuilder( builder: SelectQueryBuilder, options: AssetSearchBuilderOptions, diff --git a/server/src/infra/instrumentation.ts b/server/src/infra/instrumentation.ts new file mode 100644 index 000000000..130eaea3d --- /dev/null +++ b/server/src/infra/instrumentation.ts @@ -0,0 +1,106 @@ +import { serverVersion } from '@app/domain/domain.constant'; +import { Histogram, MetricOptions, ValueType, metrics } from '@opentelemetry/api'; +import { AsyncLocalStorageContextManager } from '@opentelemetry/context-async-hooks'; +import { PrometheusExporter } from '@opentelemetry/exporter-prometheus'; +import { HttpInstrumentation } from '@opentelemetry/instrumentation-http'; +import { IORedisInstrumentation } from '@opentelemetry/instrumentation-ioredis'; +import { NestInstrumentation } from '@opentelemetry/instrumentation-nestjs-core'; +import { PgInstrumentation } from '@opentelemetry/instrumentation-pg'; +import { Resource } from '@opentelemetry/resources'; +import { ExplicitBucketHistogramAggregation, View } from '@opentelemetry/sdk-metrics'; +import { NodeSDK } from '@opentelemetry/sdk-node'; +import { SemanticResourceAttributes } from '@opentelemetry/semantic-conventions'; +import { snakeCase, startCase } from 'lodash'; +import { OpenTelemetryModuleOptions } from 'nestjs-otel/lib/interfaces'; +import { copyMetadataFromFunctionToFunction } from 'nestjs-otel/lib/opentelemetry.utils'; +import { performance } from 'node:perf_hooks'; +import { excludePaths } from './infra.config'; +import { DecorateAll } from './infra.utils'; + +let metricsEnabled = process.env.IMMICH_METRICS === 'true'; +const hostMetrics = + process.env.IMMICH_HOST_METRICS == null ? metricsEnabled : process.env.IMMICH_HOST_METRICS === 'true'; +const apiMetrics = process.env.IMMICH_API_METRICS == null ? metricsEnabled : process.env.IMMICH_API_METRICS === 'true'; +const repoMetrics = process.env.IMMICH_IO_METRICS == null ? metricsEnabled : process.env.IMMICH_IO_METRICS === 'true'; + +metricsEnabled ||= hostMetrics || apiMetrics || repoMetrics; +if (!metricsEnabled && process.env.OTEL_SDK_DISABLED === undefined) { + process.env.OTEL_SDK_DISABLED = 'true'; +} + +const aggregation = new ExplicitBucketHistogramAggregation( + [0.1, 0.25, 0.5, 0.75, 1, 2.5, 5, 7.5, 10, 25, 50, 75, 100, 250, 500, 750, 1000, 2500, 5000, 7500, 10_000], + true, +); + +const metricsPort = Number.parseInt(process.env.IMMICH_METRICS_PORT ?? '8081'); + +export const otelSDK = new NodeSDK({ + resource: new Resource({ + [SemanticResourceAttributes.SERVICE_NAME]: `immich`, + [SemanticResourceAttributes.SERVICE_VERSION]: serverVersion.toString(), + }), + metricReader: new PrometheusExporter({ port: metricsPort }), + contextManager: new AsyncLocalStorageContextManager(), + instrumentations: [ + new HttpInstrumentation(), + new IORedisInstrumentation(), + new NestInstrumentation(), + new PgInstrumentation(), + ], + views: [new View({ aggregation, instrumentName: '*', instrumentUnit: 'ms' })], +}); + +export const otelConfig: OpenTelemetryModuleOptions = { + metrics: { + hostMetrics, + apiMetrics: { + enable: apiMetrics, + ignoreRoutes: excludePaths, + }, + }, +}; + +function ExecutionTimeHistogram({ description, unit = 'ms', valueType = ValueType.DOUBLE }: MetricOptions = {}) { + return (target: any, propertyKey: string | symbol, descriptor: PropertyDescriptor) => { + if (!repoMetrics || process.env.OTEL_SDK_DISABLED) { + return; + } + + const method = descriptor.value; + const className = target.constructor.name as string; + const propertyName = String(propertyKey); + const metricName = `${snakeCase(className).replaceAll(/_(?=(repository)|(controller)|(provider)|(service)|(module))/g, '.')}.${snakeCase(propertyName)}.duration`; + + const metricDescription = + description ?? + `The elapsed time in ${unit} for the ${startCase(className)} to ${startCase(propertyName).toLowerCase()}`; + + let histogram: Histogram | undefined; + + descriptor.value = function (...args: any[]) { + const start = performance.now(); + const result = method.apply(this, args); + + void Promise.resolve(result) + .then(() => { + const end = performance.now(); + if (!histogram) { + histogram = metrics + .getMeter('immich') + .createHistogram(metricName, { description: metricDescription, unit, valueType }); + } + histogram.record(end - start, {}); + }) + .catch(() => { + // noop + }); + + return result; + }; + + copyMetadataFromFunctionToFunction(method, descriptor.value); + }; +} + +export const Instrumentation = () => DecorateAll(ExecutionTimeHistogram()); diff --git a/server/src/infra/repositories/access.repository.ts b/server/src/infra/repositories/access.repository.ts index fea1985ce..25691846d 100644 --- a/server/src/infra/repositories/access.repository.ts +++ b/server/src/infra/repositories/access.repository.ts @@ -14,6 +14,7 @@ import { } from '../entities'; import { DummyValue, GenerateSql } from '../infra.util'; import { ChunkedSet } from '../infra.utils'; +import { Instrumentation } from '../instrumentation'; type IActivityAccess = IAccessRepository['activity']; type IAlbumAccess = IAccessRepository['album']; @@ -24,6 +25,7 @@ type ITimelineAccess = IAccessRepository['timeline']; type IPersonAccess = IAccessRepository['person']; type IPartnerAccess = IAccessRepository['partner']; +@Instrumentation() class ActivityAccess implements IActivityAccess { constructor( private activityRepository: Repository, diff --git a/server/src/infra/repositories/activity.repository.ts b/server/src/infra/repositories/activity.repository.ts index 319c9c647..c546056db 100644 --- a/server/src/infra/repositories/activity.repository.ts +++ b/server/src/infra/repositories/activity.repository.ts @@ -4,6 +4,7 @@ import { InjectRepository } from '@nestjs/typeorm'; import { IsNull, Repository } from 'typeorm'; import { ActivityEntity } from '../entities/activity.entity'; import { DummyValue, GenerateSql } from '../infra.util'; +import { Instrumentation } from '../instrumentation'; export interface ActivitySearch { albumId?: string; @@ -12,6 +13,7 @@ export interface ActivitySearch { isLiked?: boolean; } +@Instrumentation() @Injectable() export class ActivityRepository implements IActivityRepository { constructor(@InjectRepository(ActivityEntity) private repository: Repository) {} diff --git a/server/src/infra/repositories/album.repository.ts b/server/src/infra/repositories/album.repository.ts index 2d3fd795d..60ef6126c 100644 --- a/server/src/infra/repositories/album.repository.ts +++ b/server/src/infra/repositories/album.repository.ts @@ -8,7 +8,9 @@ import { dataSource } from '../database.config'; import { AlbumEntity, AssetEntity } from '../entities'; import { DATABASE_PARAMETER_CHUNK_SIZE, DummyValue, GenerateSql } from '../infra.util'; import { Chunked, ChunkedArray } from '../infra.utils'; +import { Instrumentation } from '../instrumentation'; +@Instrumentation() @Injectable() export class AlbumRepository implements IAlbumRepository { constructor( diff --git a/server/src/infra/repositories/api-key.repository.ts b/server/src/infra/repositories/api-key.repository.ts index b7ebc303d..3cafc22eb 100644 --- a/server/src/infra/repositories/api-key.repository.ts +++ b/server/src/infra/repositories/api-key.repository.ts @@ -4,7 +4,9 @@ import { InjectRepository } from '@nestjs/typeorm'; import { Repository } from 'typeorm'; import { APIKeyEntity } from '../entities'; import { DummyValue, GenerateSql } from '../infra.util'; +import { Instrumentation } from '../instrumentation'; +@Instrumentation() @Injectable() export class ApiKeyRepository implements IKeyRepository { constructor(@InjectRepository(APIKeyEntity) private repository: Repository) {} diff --git a/server/src/infra/repositories/asset-stack.repository.ts b/server/src/infra/repositories/asset-stack.repository.ts index 4b23b9c1a..d769030bb 100644 --- a/server/src/infra/repositories/asset-stack.repository.ts +++ b/server/src/infra/repositories/asset-stack.repository.ts @@ -3,7 +3,9 @@ import { Injectable } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import { Repository } from 'typeorm'; import { AssetStackEntity } from '../entities'; +import { Instrumentation } from '../instrumentation'; +@Instrumentation() @Injectable() export class AssetStackRepository implements IAssetStackRepository { constructor(@InjectRepository(AssetStackEntity) private repository: Repository) {} diff --git a/server/src/infra/repositories/asset.repository.ts b/server/src/infra/repositories/asset.repository.ts index ff60be9fe..c91ef5e0b 100644 --- a/server/src/infra/repositories/asset.repository.ts +++ b/server/src/infra/repositories/asset.repository.ts @@ -39,6 +39,7 @@ import { import { AssetEntity, AssetJobStatusEntity, AssetType, ExifEntity, SmartInfoEntity } from '../entities'; import { DummyValue, GenerateSql } from '../infra.util'; import { Chunked, ChunkedArray, OptionalBetween, paginate, paginatedBuilder, searchAssetBuilder } from '../infra.utils'; +import { Instrumentation } from '../instrumentation'; const truncateMap: Record = { [TimeBucketSize.DAY]: 'day', @@ -50,6 +51,7 @@ const dateTrunc = (options: TimeBucketOptions) => truncateMap[options.size] }', (asset."localDateTime" at time zone 'UTC')) at time zone 'UTC')::timestamptz`; +@Instrumentation() @Injectable() export class AssetRepository implements IAssetRepository { constructor( diff --git a/server/src/infra/repositories/audit.repository.ts b/server/src/infra/repositories/audit.repository.ts index b19d38577..bc00cbe9a 100644 --- a/server/src/infra/repositories/audit.repository.ts +++ b/server/src/infra/repositories/audit.repository.ts @@ -2,7 +2,9 @@ import { AuditSearch, IAuditRepository } from '@app/domain'; import { InjectRepository } from '@nestjs/typeorm'; import { LessThan, MoreThan, Repository } from 'typeorm'; import { AuditEntity } from '../entities'; +import { Instrumentation } from '../instrumentation'; +@Instrumentation() export class AuditRepository implements IAuditRepository { constructor(@InjectRepository(AuditEntity) private repository: Repository) {} diff --git a/server/src/infra/repositories/communication.repository.ts b/server/src/infra/repositories/communication.repository.ts index ec9eb005b..b7ac6ac99 100644 --- a/server/src/infra/repositories/communication.repository.ts +++ b/server/src/infra/repositories/communication.repository.ts @@ -15,7 +15,9 @@ import { WebSocketServer, } from '@nestjs/websockets'; import { Server, Socket } from 'socket.io'; +import { Instrumentation } from '../instrumentation'; +@Instrumentation() @WebSocketGateway({ cors: true, path: '/api/socket.io', diff --git a/server/src/infra/repositories/crypto.repository.ts b/server/src/infra/repositories/crypto.repository.ts index f445ed850..f98fa9d87 100644 --- a/server/src/infra/repositories/crypto.repository.ts +++ b/server/src/infra/repositories/crypto.repository.ts @@ -3,14 +3,26 @@ import { Injectable } from '@nestjs/common'; import { compareSync, hash } from 'bcrypt'; import { createHash, randomBytes, randomUUID } from 'node:crypto'; import { createReadStream } from 'node:fs'; +import { Instrumentation } from '../instrumentation'; +@Instrumentation() @Injectable() export class CryptoRepository implements ICryptoRepository { - randomUUID = randomUUID; - randomBytes = randomBytes; + randomUUID() { + return randomUUID(); + } - hashBcrypt = hash; - compareBcrypt = compareSync; + randomBytes(size: number) { + return randomBytes(size); + } + + hashBcrypt(data: string | Buffer, saltOrRounds: string | number) { + return hash(data, saltOrRounds); + } + + compareBcrypt(data: string | Buffer, encrypted: string) { + return compareSync(data, encrypted); + } hashSha256(value: string) { return createHash('sha256').update(value).digest('base64'); diff --git a/server/src/infra/repositories/database.repository.ts b/server/src/infra/repositories/database.repository.ts index b24602b89..8154e9122 100644 --- a/server/src/infra/repositories/database.repository.ts +++ b/server/src/infra/repositories/database.repository.ts @@ -15,8 +15,10 @@ import { InjectDataSource } from '@nestjs/typeorm'; import AsyncLock from 'async-lock'; import { DataSource, EntityManager, QueryRunner } from 'typeorm'; import { isValidInteger } from '../infra.utils'; +import { Instrumentation } from '../instrumentation'; import { ImmichLogger } from '../logger'; +@Instrumentation() @Injectable() export class DatabaseRepository implements IDatabaseRepository { private logger = new ImmichLogger(DatabaseRepository.name); diff --git a/server/src/infra/repositories/filesystem.provider.ts b/server/src/infra/repositories/filesystem.provider.ts index 32880ae18..386ee5d71 100644 --- a/server/src/infra/repositories/filesystem.provider.ts +++ b/server/src/infra/repositories/filesystem.provider.ts @@ -13,23 +13,37 @@ import archiver from 'archiver'; import chokidar, { WatchOptions } from 'chokidar'; import { glob } from 'fast-glob'; import { constants, createReadStream, existsSync, mkdirSync } from 'node:fs'; -import fs, { copyFile, readdir, rename, stat, utimes, writeFile } from 'node:fs/promises'; +import fs from 'node:fs/promises'; import path from 'node:path'; +import { Instrumentation } from '../instrumentation'; +@Instrumentation() export class FilesystemProvider implements IStorageRepository { private logger = new ImmichLogger(FilesystemProvider.name); - readdir = readdir; + readdir(folder: string): Promise { + return fs.readdir(folder); + } - copyFile = copyFile; + copyFile(source: string, target: string) { + return fs.copyFile(source, target); + } - stat = stat; + stat(filepath: string) { + return fs.stat(filepath); + } - writeFile = writeFile; + writeFile(filepath: string, buffer: Buffer) { + return fs.writeFile(filepath, buffer); + } - rename = rename; + rename(source: string, target: string) { + return fs.rename(source, target); + } - utimes = utimes; + utimes(filepath: string, atime: Date, mtime: Date) { + return fs.utimes(filepath, atime, mtime); + } createZipStream(): ImmichZipStream { const archive = archiver('zip', { store: true }); diff --git a/server/src/infra/repositories/job.repository.ts b/server/src/infra/repositories/job.repository.ts index 8160ff844..227967a07 100644 --- a/server/src/infra/repositories/job.repository.ts +++ b/server/src/infra/repositories/job.repository.ts @@ -17,7 +17,9 @@ import { Job, JobsOptions, Processor, Queue, Worker, WorkerOptions } from 'bullm import { CronJob, CronTime } from 'cron'; import { setTimeout } from 'node:timers/promises'; import { bullConfig } from '../infra.config'; +import { Instrumentation } from '../instrumentation'; +@Instrumentation() @Injectable() export class JobRepository implements IJobRepository { private workers: Partial> = {}; diff --git a/server/src/infra/repositories/library.repository.ts b/server/src/infra/repositories/library.repository.ts index 89db3d175..5ae3de96f 100644 --- a/server/src/infra/repositories/library.repository.ts +++ b/server/src/infra/repositories/library.repository.ts @@ -5,7 +5,9 @@ import { IsNull, Not } from 'typeorm'; import { Repository } from 'typeorm/repository/Repository.js'; import { LibraryEntity, LibraryType } from '../entities'; import { DummyValue, GenerateSql } from '../infra.util'; +import { Instrumentation } from '../instrumentation'; +@Instrumentation() @Injectable() export class LibraryRepository implements ILibraryRepository { constructor(@InjectRepository(LibraryEntity) private repository: Repository) {} diff --git a/server/src/infra/repositories/machine-learning.repository.ts b/server/src/infra/repositories/machine-learning.repository.ts index 4542c6577..767ca812b 100644 --- a/server/src/infra/repositories/machine-learning.repository.ts +++ b/server/src/infra/repositories/machine-learning.repository.ts @@ -11,9 +11,11 @@ import { } from '@app/domain'; import { Injectable } from '@nestjs/common'; import { readFile } from 'node:fs/promises'; +import { Instrumentation } from '../instrumentation'; const errorPrefix = 'Machine learning request'; +@Instrumentation() @Injectable() export class MachineLearningRepository implements IMachineLearningRepository { private async predict(url: string, input: TextModelInput | VisionModelInput, config: ModelConfig): Promise { @@ -50,7 +52,7 @@ export class MachineLearningRepository implements IMachineLearningRepository { } as CLIPConfig); } - async getFormData(input: TextModelInput | VisionModelInput, config: ModelConfig): Promise { + private async getFormData(input: TextModelInput | VisionModelInput, config: ModelConfig): Promise { const formData = new FormData(); const { enabled, modelName, modelType, ...options } = config; if (!enabled) { diff --git a/server/src/infra/repositories/media.repository.ts b/server/src/infra/repositories/media.repository.ts index d5e4cd36f..39cec03af 100644 --- a/server/src/infra/repositories/media.repository.ts +++ b/server/src/infra/repositories/media.repository.ts @@ -13,11 +13,13 @@ import fs from 'node:fs/promises'; import { Writable } from 'node:stream'; import { promisify } from 'node:util'; import sharp from 'sharp'; +import { Instrumentation } from '../instrumentation'; const probe = promisify(ffmpeg.ffprobe); sharp.concurrency(0); sharp.cache({ files: 0 }); +@Instrumentation() export class MediaRepository implements IMediaRepository { private logger = new ImmichLogger(MediaRepository.name); @@ -115,19 +117,6 @@ export class MediaRepository implements IMediaRepository { }); } - configureFfmpegCall(input: string, output: string | Writable, options: TranscodeOptions) { - return ffmpeg(input, { niceness: 10 }) - .inputOptions(options.inputOptions) - .outputOptions(options.outputOptions) - .output(output) - .on('error', (error, stdout, stderr) => this.logger.error(stderr || error)); - } - - chainPath(existing: string, path: string) { - const separator = existing.endsWith(':') ? '' : ':'; - return `${existing}${separator}${path}`; - } - async generateThumbhash(imagePath: string): Promise { const maxSize = 100; @@ -140,4 +129,17 @@ export class MediaRepository implements IMediaRepository { const thumbhash = await import('thumbhash'); return Buffer.from(thumbhash.rgbaToThumbHash(info.width, info.height, data)); } + + private configureFfmpegCall(input: string, output: string | Writable, options: TranscodeOptions) { + return ffmpeg(input, { niceness: 10 }) + .inputOptions(options.inputOptions) + .outputOptions(options.outputOptions) + .output(output) + .on('error', (error, stdout, stderr) => this.logger.error(stderr || error)); + } + + private chainPath(existing: string, path: string) { + const separator = existing.endsWith(':') ? '' : ':'; + return `${existing}${separator}${path}`; + } } diff --git a/server/src/infra/repositories/metadata.repository.ts b/server/src/infra/repositories/metadata.repository.ts index 4abfe0eac..bf9bb8a46 100644 --- a/server/src/infra/repositories/metadata.repository.ts +++ b/server/src/infra/repositories/metadata.repository.ts @@ -23,7 +23,9 @@ import * as readLine from 'node:readline'; import { DataSource, QueryRunner, Repository } from 'typeorm'; import { QueryDeepPartialEntity } from 'typeorm/query-builder/QueryPartialEntity.js'; import { DummyValue, GenerateSql } from '../infra.util'; +import { Instrumentation } from '../instrumentation'; +@Instrumentation() export class MetadataRepository implements IMetadataRepository { constructor( @InjectRepository(ExifEntity) private exifRepository: Repository, diff --git a/server/src/infra/repositories/move.repository.ts b/server/src/infra/repositories/move.repository.ts index f7995b54e..205c67ad6 100644 --- a/server/src/infra/repositories/move.repository.ts +++ b/server/src/infra/repositories/move.repository.ts @@ -4,7 +4,9 @@ import { InjectRepository } from '@nestjs/typeorm'; import { Repository } from 'typeorm'; import { MoveEntity, PathType } from '../entities'; import { DummyValue, GenerateSql } from '../infra.util'; +import { Instrumentation } from '../instrumentation'; +@Instrumentation() @Injectable() export class MoveRepository implements IMoveRepository { constructor(@InjectRepository(MoveEntity) private repository: Repository) {} diff --git a/server/src/infra/repositories/partner.repository.ts b/server/src/infra/repositories/partner.repository.ts index b5b876558..eb07902dc 100644 --- a/server/src/infra/repositories/partner.repository.ts +++ b/server/src/infra/repositories/partner.repository.ts @@ -3,7 +3,9 @@ import { Injectable } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import { DeepPartial, Repository } from 'typeorm'; import { PartnerEntity } from '../entities'; +import { Instrumentation } from '../instrumentation'; +@Instrumentation() @Injectable() export class PartnerRepository implements IPartnerRepository { constructor(@InjectRepository(PartnerEntity) private readonly repository: Repository) {} diff --git a/server/src/infra/repositories/person.repository.ts b/server/src/infra/repositories/person.repository.ts index 14c847ef6..562a56fb6 100644 --- a/server/src/infra/repositories/person.repository.ts +++ b/server/src/infra/repositories/person.repository.ts @@ -15,7 +15,9 @@ import { FindManyOptions, FindOptionsRelations, FindOptionsSelect, In, Repositor import { AssetEntity, AssetFaceEntity, PersonEntity } from '../entities'; import { DummyValue, GenerateSql } from '../infra.util'; import { ChunkedArray, asVector, paginate } from '../infra.utils'; +import { Instrumentation } from '../instrumentation'; +@Instrumentation() export class PersonRepository implements IPersonRepository { constructor( @InjectRepository(AssetEntity) private assetRepository: Repository, diff --git a/server/src/infra/repositories/search.repository.ts b/server/src/infra/repositories/search.repository.ts index 823193138..f5d1cbda3 100644 --- a/server/src/infra/repositories/search.repository.ts +++ b/server/src/infra/repositories/search.repository.ts @@ -26,7 +26,9 @@ import { Repository, SelectQueryBuilder } from 'typeorm'; import { vectorExt } from '../database.config'; import { DummyValue, GenerateSql } from '../infra.util'; import { asVector, isValidInteger, paginatedBuilder, searchAssetBuilder } from '../infra.utils'; +import { Instrumentation } from '../instrumentation'; +@Instrumentation() @Injectable() export class SearchRepository implements ISearchRepository { private logger = new ImmichLogger(SearchRepository.name); diff --git a/server/src/infra/repositories/server-info.repository.ts b/server/src/infra/repositories/server-info.repository.ts index 8c917cb63..bd56a58dd 100644 --- a/server/src/infra/repositories/server-info.repository.ts +++ b/server/src/infra/repositories/server-info.repository.ts @@ -1,6 +1,8 @@ import { GitHubRelease, IServerInfoRepository } from '@app/domain'; import { Injectable } from '@nestjs/common'; +import { Instrumentation } from '../instrumentation'; +@Instrumentation() @Injectable() export class ServerInfoRepository implements IServerInfoRepository { async getGitHubRelease(): Promise { diff --git a/server/src/infra/repositories/shared-link.repository.ts b/server/src/infra/repositories/shared-link.repository.ts index ae8826f79..5e796a772 100644 --- a/server/src/infra/repositories/shared-link.repository.ts +++ b/server/src/infra/repositories/shared-link.repository.ts @@ -4,7 +4,9 @@ import { InjectRepository } from '@nestjs/typeorm'; import { Repository } from 'typeorm'; import { SharedLinkEntity } from '../entities'; import { DummyValue, GenerateSql } from '../infra.util'; +import { Instrumentation } from '../instrumentation'; +@Instrumentation() @Injectable() export class SharedLinkRepository implements ISharedLinkRepository { constructor(@InjectRepository(SharedLinkEntity) private repository: Repository) {} diff --git a/server/src/infra/repositories/system-config.repository.ts b/server/src/infra/repositories/system-config.repository.ts index 1e9242e47..598333d9f 100644 --- a/server/src/infra/repositories/system-config.repository.ts +++ b/server/src/infra/repositories/system-config.repository.ts @@ -5,12 +5,15 @@ import { In, Repository } from 'typeorm'; import { SystemConfigEntity } from '../entities'; import { DummyValue, GenerateSql } from '../infra.util'; import { Chunked } from '../infra.utils'; +import { Instrumentation } from '../instrumentation'; +@Instrumentation() export class SystemConfigRepository implements ISystemConfigRepository { constructor( @InjectRepository(SystemConfigEntity) private repository: Repository, ) {} + async fetchStyle(url: string) { try { const response = await fetch(url); diff --git a/server/src/infra/repositories/system-metadata.repository.ts b/server/src/infra/repositories/system-metadata.repository.ts index d43002b0b..5b99cd1dd 100644 --- a/server/src/infra/repositories/system-metadata.repository.ts +++ b/server/src/infra/repositories/system-metadata.repository.ts @@ -2,12 +2,15 @@ import { ISystemMetadataRepository } from '@app/domain/repositories/system-metad import { InjectRepository } from '@nestjs/typeorm'; import { Repository } from 'typeorm'; import { SystemMetadata, SystemMetadataEntity } from '../entities'; +import { Instrumentation } from '../instrumentation'; +@Instrumentation() export class SystemMetadataRepository implements ISystemMetadataRepository { constructor( @InjectRepository(SystemMetadataEntity) private repository: Repository, ) {} + async get(key: T): Promise { const metadata = await this.repository.findOne({ where: { key } }); if (!metadata) { diff --git a/server/src/infra/repositories/tag.repository.ts b/server/src/infra/repositories/tag.repository.ts index 8713f0650..3ac5afd0e 100644 --- a/server/src/infra/repositories/tag.repository.ts +++ b/server/src/infra/repositories/tag.repository.ts @@ -3,7 +3,9 @@ import { AssetEntity, TagEntity } from '@app/infra/entities'; import { Injectable } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import { Repository } from 'typeorm'; +import { Instrumentation } from '../instrumentation'; +@Instrumentation() @Injectable() export class TagRepository implements ITagRepository { constructor( diff --git a/server/src/infra/repositories/user-token.repository.ts b/server/src/infra/repositories/user-token.repository.ts index b5656d922..60eccb2e5 100644 --- a/server/src/infra/repositories/user-token.repository.ts +++ b/server/src/infra/repositories/user-token.repository.ts @@ -4,7 +4,9 @@ import { InjectRepository } from '@nestjs/typeorm'; import { Repository } from 'typeorm'; import { UserTokenEntity } from '../entities'; import { DummyValue, GenerateSql } from '../infra.util'; +import { Instrumentation } from '../instrumentation'; +@Instrumentation() @Injectable() export class UserTokenRepository implements IUserTokenRepository { constructor(@InjectRepository(UserTokenEntity) private repository: Repository) {} diff --git a/server/src/infra/repositories/user.repository.ts b/server/src/infra/repositories/user.repository.ts index d9f12bb31..865a9c8cb 100644 --- a/server/src/infra/repositories/user.repository.ts +++ b/server/src/infra/repositories/user.repository.ts @@ -4,7 +4,9 @@ import { InjectRepository } from '@nestjs/typeorm'; import { IsNull, Not, Repository } from 'typeorm'; import { AssetEntity, UserEntity } from '../entities'; import { DummyValue, GenerateSql } from '../infra.util'; +import { Instrumentation } from '../instrumentation'; +@Instrumentation() @Injectable() export class UserRepository implements IUserRepository { constructor( diff --git a/server/src/microservices/app.service.ts b/server/src/microservices/app.service.ts index 14a6eb691..9fabd5855 100644 --- a/server/src/microservices/app.service.ts +++ b/server/src/microservices/app.service.ts @@ -15,6 +15,7 @@ import { SystemConfigService, UserService, } from '@app/domain'; +import { otelSDK } from '@app/infra/instrumentation'; import { Injectable } from '@nestjs/common'; @Injectable() @@ -87,5 +88,6 @@ export class AppService { async teardown() { await this.libraryService.teardown(); await this.metadataService.teardown(); + await otelSDK.shutdown(); } } diff --git a/server/src/microservices/main.ts b/server/src/microservices/main.ts index 0a85cb37a..f7dc64f57 100644 --- a/server/src/microservices/main.ts +++ b/server/src/microservices/main.ts @@ -1,5 +1,6 @@ import { envName, serverVersion } from '@app/domain'; import { WebSocketAdapter } from '@app/infra'; +import { otelSDK } from '@app/infra/instrumentation'; import { ImmichLogger } from '@app/infra/logger'; import { NestFactory } from '@nestjs/core'; import { MicroservicesModule } from './microservices.module'; @@ -8,8 +9,8 @@ const logger = new ImmichLogger('ImmichMicroservice'); const port = Number(process.env.MICROSERVICES_PORT) || 3002; export async function bootstrap() { + otelSDK.start(); const app = await NestFactory.create(MicroservicesModule, { bufferLogs: true }); - app.useLogger(app.get(ImmichLogger)); app.useWebSocketAdapter(new WebSocketAdapter(app)); From 1b8844cb4a97db68d468215c07595ae1c01fc203 Mon Sep 17 00:00:00 2001 From: Michel Heusschen <59014050+michelheusschen@users.noreply.github.com> Date: Tue, 12 Mar 2024 12:19:38 +0100 Subject: [PATCH 18/45] fix(web): asset upload progress (#7882) --- web/src/lib/utils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/src/lib/utils.ts b/web/src/lib/utils.ts index e4ac01f87..4b1892ae8 100644 --- a/web/src/lib/utils.ts +++ b/web/src/lib/utils.ts @@ -59,7 +59,7 @@ export const uploadRequest = async (options: UploadRequestOptions): Promise<{ }); if (onProgress) { - xhr.addEventListener('progress', (event) => onProgress(event)); + xhr.upload.addEventListener('progress', (event) => onProgress(event)); } xhr.open('POST', url); From 3cd232f571f0f26cf66184adb7cacb984a1da5ef Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 12 Mar 2024 08:07:56 -0400 Subject: [PATCH 19/45] chore(deps): update base-image to v20240312 (major) (#7892) chore(deps): update base-image to v20240312 Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- server/Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/Dockerfile b/server/Dockerfile index e6af34fd6..2c66c0af3 100644 --- a/server/Dockerfile +++ b/server/Dockerfile @@ -1,5 +1,5 @@ # dev build -FROM ghcr.io/immich-app/base-server-dev:20240305@sha256:99ca204d84284dac24dbec59ffeaea07c02f4bd9b06b09e1aa9aacc4f3ece92e as dev +FROM ghcr.io/immich-app/base-server-dev:20240312@sha256:3cb168dd87a2b412b25c512ec638a1e7f362e1d3eb8dd19a38d92d4a7c47999c as dev RUN apt-get install --no-install-recommends -yqq tini WORKDIR /usr/src/app @@ -40,7 +40,7 @@ RUN npm run build # prod build -FROM ghcr.io/immich-app/base-server-prod:20240305@sha256:d0bcac4e77f1371d6c4b8ecc415c390cc348d09e48504d4455f38f2968e41c1c +FROM ghcr.io/immich-app/base-server-prod:20240312@sha256:8359fb1acc56580f2b4835e273293fdaa99d273b210892e1485fc6f1e47cf2bb WORKDIR /usr/src/app ENV NODE_ENV=production \ From 41504b9a2cd2e78a93e02b6f6d88a945d9a71044 Mon Sep 17 00:00:00 2001 From: Michel Heusschen <59014050+michelheusschen@users.noreply.github.com> Date: Tue, 12 Mar 2024 13:09:11 +0100 Subject: [PATCH 20/45] fix(web): asset viewer navigation buttons (#7888) --- .../lib/components/asset-viewer/asset-viewer.svelte | 12 ++++++------ .../components/asset-viewer/navigation-area.svelte | 10 ++++++++-- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/web/src/lib/components/asset-viewer/asset-viewer.svelte b/web/src/lib/components/asset-viewer/asset-viewer.svelte index 5f32c000c..b1f70cbeb 100644 --- a/web/src/lib/components/asset-viewer/asset-viewer.svelte +++ b/web/src/lib/components/asset-viewer/asset-viewer.svelte @@ -592,9 +592,9 @@ {#if $slideshowState === SlideshowState.None && showNavigation}
- navigateAsset('previous', e)} - > + navigateAsset('previous', e)} label="View previous asset"> + +
{/if} @@ -708,9 +708,9 @@ {#if $slideshowState === SlideshowState.None && showNavigation}
- navigateAsset('next', e)} - > + navigateAsset('next', e)} label="View next asset"> + +
{/if} diff --git a/web/src/lib/components/asset-viewer/navigation-area.svelte b/web/src/lib/components/asset-viewer/navigation-area.svelte index 093f55588..efa2761cb 100644 --- a/web/src/lib/components/asset-viewer/navigation-area.svelte +++ b/web/src/lib/components/asset-viewer/navigation-area.svelte @@ -1,9 +1,15 @@ -
-
From 6bfa1fceec601c6ef56b31856f46dd471b57edd0 Mon Sep 17 00:00:00 2001 From: bo0tzz Date: Tue, 12 Mar 2024 13:11:40 +0100 Subject: [PATCH 21/45] chore(cli): Version 2.1.0 (#7893) --- cli/package-lock.json | 4 ++-- cli/package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cli/package-lock.json b/cli/package-lock.json index a9dfd9d49..2502656f7 100644 --- a/cli/package-lock.json +++ b/cli/package-lock.json @@ -1,12 +1,12 @@ { "name": "@immich/cli", - "version": "2.0.8", + "version": "2.1.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@immich/cli", - "version": "2.0.8", + "version": "2.1.0", "license": "GNU Affero General Public License version 3", "dependencies": { "lodash-es": "^4.17.21" diff --git a/cli/package.json b/cli/package.json index 630add5b0..b76c24f94 100644 --- a/cli/package.json +++ b/cli/package.json @@ -1,6 +1,6 @@ { "name": "@immich/cli", - "version": "2.0.8", + "version": "2.1.0", "description": "Command Line Interface (CLI) for Immich", "type": "module", "exports": "./dist/index.js", From c24b6cf61715e1c2c7c5b8ef40aca96a02c5c7d7 Mon Sep 17 00:00:00 2001 From: Michel Heusschen <59014050+michelheusschen@users.noreply.github.com> Date: Tue, 12 Mar 2024 14:11:16 +0100 Subject: [PATCH 22/45] refactor(web): sidebar menu links (#7891) --- .../side-bar/admin-side-bar.svelte | 38 ++----- ...bar-button.svelte => side-bar-link.svelte} | 30 ++--- .../side-bar/side-bar.svelte | 106 ++++++++---------- 3 files changed, 70 insertions(+), 104 deletions(-) rename web/src/lib/components/shared-components/side-bar/{side-bar-button.svelte => side-bar-link.svelte} (78%) diff --git a/web/src/lib/components/shared-components/side-bar/admin-side-bar.svelte b/web/src/lib/components/shared-components/side-bar/admin-side-bar.svelte index 0d79ae961..658c029fd 100644 --- a/web/src/lib/components/shared-components/side-bar/admin-side-bar.svelte +++ b/web/src/lib/components/shared-components/side-bar/admin-side-bar.svelte @@ -1,6 +1,5 @@ - - - - - - - - - - - - - - - - - - + +
diff --git a/web/src/lib/components/shared-components/side-bar/side-bar-button.svelte b/web/src/lib/components/shared-components/side-bar/side-bar-link.svelte similarity index 78% rename from web/src/lib/components/shared-components/side-bar/side-bar-button.svelte rename to web/src/lib/components/shared-components/side-bar/side-bar-link.svelte index fbefb2eb5..c3816863a 100644 --- a/web/src/lib/components/shared-components/side-bar/side-bar-button.svelte +++ b/web/src/lib/components/shared-components/side-bar/side-bar-link.svelte @@ -1,26 +1,27 @@ - -
- -

{title}

+ + {title}
-
+ diff --git a/web/src/lib/components/shared-components/side-bar/side-bar.svelte b/web/src/lib/components/shared-components/side-bar/side-bar.svelte index cb59511ff..cfb0a6bde 100644 --- a/web/src/lib/components/shared-components/side-bar/side-bar.svelte +++ b/web/src/lib/components/shared-components/side-bar/side-bar.svelte @@ -1,5 +1,4 @@ - - + {#await getStats({ isArchived: false })} @@ -56,29 +54,24 @@
{/await} - - - {#if $featureFlags.search} - - - - {/if} - {#if $featureFlags.map} - - - - {/if} - {#if $sidebarSettings.people} - - - - {/if} - {#if $sidebarSettings.sharing} - - + {#if $featureFlags.search} + + {/if} + + {#if $featureFlags.map} + + {/if} + + {#if $sidebarSettings.people} + + {/if} + {#if $sidebarSettings.sharing} + {#await handleAlbumCount()} @@ -89,19 +82,18 @@ {/await} - - - {/if} + + {/if} -
- -
-
- - + +
+ + {#await getStats({ isFavorite: true })} @@ -113,15 +105,8 @@ {/await} -
-
- - + + {#await handleAlbumCount()} @@ -131,10 +116,9 @@ {/await} - - - - + + + {#await getStats({ isArchived: true })} @@ -145,12 +129,10 @@ {/await} - - + - {#if $featureFlags.trash} - - + {#if $featureFlags.trash} + {#await getStats({ isTrashed: true })} @@ -161,9 +143,9 @@ {/await} - - - {/if} + + {/if} +
From 4733de25afc1fe1daac3312f9eb234a3a8c0ae54 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 12 Mar 2024 09:31:09 -0400 Subject: [PATCH 23/45] chore(deps): bump softprops/action-gh-release from 1 to 2 (#7844) Bumps [softprops/action-gh-release](https://github.com/softprops/action-gh-release) from 1 to 2. - [Release notes](https://github.com/softprops/action-gh-release/releases) - [Changelog](https://github.com/softprops/action-gh-release/blob/master/CHANGELOG.md) - [Commits](https://github.com/softprops/action-gh-release/compare/v1...v2) --- updated-dependencies: - dependency-name: softprops/action-gh-release dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/prepare-release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/prepare-release.yml b/.github/workflows/prepare-release.yml index b98c1563a..000dbe2dd 100644 --- a/.github/workflows/prepare-release.yml +++ b/.github/workflows/prepare-release.yml @@ -74,7 +74,7 @@ jobs: name: release-apk-signed - name: Create draft release - uses: softprops/action-gh-release@v1 + uses: softprops/action-gh-release@v2 with: draft: true tag_name: ${{ env.IMMICH_VERSION }} From 7489db9481ddd934e77974c5210474d34c78b5b3 Mon Sep 17 00:00:00 2001 From: shenlong <139912620+shenlong-tanwen@users.noreply.github.com> Date: Tue, 12 Mar 2024 14:56:08 +0000 Subject: [PATCH 24/45] refactor(mobile): app settings (#7749) * refactor(mobile): app settings * Font size * refactor(mobile): backup settings ui (#7771) * refactor: SettingsButtonListTile * refactor: Backup settings to App settings --------- Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com> * fix: invalidate appsettingsprovider on timeline setting change * styling --------- Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com> Co-authored-by: Alex Tran --- mobile/assets/i18n/en-US.json | 6 +- .../providers/asset_people.provider.g.dart | 6 +- .../video_player_controller_provider.g.dart | 2 +- .../backup_verification.provider.dart | 109 ++++ .../backup_verification.provider.g.dart | 27 + .../backup/views/backup_options_page.dart | 502 +----------------- .../settings/models/store_model_here.txt | 0 .../settings/ui/advanced_settings.dart | 69 +++ .../advanced_settings/advanced_settings.dart | 108 ---- .../asset_list_group_settings.dart | 53 ++ .../asset_list_layout_settings.dart | 110 +--- .../asset_list_settings.dart | 46 +- .../asset_list_storage_indicator.dart | 46 -- .../asset_list_tiles_per_row.dart | 57 -- .../backup_settings/background_settings.dart | 234 ++++++++ .../ui/backup_settings/backup_settings.dart | 68 +++ .../backup_settings/foreground_settings.dart | 36 ++ .../ui/image_viewer_quality_setting.dart | 41 ++ .../image_viewer_quality_setting.dart | 62 --- .../settings/ui/local_storage_settings.dart | 54 ++ .../local_storage_settings.dart | 61 --- .../settings/ui/notification_setting.dart | 118 ++++ .../notification_setting.dart | 168 ------ .../preference_setting.dart | 18 + .../ui/preference_settings/theme_setting.dart | 81 +++ .../ui/settings_button_list_tile.dart | 50 ++ .../settings/ui/settings_radio_list_tile.dart | 47 ++ .../ui/settings_slider_list_tile.dart | 49 ++ .../ui/settings_sub_page_scaffold.dart | 30 ++ .../settings/ui/settings_sub_title.dart | 25 + .../ui/settings_switch_list_tile.dart | 46 +- .../ui/theme_setting/theme_setting.dart | 98 ---- .../utils/app_settings_update_hook.dart | 18 + .../modules/settings/views/settings_page.dart | 135 +++-- .../settings/views/settings_sub_page.dart | 22 + mobile/lib/routing/router.dart | 2 + mobile/lib/routing/router.gr.dart | 48 ++ mobile/lib/shared/ui/immich_toast.dart | 2 +- 38 files changed, 1389 insertions(+), 1265 deletions(-) create mode 100644 mobile/lib/modules/backup/providers/backup_verification.provider.dart create mode 100644 mobile/lib/modules/backup/providers/backup_verification.provider.g.dart delete mode 100644 mobile/lib/modules/settings/models/store_model_here.txt create mode 100644 mobile/lib/modules/settings/ui/advanced_settings.dart delete mode 100644 mobile/lib/modules/settings/ui/advanced_settings/advanced_settings.dart create mode 100644 mobile/lib/modules/settings/ui/asset_list_settings/asset_list_group_settings.dart delete mode 100644 mobile/lib/modules/settings/ui/asset_list_settings/asset_list_storage_indicator.dart delete mode 100644 mobile/lib/modules/settings/ui/asset_list_settings/asset_list_tiles_per_row.dart create mode 100644 mobile/lib/modules/settings/ui/backup_settings/background_settings.dart create mode 100644 mobile/lib/modules/settings/ui/backup_settings/backup_settings.dart create mode 100644 mobile/lib/modules/settings/ui/backup_settings/foreground_settings.dart create mode 100644 mobile/lib/modules/settings/ui/image_viewer_quality_setting.dart delete mode 100644 mobile/lib/modules/settings/ui/image_viewer_quality_setting/image_viewer_quality_setting.dart create mode 100644 mobile/lib/modules/settings/ui/local_storage_settings.dart delete mode 100644 mobile/lib/modules/settings/ui/local_storage_settings/local_storage_settings.dart create mode 100644 mobile/lib/modules/settings/ui/notification_setting.dart delete mode 100644 mobile/lib/modules/settings/ui/notification_setting/notification_setting.dart create mode 100644 mobile/lib/modules/settings/ui/preference_settings/preference_setting.dart create mode 100644 mobile/lib/modules/settings/ui/preference_settings/theme_setting.dart create mode 100644 mobile/lib/modules/settings/ui/settings_button_list_tile.dart create mode 100644 mobile/lib/modules/settings/ui/settings_radio_list_tile.dart create mode 100644 mobile/lib/modules/settings/ui/settings_slider_list_tile.dart create mode 100644 mobile/lib/modules/settings/ui/settings_sub_page_scaffold.dart create mode 100644 mobile/lib/modules/settings/ui/settings_sub_title.dart delete mode 100644 mobile/lib/modules/settings/ui/theme_setting/theme_setting.dart create mode 100644 mobile/lib/modules/settings/utils/app_settings_update_hook.dart create mode 100644 mobile/lib/modules/settings/views/settings_sub_page.dart diff --git a/mobile/assets/i18n/en-US.json b/mobile/assets/i18n/en-US.json index 200b46ccc..9da867386 100644 --- a/mobile/assets/i18n/en-US.json +++ b/mobile/assets/i18n/en-US.json @@ -43,7 +43,11 @@ "asset_list_layout_settings_group_by_month": "Month", "asset_list_layout_settings_group_by_month_day": "Month + day", "asset_list_settings_subtitle": "Photo grid layout settings", - "asset_list_settings_title": "Photo Grid", + "asset_list_settings_title": "Timeline", + "asset_list_group_by_sub_title": "Group by", + "asset_list_layout_sub_title": "Layout", + "asset_viewer_settings_title": "Asset Viewer", + "preferences_settings_title": "Preferences", "backup_album_selection_page_albums_device": "Albums on device ({})", "backup_album_selection_page_albums_tap": "Tap to include, double tap to exclude", "backup_album_selection_page_assets_scatter": "Assets can scatter across multiple albums. Thus, albums can be included or excluded during the backup process.", diff --git a/mobile/lib/modules/asset_viewer/providers/asset_people.provider.g.dart b/mobile/lib/modules/asset_viewer/providers/asset_people.provider.g.dart index 449d5b6c8..df6ee779c 100644 --- a/mobile/lib/modules/asset_viewer/providers/asset_people.provider.g.dart +++ b/mobile/lib/modules/asset_viewer/providers/asset_people.provider.g.dart @@ -7,7 +7,7 @@ part of 'asset_people.provider.dart'; // ************************************************************************** String _$assetPeopleNotifierHash() => - r'192a4ee188f781000fe43f1675c49e1081ccc631'; + r'9835b180984a750c91e923e7b64dbda94f6d7574'; /// Copied from Dart SDK class _SystemHash { @@ -34,7 +34,7 @@ abstract class _$AssetPeopleNotifier extends BuildlessAutoDisposeAsyncNotifier< List> { late final Asset asset; - Future> build( + FutureOr> build( Asset asset, ); } @@ -127,7 +127,7 @@ class AssetPeopleNotifierProvider extends AutoDisposeAsyncNotifierProviderImpl< final Asset asset; @override - Future> runNotifierBuild( + FutureOr> runNotifierBuild( covariant AssetPeopleNotifier notifier, ) { return notifier.build( diff --git a/mobile/lib/modules/asset_viewer/providers/video_player_controller_provider.g.dart b/mobile/lib/modules/asset_viewer/providers/video_player_controller_provider.g.dart index a9b287e95..e447304b3 100644 --- a/mobile/lib/modules/asset_viewer/providers/video_player_controller_provider.g.dart +++ b/mobile/lib/modules/asset_viewer/providers/video_player_controller_provider.g.dart @@ -7,7 +7,7 @@ part of 'video_player_controller_provider.dart'; // ************************************************************************** String _$videoPlayerControllerHash() => - r'72b45de66542021717807655e25ec92d78d80eec'; + r'40b31f7b1a73fab84c311b0f06bedf5322143cd9'; /// Copied from Dart SDK class _SystemHash { diff --git a/mobile/lib/modules/backup/providers/backup_verification.provider.dart b/mobile/lib/modules/backup/providers/backup_verification.provider.dart new file mode 100644 index 000000000..1cc537913 --- /dev/null +++ b/mobile/lib/modules/backup/providers/backup_verification.provider.dart @@ -0,0 +1,109 @@ +import 'dart:async'; + +import 'package:connectivity_plus/connectivity_plus.dart'; +import 'package:flutter/material.dart'; +import 'package:immich_mobile/modules/backup/providers/backup.provider.dart'; +import 'package:immich_mobile/modules/backup/services/backup_verification.service.dart'; +import 'package:immich_mobile/shared/models/asset.dart'; +import 'package:immich_mobile/shared/providers/asset.provider.dart'; +import 'package:immich_mobile/shared/ui/confirm_dialog.dart'; +import 'package:immich_mobile/shared/ui/immich_toast.dart'; +import 'package:riverpod_annotation/riverpod_annotation.dart'; +import 'package:wakelock_plus/wakelock_plus.dart'; + +part 'backup_verification.provider.g.dart'; + +@riverpod +class BackupVerification extends _$BackupVerification { + @override + bool build() => false; + + void performBackupCheck(BuildContext context) async { + try { + state = true; + final backupState = ref.read(backupProvider); + + if (backupState.allUniqueAssets.length > + backupState.selectedAlbumsBackupAssetsIds.length) { + if (context.mounted) { + ImmichToast.show( + context: context, + msg: "Backup all assets before starting this check!", + toastType: ToastType.error, + ); + } + return; + } + final connection = await Connectivity().checkConnectivity(); + if (connection != ConnectivityResult.wifi) { + if (context.mounted) { + ImmichToast.show( + context: context, + msg: "Make sure to be connected to unmetered Wi-Fi", + toastType: ToastType.error, + ); + } + return; + } + WakelockPlus.enable(); + + const limit = 100; + final toDelete = await ref + .read(backupVerificationServiceProvider) + .findWronglyBackedUpAssets(limit: limit); + if (toDelete.isEmpty) { + if (context.mounted) { + ImmichToast.show( + context: context, + msg: "Did not find any corrupt asset backups!", + toastType: ToastType.success, + ); + } + } else { + if (context.mounted) { + await showDialog( + context: context, + builder: (ctx) => ConfirmDialog( + onOk: () => _performDeletion(context, toDelete), + title: "Corrupt backups!", + ok: "Delete", + content: + "Found ${toDelete.length} (max $limit at once) corrupt asset backups. " + "Run the check again to find more.\n" + "Do you want to delete the corrupt asset backups now?", + ), + ); + } + } + } finally { + WakelockPlus.disable(); + state = false; + } + } + + Future _performDeletion( + BuildContext context, + List assets, + ) async { + try { + state = true; + if (context.mounted) { + ImmichToast.show( + context: context, + msg: "Deleting ${assets.length} assets on the server...", + ); + } + await ref.read(assetProvider.notifier).deleteAssets(assets, force: true); + if (context.mounted) { + ImmichToast.show( + context: context, + msg: "Deleted ${assets.length} assets on the server. " + "You can now start a manual backup", + toastType: ToastType.success, + ); + } + } finally { + state = false; + } + } +} diff --git a/mobile/lib/modules/backup/providers/backup_verification.provider.g.dart b/mobile/lib/modules/backup/providers/backup_verification.provider.g.dart new file mode 100644 index 000000000..f222c9bd8 --- /dev/null +++ b/mobile/lib/modules/backup/providers/backup_verification.provider.g.dart @@ -0,0 +1,27 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'backup_verification.provider.dart'; + +// ************************************************************************** +// RiverpodGenerator +// ************************************************************************** + +String _$backupVerificationHash() => + r'b691e0cc27856eef189258d3c102cc73ce4812a4'; + +/// See also [BackupVerification]. +@ProviderFor(BackupVerification) +final backupVerificationProvider = + AutoDisposeNotifierProvider.internal( + BackupVerification.new, + name: r'backupVerificationProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$backupVerificationHash, + dependencies: null, + allTransitiveDependencies: null, +); + +typedef _$BackupVerification = AutoDisposeNotifier; +// ignore_for_file: type=lint +// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member diff --git a/mobile/lib/modules/backup/views/backup_options_page.dart b/mobile/lib/modules/backup/views/backup_options_page.dart index 8144f1b8e..b37ded6a6 100644 --- a/mobile/lib/modules/backup/views/backup_options_page.dart +++ b/mobile/lib/modules/backup/views/backup_options_page.dart @@ -1,487 +1,12 @@ -import 'dart:io'; - import 'package:auto_route/auto_route.dart'; -import 'package:connectivity_plus/connectivity_plus.dart'; -import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_hooks/flutter_hooks.dart'; -import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:immich_mobile/extensions/build_context_extensions.dart'; -import 'package:immich_mobile/modules/backup/background_service/background.service.dart'; -import 'package:immich_mobile/modules/backup/models/backup_state.model.dart'; -import 'package:immich_mobile/modules/backup/providers/backup.provider.dart'; -import 'package:immich_mobile/modules/backup/providers/ios_background_settings.provider.dart'; -import 'package:immich_mobile/modules/backup/services/backup_verification.service.dart'; -import 'package:immich_mobile/modules/backup/ui/ios_debug_info_tile.dart'; -import 'package:immich_mobile/modules/settings/providers/app_settings.provider.dart'; -import 'package:immich_mobile/modules/settings/services/app_settings.service.dart'; -import 'package:immich_mobile/shared/models/asset.dart'; -import 'package:immich_mobile/shared/providers/asset.provider.dart'; -import 'package:immich_mobile/shared/ui/confirm_dialog.dart'; -import 'package:immich_mobile/shared/ui/immich_toast.dart'; -import 'package:permission_handler/permission_handler.dart'; -import 'package:url_launcher/url_launcher.dart'; -import 'package:wakelock_plus/wakelock_plus.dart'; +import 'package:immich_mobile/modules/settings/ui/backup_settings/backup_settings.dart'; @RoutePage() -class BackupOptionsPage extends HookConsumerWidget { +class BackupOptionsPage extends StatelessWidget { const BackupOptionsPage({super.key}); @override - Widget build(BuildContext context, WidgetRef ref) { - BackUpState backupState = ref.watch(backupProvider); - final settings = ref.watch(iOSBackgroundSettingsProvider.notifier).settings; - final settingsService = ref.watch(appSettingsServiceProvider); - final showBackupFix = Platform.isAndroid && - settingsService.getSetting(AppSettingsEnum.advancedTroubleshooting); - final ignoreIcloudAssets = useState( - settingsService.getSetting(AppSettingsEnum.ignoreIcloudAssets), - ); - final appRefreshDisabled = - Platform.isIOS && settings?.appRefreshEnabled != true; - final checkInProgress = useState(false); - - Future performDeletion(List assets) async { - try { - checkInProgress.value = true; - ImmichToast.show( - context: context, - msg: "Deleting ${assets.length} assets on the server...", - ); - await ref - .read(assetProvider.notifier) - .deleteAssets(assets, force: true); - ImmichToast.show( - context: context, - msg: "Deleted ${assets.length} assets on the server. " - "You can now start a manual backup", - toastType: ToastType.success, - ); - } finally { - checkInProgress.value = false; - } - } - - void performBackupCheck() async { - try { - checkInProgress.value = true; - if (backupState.allUniqueAssets.length > - backupState.selectedAlbumsBackupAssetsIds.length) { - ImmichToast.show( - context: context, - msg: "Backup all assets before starting this check!", - toastType: ToastType.error, - ); - return; - } - final connection = await Connectivity().checkConnectivity(); - if (connection != ConnectivityResult.wifi) { - ImmichToast.show( - context: context, - msg: "Make sure to be connected to unmetered Wi-Fi", - toastType: ToastType.error, - ); - return; - } - WakelockPlus.enable(); - const limit = 100; - final toDelete = await ref - .read(backupVerificationServiceProvider) - .findWronglyBackedUpAssets(limit: limit); - if (toDelete.isEmpty) { - ImmichToast.show( - context: context, - msg: "Did not find any corrupt asset backups!", - toastType: ToastType.success, - ); - } else { - await showDialog( - context: context, - builder: (context) => ConfirmDialog( - onOk: () => performDeletion(toDelete), - title: "Corrupt backups!", - ok: "Delete", - content: - "Found ${toDelete.length} (max $limit at once) corrupt asset backups. " - "Run the check again to find more.\n" - "Do you want to delete the corrupt asset backups now?", - ), - ); - } - } finally { - WakelockPlus.disable(); - checkInProgress.value = false; - } - } - - Widget buildCheckCorruptBackups() { - return ListTile( - leading: Icon( - Icons.warning_rounded, - color: context.primaryColor, - ), - title: const Text( - "Check for corrupt asset backups", - style: TextStyle(fontWeight: FontWeight.bold, fontSize: 14), - ), - isThreeLine: true, - subtitle: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - const Text("Run this check only over Wi-Fi and once all assets " - "have been backed-up. The procedure might take a few minutes."), - ElevatedButton( - onPressed: checkInProgress.value ? null : performBackupCheck, - child: checkInProgress.value - ? const CircularProgressIndicator() - : const Text("Perform check"), - ), - ], - ), - ); - } - - void showErrorToUser(String msg) { - final snackBar = SnackBar( - content: Text( - msg.tr(), - style: context.textTheme.bodyLarge?.copyWith( - color: context.primaryColor, - ), - ), - backgroundColor: Colors.red, - ); - ScaffoldMessenger.of(context).showSnackBar(snackBar); - } - - void showBatteryOptimizationInfoToUser() { - showDialog( - context: context, - barrierDismissible: false, - builder: (BuildContext context) { - return AlertDialog( - title: const Text( - 'backup_controller_page_background_battery_info_title', - ).tr(), - content: SingleChildScrollView( - child: const Text( - 'backup_controller_page_background_battery_info_message', - ).tr(), - ), - actions: [ - ElevatedButton( - onPressed: () => launchUrl( - Uri.parse('https://dontkillmyapp.com'), - mode: LaunchMode.externalApplication, - ), - child: const Text( - "backup_controller_page_background_battery_info_link", - style: TextStyle(fontWeight: FontWeight.bold, fontSize: 12), - ).tr(), - ), - ElevatedButton( - child: const Text( - 'backup_controller_page_background_battery_info_ok', - style: TextStyle(fontWeight: FontWeight.bold, fontSize: 12), - ).tr(), - onPressed: () { - context.pop(); - }, - ), - ], - ); - }, - ); - } - - Widget buildBackgroundBackupController() { - final bool isBackgroundEnabled = backupState.backgroundBackup; - final bool isWifiRequired = backupState.backupRequireWifi; - final bool isChargingRequired = backupState.backupRequireCharging; - final Color activeColor = context.primaryColor; - - String formatBackupDelaySliderValue(double v) { - if (v == 0.0) { - return 'setting_notifications_notify_seconds'.tr(args: const ['5']); - } else if (v == 1.0) { - return 'setting_notifications_notify_seconds'.tr(args: const ['30']); - } else if (v == 2.0) { - return 'setting_notifications_notify_minutes'.tr(args: const ['2']); - } else { - return 'setting_notifications_notify_minutes'.tr(args: const ['10']); - } - } - - int backupDelayToMilliseconds(double v) { - if (v == 0.0) { - return 5000; - } else if (v == 1.0) { - return 30000; - } else if (v == 2.0) { - return 120000; - } else { - return 600000; - } - } - - double backupDelayToSliderValue(int ms) { - if (ms == 5000) { - return 0.0; - } else if (ms == 30000) { - return 1.0; - } else if (ms == 120000) { - return 2.0; - } else { - return 3.0; - } - } - - final triggerDelay = - useState(backupDelayToSliderValue(backupState.backupTriggerDelay)); - - return Column( - children: [ - ListTile( - isThreeLine: true, - leading: isBackgroundEnabled - ? Icon( - Icons.cloud_sync_rounded, - color: activeColor, - ) - : const Icon(Icons.cloud_sync_rounded), - title: Text( - isBackgroundEnabled - ? "backup_controller_page_background_is_on" - : "backup_controller_page_background_is_off", - style: context.textTheme.titleSmall, - ).tr(), - subtitle: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - if (!isBackgroundEnabled) - Padding( - padding: const EdgeInsets.symmetric(vertical: 8.0), - child: const Text( - "backup_controller_page_background_description", - ).tr(), - ), - if (isBackgroundEnabled) - SwitchListTile.adaptive( - title: const Text("backup_controller_page_background_wifi") - .tr(), - secondary: Icon( - Icons.wifi, - color: isWifiRequired ? activeColor : null, - ), - dense: true, - activeColor: activeColor, - value: isWifiRequired, - onChanged: (isChecked) => ref - .read(backupProvider.notifier) - .configureBackgroundBackup( - requireWifi: isChecked, - onError: showErrorToUser, - onBatteryInfo: showBatteryOptimizationInfoToUser, - ), - ), - if (isBackgroundEnabled) - SwitchListTile.adaptive( - title: - const Text("backup_controller_page_background_charging") - .tr(), - secondary: Icon( - Icons.charging_station, - color: isChargingRequired ? activeColor : null, - ), - dense: true, - activeColor: activeColor, - value: isChargingRequired, - onChanged: (isChecked) => ref - .read(backupProvider.notifier) - .configureBackgroundBackup( - requireCharging: isChecked, - onError: showErrorToUser, - onBatteryInfo: showBatteryOptimizationInfoToUser, - ), - ), - if (isBackgroundEnabled && Platform.isAndroid) - ListTile( - isThreeLine: false, - dense: true, - title: const Text( - 'backup_controller_page_background_delay', - style: TextStyle( - fontWeight: FontWeight.bold, - ), - ).tr( - args: [formatBackupDelaySliderValue(triggerDelay.value)], - ), - subtitle: Slider( - value: triggerDelay.value, - onChanged: (double v) => triggerDelay.value = v, - onChangeEnd: (double v) => ref - .read(backupProvider.notifier) - .configureBackgroundBackup( - triggerDelay: backupDelayToMilliseconds(v), - onError: showErrorToUser, - onBatteryInfo: showBatteryOptimizationInfoToUser, - ), - max: 3.0, - divisions: 3, - label: formatBackupDelaySliderValue(triggerDelay.value), - activeColor: context.primaryColor, - ), - ), - ElevatedButton( - onPressed: () => ref - .read(backupProvider.notifier) - .configureBackgroundBackup( - enabled: !isBackgroundEnabled, - onError: showErrorToUser, - onBatteryInfo: showBatteryOptimizationInfoToUser, - ), - child: Text( - isBackgroundEnabled - ? "backup_controller_page_background_turn_off" - : "backup_controller_page_background_turn_on", - style: context.textTheme.labelLarge?.copyWith( - color: context.isDarkTheme ? Colors.black : Colors.white, - ), - ).tr(), - ), - ], - ), - ), - if (isBackgroundEnabled && Platform.isIOS) - FutureBuilder( - future: ref - .read(backgroundServiceProvider) - .getIOSBackgroundAppRefreshEnabled(), - builder: (context, snapshot) { - final enabled = snapshot.data; - // If it's not enabled, show them some kind of alert that says - // background refresh is not enabled - if (enabled != null && !enabled) {} - // If it's enabled, no need to bother them - return Container(); - }, - ), - if (Platform.isIOS && isBackgroundEnabled && settings != null) - IosDebugInfoTile( - settings: settings, - ), - ], - ); - } - - Widget buildBackgroundAppRefreshWarning() { - return ListTile( - isThreeLine: true, - leading: const Icon( - Icons.task_outlined, - ), - title: const Text( - 'backup_controller_page_background_app_refresh_disabled_title', - style: TextStyle( - fontWeight: FontWeight.bold, - fontSize: 14, - ), - ).tr(), - subtitle: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Padding( - padding: const EdgeInsets.symmetric(vertical: 8.0), - child: const Text( - 'backup_controller_page_background_app_refresh_disabled_content', - ).tr(), - ), - ElevatedButton( - onPressed: () => openAppSettings(), - child: const Text( - 'backup_controller_page_background_app_refresh_enable_button_text', - style: TextStyle( - fontWeight: FontWeight.bold, - fontSize: 12, - ), - ).tr(), - ), - ], - ), - ); - } - - ListTile buildAutoBackupController() { - final isAutoBackup = backupState.autoBackup; - final backUpOption = isAutoBackup - ? "backup_controller_page_status_on".tr() - : "backup_controller_page_status_off".tr(); - final backupBtnText = isAutoBackup - ? "backup_controller_page_turn_off".tr() - : "backup_controller_page_turn_on".tr(); - return ListTile( - isThreeLine: true, - leading: isAutoBackup - ? Icon( - Icons.cloud_done_rounded, - color: context.primaryColor, - ) - : const Icon(Icons.cloud_off_rounded), - title: Text( - backUpOption, - style: context.textTheme.titleSmall, - ), - subtitle: Padding( - padding: const EdgeInsets.symmetric(vertical: 8.0), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - if (!isAutoBackup) - const Text( - "backup_controller_page_desc_backup", - ).tr(), - Padding( - padding: const EdgeInsets.only(top: 8.0), - child: ElevatedButton( - onPressed: () => ref - .read(backupProvider.notifier) - .setAutoBackup(!isAutoBackup), - child: Text( - backupBtnText, - style: context.textTheme.labelLarge?.copyWith( - color: context.isDarkTheme ? Colors.black : Colors.white, - ), - ), - ), - ), - ], - ), - ), - ); - } - - void switchChanged(bool value) { - settingsService.setSetting(AppSettingsEnum.ignoreIcloudAssets, value); - ignoreIcloudAssets.value = value; - ref.invalidate(appSettingsServiceProvider); - } - - buildIgnoreIcloudAssetSetting() { - return [ - const Divider(), - SwitchListTile.adaptive( - title: const Text( - "Ignore iCloud photos", - style: TextStyle(fontWeight: FontWeight.bold), - ), - subtitle: const Text( - "Photos that are stored on iCloud will not be uploaded to the Immich server", - ), - value: ignoreIcloudAssets.value, - onChanged: switchChanged, - ), - ]; - } - + Widget build(BuildContext context) { return Scaffold( appBar: AppBar( elevation: 0, @@ -496,26 +21,7 @@ class BackupOptionsPage extends HookConsumerWidget { ), ), ), - body: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16.0, vertical: 32.0), - child: ListView( - children: [ - buildAutoBackupController(), - const Divider(), - AnimatedSwitcher( - duration: const Duration(milliseconds: 500), - child: Platform.isIOS - ? (appRefreshDisabled - ? buildBackgroundAppRefreshWarning() - : buildBackgroundBackupController()) - : buildBackgroundBackupController(), - ), - if (Platform.isIOS) ...buildIgnoreIcloudAssetSetting(), - if (showBackupFix) const Divider(), - if (showBackupFix) buildCheckCorruptBackups(), - ], - ), - ), + body: const BackupSettings(), ); } } diff --git a/mobile/lib/modules/settings/models/store_model_here.txt b/mobile/lib/modules/settings/models/store_model_here.txt deleted file mode 100644 index e69de29bb..000000000 diff --git a/mobile/lib/modules/settings/ui/advanced_settings.dart b/mobile/lib/modules/settings/ui/advanced_settings.dart new file mode 100644 index 000000000..65089ac5b --- /dev/null +++ b/mobile/lib/modules/settings/ui/advanced_settings.dart @@ -0,0 +1,69 @@ +import 'dart:io'; +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_hooks/flutter_hooks.dart' hide Store; +import 'package:immich_mobile/modules/settings/ui/local_storage_settings.dart'; +import 'package:immich_mobile/modules/settings/ui/settings_slider_list_tile.dart'; +import 'package:immich_mobile/modules/settings/ui/settings_sub_page_scaffold.dart'; +import 'package:immich_mobile/modules/settings/ui/settings_switch_list_tile.dart'; +import 'package:immich_mobile/modules/settings/utils/app_settings_update_hook.dart'; +import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:immich_mobile/modules/settings/services/app_settings.service.dart'; +import 'package:immich_mobile/shared/providers/user.provider.dart'; +import 'package:immich_mobile/shared/services/immich_logger.service.dart'; +import 'package:immich_mobile/utils/http_ssl_cert_override.dart'; +import 'package:logging/logging.dart'; + +class AdvancedSettings extends HookConsumerWidget { + const AdvancedSettings({super.key}); + @override + Widget build(BuildContext context, WidgetRef ref) { + bool isLoggedIn = ref.read(currentUserProvider) != null; + + final advancedTroubleshooting = + useAppSettingsState(AppSettingsEnum.advancedTroubleshooting); + final levelId = useAppSettingsState(AppSettingsEnum.logLevel); + final preferRemote = useAppSettingsState(AppSettingsEnum.preferRemoteImage); + final allowSelfSignedSSLCert = + useAppSettingsState(AppSettingsEnum.allowSelfSignedSSLCert); + + final logLevel = Level.LEVELS[levelId.value].name; + + useValueChanged( + levelId.value, + (_, __) => ImmichLogger().level = Level.LEVELS[levelId.value], + ); + + final advancedSettings = [ + SettingsSwitchListTile( + enabled: true, + valueNotifier: advancedTroubleshooting, + title: "advanced_settings_troubleshooting_title".tr(), + subtitle: "advanced_settings_troubleshooting_subtitle".tr(), + ), + SettingsSliderListTile( + text: "advanced_settings_log_level_title".tr(args: [logLevel]), + valueNotifier: levelId, + maxValue: 8, + minValue: 1, + noDivisons: 7, + label: logLevel, + ), + SettingsSwitchListTile( + valueNotifier: preferRemote, + title: "advanced_settings_prefer_remote_title".tr(), + subtitle: "advanced_settings_prefer_remote_subtitle".tr(), + ), + const LocalStorageSettings(), + SettingsSwitchListTile( + enabled: !isLoggedIn, + valueNotifier: allowSelfSignedSSLCert, + title: "advanced_settings_self_signed_ssl_title".tr(), + subtitle: "advanced_settings_self_signed_ssl_subtitle".tr(), + onChanged: (_) => HttpOverrides.global = HttpSSLCertOverride(), + ), + ]; + + return SettingsSubPageScaffold(settings: advancedSettings); + } +} diff --git a/mobile/lib/modules/settings/ui/advanced_settings/advanced_settings.dart b/mobile/lib/modules/settings/ui/advanced_settings/advanced_settings.dart deleted file mode 100644 index d0397fe5a..000000000 --- a/mobile/lib/modules/settings/ui/advanced_settings/advanced_settings.dart +++ /dev/null @@ -1,108 +0,0 @@ -import 'dart:io'; -import 'package:easy_localization/easy_localization.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_hooks/flutter_hooks.dart' show useEffect, useState; -import 'package:immich_mobile/extensions/build_context_extensions.dart'; -import 'package:immich_mobile/shared/models/store.dart'; -import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:immich_mobile/modules/settings/providers/app_settings.provider.dart'; -import 'package:immich_mobile/modules/settings/services/app_settings.service.dart'; -import 'package:immich_mobile/modules/settings/ui/settings_switch_list_tile.dart'; -import 'package:immich_mobile/shared/services/immich_logger.service.dart'; -import 'package:immich_mobile/utils/http_ssl_cert_override.dart'; -import 'package:logging/logging.dart'; - -class AdvancedSettings extends HookConsumerWidget { - const AdvancedSettings({super.key}); - @override - Widget build(BuildContext context, WidgetRef ref) { - bool isLoggedIn = Store.tryGet(StoreKey.currentUser) != null; - final appSettingService = ref.watch(appSettingsServiceProvider); - final isEnabled = - useState(AppSettingsEnum.advancedTroubleshooting.defaultValue); - final levelId = useState(AppSettingsEnum.logLevel.defaultValue); - final preferRemote = - useState(AppSettingsEnum.preferRemoteImage.defaultValue); - final allowSelfSignedSSLCert = - useState(AppSettingsEnum.allowSelfSignedSSLCert.defaultValue); - - useEffect( - () { - isEnabled.value = appSettingService.getSetting( - AppSettingsEnum.advancedTroubleshooting, - ); - levelId.value = appSettingService.getSetting(AppSettingsEnum.logLevel); - preferRemote.value = - appSettingService.getSetting(AppSettingsEnum.preferRemoteImage); - allowSelfSignedSSLCert.value = appSettingService - .getSetting(AppSettingsEnum.allowSelfSignedSSLCert); - return null; - }, - [], - ); - - final logLevel = Level.LEVELS[levelId.value].name; - - return ExpansionTile( - textColor: context.primaryColor, - title: Text( - "advanced_settings_tile_title", - style: context.textTheme.titleMedium, - ).tr(), - subtitle: const Text( - "advanced_settings_tile_subtitle", - ).tr(), - children: [ - SettingsSwitchListTile( - enabled: true, - appSettingService: appSettingService, - valueNotifier: isEnabled, - settingsEnum: AppSettingsEnum.advancedTroubleshooting, - title: "advanced_settings_troubleshooting_title".tr(), - subtitle: "advanced_settings_troubleshooting_subtitle".tr(), - ), - ListTile( - dense: true, - title: const Text( - "advanced_settings_log_level_title", - style: TextStyle(fontWeight: FontWeight.bold), - ).tr(args: [logLevel]), - subtitle: Slider( - value: levelId.value.toDouble(), - onChanged: (double v) => levelId.value = v.toInt(), - onChangeEnd: (double v) { - appSettingService.setSetting( - AppSettingsEnum.logLevel, - v.toInt(), - ); - ImmichLogger().level = Level.LEVELS[v.toInt()]; - }, - max: 8, - min: 1.0, - divisions: 7, - label: logLevel, - activeColor: context.primaryColor, - ), - ), - SettingsSwitchListTile( - appSettingService: appSettingService, - valueNotifier: preferRemote, - settingsEnum: AppSettingsEnum.preferRemoteImage, - title: "advanced_settings_prefer_remote_title".tr(), - subtitle: "advanced_settings_prefer_remote_subtitle".tr(), - ), - SettingsSwitchListTile( - enabled: !isLoggedIn, - appSettingService: appSettingService, - valueNotifier: allowSelfSignedSSLCert, - settingsEnum: AppSettingsEnum.allowSelfSignedSSLCert, - title: "advanced_settings_self_signed_ssl_title".tr(), - subtitle: "advanced_settings_self_signed_ssl_subtitle".tr(), - onChanged: (value) { - HttpOverrides.global = HttpSSLCertOverride(); - }, - ), - ], - ); - } -} diff --git a/mobile/lib/modules/settings/ui/asset_list_settings/asset_list_group_settings.dart b/mobile/lib/modules/settings/ui/asset_list_settings/asset_list_group_settings.dart new file mode 100644 index 000000000..8595973f2 --- /dev/null +++ b/mobile/lib/modules/settings/ui/asset_list_settings/asset_list_group_settings.dart @@ -0,0 +1,53 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:immich_mobile/modules/home/ui/asset_grid/asset_grid_data_structure.dart'; +import 'package:immich_mobile/modules/settings/providers/app_settings.provider.dart'; +import 'package:immich_mobile/modules/settings/services/app_settings.service.dart'; +import 'package:immich_mobile/modules/settings/ui/settings_radio_list_tile.dart'; +import 'package:immich_mobile/modules/settings/ui/settings_sub_title.dart'; +import 'package:immich_mobile/modules/settings/utils/app_settings_update_hook.dart'; + +class GroupSettings extends HookConsumerWidget { + const GroupSettings({ + super.key, + }); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final groupByIndex = useAppSettingsState(AppSettingsEnum.groupAssetsBy); + final groupBy = GroupAssetsBy.values[groupByIndex.value]; + + void changeGroupValue(GroupAssetsBy? value) { + if (value != null) { + groupByIndex.value = value.index; + ref.invalidate(appSettingsServiceProvider); + } + } + + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SettingsSubTitle(title: "asset_list_group_by_sub_title".tr()), + SettingsRadioListTile( + groups: [ + SettingsRadioGroup( + title: 'asset_list_layout_settings_group_by_month_day'.tr(), + value: GroupAssetsBy.day, + ), + SettingsRadioGroup( + title: 'asset_list_layout_settings_group_by_month'.tr(), + value: GroupAssetsBy.month, + ), + SettingsRadioGroup( + title: 'asset_list_layout_settings_group_automatically'.tr(), + value: GroupAssetsBy.auto, + ), + ], + groupBy: groupBy, + onRadioChanged: changeGroupValue, + ), + ], + ); + } +} diff --git a/mobile/lib/modules/settings/ui/asset_list_settings/asset_list_layout_settings.dart b/mobile/lib/modules/settings/ui/asset_list_settings/asset_list_layout_settings.dart index 5ac22e131..099d091e2 100644 --- a/mobile/lib/modules/settings/ui/asset_list_settings/asset_list_layout_settings.dart +++ b/mobile/lib/modules/settings/ui/asset_list_settings/asset_list_layout_settings.dart @@ -1,11 +1,12 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:immich_mobile/extensions/build_context_extensions.dart'; -import 'package:immich_mobile/modules/home/ui/asset_grid/asset_grid_data_structure.dart'; import 'package:immich_mobile/modules/settings/providers/app_settings.provider.dart'; import 'package:immich_mobile/modules/settings/services/app_settings.service.dart'; +import 'package:immich_mobile/modules/settings/ui/settings_slider_list_tile.dart'; +import 'package:immich_mobile/modules/settings/ui/settings_sub_title.dart'; +import 'package:immich_mobile/modules/settings/ui/settings_switch_list_tile.dart'; +import 'package:immich_mobile/modules/settings/utils/app_settings_update_hook.dart'; class LayoutSettings extends HookConsumerWidget { const LayoutSettings({ @@ -14,96 +15,27 @@ class LayoutSettings extends HookConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { - final appSettingService = ref.watch(appSettingsServiceProvider); - - final useDynamicLayout = useState(true); - final groupBy = useState(GroupAssetsBy.day); - - void switchChanged(bool value) { - appSettingService.setSetting(AppSettingsEnum.dynamicLayout, value); - useDynamicLayout.value = value; - ref.invalidate(appSettingsServiceProvider); - } - - void changeGroupValue(GroupAssetsBy? value) { - if (value != null) { - appSettingService.setSetting( - AppSettingsEnum.groupAssetsBy, - value.index, - ); - groupBy.value = value; - ref.invalidate(appSettingsServiceProvider); - } - } - - useEffect( - () { - useDynamicLayout.value = - appSettingService.getSetting(AppSettingsEnum.dynamicLayout); - groupBy.value = GroupAssetsBy.values[ - appSettingService.getSetting(AppSettingsEnum.groupAssetsBy)]; - - return null; - }, - [], - ); + final useDynamicLayout = useAppSettingsState(AppSettingsEnum.dynamicLayout); + final tilesPerRow = useAppSettingsState(AppSettingsEnum.tilesPerRow); return Column( + crossAxisAlignment: CrossAxisAlignment.start, children: [ - SwitchListTile.adaptive( - activeColor: context.primaryColor, - title: Text( - "asset_list_layout_settings_dynamic_layout_title", - style: context.textTheme.labelLarge, - ).tr(), - onChanged: switchChanged, - value: useDynamicLayout.value, + SettingsSubTitle(title: "asset_list_layout_sub_title".tr()), + SettingsSwitchListTile( + valueNotifier: useDynamicLayout, + title: "asset_list_layout_settings_dynamic_layout_title".tr(), + onChanged: (_) => ref.invalidate(appSettingsServiceProvider), ), - const Divider( - indent: 18, - endIndent: 18, - ), - ListTile( - title: const Text( - "asset_list_layout_settings_group_by", - style: TextStyle( - fontSize: 16, - fontWeight: FontWeight.bold, - ), - ).tr(), - ), - RadioListTile( - activeColor: context.primaryColor, - title: Text( - "asset_list_layout_settings_group_by_month_day", - style: context.textTheme.labelLarge, - ).tr(), - value: GroupAssetsBy.day, - groupValue: groupBy.value, - onChanged: changeGroupValue, - controlAffinity: ListTileControlAffinity.trailing, - ), - RadioListTile( - activeColor: context.primaryColor, - title: Text( - "asset_list_layout_settings_group_by_month", - style: context.textTheme.labelLarge, - ).tr(), - value: GroupAssetsBy.month, - groupValue: groupBy.value, - onChanged: changeGroupValue, - controlAffinity: ListTileControlAffinity.trailing, - ), - RadioListTile( - activeColor: context.primaryColor, - title: Text( - "asset_list_layout_settings_group_automatically", - style: context.textTheme.labelLarge, - ).tr(), - value: GroupAssetsBy.auto, - groupValue: groupBy.value, - onChanged: changeGroupValue, - controlAffinity: ListTileControlAffinity.trailing, + SettingsSliderListTile( + valueNotifier: tilesPerRow, + text: 'theme_setting_asset_list_tiles_per_row_title' + .tr(args: ["${tilesPerRow.value}"]), + label: "${tilesPerRow.value}", + maxValue: 6, + minValue: 2, + noDivisons: 4, + onChangeEnd: (_) => ref.invalidate(appSettingsServiceProvider), ), ], ); diff --git a/mobile/lib/modules/settings/ui/asset_list_settings/asset_list_settings.dart b/mobile/lib/modules/settings/ui/asset_list_settings/asset_list_settings.dart index a2ad73ec8..82a64dc3e 100644 --- a/mobile/lib/modules/settings/ui/asset_list_settings/asset_list_settings.dart +++ b/mobile/lib/modules/settings/ui/asset_list_settings/asset_list_settings.dart @@ -1,31 +1,37 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:immich_mobile/extensions/build_context_extensions.dart'; -import 'package:immich_mobile/modules/settings/ui/asset_list_settings/asset_list_layout_settings.dart'; -import 'package:immich_mobile/modules/settings/ui/asset_list_settings/asset_list_storage_indicator.dart'; -import 'asset_list_tiles_per_row.dart'; +import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:immich_mobile/modules/settings/providers/app_settings.provider.dart'; +import 'package:immich_mobile/modules/settings/services/app_settings.service.dart'; +import 'package:immich_mobile/modules/settings/ui/asset_list_settings/asset_list_group_settings.dart'; +import 'package:immich_mobile/modules/settings/ui/settings_sub_page_scaffold.dart'; +import 'package:immich_mobile/modules/settings/ui/settings_switch_list_tile.dart'; +import 'package:immich_mobile/modules/settings/utils/app_settings_update_hook.dart'; +import 'asset_list_layout_settings.dart'; -class AssetListSettings extends StatelessWidget { +class AssetListSettings extends HookConsumerWidget { const AssetListSettings({ super.key, }); @override - Widget build(BuildContext context) { - return ExpansionTile( - textColor: context.primaryColor, - title: Text( - 'asset_list_settings_title', - style: context.textTheme.titleMedium, - ).tr(), - subtitle: const Text( - 'asset_list_settings_subtitle', - ).tr(), - children: const [ - TilesPerRow(), - StorageIndicator(), - LayoutSettings(), - ], + Widget build(BuildContext context, WidgetRef ref) { + final showStorageIndicator = + useAppSettingsState(AppSettingsEnum.storageIndicator); + + final assetListSetting = [ + SettingsSwitchListTile( + valueNotifier: showStorageIndicator, + title: 'theme_setting_asset_list_storage_indicator_title'.tr(), + onChanged: (_) => ref.invalidate(appSettingsServiceProvider), + ), + const LayoutSettings(), + const GroupSettings(), + ]; + + return SettingsSubPageScaffold( + settings: assetListSetting, + showDivider: true, ); } } diff --git a/mobile/lib/modules/settings/ui/asset_list_settings/asset_list_storage_indicator.dart b/mobile/lib/modules/settings/ui/asset_list_settings/asset_list_storage_indicator.dart deleted file mode 100644 index 866e0a08f..000000000 --- a/mobile/lib/modules/settings/ui/asset_list_settings/asset_list_storage_indicator.dart +++ /dev/null @@ -1,46 +0,0 @@ -import 'package:easy_localization/easy_localization.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_hooks/flutter_hooks.dart'; -import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:immich_mobile/extensions/build_context_extensions.dart'; -import 'package:immich_mobile/modules/settings/providers/app_settings.provider.dart'; -import 'package:immich_mobile/modules/settings/services/app_settings.service.dart'; - -class StorageIndicator extends HookConsumerWidget { - const StorageIndicator({ - super.key, - }); - - @override - Widget build(BuildContext context, WidgetRef ref) { - final appSettingService = ref.watch(appSettingsServiceProvider); - - final showStorageIndicator = useState(true); - - void switchChanged(bool value) { - appSettingService.setSetting(AppSettingsEnum.storageIndicator, value); - showStorageIndicator.value = value; - ref.invalidate(appSettingsServiceProvider); - } - - useEffect( - () { - showStorageIndicator.value = appSettingService - .getSetting(AppSettingsEnum.storageIndicator); - - return null; - }, - [], - ); - - return SwitchListTile.adaptive( - activeColor: context.primaryColor, - title: Text( - "theme_setting_asset_list_storage_indicator_title", - style: context.textTheme.labelLarge, - ).tr(), - onChanged: switchChanged, - value: showStorageIndicator.value, - ); - } -} diff --git a/mobile/lib/modules/settings/ui/asset_list_settings/asset_list_tiles_per_row.dart b/mobile/lib/modules/settings/ui/asset_list_settings/asset_list_tiles_per_row.dart deleted file mode 100644 index 23690f907..000000000 --- a/mobile/lib/modules/settings/ui/asset_list_settings/asset_list_tiles_per_row.dart +++ /dev/null @@ -1,57 +0,0 @@ -import 'package:easy_localization/easy_localization.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_hooks/flutter_hooks.dart'; -import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:immich_mobile/extensions/build_context_extensions.dart'; -import 'package:immich_mobile/modules/settings/providers/app_settings.provider.dart'; -import 'package:immich_mobile/modules/settings/services/app_settings.service.dart'; - -class TilesPerRow extends HookConsumerWidget { - const TilesPerRow({ - super.key, - }); - - @override - Widget build(BuildContext context, WidgetRef ref) { - final appSettingService = ref.watch(appSettingsServiceProvider); - - final itemsValue = useState(4.0); - - void sliderChanged(double value) { - appSettingService.setSetting(AppSettingsEnum.tilesPerRow, value.toInt()); - itemsValue.value = value; - ref.invalidate(appSettingsServiceProvider); - } - - useEffect( - () { - int tilesPerRow = - appSettingService.getSetting(AppSettingsEnum.tilesPerRow); - itemsValue.value = tilesPerRow.toDouble(); - return null; - }, - [], - ); - - return Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - ListTile( - title: Text( - "theme_setting_asset_list_tiles_per_row_title", - style: context.textTheme.labelLarge, - ).tr(args: ["${itemsValue.value.toInt()}"]), - ), - Slider( - onChanged: sliderChanged, - value: itemsValue.value, - min: 2, - max: 6, - divisions: 4, - label: "${itemsValue.value.toInt()}", - activeColor: context.primaryColor, - ), - ], - ); - } -} diff --git a/mobile/lib/modules/settings/ui/backup_settings/background_settings.dart b/mobile/lib/modules/settings/ui/backup_settings/background_settings.dart new file mode 100644 index 000000000..73f7d120c --- /dev/null +++ b/mobile/lib/modules/settings/ui/backup_settings/background_settings.dart @@ -0,0 +1,234 @@ +import 'dart:io'; + +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_hooks/flutter_hooks.dart'; +import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:immich_mobile/extensions/build_context_extensions.dart'; +import 'package:immich_mobile/modules/backup/providers/backup.provider.dart'; +import 'package:immich_mobile/modules/backup/providers/ios_background_settings.provider.dart'; +import 'package:immich_mobile/modules/backup/ui/ios_debug_info_tile.dart'; +import 'package:immich_mobile/modules/settings/ui/settings_button_list_tile.dart'; +import 'package:immich_mobile/modules/settings/ui/settings_slider_list_tile.dart'; +import 'package:immich_mobile/modules/settings/ui/settings_switch_list_tile.dart'; +import 'package:permission_handler/permission_handler.dart'; +import 'package:url_launcher/url_launcher.dart'; + +class BackgroundBackupSettings extends ConsumerWidget { + const BackgroundBackupSettings({super.key}); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final isBackgroundEnabled = + ref.watch(backupProvider.select((s) => s.backgroundBackup)); + final iosSettings = ref.watch(iOSBackgroundSettingsProvider); + + void showErrorToUser(String msg) { + final snackBar = SnackBar( + content: Text( + msg.tr(), + style: context.textTheme.bodyLarge?.copyWith( + color: context.primaryColor, + ), + ), + backgroundColor: Colors.red, + ); + ScaffoldMessenger.of(context).showSnackBar(snackBar); + } + + void showBatteryOptimizationInfoToUser() { + showDialog( + context: context, + barrierDismissible: false, + builder: (BuildContext ctx) { + return AlertDialog( + title: const Text( + 'backup_controller_page_background_battery_info_title', + ).tr(), + content: SingleChildScrollView( + child: const Text( + 'backup_controller_page_background_battery_info_message', + ).tr(), + ), + actions: [ + ElevatedButton( + onPressed: () => launchUrl( + Uri.parse('https://dontkillmyapp.com'), + mode: LaunchMode.externalApplication, + ), + child: const Text( + "backup_controller_page_background_battery_info_link", + style: TextStyle(fontWeight: FontWeight.bold, fontSize: 12), + ).tr(), + ), + ElevatedButton( + child: const Text( + 'backup_controller_page_background_battery_info_ok', + style: TextStyle(fontWeight: FontWeight.bold, fontSize: 12), + ).tr(), + onPressed: () => ctx.pop(), + ), + ], + ); + }, + ); + } + + if (!isBackgroundEnabled) { + return SettingsButtonListTile( + icon: Icons.cloud_sync_outlined, + title: 'backup_controller_page_background_is_off'.tr(), + subtileText: 'backup_controller_page_background_description'.tr(), + buttonText: 'backup_controller_page_background_turn_on'.tr(), + onButtonTap: () => + ref.read(backupProvider.notifier).configureBackgroundBackup( + enabled: true, + onError: showErrorToUser, + onBatteryInfo: showBatteryOptimizationInfoToUser, + ), + ); + } + + return Column( + children: [ + if (!Platform.isIOS || iosSettings?.appRefreshEnabled == true) + _BackgroundSettingsEnabled( + onError: showErrorToUser, + onBatteryInfo: showBatteryOptimizationInfoToUser, + ), + if (Platform.isIOS && iosSettings?.appRefreshEnabled != true) + _IOSBackgroundRefreshDisabled(), + if (Platform.isIOS && iosSettings != null) + IosDebugInfoTile(settings: iosSettings), + ], + ); + } +} + +class _IOSBackgroundRefreshDisabled extends StatelessWidget { + @override + Widget build(BuildContext context) { + return SettingsButtonListTile( + icon: Icons.task_outlined, + title: + 'backup_controller_page_background_app_refresh_disabled_title'.tr(), + subtileText: + 'backup_controller_page_background_app_refresh_disabled_content'.tr(), + buttonText: + 'backup_controller_page_background_app_refresh_enable_button_text' + .tr(), + onButtonTap: () => openAppSettings(), + ); + } +} + +class _BackgroundSettingsEnabled extends HookConsumerWidget { + final void Function(String msg) onError; + final void Function() onBatteryInfo; + + const _BackgroundSettingsEnabled({ + required this.onError, + required this.onBatteryInfo, + }); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final isWifiRequired = + ref.watch(backupProvider.select((s) => s.backupRequireWifi)); + final isWifiRequiredNotifier = useValueNotifier(isWifiRequired); + useValueChanged( + isWifiRequired, + (_, __) => WidgetsBinding.instance.addPostFrameCallback( + (_) => isWifiRequiredNotifier.value = isWifiRequired, + ), + ); + + final isChargingRequired = + ref.watch(backupProvider.select((s) => s.backupRequireCharging)); + final isChargingRequiredNotifier = useValueNotifier(isChargingRequired); + useValueChanged( + isChargingRequired, + (_, __) => WidgetsBinding.instance.addPostFrameCallback( + (_) => isChargingRequiredNotifier.value = isChargingRequired, + ), + ); + + int backupDelayToSliderValue(int ms) => switch (ms) { + 5000 => 0, + 30000 => 1, + 120000 => 2, + _ => 3, + }; + + int backupDelayToMilliseconds(int v) => + switch (v) { 0 => 5000, 1 => 30000, 2 => 120000, _ => 600000 }; + + String formatBackupDelaySliderValue(int v) => switch (v) { + 0 => 'setting_notifications_notify_seconds'.tr(args: const ['5']), + 1 => 'setting_notifications_notify_seconds'.tr(args: const ['30']), + 2 => 'setting_notifications_notify_minutes'.tr(args: const ['2']), + _ => 'setting_notifications_notify_minutes'.tr(args: const ['10']), + }; + + final backupTriggerDelay = + ref.watch(backupProvider.select((s) => s.backupTriggerDelay)); + final triggerDelay = useState(backupDelayToSliderValue(backupTriggerDelay)); + useValueChanged( + triggerDelay.value, + (_, __) => ref.read(backupProvider.notifier).configureBackgroundBackup( + triggerDelay: backupDelayToMilliseconds(triggerDelay.value), + onError: onError, + onBatteryInfo: onBatteryInfo, + ), + ); + + return SettingsButtonListTile( + icon: Icons.cloud_sync_rounded, + iconColor: context.primaryColor, + title: 'backup_controller_page_background_is_on'.tr(), + buttonText: 'backup_controller_page_background_turn_off'.tr(), + onButtonTap: () => + ref.read(backupProvider.notifier).configureBackgroundBackup( + enabled: false, + onError: onError, + onBatteryInfo: onBatteryInfo, + ), + subtitle: Column( + children: [ + SettingsSwitchListTile( + valueNotifier: isWifiRequiredNotifier, + title: 'backup_controller_page_background_wifi'.tr(), + icon: Icons.wifi, + onChanged: (enabled) => + ref.read(backupProvider.notifier).configureBackgroundBackup( + requireWifi: enabled, + onError: onError, + onBatteryInfo: onBatteryInfo, + ), + ), + SettingsSwitchListTile( + valueNotifier: isChargingRequiredNotifier, + title: 'backup_controller_page_background_charging'.tr(), + icon: Icons.charging_station, + onChanged: (enabled) => + ref.read(backupProvider.notifier).configureBackgroundBackup( + requireCharging: enabled, + onError: onError, + onBatteryInfo: onBatteryInfo, + ), + ), + if (Platform.isAndroid) + SettingsSliderListTile( + valueNotifier: triggerDelay, + text: 'backup_controller_page_background_delay'.tr( + args: [formatBackupDelaySliderValue(triggerDelay.value)], + ), + maxValue: 3.0, + noDivisons: 3, + label: formatBackupDelaySliderValue(triggerDelay.value), + ), + ], + ), + ); + } +} diff --git a/mobile/lib/modules/settings/ui/backup_settings/backup_settings.dart b/mobile/lib/modules/settings/ui/backup_settings/backup_settings.dart new file mode 100644 index 000000000..e095c8d05 --- /dev/null +++ b/mobile/lib/modules/settings/ui/backup_settings/backup_settings.dart @@ -0,0 +1,68 @@ +import 'dart:io'; + +import 'package:flutter/material.dart'; +import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:immich_mobile/modules/backup/providers/backup_verification.provider.dart'; +import 'package:immich_mobile/modules/settings/services/app_settings.service.dart'; +import 'package:immich_mobile/modules/settings/ui/backup_settings/background_settings.dart'; +import 'package:immich_mobile/modules/settings/ui/backup_settings/foreground_settings.dart'; +import 'package:immich_mobile/modules/settings/ui/settings_button_list_tile.dart'; +import 'package:immich_mobile/modules/settings/ui/settings_sub_page_scaffold.dart'; +import 'package:immich_mobile/modules/settings/ui/settings_switch_list_tile.dart'; +import 'package:immich_mobile/modules/settings/utils/app_settings_update_hook.dart'; +import 'package:immich_mobile/shared/ui/immich_loading_indicator.dart'; + +class BackupSettings extends HookConsumerWidget { + const BackupSettings({ + super.key, + }); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final ignoreIcloudAssets = + useAppSettingsState(AppSettingsEnum.ignoreIcloudAssets); + final isAdvancedTroubleshooting = + useAppSettingsState(AppSettingsEnum.advancedTroubleshooting); + final isCorruptCheckInProgress = ref.watch(backupVerificationProvider); + + final backupSettings = [ + const ForegroundBackupSettings(), + const BackgroundBackupSettings(), + if (Platform.isIOS) + SettingsSwitchListTile( + valueNotifier: ignoreIcloudAssets, + title: 'Ignore iCloud photos', + subtitle: + 'Photos that are stored on iCloud will not be uploaded to the Immich server', + ), + if (Platform.isAndroid && isAdvancedTroubleshooting.value) + SettingsButtonListTile( + icon: Icons.warning_rounded, + title: 'Check for corrupt asset backups', + subtitle: isCorruptCheckInProgress + ? const Column( + children: [ + SizedBox(height: 20), + Center(child: ImmichLoadingIndicator()), + SizedBox(height: 20), + ], + ) + : null, + subtileText: !isCorruptCheckInProgress + ? 'Run this check only over Wi-Fi and once all assets have been backed-up. The procedure might take a few minutes.' + : null, + buttonText: 'Perform check', + onButtonTap: !isCorruptCheckInProgress + ? () => ref + .read(backupVerificationProvider.notifier) + .performBackupCheck(context) + : null, + ), + ]; + + return SettingsSubPageScaffold( + settings: backupSettings, + showDivider: true, + ); + } +} diff --git a/mobile/lib/modules/settings/ui/backup_settings/foreground_settings.dart b/mobile/lib/modules/settings/ui/backup_settings/foreground_settings.dart new file mode 100644 index 000000000..684fc95f2 --- /dev/null +++ b/mobile/lib/modules/settings/ui/backup_settings/foreground_settings.dart @@ -0,0 +1,36 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:immich_mobile/extensions/build_context_extensions.dart'; +import 'package:immich_mobile/modules/backup/providers/backup.provider.dart'; +import 'package:immich_mobile/modules/settings/ui/settings_button_list_tile.dart'; + +class ForegroundBackupSettings extends ConsumerWidget { + const ForegroundBackupSettings({super.key}); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final isAutoBackup = ref.watch(backupProvider.select((s) => s.autoBackup)); + + void onButtonTap() => + ref.read(backupProvider.notifier).setAutoBackup(!isAutoBackup); + + if (isAutoBackup) { + return SettingsButtonListTile( + icon: Icons.cloud_done_rounded, + iconColor: context.primaryColor, + title: 'backup_controller_page_status_on'.tr(), + buttonText: 'backup_controller_page_turn_off'.tr(), + onButtonTap: onButtonTap, + ); + } + + return SettingsButtonListTile( + icon: Icons.cloud_off_rounded, + title: 'backup_controller_page_status_off'.tr(), + subtileText: 'backup_controller_page_desc_backup'.tr(), + buttonText: 'backup_controller_page_turn_on'.tr(), + onButtonTap: onButtonTap, + ); + } +} diff --git a/mobile/lib/modules/settings/ui/image_viewer_quality_setting.dart b/mobile/lib/modules/settings/ui/image_viewer_quality_setting.dart new file mode 100644 index 000000000..21753ef54 --- /dev/null +++ b/mobile/lib/modules/settings/ui/image_viewer_quality_setting.dart @@ -0,0 +1,41 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_hooks/flutter_hooks.dart'; +import 'package:immich_mobile/extensions/build_context_extensions.dart'; +import 'package:immich_mobile/modules/settings/services/app_settings.service.dart'; +import 'package:immich_mobile/modules/settings/ui/settings_sub_page_scaffold.dart'; +import 'package:immich_mobile/modules/settings/ui/settings_switch_list_tile.dart'; +import 'package:immich_mobile/modules/settings/utils/app_settings_update_hook.dart'; + +class ImageViewerQualitySetting extends HookWidget { + const ImageViewerQualitySetting({ + super.key, + }); + + @override + Widget build(BuildContext context) { + final isPreview = useAppSettingsState(AppSettingsEnum.loadPreview); + final isOriginal = useAppSettingsState(AppSettingsEnum.loadOriginal); + + final viewerSettings = [ + ListTile( + title: Text( + 'setting_image_viewer_help', + style: context.textTheme.bodyMedium, + ).tr(), + ), + SettingsSwitchListTile( + valueNotifier: isPreview, + title: "setting_image_viewer_preview_title".tr(), + subtitle: "setting_image_viewer_preview_subtitle".tr(), + ), + SettingsSwitchListTile( + valueNotifier: isOriginal, + title: "setting_image_viewer_original_title".tr(), + subtitle: "setting_image_viewer_original_subtitle".tr(), + ), + ]; + + return SettingsSubPageScaffold(settings: viewerSettings); + } +} diff --git a/mobile/lib/modules/settings/ui/image_viewer_quality_setting/image_viewer_quality_setting.dart b/mobile/lib/modules/settings/ui/image_viewer_quality_setting/image_viewer_quality_setting.dart deleted file mode 100644 index bd77043a8..000000000 --- a/mobile/lib/modules/settings/ui/image_viewer_quality_setting/image_viewer_quality_setting.dart +++ /dev/null @@ -1,62 +0,0 @@ -import 'package:easy_localization/easy_localization.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_hooks/flutter_hooks.dart'; -import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:immich_mobile/extensions/build_context_extensions.dart'; -import 'package:immich_mobile/modules/settings/providers/app_settings.provider.dart'; -import 'package:immich_mobile/modules/settings/services/app_settings.service.dart'; -import 'package:immich_mobile/modules/settings/ui/settings_switch_list_tile.dart'; - -class ImageViewerQualitySetting extends HookConsumerWidget { - const ImageViewerQualitySetting({ - super.key, - }); - - @override - Widget build(BuildContext context, WidgetRef ref) { - final settings = ref.watch(appSettingsServiceProvider); - final isPreview = useState(AppSettingsEnum.loadPreview.defaultValue); - final isOriginal = useState(AppSettingsEnum.loadOriginal.defaultValue); - - useEffect( - () { - isPreview.value = settings.getSetting(AppSettingsEnum.loadPreview); - isOriginal.value = settings.getSetting(AppSettingsEnum.loadOriginal); - return null; - }, - ); - - return ExpansionTile( - textColor: context.primaryColor, - title: Text( - 'theme_setting_image_viewer_quality_title', - style: context.textTheme.titleMedium, - ).tr(), - subtitle: const Text( - 'theme_setting_image_viewer_quality_subtitle', - ).tr(), - children: [ - ListTile( - title: Text( - 'setting_image_viewer_help', - style: context.textTheme.bodyMedium, - ).tr(), - ), - SettingsSwitchListTile( - appSettingService: settings, - valueNotifier: isPreview, - settingsEnum: AppSettingsEnum.loadPreview, - title: "setting_image_viewer_preview_title".tr(), - subtitle: "setting_image_viewer_preview_subtitle".tr(), - ), - SettingsSwitchListTile( - appSettingService: settings, - valueNotifier: isOriginal, - settingsEnum: AppSettingsEnum.loadOriginal, - title: "setting_image_viewer_original_title".tr(), - subtitle: "setting_image_viewer_original_subtitle".tr(), - ), - ], - ); - } -} diff --git a/mobile/lib/modules/settings/ui/local_storage_settings.dart b/mobile/lib/modules/settings/ui/local_storage_settings.dart new file mode 100644 index 000000000..1547ce35e --- /dev/null +++ b/mobile/lib/modules/settings/ui/local_storage_settings.dart @@ -0,0 +1,54 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_hooks/flutter_hooks.dart' show useEffect, useState; +import 'package:immich_mobile/extensions/build_context_extensions.dart'; +import 'package:immich_mobile/modules/backup/models/duplicated_asset.model.dart'; +import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:immich_mobile/shared/providers/db.provider.dart'; + +class LocalStorageSettings extends HookConsumerWidget { + const LocalStorageSettings({super.key}); + @override + Widget build(BuildContext context, WidgetRef ref) { + final isarDb = ref.watch(dbProvider); + final cacheItemCount = useState(0); + + useEffect( + () { + cacheItemCount.value = isarDb.duplicatedAssets.countSync(); + return null; + }, + [], + ); + + void clearCache() async { + await isarDb.writeTxn(() => isarDb.duplicatedAssets.clear()); + cacheItemCount.value = await isarDb.duplicatedAssets.count(); + } + + return ListTile( + contentPadding: const EdgeInsets.symmetric(horizontal: 20), + dense: true, + title: Text( + "cache_settings_duplicated_assets_title", + style: context.textTheme.bodyLarge?.copyWith( + fontWeight: FontWeight.w500, + ), + ).tr(args: ["${cacheItemCount.value}"]), + subtitle: const Text( + "cache_settings_duplicated_assets_subtitle", + ).tr(), + trailing: TextButton( + onPressed: cacheItemCount.value > 0 ? clearCache : null, + child: Text( + "cache_settings_duplicated_assets_clear_button", + style: TextStyle( + fontSize: 12, + color: cacheItemCount.value > 0 ? Colors.red : Colors.grey, + fontWeight: FontWeight.bold, + ), + ).tr(), + ), + ); + } +} diff --git a/mobile/lib/modules/settings/ui/local_storage_settings/local_storage_settings.dart b/mobile/lib/modules/settings/ui/local_storage_settings/local_storage_settings.dart deleted file mode 100644 index a64da0481..000000000 --- a/mobile/lib/modules/settings/ui/local_storage_settings/local_storage_settings.dart +++ /dev/null @@ -1,61 +0,0 @@ -import 'package:easy_localization/easy_localization.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_hooks/flutter_hooks.dart' show useEffect, useState; -import 'package:immich_mobile/extensions/build_context_extensions.dart'; -import 'package:immich_mobile/modules/backup/models/duplicated_asset.model.dart'; -import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:immich_mobile/shared/providers/db.provider.dart'; - -class LocalStorageSettings extends HookConsumerWidget { - const LocalStorageSettings({super.key}); - @override - Widget build(BuildContext context, WidgetRef ref) { - final isarDb = ref.watch(dbProvider); - final cacheItemCount = useState(0); - useEffect( - () { - cacheItemCount.value = isarDb.duplicatedAssets.countSync(); - return null; - }, - [], - ); - - void clearCache() { - isarDb.writeTxnSync(() => isarDb.duplicatedAssets.clearSync()); - cacheItemCount.value = isarDb.duplicatedAssets.countSync(); - } - - return ExpansionTile( - textColor: context.primaryColor, - title: Text( - "cache_settings_tile_title", - style: context.textTheme.titleMedium, - ).tr(), - subtitle: const Text( - "cache_settings_tile_subtitle", - ).tr(), - children: [ - ListTile( - title: Text( - "cache_settings_duplicated_assets_title", - style: context.textTheme.titleSmall, - ).tr(args: ["${cacheItemCount.value}"]), - subtitle: const Text( - "cache_settings_duplicated_assets_subtitle", - ).tr(), - trailing: TextButton( - onPressed: cacheItemCount.value > 0 ? clearCache : null, - child: Text( - "cache_settings_duplicated_assets_clear_button", - style: TextStyle( - fontSize: 12, - color: cacheItemCount.value > 0 ? Colors.red : Colors.grey, - fontWeight: FontWeight.bold, - ), - ).tr(), - ), - ), - ], - ); - } -} diff --git a/mobile/lib/modules/settings/ui/notification_setting.dart b/mobile/lib/modules/settings/ui/notification_setting.dart new file mode 100644 index 000000000..0d7f0f5b4 --- /dev/null +++ b/mobile/lib/modules/settings/ui/notification_setting.dart @@ -0,0 +1,118 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:immich_mobile/extensions/build_context_extensions.dart'; +import 'package:immich_mobile/modules/settings/providers/notification_permission.provider.dart'; +import 'package:immich_mobile/modules/settings/services/app_settings.service.dart'; +import 'package:immich_mobile/modules/settings/ui/settings_button_list_tile.dart'; +import 'package:immich_mobile/modules/settings/ui/settings_slider_list_tile.dart'; +import 'package:immich_mobile/modules/settings/ui/settings_sub_page_scaffold.dart'; +import 'package:immich_mobile/modules/settings/ui/settings_switch_list_tile.dart'; +import 'package:immich_mobile/modules/settings/utils/app_settings_update_hook.dart'; +import 'package:permission_handler/permission_handler.dart'; + +class NotificationSetting extends HookConsumerWidget { + const NotificationSetting({ + super.key, + }); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final permissionService = ref.watch(notificationPermissionProvider); + + final sliderValue = + useAppSettingsState(AppSettingsEnum.uploadErrorNotificationGracePeriod); + final totalProgressValue = + useAppSettingsState(AppSettingsEnum.backgroundBackupTotalProgress); + final singleProgressValue = + useAppSettingsState(AppSettingsEnum.backgroundBackupSingleProgress); + + final hasPermission = permissionService == PermissionStatus.granted; + + openAppNotificationSettings(BuildContext ctx) { + ctx.pop(); + openAppSettings(); + } + + // When permissions are permanently denied, you need to go to settings to + // allow them + showPermissionsDialog() { + showDialog( + context: context, + builder: (ctx) => AlertDialog( + content: const Text('notification_permission_dialog_content').tr(), + actions: [ + TextButton( + child: const Text('notification_permission_dialog_cancel').tr(), + onPressed: () => ctx.pop(), + ), + TextButton( + onPressed: () => openAppNotificationSettings(ctx), + child: const Text('notification_permission_dialog_settings').tr(), + ), + ], + ), + ); + } + + final String formattedValue = + _formatSliderValue(sliderValue.value.toDouble()); + + final notificationSettings = [ + if (!hasPermission) + SettingsButtonListTile( + icon: Icons.notifications_outlined, + title: 'notification_permission_list_tile_title'.tr(), + subtileText: 'notification_permission_list_tile_content'.tr(), + buttonText: 'notification_permission_list_tile_enable_button'.tr(), + onButtonTap: () => ref + .watch(notificationPermissionProvider.notifier) + .requestNotificationPermission() + .then((permission) { + if (permission == PermissionStatus.permanentlyDenied) { + showPermissionsDialog(); + } + }), + ), + SettingsSwitchListTile( + enabled: hasPermission, + valueNotifier: totalProgressValue, + title: 'setting_notifications_total_progress_title'.tr(), + subtitle: 'setting_notifications_total_progress_subtitle'.tr(), + ), + SettingsSwitchListTile( + enabled: hasPermission, + valueNotifier: singleProgressValue, + title: 'setting_notifications_single_progress_title'.tr(), + subtitle: 'setting_notifications_single_progress_subtitle'.tr(), + ), + SettingsSliderListTile( + enabled: hasPermission, + valueNotifier: sliderValue, + text: 'setting_notifications_notify_failures_grace_period' + .tr(args: [formattedValue]), + maxValue: 5.0, + noDivisons: 5, + label: formattedValue, + ), + ]; + + return SettingsSubPageScaffold(settings: notificationSettings); + } +} + +String _formatSliderValue(double v) { + if (v == 0.0) { + return 'setting_notifications_notify_immediately'.tr(); + } else if (v == 1.0) { + return 'setting_notifications_notify_minutes'.tr(args: const ['30']); + } else if (v == 2.0) { + return 'setting_notifications_notify_hours'.tr(args: const ['2']); + } else if (v == 3.0) { + return 'setting_notifications_notify_hours'.tr(args: const ['8']); + } else if (v == 4.0) { + return 'setting_notifications_notify_hours'.tr(args: const ['24']); + } else { + return 'setting_notifications_notify_never'.tr(); + } +} diff --git a/mobile/lib/modules/settings/ui/notification_setting/notification_setting.dart b/mobile/lib/modules/settings/ui/notification_setting/notification_setting.dart deleted file mode 100644 index e696c9f1a..000000000 --- a/mobile/lib/modules/settings/ui/notification_setting/notification_setting.dart +++ /dev/null @@ -1,168 +0,0 @@ -import 'package:easy_localization/easy_localization.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_hooks/flutter_hooks.dart'; -import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:immich_mobile/extensions/build_context_extensions.dart'; -import 'package:immich_mobile/modules/settings/providers/app_settings.provider.dart'; -import 'package:immich_mobile/modules/settings/providers/notification_permission.provider.dart'; -import 'package:immich_mobile/modules/settings/services/app_settings.service.dart'; -import 'package:immich_mobile/modules/settings/ui/settings_switch_list_tile.dart'; -import 'package:permission_handler/permission_handler.dart'; - -class NotificationSetting extends HookConsumerWidget { - const NotificationSetting({ - super.key, - }); - - @override - Widget build(BuildContext context, WidgetRef ref) { - final appSettingService = ref.watch(appSettingsServiceProvider); - final permissionService = ref.watch(notificationPermissionProvider); - - final sliderValue = useState(0.0); - final totalProgressValue = - useState(AppSettingsEnum.backgroundBackupTotalProgress.defaultValue); - final singleProgressValue = - useState(AppSettingsEnum.backgroundBackupSingleProgress.defaultValue); - final hasPermission = permissionService == PermissionStatus.granted; - - useEffect( - () { - sliderValue.value = appSettingService - .getSetting(AppSettingsEnum.uploadErrorNotificationGracePeriod) - .toDouble(); - totalProgressValue.value = appSettingService - .getSetting(AppSettingsEnum.backgroundBackupTotalProgress); - singleProgressValue.value = appSettingService - .getSetting(AppSettingsEnum.backgroundBackupSingleProgress); - return null; - }, - [], - ); - - // When permissions are permanently denied, you need to go to settings to - // allow them - showPermissionsDialog() { - showDialog( - context: context, - builder: (context) => AlertDialog( - content: const Text('notification_permission_dialog_content').tr(), - actions: [ - TextButton( - child: const Text('notification_permission_dialog_cancel').tr(), - onPressed: () => context.pop(), - ), - TextButton( - child: const Text('notification_permission_dialog_settings').tr(), - onPressed: () { - context.pop(); - openAppSettings(); - }, - ), - ], - ), - ); - } - - final String formattedValue = _formatSliderValue(sliderValue.value); - return ExpansionTile( - textColor: context.primaryColor, - title: Text( - 'setting_notifications_title', - style: context.textTheme.titleMedium, - ).tr(), - subtitle: const Text( - 'setting_notifications_subtitle', - ).tr(), - children: [ - if (!hasPermission) - ListTile( - leading: const Icon(Icons.notifications_outlined), - title: Text( - 'notification_permission_list_tile_title', - style: context.textTheme.labelLarge - ?.copyWith(fontWeight: FontWeight.bold), - ).tr(), - subtitle: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - 'notification_permission_list_tile_content', - style: context.textTheme.labelMedium, - ).tr(), - const SizedBox(height: 8), - ElevatedButton( - onPressed: () => ref - .watch(notificationPermissionProvider.notifier) - .requestNotificationPermission() - .then((permission) { - if (permission == PermissionStatus.permanentlyDenied) { - showPermissionsDialog(); - } - }), - child: const Text( - 'notification_permission_list_tile_enable_button', - ).tr(), - ), - ], - ), - isThreeLine: true, - ), - SettingsSwitchListTile( - enabled: hasPermission, - appSettingService: appSettingService, - valueNotifier: totalProgressValue, - settingsEnum: AppSettingsEnum.backgroundBackupTotalProgress, - title: 'setting_notifications_total_progress_title'.tr(), - subtitle: 'setting_notifications_total_progress_subtitle'.tr(), - ), - SettingsSwitchListTile( - enabled: hasPermission, - appSettingService: appSettingService, - valueNotifier: singleProgressValue, - settingsEnum: AppSettingsEnum.backgroundBackupSingleProgress, - title: 'setting_notifications_single_progress_title'.tr(), - subtitle: 'setting_notifications_single_progress_subtitle'.tr(), - ), - ListTile( - enabled: hasPermission, - isThreeLine: false, - dense: true, - title: const Text( - 'setting_notifications_notify_failures_grace_period', - style: TextStyle(fontWeight: FontWeight.bold), - ).tr(args: [formattedValue]), - subtitle: Slider( - value: sliderValue.value, - onChanged: - !hasPermission ? null : (double v) => sliderValue.value = v, - onChangeEnd: (double v) => appSettingService.setSetting( - AppSettingsEnum.uploadErrorNotificationGracePeriod, - v.toInt(), - ), - max: 5.0, - divisions: 5, - label: formattedValue, - activeColor: context.primaryColor, - ), - ), - ], - ); - } -} - -String _formatSliderValue(double v) { - if (v == 0.0) { - return 'setting_notifications_notify_immediately'.tr(); - } else if (v == 1.0) { - return 'setting_notifications_notify_minutes'.tr(args: const ['30']); - } else if (v == 2.0) { - return 'setting_notifications_notify_hours'.tr(args: const ['2']); - } else if (v == 3.0) { - return 'setting_notifications_notify_hours'.tr(args: const ['8']); - } else if (v == 4.0) { - return 'setting_notifications_notify_hours'.tr(args: const ['24']); - } else { - return 'setting_notifications_notify_never'.tr(); - } -} diff --git a/mobile/lib/modules/settings/ui/preference_settings/preference_setting.dart b/mobile/lib/modules/settings/ui/preference_settings/preference_setting.dart new file mode 100644 index 000000000..f75891437 --- /dev/null +++ b/mobile/lib/modules/settings/ui/preference_settings/preference_setting.dart @@ -0,0 +1,18 @@ +import 'package:flutter/material.dart'; +import 'package:immich_mobile/modules/settings/ui/preference_settings/theme_setting.dart'; +import 'package:immich_mobile/modules/settings/ui/settings_sub_page_scaffold.dart'; + +class PreferenceSetting extends StatelessWidget { + const PreferenceSetting({ + super.key, + }); + + @override + Widget build(BuildContext context) { + const preferenceSettings = [ + ThemeSetting(), + ]; + + return const SettingsSubPageScaffold(settings: preferenceSettings); + } +} diff --git a/mobile/lib/modules/settings/ui/preference_settings/theme_setting.dart b/mobile/lib/modules/settings/ui/preference_settings/theme_setting.dart new file mode 100644 index 000000000..3dd023a45 --- /dev/null +++ b/mobile/lib/modules/settings/ui/preference_settings/theme_setting.dart @@ -0,0 +1,81 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_hooks/flutter_hooks.dart'; +import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:immich_mobile/modules/settings/services/app_settings.service.dart'; +import 'package:immich_mobile/modules/settings/ui/settings_sub_title.dart'; +import 'package:immich_mobile/modules/settings/ui/settings_switch_list_tile.dart'; +import 'package:immich_mobile/modules/settings/utils/app_settings_update_hook.dart'; +import 'package:immich_mobile/utils/immich_app_theme.dart'; + +class ThemeSetting extends HookConsumerWidget { + const ThemeSetting({ + super.key, + }); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final currentThemeString = useAppSettingsState(AppSettingsEnum.themeMode); + final currentTheme = useValueNotifier(ref.read(immichThemeProvider)); + final isDarkTheme = useValueNotifier(currentTheme.value == ThemeMode.dark); + final isSystemTheme = + useValueNotifier(currentTheme.value == ThemeMode.system); + + useValueChanged( + currentThemeString.value, + (_, __) => currentTheme.value = switch (currentThemeString.value) { + "light" => ThemeMode.light, + "dark" => ThemeMode.dark, + _ => ThemeMode.system, + }, + ); + + void onThemeChange(bool isDark) { + if (isDark) { + ref.watch(immichThemeProvider.notifier).state = ThemeMode.dark; + currentThemeString.value = "dark"; + } else { + ref.watch(immichThemeProvider.notifier).state = ThemeMode.light; + currentThemeString.value = "light"; + } + } + + void onSystemThemeChange(bool isSystem) { + if (isSystem) { + currentThemeString.value = "system"; + isSystemTheme.value = true; + ref.watch(immichThemeProvider.notifier).state = ThemeMode.system; + } else { + final currentSystemBrightness = + MediaQuery.platformBrightnessOf(context); + isSystemTheme.value = false; + isDarkTheme.value = currentSystemBrightness == Brightness.dark; + if (currentSystemBrightness == Brightness.light) { + currentThemeString.value = "light"; + ref.watch(immichThemeProvider.notifier).state = ThemeMode.light; + } else if (currentSystemBrightness == Brightness.dark) { + currentThemeString.value = "dark"; + ref.watch(immichThemeProvider.notifier).state = ThemeMode.dark; + } + } + } + + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SettingsSubTitle(title: "theme_setting_theme_title".tr()), + SettingsSwitchListTile( + valueNotifier: isSystemTheme, + title: 'theme_setting_system_theme_switch'.tr(), + onChanged: onSystemThemeChange, + ), + if (currentTheme.value != ThemeMode.system) + SettingsSwitchListTile( + valueNotifier: isDarkTheme, + title: 'theme_setting_dark_mode_switch'.tr(), + onChanged: onThemeChange, + ), + ], + ); + } +} diff --git a/mobile/lib/modules/settings/ui/settings_button_list_tile.dart b/mobile/lib/modules/settings/ui/settings_button_list_tile.dart new file mode 100644 index 000000000..fca5b878d --- /dev/null +++ b/mobile/lib/modules/settings/ui/settings_button_list_tile.dart @@ -0,0 +1,50 @@ +import 'package:flutter/material.dart'; +import 'package:immich_mobile/extensions/build_context_extensions.dart'; + +class SettingsButtonListTile extends StatelessWidget { + final IconData icon; + final Color? iconColor; + final String title; + final Widget? subtitle; + final String? subtileText; + final String buttonText; + final void Function()? onButtonTap; + + const SettingsButtonListTile({ + required this.icon, + this.iconColor, + required this.title, + this.subtileText, + this.subtitle, + required this.buttonText, + this.onButtonTap, + super.key, + }); + + @override + Widget build(BuildContext context) { + return ListTile( + contentPadding: const EdgeInsets.symmetric(horizontal: 20), + horizontalTitleGap: 20, + isThreeLine: true, + leading: Icon(icon, color: iconColor), + title: Text( + title, + style: context.textTheme.bodyLarge?.copyWith( + fontWeight: FontWeight.w500, + ), + ), + subtitle: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + if (subtileText != null) const SizedBox(height: 4), + if (subtileText != null) + Text(subtileText!, style: context.textTheme.bodyMedium), + if (subtitle != null) subtitle!, + const SizedBox(height: 6), + ElevatedButton(onPressed: onButtonTap, child: Text(buttonText)), + ], + ), + ); + } +} diff --git a/mobile/lib/modules/settings/ui/settings_radio_list_tile.dart b/mobile/lib/modules/settings/ui/settings_radio_list_tile.dart new file mode 100644 index 000000000..1c26682a6 --- /dev/null +++ b/mobile/lib/modules/settings/ui/settings_radio_list_tile.dart @@ -0,0 +1,47 @@ +import 'package:flutter/material.dart'; +import 'package:immich_mobile/extensions/build_context_extensions.dart'; + +class SettingsRadioGroup { + final String title; + final T value; + + SettingsRadioGroup({required this.title, required this.value}); +} + +class SettingsRadioListTile extends StatelessWidget { + final List groups; + final T groupBy; + final void Function(T?) onRadioChanged; + + const SettingsRadioListTile({ + super.key, + required this.groups, + required this.groupBy, + required this.onRadioChanged, + }); + + @override + Widget build(BuildContext context) { + return Column( + children: groups + .map( + (g) => RadioListTile( + contentPadding: const EdgeInsets.symmetric(horizontal: 20), + dense: true, + activeColor: context.primaryColor, + title: Text( + g.title, + style: context.textTheme.bodyLarge?.copyWith( + fontWeight: FontWeight.w500, + ), + ), + value: g.value, + groupValue: groupBy, + onChanged: onRadioChanged, + controlAffinity: ListTileControlAffinity.trailing, + ), + ) + .toList(), + ); + } +} diff --git a/mobile/lib/modules/settings/ui/settings_slider_list_tile.dart b/mobile/lib/modules/settings/ui/settings_slider_list_tile.dart new file mode 100644 index 000000000..386a69086 --- /dev/null +++ b/mobile/lib/modules/settings/ui/settings_slider_list_tile.dart @@ -0,0 +1,49 @@ +import 'package:flutter/material.dart'; +import 'package:immich_mobile/extensions/build_context_extensions.dart'; + +class SettingsSliderListTile extends StatelessWidget { + final ValueNotifier valueNotifier; + final String text; + final double maxValue; + final double minValue; + final int noDivisons; + final String? label; + final bool enabled; + final Function(int)? onChangeEnd; + + const SettingsSliderListTile({ + required this.valueNotifier, + required this.text, + required this.maxValue, + this.minValue = 0.0, + required this.noDivisons, + this.enabled = true, + this.label, + this.onChangeEnd, + super.key, + }); + + @override + Widget build(BuildContext context) { + return ListTile( + contentPadding: const EdgeInsets.symmetric(horizontal: 20), + dense: true, + title: Text( + text, + style: context.textTheme.bodyLarge?.copyWith( + fontWeight: FontWeight.w500, + ), + ), + subtitle: Slider( + value: valueNotifier.value.toDouble(), + onChanged: (double v) => valueNotifier.value = v.toInt(), + onChangeEnd: (double v) => onChangeEnd?.call(v.toInt()), + max: maxValue, + min: minValue, + divisions: noDivisons, + label: label ?? "${valueNotifier.value}", + activeColor: context.primaryColor, + ), + ); + } +} diff --git a/mobile/lib/modules/settings/ui/settings_sub_page_scaffold.dart b/mobile/lib/modules/settings/ui/settings_sub_page_scaffold.dart new file mode 100644 index 000000000..96c4678ed --- /dev/null +++ b/mobile/lib/modules/settings/ui/settings_sub_page_scaffold.dart @@ -0,0 +1,30 @@ +import 'package:flutter/material.dart'; + +class SettingsSubPageScaffold extends StatelessWidget { + final List settings; + final bool showDivider; + + const SettingsSubPageScaffold({ + super.key, + required this.settings, + this.showDivider = false, + }); + + @override + Widget build(BuildContext context) { + return ListView.separated( + padding: const EdgeInsets.symmetric(vertical: 20), + itemCount: settings.length, + itemBuilder: (ctx, index) => settings[index], + separatorBuilder: (context, index) => showDivider + ? const Column( + children: [ + SizedBox(height: 5), + Divider(height: 10, indent: 15, endIndent: 15), + SizedBox(height: 15), + ], + ) + : const SizedBox(height: 10), + ); + } +} diff --git a/mobile/lib/modules/settings/ui/settings_sub_title.dart b/mobile/lib/modules/settings/ui/settings_sub_title.dart new file mode 100644 index 000000000..9a3fb6947 --- /dev/null +++ b/mobile/lib/modules/settings/ui/settings_sub_title.dart @@ -0,0 +1,25 @@ +import 'package:flutter/material.dart'; +import 'package:immich_mobile/extensions/build_context_extensions.dart'; + +class SettingsSubTitle extends StatelessWidget { + final String title; + + const SettingsSubTitle({ + super.key, + required this.title, + }); + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.only(left: 20), + child: Text( + title, + style: context.textTheme.bodyLarge?.copyWith( + color: context.primaryColor, + fontWeight: FontWeight.w700, + ), + ), + ); + } +} diff --git a/mobile/lib/modules/settings/ui/settings_switch_list_tile.dart b/mobile/lib/modules/settings/ui/settings_switch_list_tile.dart index b5277b9c1..c7328f0b9 100644 --- a/mobile/lib/modules/settings/ui/settings_switch_list_tile.dart +++ b/mobile/lib/modules/settings/ui/settings_switch_list_tile.dart @@ -1,51 +1,61 @@ import 'package:flutter/material.dart'; import 'package:immich_mobile/extensions/build_context_extensions.dart'; -import 'package:immich_mobile/modules/settings/services/app_settings.service.dart'; class SettingsSwitchListTile extends StatelessWidget { - final AppSettingsService appSettingService; final ValueNotifier valueNotifier; - final AppSettingsEnum settingsEnum; final String title; final bool enabled; final String? subtitle; + final IconData? icon; final Function(bool)? onChanged; - SettingsSwitchListTile({ - required this.appSettingService, + const SettingsSwitchListTile({ required this.valueNotifier, - required this.settingsEnum, required this.title, this.subtitle, + this.icon, this.enabled = true, this.onChanged, - }) : super(key: Key(settingsEnum.name)); + super.key, + }); @override Widget build(BuildContext context) { + void onSwitchChanged(bool value) { + if (!enabled) return; + + valueNotifier.value = value; + onChanged?.call(value); + } + return SwitchListTile.adaptive( + contentPadding: const EdgeInsets.symmetric(horizontal: 20), selectedTileColor: enabled ? null : context.themeData.disabledColor, value: valueNotifier.value, - onChanged: (bool value) { - if (enabled) { - valueNotifier.value = value; - appSettingService.setSetting(settingsEnum, value); - } - if (onChanged != null) { - onChanged!(value); - } - }, + onChanged: onSwitchChanged, activeColor: enabled ? context.primaryColor : context.themeData.disabledColor, dense: true, + secondary: icon != null + ? Icon( + icon!, + color: valueNotifier.value ? context.primaryColor : null, + ) + : null, title: Text( title, - style: context.textTheme.titleSmall, + style: context.textTheme.bodyLarge?.copyWith( + fontWeight: FontWeight.w500, + color: enabled ? null : context.themeData.disabledColor, + height: 1.5, + ), ), subtitle: subtitle != null ? Text( subtitle!, - style: context.textTheme.bodyMedium, + style: context.textTheme.bodyMedium?.copyWith( + color: enabled ? null : context.themeData.disabledColor, + ), ) : null, ); diff --git a/mobile/lib/modules/settings/ui/theme_setting/theme_setting.dart b/mobile/lib/modules/settings/ui/theme_setting/theme_setting.dart deleted file mode 100644 index e8a145393..000000000 --- a/mobile/lib/modules/settings/ui/theme_setting/theme_setting.dart +++ /dev/null @@ -1,98 +0,0 @@ -import 'package:easy_localization/easy_localization.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_hooks/flutter_hooks.dart'; -import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:immich_mobile/extensions/build_context_extensions.dart'; -import 'package:immich_mobile/modules/settings/providers/app_settings.provider.dart'; -import 'package:immich_mobile/modules/settings/services/app_settings.service.dart'; -import 'package:immich_mobile/utils/immich_app_theme.dart'; - -class ThemeSetting extends HookConsumerWidget { - const ThemeSetting({ - super.key, - }); - - @override - Widget build(BuildContext context, WidgetRef ref) { - final currentTheme = useState(ThemeMode.system); - - useEffect( - () { - currentTheme.value = ref.read(immichThemeProvider); - return null; - }, - [], - ); - - return ExpansionTile( - textColor: context.primaryColor, - title: Text( - 'theme_setting_theme_title', - style: context.textTheme.titleMedium, - ).tr(), - subtitle: const Text( - 'theme_setting_theme_subtitle', - ).tr(), - children: [ - SwitchListTile.adaptive( - activeColor: context.primaryColor, - title: Text( - 'theme_setting_system_theme_switch', - style: context.textTheme.labelLarge - ?.copyWith(fontWeight: FontWeight.bold), - ).tr(), - value: currentTheme.value == ThemeMode.system, - onChanged: (bool isSystem) { - var currentSystemBrightness = - MediaQuery.of(context).platformBrightness; - - if (isSystem) { - currentTheme.value = ThemeMode.system; - ref.watch(immichThemeProvider.notifier).state = ThemeMode.system; - ref - .watch(appSettingsServiceProvider) - .setSetting(AppSettingsEnum.themeMode, "system"); - } else { - if (currentSystemBrightness == Brightness.light) { - currentTheme.value = ThemeMode.light; - ref.watch(immichThemeProvider.notifier).state = ThemeMode.light; - ref - .watch(appSettingsServiceProvider) - .setSetting(AppSettingsEnum.themeMode, "light"); - } else if (currentSystemBrightness == Brightness.dark) { - currentTheme.value = ThemeMode.dark; - ref.watch(immichThemeProvider.notifier).state = ThemeMode.dark; - ref - .watch(appSettingsServiceProvider) - .setSetting(AppSettingsEnum.themeMode, "dark"); - } - } - }, - ), - if (currentTheme.value != ThemeMode.system) - SwitchListTile.adaptive( - activeColor: context.primaryColor, - title: Text( - 'theme_setting_dark_mode_switch', - style: context.textTheme.labelLarge - ?.copyWith(fontWeight: FontWeight.bold), - ).tr(), - value: ref.watch(immichThemeProvider) == ThemeMode.dark, - onChanged: (bool isDark) { - if (isDark) { - ref.watch(immichThemeProvider.notifier).state = ThemeMode.dark; - ref - .watch(appSettingsServiceProvider) - .setSetting(AppSettingsEnum.themeMode, "dark"); - } else { - ref.watch(immichThemeProvider.notifier).state = ThemeMode.light; - ref - .watch(appSettingsServiceProvider) - .setSetting(AppSettingsEnum.themeMode, "light"); - } - }, - ), - ], - ); - } -} diff --git a/mobile/lib/modules/settings/utils/app_settings_update_hook.dart b/mobile/lib/modules/settings/utils/app_settings_update_hook.dart new file mode 100644 index 000000000..85ffeda23 --- /dev/null +++ b/mobile/lib/modules/settings/utils/app_settings_update_hook.dart @@ -0,0 +1,18 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter_hooks/flutter_hooks.dart' hide Store; +import 'package:immich_mobile/modules/settings/services/app_settings.service.dart'; +import 'package:immich_mobile/shared/models/store.dart'; + +ValueNotifier useAppSettingsState( + AppSettingsEnum key, +) { + final notifier = useState(Store.get(key.storeKey, key.defaultValue)); + + // Listen to changes to the notifier and update app settings + useValueChanged( + notifier.value, + (_, __) => Store.put(key.storeKey, notifier.value), + ); + + return notifier; +} diff --git a/mobile/lib/modules/settings/views/settings_page.dart b/mobile/lib/modules/settings/views/settings_page.dart index 3272dd552..eeb4b379f 100644 --- a/mobile/lib/modules/settings/views/settings_page.dart +++ b/mobile/lib/modules/settings/views/settings_page.dart @@ -1,51 +1,118 @@ import 'package:auto_route/auto_route.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:immich_mobile/extensions/build_context_extensions.dart'; -import 'package:immich_mobile/modules/settings/ui/advanced_settings/advanced_settings.dart'; +import 'package:immich_mobile/modules/settings/ui/advanced_settings.dart'; import 'package:immich_mobile/modules/settings/ui/asset_list_settings/asset_list_settings.dart'; -import 'package:immich_mobile/modules/settings/ui/local_storage_settings/local_storage_settings.dart'; -import 'package:immich_mobile/modules/settings/ui/image_viewer_quality_setting/image_viewer_quality_setting.dart'; -import 'package:immich_mobile/modules/settings/ui/notification_setting/notification_setting.dart'; -import 'package:immich_mobile/modules/settings/ui/theme_setting/theme_setting.dart'; +import 'package:immich_mobile/modules/settings/ui/backup_settings/backup_settings.dart'; +import 'package:immich_mobile/modules/settings/ui/image_viewer_quality_setting.dart'; +import 'package:immich_mobile/modules/settings/ui/notification_setting.dart'; +import 'package:immich_mobile/modules/settings/ui/preference_settings/preference_setting.dart'; +import 'package:immich_mobile/routing/router.dart'; + +enum SettingSection { + notifications( + 'setting_notifications_title', + Icons.notifications_none_rounded, + ), + preferences('preferences_settings_title', Icons.interests_outlined), + backup('backup_controller_page_backup', Icons.cloud_upload_outlined), + timeline('asset_list_settings_title', Icons.auto_awesome_mosaic_outlined), + viewer('asset_viewer_settings_title', Icons.image_outlined), + advanced('advanced_settings_tile_title', Icons.build_outlined); + + final String title; + final IconData icon; + + Widget get widget => switch (this) { + SettingSection.notifications => const NotificationSetting(), + SettingSection.preferences => const PreferenceSetting(), + SettingSection.backup => const BackupSettings(), + SettingSection.timeline => const AssetListSettings(), + SettingSection.viewer => const ImageViewerQualitySetting(), + SettingSection.advanced => const AdvancedSettings(), + }; + + const SettingSection(this.title, this.icon); +} @RoutePage() -class SettingsPage extends HookConsumerWidget { +class SettingsPage extends StatelessWidget { const SettingsPage({super.key}); @override - Widget build(BuildContext context, WidgetRef ref) { + Widget build(BuildContext context) { return Scaffold( appBar: AppBar( - leading: IconButton( - iconSize: 20, - splashRadius: 24, - onPressed: () => context.pop(), - icon: const Icon(Icons.arrow_back_ios_new_rounded), - ), - automaticallyImplyLeading: false, centerTitle: false, - title: const Text( - 'setting_pages_app_bar_settings', - ).tr(), - ), - body: ListView( - children: [ - ...ListTile.divideTiles( - context: context, - tiles: [ - const ImageViewerQualitySetting(), - const ThemeSetting(), - const AssetListSettings(), - const NotificationSetting(), - // const ExperimentalSettings(), - const LocalStorageSettings(), - const AdvancedSettings(), - ], - ), - ], + bottom: const PreferredSize( + preferredSize: Size.fromHeight(1), + child: Divider(height: 1), + ), + title: const Text('setting_pages_app_bar_settings').tr(), ), + body: context.isMobile ? _MobileLayout() : _TabletLayout(), + ); + } +} + +class _MobileLayout extends StatelessWidget { + @override + Widget build(BuildContext context) { + return ListView( + children: SettingSection.values + .map( + (s) => ListTile( + title: Text( + s.title, + style: const TextStyle( + fontWeight: FontWeight.bold, + ), + ).tr(), + leading: Icon(s.icon), + onTap: () => context.pushRoute(SettingsSubRoute(section: s)), + ), + ) + .toList(), + ); + } +} + +class _TabletLayout extends HookWidget { + @override + Widget build(BuildContext context) { + final selectedSection = + useState(SettingSection.values.first); + + return Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Expanded( + flex: 2, + child: CustomScrollView( + slivers: SettingSection.values + .map( + (s) => SliverToBoxAdapter( + child: ListTile( + title: Text(s.title).tr(), + leading: Icon(s.icon), + selected: s.index == selectedSection.value.index, + selectedColor: context.primaryColor, + selectedTileColor: context.primaryColor.withAlpha(50), + onTap: () => selectedSection.value = s, + ), + ), + ) + .toList(), + ), + ), + const VerticalDivider(width: 1), + Expanded( + flex: 4, + child: selectedSection.value.widget, + ), + ], ); } } diff --git a/mobile/lib/modules/settings/views/settings_sub_page.dart b/mobile/lib/modules/settings/views/settings_sub_page.dart new file mode 100644 index 000000000..582f45a11 --- /dev/null +++ b/mobile/lib/modules/settings/views/settings_sub_page.dart @@ -0,0 +1,22 @@ +import 'package:auto_route/auto_route.dart'; +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:immich_mobile/modules/settings/views/settings_page.dart'; + +@RoutePage() +class SettingsSubPage extends StatelessWidget { + const SettingsSubPage(this.section, {super.key}); + + final SettingSection section; + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + centerTitle: false, + title: Text(section.title).tr(), + ), + body: section.widget, + ); + } +} diff --git a/mobile/lib/routing/router.dart b/mobile/lib/routing/router.dart index 6da526b9b..f5c1a95d9 100644 --- a/mobile/lib/routing/router.dart +++ b/mobile/lib/routing/router.dart @@ -31,6 +31,7 @@ import 'package:immich_mobile/modules/login/views/change_password_page.dart'; import 'package:immich_mobile/modules/login/views/login_page.dart'; import 'package:immich_mobile/modules/onboarding/providers/gallery_permission.provider.dart'; import 'package:immich_mobile/modules/onboarding/views/permission_onboarding_page.dart'; +import 'package:immich_mobile/modules/settings/views/settings_sub_page.dart'; import 'package:immich_mobile/modules/shared_link/models/shared_link.dart'; import 'package:immich_mobile/modules/shared_link/views/shared_link_edit_page.dart'; import 'package:immich_mobile/modules/shared_link/views/shared_link_page.dart'; @@ -179,6 +180,7 @@ class AppRouter extends _$AppRouter { transitionsBuilder: TransitionsBuilders.slideBottom, ), AutoRoute(page: SettingsRoute.page, guards: [_duplicateGuard]), + AutoRoute(page: SettingsSubRoute.page, guards: [_duplicateGuard]), AutoRoute(page: AppLogRoute.page, guards: [_duplicateGuard]), AutoRoute(page: AppLogDetailRoute.page, guards: [_duplicateGuard]), AutoRoute(page: ArchiveRoute.page, guards: [_authGuard, _duplicateGuard]), diff --git a/mobile/lib/routing/router.gr.dart b/mobile/lib/routing/router.gr.dart index 64bd492a7..cc86b701a 100644 --- a/mobile/lib/routing/router.gr.dart +++ b/mobile/lib/routing/router.gr.dart @@ -299,6 +299,16 @@ abstract class _$AppRouter extends RootStackRouter { child: const SettingsPage(), ); }, + SettingsSubRoute.name: (routeData) { + final args = routeData.argsAs(); + return AutoRoutePage( + routeData: routeData, + child: SettingsSubPage( + args.section, + key: args.key, + ), + ); + }, SharedLinkEditRoute.name: (routeData) { final args = routeData.argsAs( orElse: () => const SharedLinkEditRouteArgs()); @@ -1260,6 +1270,44 @@ class SettingsRoute extends PageRouteInfo { static const PageInfo page = PageInfo(name); } +/// generated route for +/// [SettingsSubPage] +class SettingsSubRoute extends PageRouteInfo { + SettingsSubRoute({ + required SettingSection section, + Key? key, + List? children, + }) : super( + SettingsSubRoute.name, + args: SettingsSubRouteArgs( + section: section, + key: key, + ), + initialChildren: children, + ); + + static const String name = 'SettingsSubRoute'; + + static const PageInfo page = + PageInfo(name); +} + +class SettingsSubRouteArgs { + const SettingsSubRouteArgs({ + required this.section, + this.key, + }); + + final SettingSection section; + + final Key? key; + + @override + String toString() { + return 'SettingsSubRouteArgs{section: $section, key: $key}'; + } +} + /// generated route for /// [SharedLinkEditPage] class SharedLinkEditRoute extends PageRouteInfo { diff --git a/mobile/lib/shared/ui/immich_toast.dart b/mobile/lib/shared/ui/immich_toast.dart index 25a0e65fa..e15623c86 100644 --- a/mobile/lib/shared/ui/immich_toast.dart +++ b/mobile/lib/shared/ui/immich_toast.dart @@ -9,7 +9,7 @@ class ImmichToast { required BuildContext context, required String msg, ToastType toastType = ToastType.info, - ToastGravity gravity = ToastGravity.TOP, + ToastGravity gravity = ToastGravity.BOTTOM, int durationInSecond = 3, }) { final fToast = FToast(); From 727a8cd7152a04568b81dc4e438ecc9f4534d688 Mon Sep 17 00:00:00 2001 From: Ben Basten <45583362+ben-basten@users.noreply.github.com> Date: Tue, 12 Mar 2024 15:12:11 +0000 Subject: [PATCH 25/45] feat(mobile): add labels to app bar buttons (#7865) --- mobile/lib/modules/album/views/library_page.dart | 3 ++- mobile/lib/modules/album/views/sharing_page.dart | 3 ++- mobile/lib/shared/ui/immich_app_bar.dart | 4 ++++ 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/mobile/lib/modules/album/views/library_page.dart b/mobile/lib/modules/album/views/library_page.dart index 4a0f57ab5..b8b1b6b39 100644 --- a/mobile/lib/modules/album/views/library_page.dart +++ b/mobile/lib/modules/album/views/library_page.dart @@ -194,9 +194,10 @@ class LibraryPage extends HookConsumerWidget { ? InkWell( onTap: () => context.pushRoute(const TrashRoute()), borderRadius: const BorderRadius.all(Radius.circular(12)), - child: const Icon( + child: Icon( Icons.delete_rounded, size: 25, + semanticLabel: 'profile_drawer_trash'.tr(), ), ) : null; diff --git a/mobile/lib/modules/album/views/sharing_page.dart b/mobile/lib/modules/album/views/sharing_page.dart index e6b2ade6b..44a7faee4 100644 --- a/mobile/lib/modules/album/views/sharing_page.dart +++ b/mobile/lib/modules/album/views/sharing_page.dart @@ -212,9 +212,10 @@ class SharingPage extends HookConsumerWidget { return InkWell( onTap: () => context.pushRoute(const PartnerRoute()), borderRadius: const BorderRadius.all(Radius.circular(12)), - child: const Icon( + child: Icon( Icons.swap_horizontal_circle_rounded, size: 25, + semanticLabel: 'partner_page_title'.tr(), ), ); } diff --git a/mobile/lib/shared/ui/immich_app_bar.dart b/mobile/lib/shared/ui/immich_app_bar.dart index 0c70e5235..35b482275 100644 --- a/mobile/lib/shared/ui/immich_app_bar.dart +++ b/mobile/lib/shared/ui/immich_app_bar.dart @@ -1,4 +1,5 @@ import 'package:auto_route/auto_route.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:immich_mobile/extensions/build_context_extensions.dart'; @@ -80,6 +81,7 @@ class ImmichAppBar extends ConsumerWidget implements PreferredSizeWidget { strokeWidth: 2, strokeCap: StrokeCap.round, valueColor: AlwaysStoppedAnimation(iconColor), + semanticsLabel: 'backup_controller_page_backup'.tr(), ), ); } else if (backupState.backupProgress != @@ -89,6 +91,7 @@ class ImmichAppBar extends ConsumerWidget implements PreferredSizeWidget { Icons.check_outlined, size: 9, color: iconColor, + semanticLabel: 'backup_controller_page_backup'.tr(), ); } } @@ -98,6 +101,7 @@ class ImmichAppBar extends ConsumerWidget implements PreferredSizeWidget { Icons.cloud_off_rounded, size: 9, color: iconColor, + semanticLabel: 'backup_controller_page_backup'.tr(), ); } } From 1683bb75e1fb94823b8cfe58ca07fcc06aaecf9f Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 12 Mar 2024 11:28:45 -0400 Subject: [PATCH 26/45] fix(deps): update server (#7880) --- server/package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/server/package-lock.json b/server/package-lock.json index a7e9125d7..da5251d9b 100644 --- a/server/package-lock.json +++ b/server/package-lock.json @@ -10856,9 +10856,9 @@ } }, "node_modules/openid-client": { - "version": "5.6.4", - "resolved": "https://registry.npmjs.org/openid-client/-/openid-client-5.6.4.tgz", - "integrity": "sha512-T1h3B10BRPKfcObdBklX639tVz+xh34O7GjofqrqiAQdm7eHsQ00ih18x6wuJ/E6FxdtS2u3FmUGPDeEcMwzNA==", + "version": "5.6.5", + "resolved": "https://registry.npmjs.org/openid-client/-/openid-client-5.6.5.tgz", + "integrity": "sha512-5P4qO9nGJzB5PI0LFlhj4Dzg3m4odt0qsJTfyEtZyOlkgpILwEioOhVVJOrS1iVH494S4Ee5OCjjg6Bf5WOj3w==", "dependencies": { "jose": "^4.15.5", "lru-cache": "^6.0.0", @@ -22359,9 +22359,9 @@ } }, "openid-client": { - "version": "5.6.4", - "resolved": "https://registry.npmjs.org/openid-client/-/openid-client-5.6.4.tgz", - "integrity": "sha512-T1h3B10BRPKfcObdBklX639tVz+xh34O7GjofqrqiAQdm7eHsQ00ih18x6wuJ/E6FxdtS2u3FmUGPDeEcMwzNA==", + "version": "5.6.5", + "resolved": "https://registry.npmjs.org/openid-client/-/openid-client-5.6.5.tgz", + "integrity": "sha512-5P4qO9nGJzB5PI0LFlhj4Dzg3m4odt0qsJTfyEtZyOlkgpILwEioOhVVJOrS1iVH494S4Ee5OCjjg6Bf5WOj3w==", "requires": { "jose": "^4.15.5", "lru-cache": "^6.0.0", From 72f9295490e8dd4d35993b0dab7661fb26493864 Mon Sep 17 00:00:00 2001 From: bo0tzz Date: Tue, 12 Mar 2024 16:29:49 +0100 Subject: [PATCH 27/45] feat(server): YAML config file support (#7894) * test(server): Load config from yaml * docs: YAML config support * feat(server): YAML config file support * fix format --------- Co-authored-by: Alex Tran --- docs/docs/install/config-file.md | 6 +++- server/package-lock.json | 14 ++++++++ server/package.json | 2 ++ .../system-config/system-config.core.ts | 11 ++++--- .../system-config.service.spec.ts | 32 ++++++++++++++++++- 5 files changed, 58 insertions(+), 7 deletions(-) diff --git a/docs/docs/install/config-file.md b/docs/docs/install/config-file.md index 78f2663b5..9a1d1acb1 100644 --- a/docs/docs/install/config-file.md +++ b/docs/docs/install/config-file.md @@ -4,7 +4,7 @@ A config file can be provided as an alternative to the UI configuration. ### Step 1 - Create a new config file -In JSON format, create a new config file (e.g. `immich.config`) and put it in a location that can be accessed by Immich. +In JSON format, create a new config file (e.g. `immich.json`) and put it in a location that can be accessed by Immich. The default configuration looks like this: ```json @@ -163,3 +163,7 @@ So you can just grab it from there, paste it into a file and you're pretty much In your `.env` file, set the variable `IMMICH_CONFIG_FILE` to the path of your config. For more information, refer to the [Environment Variables](/docs/install/environment-variables.md) section. + +:::tip +YAML-formatted config files are also supported. +::: diff --git a/server/package-lock.json b/server/package-lock.json index da5251d9b..49226d28f 100644 --- a/server/package-lock.json +++ b/server/package-lock.json @@ -44,6 +44,7 @@ "i18n-iso-countries": "^7.6.0", "ioredis": "^5.3.2", "joi": "^17.10.0", + "js-yaml": "^4.1.0", "lodash": "^4.17.21", "luxon": "^3.4.2", "nest-commander": "^3.11.1", @@ -75,6 +76,7 @@ "@types/imagemin": "^8.0.1", "@types/jest": "29.5.12", "@types/jest-when": "^3.5.2", + "@types/js-yaml": "^4.0.9", "@types/lodash": "^4.14.197", "@types/mock-fs": "^4.13.1", "@types/multer": "^1.4.7", @@ -4571,6 +4573,12 @@ "@types/jest": "*" } }, + "node_modules/@types/js-yaml": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.9.tgz", + "integrity": "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==", + "dev": true + }, "node_modules/@types/json-schema": { "version": "7.0.13", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.13.tgz", @@ -17578,6 +17586,12 @@ "@types/jest": "*" } }, + "@types/js-yaml": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.9.tgz", + "integrity": "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==", + "dev": true + }, "@types/json-schema": { "version": "7.0.13", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.13.tgz", diff --git a/server/package.json b/server/package.json index f6baa5969..1d045b82a 100644 --- a/server/package.json +++ b/server/package.json @@ -68,6 +68,7 @@ "i18n-iso-countries": "^7.6.0", "ioredis": "^5.3.2", "joi": "^17.10.0", + "js-yaml": "^4.1.0", "lodash": "^4.17.21", "luxon": "^3.4.2", "nest-commander": "^3.11.1", @@ -99,6 +100,7 @@ "@types/imagemin": "^8.0.1", "@types/jest": "29.5.12", "@types/jest-when": "^3.5.2", + "@types/js-yaml": "^4.0.9", "@types/lodash": "^4.14.197", "@types/mock-fs": "^4.13.1", "@types/multer": "^1.4.7", diff --git a/server/src/domain/system-config/system-config.core.ts b/server/src/domain/system-config/system-config.core.ts index 644d5c3cb..4a45de93e 100644 --- a/server/src/domain/system-config/system-config.core.ts +++ b/server/src/domain/system-config/system-config.core.ts @@ -17,6 +17,7 @@ import { BadRequestException, ForbiddenException, Injectable } from '@nestjs/com import { CronExpression } from '@nestjs/schedule'; import { plainToInstance } from 'class-transformer'; import { validate } from 'class-validator'; +import { load as loadYaml } from 'js-yaml'; import * as _ from 'lodash'; import { Subject } from 'rxjs'; import { QueueName } from '../job/job.constants'; @@ -341,19 +342,19 @@ export class SystemConfigCore { if (force || !this.configCache) { try { const file = await this.repository.readFile(filepath); - const json = JSON.parse(file.toString()); + const config = loadYaml(file.toString()) as any; const overrides: SystemConfigEntity[] = []; for (const key of Object.values(SystemConfigKey)) { - const value = _.get(json, key); - this.unsetDeep(json, key); + const value = _.get(config, key); + this.unsetDeep(config, key); if (value !== undefined) { overrides.push({ key, value }); } } - if (!_.isEmpty(json)) { - this.logger.warn(`Unknown keys found: ${JSON.stringify(json, null, 2)}`); + if (!_.isEmpty(config)) { + this.logger.warn(`Unknown keys found: ${JSON.stringify(config, null, 2)}`); } this.configCache = overrides; diff --git a/server/src/domain/system-config/system-config.service.spec.ts b/server/src/domain/system-config/system-config.service.spec.ts index 91c095cb7..8fa203ae2 100644 --- a/server/src/domain/system-config/system-config.service.spec.ts +++ b/server/src/domain/system-config/system-config.service.spec.ts @@ -209,7 +209,7 @@ describe(SystemConfigService.name, () => { await expect(sut.getConfig()).resolves.toEqual(updatedConfig); }); - it('should load the config from a file', async () => { + it('should load the config from a json file', async () => { process.env.IMMICH_CONFIG_FILE = 'immich-config.json'; const partialConfig = { ffmpeg: { crf: 30 }, @@ -224,6 +224,25 @@ describe(SystemConfigService.name, () => { expect(configMock.readFile).toHaveBeenCalledWith('immich-config.json'); }); + it('should load the config from a yaml file', async () => { + process.env.IMMICH_CONFIG_FILE = 'immich-config.yaml'; + const partialConfig = ` + ffmpeg: + crf: 30 + oauth: + autoLaunch: true + trash: + days: 10 + user: + deleteDelay: 15 + `; + configMock.readFile.mockResolvedValue(partialConfig); + + await expect(sut.getConfig()).resolves.toEqual(updatedConfig); + + expect(configMock.readFile).toHaveBeenCalledWith('immich-config.yaml'); + }); + it('should accept an empty configuration file', async () => { process.env.IMMICH_CONFIG_FILE = 'immich-config.json'; configMock.readFile.mockResolvedValue(JSON.stringify({})); @@ -242,6 +261,17 @@ describe(SystemConfigService.name, () => { expect(config.machineLearning.url).toEqual('immich_machine_learning'); }); + it('should warn for unknown options in yaml', async () => { + process.env.IMMICH_CONFIG_FILE = 'immich-config.yaml'; + const partialConfig = ` + unknownOption: true + `; + configMock.readFile.mockResolvedValue(partialConfig); + + await sut.getConfig(); + expect(warnLog).toHaveBeenCalled(); + }); + const tests = [ { should: 'validate numbers', config: { ffmpeg: { crf: 'not-a-number' } } }, { should: 'validate booleans', config: { oauth: { enabled: 'invalid' } } }, From 412c9bc76dd26e3889962b3a0421aea47b0a6e85 Mon Sep 17 00:00:00 2001 From: DeclanE <160616898+declan8010@users.noreply.github.com> Date: Tue, 12 Mar 2024 15:31:46 +0000 Subject: [PATCH 28/45] feat(web): Implemented device last seen date and time with user locale support (#7863) * Implemented last seen date and time with user locale support * Run Prettier * Prettier and Linter * Updated last seen to be in line with suggestions * Reworked datestamp --- web/src/lib/components/user-settings-page/device-card.svelte | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/web/src/lib/components/user-settings-page/device-card.svelte b/web/src/lib/components/user-settings-page/device-card.svelte index 5395ae43f..64f17ad9e 100644 --- a/web/src/lib/components/user-settings-page/device-card.svelte +++ b/web/src/lib/components/user-settings-page/device-card.svelte @@ -28,7 +28,6 @@
- {#if !device.current} From 83198ef5955a5820505a16a7e2076178e0d86944 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 12 Mar 2024 10:32:19 -0500 Subject: [PATCH 29/45] chore(deps): update grafana/grafana docker tag to v10.4.0 (#7875) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- docker/docker-compose.prod.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/docker-compose.prod.yml b/docker/docker-compose.prod.yml index 7cd2e6a0e..4d418a0c2 100644 --- a/docker/docker-compose.prod.yml +++ b/docker/docker-compose.prod.yml @@ -90,7 +90,7 @@ services: command: ['./run.sh', '-disable-reporting'] ports: - 3000:3000 - image: grafana/grafana:10.3.3-ubuntu + image: grafana/grafana:10.4.0-ubuntu@sha256:c1f582b7cc4c1b9805d187b5600ce7879550a12ef6d29571da133c3d3fc67a9c volumes: - grafana-data:/var/lib/grafana From 779f5d9b3df00004306da72c11ce156103e9dcaf Mon Sep 17 00:00:00 2001 From: ztz <36158219+ZTzTopia@users.noreply.github.com> Date: Tue, 12 Mar 2024 23:48:23 +0800 Subject: [PATCH 30/45] feat(web): dark color-scheme css for dark mode (#7812) * feat(web): dark color-scheme css for dark mode * use dark classes instead of adding data property * fix code format * fix typo --------- Co-authored-by: Alex Tran --- web/src/app.css | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/web/src/app.css b/web/src/app.css index 54cd03b89..c361d890c 100644 --- a/web/src/app.css +++ b/web/src/app.css @@ -23,6 +23,7 @@ --immich-dark-warning: 245 124 0; } } + @font-face { font-family: 'Overpass'; src: url('$lib/assets/fonts/overpass/Overpass.ttf') format('truetype-variations'); @@ -48,6 +49,14 @@ --navbar-height: calc(theme(spacing.18) + 4px); } +:root.dark { + color-scheme: dark; +} + +:root:not(.dark) { + color-scheme: light; +} + html { height: 100%; width: 100%; From 17d7d9364fb5aa995b59318943e160f302df6759 Mon Sep 17 00:00:00 2001 From: Jason Rasmussen Date: Tue, 12 Mar 2024 12:01:12 -0400 Subject: [PATCH 31/45] chore: publish sdk on release (#7895) * chore: publish sdk on release * fix: runtime dep * chore: sync versions * chore: update readme * fix: use Node16 module resolution --- .github/workflows/dispatch_sdk_update.yml | 26 ------------------- .github/workflows/sdk.yml | 31 +++++++++++++++++++++++ cli/package-lock.json | 6 +++-- e2e/package-lock.json | 6 +++-- open-api/typescript-sdk/.npmignore | 3 +++ open-api/typescript-sdk/README.md | 28 ++++++++++++++++++++ open-api/typescript-sdk/package-lock.json | 7 ++--- open-api/typescript-sdk/package.json | 11 ++++++-- open-api/typescript-sdk/src/index.ts | 4 +-- open-api/typescript-sdk/tsconfig.json | 4 +-- web/package-lock.json | 4 ++- 11 files changed, 90 insertions(+), 40 deletions(-) delete mode 100644 .github/workflows/dispatch_sdk_update.yml create mode 100644 .github/workflows/sdk.yml create mode 100644 open-api/typescript-sdk/.npmignore create mode 100644 open-api/typescript-sdk/README.md diff --git a/.github/workflows/dispatch_sdk_update.yml b/.github/workflows/dispatch_sdk_update.yml deleted file mode 100644 index 4f1abb5c4..000000000 --- a/.github/workflows/dispatch_sdk_update.yml +++ /dev/null @@ -1,26 +0,0 @@ -name: Update Immich SDK - -on: - workflow_dispatch: - push: - branches: ["main"] - -concurrency: - group: ${{ github.workflow }}-${{ github.ref }} - cancel-in-progress: true - -jobs: - update-sdk-repos: - runs-on: ubuntu-latest - if: ${{ !github.event.pull_request.head.repo.fork }} - steps: - - uses: actions/github-script@v7 - with: - github-token: ${{ secrets.GH_TOKEN }} - script: | - await github.rest.actions.createWorkflowDispatch({ - owner: 'immich-app', - repo: 'immich-sdk-typescript-axios', - workflow_id: 'build.yml', - ref: 'main' - }) diff --git a/.github/workflows/sdk.yml b/.github/workflows/sdk.yml new file mode 100644 index 000000000..cd3dbe2b1 --- /dev/null +++ b/.github/workflows/sdk.yml @@ -0,0 +1,31 @@ +name: Update Immich SDK + +on: + release: + types: [published] + +permissions: + packages: write + +jobs: + publish: + name: Publish `@immich/sdk` + runs-on: ubuntu-latest + defaults: + run: + working-directory: ./open-api/typescript-sdk + steps: + - uses: actions/checkout@v4 + # Setup .npmrc file to publish to npm + - uses: actions/setup-node@v4 + with: + node-version: '20.x' + registry-url: 'https://registry.npmjs.org' + - name: Install deps + run: npm ci + - name: Build + run: npm run build + - name: Publish + run: npm publish + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} diff --git a/cli/package-lock.json b/cli/package-lock.json index 2502656f7..82e920bd9 100644 --- a/cli/package-lock.json +++ b/cli/package-lock.json @@ -49,8 +49,10 @@ "version": "1.98.2", "dev": true, "license": "GNU Affero General Public License version 3", + "dependencies": { + "@oazapfts/runtime": "^1.0.2" + }, "devDependencies": { - "@oazapfts/runtime": "^1.0.0", "@types/node": "^20.11.0", "typescript": "^5.3.3" } @@ -5186,7 +5188,7 @@ "@immich/sdk": { "version": "file:../open-api/typescript-sdk", "requires": { - "@oazapfts/runtime": "^1.0.0", + "@oazapfts/runtime": "^1.0.2", "@types/node": "^20.11.0", "typescript": "^5.3.3" } diff --git a/e2e/package-lock.json b/e2e/package-lock.json index 51f51a1c6..f94958113 100644 --- a/e2e/package-lock.json +++ b/e2e/package-lock.json @@ -38,7 +38,7 @@ }, "../cli": { "name": "@immich/cli", - "version": "2.0.8", + "version": "2.1.0", "dev": true, "license": "GNU Affero General Public License version 3", "dependencies": { @@ -82,8 +82,10 @@ "version": "1.98.2", "dev": true, "license": "GNU Affero General Public License version 3", + "dependencies": { + "@oazapfts/runtime": "^1.0.2" + }, "devDependencies": { - "@oazapfts/runtime": "^1.0.0", "@types/node": "^20.11.0", "typescript": "^5.3.3" } diff --git a/open-api/typescript-sdk/.npmignore b/open-api/typescript-sdk/.npmignore new file mode 100644 index 000000000..1898c3e21 --- /dev/null +++ b/open-api/typescript-sdk/.npmignore @@ -0,0 +1,3 @@ +package-lock.json +tsconfig.json +src/ diff --git a/open-api/typescript-sdk/README.md b/open-api/typescript-sdk/README.md new file mode 100644 index 000000000..53a10eefc --- /dev/null +++ b/open-api/typescript-sdk/README.md @@ -0,0 +1,28 @@ +# @immich/sdk + +A TypeScript SDK for interfacing with the [Immich](https://immich.app/) API. + +## Install + +```bash +npm i --save @immich/sdk +``` + +## Usage + +For a more detailed example, check out the [`@immich/cli`](https://github.com/immich-app/immich/tree/main/cli). + +```typescript +import { defaults, getAllAlbums, getAllAssets, getMyUserInfo } from "@immich/sdk"; + +const API_KEY = ""; // process.env.IMMICH_API_KEY + +defaults.baseUrl = "https://demo.immich.app/api"; +defaults.headers = { "x-api-key": API_KEY }; + +const user = await getMyUserInfo(); +const assets = await getAllAssets({ take: 1000 }); +const albums = await getAllAlbums({}); + +console.log({ user, assets, albums }); +``` diff --git a/open-api/typescript-sdk/package-lock.json b/open-api/typescript-sdk/package-lock.json index 62412fdd4..0f1926996 100644 --- a/open-api/typescript-sdk/package-lock.json +++ b/open-api/typescript-sdk/package-lock.json @@ -8,8 +8,10 @@ "name": "@immich/sdk", "version": "1.98.2", "license": "GNU Affero General Public License version 3", + "dependencies": { + "@oazapfts/runtime": "^1.0.2" + }, "devDependencies": { - "@oazapfts/runtime": "^1.0.0", "@types/node": "^20.11.0", "typescript": "^5.3.3" } @@ -17,8 +19,7 @@ "node_modules/@oazapfts/runtime": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@oazapfts/runtime/-/runtime-1.0.2.tgz", - "integrity": "sha512-V33FjR6V+AkGRWYQW3XPm5BLn2loGl2ujSeja1TzdjjEn2zjGgl3ve0dcFf/jEwPZEOqQZl6YwIgIB/clXVqWw==", - "dev": true + "integrity": "sha512-V33FjR6V+AkGRWYQW3XPm5BLn2loGl2ujSeja1TzdjjEn2zjGgl3ve0dcFf/jEwPZEOqQZl6YwIgIB/clXVqWw==" }, "node_modules/@types/node": { "version": "20.11.25", diff --git a/open-api/typescript-sdk/package.json b/open-api/typescript-sdk/package.json index ec5e78fac..4b04ee7c2 100644 --- a/open-api/typescript-sdk/package.json +++ b/open-api/typescript-sdk/package.json @@ -1,7 +1,7 @@ { "name": "@immich/sdk", "version": "1.98.2", - "description": "", + "description": "Auto-generated TypeScript SDK for the Immich API", "type": "module", "main": "./build/index.js", "types": "./build/index.d.ts", @@ -15,9 +15,16 @@ "build": "tsc" }, "license": "GNU Affero General Public License version 3", + "dependencies": { + "@oazapfts/runtime": "^1.0.2" + }, "devDependencies": { - "@oazapfts/runtime": "^1.0.0", "@types/node": "^20.11.0", "typescript": "^5.3.3" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/immich-app/immich.git", + "directory": "open-api/typescript-sdk" } } diff --git a/open-api/typescript-sdk/src/index.ts b/open-api/typescript-sdk/src/index.ts index 5759e66ad..d81c7282a 100644 --- a/open-api/typescript-sdk/src/index.ts +++ b/open-api/typescript-sdk/src/index.ts @@ -1,2 +1,2 @@ -export * from './fetch-client'; -export * from './fetch-errors'; +export * from './fetch-client.js'; +export * from './fetch-errors.js'; diff --git a/open-api/typescript-sdk/tsconfig.json b/open-api/typescript-sdk/tsconfig.json index 251202774..30d58d517 100644 --- a/open-api/typescript-sdk/tsconfig.json +++ b/open-api/typescript-sdk/tsconfig.json @@ -5,8 +5,8 @@ "skipLibCheck": true, "declaration": true, "outDir": "build", - "module": "esnext", - "moduleResolution": "Bundler", + "module": "Node16", + "moduleResolution": "Node16", "lib": ["esnext", "dom"] }, "include": ["src/**/*.ts"] diff --git a/web/package-lock.json b/web/package-lock.json index 5d8212d3e..26c1e1036 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -65,8 +65,10 @@ "name": "@immich/sdk", "version": "1.98.2", "license": "GNU Affero General Public License version 3", + "dependencies": { + "@oazapfts/runtime": "^1.0.2" + }, "devDependencies": { - "@oazapfts/runtime": "^1.0.0", "@types/node": "^20.11.0", "typescript": "^5.3.3" } From 82aabc63f55077cd8da1338c17ff17bf4a74df27 Mon Sep 17 00:00:00 2001 From: Michel Heusschen <59014050+michelheusschen@users.noreply.github.com> Date: Tue, 12 Mar 2024 20:21:42 +0100 Subject: [PATCH 32/45] fix(web): prevent combobox options from disappearing (#7733) --- web/src/lib/components/shared-components/combobox.svelte | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/web/src/lib/components/shared-components/combobox.svelte b/web/src/lib/components/shared-components/combobox.svelte index 80ea3b796..c69460640 100644 --- a/web/src/lib/components/shared-components/combobox.svelte +++ b/web/src/lib/components/shared-components/combobox.svelte @@ -24,6 +24,7 @@ export let placeholder = ''; let isOpen = false; + let inputFocused = false; let searchQuery = selectedOption?.label || ''; $: filteredOptions = options.filter((option) => option.label.toLowerCase().includes(searchQuery.toLowerCase())); @@ -36,11 +37,16 @@ const handleClick = () => { searchQuery = ''; isOpen = true; + inputFocused = true; dispatch('click'); }; let handleOutClick = () => { - isOpen = false; + // In rare cases it's possible for the input to still have focus and + // outclick to fire. + if (!inputFocused) { + isOpen = false; + } }; let handleSelect = (option: ComboBoxOption) => { @@ -79,6 +85,7 @@ value={isOpen ? '' : selectedOption?.label || ''} on:input={(e) => (searchQuery = e.currentTarget.value)} on:focus={handleClick} + on:blur={() => (inputFocused = false)} />
Date: Tue, 12 Mar 2024 15:28:29 -0400 Subject: [PATCH 33/45] fix(deps): update web (#7872) * fix(deps): update web * update types to follow map types --------- Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Daniel Dietzler --- web/package-lock.json | 140 +++++++++--------- .../shared-components/map/map.svelte | 4 +- 2 files changed, 72 insertions(+), 72 deletions(-) diff --git a/web/package-lock.json b/web/package-lock.json index 26c1e1036..899ec9156 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -1583,9 +1583,9 @@ } }, "node_modules/@photo-sphere-viewer/core": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/@photo-sphere-viewer/core/-/core-5.7.1.tgz", - "integrity": "sha512-2wwErCpRiCee8mv9k5YAr4itMrAh2DL9dHriaOysS84xRJcmEZBMZXfhTuTFEdBvEq0o8Iv/gKheQvCrbLyv5w==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/@photo-sphere-viewer/core/-/core-5.7.2.tgz", + "integrity": "sha512-5RznXVRwuO+Izceae2SbwYM/H8GHtwxKlT26P4UcRFZYsYKllMAggAz9hhU729Vu+r1+il5PHvomIsmPHVTTaw==", "dependencies": { "three": "^0.161.0" } @@ -2264,16 +2264,16 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.1.0.tgz", - "integrity": "sha512-j6vT/kCulhG5wBmGtstKeiVr1rdXE4nk+DT1k6trYkwlrvW9eOF5ZbgKnd/YR6PcM4uTEXa0h6Fcvf6X7Dxl0w==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.1.1.tgz", + "integrity": "sha512-zioDz623d0RHNhvx0eesUmGfIjzrk18nSBC8xewepKXbBvN/7c1qImV7Hg8TI1URTxKax7/zxfxj3Uph8Chcuw==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "7.1.0", - "@typescript-eslint/type-utils": "7.1.0", - "@typescript-eslint/utils": "7.1.0", - "@typescript-eslint/visitor-keys": "7.1.0", + "@typescript-eslint/scope-manager": "7.1.1", + "@typescript-eslint/type-utils": "7.1.1", + "@typescript-eslint/utils": "7.1.1", + "@typescript-eslint/visitor-keys": "7.1.1", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", @@ -2332,15 +2332,15 @@ "dev": true }, "node_modules/@typescript-eslint/parser": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.1.0.tgz", - "integrity": "sha512-V1EknKUubZ1gWFjiOZhDSNToOjs63/9O0puCgGS8aDOgpZY326fzFu15QAUjwaXzRZjf/qdsdBrckYdv9YxB8w==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.1.1.tgz", + "integrity": "sha512-ZWUFyL0z04R1nAEgr9e79YtV5LbafdOtN7yapNbn1ansMyaegl2D4bL7vHoJ4HPSc4CaLwuCVas8CVuneKzplQ==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "7.1.0", - "@typescript-eslint/types": "7.1.0", - "@typescript-eslint/typescript-estree": "7.1.0", - "@typescript-eslint/visitor-keys": "7.1.0", + "@typescript-eslint/scope-manager": "7.1.1", + "@typescript-eslint/types": "7.1.1", + "@typescript-eslint/typescript-estree": "7.1.1", + "@typescript-eslint/visitor-keys": "7.1.1", "debug": "^4.3.4" }, "engines": { @@ -2360,13 +2360,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.1.0.tgz", - "integrity": "sha512-6TmN4OJiohHfoOdGZ3huuLhpiUgOGTpgXNUPJgeZOZR3DnIpdSgtt83RS35OYNNXxM4TScVlpVKC9jyQSETR1A==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.1.1.tgz", + "integrity": "sha512-cirZpA8bJMRb4WZ+rO6+mnOJrGFDd38WoXCEI57+CYBqta8Yc8aJym2i7vyqLL1vVYljgw0X27axkUXz32T8TA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.1.0", - "@typescript-eslint/visitor-keys": "7.1.0" + "@typescript-eslint/types": "7.1.1", + "@typescript-eslint/visitor-keys": "7.1.1" }, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -2377,13 +2377,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.1.0.tgz", - "integrity": "sha512-UZIhv8G+5b5skkcuhgvxYWHjk7FW7/JP5lPASMEUoliAPwIH/rxoUSQPia2cuOj9AmDZmwUl1usKm85t5VUMew==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.1.1.tgz", + "integrity": "sha512-5r4RKze6XHEEhlZnJtR3GYeCh1IueUHdbrukV2KSlLXaTjuSfeVF8mZUVPLovidCuZfbVjfhi4c0DNSa/Rdg5g==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "7.1.0", - "@typescript-eslint/utils": "7.1.0", + "@typescript-eslint/typescript-estree": "7.1.1", + "@typescript-eslint/utils": "7.1.1", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" }, @@ -2404,9 +2404,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.1.0.tgz", - "integrity": "sha512-qTWjWieJ1tRJkxgZYXx6WUYtWlBc48YRxgY2JN1aGeVpkhmnopq+SUC8UEVGNXIvWH7XyuTjwALfG6bFEgCkQA==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.1.1.tgz", + "integrity": "sha512-KhewzrlRMrgeKm1U9bh2z5aoL4s7K3tK5DwHDn8MHv0yQfWFz/0ZR6trrIHHa5CsF83j/GgHqzdbzCXJ3crx0Q==", "dev": true, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -2417,13 +2417,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.1.0.tgz", - "integrity": "sha512-k7MyrbD6E463CBbSpcOnwa8oXRdHzH1WiVzOipK3L5KSML92ZKgUBrTlehdi7PEIMT8k0bQixHUGXggPAlKnOQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.1.1.tgz", + "integrity": "sha512-9ZOncVSfr+sMXVxxca2OJOPagRwT0u/UHikM2Rd6L/aB+kL/QAuTnsv6MeXtjzCJYb8PzrXarypSGIPx3Jemxw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.1.0", - "@typescript-eslint/visitor-keys": "7.1.0", + "@typescript-eslint/types": "7.1.1", + "@typescript-eslint/visitor-keys": "7.1.1", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -2502,17 +2502,17 @@ "dev": true }, "node_modules/@typescript-eslint/utils": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.1.0.tgz", - "integrity": "sha512-WUFba6PZC5OCGEmbweGpnNJytJiLG7ZvDBJJoUcX4qZYf1mGZ97mO2Mps6O2efxJcJdRNpqweCistDbZMwIVHw==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.1.1.tgz", + "integrity": "sha512-thOXM89xA03xAE0lW7alstvnyoBUbBX38YtY+zAUcpRPcq9EIhXPuJ0YTv948MbzmKh6e1AUszn5cBFK49Umqg==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "7.1.0", - "@typescript-eslint/types": "7.1.0", - "@typescript-eslint/typescript-estree": "7.1.0", + "@typescript-eslint/scope-manager": "7.1.1", + "@typescript-eslint/types": "7.1.1", + "@typescript-eslint/typescript-estree": "7.1.1", "semver": "^7.5.4" }, "engines": { @@ -2560,12 +2560,12 @@ "dev": true }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.1.0.tgz", - "integrity": "sha512-FhUqNWluiGNzlvnDZiXad4mZRhtghdoKW6e98GoEOYSu5cND+E39rG5KwJMUzeENwm1ztYBRqof8wMLP+wNPIA==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.1.1.tgz", + "integrity": "sha512-yTdHDQxY7cSoCcAtiBzVzxleJhkGB9NncSIyMYe2+OGON1ZsP9zOPws/Pqgopa65jvknOjlk/w7ulPlZ78PiLQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.1.0", + "@typescript-eslint/types": "7.1.1", "eslint-visitor-keys": "^3.4.1" }, "engines": { @@ -3003,9 +3003,9 @@ "peer": true }, "node_modules/autoprefixer": { - "version": "10.4.17", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.17.tgz", - "integrity": "sha512-/cpVNRLSfhOtcGflT13P2794gVSgmPgTR+erw5ifnMLZb0UnSlkK4tquLmkd3BhA+nLo5tX8Cu0upUsGKvKbmg==", + "version": "10.4.18", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.18.tgz", + "integrity": "sha512-1DKbDfsr6KUElM6wg+0zRNkB/Q7WcKYAaK+pzXn+Xqmszm/5Xa9coeNdtP88Vi+dPzZnMjhge8GIV49ZQkDa+g==", "dev": true, "funding": [ { @@ -3022,8 +3022,8 @@ } ], "dependencies": { - "browserslist": "^4.22.2", - "caniuse-lite": "^1.0.30001578", + "browserslist": "^4.23.0", + "caniuse-lite": "^1.0.30001591", "fraction.js": "^4.3.7", "normalize-range": "^0.1.2", "picocolors": "^1.0.0", @@ -3116,9 +3116,9 @@ } }, "node_modules/browserslist": { - "version": "4.22.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz", - "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==", + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", + "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", "dev": true, "funding": [ { @@ -3135,8 +3135,8 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001565", - "electron-to-chromium": "^1.4.601", + "caniuse-lite": "^1.0.30001587", + "electron-to-chromium": "^1.4.668", "node-releases": "^2.0.14", "update-browserslist-db": "^1.0.13" }, @@ -3255,9 +3255,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001579", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001579.tgz", - "integrity": "sha512-u5AUVkixruKHJjw/pj9wISlcMpgFWzSrczLZbrqBSxukQixmg0SJ5sZTpvaFvxU0HoQKd4yoyAogyrAz9pzJnA==", + "version": "1.0.30001597", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001597.tgz", + "integrity": "sha512-7LjJvmQU6Sj7bL0j5b5WY/3n7utXUJvAe1lxhsHDbLmwX9mdL86Yjtr+5SRCyf8qME4M7pU2hswj0FpyBVCv9w==", "dev": true, "funding": [ { @@ -3862,9 +3862,9 @@ "integrity": "sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ==" }, "node_modules/electron-to-chromium": { - "version": "1.4.614", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.614.tgz", - "integrity": "sha512-X4ze/9Sc3QWs6h92yerwqv7aB/uU8vCjZcrMjA8N9R1pjMFRe44dLsck5FzLilOYvcXuDn93B+bpGYyufc70gQ==", + "version": "1.4.701", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.701.tgz", + "integrity": "sha512-K3WPQ36bUOtXg/1+69bFlFOvdSm0/0bGqmsfPDLRXLanoKXdA+pIWuf/VbA9b+2CwBFuONgl4NEz4OEm+OJOKA==", "dev": true }, "node_modules/emoji-regex": { @@ -8110,9 +8110,9 @@ } }, "node_modules/svelte-maplibre": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/svelte-maplibre/-/svelte-maplibre-0.8.1.tgz", - "integrity": "sha512-CTm/s0+mJzBHSoO5zPKBo3ORmUyiWS3Ex4xvVdNgVg+sDesHasEAJ0N1/NUrd56S33zgRdFZGzRnRguCnKFAzw==", + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/svelte-maplibre/-/svelte-maplibre-0.8.2.tgz", + "integrity": "sha512-l4FW7VE/1/uUUyk639gtvYyK0QbNw3roRq9ouxPDS+DAW8gwpxlnDwYTtjEO+Yq7TK6xOjimJtKOG3KES8e7Uw==", "dependencies": { "d3-geo": "^3.1.0", "just-compare": "^2.3.0", @@ -8520,9 +8520,9 @@ } }, "node_modules/typescript": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", - "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", + "version": "5.4.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.2.tgz", + "integrity": "sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -8670,9 +8670,9 @@ } }, "node_modules/vite": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.1.4.tgz", - "integrity": "sha512-n+MPqzq+d9nMVTKyewqw6kSt+R3CkvF9QAKY8obiQn8g1fwTscKxyfaYnC632HtBXAQGc1Yjomphwn1dtwGAHg==", + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.1.5.tgz", + "integrity": "sha512-BdN1xh0Of/oQafhU+FvopafUp6WaYenLU/NFoL5WyJL++GxkNfieKzBhM24H3HVsPQrlAqB7iJYTHabzaRed5Q==", "dev": true, "dependencies": { "esbuild": "^0.19.3", diff --git a/web/src/lib/components/shared-components/map/map.svelte b/web/src/lib/components/shared-components/map/map.svelte index 17fd92021..74643e502 100644 --- a/web/src/lib/components/shared-components/map/map.svelte +++ b/web/src/lib/components/shared-components/map/map.svelte @@ -158,7 +158,7 @@ applyToClusters asButton let:feature - on:click={(event) => handlePromiseError(handleClusterClick(event.detail.feature.properties.cluster_id, map))} + on:click={(event) => handlePromiseError(handleClusterClick(event.detail.feature.properties?.cluster_id, map))} >
{ - $$slots.popup || handleAssetClick(event.detail.feature.properties.id, map); + $$slots.popup || handleAssetClick(event.detail.feature.properties?.id, map); }} > {#if useLocationPin} From b07ed3f6154d116e884f86bb8f033186fa336dc6 Mon Sep 17 00:00:00 2001 From: Michel Heusschen <59014050+michelheusschen@users.noreply.github.com> Date: Tue, 12 Mar 2024 20:30:19 +0100 Subject: [PATCH 34/45] fix(web): correctly use button and link elements (#7907) --- .../asset-viewer/detail-panel.svelte | 134 ++++++++---------- .../sharedlinks-page/shared-link-card.svelte | 11 +- 2 files changed, 64 insertions(+), 81 deletions(-) diff --git a/web/src/lib/components/asset-viewer/detail-panel.svelte b/web/src/lib/components/asset-viewer/detail-panel.svelte index aa6905a4d..334b406bb 100644 --- a/web/src/lib/components/asset-viewer/detail-panel.svelte +++ b/web/src/lib/components/asset-viewer/detail-panel.svelte @@ -258,62 +258,58 @@ @@ -341,12 +337,10 @@ {@const assetDateTimeOriginal = DateTime.fromISO(asset.exifInfo.dateTimeOriginal, { zone: asset.exifInfo.timeZone ?? undefined, })} -
(isOwner ? (isShowChangeDate = true) : null)} - on:keydown={(event) => (isOwner ? event.key === 'Enter' && (isShowChangeDate = true) : null)} title={isOwner ? 'Edit date' : ''} class:hover:dark:text-immich-dark-primary={isOwner} class:hover:text-immich-primary={isOwner} @@ -384,11 +378,11 @@
{#if isOwner} - +
{/if} -
+ {:else if !asset.exifInfo?.dateTimeOriginal && !asset.isReadOnly && isOwner}
@@ -396,9 +390,9 @@
- +
{:else if asset.exifInfo?.dateTimeOriginal && asset.isReadOnly} {@const assetDateTimeOriginal = DateTime.fromISO(asset.exifInfo.dateTimeOriginal, { @@ -517,13 +511,11 @@ {/if} {#if asset.exifInfo?.city && !asset.isReadOnly} -
(isOwner ? (isShowChangeLocation = true) : null)} - on:keydown={(event) => (isOwner ? event.key === 'Enter' && (isShowChangeLocation = true) : null)} - tabindex="0" title={isOwner ? 'Edit location' : ''} - role="button" class:hover:dark:text-immich-dark-primary={isOwner} class:hover:text-immich-primary={isOwner} > @@ -550,14 +542,12 @@
{/if} - + {:else if !asset.exifInfo?.city && !asset.isReadOnly && isOwner} -
(isShowChangeLocation = true)} - on:keydown={(event) => event.key === 'Enter' && (isShowChangeLocation = true)} - tabindex="0" - role="button" title="Add location" >
@@ -570,7 +560,7 @@
-
+ {:else if asset.exifInfo?.city && asset.isReadOnly}
diff --git a/web/src/lib/components/sharedlinks-page/shared-link-card.svelte b/web/src/lib/components/sharedlinks-page/shared-link-card.svelte index f2d90b6c6..993a052bf 100644 --- a/web/src/lib/components/sharedlinks-page/shared-link-card.svelte +++ b/web/src/lib/components/sharedlinks-page/shared-link-card.svelte @@ -1,5 +1,4 @@
From d67a6b72930524519034f3dd12a99db6b9d31bfc Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 13 Mar 2024 12:54:46 -0400 Subject: [PATCH 40/45] fix(deps): update server (#7898) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- server/package-lock.json | 1442 +++++++++++++++++++------------------- server/package.json | 6 +- 2 files changed, 732 insertions(+), 716 deletions(-) diff --git a/server/package-lock.json b/server/package-lock.json index 49226d28f..deab0b791 100644 --- a/server/package-lock.json +++ b/server/package-lock.json @@ -21,9 +21,9 @@ "@nestjs/swagger": "^7.1.8", "@nestjs/typeorm": "^10.0.0", "@nestjs/websockets": "^10.2.2", - "@opentelemetry/auto-instrumentations-node": "^0.41.1", - "@opentelemetry/exporter-prometheus": "^0.48.0", - "@opentelemetry/sdk-node": "^0.48.0", + "@opentelemetry/auto-instrumentations-node": "^0.42.0", + "@opentelemetry/exporter-prometheus": "^0.49.0", + "@opentelemetry/sdk-node": "^0.49.0", "@socket.io/postgres-adapter": "^0.3.1", "@types/picomatch": "^2.3.3", "archiver": "^7.0.0", @@ -1096,15 +1096,15 @@ } }, "node_modules/@grpc/grpc-js": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.10.1.tgz", - "integrity": "sha512-55ONqFytZExfOIjF1RjXPcVmT/jJqFzbbDqxK9jmRV4nxiYWtL9hENSW1Jfx0SdZfrvoqd44YJ/GJTqfRrawSQ==", + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.10.2.tgz", + "integrity": "sha512-lSbgu8iayAod8O0YcoXK3+bMFGThY2svtN35Zlm9VepsB3jfyIcoupKknEht7Kh9Q8ITjsp0J4KpYo9l4+FhNg==", "dependencies": { - "@grpc/proto-loader": "^0.7.8", - "@types/node": ">=12.12.47" + "@grpc/proto-loader": "^0.7.10", + "@js-sdsl/ordered-map": "^4.4.2" }, "engines": { - "node": "^8.13.0 || >=10.10.0" + "node": ">=12.10.0" } }, "node_modules/@grpc/proto-loader": { @@ -2287,6 +2287,15 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@js-sdsl/ordered-map": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz", + "integrity": "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/js-sdsl" + } + }, "node_modules/@ljharb/through": { "version": "2.3.12", "resolved": "https://registry.npmjs.org/@ljharb/through/-/through-2.3.12.tgz", @@ -2877,9 +2886,9 @@ } }, "node_modules/@opentelemetry/api-logs": { - "version": "0.48.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.48.0.tgz", - "integrity": "sha512-1/aMiU4Eqo3Zzpfwu51uXssp5pzvHFObk8S9pKAiXb1ne8pvg1qxBQitYL1XUiAMEXFzgjaidYG2V6624DRhhw==", + "version": "0.49.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.49.1.tgz", + "integrity": "sha512-kaNl/T7WzyMUQHQlVq7q0oV4Kev6+0xFwqzofryC66jgGMacd0QH5TwfpbUwSTby+SdAdprAe5UKMvBw4tKS5Q==", "dependencies": { "@opentelemetry/api": "^1.0.0" }, @@ -2888,54 +2897,54 @@ } }, "node_modules/@opentelemetry/auto-instrumentations-node": { - "version": "0.41.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/auto-instrumentations-node/-/auto-instrumentations-node-0.41.1.tgz", - "integrity": "sha512-gQG0mHlPVBQveuemqNYkrL4IB3T6v2e5sMiDI6FQzFWeLzzFrC04R4fY6AE1YmkhOyteCDpHL/U6CULP2mkt8w==", + "version": "0.42.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/auto-instrumentations-node/-/auto-instrumentations-node-0.42.0.tgz", + "integrity": "sha512-fxcB7My5QTVfX6kBH4r5OFduGSxdpROgyIu7CqClp1psFHfVaBMQd4lbK2u+39K5kbjzJT2OaUP8yQuAvKJqBg==", "dependencies": { - "@opentelemetry/instrumentation": "^0.48.0", - "@opentelemetry/instrumentation-amqplib": "^0.34.0", - "@opentelemetry/instrumentation-aws-lambda": "^0.38.0", - "@opentelemetry/instrumentation-aws-sdk": "^0.38.1", - "@opentelemetry/instrumentation-bunyan": "^0.35.0", - "@opentelemetry/instrumentation-cassandra-driver": "^0.35.0", - "@opentelemetry/instrumentation-connect": "^0.33.0", - "@opentelemetry/instrumentation-cucumber": "^0.3.0", - "@opentelemetry/instrumentation-dataloader": "^0.6.0", - "@opentelemetry/instrumentation-dns": "^0.33.0", - "@opentelemetry/instrumentation-express": "^0.35.0", - "@opentelemetry/instrumentation-fastify": "^0.33.0", - "@opentelemetry/instrumentation-fs": "^0.9.0", - "@opentelemetry/instrumentation-generic-pool": "^0.33.0", - "@opentelemetry/instrumentation-graphql": "^0.37.0", - "@opentelemetry/instrumentation-grpc": "^0.48.0", - "@opentelemetry/instrumentation-hapi": "^0.34.0", - "@opentelemetry/instrumentation-http": "^0.48.0", - "@opentelemetry/instrumentation-ioredis": "^0.37.0", - "@opentelemetry/instrumentation-knex": "^0.33.0", - "@opentelemetry/instrumentation-koa": "^0.37.0", - "@opentelemetry/instrumentation-lru-memoizer": "^0.34.0", - "@opentelemetry/instrumentation-memcached": "^0.33.0", - "@opentelemetry/instrumentation-mongodb": "^0.39.0", - "@opentelemetry/instrumentation-mongoose": "^0.35.0", - "@opentelemetry/instrumentation-mysql": "^0.35.0", - "@opentelemetry/instrumentation-mysql2": "^0.35.0", - "@opentelemetry/instrumentation-nestjs-core": "^0.34.0", - "@opentelemetry/instrumentation-net": "^0.33.0", - "@opentelemetry/instrumentation-pg": "^0.38.0", - "@opentelemetry/instrumentation-pino": "^0.35.0", - "@opentelemetry/instrumentation-redis": "^0.36.0", - "@opentelemetry/instrumentation-redis-4": "^0.36.0", - "@opentelemetry/instrumentation-restify": "^0.35.0", - "@opentelemetry/instrumentation-router": "^0.34.0", - "@opentelemetry/instrumentation-socket.io": "^0.36.0", - "@opentelemetry/instrumentation-tedious": "^0.7.0", - "@opentelemetry/instrumentation-winston": "^0.34.0", - "@opentelemetry/resource-detector-alibaba-cloud": "^0.28.6", - "@opentelemetry/resource-detector-aws": "^1.3.6", - "@opentelemetry/resource-detector-container": "^0.3.6", - "@opentelemetry/resource-detector-gcp": "^0.29.6", + "@opentelemetry/instrumentation": "^0.49.1", + "@opentelemetry/instrumentation-amqplib": "^0.35.0", + "@opentelemetry/instrumentation-aws-lambda": "^0.39.0", + "@opentelemetry/instrumentation-aws-sdk": "^0.39.0", + "@opentelemetry/instrumentation-bunyan": "^0.36.0", + "@opentelemetry/instrumentation-cassandra-driver": "^0.36.0", + "@opentelemetry/instrumentation-connect": "^0.34.0", + "@opentelemetry/instrumentation-cucumber": "^0.4.0", + "@opentelemetry/instrumentation-dataloader": "^0.7.0", + "@opentelemetry/instrumentation-dns": "^0.34.0", + "@opentelemetry/instrumentation-express": "^0.36.0", + "@opentelemetry/instrumentation-fastify": "^0.34.0", + "@opentelemetry/instrumentation-fs": "^0.10.0", + "@opentelemetry/instrumentation-generic-pool": "^0.34.0", + "@opentelemetry/instrumentation-graphql": "^0.38.0", + "@opentelemetry/instrumentation-grpc": "^0.49.1", + "@opentelemetry/instrumentation-hapi": "^0.35.0", + "@opentelemetry/instrumentation-http": "^0.49.1", + "@opentelemetry/instrumentation-ioredis": "^0.38.0", + "@opentelemetry/instrumentation-knex": "^0.34.0", + "@opentelemetry/instrumentation-koa": "^0.38.0", + "@opentelemetry/instrumentation-lru-memoizer": "^0.35.0", + "@opentelemetry/instrumentation-memcached": "^0.34.0", + "@opentelemetry/instrumentation-mongodb": "^0.40.0", + "@opentelemetry/instrumentation-mongoose": "^0.36.0", + "@opentelemetry/instrumentation-mysql": "^0.36.0", + "@opentelemetry/instrumentation-mysql2": "^0.36.0", + "@opentelemetry/instrumentation-nestjs-core": "^0.35.0", + "@opentelemetry/instrumentation-net": "^0.34.0", + "@opentelemetry/instrumentation-pg": "^0.39.0", + "@opentelemetry/instrumentation-pino": "^0.36.0", + "@opentelemetry/instrumentation-redis": "^0.37.0", + "@opentelemetry/instrumentation-redis-4": "^0.37.0", + "@opentelemetry/instrumentation-restify": "^0.36.0", + "@opentelemetry/instrumentation-router": "^0.35.0", + "@opentelemetry/instrumentation-socket.io": "^0.37.0", + "@opentelemetry/instrumentation-tedious": "^0.8.0", + "@opentelemetry/instrumentation-winston": "^0.35.0", + "@opentelemetry/resource-detector-alibaba-cloud": "^0.28.7", + "@opentelemetry/resource-detector-aws": "^1.4.0", + "@opentelemetry/resource-detector-container": "^0.3.7", + "@opentelemetry/resource-detector-gcp": "^0.29.7", "@opentelemetry/resources": "^1.12.0", - "@opentelemetry/sdk-node": "^0.48.0" + "@opentelemetry/sdk-node": "^0.49.1" }, "engines": { "node": ">=14" @@ -2945,38 +2954,38 @@ } }, "node_modules/@opentelemetry/context-async-hooks": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-1.21.0.tgz", - "integrity": "sha512-t0iulGPiMjG/NrSjinPQoIf8ST/o9V0dGOJthfrFporJlNdlKIQPfC7lkrV+5s2dyBThfmSbJlp/4hO1eOcDXA==", + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-1.22.0.tgz", + "integrity": "sha512-Nfdxyg8YtWqVWkyrCukkundAjPhUXi93JtVQmqDT1mZRVKqA7e2r7eJCrI+F651XUBMp0hsOJSGiFk3QSpaIJw==", "engines": { "node": ">=14" }, "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.8.0" + "@opentelemetry/api": ">=1.0.0 <1.9.0" } }, "node_modules/@opentelemetry/core": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.21.0.tgz", - "integrity": "sha512-KP+OIweb3wYoP7qTYL/j5IpOlu52uxBv5M4+QhSmmUfLyTgu1OIS71msK3chFo1D6Y61BIH3wMiMYRCxJCQctA==", + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.22.0.tgz", + "integrity": "sha512-0VoAlT6x+Xzik1v9goJ3pZ2ppi6+xd3aUfg4brfrLkDBHRIVjMP0eBHrKrhB+NKcDyMAg8fAbGL3Npg/F6AwWA==", "dependencies": { - "@opentelemetry/semantic-conventions": "1.21.0" + "@opentelemetry/semantic-conventions": "1.22.0" }, "engines": { "node": ">=14" }, "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.8.0" + "@opentelemetry/api": ">=1.0.0 <1.9.0" } }, "node_modules/@opentelemetry/exporter-prometheus": { - "version": "0.48.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-prometheus/-/exporter-prometheus-0.48.0.tgz", - "integrity": "sha512-n1cSdC7/AWkyTZD5WgK4FP0oxgRZUIjjquM6QqNOX9TLALbsg5RxiiBCqiHcbmABt7ZABZKhd8OH3t/GqTayLw==", + "version": "0.49.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-prometheus/-/exporter-prometheus-0.49.1.tgz", + "integrity": "sha512-FgzGl6OH22f+Wb1dh/TnoQSnZE2SCADhHx06nMqxivSqRJ9t3AhUdMsEOFt2IMjZClE705pcsLHk10BCJ79vsA==", "dependencies": { - "@opentelemetry/core": "1.21.0", - "@opentelemetry/resources": "1.21.0", - "@opentelemetry/sdk-metrics": "1.21.0" + "@opentelemetry/core": "1.22.0", + "@opentelemetry/resources": "1.22.0", + "@opentelemetry/sdk-metrics": "1.22.0" }, "engines": { "node": ">=14" @@ -2986,16 +2995,16 @@ } }, "node_modules/@opentelemetry/exporter-trace-otlp-grpc": { - "version": "0.48.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-grpc/-/exporter-trace-otlp-grpc-0.48.0.tgz", - "integrity": "sha512-+qRQXUbdRW6aNRT5yWOG3G6My1VxxKeqgUyLkkdIjkT20lvymjiN2RpBfGMtAf/oqnuRknf9snFl9VSIO2gniw==", + "version": "0.49.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-grpc/-/exporter-trace-otlp-grpc-0.49.1.tgz", + "integrity": "sha512-Zbd7f3zF7fI2587MVhBizaW21cO/SordyrZGtMtvhoxU6n4Qb02Gx71X4+PzXH620e0+JX+Pcr9bYb1HTeVyJA==", "dependencies": { "@grpc/grpc-js": "^1.7.1", - "@opentelemetry/core": "1.21.0", - "@opentelemetry/otlp-grpc-exporter-base": "0.48.0", - "@opentelemetry/otlp-transformer": "0.48.0", - "@opentelemetry/resources": "1.21.0", - "@opentelemetry/sdk-trace-base": "1.21.0" + "@opentelemetry/core": "1.22.0", + "@opentelemetry/otlp-grpc-exporter-base": "0.49.1", + "@opentelemetry/otlp-transformer": "0.49.1", + "@opentelemetry/resources": "1.22.0", + "@opentelemetry/sdk-trace-base": "1.22.0" }, "engines": { "node": ">=14" @@ -3005,15 +3014,15 @@ } }, "node_modules/@opentelemetry/exporter-trace-otlp-http": { - "version": "0.48.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-http/-/exporter-trace-otlp-http-0.48.0.tgz", - "integrity": "sha512-QEZKbfWqXrbKVpr2PHd4KyKI0XVOhUYC+p2RPV8s+2K5QzZBE3+F9WlxxrXDfkrvGmpQAZytBoHQQYA3AGOtpw==", + "version": "0.49.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-http/-/exporter-trace-otlp-http-0.49.1.tgz", + "integrity": "sha512-KOLtZfZvIrpGZLVvblKsiVQT7gQUZNKcUUH24Zz6Xbi7LJb9Vt6xtUZFYdR5IIjvt47PIqBKDWUQlU0o1wAsRw==", "dependencies": { - "@opentelemetry/core": "1.21.0", - "@opentelemetry/otlp-exporter-base": "0.48.0", - "@opentelemetry/otlp-transformer": "0.48.0", - "@opentelemetry/resources": "1.21.0", - "@opentelemetry/sdk-trace-base": "1.21.0" + "@opentelemetry/core": "1.22.0", + "@opentelemetry/otlp-exporter-base": "0.49.1", + "@opentelemetry/otlp-transformer": "0.49.1", + "@opentelemetry/resources": "1.22.0", + "@opentelemetry/sdk-trace-base": "1.22.0" }, "engines": { "node": ">=14" @@ -3023,16 +3032,16 @@ } }, "node_modules/@opentelemetry/exporter-trace-otlp-proto": { - "version": "0.48.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-proto/-/exporter-trace-otlp-proto-0.48.0.tgz", - "integrity": "sha512-hVXr/8DYlAKAzQYMsCf3ZsGweS6NTK3IHIEqmLokJZYcvJQBEEazeAdISfrL/utWnapg1Qnpw8u+W6SpxNzmTw==", + "version": "0.49.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-proto/-/exporter-trace-otlp-proto-0.49.1.tgz", + "integrity": "sha512-n8ON/c9pdMyYAfSFWKkgsPwjYoxnki+6Olzo+klKfW7KqLWoyEkryNkbcMIYnGGNXwdkMIrjoaP0VxXB26Oxcg==", "dependencies": { - "@opentelemetry/core": "1.21.0", - "@opentelemetry/otlp-exporter-base": "0.48.0", - "@opentelemetry/otlp-proto-exporter-base": "0.48.0", - "@opentelemetry/otlp-transformer": "0.48.0", - "@opentelemetry/resources": "1.21.0", - "@opentelemetry/sdk-trace-base": "1.21.0" + "@opentelemetry/core": "1.22.0", + "@opentelemetry/otlp-exporter-base": "0.49.1", + "@opentelemetry/otlp-proto-exporter-base": "0.49.1", + "@opentelemetry/otlp-transformer": "0.49.1", + "@opentelemetry/resources": "1.22.0", + "@opentelemetry/sdk-trace-base": "1.22.0" }, "engines": { "node": ">=14" @@ -3042,14 +3051,14 @@ } }, "node_modules/@opentelemetry/exporter-zipkin": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-zipkin/-/exporter-zipkin-1.21.0.tgz", - "integrity": "sha512-J0ejrOx52s1PqvjNalIHvY/4v9ZxR2r7XS7WZbwK3qpVYZlGVq5V1+iCNweqsKnb/miUt/4TFvJBc9f5Q/kGcA==", + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-zipkin/-/exporter-zipkin-1.22.0.tgz", + "integrity": "sha512-XcFs6rGvcTz0qW5uY7JZDYD0yNEXdekXAb6sFtnZgY/cHY6BQ09HMzOjv9SX+iaXplRDcHr1Gta7VQKM1XXM6g==", "dependencies": { - "@opentelemetry/core": "1.21.0", - "@opentelemetry/resources": "1.21.0", - "@opentelemetry/sdk-trace-base": "1.21.0", - "@opentelemetry/semantic-conventions": "1.21.0" + "@opentelemetry/core": "1.22.0", + "@opentelemetry/resources": "1.22.0", + "@opentelemetry/sdk-trace-base": "1.22.0", + "@opentelemetry/semantic-conventions": "1.22.0" }, "engines": { "node": ">=14" @@ -3074,10 +3083,11 @@ } }, "node_modules/@opentelemetry/instrumentation": { - "version": "0.48.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.48.0.tgz", - "integrity": "sha512-sjtZQB5PStIdCw5ovVTDGwnmQC+GGYArJNgIcydrDSqUTdYBnMrN9P4pwQZgS3vTGIp+TU1L8vMXGe51NVmIKQ==", + "version": "0.49.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.49.1.tgz", + "integrity": "sha512-0DLtWtaIppuNNRRllSD4bjU8ZIiLp1cDXvJEbp752/Zf+y3gaLNaoGRGIlX4UHhcsrmtL+P2qxi3Hodi8VuKiQ==", "dependencies": { + "@opentelemetry/api-logs": "0.49.1", "@types/shimmer": "^1.0.2", "import-in-the-middle": "1.7.1", "require-in-the-middle": "^7.1.1", @@ -3092,12 +3102,12 @@ } }, "node_modules/@opentelemetry/instrumentation-amqplib": { - "version": "0.34.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-amqplib/-/instrumentation-amqplib-0.34.0.tgz", - "integrity": "sha512-lVGRkyGnjFJv9O8oO/+uT40nrNj4UO+UN0k8708guy/toVgxsVpv4PtdWJTjbtu89UDk9gUxq62jpHxqrVaNnw==", + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-amqplib/-/instrumentation-amqplib-0.35.0.tgz", + "integrity": "sha512-rb3hIWA7f0HXpXpfElnGC6CukRxy58/OJ6XYlTzpZJtNJPao7BuobZjkQEscaRYhUzgi7X7R1aKkIUOTV5JFrg==", "dependencies": { "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/instrumentation": "^0.49.1", "@opentelemetry/semantic-conventions": "^1.0.0" }, "engines": { @@ -3108,11 +3118,11 @@ } }, "node_modules/@opentelemetry/instrumentation-aws-lambda": { - "version": "0.38.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-aws-lambda/-/instrumentation-aws-lambda-0.38.0.tgz", - "integrity": "sha512-MIPvM8S4LqGKE+IAnYVCRUnEjaWbPsbqL4p2BnGcox08e6+JQe+0d16DI0cKVSFZOzV5T/or3ewQ/bB0lPm8yg==", + "version": "0.39.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-aws-lambda/-/instrumentation-aws-lambda-0.39.0.tgz", + "integrity": "sha512-D+oG/hIBDdwCNq7Y6BEuddjcwDVD0C8NhBE7A85mRZ9RLG0bKoWrhIdVvbpqEoa0U5AWe9Y98RX4itNg7WTy4w==", "dependencies": { - "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/instrumentation": "^0.49.1", "@opentelemetry/propagator-aws-xray": "^1.3.1", "@opentelemetry/resources": "^1.8.0", "@opentelemetry/semantic-conventions": "^1.0.0", @@ -3126,13 +3136,13 @@ } }, "node_modules/@opentelemetry/instrumentation-aws-sdk": { - "version": "0.38.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-aws-sdk/-/instrumentation-aws-sdk-0.38.1.tgz", - "integrity": "sha512-/Tupb4UfVVkmcopq2H2nr2D/pHLF0riVw2biQQUJ/jGIkfrOgUMMKbShi2RQE4Zy8NFv3xaDn4/pNxzodLBy3w==", + "version": "0.39.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-aws-sdk/-/instrumentation-aws-sdk-0.39.1.tgz", + "integrity": "sha512-QnvIMVpzRYqQHSXydGUksbhBjPbMyHSUBwi6ocN7gEXoI711+tIY3R1cfRutl0u3M67A/fAvPI3IgACfJaFORg==", "dependencies": { "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.48.0", - "@opentelemetry/propagation-utils": "^0.30.6", + "@opentelemetry/instrumentation": "^0.49.1", + "@opentelemetry/propagation-utils": "^0.30.7", "@opentelemetry/semantic-conventions": "^1.0.0" }, "engines": { @@ -3143,12 +3153,12 @@ } }, "node_modules/@opentelemetry/instrumentation-bunyan": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-bunyan/-/instrumentation-bunyan-0.35.0.tgz", - "integrity": "sha512-bQ8OzV7nVTA+oGiTzLjUmRFAbnXi0U/Z4VJCpj+1DRsaAaMT17eRpAOh22LQR0JBnv2vBm8CvIQl4CcAnsB46g==", + "version": "0.36.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-bunyan/-/instrumentation-bunyan-0.36.0.tgz", + "integrity": "sha512-sHD5BSiqSrgWow7VmugEFzV8vGdsz5m+w1v9tK6YwRzuAD7vbo57chluq+UBzIqStoCH+0yOzRzSALH7hrfffg==", "dependencies": { - "@opentelemetry/api-logs": "^0.48.0", - "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/api-logs": "^0.49.1", + "@opentelemetry/instrumentation": "^0.49.1", "@types/bunyan": "1.8.9" }, "engines": { @@ -3159,11 +3169,11 @@ } }, "node_modules/@opentelemetry/instrumentation-cassandra-driver": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-cassandra-driver/-/instrumentation-cassandra-driver-0.35.0.tgz", - "integrity": "sha512-NlJkEiP37/WQvtSyYe4zxaBcaoweO/2+UtDssldk9NFmFutLHyMT/P5q5fe8i73ylmkPOAZnN8P48oHOhZHM1g==", + "version": "0.36.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-cassandra-driver/-/instrumentation-cassandra-driver-0.36.0.tgz", + "integrity": "sha512-gMfxzryOIP/mvSLXBJp/QxSr2NvS+cC1dkIXn+aSOzYoU1U3apeF3nAyuikmY9dRCQDV7wHPslqbi+pCmd4pAQ==", "dependencies": { - "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/instrumentation": "^0.49.1", "@opentelemetry/semantic-conventions": "^1.0.0" }, "engines": { @@ -3174,12 +3184,12 @@ } }, "node_modules/@opentelemetry/instrumentation-connect": { - "version": "0.33.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-connect/-/instrumentation-connect-0.33.0.tgz", - "integrity": "sha512-EAMmUC2/KfeZl4qNgUsiVqT5Jti0jDl4GHi4TpDg41VBEJkRX/0+JcPBWgdFUgEfeiZr0GPVQud4i8jAwJ+ORw==", + "version": "0.34.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-connect/-/instrumentation-connect-0.34.0.tgz", + "integrity": "sha512-PJO99nfyUp3JSoBMhwZsOQDm/XKfkb/QQ8YTsNX4ZJ28phoRcNLqe36mqIMp80DKmKAX4xkxCAyrSYtW8QqZxA==", "dependencies": { "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/instrumentation": "^0.49.1", "@opentelemetry/semantic-conventions": "^1.0.0", "@types/connect": "3.4.36" }, @@ -3191,11 +3201,11 @@ } }, "node_modules/@opentelemetry/instrumentation-cucumber": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-cucumber/-/instrumentation-cucumber-0.3.0.tgz", - "integrity": "sha512-nM9BL0t2Nxwbb41MXxNXTDL0zq7FXhOX9F3OiAqYUJHqb7BHyzV9KoQ+Ao1BjqJR91hUm1OFNgHAk3y8uiuq4w==", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-cucumber/-/instrumentation-cucumber-0.4.0.tgz", + "integrity": "sha512-n53QvozzgMS9imEclow2nBYJ/jtZlZqiKIqDUi2/g0nDi08F555JhDS03d/Z+4NJxbu7bDLAg12giCV9KZN/Jw==", "dependencies": { - "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/instrumentation": "^0.49.1", "@opentelemetry/semantic-conventions": "^1.0.0" }, "engines": { @@ -3206,11 +3216,11 @@ } }, "node_modules/@opentelemetry/instrumentation-dataloader": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-dataloader/-/instrumentation-dataloader-0.6.0.tgz", - "integrity": "sha512-jkPdn83WV/TcnhQ5bOIoYcJGvMxXyYlCzbqfuB6HsMqf3CqpdgBQYlMuKi6qIfD4QWYt2R992yglNxPLuJ7xeg==", + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-dataloader/-/instrumentation-dataloader-0.7.0.tgz", + "integrity": "sha512-sIaevxATJV5YaZzBTTcTaDEnI+/1vxYs+lVk1honnvrEAaP0FA9C/cFrQEN0kP2BDHkHRE/t6y5lGUqusi/h3A==", "dependencies": { - "@opentelemetry/instrumentation": "^0.48.0" + "@opentelemetry/instrumentation": "^0.49.1" }, "engines": { "node": ">=14" @@ -3220,11 +3230,11 @@ } }, "node_modules/@opentelemetry/instrumentation-dns": { - "version": "0.33.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-dns/-/instrumentation-dns-0.33.0.tgz", - "integrity": "sha512-QDJadJOQg9CLqMC79r4T5ugN4C4lb6eJYLmHgnLg3fh1JUGfyjQHtD3T7lH0P8251Mnt5m8zjDDbPKcqK2aGcw==", + "version": "0.34.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-dns/-/instrumentation-dns-0.34.0.tgz", + "integrity": "sha512-3tmXdvrzHQ7S3v82Cm36PTYLtgg2+hVm00K1xB3uzP08GEo9w/F8DW4me9z6rDroVGiLIg621RZ6dzjBcmmFCg==", "dependencies": { - "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/instrumentation": "^0.49.1", "@opentelemetry/semantic-conventions": "^1.0.0", "semver": "^7.5.4" }, @@ -3236,12 +3246,12 @@ } }, "node_modules/@opentelemetry/instrumentation-express": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-express/-/instrumentation-express-0.35.0.tgz", - "integrity": "sha512-ZmSB4WMd88sSecOL7DlghzdBl56/8ymb02n+xEJ/6zUgONuw/1uoTh1TAaNPKfEWdNLoLKXQm+Gd2zBrUVOX0w==", + "version": "0.36.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-express/-/instrumentation-express-0.36.1.tgz", + "integrity": "sha512-ltIE4kIMa+83QjW/p7oe7XCESF29w3FQ9/T1VgShdX7fzm56K2a0xfEX1vF8lnHRGERYxIWX9D086C6gJOjVGA==", "dependencies": { "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/instrumentation": "^0.49.1", "@opentelemetry/semantic-conventions": "^1.0.0" }, "engines": { @@ -3252,12 +3262,12 @@ } }, "node_modules/@opentelemetry/instrumentation-fastify": { - "version": "0.33.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-fastify/-/instrumentation-fastify-0.33.0.tgz", - "integrity": "sha512-sl3q9Mt+yM6GlZJKhfLUIRrVEYqfmI0hqYLha5OFG5rLrgnZCCZVy8ra4+Pa40ecH1409cvwwBPf7k9AHEQBTw==", + "version": "0.34.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-fastify/-/instrumentation-fastify-0.34.0.tgz", + "integrity": "sha512-2Qu66XBkfJ8tr6H+RHBTyw/EX73N9U7pvNa49aonDnT9/mK58k7AKOscpRnKXOvHqc2YIdEPRcBIWxhksPFZVA==", "dependencies": { "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/instrumentation": "^0.49.1", "@opentelemetry/semantic-conventions": "^1.0.0" }, "engines": { @@ -3268,12 +3278,12 @@ } }, "node_modules/@opentelemetry/instrumentation-fs": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-fs/-/instrumentation-fs-0.9.0.tgz", - "integrity": "sha512-Xp31lb2Sj50ppsJ393650HxSi5IJIgddXxrUeVljmsabdmECPUj0YAt/Wwb1oIHFn04iL9Tq4VkF/otlLaI9ww==", + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-fs/-/instrumentation-fs-0.10.0.tgz", + "integrity": "sha512-XtMoNINVsIQTQHjtxe7A0Lng96wxA5DSD5CYVVvpquG6HJRdZ4xNe9DTU03YtoEFqlN9qTfvGb/6ILzhKhiG8g==", "dependencies": { "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/instrumentation": "^0.49.1", "@opentelemetry/semantic-conventions": "^1.0.0" }, "engines": { @@ -3284,11 +3294,11 @@ } }, "node_modules/@opentelemetry/instrumentation-generic-pool": { - "version": "0.33.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-generic-pool/-/instrumentation-generic-pool-0.33.0.tgz", - "integrity": "sha512-QMSSOfIqMJhXqFryLVbAMsgRktNHdhMEpsOgEiHurLfvAJhyEOBcTTUuo6Laqt50IIzIm3YuHL9ZtEl9fve2ag==", + "version": "0.34.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-generic-pool/-/instrumentation-generic-pool-0.34.0.tgz", + "integrity": "sha512-jdI7tfVVwZJuTu4j2kAvJtx4wlEQKIXSZnZG4RdqRHc56KqQQDuVTBLvUgmDXvnSVclH9ayf4oaAV08R9fICtw==", "dependencies": { - "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/instrumentation": "^0.49.1", "@opentelemetry/semantic-conventions": "^1.0.0" }, "engines": { @@ -3299,11 +3309,11 @@ } }, "node_modules/@opentelemetry/instrumentation-graphql": { - "version": "0.37.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-graphql/-/instrumentation-graphql-0.37.0.tgz", - "integrity": "sha512-WL5Qn1aRudJDxVN0Ao73/yzXBGBJAH1Fd2tteuGXku/Qw9hYQ936CgoO66GWmSiq2lyjsojAk1t5f+HF9j3NXw==", + "version": "0.38.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-graphql/-/instrumentation-graphql-0.38.1.tgz", + "integrity": "sha512-mSt4ztn3EVlLtZJ+tDEqq5GUEYdY8cbTT9SeVJFmXSfdSQkPZn0ovo/dRe6dUcplM60gg4w+llw8SZuQN0iZfQ==", "dependencies": { - "@opentelemetry/instrumentation": "^0.48.0" + "@opentelemetry/instrumentation": "^0.49.1" }, "engines": { "node": ">=14" @@ -3313,12 +3323,12 @@ } }, "node_modules/@opentelemetry/instrumentation-grpc": { - "version": "0.48.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-grpc/-/instrumentation-grpc-0.48.0.tgz", - "integrity": "sha512-MmJHkbqaulqfECjotRtco9AXOq+D1HLq53wI7UFeE8bl8kISP9iMkt+A7PrtPFpRGCglwFvSa0djId6EWsP0DQ==", + "version": "0.49.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-grpc/-/instrumentation-grpc-0.49.1.tgz", + "integrity": "sha512-f8mQjFi5/PiP4SK3VDU1/3sUUgs6exMtBgcnNycgCKgN40htiPT+MuDRwdRnRMNI/4vNQ7p1/5r4Q5oN0GuRBw==", "dependencies": { - "@opentelemetry/instrumentation": "0.48.0", - "@opentelemetry/semantic-conventions": "1.21.0" + "@opentelemetry/instrumentation": "0.49.1", + "@opentelemetry/semantic-conventions": "1.22.0" }, "engines": { "node": ">=14" @@ -3328,12 +3338,12 @@ } }, "node_modules/@opentelemetry/instrumentation-hapi": { - "version": "0.34.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-hapi/-/instrumentation-hapi-0.34.0.tgz", - "integrity": "sha512-qUENVxwCYbRbJ8HBY54ZL1Z9q1guCEurW6tCFFJJKQFu/MKEw7GSFImy5DR2Mp8b5ggZO36lYFcx0QUxfy4GJg==", + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-hapi/-/instrumentation-hapi-0.35.0.tgz", + "integrity": "sha512-j7q99aTLHfjNKW94qJnEaDatgz+q2psTKs7lxZO4QHRnoDltDk39a44/+AkI1qBJNw5xyLjrApqkglfbWJ2abg==", "dependencies": { "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/instrumentation": "^0.49.1", "@opentelemetry/semantic-conventions": "^1.0.0", "@types/hapi__hapi": "20.0.13" }, @@ -3345,13 +3355,13 @@ } }, "node_modules/@opentelemetry/instrumentation-http": { - "version": "0.48.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-http/-/instrumentation-http-0.48.0.tgz", - "integrity": "sha512-uXqOsLhW9WC3ZlGm6+PSX0xjSDTCfy4CMjfYj6TPWusOO8dtdx040trOriF24y+sZmS3M+5UQc6/3/ZxBJh4Mw==", + "version": "0.49.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-http/-/instrumentation-http-0.49.1.tgz", + "integrity": "sha512-Yib5zrW2s0V8wTeUK/B3ZtpyP4ldgXj9L3Ws/axXrW1dW0/mEFKifK50MxMQK9g5NNJQS9dWH7rvcEGZdWdQDA==", "dependencies": { - "@opentelemetry/core": "1.21.0", - "@opentelemetry/instrumentation": "0.48.0", - "@opentelemetry/semantic-conventions": "1.21.0", + "@opentelemetry/core": "1.22.0", + "@opentelemetry/instrumentation": "0.49.1", + "@opentelemetry/semantic-conventions": "1.22.0", "semver": "^7.5.2" }, "engines": { @@ -3362,11 +3372,11 @@ } }, "node_modules/@opentelemetry/instrumentation-ioredis": { - "version": "0.37.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-ioredis/-/instrumentation-ioredis-0.37.0.tgz", - "integrity": "sha512-xBPfu03IIG8x1pmt1Dx+XrBO4ZB4UjEcrouGbp6eV3dLQ7eJPYZgfNXmsqkpsxgNQuVCi2a3WEAwZ5Wl2hk7Vw==", + "version": "0.38.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-ioredis/-/instrumentation-ioredis-0.38.0.tgz", + "integrity": "sha512-c9nQFhRjFAtpInTks7z5v9CiOCiR8U9GbIhIv0TLEJ/r0wqdKNLfLZzCrr9XQ9WasxeOmziLlPFhpRBAd9Q4oA==", "dependencies": { - "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/instrumentation": "^0.49.1", "@opentelemetry/redis-common": "^0.36.1", "@opentelemetry/semantic-conventions": "^1.0.0", "@types/ioredis4": "npm:@types/ioredis@^4.28.10" @@ -3379,11 +3389,11 @@ } }, "node_modules/@opentelemetry/instrumentation-knex": { - "version": "0.33.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-knex/-/instrumentation-knex-0.33.0.tgz", - "integrity": "sha512-7L3Q8Yy5vY4W4zpRrjKEc0OpVPYyERtDz5dAumKjkJsEVPANr7E8Cc+No6VjZGeN+HgFFwEo+jcQCTWJzdxvRw==", + "version": "0.34.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-knex/-/instrumentation-knex-0.34.0.tgz", + "integrity": "sha512-6kZOEvNJOylTQunU5zSSi4iTuCkwIL9nwFnZg7719p61u3d6Qj3X4xi9su46VE3M0dH7vEoxUW+nb/0ilm+aZg==", "dependencies": { - "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/instrumentation": "^0.49.1", "@opentelemetry/semantic-conventions": "^1.0.0" }, "engines": { @@ -3394,12 +3404,12 @@ } }, "node_modules/@opentelemetry/instrumentation-koa": { - "version": "0.37.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-koa/-/instrumentation-koa-0.37.0.tgz", - "integrity": "sha512-EfuGv1RJCSZh77dDc3PtvZXGwcsTufn9tU6T9VOTFcxovpyJ6w0og73eD0D02syR8R+kzv6rg1TeS8+lj7pyrQ==", + "version": "0.38.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-koa/-/instrumentation-koa-0.38.0.tgz", + "integrity": "sha512-lQujF4I3wdcrOF14miCV2pC72H+OJKb2LrrmTvTDAhELQDN/95v0doWgT9aHybUGkaAeB3QG4d09sved548TlA==", "dependencies": { "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/instrumentation": "^0.49.1", "@opentelemetry/semantic-conventions": "^1.0.0", "@types/koa": "2.14.0", "@types/koa__router": "12.0.3" @@ -3412,11 +3422,11 @@ } }, "node_modules/@opentelemetry/instrumentation-lru-memoizer": { - "version": "0.34.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-lru-memoizer/-/instrumentation-lru-memoizer-0.34.0.tgz", - "integrity": "sha512-m1kXrc11XNj7cC6sfcsYqd+kuCcN2wI9LXpB2l2BZCogqxHCgjuVoiXvT6K9LfO4tLefcvhoK0N8XuVJ8xyyOw==", + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-lru-memoizer/-/instrumentation-lru-memoizer-0.35.0.tgz", + "integrity": "sha512-wCXe+iCF7JweMgY3blLM2Y1G0GSwLEeSA61z/y1UwzvBLEEXt7vL6qOl2mkNcUL9ZbLDS+EABatBH+vFO6DV5Q==", "dependencies": { - "@opentelemetry/instrumentation": "^0.48.0" + "@opentelemetry/instrumentation": "^0.49.1" }, "engines": { "node": ">=14" @@ -3426,11 +3436,11 @@ } }, "node_modules/@opentelemetry/instrumentation-memcached": { - "version": "0.33.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-memcached/-/instrumentation-memcached-0.33.0.tgz", - "integrity": "sha512-TdGT5ytt8o7FTIsQvx010ykYbqu+IfGoOKA+IXLHdX1+l7vFWyv3ZOzQbRDmA4rxujJAAPf/n4/D7QECyedE/g==", + "version": "0.34.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-memcached/-/instrumentation-memcached-0.34.0.tgz", + "integrity": "sha512-RleFfaag3Evg4pTzHwDBwo1KiFgnCtiT4V6MQRRHadytNGdpcL+Ynz32ydDdiOXeadt7xpRI7HSvBy0quGTXSw==", "dependencies": { - "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/instrumentation": "^0.49.1", "@opentelemetry/semantic-conventions": "^1.0.0", "@types/memcached": "^2.2.6" }, @@ -3442,11 +3452,11 @@ } }, "node_modules/@opentelemetry/instrumentation-mongodb": { - "version": "0.39.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongodb/-/instrumentation-mongodb-0.39.0.tgz", - "integrity": "sha512-m9dMj39pcCshzlfCEn2lGrlNo7eV5fb9pGBnPyl/Am9Crh7Or8vOqvByCNd26Dgf5J978zTdLGF+6tM8j1WOew==", + "version": "0.40.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongodb/-/instrumentation-mongodb-0.40.0.tgz", + "integrity": "sha512-ldlJUW/1UlnGtIWBt7fIUl+7+TGOKxIU+0Js5ukpXfQc07ENYFeck5TdbFjvYtF8GppPErnsZJiFiRdYm6Pv/Q==", "dependencies": { - "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/instrumentation": "^0.49.1", "@opentelemetry/sdk-metrics": "^1.9.1", "@opentelemetry/semantic-conventions": "^1.0.0" }, @@ -3458,12 +3468,12 @@ } }, "node_modules/@opentelemetry/instrumentation-mongoose": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongoose/-/instrumentation-mongoose-0.35.0.tgz", - "integrity": "sha512-gReBMWD2Oa/wBGRWyg6B2dbPHhgkpOqDio31gE3DbC4JaqCsMByyeix75rZSzZ71RQmVh3d4jRLsqUtNVBzcyg==", + "version": "0.36.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongoose/-/instrumentation-mongoose-0.36.0.tgz", + "integrity": "sha512-UelQ8dLQRLTdck3tPJdZ17b+Hk9usLf1cY2ou5THAaZpulUdpg62Q9Hx2RHRU71Rp2/YMDk25og7GJhuWScfEA==", "dependencies": { "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/instrumentation": "^0.49.1", "@opentelemetry/semantic-conventions": "^1.0.0" }, "engines": { @@ -3474,11 +3484,11 @@ } }, "node_modules/@opentelemetry/instrumentation-mysql": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql/-/instrumentation-mysql-0.35.0.tgz", - "integrity": "sha512-QKRHd3aFA2vKOPzIZ9Q3UIxYeNPweB62HGlX2l3shOKrUhrtTg2/BzaKpHQBy2f2nO2mxTF/mOFeVEDeANnhig==", + "version": "0.36.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql/-/instrumentation-mysql-0.36.0.tgz", + "integrity": "sha512-2mt/032SLkiuddzMrq3YwM0bHksXRep69EzGRnBfF+bCbwYvKLpqmSFqJZ9T3yY/mBWj+tvdvc1+klXGrh2QnQ==", "dependencies": { - "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/instrumentation": "^0.49.1", "@opentelemetry/semantic-conventions": "^1.0.0", "@types/mysql": "2.15.22" }, @@ -3490,11 +3500,11 @@ } }, "node_modules/@opentelemetry/instrumentation-mysql2": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql2/-/instrumentation-mysql2-0.35.0.tgz", - "integrity": "sha512-DI9NXYJBbQ72rjz1KCKerQFQE+Z4xRDoyYek6JpITv5BlhPboA8zKkltxyQLL06Y2RTFYslw1gvg+x9CWlRzJw==", + "version": "0.36.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql2/-/instrumentation-mysql2-0.36.0.tgz", + "integrity": "sha512-F63lKcl/R+if2j5Vz66c2/SLXQEtLlFkWTmYb8NQSgmcCaEKjML4RRRjZISIT4IBwdpanJ2qmNuXVM6MYqhBXw==", "dependencies": { - "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/instrumentation": "^0.49.1", "@opentelemetry/semantic-conventions": "^1.0.0", "@opentelemetry/sql-common": "^0.40.0" }, @@ -3506,11 +3516,11 @@ } }, "node_modules/@opentelemetry/instrumentation-nestjs-core": { - "version": "0.34.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-nestjs-core/-/instrumentation-nestjs-core-0.34.0.tgz", - "integrity": "sha512-HvbcCVAMZEIFrJ0Si9AfjxOr14KcH5h/lq5zLQ8AjZJpW0WaeO/ox5UgFi3J73Br91WbZHRgbXxMeodNycJJuA==", + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-nestjs-core/-/instrumentation-nestjs-core-0.35.0.tgz", + "integrity": "sha512-INKA7CIOteTSRVxP7SQaFby11AYU3uezI93xDaDRGY4TloXNVoyw5n6UmcVJU4yDn6xY2r7zZ2SVHvblUc21/g==", "dependencies": { - "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/instrumentation": "^0.49.1", "@opentelemetry/semantic-conventions": "^1.0.0" }, "engines": { @@ -3521,11 +3531,11 @@ } }, "node_modules/@opentelemetry/instrumentation-net": { - "version": "0.33.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-net/-/instrumentation-net-0.33.0.tgz", - "integrity": "sha512-x6awrqF0YfEhGGNE2JtEWvB+zEls7mFvLDii54DnWxpQU69+AqKCW/ZwC91EDefOMGSYBckL0uEn6XNOgkTTbw==", + "version": "0.34.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-net/-/instrumentation-net-0.34.0.tgz", + "integrity": "sha512-gjybNOQQqbXmD1qVHNO2qBJI4V6p3QQ7xKg3pnC/x7wRdxn+siLQj7QIVxW85C3mymngoJJdRs6BwI3qPUfsPQ==", "dependencies": { - "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/instrumentation": "^0.49.1", "@opentelemetry/semantic-conventions": "^1.0.0" }, "engines": { @@ -3536,11 +3546,11 @@ } }, "node_modules/@opentelemetry/instrumentation-pg": { - "version": "0.38.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pg/-/instrumentation-pg-0.38.0.tgz", - "integrity": "sha512-Q7V/OJ1OZwaWYNOP/E9S6sfS03Z+PNU1SAjdAoXTj5j4u4iJSMSieLRWXFaHwsbefIOMkYvA00EBKF9IgbgbLA==", + "version": "0.39.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pg/-/instrumentation-pg-0.39.1.tgz", + "integrity": "sha512-pX5ujDOyGpPcrZlzaD3LJzmyaSMMMKAP+ffTHJp9vasvZJr+LifCk53TMPVUafcXKV/xX/IIkvADO+67M1Z25g==", "dependencies": { - "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/instrumentation": "^0.49.1", "@opentelemetry/semantic-conventions": "^1.0.0", "@opentelemetry/sql-common": "^0.40.0", "@types/pg": "8.6.1", @@ -3564,11 +3574,11 @@ } }, "node_modules/@opentelemetry/instrumentation-pino": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pino/-/instrumentation-pino-0.35.0.tgz", - "integrity": "sha512-gMfJ5Qy793mbaAGnQE3yp1Cb0y4np74rBPu20Oy/v8TTgPQOEV5PyNI0GNGggmZQIJSkdtYa8Ndb3huH3iZE5g==", + "version": "0.36.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pino/-/instrumentation-pino-0.36.0.tgz", + "integrity": "sha512-oEz+BJEYRBMAUu7MVJFJhhlsBuwLaUGjbJciKZRIeGX+fUtgcbQGV+a2Ris9jR3yFzWZrYg0aNBSCbGqvPCtMQ==", "dependencies": { - "@opentelemetry/instrumentation": "^0.48.0" + "@opentelemetry/instrumentation": "^0.49.1" }, "engines": { "node": ">=14" @@ -3578,11 +3588,11 @@ } }, "node_modules/@opentelemetry/instrumentation-redis": { - "version": "0.36.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-redis/-/instrumentation-redis-0.36.0.tgz", - "integrity": "sha512-rKFylIacEBwLxKFrPvxpVi8hHY9qXfQSybYnYNyF/VxUWMGYDPMpbCnTQkiVR5u+tIhwSvhSDG2YQEq6syHUIQ==", + "version": "0.37.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-redis/-/instrumentation-redis-0.37.0.tgz", + "integrity": "sha512-9G0T74kheu37k+UvyBnAcieB5iowxska3z2rhUcSTL8Cl0y/CvMn7sZ7txkUbXt0rdX6qeEUdMLmbsY2fPUM7Q==", "dependencies": { - "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/instrumentation": "^0.49.1", "@opentelemetry/redis-common": "^0.36.1", "@opentelemetry/semantic-conventions": "^1.0.0" }, @@ -3594,11 +3604,11 @@ } }, "node_modules/@opentelemetry/instrumentation-redis-4": { - "version": "0.36.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-redis-4/-/instrumentation-redis-4-0.36.0.tgz", - "integrity": "sha512-XO0EV2TxUsaRdcp79blyLGG5JWWl7NWVd/XNbU8vY7CuYUfRhWiTXYoM4PI+lwkAnUPvPtyiOzYs9px23GnibA==", + "version": "0.37.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-redis-4/-/instrumentation-redis-4-0.37.0.tgz", + "integrity": "sha512-WNO+HALvPPvjbh7UEEIuay0Z0d2mIfSCkBZbPRwZttDGX6LYGc2WnRgJh3TnYqjp7/y9IryWIbajAFIebj1OBA==", "dependencies": { - "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/instrumentation": "^0.49.1", "@opentelemetry/redis-common": "^0.36.1", "@opentelemetry/semantic-conventions": "^1.0.0" }, @@ -3610,12 +3620,12 @@ } }, "node_modules/@opentelemetry/instrumentation-restify": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-restify/-/instrumentation-restify-0.35.0.tgz", - "integrity": "sha512-0ghtxsGJxHEwJfIzxDN3FCbNiTXqwv2jV6ip716jyjWN3f6MuRHm7NPWI/KNvu+IjqDj16KRGZG7nUAEB1ojog==", + "version": "0.36.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-restify/-/instrumentation-restify-0.36.0.tgz", + "integrity": "sha512-QbOh8HpnnRn4xxFXX77Gdww6M78yx7dRiIKR6+H3j5LH5u6sYckTXw3TGPSsXsaM4DQHy0fOw15sAcJoWkC+aQ==", "dependencies": { "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/instrumentation": "^0.49.1", "@opentelemetry/semantic-conventions": "^1.0.0" }, "engines": { @@ -3626,11 +3636,11 @@ } }, "node_modules/@opentelemetry/instrumentation-router": { - "version": "0.34.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-router/-/instrumentation-router-0.34.0.tgz", - "integrity": "sha512-7LsonkdnQi35eF7CWl8394QDgyd811gCawJ6QuS8GbWNIvZ3S2f9j+Zy0fWSmFgO28ruW1pUG51ql8xdXWa8TA==", + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-router/-/instrumentation-router-0.35.0.tgz", + "integrity": "sha512-MdxGJuNTIy/2qDI8yow6cRBQ87m6O//VuHIlawe8v0x1NsTOSwS72xm+BzTuY9D0iMqiJUiTlE3dBs8DA91MTw==", "dependencies": { - "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/instrumentation": "^0.49.1", "@opentelemetry/semantic-conventions": "^1.0.0" }, "engines": { @@ -3641,11 +3651,11 @@ } }, "node_modules/@opentelemetry/instrumentation-socket.io": { - "version": "0.36.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-socket.io/-/instrumentation-socket.io-0.36.0.tgz", - "integrity": "sha512-c9Zc6WKxTZtMaOj01kmJGLKabEj805YgTav4l9vgojHrf6MH1fTlw+SGvOKhfPfzmu2QhNORAfqPAB1poDwqEQ==", + "version": "0.37.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-socket.io/-/instrumentation-socket.io-0.37.0.tgz", + "integrity": "sha512-aIztxmx/yis/goEndnoITrZvDDr1GdCtlsWo9ex7MhUIjqq5nJbTuyigf3GmU86XFFhSThxfQuJ9DpJyPxfBfA==", "dependencies": { - "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/instrumentation": "^0.49.1", "@opentelemetry/semantic-conventions": "^1.0.0" }, "engines": { @@ -3656,11 +3666,11 @@ } }, "node_modules/@opentelemetry/instrumentation-tedious": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-tedious/-/instrumentation-tedious-0.7.0.tgz", - "integrity": "sha512-o/5my8ZOuxACPSzMaXdPnQiMpmOPIJoTj+DRcs4vEJxk+KwlVNucoafSMpWQEyTNNuq2JI87Ru6Di2mp5T20EQ==", + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-tedious/-/instrumentation-tedious-0.8.0.tgz", + "integrity": "sha512-BBRW8+Qm2PLNkVMynr3Q7L4xCAOCOs0J9BJIJ8ZGoatW42b2H4qhMhq35jfPDvEL5u5azxHDapmUVYrDJDjAfA==", "dependencies": { - "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/instrumentation": "^0.49.1", "@opentelemetry/semantic-conventions": "^1.0.0", "@types/tedious": "^4.0.10" }, @@ -3672,11 +3682,11 @@ } }, "node_modules/@opentelemetry/instrumentation-winston": { - "version": "0.34.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-winston/-/instrumentation-winston-0.34.0.tgz", - "integrity": "sha512-Ejssv6Uih7ipoNGYQLXd+cKZdEfTfTJ/vzpUSeYiJZ36mVYER1f8fs9Kb7jTKjHD55g2s6cUJj9lifbDFI4EEw==", + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-winston/-/instrumentation-winston-0.35.0.tgz", + "integrity": "sha512-ymcuA3S2flnLmH1GS0105H91iDLap8cizOCaLMCp7Xz7r4L+wFf1zfix9M+iSkxcPFshHRt8LFA/ELXw51nk0g==", "dependencies": { - "@opentelemetry/instrumentation": "^0.48.0" + "@opentelemetry/instrumentation": "^0.49.1" }, "engines": { "node": ">=14" @@ -3686,11 +3696,11 @@ } }, "node_modules/@opentelemetry/otlp-exporter-base": { - "version": "0.48.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.48.0.tgz", - "integrity": "sha512-T4LJND+Ugl87GUONoyoQzuV9qCn4BFIPOnCH1biYqdGhc2JahjuLqVD9aefwLzGBW638iLAo88Lh68h2F1FLiA==", + "version": "0.49.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.49.1.tgz", + "integrity": "sha512-z6sHliPqDgJU45kQatAettY9/eVF58qVPaTuejw9YWfSRqid9pXPYeegDCSdyS47KAUgAtm+nC28K3pfF27HWg==", "dependencies": { - "@opentelemetry/core": "1.21.0" + "@opentelemetry/core": "1.22.0" }, "engines": { "node": ">=14" @@ -3700,13 +3710,13 @@ } }, "node_modules/@opentelemetry/otlp-grpc-exporter-base": { - "version": "0.48.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-grpc-exporter-base/-/otlp-grpc-exporter-base-0.48.0.tgz", - "integrity": "sha512-Vdp56RK9OU+Oeoy3YQC/UMOWglKQ9qvgGr49FgF4r8vk5DlcTUgVS0m3KG8pykmRPA+5ZKaDuqwPw5aTvWmHFw==", + "version": "0.49.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-grpc-exporter-base/-/otlp-grpc-exporter-base-0.49.1.tgz", + "integrity": "sha512-DNDNUWmOqtKTFJAyOyHHKotVox0NQ/09ETX8fUOeEtyNVHoGekAVtBbvIA3AtK+JflP7LC0PTjlLfruPM3Wy6w==", "dependencies": { "@grpc/grpc-js": "^1.7.1", - "@opentelemetry/core": "1.21.0", - "@opentelemetry/otlp-exporter-base": "0.48.0", + "@opentelemetry/core": "1.22.0", + "@opentelemetry/otlp-exporter-base": "0.49.1", "protobufjs": "^7.2.3" }, "engines": { @@ -3717,12 +3727,12 @@ } }, "node_modules/@opentelemetry/otlp-proto-exporter-base": { - "version": "0.48.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-proto-exporter-base/-/otlp-proto-exporter-base-0.48.0.tgz", - "integrity": "sha512-14GSTvPZPfrWsB54fYMGb8v+Uge5xGXyz0r2rf4SzcRnO2hXCPHEuL3yyL50emaKPAY+fj29Dm0bweawe8UA6A==", + "version": "0.49.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-proto-exporter-base/-/otlp-proto-exporter-base-0.49.1.tgz", + "integrity": "sha512-x1qB4EUC7KikUl2iNuxCkV8yRzrSXSyj4itfpIO674H7dhI7Zv37SFaOJTDN+8Z/F50gF2ISFH9CWQ4KCtGm2A==", "dependencies": { - "@opentelemetry/core": "1.21.0", - "@opentelemetry/otlp-exporter-base": "0.48.0", + "@opentelemetry/core": "1.22.0", + "@opentelemetry/otlp-exporter-base": "0.49.1", "protobufjs": "^7.2.3" }, "engines": { @@ -3733,28 +3743,28 @@ } }, "node_modules/@opentelemetry/otlp-transformer": { - "version": "0.48.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.48.0.tgz", - "integrity": "sha512-yuoS4cUumaTK/hhxW3JUy3wl2U4keMo01cFDrUOmjloAdSSXvv1zyQ920IIH4lymp5Xd21Dj2/jq2LOro56TJg==", + "version": "0.49.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.49.1.tgz", + "integrity": "sha512-Z+koA4wp9L9e3jkFacyXTGphSWTbOKjwwXMpb0CxNb0kjTHGUxhYRN8GnkLFsFo5NbZPjP07hwAqeEG/uCratQ==", "dependencies": { - "@opentelemetry/api-logs": "0.48.0", - "@opentelemetry/core": "1.21.0", - "@opentelemetry/resources": "1.21.0", - "@opentelemetry/sdk-logs": "0.48.0", - "@opentelemetry/sdk-metrics": "1.21.0", - "@opentelemetry/sdk-trace-base": "1.21.0" + "@opentelemetry/api-logs": "0.49.1", + "@opentelemetry/core": "1.22.0", + "@opentelemetry/resources": "1.22.0", + "@opentelemetry/sdk-logs": "0.49.1", + "@opentelemetry/sdk-metrics": "1.22.0", + "@opentelemetry/sdk-trace-base": "1.22.0" }, "engines": { "node": ">=14" }, "peerDependencies": { - "@opentelemetry/api": ">=1.3.0 <1.8.0" + "@opentelemetry/api": ">=1.3.0 <1.9.0" } }, "node_modules/@opentelemetry/propagation-utils": { - "version": "0.30.6", - "resolved": "https://registry.npmjs.org/@opentelemetry/propagation-utils/-/propagation-utils-0.30.6.tgz", - "integrity": "sha512-qvnYee5I/xrBY5XClUlOASIOdoTbnFGNI6+ViKqdoErF2xKmhysXcmxlJNzQFNDK0muTfjvJMZcFyEielARk7g==", + "version": "0.30.7", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagation-utils/-/propagation-utils-0.30.7.tgz", + "integrity": "sha512-QkxOkuCQdq8YgJstEMF4ntSyr0ivCrcQc49uvO2pyccrniu2DwA+JD071aM4BXfNVSCeOuhIyW/3QPiZYl4zdA==", "engines": { "node": ">=14" }, @@ -3777,31 +3787,31 @@ } }, "node_modules/@opentelemetry/propagator-b3": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-b3/-/propagator-b3-1.21.0.tgz", - "integrity": "sha512-3ZTobj2VDIOzLsIvvYCdpw6tunxUVElPxDvog9lS49YX4hohHeD84A8u9Ns/6UYUcaN5GSoEf891lzhcBFiOLA==", + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-b3/-/propagator-b3-1.22.0.tgz", + "integrity": "sha512-qBItJm9ygg/jCB5rmivyGz1qmKZPsL/sX715JqPMFgq++Idm0x+N9sLQvWFHFt2+ZINnCSojw7FVBgFW6izcXA==", "dependencies": { - "@opentelemetry/core": "1.21.0" + "@opentelemetry/core": "1.22.0" }, "engines": { "node": ">=14" }, "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.8.0" + "@opentelemetry/api": ">=1.0.0 <1.9.0" } }, "node_modules/@opentelemetry/propagator-jaeger": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-jaeger/-/propagator-jaeger-1.21.0.tgz", - "integrity": "sha512-8TQSwXjBmaDx7JkxRD7hdmBmRK2RGRgzHX1ArJfJhIc5trzlVweyorzqQrXOvqVEdEg+zxUMHkL5qbGH/HDTPA==", + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-jaeger/-/propagator-jaeger-1.22.0.tgz", + "integrity": "sha512-pMLgst3QIwrUfepraH5WG7xfpJ8J3CrPKrtINK0t7kBkuu96rn+HDYQ8kt3+0FXvrZI8YJE77MCQwnJWXIrgpA==", "dependencies": { - "@opentelemetry/core": "1.21.0" + "@opentelemetry/core": "1.22.0" }, "engines": { "node": ">=14" }, "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.8.0" + "@opentelemetry/api": ">=1.0.0 <1.9.0" } }, "node_modules/@opentelemetry/redis-common": { @@ -3813,9 +3823,9 @@ } }, "node_modules/@opentelemetry/resource-detector-alibaba-cloud": { - "version": "0.28.6", - "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-alibaba-cloud/-/resource-detector-alibaba-cloud-0.28.6.tgz", - "integrity": "sha512-VuJXc+oDQ/SYRHBCQbEshl0WJtEMvgfSkTDBq+WSxj6y9sKe0HCt55Sxeb5nLmBdtCYWMQFniHe2K4GLSjDZVw==", + "version": "0.28.7", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-alibaba-cloud/-/resource-detector-alibaba-cloud-0.28.7.tgz", + "integrity": "sha512-7o/waBJ08JrKED4blHGyBPIN1HMM1KEvhbO1HmdA+tsUqsGwZdTjsdMKFW7hc1TvAu4AQEnuvMy/Q5OByVr95A==", "dependencies": { "@opentelemetry/resources": "^1.0.0", "@opentelemetry/semantic-conventions": "^1.0.0" @@ -3828,9 +3838,9 @@ } }, "node_modules/@opentelemetry/resource-detector-aws": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-aws/-/resource-detector-aws-1.3.6.tgz", - "integrity": "sha512-hFJ19yFwChqGCv1uMkXtjZU9BG8GcChe8cRCAkGWg1RZADse5S2ausf3D8pYw1cR3ktJtuAmRrGZniT6TDUPDw==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-aws/-/resource-detector-aws-1.4.0.tgz", + "integrity": "sha512-Cn8eQ/heLqrNrPuHGG7xUkk//VQt4hzVIPurmLlCI0wrDV6HR+yykBvRkJBuSdLzbjeQ/qNbGel9OvTmA6PBQA==", "dependencies": { "@opentelemetry/core": "^1.0.0", "@opentelemetry/resources": "^1.0.0", @@ -3844,9 +3854,9 @@ } }, "node_modules/@opentelemetry/resource-detector-container": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-container/-/resource-detector-container-0.3.6.tgz", - "integrity": "sha512-psxtzQakVuZKFl/ukn+nPW4Ixn+KPHGsWJMYKndmXrsgdFri78X+MHR0wLOO41Zn79sc35DiSk+GdJ24cCylbg==", + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-container/-/resource-detector-container-0.3.7.tgz", + "integrity": "sha512-AYqwffGVuGLuzzVOQMLNHTztwyvsep9noxN9HTQ/grwmJSWZ6851kNx+W735K7v6GZEDmXeLpBn+J3TeqKQUJA==", "dependencies": { "@opentelemetry/resources": "^1.0.0", "@opentelemetry/semantic-conventions": "^1.0.0" @@ -3859,9 +3869,9 @@ } }, "node_modules/@opentelemetry/resource-detector-gcp": { - "version": "0.29.6", - "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-gcp/-/resource-detector-gcp-0.29.6.tgz", - "integrity": "sha512-cx03fXPknmiVW0hpWAJr0Nr8xwkwRB8VNWPvNrmP7UzJ8eEztY9lHnVke4ZVFaVGvm/4EFxk2y5hPNggbIezoA==", + "version": "0.29.7", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-gcp/-/resource-detector-gcp-0.29.7.tgz", + "integrity": "sha512-uUHKfoOgBCZCEPCU6FWnRrbYuz1miaeIfos0Xe38YuR06vQvddhqZ0tewYunJpfECfKEcjSjY0eDe2QIRLMkXw==", "dependencies": { "@opentelemetry/core": "^1.0.0", "@opentelemetry/resources": "^1.0.0", @@ -3876,117 +3886,117 @@ } }, "node_modules/@opentelemetry/resources": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.21.0.tgz", - "integrity": "sha512-1Z86FUxPKL6zWVy2LdhueEGl9AHDJcx+bvHStxomruz6Whd02mE3lNUMjVJ+FGRoktx/xYQcxccYb03DiUP6Yw==", + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.22.0.tgz", + "integrity": "sha512-+vNeIFPH2hfcNL0AJk/ykJXoUCtR1YaDUZM+p3wZNU4Hq98gzq+7b43xbkXjadD9VhWIUQqEwXyY64q6msPj6A==", "dependencies": { - "@opentelemetry/core": "1.21.0", - "@opentelemetry/semantic-conventions": "1.21.0" + "@opentelemetry/core": "1.22.0", + "@opentelemetry/semantic-conventions": "1.22.0" }, "engines": { "node": ">=14" }, "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.8.0" + "@opentelemetry/api": ">=1.0.0 <1.9.0" } }, "node_modules/@opentelemetry/sdk-logs": { - "version": "0.48.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.48.0.tgz", - "integrity": "sha512-lRcA5/qkSJuSh4ItWCddhdn/nNbVvnzM+cm9Fg1xpZUeTeozjJDBcHnmeKoOaWRnrGYBdz6UTY6bynZR9aBeAA==", + "version": "0.49.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.49.1.tgz", + "integrity": "sha512-gCzYWsJE0h+3cuh3/cK+9UwlVFyHvj3PReIOCDOmdeXOp90ZjKRoDOJBc3mvk1LL6wyl1RWIivR8Rg9OToyesw==", "dependencies": { - "@opentelemetry/core": "1.21.0", - "@opentelemetry/resources": "1.21.0" + "@opentelemetry/core": "1.22.0", + "@opentelemetry/resources": "1.22.0" }, "engines": { "node": ">=14" }, "peerDependencies": { - "@opentelemetry/api": ">=1.4.0 <1.8.0", + "@opentelemetry/api": ">=1.4.0 <1.9.0", "@opentelemetry/api-logs": ">=0.39.1" } }, "node_modules/@opentelemetry/sdk-metrics": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-1.21.0.tgz", - "integrity": "sha512-on1jTzIHc5DyWhRP+xpf+zrgrREXcHBH4EDAfaB5mIG7TWpKxNXooQ1JCylaPsswZUv4wGnVTinr4HrBdGARAQ==", + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-1.22.0.tgz", + "integrity": "sha512-k6iIx6H3TZ+BVMr2z8M16ri2OxWaljg5h8ihGJxi/KQWcjign6FEaEzuigXt5bK9wVEhqAcWLCfarSftaNWkkg==", "dependencies": { - "@opentelemetry/core": "1.21.0", - "@opentelemetry/resources": "1.21.0", + "@opentelemetry/core": "1.22.0", + "@opentelemetry/resources": "1.22.0", "lodash.merge": "^4.6.2" }, "engines": { "node": ">=14" }, "peerDependencies": { - "@opentelemetry/api": ">=1.3.0 <1.8.0" + "@opentelemetry/api": ">=1.3.0 <1.9.0" } }, "node_modules/@opentelemetry/sdk-node": { - "version": "0.48.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-node/-/sdk-node-0.48.0.tgz", - "integrity": "sha512-3o3GS6t+VLGVFCV5bqfGOcWIgOdkR/UE6Qz7hHksP5PXrVBeYsPqts7cPma5YXweaI3r3h26mydg9PqQIcqksg==", + "version": "0.49.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-node/-/sdk-node-0.49.1.tgz", + "integrity": "sha512-feBIT85ndiSHXsQ2gfGpXC/sNeX4GCHLksC4A9s/bfpUbbgbCSl0RvzZlmEpCHarNrkZMwFRi4H0xFfgvJEjrg==", "dependencies": { - "@opentelemetry/api-logs": "0.48.0", - "@opentelemetry/core": "1.21.0", - "@opentelemetry/exporter-trace-otlp-grpc": "0.48.0", - "@opentelemetry/exporter-trace-otlp-http": "0.48.0", - "@opentelemetry/exporter-trace-otlp-proto": "0.48.0", - "@opentelemetry/exporter-zipkin": "1.21.0", - "@opentelemetry/instrumentation": "0.48.0", - "@opentelemetry/resources": "1.21.0", - "@opentelemetry/sdk-logs": "0.48.0", - "@opentelemetry/sdk-metrics": "1.21.0", - "@opentelemetry/sdk-trace-base": "1.21.0", - "@opentelemetry/sdk-trace-node": "1.21.0", - "@opentelemetry/semantic-conventions": "1.21.0" + "@opentelemetry/api-logs": "0.49.1", + "@opentelemetry/core": "1.22.0", + "@opentelemetry/exporter-trace-otlp-grpc": "0.49.1", + "@opentelemetry/exporter-trace-otlp-http": "0.49.1", + "@opentelemetry/exporter-trace-otlp-proto": "0.49.1", + "@opentelemetry/exporter-zipkin": "1.22.0", + "@opentelemetry/instrumentation": "0.49.1", + "@opentelemetry/resources": "1.22.0", + "@opentelemetry/sdk-logs": "0.49.1", + "@opentelemetry/sdk-metrics": "1.22.0", + "@opentelemetry/sdk-trace-base": "1.22.0", + "@opentelemetry/sdk-trace-node": "1.22.0", + "@opentelemetry/semantic-conventions": "1.22.0" }, "engines": { "node": ">=14" }, "peerDependencies": { - "@opentelemetry/api": ">=1.3.0 <1.8.0" + "@opentelemetry/api": ">=1.3.0 <1.9.0" } }, "node_modules/@opentelemetry/sdk-trace-base": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.21.0.tgz", - "integrity": "sha512-yrElGX5Fv0umzp8Nxpta/XqU71+jCAyaLk34GmBzNcrW43nqbrqvdPs4gj4MVy/HcTjr6hifCDCYA3rMkajxxA==", + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.22.0.tgz", + "integrity": "sha512-pfTuSIpCKONC6vkTpv6VmACxD+P1woZf4q0K46nSUvXFvOFqjBYKFaAMkKD3M1mlKUUh0Oajwj35qNjMl80m1Q==", "dependencies": { - "@opentelemetry/core": "1.21.0", - "@opentelemetry/resources": "1.21.0", - "@opentelemetry/semantic-conventions": "1.21.0" + "@opentelemetry/core": "1.22.0", + "@opentelemetry/resources": "1.22.0", + "@opentelemetry/semantic-conventions": "1.22.0" }, "engines": { "node": ">=14" }, "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.8.0" + "@opentelemetry/api": ">=1.0.0 <1.9.0" } }, "node_modules/@opentelemetry/sdk-trace-node": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-node/-/sdk-trace-node-1.21.0.tgz", - "integrity": "sha512-1pdm8jnqs+LuJ0Bvx6sNL28EhC8Rv7NYV8rnoXq3GIQo7uOHBDAFSj7makAfbakrla7ecO1FRfI8emnR4WvhYA==", + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-node/-/sdk-trace-node-1.22.0.tgz", + "integrity": "sha512-gTGquNz7ue8uMeiWPwp3CU321OstQ84r7PCDtOaCicjbJxzvO8RZMlEC4geOipTeiF88kss5n6w+//A0MhP1lQ==", "dependencies": { - "@opentelemetry/context-async-hooks": "1.21.0", - "@opentelemetry/core": "1.21.0", - "@opentelemetry/propagator-b3": "1.21.0", - "@opentelemetry/propagator-jaeger": "1.21.0", - "@opentelemetry/sdk-trace-base": "1.21.0", + "@opentelemetry/context-async-hooks": "1.22.0", + "@opentelemetry/core": "1.22.0", + "@opentelemetry/propagator-b3": "1.22.0", + "@opentelemetry/propagator-jaeger": "1.22.0", + "@opentelemetry/sdk-trace-base": "1.22.0", "semver": "^7.5.2" }, "engines": { "node": ">=14" }, "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.8.0" + "@opentelemetry/api": ">=1.0.0 <1.9.0" } }, "node_modules/@opentelemetry/semantic-conventions": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.21.0.tgz", - "integrity": "sha512-lkC8kZYntxVKr7b8xmjCVUgE0a8xgDakPyDo9uSWavXPyYqLgYYGdEd2j8NxihRyb6UwpX3G/hFUF4/9q2V+/g==", + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.22.0.tgz", + "integrity": "sha512-CAOgFOKLybd02uj/GhCdEeeBjOS0yeoDeo/CA7ASBSmenpZHAKGB3iDm/rv3BQLcabb/OprDEsSQ1y0P8A7Siw==", "engines": { "node": ">=14" } @@ -15236,12 +15246,12 @@ } }, "@grpc/grpc-js": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.10.1.tgz", - "integrity": "sha512-55ONqFytZExfOIjF1RjXPcVmT/jJqFzbbDqxK9jmRV4nxiYWtL9hENSW1Jfx0SdZfrvoqd44YJ/GJTqfRrawSQ==", + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.10.2.tgz", + "integrity": "sha512-lSbgu8iayAod8O0YcoXK3+bMFGThY2svtN35Zlm9VepsB3jfyIcoupKknEht7Kh9Q8ITjsp0J4KpYo9l4+FhNg==", "requires": { - "@grpc/proto-loader": "^0.7.8", - "@types/node": ">=12.12.47" + "@grpc/proto-loader": "^0.7.10", + "@js-sdsl/ordered-map": "^4.4.2" } }, "@grpc/proto-loader": { @@ -15969,6 +15979,11 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "@js-sdsl/ordered-map": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz", + "integrity": "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==" + }, "@ljharb/through": { "version": "2.3.12", "resolved": "https://registry.npmjs.org/@ljharb/through/-/through-2.3.12.tgz", @@ -16317,135 +16332,135 @@ "integrity": "sha512-AdY5wvN0P2vXBi3b29hxZgSFvdhdxPB9+f0B6s//P9Q8nibRWeA3cHm8UmLpio9ABigkVHJ5NMPk+Mz8VCCyrw==" }, "@opentelemetry/api-logs": { - "version": "0.48.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.48.0.tgz", - "integrity": "sha512-1/aMiU4Eqo3Zzpfwu51uXssp5pzvHFObk8S9pKAiXb1ne8pvg1qxBQitYL1XUiAMEXFzgjaidYG2V6624DRhhw==", + "version": "0.49.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.49.1.tgz", + "integrity": "sha512-kaNl/T7WzyMUQHQlVq7q0oV4Kev6+0xFwqzofryC66jgGMacd0QH5TwfpbUwSTby+SdAdprAe5UKMvBw4tKS5Q==", "requires": { "@opentelemetry/api": "^1.0.0" } }, "@opentelemetry/auto-instrumentations-node": { - "version": "0.41.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/auto-instrumentations-node/-/auto-instrumentations-node-0.41.1.tgz", - "integrity": "sha512-gQG0mHlPVBQveuemqNYkrL4IB3T6v2e5sMiDI6FQzFWeLzzFrC04R4fY6AE1YmkhOyteCDpHL/U6CULP2mkt8w==", + "version": "0.42.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/auto-instrumentations-node/-/auto-instrumentations-node-0.42.0.tgz", + "integrity": "sha512-fxcB7My5QTVfX6kBH4r5OFduGSxdpROgyIu7CqClp1psFHfVaBMQd4lbK2u+39K5kbjzJT2OaUP8yQuAvKJqBg==", "requires": { - "@opentelemetry/instrumentation": "^0.48.0", - "@opentelemetry/instrumentation-amqplib": "^0.34.0", - "@opentelemetry/instrumentation-aws-lambda": "^0.38.0", - "@opentelemetry/instrumentation-aws-sdk": "^0.38.1", - "@opentelemetry/instrumentation-bunyan": "^0.35.0", - "@opentelemetry/instrumentation-cassandra-driver": "^0.35.0", - "@opentelemetry/instrumentation-connect": "^0.33.0", - "@opentelemetry/instrumentation-cucumber": "^0.3.0", - "@opentelemetry/instrumentation-dataloader": "^0.6.0", - "@opentelemetry/instrumentation-dns": "^0.33.0", - "@opentelemetry/instrumentation-express": "^0.35.0", - "@opentelemetry/instrumentation-fastify": "^0.33.0", - "@opentelemetry/instrumentation-fs": "^0.9.0", - "@opentelemetry/instrumentation-generic-pool": "^0.33.0", - "@opentelemetry/instrumentation-graphql": "^0.37.0", - "@opentelemetry/instrumentation-grpc": "^0.48.0", - "@opentelemetry/instrumentation-hapi": "^0.34.0", - "@opentelemetry/instrumentation-http": "^0.48.0", - "@opentelemetry/instrumentation-ioredis": "^0.37.0", - "@opentelemetry/instrumentation-knex": "^0.33.0", - "@opentelemetry/instrumentation-koa": "^0.37.0", - "@opentelemetry/instrumentation-lru-memoizer": "^0.34.0", - "@opentelemetry/instrumentation-memcached": "^0.33.0", - "@opentelemetry/instrumentation-mongodb": "^0.39.0", - "@opentelemetry/instrumentation-mongoose": "^0.35.0", - "@opentelemetry/instrumentation-mysql": "^0.35.0", - "@opentelemetry/instrumentation-mysql2": "^0.35.0", - "@opentelemetry/instrumentation-nestjs-core": "^0.34.0", - "@opentelemetry/instrumentation-net": "^0.33.0", - "@opentelemetry/instrumentation-pg": "^0.38.0", - "@opentelemetry/instrumentation-pino": "^0.35.0", - "@opentelemetry/instrumentation-redis": "^0.36.0", - "@opentelemetry/instrumentation-redis-4": "^0.36.0", - "@opentelemetry/instrumentation-restify": "^0.35.0", - "@opentelemetry/instrumentation-router": "^0.34.0", - "@opentelemetry/instrumentation-socket.io": "^0.36.0", - "@opentelemetry/instrumentation-tedious": "^0.7.0", - "@opentelemetry/instrumentation-winston": "^0.34.0", - "@opentelemetry/resource-detector-alibaba-cloud": "^0.28.6", - "@opentelemetry/resource-detector-aws": "^1.3.6", - "@opentelemetry/resource-detector-container": "^0.3.6", - "@opentelemetry/resource-detector-gcp": "^0.29.6", + "@opentelemetry/instrumentation": "^0.49.1", + "@opentelemetry/instrumentation-amqplib": "^0.35.0", + "@opentelemetry/instrumentation-aws-lambda": "^0.39.0", + "@opentelemetry/instrumentation-aws-sdk": "^0.39.0", + "@opentelemetry/instrumentation-bunyan": "^0.36.0", + "@opentelemetry/instrumentation-cassandra-driver": "^0.36.0", + "@opentelemetry/instrumentation-connect": "^0.34.0", + "@opentelemetry/instrumentation-cucumber": "^0.4.0", + "@opentelemetry/instrumentation-dataloader": "^0.7.0", + "@opentelemetry/instrumentation-dns": "^0.34.0", + "@opentelemetry/instrumentation-express": "^0.36.0", + "@opentelemetry/instrumentation-fastify": "^0.34.0", + "@opentelemetry/instrumentation-fs": "^0.10.0", + "@opentelemetry/instrumentation-generic-pool": "^0.34.0", + "@opentelemetry/instrumentation-graphql": "^0.38.0", + "@opentelemetry/instrumentation-grpc": "^0.49.1", + "@opentelemetry/instrumentation-hapi": "^0.35.0", + "@opentelemetry/instrumentation-http": "^0.49.1", + "@opentelemetry/instrumentation-ioredis": "^0.38.0", + "@opentelemetry/instrumentation-knex": "^0.34.0", + "@opentelemetry/instrumentation-koa": "^0.38.0", + "@opentelemetry/instrumentation-lru-memoizer": "^0.35.0", + "@opentelemetry/instrumentation-memcached": "^0.34.0", + "@opentelemetry/instrumentation-mongodb": "^0.40.0", + "@opentelemetry/instrumentation-mongoose": "^0.36.0", + "@opentelemetry/instrumentation-mysql": "^0.36.0", + "@opentelemetry/instrumentation-mysql2": "^0.36.0", + "@opentelemetry/instrumentation-nestjs-core": "^0.35.0", + "@opentelemetry/instrumentation-net": "^0.34.0", + "@opentelemetry/instrumentation-pg": "^0.39.0", + "@opentelemetry/instrumentation-pino": "^0.36.0", + "@opentelemetry/instrumentation-redis": "^0.37.0", + "@opentelemetry/instrumentation-redis-4": "^0.37.0", + "@opentelemetry/instrumentation-restify": "^0.36.0", + "@opentelemetry/instrumentation-router": "^0.35.0", + "@opentelemetry/instrumentation-socket.io": "^0.37.0", + "@opentelemetry/instrumentation-tedious": "^0.8.0", + "@opentelemetry/instrumentation-winston": "^0.35.0", + "@opentelemetry/resource-detector-alibaba-cloud": "^0.28.7", + "@opentelemetry/resource-detector-aws": "^1.4.0", + "@opentelemetry/resource-detector-container": "^0.3.7", + "@opentelemetry/resource-detector-gcp": "^0.29.7", "@opentelemetry/resources": "^1.12.0", - "@opentelemetry/sdk-node": "^0.48.0" + "@opentelemetry/sdk-node": "^0.49.1" } }, "@opentelemetry/context-async-hooks": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-1.21.0.tgz", - "integrity": "sha512-t0iulGPiMjG/NrSjinPQoIf8ST/o9V0dGOJthfrFporJlNdlKIQPfC7lkrV+5s2dyBThfmSbJlp/4hO1eOcDXA==", + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-1.22.0.tgz", + "integrity": "sha512-Nfdxyg8YtWqVWkyrCukkundAjPhUXi93JtVQmqDT1mZRVKqA7e2r7eJCrI+F651XUBMp0hsOJSGiFk3QSpaIJw==", "requires": {} }, "@opentelemetry/core": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.21.0.tgz", - "integrity": "sha512-KP+OIweb3wYoP7qTYL/j5IpOlu52uxBv5M4+QhSmmUfLyTgu1OIS71msK3chFo1D6Y61BIH3wMiMYRCxJCQctA==", + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.22.0.tgz", + "integrity": "sha512-0VoAlT6x+Xzik1v9goJ3pZ2ppi6+xd3aUfg4brfrLkDBHRIVjMP0eBHrKrhB+NKcDyMAg8fAbGL3Npg/F6AwWA==", "requires": { - "@opentelemetry/semantic-conventions": "1.21.0" + "@opentelemetry/semantic-conventions": "1.22.0" } }, "@opentelemetry/exporter-prometheus": { - "version": "0.48.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-prometheus/-/exporter-prometheus-0.48.0.tgz", - "integrity": "sha512-n1cSdC7/AWkyTZD5WgK4FP0oxgRZUIjjquM6QqNOX9TLALbsg5RxiiBCqiHcbmABt7ZABZKhd8OH3t/GqTayLw==", + "version": "0.49.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-prometheus/-/exporter-prometheus-0.49.1.tgz", + "integrity": "sha512-FgzGl6OH22f+Wb1dh/TnoQSnZE2SCADhHx06nMqxivSqRJ9t3AhUdMsEOFt2IMjZClE705pcsLHk10BCJ79vsA==", "requires": { - "@opentelemetry/core": "1.21.0", - "@opentelemetry/resources": "1.21.0", - "@opentelemetry/sdk-metrics": "1.21.0" + "@opentelemetry/core": "1.22.0", + "@opentelemetry/resources": "1.22.0", + "@opentelemetry/sdk-metrics": "1.22.0" } }, "@opentelemetry/exporter-trace-otlp-grpc": { - "version": "0.48.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-grpc/-/exporter-trace-otlp-grpc-0.48.0.tgz", - "integrity": "sha512-+qRQXUbdRW6aNRT5yWOG3G6My1VxxKeqgUyLkkdIjkT20lvymjiN2RpBfGMtAf/oqnuRknf9snFl9VSIO2gniw==", + "version": "0.49.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-grpc/-/exporter-trace-otlp-grpc-0.49.1.tgz", + "integrity": "sha512-Zbd7f3zF7fI2587MVhBizaW21cO/SordyrZGtMtvhoxU6n4Qb02Gx71X4+PzXH620e0+JX+Pcr9bYb1HTeVyJA==", "requires": { "@grpc/grpc-js": "^1.7.1", - "@opentelemetry/core": "1.21.0", - "@opentelemetry/otlp-grpc-exporter-base": "0.48.0", - "@opentelemetry/otlp-transformer": "0.48.0", - "@opentelemetry/resources": "1.21.0", - "@opentelemetry/sdk-trace-base": "1.21.0" + "@opentelemetry/core": "1.22.0", + "@opentelemetry/otlp-grpc-exporter-base": "0.49.1", + "@opentelemetry/otlp-transformer": "0.49.1", + "@opentelemetry/resources": "1.22.0", + "@opentelemetry/sdk-trace-base": "1.22.0" } }, "@opentelemetry/exporter-trace-otlp-http": { - "version": "0.48.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-http/-/exporter-trace-otlp-http-0.48.0.tgz", - "integrity": "sha512-QEZKbfWqXrbKVpr2PHd4KyKI0XVOhUYC+p2RPV8s+2K5QzZBE3+F9WlxxrXDfkrvGmpQAZytBoHQQYA3AGOtpw==", + "version": "0.49.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-http/-/exporter-trace-otlp-http-0.49.1.tgz", + "integrity": "sha512-KOLtZfZvIrpGZLVvblKsiVQT7gQUZNKcUUH24Zz6Xbi7LJb9Vt6xtUZFYdR5IIjvt47PIqBKDWUQlU0o1wAsRw==", "requires": { - "@opentelemetry/core": "1.21.0", - "@opentelemetry/otlp-exporter-base": "0.48.0", - "@opentelemetry/otlp-transformer": "0.48.0", - "@opentelemetry/resources": "1.21.0", - "@opentelemetry/sdk-trace-base": "1.21.0" + "@opentelemetry/core": "1.22.0", + "@opentelemetry/otlp-exporter-base": "0.49.1", + "@opentelemetry/otlp-transformer": "0.49.1", + "@opentelemetry/resources": "1.22.0", + "@opentelemetry/sdk-trace-base": "1.22.0" } }, "@opentelemetry/exporter-trace-otlp-proto": { - "version": "0.48.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-proto/-/exporter-trace-otlp-proto-0.48.0.tgz", - "integrity": "sha512-hVXr/8DYlAKAzQYMsCf3ZsGweS6NTK3IHIEqmLokJZYcvJQBEEazeAdISfrL/utWnapg1Qnpw8u+W6SpxNzmTw==", + "version": "0.49.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-proto/-/exporter-trace-otlp-proto-0.49.1.tgz", + "integrity": "sha512-n8ON/c9pdMyYAfSFWKkgsPwjYoxnki+6Olzo+klKfW7KqLWoyEkryNkbcMIYnGGNXwdkMIrjoaP0VxXB26Oxcg==", "requires": { - "@opentelemetry/core": "1.21.0", - "@opentelemetry/otlp-exporter-base": "0.48.0", - "@opentelemetry/otlp-proto-exporter-base": "0.48.0", - "@opentelemetry/otlp-transformer": "0.48.0", - "@opentelemetry/resources": "1.21.0", - "@opentelemetry/sdk-trace-base": "1.21.0" + "@opentelemetry/core": "1.22.0", + "@opentelemetry/otlp-exporter-base": "0.49.1", + "@opentelemetry/otlp-proto-exporter-base": "0.49.1", + "@opentelemetry/otlp-transformer": "0.49.1", + "@opentelemetry/resources": "1.22.0", + "@opentelemetry/sdk-trace-base": "1.22.0" } }, "@opentelemetry/exporter-zipkin": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-zipkin/-/exporter-zipkin-1.21.0.tgz", - "integrity": "sha512-J0ejrOx52s1PqvjNalIHvY/4v9ZxR2r7XS7WZbwK3qpVYZlGVq5V1+iCNweqsKnb/miUt/4TFvJBc9f5Q/kGcA==", + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-zipkin/-/exporter-zipkin-1.22.0.tgz", + "integrity": "sha512-XcFs6rGvcTz0qW5uY7JZDYD0yNEXdekXAb6sFtnZgY/cHY6BQ09HMzOjv9SX+iaXplRDcHr1Gta7VQKM1XXM6g==", "requires": { - "@opentelemetry/core": "1.21.0", - "@opentelemetry/resources": "1.21.0", - "@opentelemetry/sdk-trace-base": "1.21.0", - "@opentelemetry/semantic-conventions": "1.21.0" + "@opentelemetry/core": "1.22.0", + "@opentelemetry/resources": "1.22.0", + "@opentelemetry/sdk-trace-base": "1.22.0", + "@opentelemetry/semantic-conventions": "1.22.0" } }, "@opentelemetry/host-metrics": { @@ -16458,10 +16473,11 @@ } }, "@opentelemetry/instrumentation": { - "version": "0.48.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.48.0.tgz", - "integrity": "sha512-sjtZQB5PStIdCw5ovVTDGwnmQC+GGYArJNgIcydrDSqUTdYBnMrN9P4pwQZgS3vTGIp+TU1L8vMXGe51NVmIKQ==", + "version": "0.49.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.49.1.tgz", + "integrity": "sha512-0DLtWtaIppuNNRRllSD4bjU8ZIiLp1cDXvJEbp752/Zf+y3gaLNaoGRGIlX4UHhcsrmtL+P2qxi3Hodi8VuKiQ==", "requires": { + "@opentelemetry/api-logs": "0.49.1", "@types/shimmer": "^1.0.2", "import-in-the-middle": "1.7.1", "require-in-the-middle": "^7.1.1", @@ -16470,21 +16486,21 @@ } }, "@opentelemetry/instrumentation-amqplib": { - "version": "0.34.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-amqplib/-/instrumentation-amqplib-0.34.0.tgz", - "integrity": "sha512-lVGRkyGnjFJv9O8oO/+uT40nrNj4UO+UN0k8708guy/toVgxsVpv4PtdWJTjbtu89UDk9gUxq62jpHxqrVaNnw==", + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-amqplib/-/instrumentation-amqplib-0.35.0.tgz", + "integrity": "sha512-rb3hIWA7f0HXpXpfElnGC6CukRxy58/OJ6XYlTzpZJtNJPao7BuobZjkQEscaRYhUzgi7X7R1aKkIUOTV5JFrg==", "requires": { "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/instrumentation": "^0.49.1", "@opentelemetry/semantic-conventions": "^1.0.0" } }, "@opentelemetry/instrumentation-aws-lambda": { - "version": "0.38.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-aws-lambda/-/instrumentation-aws-lambda-0.38.0.tgz", - "integrity": "sha512-MIPvM8S4LqGKE+IAnYVCRUnEjaWbPsbqL4p2BnGcox08e6+JQe+0d16DI0cKVSFZOzV5T/or3ewQ/bB0lPm8yg==", + "version": "0.39.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-aws-lambda/-/instrumentation-aws-lambda-0.39.0.tgz", + "integrity": "sha512-D+oG/hIBDdwCNq7Y6BEuddjcwDVD0C8NhBE7A85mRZ9RLG0bKoWrhIdVvbpqEoa0U5AWe9Y98RX4itNg7WTy4w==", "requires": { - "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/instrumentation": "^0.49.1", "@opentelemetry/propagator-aws-xray": "^1.3.1", "@opentelemetry/resources": "^1.8.0", "@opentelemetry/semantic-conventions": "^1.0.0", @@ -16492,265 +16508,265 @@ } }, "@opentelemetry/instrumentation-aws-sdk": { - "version": "0.38.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-aws-sdk/-/instrumentation-aws-sdk-0.38.1.tgz", - "integrity": "sha512-/Tupb4UfVVkmcopq2H2nr2D/pHLF0riVw2biQQUJ/jGIkfrOgUMMKbShi2RQE4Zy8NFv3xaDn4/pNxzodLBy3w==", + "version": "0.39.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-aws-sdk/-/instrumentation-aws-sdk-0.39.1.tgz", + "integrity": "sha512-QnvIMVpzRYqQHSXydGUksbhBjPbMyHSUBwi6ocN7gEXoI711+tIY3R1cfRutl0u3M67A/fAvPI3IgACfJaFORg==", "requires": { "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.48.0", - "@opentelemetry/propagation-utils": "^0.30.6", + "@opentelemetry/instrumentation": "^0.49.1", + "@opentelemetry/propagation-utils": "^0.30.7", "@opentelemetry/semantic-conventions": "^1.0.0" } }, "@opentelemetry/instrumentation-bunyan": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-bunyan/-/instrumentation-bunyan-0.35.0.tgz", - "integrity": "sha512-bQ8OzV7nVTA+oGiTzLjUmRFAbnXi0U/Z4VJCpj+1DRsaAaMT17eRpAOh22LQR0JBnv2vBm8CvIQl4CcAnsB46g==", + "version": "0.36.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-bunyan/-/instrumentation-bunyan-0.36.0.tgz", + "integrity": "sha512-sHD5BSiqSrgWow7VmugEFzV8vGdsz5m+w1v9tK6YwRzuAD7vbo57chluq+UBzIqStoCH+0yOzRzSALH7hrfffg==", "requires": { - "@opentelemetry/api-logs": "^0.48.0", - "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/api-logs": "^0.49.1", + "@opentelemetry/instrumentation": "^0.49.1", "@types/bunyan": "1.8.9" } }, "@opentelemetry/instrumentation-cassandra-driver": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-cassandra-driver/-/instrumentation-cassandra-driver-0.35.0.tgz", - "integrity": "sha512-NlJkEiP37/WQvtSyYe4zxaBcaoweO/2+UtDssldk9NFmFutLHyMT/P5q5fe8i73ylmkPOAZnN8P48oHOhZHM1g==", + "version": "0.36.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-cassandra-driver/-/instrumentation-cassandra-driver-0.36.0.tgz", + "integrity": "sha512-gMfxzryOIP/mvSLXBJp/QxSr2NvS+cC1dkIXn+aSOzYoU1U3apeF3nAyuikmY9dRCQDV7wHPslqbi+pCmd4pAQ==", "requires": { - "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/instrumentation": "^0.49.1", "@opentelemetry/semantic-conventions": "^1.0.0" } }, "@opentelemetry/instrumentation-connect": { - "version": "0.33.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-connect/-/instrumentation-connect-0.33.0.tgz", - "integrity": "sha512-EAMmUC2/KfeZl4qNgUsiVqT5Jti0jDl4GHi4TpDg41VBEJkRX/0+JcPBWgdFUgEfeiZr0GPVQud4i8jAwJ+ORw==", + "version": "0.34.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-connect/-/instrumentation-connect-0.34.0.tgz", + "integrity": "sha512-PJO99nfyUp3JSoBMhwZsOQDm/XKfkb/QQ8YTsNX4ZJ28phoRcNLqe36mqIMp80DKmKAX4xkxCAyrSYtW8QqZxA==", "requires": { "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/instrumentation": "^0.49.1", "@opentelemetry/semantic-conventions": "^1.0.0", "@types/connect": "3.4.36" } }, "@opentelemetry/instrumentation-cucumber": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-cucumber/-/instrumentation-cucumber-0.3.0.tgz", - "integrity": "sha512-nM9BL0t2Nxwbb41MXxNXTDL0zq7FXhOX9F3OiAqYUJHqb7BHyzV9KoQ+Ao1BjqJR91hUm1OFNgHAk3y8uiuq4w==", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-cucumber/-/instrumentation-cucumber-0.4.0.tgz", + "integrity": "sha512-n53QvozzgMS9imEclow2nBYJ/jtZlZqiKIqDUi2/g0nDi08F555JhDS03d/Z+4NJxbu7bDLAg12giCV9KZN/Jw==", "requires": { - "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/instrumentation": "^0.49.1", "@opentelemetry/semantic-conventions": "^1.0.0" } }, "@opentelemetry/instrumentation-dataloader": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-dataloader/-/instrumentation-dataloader-0.6.0.tgz", - "integrity": "sha512-jkPdn83WV/TcnhQ5bOIoYcJGvMxXyYlCzbqfuB6HsMqf3CqpdgBQYlMuKi6qIfD4QWYt2R992yglNxPLuJ7xeg==", + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-dataloader/-/instrumentation-dataloader-0.7.0.tgz", + "integrity": "sha512-sIaevxATJV5YaZzBTTcTaDEnI+/1vxYs+lVk1honnvrEAaP0FA9C/cFrQEN0kP2BDHkHRE/t6y5lGUqusi/h3A==", "requires": { - "@opentelemetry/instrumentation": "^0.48.0" + "@opentelemetry/instrumentation": "^0.49.1" } }, "@opentelemetry/instrumentation-dns": { - "version": "0.33.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-dns/-/instrumentation-dns-0.33.0.tgz", - "integrity": "sha512-QDJadJOQg9CLqMC79r4T5ugN4C4lb6eJYLmHgnLg3fh1JUGfyjQHtD3T7lH0P8251Mnt5m8zjDDbPKcqK2aGcw==", + "version": "0.34.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-dns/-/instrumentation-dns-0.34.0.tgz", + "integrity": "sha512-3tmXdvrzHQ7S3v82Cm36PTYLtgg2+hVm00K1xB3uzP08GEo9w/F8DW4me9z6rDroVGiLIg621RZ6dzjBcmmFCg==", "requires": { - "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/instrumentation": "^0.49.1", "@opentelemetry/semantic-conventions": "^1.0.0", "semver": "^7.5.4" } }, "@opentelemetry/instrumentation-express": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-express/-/instrumentation-express-0.35.0.tgz", - "integrity": "sha512-ZmSB4WMd88sSecOL7DlghzdBl56/8ymb02n+xEJ/6zUgONuw/1uoTh1TAaNPKfEWdNLoLKXQm+Gd2zBrUVOX0w==", + "version": "0.36.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-express/-/instrumentation-express-0.36.1.tgz", + "integrity": "sha512-ltIE4kIMa+83QjW/p7oe7XCESF29w3FQ9/T1VgShdX7fzm56K2a0xfEX1vF8lnHRGERYxIWX9D086C6gJOjVGA==", "requires": { "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/instrumentation": "^0.49.1", "@opentelemetry/semantic-conventions": "^1.0.0" } }, "@opentelemetry/instrumentation-fastify": { - "version": "0.33.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-fastify/-/instrumentation-fastify-0.33.0.tgz", - "integrity": "sha512-sl3q9Mt+yM6GlZJKhfLUIRrVEYqfmI0hqYLha5OFG5rLrgnZCCZVy8ra4+Pa40ecH1409cvwwBPf7k9AHEQBTw==", + "version": "0.34.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-fastify/-/instrumentation-fastify-0.34.0.tgz", + "integrity": "sha512-2Qu66XBkfJ8tr6H+RHBTyw/EX73N9U7pvNa49aonDnT9/mK58k7AKOscpRnKXOvHqc2YIdEPRcBIWxhksPFZVA==", "requires": { "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/instrumentation": "^0.49.1", "@opentelemetry/semantic-conventions": "^1.0.0" } }, "@opentelemetry/instrumentation-fs": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-fs/-/instrumentation-fs-0.9.0.tgz", - "integrity": "sha512-Xp31lb2Sj50ppsJ393650HxSi5IJIgddXxrUeVljmsabdmECPUj0YAt/Wwb1oIHFn04iL9Tq4VkF/otlLaI9ww==", + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-fs/-/instrumentation-fs-0.10.0.tgz", + "integrity": "sha512-XtMoNINVsIQTQHjtxe7A0Lng96wxA5DSD5CYVVvpquG6HJRdZ4xNe9DTU03YtoEFqlN9qTfvGb/6ILzhKhiG8g==", "requires": { "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/instrumentation": "^0.49.1", "@opentelemetry/semantic-conventions": "^1.0.0" } }, "@opentelemetry/instrumentation-generic-pool": { - "version": "0.33.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-generic-pool/-/instrumentation-generic-pool-0.33.0.tgz", - "integrity": "sha512-QMSSOfIqMJhXqFryLVbAMsgRktNHdhMEpsOgEiHurLfvAJhyEOBcTTUuo6Laqt50IIzIm3YuHL9ZtEl9fve2ag==", + "version": "0.34.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-generic-pool/-/instrumentation-generic-pool-0.34.0.tgz", + "integrity": "sha512-jdI7tfVVwZJuTu4j2kAvJtx4wlEQKIXSZnZG4RdqRHc56KqQQDuVTBLvUgmDXvnSVclH9ayf4oaAV08R9fICtw==", "requires": { - "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/instrumentation": "^0.49.1", "@opentelemetry/semantic-conventions": "^1.0.0" } }, "@opentelemetry/instrumentation-graphql": { - "version": "0.37.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-graphql/-/instrumentation-graphql-0.37.0.tgz", - "integrity": "sha512-WL5Qn1aRudJDxVN0Ao73/yzXBGBJAH1Fd2tteuGXku/Qw9hYQ936CgoO66GWmSiq2lyjsojAk1t5f+HF9j3NXw==", + "version": "0.38.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-graphql/-/instrumentation-graphql-0.38.1.tgz", + "integrity": "sha512-mSt4ztn3EVlLtZJ+tDEqq5GUEYdY8cbTT9SeVJFmXSfdSQkPZn0ovo/dRe6dUcplM60gg4w+llw8SZuQN0iZfQ==", "requires": { - "@opentelemetry/instrumentation": "^0.48.0" + "@opentelemetry/instrumentation": "^0.49.1" } }, "@opentelemetry/instrumentation-grpc": { - "version": "0.48.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-grpc/-/instrumentation-grpc-0.48.0.tgz", - "integrity": "sha512-MmJHkbqaulqfECjotRtco9AXOq+D1HLq53wI7UFeE8bl8kISP9iMkt+A7PrtPFpRGCglwFvSa0djId6EWsP0DQ==", + "version": "0.49.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-grpc/-/instrumentation-grpc-0.49.1.tgz", + "integrity": "sha512-f8mQjFi5/PiP4SK3VDU1/3sUUgs6exMtBgcnNycgCKgN40htiPT+MuDRwdRnRMNI/4vNQ7p1/5r4Q5oN0GuRBw==", "requires": { - "@opentelemetry/instrumentation": "0.48.0", - "@opentelemetry/semantic-conventions": "1.21.0" + "@opentelemetry/instrumentation": "0.49.1", + "@opentelemetry/semantic-conventions": "1.22.0" } }, "@opentelemetry/instrumentation-hapi": { - "version": "0.34.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-hapi/-/instrumentation-hapi-0.34.0.tgz", - "integrity": "sha512-qUENVxwCYbRbJ8HBY54ZL1Z9q1guCEurW6tCFFJJKQFu/MKEw7GSFImy5DR2Mp8b5ggZO36lYFcx0QUxfy4GJg==", + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-hapi/-/instrumentation-hapi-0.35.0.tgz", + "integrity": "sha512-j7q99aTLHfjNKW94qJnEaDatgz+q2psTKs7lxZO4QHRnoDltDk39a44/+AkI1qBJNw5xyLjrApqkglfbWJ2abg==", "requires": { "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/instrumentation": "^0.49.1", "@opentelemetry/semantic-conventions": "^1.0.0", "@types/hapi__hapi": "20.0.13" } }, "@opentelemetry/instrumentation-http": { - "version": "0.48.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-http/-/instrumentation-http-0.48.0.tgz", - "integrity": "sha512-uXqOsLhW9WC3ZlGm6+PSX0xjSDTCfy4CMjfYj6TPWusOO8dtdx040trOriF24y+sZmS3M+5UQc6/3/ZxBJh4Mw==", + "version": "0.49.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-http/-/instrumentation-http-0.49.1.tgz", + "integrity": "sha512-Yib5zrW2s0V8wTeUK/B3ZtpyP4ldgXj9L3Ws/axXrW1dW0/mEFKifK50MxMQK9g5NNJQS9dWH7rvcEGZdWdQDA==", "requires": { - "@opentelemetry/core": "1.21.0", - "@opentelemetry/instrumentation": "0.48.0", - "@opentelemetry/semantic-conventions": "1.21.0", + "@opentelemetry/core": "1.22.0", + "@opentelemetry/instrumentation": "0.49.1", + "@opentelemetry/semantic-conventions": "1.22.0", "semver": "^7.5.2" } }, "@opentelemetry/instrumentation-ioredis": { - "version": "0.37.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-ioredis/-/instrumentation-ioredis-0.37.0.tgz", - "integrity": "sha512-xBPfu03IIG8x1pmt1Dx+XrBO4ZB4UjEcrouGbp6eV3dLQ7eJPYZgfNXmsqkpsxgNQuVCi2a3WEAwZ5Wl2hk7Vw==", + "version": "0.38.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-ioredis/-/instrumentation-ioredis-0.38.0.tgz", + "integrity": "sha512-c9nQFhRjFAtpInTks7z5v9CiOCiR8U9GbIhIv0TLEJ/r0wqdKNLfLZzCrr9XQ9WasxeOmziLlPFhpRBAd9Q4oA==", "requires": { - "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/instrumentation": "^0.49.1", "@opentelemetry/redis-common": "^0.36.1", "@opentelemetry/semantic-conventions": "^1.0.0", "@types/ioredis4": "npm:@types/ioredis@^4.28.10" } }, "@opentelemetry/instrumentation-knex": { - "version": "0.33.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-knex/-/instrumentation-knex-0.33.0.tgz", - "integrity": "sha512-7L3Q8Yy5vY4W4zpRrjKEc0OpVPYyERtDz5dAumKjkJsEVPANr7E8Cc+No6VjZGeN+HgFFwEo+jcQCTWJzdxvRw==", + "version": "0.34.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-knex/-/instrumentation-knex-0.34.0.tgz", + "integrity": "sha512-6kZOEvNJOylTQunU5zSSi4iTuCkwIL9nwFnZg7719p61u3d6Qj3X4xi9su46VE3M0dH7vEoxUW+nb/0ilm+aZg==", "requires": { - "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/instrumentation": "^0.49.1", "@opentelemetry/semantic-conventions": "^1.0.0" } }, "@opentelemetry/instrumentation-koa": { - "version": "0.37.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-koa/-/instrumentation-koa-0.37.0.tgz", - "integrity": "sha512-EfuGv1RJCSZh77dDc3PtvZXGwcsTufn9tU6T9VOTFcxovpyJ6w0og73eD0D02syR8R+kzv6rg1TeS8+lj7pyrQ==", + "version": "0.38.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-koa/-/instrumentation-koa-0.38.0.tgz", + "integrity": "sha512-lQujF4I3wdcrOF14miCV2pC72H+OJKb2LrrmTvTDAhELQDN/95v0doWgT9aHybUGkaAeB3QG4d09sved548TlA==", "requires": { "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/instrumentation": "^0.49.1", "@opentelemetry/semantic-conventions": "^1.0.0", "@types/koa": "2.14.0", "@types/koa__router": "12.0.3" } }, "@opentelemetry/instrumentation-lru-memoizer": { - "version": "0.34.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-lru-memoizer/-/instrumentation-lru-memoizer-0.34.0.tgz", - "integrity": "sha512-m1kXrc11XNj7cC6sfcsYqd+kuCcN2wI9LXpB2l2BZCogqxHCgjuVoiXvT6K9LfO4tLefcvhoK0N8XuVJ8xyyOw==", + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-lru-memoizer/-/instrumentation-lru-memoizer-0.35.0.tgz", + "integrity": "sha512-wCXe+iCF7JweMgY3blLM2Y1G0GSwLEeSA61z/y1UwzvBLEEXt7vL6qOl2mkNcUL9ZbLDS+EABatBH+vFO6DV5Q==", "requires": { - "@opentelemetry/instrumentation": "^0.48.0" + "@opentelemetry/instrumentation": "^0.49.1" } }, "@opentelemetry/instrumentation-memcached": { - "version": "0.33.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-memcached/-/instrumentation-memcached-0.33.0.tgz", - "integrity": "sha512-TdGT5ytt8o7FTIsQvx010ykYbqu+IfGoOKA+IXLHdX1+l7vFWyv3ZOzQbRDmA4rxujJAAPf/n4/D7QECyedE/g==", + "version": "0.34.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-memcached/-/instrumentation-memcached-0.34.0.tgz", + "integrity": "sha512-RleFfaag3Evg4pTzHwDBwo1KiFgnCtiT4V6MQRRHadytNGdpcL+Ynz32ydDdiOXeadt7xpRI7HSvBy0quGTXSw==", "requires": { - "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/instrumentation": "^0.49.1", "@opentelemetry/semantic-conventions": "^1.0.0", "@types/memcached": "^2.2.6" } }, "@opentelemetry/instrumentation-mongodb": { - "version": "0.39.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongodb/-/instrumentation-mongodb-0.39.0.tgz", - "integrity": "sha512-m9dMj39pcCshzlfCEn2lGrlNo7eV5fb9pGBnPyl/Am9Crh7Or8vOqvByCNd26Dgf5J978zTdLGF+6tM8j1WOew==", + "version": "0.40.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongodb/-/instrumentation-mongodb-0.40.0.tgz", + "integrity": "sha512-ldlJUW/1UlnGtIWBt7fIUl+7+TGOKxIU+0Js5ukpXfQc07ENYFeck5TdbFjvYtF8GppPErnsZJiFiRdYm6Pv/Q==", "requires": { - "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/instrumentation": "^0.49.1", "@opentelemetry/sdk-metrics": "^1.9.1", "@opentelemetry/semantic-conventions": "^1.0.0" } }, "@opentelemetry/instrumentation-mongoose": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongoose/-/instrumentation-mongoose-0.35.0.tgz", - "integrity": "sha512-gReBMWD2Oa/wBGRWyg6B2dbPHhgkpOqDio31gE3DbC4JaqCsMByyeix75rZSzZ71RQmVh3d4jRLsqUtNVBzcyg==", + "version": "0.36.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongoose/-/instrumentation-mongoose-0.36.0.tgz", + "integrity": "sha512-UelQ8dLQRLTdck3tPJdZ17b+Hk9usLf1cY2ou5THAaZpulUdpg62Q9Hx2RHRU71Rp2/YMDk25og7GJhuWScfEA==", "requires": { "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/instrumentation": "^0.49.1", "@opentelemetry/semantic-conventions": "^1.0.0" } }, "@opentelemetry/instrumentation-mysql": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql/-/instrumentation-mysql-0.35.0.tgz", - "integrity": "sha512-QKRHd3aFA2vKOPzIZ9Q3UIxYeNPweB62HGlX2l3shOKrUhrtTg2/BzaKpHQBy2f2nO2mxTF/mOFeVEDeANnhig==", + "version": "0.36.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql/-/instrumentation-mysql-0.36.0.tgz", + "integrity": "sha512-2mt/032SLkiuddzMrq3YwM0bHksXRep69EzGRnBfF+bCbwYvKLpqmSFqJZ9T3yY/mBWj+tvdvc1+klXGrh2QnQ==", "requires": { - "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/instrumentation": "^0.49.1", "@opentelemetry/semantic-conventions": "^1.0.0", "@types/mysql": "2.15.22" } }, "@opentelemetry/instrumentation-mysql2": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql2/-/instrumentation-mysql2-0.35.0.tgz", - "integrity": "sha512-DI9NXYJBbQ72rjz1KCKerQFQE+Z4xRDoyYek6JpITv5BlhPboA8zKkltxyQLL06Y2RTFYslw1gvg+x9CWlRzJw==", + "version": "0.36.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql2/-/instrumentation-mysql2-0.36.0.tgz", + "integrity": "sha512-F63lKcl/R+if2j5Vz66c2/SLXQEtLlFkWTmYb8NQSgmcCaEKjML4RRRjZISIT4IBwdpanJ2qmNuXVM6MYqhBXw==", "requires": { - "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/instrumentation": "^0.49.1", "@opentelemetry/semantic-conventions": "^1.0.0", "@opentelemetry/sql-common": "^0.40.0" } }, "@opentelemetry/instrumentation-nestjs-core": { - "version": "0.34.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-nestjs-core/-/instrumentation-nestjs-core-0.34.0.tgz", - "integrity": "sha512-HvbcCVAMZEIFrJ0Si9AfjxOr14KcH5h/lq5zLQ8AjZJpW0WaeO/ox5UgFi3J73Br91WbZHRgbXxMeodNycJJuA==", + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-nestjs-core/-/instrumentation-nestjs-core-0.35.0.tgz", + "integrity": "sha512-INKA7CIOteTSRVxP7SQaFby11AYU3uezI93xDaDRGY4TloXNVoyw5n6UmcVJU4yDn6xY2r7zZ2SVHvblUc21/g==", "requires": { - "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/instrumentation": "^0.49.1", "@opentelemetry/semantic-conventions": "^1.0.0" } }, "@opentelemetry/instrumentation-net": { - "version": "0.33.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-net/-/instrumentation-net-0.33.0.tgz", - "integrity": "sha512-x6awrqF0YfEhGGNE2JtEWvB+zEls7mFvLDii54DnWxpQU69+AqKCW/ZwC91EDefOMGSYBckL0uEn6XNOgkTTbw==", + "version": "0.34.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-net/-/instrumentation-net-0.34.0.tgz", + "integrity": "sha512-gjybNOQQqbXmD1qVHNO2qBJI4V6p3QQ7xKg3pnC/x7wRdxn+siLQj7QIVxW85C3mymngoJJdRs6BwI3qPUfsPQ==", "requires": { - "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/instrumentation": "^0.49.1", "@opentelemetry/semantic-conventions": "^1.0.0" } }, "@opentelemetry/instrumentation-pg": { - "version": "0.38.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pg/-/instrumentation-pg-0.38.0.tgz", - "integrity": "sha512-Q7V/OJ1OZwaWYNOP/E9S6sfS03Z+PNU1SAjdAoXTj5j4u4iJSMSieLRWXFaHwsbefIOMkYvA00EBKF9IgbgbLA==", + "version": "0.39.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pg/-/instrumentation-pg-0.39.1.tgz", + "integrity": "sha512-pX5ujDOyGpPcrZlzaD3LJzmyaSMMMKAP+ffTHJp9vasvZJr+LifCk53TMPVUafcXKV/xX/IIkvADO+67M1Z25g==", "requires": { - "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/instrumentation": "^0.49.1", "@opentelemetry/semantic-conventions": "^1.0.0", "@opentelemetry/sql-common": "^0.40.0", "@types/pg": "8.6.1", @@ -16770,125 +16786,125 @@ } }, "@opentelemetry/instrumentation-pino": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pino/-/instrumentation-pino-0.35.0.tgz", - "integrity": "sha512-gMfJ5Qy793mbaAGnQE3yp1Cb0y4np74rBPu20Oy/v8TTgPQOEV5PyNI0GNGggmZQIJSkdtYa8Ndb3huH3iZE5g==", + "version": "0.36.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pino/-/instrumentation-pino-0.36.0.tgz", + "integrity": "sha512-oEz+BJEYRBMAUu7MVJFJhhlsBuwLaUGjbJciKZRIeGX+fUtgcbQGV+a2Ris9jR3yFzWZrYg0aNBSCbGqvPCtMQ==", "requires": { - "@opentelemetry/instrumentation": "^0.48.0" + "@opentelemetry/instrumentation": "^0.49.1" } }, "@opentelemetry/instrumentation-redis": { - "version": "0.36.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-redis/-/instrumentation-redis-0.36.0.tgz", - "integrity": "sha512-rKFylIacEBwLxKFrPvxpVi8hHY9qXfQSybYnYNyF/VxUWMGYDPMpbCnTQkiVR5u+tIhwSvhSDG2YQEq6syHUIQ==", + "version": "0.37.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-redis/-/instrumentation-redis-0.37.0.tgz", + "integrity": "sha512-9G0T74kheu37k+UvyBnAcieB5iowxska3z2rhUcSTL8Cl0y/CvMn7sZ7txkUbXt0rdX6qeEUdMLmbsY2fPUM7Q==", "requires": { - "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/instrumentation": "^0.49.1", "@opentelemetry/redis-common": "^0.36.1", "@opentelemetry/semantic-conventions": "^1.0.0" } }, "@opentelemetry/instrumentation-redis-4": { - "version": "0.36.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-redis-4/-/instrumentation-redis-4-0.36.0.tgz", - "integrity": "sha512-XO0EV2TxUsaRdcp79blyLGG5JWWl7NWVd/XNbU8vY7CuYUfRhWiTXYoM4PI+lwkAnUPvPtyiOzYs9px23GnibA==", + "version": "0.37.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-redis-4/-/instrumentation-redis-4-0.37.0.tgz", + "integrity": "sha512-WNO+HALvPPvjbh7UEEIuay0Z0d2mIfSCkBZbPRwZttDGX6LYGc2WnRgJh3TnYqjp7/y9IryWIbajAFIebj1OBA==", "requires": { - "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/instrumentation": "^0.49.1", "@opentelemetry/redis-common": "^0.36.1", "@opentelemetry/semantic-conventions": "^1.0.0" } }, "@opentelemetry/instrumentation-restify": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-restify/-/instrumentation-restify-0.35.0.tgz", - "integrity": "sha512-0ghtxsGJxHEwJfIzxDN3FCbNiTXqwv2jV6ip716jyjWN3f6MuRHm7NPWI/KNvu+IjqDj16KRGZG7nUAEB1ojog==", + "version": "0.36.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-restify/-/instrumentation-restify-0.36.0.tgz", + "integrity": "sha512-QbOh8HpnnRn4xxFXX77Gdww6M78yx7dRiIKR6+H3j5LH5u6sYckTXw3TGPSsXsaM4DQHy0fOw15sAcJoWkC+aQ==", "requires": { "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/instrumentation": "^0.49.1", "@opentelemetry/semantic-conventions": "^1.0.0" } }, "@opentelemetry/instrumentation-router": { - "version": "0.34.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-router/-/instrumentation-router-0.34.0.tgz", - "integrity": "sha512-7LsonkdnQi35eF7CWl8394QDgyd811gCawJ6QuS8GbWNIvZ3S2f9j+Zy0fWSmFgO28ruW1pUG51ql8xdXWa8TA==", + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-router/-/instrumentation-router-0.35.0.tgz", + "integrity": "sha512-MdxGJuNTIy/2qDI8yow6cRBQ87m6O//VuHIlawe8v0x1NsTOSwS72xm+BzTuY9D0iMqiJUiTlE3dBs8DA91MTw==", "requires": { - "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/instrumentation": "^0.49.1", "@opentelemetry/semantic-conventions": "^1.0.0" } }, "@opentelemetry/instrumentation-socket.io": { - "version": "0.36.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-socket.io/-/instrumentation-socket.io-0.36.0.tgz", - "integrity": "sha512-c9Zc6WKxTZtMaOj01kmJGLKabEj805YgTav4l9vgojHrf6MH1fTlw+SGvOKhfPfzmu2QhNORAfqPAB1poDwqEQ==", + "version": "0.37.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-socket.io/-/instrumentation-socket.io-0.37.0.tgz", + "integrity": "sha512-aIztxmx/yis/goEndnoITrZvDDr1GdCtlsWo9ex7MhUIjqq5nJbTuyigf3GmU86XFFhSThxfQuJ9DpJyPxfBfA==", "requires": { - "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/instrumentation": "^0.49.1", "@opentelemetry/semantic-conventions": "^1.0.0" } }, "@opentelemetry/instrumentation-tedious": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-tedious/-/instrumentation-tedious-0.7.0.tgz", - "integrity": "sha512-o/5my8ZOuxACPSzMaXdPnQiMpmOPIJoTj+DRcs4vEJxk+KwlVNucoafSMpWQEyTNNuq2JI87Ru6Di2mp5T20EQ==", + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-tedious/-/instrumentation-tedious-0.8.0.tgz", + "integrity": "sha512-BBRW8+Qm2PLNkVMynr3Q7L4xCAOCOs0J9BJIJ8ZGoatW42b2H4qhMhq35jfPDvEL5u5azxHDapmUVYrDJDjAfA==", "requires": { - "@opentelemetry/instrumentation": "^0.48.0", + "@opentelemetry/instrumentation": "^0.49.1", "@opentelemetry/semantic-conventions": "^1.0.0", "@types/tedious": "^4.0.10" } }, "@opentelemetry/instrumentation-winston": { - "version": "0.34.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-winston/-/instrumentation-winston-0.34.0.tgz", - "integrity": "sha512-Ejssv6Uih7ipoNGYQLXd+cKZdEfTfTJ/vzpUSeYiJZ36mVYER1f8fs9Kb7jTKjHD55g2s6cUJj9lifbDFI4EEw==", + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-winston/-/instrumentation-winston-0.35.0.tgz", + "integrity": "sha512-ymcuA3S2flnLmH1GS0105H91iDLap8cizOCaLMCp7Xz7r4L+wFf1zfix9M+iSkxcPFshHRt8LFA/ELXw51nk0g==", "requires": { - "@opentelemetry/instrumentation": "^0.48.0" + "@opentelemetry/instrumentation": "^0.49.1" } }, "@opentelemetry/otlp-exporter-base": { - "version": "0.48.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.48.0.tgz", - "integrity": "sha512-T4LJND+Ugl87GUONoyoQzuV9qCn4BFIPOnCH1biYqdGhc2JahjuLqVD9aefwLzGBW638iLAo88Lh68h2F1FLiA==", + "version": "0.49.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.49.1.tgz", + "integrity": "sha512-z6sHliPqDgJU45kQatAettY9/eVF58qVPaTuejw9YWfSRqid9pXPYeegDCSdyS47KAUgAtm+nC28K3pfF27HWg==", "requires": { - "@opentelemetry/core": "1.21.0" + "@opentelemetry/core": "1.22.0" } }, "@opentelemetry/otlp-grpc-exporter-base": { - "version": "0.48.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-grpc-exporter-base/-/otlp-grpc-exporter-base-0.48.0.tgz", - "integrity": "sha512-Vdp56RK9OU+Oeoy3YQC/UMOWglKQ9qvgGr49FgF4r8vk5DlcTUgVS0m3KG8pykmRPA+5ZKaDuqwPw5aTvWmHFw==", + "version": "0.49.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-grpc-exporter-base/-/otlp-grpc-exporter-base-0.49.1.tgz", + "integrity": "sha512-DNDNUWmOqtKTFJAyOyHHKotVox0NQ/09ETX8fUOeEtyNVHoGekAVtBbvIA3AtK+JflP7LC0PTjlLfruPM3Wy6w==", "requires": { "@grpc/grpc-js": "^1.7.1", - "@opentelemetry/core": "1.21.0", - "@opentelemetry/otlp-exporter-base": "0.48.0", + "@opentelemetry/core": "1.22.0", + "@opentelemetry/otlp-exporter-base": "0.49.1", "protobufjs": "^7.2.3" } }, "@opentelemetry/otlp-proto-exporter-base": { - "version": "0.48.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-proto-exporter-base/-/otlp-proto-exporter-base-0.48.0.tgz", - "integrity": "sha512-14GSTvPZPfrWsB54fYMGb8v+Uge5xGXyz0r2rf4SzcRnO2hXCPHEuL3yyL50emaKPAY+fj29Dm0bweawe8UA6A==", + "version": "0.49.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-proto-exporter-base/-/otlp-proto-exporter-base-0.49.1.tgz", + "integrity": "sha512-x1qB4EUC7KikUl2iNuxCkV8yRzrSXSyj4itfpIO674H7dhI7Zv37SFaOJTDN+8Z/F50gF2ISFH9CWQ4KCtGm2A==", "requires": { - "@opentelemetry/core": "1.21.0", - "@opentelemetry/otlp-exporter-base": "0.48.0", + "@opentelemetry/core": "1.22.0", + "@opentelemetry/otlp-exporter-base": "0.49.1", "protobufjs": "^7.2.3" } }, "@opentelemetry/otlp-transformer": { - "version": "0.48.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.48.0.tgz", - "integrity": "sha512-yuoS4cUumaTK/hhxW3JUy3wl2U4keMo01cFDrUOmjloAdSSXvv1zyQ920IIH4lymp5Xd21Dj2/jq2LOro56TJg==", + "version": "0.49.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.49.1.tgz", + "integrity": "sha512-Z+koA4wp9L9e3jkFacyXTGphSWTbOKjwwXMpb0CxNb0kjTHGUxhYRN8GnkLFsFo5NbZPjP07hwAqeEG/uCratQ==", "requires": { - "@opentelemetry/api-logs": "0.48.0", - "@opentelemetry/core": "1.21.0", - "@opentelemetry/resources": "1.21.0", - "@opentelemetry/sdk-logs": "0.48.0", - "@opentelemetry/sdk-metrics": "1.21.0", - "@opentelemetry/sdk-trace-base": "1.21.0" + "@opentelemetry/api-logs": "0.49.1", + "@opentelemetry/core": "1.22.0", + "@opentelemetry/resources": "1.22.0", + "@opentelemetry/sdk-logs": "0.49.1", + "@opentelemetry/sdk-metrics": "1.22.0", + "@opentelemetry/sdk-trace-base": "1.22.0" } }, "@opentelemetry/propagation-utils": { - "version": "0.30.6", - "resolved": "https://registry.npmjs.org/@opentelemetry/propagation-utils/-/propagation-utils-0.30.6.tgz", - "integrity": "sha512-qvnYee5I/xrBY5XClUlOASIOdoTbnFGNI6+ViKqdoErF2xKmhysXcmxlJNzQFNDK0muTfjvJMZcFyEielARk7g==", + "version": "0.30.7", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagation-utils/-/propagation-utils-0.30.7.tgz", + "integrity": "sha512-QkxOkuCQdq8YgJstEMF4ntSyr0ivCrcQc49uvO2pyccrniu2DwA+JD071aM4BXfNVSCeOuhIyW/3QPiZYl4zdA==", "requires": {} }, "@opentelemetry/propagator-aws-xray": { @@ -16900,19 +16916,19 @@ } }, "@opentelemetry/propagator-b3": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-b3/-/propagator-b3-1.21.0.tgz", - "integrity": "sha512-3ZTobj2VDIOzLsIvvYCdpw6tunxUVElPxDvog9lS49YX4hohHeD84A8u9Ns/6UYUcaN5GSoEf891lzhcBFiOLA==", + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-b3/-/propagator-b3-1.22.0.tgz", + "integrity": "sha512-qBItJm9ygg/jCB5rmivyGz1qmKZPsL/sX715JqPMFgq++Idm0x+N9sLQvWFHFt2+ZINnCSojw7FVBgFW6izcXA==", "requires": { - "@opentelemetry/core": "1.21.0" + "@opentelemetry/core": "1.22.0" } }, "@opentelemetry/propagator-jaeger": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-jaeger/-/propagator-jaeger-1.21.0.tgz", - "integrity": "sha512-8TQSwXjBmaDx7JkxRD7hdmBmRK2RGRgzHX1ArJfJhIc5trzlVweyorzqQrXOvqVEdEg+zxUMHkL5qbGH/HDTPA==", + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-jaeger/-/propagator-jaeger-1.22.0.tgz", + "integrity": "sha512-pMLgst3QIwrUfepraH5WG7xfpJ8J3CrPKrtINK0t7kBkuu96rn+HDYQ8kt3+0FXvrZI8YJE77MCQwnJWXIrgpA==", "requires": { - "@opentelemetry/core": "1.21.0" + "@opentelemetry/core": "1.22.0" } }, "@opentelemetry/redis-common": { @@ -16921,18 +16937,18 @@ "integrity": "sha512-YjfNEr7DK1Ymc5H0bzhmqVvMcCs+PUEUerzrpTFdHfZxj3HpnnjZTIFKx/gxiL/sajQ8dxycjlreoYTVYKBXlw==" }, "@opentelemetry/resource-detector-alibaba-cloud": { - "version": "0.28.6", - "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-alibaba-cloud/-/resource-detector-alibaba-cloud-0.28.6.tgz", - "integrity": "sha512-VuJXc+oDQ/SYRHBCQbEshl0WJtEMvgfSkTDBq+WSxj6y9sKe0HCt55Sxeb5nLmBdtCYWMQFniHe2K4GLSjDZVw==", + "version": "0.28.7", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-alibaba-cloud/-/resource-detector-alibaba-cloud-0.28.7.tgz", + "integrity": "sha512-7o/waBJ08JrKED4blHGyBPIN1HMM1KEvhbO1HmdA+tsUqsGwZdTjsdMKFW7hc1TvAu4AQEnuvMy/Q5OByVr95A==", "requires": { "@opentelemetry/resources": "^1.0.0", "@opentelemetry/semantic-conventions": "^1.0.0" } }, "@opentelemetry/resource-detector-aws": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-aws/-/resource-detector-aws-1.3.6.tgz", - "integrity": "sha512-hFJ19yFwChqGCv1uMkXtjZU9BG8GcChe8cRCAkGWg1RZADse5S2ausf3D8pYw1cR3ktJtuAmRrGZniT6TDUPDw==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-aws/-/resource-detector-aws-1.4.0.tgz", + "integrity": "sha512-Cn8eQ/heLqrNrPuHGG7xUkk//VQt4hzVIPurmLlCI0wrDV6HR+yykBvRkJBuSdLzbjeQ/qNbGel9OvTmA6PBQA==", "requires": { "@opentelemetry/core": "^1.0.0", "@opentelemetry/resources": "^1.0.0", @@ -16940,18 +16956,18 @@ } }, "@opentelemetry/resource-detector-container": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-container/-/resource-detector-container-0.3.6.tgz", - "integrity": "sha512-psxtzQakVuZKFl/ukn+nPW4Ixn+KPHGsWJMYKndmXrsgdFri78X+MHR0wLOO41Zn79sc35DiSk+GdJ24cCylbg==", + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-container/-/resource-detector-container-0.3.7.tgz", + "integrity": "sha512-AYqwffGVuGLuzzVOQMLNHTztwyvsep9noxN9HTQ/grwmJSWZ6851kNx+W735K7v6GZEDmXeLpBn+J3TeqKQUJA==", "requires": { "@opentelemetry/resources": "^1.0.0", "@opentelemetry/semantic-conventions": "^1.0.0" } }, "@opentelemetry/resource-detector-gcp": { - "version": "0.29.6", - "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-gcp/-/resource-detector-gcp-0.29.6.tgz", - "integrity": "sha512-cx03fXPknmiVW0hpWAJr0Nr8xwkwRB8VNWPvNrmP7UzJ8eEztY9lHnVke4ZVFaVGvm/4EFxk2y5hPNggbIezoA==", + "version": "0.29.7", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-gcp/-/resource-detector-gcp-0.29.7.tgz", + "integrity": "sha512-uUHKfoOgBCZCEPCU6FWnRrbYuz1miaeIfos0Xe38YuR06vQvddhqZ0tewYunJpfECfKEcjSjY0eDe2QIRLMkXw==", "requires": { "@opentelemetry/core": "^1.0.0", "@opentelemetry/resources": "^1.0.0", @@ -16960,80 +16976,80 @@ } }, "@opentelemetry/resources": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.21.0.tgz", - "integrity": "sha512-1Z86FUxPKL6zWVy2LdhueEGl9AHDJcx+bvHStxomruz6Whd02mE3lNUMjVJ+FGRoktx/xYQcxccYb03DiUP6Yw==", + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.22.0.tgz", + "integrity": "sha512-+vNeIFPH2hfcNL0AJk/ykJXoUCtR1YaDUZM+p3wZNU4Hq98gzq+7b43xbkXjadD9VhWIUQqEwXyY64q6msPj6A==", "requires": { - "@opentelemetry/core": "1.21.0", - "@opentelemetry/semantic-conventions": "1.21.0" + "@opentelemetry/core": "1.22.0", + "@opentelemetry/semantic-conventions": "1.22.0" } }, "@opentelemetry/sdk-logs": { - "version": "0.48.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.48.0.tgz", - "integrity": "sha512-lRcA5/qkSJuSh4ItWCddhdn/nNbVvnzM+cm9Fg1xpZUeTeozjJDBcHnmeKoOaWRnrGYBdz6UTY6bynZR9aBeAA==", + "version": "0.49.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.49.1.tgz", + "integrity": "sha512-gCzYWsJE0h+3cuh3/cK+9UwlVFyHvj3PReIOCDOmdeXOp90ZjKRoDOJBc3mvk1LL6wyl1RWIivR8Rg9OToyesw==", "requires": { - "@opentelemetry/core": "1.21.0", - "@opentelemetry/resources": "1.21.0" + "@opentelemetry/core": "1.22.0", + "@opentelemetry/resources": "1.22.0" } }, "@opentelemetry/sdk-metrics": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-1.21.0.tgz", - "integrity": "sha512-on1jTzIHc5DyWhRP+xpf+zrgrREXcHBH4EDAfaB5mIG7TWpKxNXooQ1JCylaPsswZUv4wGnVTinr4HrBdGARAQ==", + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-1.22.0.tgz", + "integrity": "sha512-k6iIx6H3TZ+BVMr2z8M16ri2OxWaljg5h8ihGJxi/KQWcjign6FEaEzuigXt5bK9wVEhqAcWLCfarSftaNWkkg==", "requires": { - "@opentelemetry/core": "1.21.0", - "@opentelemetry/resources": "1.21.0", + "@opentelemetry/core": "1.22.0", + "@opentelemetry/resources": "1.22.0", "lodash.merge": "^4.6.2" } }, "@opentelemetry/sdk-node": { - "version": "0.48.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-node/-/sdk-node-0.48.0.tgz", - "integrity": "sha512-3o3GS6t+VLGVFCV5bqfGOcWIgOdkR/UE6Qz7hHksP5PXrVBeYsPqts7cPma5YXweaI3r3h26mydg9PqQIcqksg==", + "version": "0.49.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-node/-/sdk-node-0.49.1.tgz", + "integrity": "sha512-feBIT85ndiSHXsQ2gfGpXC/sNeX4GCHLksC4A9s/bfpUbbgbCSl0RvzZlmEpCHarNrkZMwFRi4H0xFfgvJEjrg==", "requires": { - "@opentelemetry/api-logs": "0.48.0", - "@opentelemetry/core": "1.21.0", - "@opentelemetry/exporter-trace-otlp-grpc": "0.48.0", - "@opentelemetry/exporter-trace-otlp-http": "0.48.0", - "@opentelemetry/exporter-trace-otlp-proto": "0.48.0", - "@opentelemetry/exporter-zipkin": "1.21.0", - "@opentelemetry/instrumentation": "0.48.0", - "@opentelemetry/resources": "1.21.0", - "@opentelemetry/sdk-logs": "0.48.0", - "@opentelemetry/sdk-metrics": "1.21.0", - "@opentelemetry/sdk-trace-base": "1.21.0", - "@opentelemetry/sdk-trace-node": "1.21.0", - "@opentelemetry/semantic-conventions": "1.21.0" + "@opentelemetry/api-logs": "0.49.1", + "@opentelemetry/core": "1.22.0", + "@opentelemetry/exporter-trace-otlp-grpc": "0.49.1", + "@opentelemetry/exporter-trace-otlp-http": "0.49.1", + "@opentelemetry/exporter-trace-otlp-proto": "0.49.1", + "@opentelemetry/exporter-zipkin": "1.22.0", + "@opentelemetry/instrumentation": "0.49.1", + "@opentelemetry/resources": "1.22.0", + "@opentelemetry/sdk-logs": "0.49.1", + "@opentelemetry/sdk-metrics": "1.22.0", + "@opentelemetry/sdk-trace-base": "1.22.0", + "@opentelemetry/sdk-trace-node": "1.22.0", + "@opentelemetry/semantic-conventions": "1.22.0" } }, "@opentelemetry/sdk-trace-base": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.21.0.tgz", - "integrity": "sha512-yrElGX5Fv0umzp8Nxpta/XqU71+jCAyaLk34GmBzNcrW43nqbrqvdPs4gj4MVy/HcTjr6hifCDCYA3rMkajxxA==", + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.22.0.tgz", + "integrity": "sha512-pfTuSIpCKONC6vkTpv6VmACxD+P1woZf4q0K46nSUvXFvOFqjBYKFaAMkKD3M1mlKUUh0Oajwj35qNjMl80m1Q==", "requires": { - "@opentelemetry/core": "1.21.0", - "@opentelemetry/resources": "1.21.0", - "@opentelemetry/semantic-conventions": "1.21.0" + "@opentelemetry/core": "1.22.0", + "@opentelemetry/resources": "1.22.0", + "@opentelemetry/semantic-conventions": "1.22.0" } }, "@opentelemetry/sdk-trace-node": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-node/-/sdk-trace-node-1.21.0.tgz", - "integrity": "sha512-1pdm8jnqs+LuJ0Bvx6sNL28EhC8Rv7NYV8rnoXq3GIQo7uOHBDAFSj7makAfbakrla7ecO1FRfI8emnR4WvhYA==", + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-node/-/sdk-trace-node-1.22.0.tgz", + "integrity": "sha512-gTGquNz7ue8uMeiWPwp3CU321OstQ84r7PCDtOaCicjbJxzvO8RZMlEC4geOipTeiF88kss5n6w+//A0MhP1lQ==", "requires": { - "@opentelemetry/context-async-hooks": "1.21.0", - "@opentelemetry/core": "1.21.0", - "@opentelemetry/propagator-b3": "1.21.0", - "@opentelemetry/propagator-jaeger": "1.21.0", - "@opentelemetry/sdk-trace-base": "1.21.0", + "@opentelemetry/context-async-hooks": "1.22.0", + "@opentelemetry/core": "1.22.0", + "@opentelemetry/propagator-b3": "1.22.0", + "@opentelemetry/propagator-jaeger": "1.22.0", + "@opentelemetry/sdk-trace-base": "1.22.0", "semver": "^7.5.2" } }, "@opentelemetry/semantic-conventions": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.21.0.tgz", - "integrity": "sha512-lkC8kZYntxVKr7b8xmjCVUgE0a8xgDakPyDo9uSWavXPyYqLgYYGdEd2j8NxihRyb6UwpX3G/hFUF4/9q2V+/g==" + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.22.0.tgz", + "integrity": "sha512-CAOgFOKLybd02uj/GhCdEeeBjOS0yeoDeo/CA7ASBSmenpZHAKGB3iDm/rv3BQLcabb/OprDEsSQ1y0P8A7Siw==" }, "@opentelemetry/sql-common": { "version": "0.40.0", diff --git a/server/package.json b/server/package.json index 1d045b82a..0acd97837 100644 --- a/server/package.json +++ b/server/package.json @@ -45,9 +45,9 @@ "@nestjs/swagger": "^7.1.8", "@nestjs/typeorm": "^10.0.0", "@nestjs/websockets": "^10.2.2", - "@opentelemetry/auto-instrumentations-node": "^0.41.1", - "@opentelemetry/exporter-prometheus": "^0.48.0", - "@opentelemetry/sdk-node": "^0.48.0", + "@opentelemetry/auto-instrumentations-node": "^0.42.0", + "@opentelemetry/exporter-prometheus": "^0.49.0", + "@opentelemetry/sdk-node": "^0.49.0", "@socket.io/postgres-adapter": "^0.3.1", "@types/picomatch": "^2.3.3", "archiver": "^7.0.0", From 37e5b91dc29da67575e4584a6645bbebfa91d08e Mon Sep 17 00:00:00 2001 From: Andrew Rowson Date: Wed, 13 Mar 2024 17:13:56 +0000 Subject: [PATCH 41/45] fix(server): ml gunicorn listen on ipv4 and ipv6 by default (#7930) --- machine-learning/start.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/machine-learning/start.sh b/machine-learning/start.sh index 082bf205c..d4a971f0c 100755 --- a/machine-learning/start.sh +++ b/machine-learning/start.sh @@ -4,7 +4,7 @@ lib_path="/usr/lib/$(arch)-linux-gnu/libmimalloc.so.2" export LD_PRELOAD="$lib_path" export LD_BIND_NOW=1 -: "${MACHINE_LEARNING_HOST:=0.0.0.0}" +: "${MACHINE_LEARNING_HOST:=[::]}" : "${MACHINE_LEARNING_PORT:=3003}" : "${MACHINE_LEARNING_WORKERS:=1}" : "${MACHINE_LEARNING_WORKER_TIMEOUT:=120}" From 29c3a826c5510f8dea44ed97ee8e5896fa869c51 Mon Sep 17 00:00:00 2001 From: Kokul Shanmugharajah Date: Wed, 13 Mar 2024 10:14:26 -0700 Subject: [PATCH 42/45] feat(server): Update XMP sidecar search to look for both photo.ext.xmp and photo.xmp (#7813) * Add support for photo.xmp sidecars * format * Add comment * Proper handling * Handle mocking better * Address PR feedback * Add test coverage if both xmp files exist * Update server/src/domain/metadata/metadata.service.ts Co-authored-by: Jason Rasmussen * Update server/src/domain/metadata/metadata.service.ts Co-authored-by: Jason Rasmussen * Update server/src/domain/metadata/metadata.service.ts Co-authored-by: Jason Rasmussen --------- Co-authored-by: Alex Co-authored-by: Jason Rasmussen --- .../domain/metadata/metadata.service.spec.ts | 37 ++++++++++++++++++- .../src/domain/metadata/metadata.service.ts | 27 ++++++++++++-- server/test/fixtures/asset.stub.ts | 36 ++++++++++++++++++ 3 files changed, 95 insertions(+), 5 deletions(-) diff --git a/server/src/domain/metadata/metadata.service.spec.ts b/server/src/domain/metadata/metadata.service.spec.ts index 3da9ba371..36315cf72 100644 --- a/server/src/domain/metadata/metadata.service.spec.ts +++ b/server/src/domain/metadata/metadata.service.spec.ts @@ -646,7 +646,7 @@ describe(MetadataService.name, () => { expect(assetMock.save).not.toHaveBeenCalled(); }); - it('should set sidecar path if exists', async () => { + it('should set sidecar path if exists (sidecar named photo.ext.xmp)', async () => { assetMock.getByIds.mockResolvedValue([assetStub.sidecar]); storageMock.checkFileExists.mockResolvedValue(true); @@ -658,6 +658,41 @@ describe(MetadataService.name, () => { }); }); + it('should set sidecar path if exists (sidecar named photo.xmp)', async () => { + assetMock.getByIds.mockResolvedValue([assetStub.sidecarWithoutExt]); + storageMock.checkFileExists.mockResolvedValueOnce(false); + storageMock.checkFileExists.mockResolvedValueOnce(true); + + await expect(sut.handleSidecarSync({ id: assetStub.sidecarWithoutExt.id })).resolves.toBe(true); + expect(storageMock.checkFileExists).toHaveBeenNthCalledWith( + 2, + assetStub.sidecarWithoutExt.sidecarPath, + constants.R_OK, + ); + expect(assetMock.save).toHaveBeenCalledWith({ + id: assetStub.sidecarWithoutExt.id, + sidecarPath: assetStub.sidecarWithoutExt.sidecarPath, + }); + }); + + it('should set sidecar path if exists (two sidecars named photo.ext.xmp and photo.xmp, should pick photo.ext.xmp)', async () => { + assetMock.getByIds.mockResolvedValue([assetStub.sidecar]); + storageMock.checkFileExists.mockResolvedValueOnce(true); + storageMock.checkFileExists.mockResolvedValueOnce(true); + + await expect(sut.handleSidecarSync({ id: assetStub.sidecar.id })).resolves.toBe(true); + expect(storageMock.checkFileExists).toHaveBeenNthCalledWith(1, assetStub.sidecar.sidecarPath, constants.R_OK); + expect(storageMock.checkFileExists).toHaveBeenNthCalledWith( + 2, + assetStub.sidecarWithoutExt.sidecarPath, + constants.R_OK, + ); + expect(assetMock.save).toHaveBeenCalledWith({ + id: assetStub.sidecar.id, + sidecarPath: assetStub.sidecar.sidecarPath, + }); + }); + it('should unset sidecar path if file does not exist anymore', async () => { assetMock.getByIds.mockResolvedValue([assetStub.sidecar]); storageMock.checkFileExists.mockResolvedValue(false); diff --git a/server/src/domain/metadata/metadata.service.ts b/server/src/domain/metadata/metadata.service.ts index 7d2248511..39919f78f 100644 --- a/server/src/domain/metadata/metadata.service.ts +++ b/server/src/domain/metadata/metadata.service.ts @@ -6,6 +6,7 @@ import { firstDateTime } from 'exiftool-vendored/dist/FirstDateTime'; import _ from 'lodash'; import { Duration } from 'luxon'; import { constants } from 'node:fs/promises'; +import path from 'node:path'; import { Subscription } from 'rxjs'; import { handlePromiseError, usePagination } from '../domain.util'; import { IBaseJob, IEntityJob, ISidecarWriteJob, JOBS_ASSET_PAGINATION_SIZE, JobName, QueueName } from '../job'; @@ -566,9 +567,25 @@ export class MetadataService { return false; } - const sidecarPath = `${asset.originalPath}.xmp`; - const exists = await this.storageRepository.checkFileExists(sidecarPath, constants.R_OK); - if (exists) { + // XMP sidecars can come in two filename formats. For a photo named photo.ext, the filenames are photo.ext.xmp and photo.xmp + const assetPath = path.parse(asset.originalPath); + const assetPathWithoutExt = path.join(assetPath.dir, assetPath.name); + const sidecarPathWithoutExt = `${assetPathWithoutExt}.xmp`; + const sidecarPathWithExt = `${asset.originalPath}.xmp`; + + const [sidecarPathWithExtExists, sidecarPathWithoutExtExists] = await Promise.all([ + this.storageRepository.checkFileExists(sidecarPathWithExt, constants.R_OK), + this.storageRepository.checkFileExists(sidecarPathWithoutExt, constants.R_OK), + ]); + + let sidecarPath = null; + if (sidecarPathWithExtExists) { + sidecarPath = sidecarPathWithExt; + } else if (sidecarPathWithoutExtExists) { + sidecarPath = sidecarPathWithoutExt; + } + + if (sidecarPath) { await this.assetRepository.save({ id: asset.id, sidecarPath }); return true; } @@ -577,7 +594,9 @@ export class MetadataService { return false; } - this.logger.debug(`Sidecar File '${sidecarPath}' was not found, removing sidecarPath for asset ${asset.id}`); + this.logger.debug( + `Sidecar file was not found. Checked paths '${sidecarPathWithExt}' and '${sidecarPathWithoutExt}'. Removing sidecarPath for asset ${asset.id}`, + ); await this.assetRepository.save({ id: asset.id, sidecarPath: null }); return true; diff --git a/server/test/fixtures/asset.stub.ts b/server/test/fixtures/asset.stub.ts index ea1617d6a..d72a295d4 100644 --- a/server/test/fixtures/asset.stub.ts +++ b/server/test/fixtures/asset.stub.ts @@ -524,6 +524,42 @@ export const assetStub = { sidecarPath: '/original/path.ext.xmp', deletedAt: null, }), + sidecarWithoutExt: Object.freeze({ + id: 'asset-id', + deviceAssetId: 'device-asset-id', + fileModifiedAt: new Date('2023-02-23T05:06:29.716Z'), + fileCreatedAt: new Date('2023-02-23T05:06:29.716Z'), + owner: userStub.user1, + ownerId: 'user-id', + deviceId: 'device-id', + originalPath: '/original/path.ext', + resizePath: '/uploads/user-id/thumbs/path.ext', + thumbhash: null, + checksum: Buffer.from('file hash', 'utf8'), + type: AssetType.IMAGE, + webpPath: null, + encodedVideoPath: null, + createdAt: new Date('2023-02-23T05:06:29.716Z'), + updatedAt: new Date('2023-02-23T05:06:29.716Z'), + localDateTime: new Date('2023-02-23T05:06:29.716Z'), + isFavorite: true, + isArchived: false, + isReadOnly: false, + isExternal: false, + isOffline: false, + libraryId: 'library-id', + library: libraryStub.uploadLibrary1, + duration: null, + isVisible: true, + livePhotoVideo: null, + livePhotoVideoId: null, + tags: [], + sharedLinks: [], + originalFileName: 'asset-id.ext', + faces: [], + sidecarPath: '/original/path.xmp', + deletedAt: null, + }), readOnly: Object.freeze({ id: 'read-only-asset', From ff2f4f8ed8dcdc6105d824288a3df7d76f0d4946 Mon Sep 17 00:00:00 2001 From: Alex Date: Wed, 13 Mar 2024 12:14:45 -0500 Subject: [PATCH 43/45] feat(web): update logo (#7798) * feat(web): update logo * favicon * no text logo on small screen * correct break point --- .../lib/assets/immich-logo-inline-dark.svg | 63 ++++++++++ .../lib/assets/immich-logo-inline-light.svg | 62 +++++++++ web/src/lib/assets/immich-logo-no-outline.png | Bin 147005 -> 0 bytes .../lib/assets/immich-logo-stacked-dark.svg | 66 ++++++++++ .../lib/assets/immich-logo-stacked-light.svg | 66 ++++++++++ web/src/lib/assets/immich-logo.svg | 119 ++++-------------- .../components/album-page/album-viewer.svelte | 5 +- .../album-page/user-selection-modal.svelte | 2 +- .../components/forms/create-user-form.svelte | 2 +- .../onboarding-page/onboarding-hello.svelte | 2 +- .../individual-shared-viewer.svelte | 5 +- .../drag-and-drop-upload-overlay.svelte | 2 +- .../shared-components/immich-logo.svelte | 14 ++- .../navigation-bar/navigation-bar.svelte | 11 +- .../upload-asset-preview.svelte | 2 +- .../version-announcement-box.svelte | 4 +- .../partner-selection-modal.svelte | 2 +- .../routes/(user)/share/[key]/+page.svelte | 5 +- web/src/routes/+error.svelte | 3 +- web/src/routes/+page.svelte | 6 +- web/static/apple-icon-180.png | Bin 16637 -> 6358 bytes web/static/favicon-144.png | Bin 16150 -> 5143 bytes web/static/favicon-16.png | Bin 826 -> 635 bytes web/static/favicon-32.png | Bin 2243 -> 1218 bytes web/static/favicon-48.png | Bin 3956 -> 1791 bytes web/static/favicon-96.png | Bin 9808 -> 3474 bytes web/static/favicon.ico | Bin 1150 -> 1150 bytes web/static/favicon.png | Bin 47356 -> 6358 bytes web/static/immich-logo.svg | 104 ++------------- web/static/manifest-icon-192.maskable.png | Bin 17875 -> 5198 bytes web/static/manifest-icon-512.maskable.png | Bin 56021 -> 13544 bytes 31 files changed, 322 insertions(+), 223 deletions(-) create mode 100644 web/src/lib/assets/immich-logo-inline-dark.svg create mode 100644 web/src/lib/assets/immich-logo-inline-light.svg delete mode 100644 web/src/lib/assets/immich-logo-no-outline.png create mode 100644 web/src/lib/assets/immich-logo-stacked-dark.svg create mode 100644 web/src/lib/assets/immich-logo-stacked-light.svg diff --git a/web/src/lib/assets/immich-logo-inline-dark.svg b/web/src/lib/assets/immich-logo-inline-dark.svg new file mode 100644 index 000000000..024337c2e --- /dev/null +++ b/web/src/lib/assets/immich-logo-inline-dark.svg @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/web/src/lib/assets/immich-logo-inline-light.svg b/web/src/lib/assets/immich-logo-inline-light.svg new file mode 100644 index 000000000..216466f58 --- /dev/null +++ b/web/src/lib/assets/immich-logo-inline-light.svg @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/web/src/lib/assets/immich-logo-no-outline.png b/web/src/lib/assets/immich-logo-no-outline.png deleted file mode 100644 index d4e7085f125b64dd053be71b9616f600feea5c00..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 147005 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°D%YtQTXO5y?v7Ir&{5T_9~G{z@loK`8KCw!FU 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%0DRIcS0{7JAFqvK!dJ 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

IMMICH

+ + diff --git a/web/src/lib/components/album-page/user-selection-modal.svelte b/web/src/lib/components/album-page/user-selection-modal.svelte index 03f662c84..b7c0b53b6 100644 --- a/web/src/lib/components/album-page/user-selection-modal.svelte +++ b/web/src/lib/components/album-page/user-selection-modal.svelte @@ -58,7 +58,7 @@ dispatch('close')}> - +

Invite to album

diff --git a/web/src/lib/components/forms/create-user-form.svelte b/web/src/lib/components/forms/create-user-form.svelte index 00188ec2e..1f612af15 100644 --- a/web/src/lib/components/forms/create-user-form.svelte +++ b/web/src/lib/components/forms/create-user-form.svelte @@ -73,7 +73,7 @@ class="max-h-screen w-[500px] max-w-[95vw] overflow-y-auto immich-scrollbar rounded-3xl border bg-immich-bg p-4 py-8 shadow-sm dark:border-immich-dark-gray dark:bg-immich-dark-gray dark:text-immich-dark-fg" >
- +

Create new user

diff --git a/web/src/lib/components/onboarding-page/onboarding-hello.svelte b/web/src/lib/components/onboarding-page/onboarding-hello.svelte index 8794d11cc..00485fadf 100644 --- a/web/src/lib/components/onboarding-page/onboarding-hello.svelte +++ b/web/src/lib/components/onboarding-page/onboarding-hello.svelte @@ -13,7 +13,7 @@ - +

Welcome, {$user.name}

diff --git a/web/src/lib/components/share-page/individual-shared-viewer.svelte b/web/src/lib/components/share-page/individual-shared-viewer.svelte index b587f1e13..88c9213be 100644 --- a/web/src/lib/components/share-page/individual-shared-viewer.svelte +++ b/web/src/lib/components/share-page/individual-shared-viewer.svelte @@ -82,9 +82,8 @@ {:else} goto(AppRoute.PHOTOS)} backIcon={mdiArrowLeft} showBackButton={false}> - - -

IMMICH

+
+
diff --git a/web/src/lib/components/shared-components/drag-and-drop-upload-overlay.svelte b/web/src/lib/components/shared-components/drag-and-drop-upload-overlay.svelte index c93246718..c4ecb5fb1 100644 --- a/web/src/lib/components/shared-components/drag-and-drop-upload-overlay.svelte +++ b/web/src/lib/components/shared-components/drag-and-drop-upload-overlay.svelte @@ -34,7 +34,7 @@ e.preventDefault(); }} > - +
Drop files anywhere to upload

VRr0302)sgA^e#l|vQte`If0 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 + + + + + + + + + + + + + + + + + + + diff --git a/web/src/lib/assets/immich-logo-stacked-light.svg b/web/src/lib/assets/immich-logo-stacked-light.svg new file mode 100644 index 000000000..8c4505d97 --- /dev/null +++ b/web/src/lib/assets/immich-logo-stacked-light.svg @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/web/src/lib/assets/immich-logo.svg b/web/src/lib/assets/immich-logo.svg index e7edba069..376fa6f3e 100644 --- a/web/src/lib/assets/immich-logo.svg +++ b/web/src/lib/assets/immich-logo.svg @@ -1,98 +1,29 @@ - - + + - - - - - - - - - - - - - - - - + + + + + + + diff --git a/web/src/lib/components/album-page/album-viewer.svelte b/web/src/lib/components/album-page/album-viewer.svelte index 9897125bc..ab5eb91d5 100644 --- a/web/src/lib/components/album-page/album-viewer.svelte +++ b/web/src/lib/components/album-page/album-viewer.svelte @@ -87,9 +87,8 @@ {:else} - - -

{/if} diff --git a/web/src/lib/components/shared-components/immich-logo.svelte b/web/src/lib/components/shared-components/immich-logo.svelte index e3881c5b3..a8e832a41 100644 --- a/web/src/lib/components/shared-components/immich-logo.svelte +++ b/web/src/lib/components/shared-components/immich-logo.svelte @@ -1,7 +1,17 @@ -Immich Logo +Immich Logo diff --git a/web/src/lib/components/shared-components/navigation-bar/navigation-bar.svelte b/web/src/lib/components/shared-components/navigation-bar/navigation-bar.svelte index 9edfd74b3..43834c648 100644 --- a/web/src/lib/components/shared-components/navigation-bar/navigation-bar.svelte +++ b/web/src/lib/components/shared-components/navigation-bar/navigation-bar.svelte @@ -23,7 +23,7 @@ let shouldShowAccountInfo = false; let shouldShowAccountInfoPanel = false; - + let innerWidth: number; const dispatch = createEventDispatcher<{ uploadClicked: void; }>(); @@ -39,16 +39,15 @@ }; + +
Skip to content
- - -

- IMMICH -

+
+