diff --git a/.env.example b/.env.example index 769e0fa8..ea107da9 100644 --- a/.env.example +++ b/.env.example @@ -16,3 +16,10 @@ CORS_WHITELIST=[CORS 정책에서 허용하는 도메인의 목록(e.g. ["http:/ GOOGLE_APPLICATION_CREDENTIALS=[GOOGLE_APPLICATION_CREDENTIALS JSON] TEST_ACCOUNTS=[스팍스SSO로 로그인시 무조건 테스트로 로그인이 가능한 허용 아이디 목록] SLACK_REPORT_WEBHOOK_URL=[Slack 웹훅 URL들이 담긴 JSON] + +# optional environment variables for taxiSampleGenerator +SAMPLE_NUM_OF_ROOMS=[방의 개수] +SAMPLE_NUM_OF_CHATS=[각 방의 채팅 개수] +SAMPLE_MAXIMUM_INTERVAL_BETWEEN_CHATS=[채팅 간 최대 시간 간격(단위: 초, 실수도 가능)] +SAMPLE_OCCURENCE_OF_JOIN=[새로운 채팅이 입장 메세지일 확률(0 ~ 1 사이의 값)] +SAMPLE_OCCURENCE_OF_ABORT=[새로운 채팅이 퇴장 메세지일 확률(0 ~ 1 사이의 값)] \ No newline at end of file diff --git a/.github/workflows/test_ci.yml b/.github/workflows/test_ci.yml index 29f7f21b..2ccc5415 100644 --- a/.github/workflows/test_ci.yml +++ b/.github/workflows/test_ci.yml @@ -29,20 +29,6 @@ jobs: with: node-version: ${{ matrix.node-version }} cache: 'pnpm' - - id: submodule-local - name: Save local version of submodule - run: echo "ver=`cd sampleGenerator && git log --pretty="%h" -1 && cd ..`" >> $GITHUB_OUTPUT - - id: submodule-origin - name: Save origin version of submodule - run: echo "ver=`cd sampleGenerator && git log origin --pretty="%h" -1 && cd ..`" >> $GITHUB_OUTPUT - - name: Check submodule version - if: ${{ steps.submodule-local.outputs.ver != steps.submodule-origin.outputs.ver }} - uses: actions/github-script@v3 - with: - script: | - core.setFailed('Please update submodule to the latest version by using \"git submodule update --remote\"') - - name: Install sampleGenerator dependencies from package-lock.json - run: cd sampleGenerator && pnpm i --force --frozen-lockfile && cd .. - name: Install taxi-back dependencies from package-lock.json run: pnpm i --force --frozen-lockfile - name: Run unit tests diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index f15db4d8..00000000 --- a/.gitmodules +++ /dev/null @@ -1,4 +0,0 @@ -[submodule "sampleGenerator"] - path = sampleGenerator - url = https://github.com/sparcs-kaist/taxiSampleGenerator - branch = main diff --git a/README.md b/README.md index 26cda418..9a335131 100644 --- a/README.md +++ b/README.md @@ -49,4 +49,3 @@ See [contributors](https://github.com/sparcs-kaist/taxi-front/graphs/contributor - app : https://github.com/sparcs-kaist/taxi-app - docker : https://github.com/sparcs-kaist/taxi-docker - figma : https://www.figma.com/file/li34hP1oStJAzLNjcG5KjN/SPARCS-Taxi?node-id=0%3A1 - - taxiSampleGenerator : https://github.com/sparcs-kaist/taxiSampleGenerator diff --git a/app.js b/app.js index 3394dec0..a26c4b46 100644 --- a/app.js +++ b/app.js @@ -1,7 +1,12 @@ // 모듈 require const express = require("express"); const http = require("http"); -const { port: httpPort, eventConfig } = require("./loadenv"); +const { + nodeEnv, + port: httpPort, + eventConfig, + mongo: mongoUrl, +} = require("./loadenv"); const logger = require("./src/modules/logger"); const { connectDatabase } = require("./src/modules/stores/mongo"); const { startSocketServer } = require("./src/modules/socket"); @@ -13,14 +18,14 @@ require("./src/modules/fcm").initializeApp(); const app = express(); // 데이터베이스 연결 -connectDatabase(); +connectDatabase(mongoUrl); // [Middleware] request body 파싱 app.use(express.urlencoded({ extended: false })); app.use(express.json()); // reverse proxy가 설정한 헤더를 신뢰합니다. -app.set("trust proxy", true); +if (nodeEnv === "production") app.set("trust proxy", 2); // [Middleware] CORS 설정 app.use(require("./src/middlewares/cors")); diff --git a/loadenv.js b/loadenv.js index a79692f8..13939bb6 100644 --- a/loadenv.js +++ b/loadenv.js @@ -1,9 +1,12 @@ // 환경 변수에 따라 .env.production 또는 .env.development 파일을 읽어옴 require("dotenv").config({ path: `./.env.${process.env.NODE_ENV}` }); module.exports = { - nodeEnv: process.env.NODE_ENV, + nodeEnv: process.env.NODE_ENV, // required mongo: process.env.DB_PATH, // required - session: process.env.SESSION_KEY || "TAXI_SESSION_KEY", // optional + session: { + secret: process.env.SESSION_KEY || "TAXI_SESSION_KEY", // optional + expiry: 14 * 24 * 3600 * 1000, // 14일, ms 단위입니다. + }, redis: process.env.REDIS_PATH, // optional sparcssso: { id: process.env.SPARCSSSO_CLIENT_ID || "", // optional diff --git a/package.json b/package.json index 3f1c9418..db1e5730 100644 --- a/package.json +++ b/package.json @@ -11,8 +11,9 @@ "test": "npm run sample && cross-env TZ='Asia/Seoul' npm run mocha", "mocha": "cross-env TZ='Asia/Seoul' NODE_ENV=test mocha --recursive --reporter spec --exit", "serve": "cross-env TZ='Asia/Seoul' NODE_ENV=production node app.js", + "runscript": "cross-env TZ='Asia/Seoul' NODE_ENV=production node", "lint": "npx eslint --fix .", - "sample": "cd sampleGenerator && npm start && cd .." + "sample": "cd src/sampleGenerator && npm start && cd .." }, "engines": { "node": ">=18.0.0", @@ -61,6 +62,7 @@ "eslint": "^8.22.0", "eslint-plugin-mocha": "^10.1.0", "mocha": "^10.2.0", + "mongodb": "^4.1.0", "nodemon": "^3.0.1", "supertest": "^6.2.4" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f7a570a2..0e0e8aea 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -7,19 +7,19 @@ settings: dependencies: '@adminjs/express': specifier: ^5.1.0 - version: 5.1.0(adminjs@6.8.7)(express-formidable@1.2.0)(express-session@1.17.3)(express@4.18.2)(tslib@2.6.1) + version: 5.1.0(adminjs@6.8.7)(express-formidable@1.2.0)(express-session@1.17.3)(express@4.18.2)(tslib@2.6.2) '@adminjs/mongoose': specifier: ^3.0.3 version: 3.0.3(adminjs@6.8.7)(mongoose@6.12.0) '@aws-sdk/client-s3': specifier: ^3.391.0 - version: 3.391.0 + version: 3.507.0 '@aws-sdk/client-ses': specifier: ^3.391.0 - version: 3.391.0 + version: 3.507.0 '@aws-sdk/s3-request-presigner': specifier: ^3.391.0 - version: 3.391.0 + version: 3.507.0 adminjs: specifier: ^6.8.7 version: 6.8.7 @@ -127,6 +127,9 @@ devDependencies: mocha: specifier: ^10.2.0 version: 10.2.0 + mongodb: + specifier: ^4.1.0 + version: 4.17.1 nodemon: specifier: ^3.0.1 version: 3.0.1 @@ -187,7 +190,7 @@ packages: - prop-types dev: false - /@adminjs/express@5.1.0(adminjs@6.8.7)(express-formidable@1.2.0)(express-session@1.17.3)(express@4.18.2)(tslib@2.6.1): + /@adminjs/express@5.1.0(adminjs@6.8.7)(express-formidable@1.2.0)(express-session@1.17.3)(express@4.18.2)(tslib@2.6.2): resolution: {integrity: sha512-+mrtDmoAYA9R+/FTYWOLL48g005yrgcAWC2phdwqGzznIxGKSp2YERcfzdTI7Svtnlaal72/QW8Q3OhzJjVLzQ==} peerDependencies: adminjs: '>=6.0.0' @@ -201,7 +204,7 @@ packages: express-formidable: 1.2.0 express-session: 1.17.3 path-to-regexp: 6.2.1 - tslib: 2.6.1 + tslib: 2.6.2 dev: false /@adminjs/mongoose@3.0.3(adminjs@6.8.7)(mongoose@6.12.0): @@ -226,25 +229,25 @@ packages: /@aws-crypto/crc32@3.0.0: resolution: {integrity: sha512-IzSgsrxUcsrejQbPVilIKy16kAT52EwB6zSaI+M3xxIhKh5+aldEyvI+z6erM7TCLB2BJsFrtHjp6/4/sr+3dA==} + requiresBuild: true dependencies: '@aws-crypto/util': 3.0.0 - '@aws-sdk/types': 3.391.0 + '@aws-sdk/types': 3.502.0 tslib: 1.14.1 - dev: false /@aws-crypto/crc32c@3.0.0: resolution: {integrity: sha512-ENNPPManmnVJ4BTXlOjAgD7URidbAznURqD0KvfREyc4o20DPYdEldU1f5cQ7Jbj0CJJSPaMIk/9ZshdB3210w==} dependencies: '@aws-crypto/util': 3.0.0 - '@aws-sdk/types': 3.391.0 + '@aws-sdk/types': 3.502.0 tslib: 1.14.1 dev: false /@aws-crypto/ie11-detection@3.0.0: resolution: {integrity: sha512-341lBBkiY1DfDNKai/wXM3aujNBkXR7tq1URPQDL9wi3AUbI80NR74uF1TXHMm7po1AcnFk8iu2S2IeU/+/A+Q==} + requiresBuild: true dependencies: tslib: 1.14.1 - dev: false /@aws-crypto/sha1-browser@3.0.0: resolution: {integrity: sha512-NJth5c997GLHs6nOYTzFKTbYdMNA6/1XlKVgnZoaZcQ7z7UJlOgj2JdbHE8tiYLS3fzXNCguct77SPGat2raSw==} @@ -252,7 +255,7 @@ packages: '@aws-crypto/ie11-detection': 3.0.0 '@aws-crypto/supports-web-crypto': 3.0.0 '@aws-crypto/util': 3.0.0 - '@aws-sdk/types': 3.391.0 + '@aws-sdk/types': 3.502.0 '@aws-sdk/util-locate-window': 3.310.0 '@aws-sdk/util-utf8-browser': 3.259.0 tslib: 1.14.1 @@ -260,957 +263,1094 @@ packages: /@aws-crypto/sha256-browser@3.0.0: resolution: {integrity: sha512-8VLmW2B+gjFbU5uMeqtQM6Nj0/F1bro80xQXCW6CQBWgosFWXTx77aeOF5CAIAmbOK64SdMBJdNr6J41yP5mvQ==} + requiresBuild: true dependencies: '@aws-crypto/ie11-detection': 3.0.0 '@aws-crypto/sha256-js': 3.0.0 '@aws-crypto/supports-web-crypto': 3.0.0 '@aws-crypto/util': 3.0.0 - '@aws-sdk/types': 3.391.0 + '@aws-sdk/types': 3.502.0 '@aws-sdk/util-locate-window': 3.310.0 '@aws-sdk/util-utf8-browser': 3.259.0 tslib: 1.14.1 - dev: false /@aws-crypto/sha256-js@3.0.0: resolution: {integrity: sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ==} + requiresBuild: true dependencies: '@aws-crypto/util': 3.0.0 - '@aws-sdk/types': 3.391.0 + '@aws-sdk/types': 3.502.0 tslib: 1.14.1 - dev: false /@aws-crypto/supports-web-crypto@3.0.0: resolution: {integrity: sha512-06hBdMwUAb2WFTuGG73LSC0wfPu93xWwo5vL2et9eymgmu3Id5vFAHBbajVWiGhPO37qcsdCap/FqXvJGJWPIg==} + requiresBuild: true dependencies: tslib: 1.14.1 - dev: false /@aws-crypto/util@3.0.0: resolution: {integrity: sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==} + requiresBuild: true dependencies: - '@aws-sdk/types': 3.391.0 + '@aws-sdk/types': 3.502.0 '@aws-sdk/util-utf8-browser': 3.259.0 tslib: 1.14.1 - dev: false - /@aws-sdk/client-cognito-identity@3.385.0: - resolution: {integrity: sha512-fRXZhxvBBeK/Jxb+sLPhyQmcduNSugSKJDz474A/wLK5UIuDOnKhDTjsa0OXMpY5DkqwdYLwDcGZtxUbEZ8DCQ==} + /@aws-sdk/client-cognito-identity@3.427.0: + resolution: {integrity: sha512-9brRaNnl6haE7R3R43A5CSNw0k1YtB3xjuArbMg/p6NDUpvRSRgOVNWu2R02Yjh/j2ZuaLOCPLuCipb+PHQPKQ==} engines: {node: '>=14.0.0'} + requiresBuild: true dependencies: '@aws-crypto/sha256-browser': 3.0.0 '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/client-sts': 3.385.0 - '@aws-sdk/credential-provider-node': 3.385.0 - '@aws-sdk/middleware-host-header': 3.379.1 - '@aws-sdk/middleware-logger': 3.378.0 - '@aws-sdk/middleware-recursion-detection': 3.378.0 - '@aws-sdk/middleware-signing': 3.379.1 - '@aws-sdk/middleware-user-agent': 3.382.0 - '@aws-sdk/types': 3.378.0 - '@aws-sdk/util-endpoints': 3.382.0 - '@aws-sdk/util-user-agent-browser': 3.378.0 - '@aws-sdk/util-user-agent-node': 3.378.0 - '@smithy/config-resolver': 2.0.3 - '@smithy/fetch-http-handler': 2.0.3 - '@smithy/hash-node': 2.0.3 - '@smithy/invalid-dependency': 2.0.3 - '@smithy/middleware-content-length': 2.0.3 - '@smithy/middleware-endpoint': 2.0.3 - '@smithy/middleware-retry': 2.0.3 - '@smithy/middleware-serde': 2.0.3 - '@smithy/middleware-stack': 2.0.0 - '@smithy/node-config-provider': 2.0.3 - '@smithy/node-http-handler': 2.0.3 - '@smithy/protocol-http': 2.0.3 - '@smithy/smithy-client': 2.0.3 - '@smithy/types': 2.2.0 - '@smithy/url-parser': 2.0.3 + '@aws-sdk/client-sts': 3.427.0 + '@aws-sdk/credential-provider-node': 3.427.0 + '@aws-sdk/middleware-host-header': 3.425.0 + '@aws-sdk/middleware-logger': 3.425.0 + '@aws-sdk/middleware-recursion-detection': 3.425.0 + '@aws-sdk/middleware-signing': 3.425.0 + '@aws-sdk/middleware-user-agent': 3.427.0 + '@aws-sdk/region-config-resolver': 3.425.0 + '@aws-sdk/types': 3.425.0 + '@aws-sdk/util-endpoints': 3.427.0 + '@aws-sdk/util-user-agent-browser': 3.425.0 + '@aws-sdk/util-user-agent-node': 3.425.0 + '@smithy/config-resolver': 2.0.14 + '@smithy/fetch-http-handler': 2.2.2 + '@smithy/hash-node': 2.0.11 + '@smithy/invalid-dependency': 2.0.11 + '@smithy/middleware-content-length': 2.0.13 + '@smithy/middleware-endpoint': 2.0.11 + '@smithy/middleware-retry': 2.0.16 + '@smithy/middleware-serde': 2.0.11 + '@smithy/middleware-stack': 2.0.5 + '@smithy/node-config-provider': 2.1.1 + '@smithy/node-http-handler': 2.1.7 + '@smithy/protocol-http': 3.0.7 + '@smithy/smithy-client': 2.1.10 + '@smithy/types': 2.3.5 + '@smithy/url-parser': 2.0.11 '@smithy/util-base64': 2.0.0 '@smithy/util-body-length-browser': 2.0.0 - '@smithy/util-body-length-node': 2.0.0 - '@smithy/util-defaults-mode-browser': 2.0.3 - '@smithy/util-defaults-mode-node': 2.0.3 - '@smithy/util-retry': 2.0.0 + '@smithy/util-body-length-node': 2.1.0 + '@smithy/util-defaults-mode-browser': 2.0.14 + '@smithy/util-defaults-mode-node': 2.0.18 + '@smithy/util-retry': 2.0.4 '@smithy/util-utf8': 2.0.0 - tslib: 2.6.1 + tslib: 2.6.2 transitivePeerDependencies: - aws-crt - dev: false optional: true - /@aws-sdk/client-s3@3.391.0: - resolution: {integrity: sha512-QGRcawQFYM/WtaKgr15oi2xzoqhniqp9aAGDVW+iClbOtMfXr2o79RDqPGKge+uQsmw2we0qgvphypDm7RMMgw==} + /@aws-sdk/client-s3@3.507.0: + resolution: {integrity: sha512-rRLiC5Ly3e7kZVNoRsG6JhZ8Yat5uEnDeShdWNdHchyTO88AaEnHaeyiVG9ecmKI8jYl6NbWSHB8xL0l9KIr/w==} engines: {node: '>=14.0.0'} dependencies: '@aws-crypto/sha1-browser': 3.0.0 '@aws-crypto/sha256-browser': 3.0.0 '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/client-sts': 3.391.0 - '@aws-sdk/credential-provider-node': 3.391.0 - '@aws-sdk/middleware-bucket-endpoint': 3.391.0 - '@aws-sdk/middleware-expect-continue': 3.391.0 - '@aws-sdk/middleware-flexible-checksums': 3.391.0 - '@aws-sdk/middleware-host-header': 3.391.0 - '@aws-sdk/middleware-location-constraint': 3.391.0 - '@aws-sdk/middleware-logger': 3.391.0 - '@aws-sdk/middleware-recursion-detection': 3.391.0 - '@aws-sdk/middleware-sdk-s3': 3.391.0 - '@aws-sdk/middleware-signing': 3.391.0 - '@aws-sdk/middleware-ssec': 3.391.0 - '@aws-sdk/middleware-user-agent': 3.391.0 - '@aws-sdk/signature-v4-multi-region': 3.391.0 - '@aws-sdk/types': 3.391.0 - '@aws-sdk/util-endpoints': 3.391.0 - '@aws-sdk/util-user-agent-browser': 3.391.0 - '@aws-sdk/util-user-agent-node': 3.391.0 - '@aws-sdk/xml-builder': 3.310.0 - '@smithy/config-resolver': 2.0.3 - '@smithy/eventstream-serde-browser': 2.0.3 - '@smithy/eventstream-serde-config-resolver': 2.0.3 - '@smithy/eventstream-serde-node': 2.0.3 - '@smithy/fetch-http-handler': 2.0.3 - '@smithy/hash-blob-browser': 2.0.3 - '@smithy/hash-node': 2.0.3 - '@smithy/hash-stream-node': 2.0.3 - '@smithy/invalid-dependency': 2.0.3 - '@smithy/md5-js': 2.0.3 - '@smithy/middleware-content-length': 2.0.3 - '@smithy/middleware-endpoint': 2.0.3 - '@smithy/middleware-retry': 2.0.3 - '@smithy/middleware-serde': 2.0.3 - '@smithy/middleware-stack': 2.0.0 - '@smithy/node-config-provider': 2.0.3 - '@smithy/node-http-handler': 2.0.3 - '@smithy/protocol-http': 2.0.3 - '@smithy/smithy-client': 2.0.3 - '@smithy/types': 2.2.0 - '@smithy/url-parser': 2.0.3 - '@smithy/util-base64': 2.0.0 - '@smithy/util-body-length-browser': 2.0.0 - '@smithy/util-body-length-node': 2.0.0 - '@smithy/util-defaults-mode-browser': 2.0.3 - '@smithy/util-defaults-mode-node': 2.0.3 - '@smithy/util-retry': 2.0.0 - '@smithy/util-stream': 2.0.3 - '@smithy/util-utf8': 2.0.0 - '@smithy/util-waiter': 2.0.3 + '@aws-sdk/client-sts': 3.507.0(@aws-sdk/credential-provider-node@3.507.0) + '@aws-sdk/core': 3.496.0 + '@aws-sdk/credential-provider-node': 3.507.0 + '@aws-sdk/middleware-bucket-endpoint': 3.502.0 + '@aws-sdk/middleware-expect-continue': 3.502.0 + '@aws-sdk/middleware-flexible-checksums': 3.502.0 + '@aws-sdk/middleware-host-header': 3.502.0 + '@aws-sdk/middleware-location-constraint': 3.502.0 + '@aws-sdk/middleware-logger': 3.502.0 + '@aws-sdk/middleware-recursion-detection': 3.502.0 + '@aws-sdk/middleware-sdk-s3': 3.502.0 + '@aws-sdk/middleware-signing': 3.502.0 + '@aws-sdk/middleware-ssec': 3.502.0 + '@aws-sdk/middleware-user-agent': 3.502.0 + '@aws-sdk/region-config-resolver': 3.502.0 + '@aws-sdk/signature-v4-multi-region': 3.502.0 + '@aws-sdk/types': 3.502.0 + '@aws-sdk/util-endpoints': 3.502.0 + '@aws-sdk/util-user-agent-browser': 3.502.0 + '@aws-sdk/util-user-agent-node': 3.502.0 + '@aws-sdk/xml-builder': 3.496.0 + '@smithy/config-resolver': 2.1.1 + '@smithy/core': 1.3.1 + '@smithy/eventstream-serde-browser': 2.1.1 + '@smithy/eventstream-serde-config-resolver': 2.1.1 + '@smithy/eventstream-serde-node': 2.1.1 + '@smithy/fetch-http-handler': 2.4.1 + '@smithy/hash-blob-browser': 2.1.1 + '@smithy/hash-node': 2.1.1 + '@smithy/hash-stream-node': 2.1.1 + '@smithy/invalid-dependency': 2.1.1 + '@smithy/md5-js': 2.1.1 + '@smithy/middleware-content-length': 2.1.1 + '@smithy/middleware-endpoint': 2.4.1 + '@smithy/middleware-retry': 2.1.1 + '@smithy/middleware-serde': 2.1.1 + '@smithy/middleware-stack': 2.1.1 + '@smithy/node-config-provider': 2.2.1 + '@smithy/node-http-handler': 2.3.1 + '@smithy/protocol-http': 3.1.1 + '@smithy/smithy-client': 2.3.1 + '@smithy/types': 2.9.1 + '@smithy/url-parser': 2.1.1 + '@smithy/util-base64': 2.1.1 + '@smithy/util-body-length-browser': 2.1.1 + '@smithy/util-body-length-node': 2.2.1 + '@smithy/util-defaults-mode-browser': 2.1.1 + '@smithy/util-defaults-mode-node': 2.1.1 + '@smithy/util-endpoints': 1.1.1 + '@smithy/util-retry': 2.1.1 + '@smithy/util-stream': 2.1.1 + '@smithy/util-utf8': 2.1.1 + '@smithy/util-waiter': 2.1.1 fast-xml-parser: 4.2.5 - tslib: 2.6.1 + tslib: 2.6.2 transitivePeerDependencies: - - '@aws-sdk/signature-v4-crt' - aws-crt dev: false - /@aws-sdk/client-ses@3.391.0: - resolution: {integrity: sha512-FWSFRGtwykNQaqCov7YxHrCAIxy7NIhoffeNkGVvxPRcu4zzvvgqiGaBMfm2tyT/j6n91xp+I1kj/Zs+RjTBhA==} + /@aws-sdk/client-ses@3.507.0: + resolution: {integrity: sha512-eX/OHHA4Zk7EgsaPnL4sQmghekipmiGJBm/E+JEoiaBoPJOPj0q28pnJKm6rMVUnhddaQZUuAYw9cSCyT3zoDg==} engines: {node: '>=14.0.0'} dependencies: '@aws-crypto/sha256-browser': 3.0.0 '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/client-sts': 3.391.0 - '@aws-sdk/credential-provider-node': 3.391.0 - '@aws-sdk/middleware-host-header': 3.391.0 - '@aws-sdk/middleware-logger': 3.391.0 - '@aws-sdk/middleware-recursion-detection': 3.391.0 - '@aws-sdk/middleware-signing': 3.391.0 - '@aws-sdk/middleware-user-agent': 3.391.0 - '@aws-sdk/types': 3.391.0 - '@aws-sdk/util-endpoints': 3.391.0 - '@aws-sdk/util-user-agent-browser': 3.391.0 - '@aws-sdk/util-user-agent-node': 3.391.0 - '@smithy/config-resolver': 2.0.3 - '@smithy/fetch-http-handler': 2.0.3 - '@smithy/hash-node': 2.0.3 - '@smithy/invalid-dependency': 2.0.3 - '@smithy/middleware-content-length': 2.0.3 - '@smithy/middleware-endpoint': 2.0.3 - '@smithy/middleware-retry': 2.0.3 - '@smithy/middleware-serde': 2.0.3 - '@smithy/middleware-stack': 2.0.0 - '@smithy/node-config-provider': 2.0.3 - '@smithy/node-http-handler': 2.0.3 - '@smithy/protocol-http': 2.0.3 - '@smithy/smithy-client': 2.0.3 - '@smithy/types': 2.2.0 - '@smithy/url-parser': 2.0.3 - '@smithy/util-base64': 2.0.0 - '@smithy/util-body-length-browser': 2.0.0 - '@smithy/util-body-length-node': 2.0.0 - '@smithy/util-defaults-mode-browser': 2.0.3 - '@smithy/util-defaults-mode-node': 2.0.3 - '@smithy/util-retry': 2.0.0 - '@smithy/util-utf8': 2.0.0 - '@smithy/util-waiter': 2.0.3 + '@aws-sdk/client-sts': 3.507.0(@aws-sdk/credential-provider-node@3.507.0) + '@aws-sdk/core': 3.496.0 + '@aws-sdk/credential-provider-node': 3.507.0 + '@aws-sdk/middleware-host-header': 3.502.0 + '@aws-sdk/middleware-logger': 3.502.0 + '@aws-sdk/middleware-recursion-detection': 3.502.0 + '@aws-sdk/middleware-signing': 3.502.0 + '@aws-sdk/middleware-user-agent': 3.502.0 + '@aws-sdk/region-config-resolver': 3.502.0 + '@aws-sdk/types': 3.502.0 + '@aws-sdk/util-endpoints': 3.502.0 + '@aws-sdk/util-user-agent-browser': 3.502.0 + '@aws-sdk/util-user-agent-node': 3.502.0 + '@smithy/config-resolver': 2.1.1 + '@smithy/core': 1.3.1 + '@smithy/fetch-http-handler': 2.4.1 + '@smithy/hash-node': 2.1.1 + '@smithy/invalid-dependency': 2.1.1 + '@smithy/middleware-content-length': 2.1.1 + '@smithy/middleware-endpoint': 2.4.1 + '@smithy/middleware-retry': 2.1.1 + '@smithy/middleware-serde': 2.1.1 + '@smithy/middleware-stack': 2.1.1 + '@smithy/node-config-provider': 2.2.1 + '@smithy/node-http-handler': 2.3.1 + '@smithy/protocol-http': 3.1.1 + '@smithy/smithy-client': 2.3.1 + '@smithy/types': 2.9.1 + '@smithy/url-parser': 2.1.1 + '@smithy/util-base64': 2.1.1 + '@smithy/util-body-length-browser': 2.1.1 + '@smithy/util-body-length-node': 2.2.1 + '@smithy/util-defaults-mode-browser': 2.1.1 + '@smithy/util-defaults-mode-node': 2.1.1 + '@smithy/util-endpoints': 1.1.1 + '@smithy/util-retry': 2.1.1 + '@smithy/util-utf8': 2.1.1 + '@smithy/util-waiter': 2.1.1 fast-xml-parser: 4.2.5 - tslib: 2.6.1 + tslib: 2.6.2 transitivePeerDependencies: - aws-crt dev: false - /@aws-sdk/client-sso@3.382.0: - resolution: {integrity: sha512-ge11t4hJllOF8pBNF0p1X52lLqUsLGAoey24fvk3fyvvczeLpegGYh2kdLG0iwFTDgRxaUqK+kboH5Wy9ux/pw==} + /@aws-sdk/client-sso-oidc@3.507.0(@aws-sdk/credential-provider-node@3.507.0): + resolution: {integrity: sha512-ms5CH2ImhqqCIbo5irxayByuPOlVAmSiqDVfjZKwgIziqng2bVgNZMeKcT6t0bmrcgScEAVnZwY7j/iZTIw73g==} engines: {node: '>=14.0.0'} + peerDependencies: + '@aws-sdk/credential-provider-node': ^3.507.0 dependencies: '@aws-crypto/sha256-browser': 3.0.0 '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/middleware-host-header': 3.379.1 - '@aws-sdk/middleware-logger': 3.378.0 - '@aws-sdk/middleware-recursion-detection': 3.378.0 - '@aws-sdk/middleware-user-agent': 3.382.0 - '@aws-sdk/types': 3.378.0 - '@aws-sdk/util-endpoints': 3.382.0 - '@aws-sdk/util-user-agent-browser': 3.378.0 - '@aws-sdk/util-user-agent-node': 3.378.0 - '@smithy/config-resolver': 2.0.3 - '@smithy/fetch-http-handler': 2.0.3 - '@smithy/hash-node': 2.0.3 - '@smithy/invalid-dependency': 2.0.3 - '@smithy/middleware-content-length': 2.0.3 - '@smithy/middleware-endpoint': 2.0.3 - '@smithy/middleware-retry': 2.0.3 - '@smithy/middleware-serde': 2.0.3 - '@smithy/middleware-stack': 2.0.0 - '@smithy/node-config-provider': 2.0.3 - '@smithy/node-http-handler': 2.0.3 - '@smithy/protocol-http': 2.0.3 - '@smithy/smithy-client': 2.0.3 - '@smithy/types': 2.2.0 - '@smithy/url-parser': 2.0.3 - '@smithy/util-base64': 2.0.0 - '@smithy/util-body-length-browser': 2.0.0 - '@smithy/util-body-length-node': 2.0.0 - '@smithy/util-defaults-mode-browser': 2.0.3 - '@smithy/util-defaults-mode-node': 2.0.3 - '@smithy/util-retry': 2.0.0 - '@smithy/util-utf8': 2.0.0 - tslib: 2.6.1 + '@aws-sdk/client-sts': 3.507.0(@aws-sdk/credential-provider-node@3.507.0) + '@aws-sdk/core': 3.496.0 + '@aws-sdk/credential-provider-node': 3.507.0 + '@aws-sdk/middleware-host-header': 3.502.0 + '@aws-sdk/middleware-logger': 3.502.0 + '@aws-sdk/middleware-recursion-detection': 3.502.0 + '@aws-sdk/middleware-signing': 3.502.0 + '@aws-sdk/middleware-user-agent': 3.502.0 + '@aws-sdk/region-config-resolver': 3.502.0 + '@aws-sdk/types': 3.502.0 + '@aws-sdk/util-endpoints': 3.502.0 + '@aws-sdk/util-user-agent-browser': 3.502.0 + '@aws-sdk/util-user-agent-node': 3.502.0 + '@smithy/config-resolver': 2.1.1 + '@smithy/core': 1.3.1 + '@smithy/fetch-http-handler': 2.4.1 + '@smithy/hash-node': 2.1.1 + '@smithy/invalid-dependency': 2.1.1 + '@smithy/middleware-content-length': 2.1.1 + '@smithy/middleware-endpoint': 2.4.1 + '@smithy/middleware-retry': 2.1.1 + '@smithy/middleware-serde': 2.1.1 + '@smithy/middleware-stack': 2.1.1 + '@smithy/node-config-provider': 2.2.1 + '@smithy/node-http-handler': 2.3.1 + '@smithy/protocol-http': 3.1.1 + '@smithy/smithy-client': 2.3.1 + '@smithy/types': 2.9.1 + '@smithy/url-parser': 2.1.1 + '@smithy/util-base64': 2.1.1 + '@smithy/util-body-length-browser': 2.1.1 + '@smithy/util-body-length-node': 2.2.1 + '@smithy/util-defaults-mode-browser': 2.1.1 + '@smithy/util-defaults-mode-node': 2.1.1 + '@smithy/util-endpoints': 1.1.1 + '@smithy/util-retry': 2.1.1 + '@smithy/util-utf8': 2.1.1 + tslib: 2.6.2 transitivePeerDependencies: - aws-crt dev: false - optional: true - /@aws-sdk/client-sso@3.391.0: - resolution: {integrity: sha512-aT+O1CbWIWYlCtWK6g3ZaMvFNImOgFGurOEPscuedqzG5UQc1bRtRrGYShLyzcZgfXP+s0cKYJqgGeRNoWiwqA==} + /@aws-sdk/client-sso@3.427.0: + resolution: {integrity: sha512-sFVFEmsQ1rmgYO1SgrOTxE/MTKpeE4hpOkm1WqhLQK7Ij136vXpjCxjH1JYZiHiUzO1wr9t4ex4dlB5J3VS/Xg==} engines: {node: '>=14.0.0'} + requiresBuild: true dependencies: '@aws-crypto/sha256-browser': 3.0.0 '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/middleware-host-header': 3.391.0 - '@aws-sdk/middleware-logger': 3.391.0 - '@aws-sdk/middleware-recursion-detection': 3.391.0 - '@aws-sdk/middleware-user-agent': 3.391.0 - '@aws-sdk/types': 3.391.0 - '@aws-sdk/util-endpoints': 3.391.0 - '@aws-sdk/util-user-agent-browser': 3.391.0 - '@aws-sdk/util-user-agent-node': 3.391.0 - '@smithy/config-resolver': 2.0.3 - '@smithy/fetch-http-handler': 2.0.3 - '@smithy/hash-node': 2.0.3 - '@smithy/invalid-dependency': 2.0.3 - '@smithy/middleware-content-length': 2.0.3 - '@smithy/middleware-endpoint': 2.0.3 - '@smithy/middleware-retry': 2.0.3 - '@smithy/middleware-serde': 2.0.3 - '@smithy/middleware-stack': 2.0.0 - '@smithy/node-config-provider': 2.0.3 - '@smithy/node-http-handler': 2.0.3 - '@smithy/protocol-http': 2.0.3 - '@smithy/smithy-client': 2.0.3 - '@smithy/types': 2.2.0 - '@smithy/url-parser': 2.0.3 + '@aws-sdk/middleware-host-header': 3.425.0 + '@aws-sdk/middleware-logger': 3.425.0 + '@aws-sdk/middleware-recursion-detection': 3.425.0 + '@aws-sdk/middleware-user-agent': 3.427.0 + '@aws-sdk/region-config-resolver': 3.425.0 + '@aws-sdk/types': 3.425.0 + '@aws-sdk/util-endpoints': 3.427.0 + '@aws-sdk/util-user-agent-browser': 3.425.0 + '@aws-sdk/util-user-agent-node': 3.425.0 + '@smithy/config-resolver': 2.0.14 + '@smithy/fetch-http-handler': 2.2.2 + '@smithy/hash-node': 2.0.11 + '@smithy/invalid-dependency': 2.0.11 + '@smithy/middleware-content-length': 2.0.13 + '@smithy/middleware-endpoint': 2.0.11 + '@smithy/middleware-retry': 2.0.16 + '@smithy/middleware-serde': 2.0.11 + '@smithy/middleware-stack': 2.0.5 + '@smithy/node-config-provider': 2.1.1 + '@smithy/node-http-handler': 2.1.7 + '@smithy/protocol-http': 3.0.7 + '@smithy/smithy-client': 2.1.10 + '@smithy/types': 2.3.5 + '@smithy/url-parser': 2.0.11 '@smithy/util-base64': 2.0.0 '@smithy/util-body-length-browser': 2.0.0 - '@smithy/util-body-length-node': 2.0.0 - '@smithy/util-defaults-mode-browser': 2.0.3 - '@smithy/util-defaults-mode-node': 2.0.3 - '@smithy/util-retry': 2.0.0 + '@smithy/util-body-length-node': 2.1.0 + '@smithy/util-defaults-mode-browser': 2.0.14 + '@smithy/util-defaults-mode-node': 2.0.18 + '@smithy/util-retry': 2.0.4 '@smithy/util-utf8': 2.0.0 - tslib: 2.6.1 + tslib: 2.6.2 + transitivePeerDependencies: + - aws-crt + optional: true + + /@aws-sdk/client-sso@3.507.0: + resolution: {integrity: sha512-pFeaKwqv4tXD6QVxWC2V4N62DUoP3bPSm/mCe2SPhaNjNsmwwA53viUHz/nwxIbs8w4vV44UQsygb0AgKm+HoQ==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-crypto/sha256-browser': 3.0.0 + '@aws-crypto/sha256-js': 3.0.0 + '@aws-sdk/core': 3.496.0 + '@aws-sdk/middleware-host-header': 3.502.0 + '@aws-sdk/middleware-logger': 3.502.0 + '@aws-sdk/middleware-recursion-detection': 3.502.0 + '@aws-sdk/middleware-user-agent': 3.502.0 + '@aws-sdk/region-config-resolver': 3.502.0 + '@aws-sdk/types': 3.502.0 + '@aws-sdk/util-endpoints': 3.502.0 + '@aws-sdk/util-user-agent-browser': 3.502.0 + '@aws-sdk/util-user-agent-node': 3.502.0 + '@smithy/config-resolver': 2.1.1 + '@smithy/core': 1.3.1 + '@smithy/fetch-http-handler': 2.4.1 + '@smithy/hash-node': 2.1.1 + '@smithy/invalid-dependency': 2.1.1 + '@smithy/middleware-content-length': 2.1.1 + '@smithy/middleware-endpoint': 2.4.1 + '@smithy/middleware-retry': 2.1.1 + '@smithy/middleware-serde': 2.1.1 + '@smithy/middleware-stack': 2.1.1 + '@smithy/node-config-provider': 2.2.1 + '@smithy/node-http-handler': 2.3.1 + '@smithy/protocol-http': 3.1.1 + '@smithy/smithy-client': 2.3.1 + '@smithy/types': 2.9.1 + '@smithy/url-parser': 2.1.1 + '@smithy/util-base64': 2.1.1 + '@smithy/util-body-length-browser': 2.1.1 + '@smithy/util-body-length-node': 2.2.1 + '@smithy/util-defaults-mode-browser': 2.1.1 + '@smithy/util-defaults-mode-node': 2.1.1 + '@smithy/util-endpoints': 1.1.1 + '@smithy/util-retry': 2.1.1 + '@smithy/util-utf8': 2.1.1 + tslib: 2.6.2 transitivePeerDependencies: - aws-crt dev: false - /@aws-sdk/client-sts@3.385.0: - resolution: {integrity: sha512-VdSDwICW2cBttbdj1izu6VYflJbZZKu3/FSaJGuGu8SgTvRsa56g6E5xfbUfR/SCstuETObKLusSfQZ6yxUnzA==} + /@aws-sdk/client-sts@3.427.0: + resolution: {integrity: sha512-le2wLJKILyWuRfPz2HbyaNtu5kEki+ojUkTqCU6FPDRrqUvEkaaCBH9Awo/2AtrCfRkiobop8RuTTj6cAnpiJg==} engines: {node: '>=14.0.0'} + requiresBuild: true dependencies: '@aws-crypto/sha256-browser': 3.0.0 '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/credential-provider-node': 3.385.0 - '@aws-sdk/middleware-host-header': 3.379.1 - '@aws-sdk/middleware-logger': 3.378.0 - '@aws-sdk/middleware-recursion-detection': 3.378.0 - '@aws-sdk/middleware-sdk-sts': 3.379.1 - '@aws-sdk/middleware-signing': 3.379.1 - '@aws-sdk/middleware-user-agent': 3.382.0 - '@aws-sdk/types': 3.378.0 - '@aws-sdk/util-endpoints': 3.382.0 - '@aws-sdk/util-user-agent-browser': 3.378.0 - '@aws-sdk/util-user-agent-node': 3.378.0 - '@smithy/config-resolver': 2.0.3 - '@smithy/fetch-http-handler': 2.0.3 - '@smithy/hash-node': 2.0.3 - '@smithy/invalid-dependency': 2.0.3 - '@smithy/middleware-content-length': 2.0.3 - '@smithy/middleware-endpoint': 2.0.3 - '@smithy/middleware-retry': 2.0.3 - '@smithy/middleware-serde': 2.0.3 - '@smithy/middleware-stack': 2.0.0 - '@smithy/node-config-provider': 2.0.3 - '@smithy/node-http-handler': 2.0.3 - '@smithy/protocol-http': 2.0.3 - '@smithy/smithy-client': 2.0.3 - '@smithy/types': 2.2.0 - '@smithy/url-parser': 2.0.3 + '@aws-sdk/credential-provider-node': 3.427.0 + '@aws-sdk/middleware-host-header': 3.425.0 + '@aws-sdk/middleware-logger': 3.425.0 + '@aws-sdk/middleware-recursion-detection': 3.425.0 + '@aws-sdk/middleware-sdk-sts': 3.425.0 + '@aws-sdk/middleware-signing': 3.425.0 + '@aws-sdk/middleware-user-agent': 3.427.0 + '@aws-sdk/region-config-resolver': 3.425.0 + '@aws-sdk/types': 3.425.0 + '@aws-sdk/util-endpoints': 3.427.0 + '@aws-sdk/util-user-agent-browser': 3.425.0 + '@aws-sdk/util-user-agent-node': 3.425.0 + '@smithy/config-resolver': 2.0.14 + '@smithy/fetch-http-handler': 2.2.2 + '@smithy/hash-node': 2.0.11 + '@smithy/invalid-dependency': 2.0.11 + '@smithy/middleware-content-length': 2.0.13 + '@smithy/middleware-endpoint': 2.0.11 + '@smithy/middleware-retry': 2.0.16 + '@smithy/middleware-serde': 2.0.11 + '@smithy/middleware-stack': 2.0.5 + '@smithy/node-config-provider': 2.1.1 + '@smithy/node-http-handler': 2.1.7 + '@smithy/protocol-http': 3.0.7 + '@smithy/smithy-client': 2.1.10 + '@smithy/types': 2.3.5 + '@smithy/url-parser': 2.0.11 '@smithy/util-base64': 2.0.0 '@smithy/util-body-length-browser': 2.0.0 - '@smithy/util-body-length-node': 2.0.0 - '@smithy/util-defaults-mode-browser': 2.0.3 - '@smithy/util-defaults-mode-node': 2.0.3 - '@smithy/util-retry': 2.0.0 + '@smithy/util-body-length-node': 2.1.0 + '@smithy/util-defaults-mode-browser': 2.0.14 + '@smithy/util-defaults-mode-node': 2.0.18 + '@smithy/util-retry': 2.0.4 '@smithy/util-utf8': 2.0.0 fast-xml-parser: 4.2.5 - tslib: 2.6.1 + tslib: 2.6.2 transitivePeerDependencies: - aws-crt - dev: false optional: true - /@aws-sdk/client-sts@3.391.0: - resolution: {integrity: sha512-y+KmorcUx9o5O99sXVPbhGUpsLpfhzYRaYCqxArLsyzZTCO6XDXMi8vg/xtS+b703j9lWEl5GxAv2oBaEwEnhQ==} + /@aws-sdk/client-sts@3.507.0(@aws-sdk/credential-provider-node@3.507.0): + resolution: {integrity: sha512-TOWBe0ApEh32QOib0R+irWGjd1F9wnhbGV5PcB9SakyRwvqwG5MKOfYxG7ocoDqLlaRwzZMidcy/PV8/OEVNKg==} engines: {node: '>=14.0.0'} + peerDependencies: + '@aws-sdk/credential-provider-node': ^3.507.0 dependencies: '@aws-crypto/sha256-browser': 3.0.0 '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/credential-provider-node': 3.391.0 - '@aws-sdk/middleware-host-header': 3.391.0 - '@aws-sdk/middleware-logger': 3.391.0 - '@aws-sdk/middleware-recursion-detection': 3.391.0 - '@aws-sdk/middleware-sdk-sts': 3.391.0 - '@aws-sdk/middleware-signing': 3.391.0 - '@aws-sdk/middleware-user-agent': 3.391.0 - '@aws-sdk/types': 3.391.0 - '@aws-sdk/util-endpoints': 3.391.0 - '@aws-sdk/util-user-agent-browser': 3.391.0 - '@aws-sdk/util-user-agent-node': 3.391.0 - '@smithy/config-resolver': 2.0.3 - '@smithy/fetch-http-handler': 2.0.3 - '@smithy/hash-node': 2.0.3 - '@smithy/invalid-dependency': 2.0.3 - '@smithy/middleware-content-length': 2.0.3 - '@smithy/middleware-endpoint': 2.0.3 - '@smithy/middleware-retry': 2.0.3 - '@smithy/middleware-serde': 2.0.3 - '@smithy/middleware-stack': 2.0.0 - '@smithy/node-config-provider': 2.0.3 - '@smithy/node-http-handler': 2.0.3 - '@smithy/protocol-http': 2.0.3 - '@smithy/smithy-client': 2.0.3 - '@smithy/types': 2.2.0 - '@smithy/url-parser': 2.0.3 - '@smithy/util-base64': 2.0.0 - '@smithy/util-body-length-browser': 2.0.0 - '@smithy/util-body-length-node': 2.0.0 - '@smithy/util-defaults-mode-browser': 2.0.3 - '@smithy/util-defaults-mode-node': 2.0.3 - '@smithy/util-retry': 2.0.0 - '@smithy/util-utf8': 2.0.0 + '@aws-sdk/core': 3.496.0 + '@aws-sdk/credential-provider-node': 3.507.0 + '@aws-sdk/middleware-host-header': 3.502.0 + '@aws-sdk/middleware-logger': 3.502.0 + '@aws-sdk/middleware-recursion-detection': 3.502.0 + '@aws-sdk/middleware-user-agent': 3.502.0 + '@aws-sdk/region-config-resolver': 3.502.0 + '@aws-sdk/types': 3.502.0 + '@aws-sdk/util-endpoints': 3.502.0 + '@aws-sdk/util-user-agent-browser': 3.502.0 + '@aws-sdk/util-user-agent-node': 3.502.0 + '@smithy/config-resolver': 2.1.1 + '@smithy/core': 1.3.1 + '@smithy/fetch-http-handler': 2.4.1 + '@smithy/hash-node': 2.1.1 + '@smithy/invalid-dependency': 2.1.1 + '@smithy/middleware-content-length': 2.1.1 + '@smithy/middleware-endpoint': 2.4.1 + '@smithy/middleware-retry': 2.1.1 + '@smithy/middleware-serde': 2.1.1 + '@smithy/middleware-stack': 2.1.1 + '@smithy/node-config-provider': 2.2.1 + '@smithy/node-http-handler': 2.3.1 + '@smithy/protocol-http': 3.1.1 + '@smithy/smithy-client': 2.3.1 + '@smithy/types': 2.9.1 + '@smithy/url-parser': 2.1.1 + '@smithy/util-base64': 2.1.1 + '@smithy/util-body-length-browser': 2.1.1 + '@smithy/util-body-length-node': 2.2.1 + '@smithy/util-defaults-mode-browser': 2.1.1 + '@smithy/util-defaults-mode-node': 2.1.1 + '@smithy/util-endpoints': 1.1.1 + '@smithy/util-middleware': 2.1.1 + '@smithy/util-retry': 2.1.1 + '@smithy/util-utf8': 2.1.1 fast-xml-parser: 4.2.5 - tslib: 2.6.1 + tslib: 2.6.2 transitivePeerDependencies: - aws-crt dev: false - /@aws-sdk/credential-provider-cognito-identity@3.385.0: - resolution: {integrity: sha512-NeWJgI2XdfO0ZM25KsfNx9CDmLByY3ymVc0ae4Os+bd8pJsFeo1rX3NSkyw8XGryEbOlVJ3Jz5W5huhjo4LvqQ==} + /@aws-sdk/core@3.496.0: + resolution: {integrity: sha512-yT+ug7Cw/3eJi7x2es0+46x12+cIJm5Xv+GPWsrTFD1TKgqO/VPEgfDtHFagDNbFmjNQA65Ygc/kEdIX9ICX/A==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/core': 1.3.1 + '@smithy/protocol-http': 3.1.1 + '@smithy/signature-v4': 2.1.1 + '@smithy/smithy-client': 2.3.1 + '@smithy/types': 2.9.1 + tslib: 2.6.2 + dev: false + + /@aws-sdk/credential-provider-cognito-identity@3.427.0: + resolution: {integrity: sha512-BQNzNrMJlBAfXhYNdAUqaVASpT9Aho5swj7glZKxx4Uds1w5Pih2e14JWgnl8XgUWAZ36pchTrV1aA4JT7N8vw==} engines: {node: '>=14.0.0'} + requiresBuild: true dependencies: - '@aws-sdk/client-cognito-identity': 3.385.0 - '@aws-sdk/types': 3.378.0 - '@smithy/property-provider': 2.0.3 - '@smithy/types': 2.2.0 - tslib: 2.6.1 + '@aws-sdk/client-cognito-identity': 3.427.0 + '@aws-sdk/types': 3.425.0 + '@smithy/property-provider': 2.0.12 + '@smithy/types': 2.3.5 + tslib: 2.6.2 transitivePeerDependencies: - aws-crt - dev: false optional: true - /@aws-sdk/credential-provider-env@3.378.0: - resolution: {integrity: sha512-B2OVdO9kBClDwGgWTBLAQwFV8qYTYGyVujg++1FZFSFMt8ORFdZ5fNpErvJtiSjYiOOQMzyBeSNhKyYNXCiJjQ==} + /@aws-sdk/credential-provider-env@3.425.0: + resolution: {integrity: sha512-J20etnLvMKXRVi5FK4F8yOCNm2RTaQn5psQTGdDEPWJNGxohcSpzzls8U2KcMyUJ+vItlrThr4qwgpHG3i/N0w==} + engines: {node: '>=14.0.0'} + requiresBuild: true + dependencies: + '@aws-sdk/types': 3.425.0 + '@smithy/property-provider': 2.0.12 + '@smithy/types': 2.3.5 + tslib: 2.6.2 + optional: true + + /@aws-sdk/credential-provider-env@3.502.0: + resolution: {integrity: sha512-KIB8Ae1Z7domMU/jU4KiIgK4tmYgvuXlhR54ehwlVHxnEoFPoPuGHFZU7oFn79jhhSLUFQ1lRYMxP0cEwb7XeQ==} engines: {node: '>=14.0.0'} dependencies: - '@aws-sdk/types': 3.378.0 - '@smithy/property-provider': 2.0.3 - '@smithy/types': 2.2.0 - tslib: 2.6.1 + '@aws-sdk/types': 3.502.0 + '@smithy/property-provider': 2.1.1 + '@smithy/types': 2.9.1 + tslib: 2.6.2 dev: false + + /@aws-sdk/credential-provider-http@3.425.0: + resolution: {integrity: sha512-aP9nkoVWf+OlNMecrUqe4+RuQrX13nucVbty0HTvuwfwJJj0T6ByWZzle+fo1D+5OxvJmtzTflBWt6jUERdHWA==} + engines: {node: '>=14.0.0'} + requiresBuild: true + dependencies: + '@aws-sdk/types': 3.425.0 + '@smithy/fetch-http-handler': 2.2.2 + '@smithy/node-http-handler': 2.1.7 + '@smithy/property-provider': 2.0.12 + '@smithy/protocol-http': 3.0.7 + '@smithy/types': 2.3.5 + tslib: 2.6.2 optional: true - /@aws-sdk/credential-provider-env@3.391.0: - resolution: {integrity: sha512-mAzICedcg4bfL0mM5O6QTd9mQ331NLse1DMr6XL21ZZiLB48ej19L7AGV2xq5QwVbqKU3IVv1myRyhvpDM9jMg==} + /@aws-sdk/credential-provider-http@3.503.1: + resolution: {integrity: sha512-rTdlFFGoPPFMF2YjtlfRuSgKI+XsF49u7d98255hySwhsbwd3Xp+utTTPquxP+CwDxMHbDlI7NxDzFiFdsoZug==} engines: {node: '>=14.0.0'} dependencies: - '@aws-sdk/types': 3.391.0 - '@smithy/property-provider': 2.0.1 - '@smithy/types': 2.2.0 - tslib: 2.6.1 + '@aws-sdk/types': 3.502.0 + '@smithy/fetch-http-handler': 2.4.1 + '@smithy/node-http-handler': 2.3.1 + '@smithy/property-provider': 2.1.1 + '@smithy/protocol-http': 3.1.1 + '@smithy/smithy-client': 2.3.1 + '@smithy/types': 2.9.1 + '@smithy/util-stream': 2.1.1 + tslib: 2.6.2 dev: false - /@aws-sdk/credential-provider-ini@3.385.0: - resolution: {integrity: sha512-WBIR5GdfUzCGzynQYX/TuCXw3KJCkHBk6bVAsO1YmfR68XKVAxWmJPKovlK/rR6LIuV+iwUMNludO+SkmG0efg==} + /@aws-sdk/credential-provider-ini@3.427.0: + resolution: {integrity: sha512-NmH1cO/w98CKMltYec3IrJIIco19wRjATFNiw83c+FGXZ+InJwReqBnruxIOmKTx2KDzd6fwU1HOewS7UjaaaQ==} engines: {node: '>=14.0.0'} + requiresBuild: true dependencies: - '@aws-sdk/credential-provider-env': 3.378.0 - '@aws-sdk/credential-provider-process': 3.378.0 - '@aws-sdk/credential-provider-sso': 3.385.0 - '@aws-sdk/credential-provider-web-identity': 3.378.0 - '@aws-sdk/types': 3.378.0 - '@smithy/credential-provider-imds': 2.0.3 - '@smithy/property-provider': 2.0.3 - '@smithy/shared-ini-file-loader': 2.0.3 - '@smithy/types': 2.2.0 - tslib: 2.6.1 + '@aws-sdk/credential-provider-env': 3.425.0 + '@aws-sdk/credential-provider-process': 3.425.0 + '@aws-sdk/credential-provider-sso': 3.427.0 + '@aws-sdk/credential-provider-web-identity': 3.425.0 + '@aws-sdk/types': 3.425.0 + '@smithy/credential-provider-imds': 2.0.16 + '@smithy/property-provider': 2.0.12 + '@smithy/shared-ini-file-loader': 2.2.0 + '@smithy/types': 2.3.5 + tslib: 2.6.2 transitivePeerDependencies: - aws-crt - dev: false optional: true - /@aws-sdk/credential-provider-ini@3.391.0: - resolution: {integrity: sha512-DJZmbmRMqNSfSV7UF8eBVhADz16KAMCTxnFuvgioHHfYUTZQEhCxRHI8jJqYWxhLTriS7AuTBIWr+1AIbwsCTA==} + /@aws-sdk/credential-provider-ini@3.507.0(@aws-sdk/credential-provider-node@3.507.0): + resolution: {integrity: sha512-2CnyduoR9COgd7qH1LPYK8UggGqVs8R4ASDMB5bwGxbg9ZerlStDiHpqvJNNg1k+VlejBr++utxfmHd236XgmQ==} engines: {node: '>=14.0.0'} dependencies: - '@aws-sdk/credential-provider-env': 3.391.0 - '@aws-sdk/credential-provider-process': 3.391.0 - '@aws-sdk/credential-provider-sso': 3.391.0 - '@aws-sdk/credential-provider-web-identity': 3.391.0 - '@aws-sdk/types': 3.391.0 - '@smithy/credential-provider-imds': 2.0.1 - '@smithy/property-provider': 2.0.1 - '@smithy/shared-ini-file-loader': 2.0.1 - '@smithy/types': 2.2.0 - tslib: 2.6.1 + '@aws-sdk/client-sts': 3.507.0(@aws-sdk/credential-provider-node@3.507.0) + '@aws-sdk/credential-provider-env': 3.502.0 + '@aws-sdk/credential-provider-process': 3.502.0 + '@aws-sdk/credential-provider-sso': 3.507.0(@aws-sdk/credential-provider-node@3.507.0) + '@aws-sdk/credential-provider-web-identity': 3.507.0(@aws-sdk/credential-provider-node@3.507.0) + '@aws-sdk/types': 3.502.0 + '@smithy/credential-provider-imds': 2.2.1 + '@smithy/property-provider': 2.1.1 + '@smithy/shared-ini-file-loader': 2.3.1 + '@smithy/types': 2.9.1 + tslib: 2.6.2 transitivePeerDependencies: + - '@aws-sdk/credential-provider-node' - aws-crt dev: false - /@aws-sdk/credential-provider-node@3.385.0: - resolution: {integrity: sha512-Lk8uu6jm/8OkbLX4Qnss8o5bnt0yQa0Tb7Azbh5/5otju5kStVAD2E+zMGrMP++NriGyZV87crduh0J8l4JUTA==} + /@aws-sdk/credential-provider-node@3.427.0: + resolution: {integrity: sha512-wYYbQ57nKL8OfgRbl8k6uXcdnYml+p3LSSfDUAuUEp1HKlQ8lOXFJ3BdLr5qrk7LhpyppSRnWBmh2c3kWa7ANQ==} engines: {node: '>=14.0.0'} + requiresBuild: true dependencies: - '@aws-sdk/credential-provider-env': 3.378.0 - '@aws-sdk/credential-provider-ini': 3.385.0 - '@aws-sdk/credential-provider-process': 3.378.0 - '@aws-sdk/credential-provider-sso': 3.385.0 - '@aws-sdk/credential-provider-web-identity': 3.378.0 - '@aws-sdk/types': 3.378.0 - '@smithy/credential-provider-imds': 2.0.3 - '@smithy/property-provider': 2.0.3 - '@smithy/shared-ini-file-loader': 2.0.3 - '@smithy/types': 2.2.0 - tslib: 2.6.1 + '@aws-sdk/credential-provider-env': 3.425.0 + '@aws-sdk/credential-provider-ini': 3.427.0 + '@aws-sdk/credential-provider-process': 3.425.0 + '@aws-sdk/credential-provider-sso': 3.427.0 + '@aws-sdk/credential-provider-web-identity': 3.425.0 + '@aws-sdk/types': 3.425.0 + '@smithy/credential-provider-imds': 2.0.16 + '@smithy/property-provider': 2.0.12 + '@smithy/shared-ini-file-loader': 2.2.0 + '@smithy/types': 2.3.5 + tslib: 2.6.2 transitivePeerDependencies: - aws-crt - dev: false optional: true - /@aws-sdk/credential-provider-node@3.391.0: - resolution: {integrity: sha512-LXHQwsTw4WBwRzD9swu8254Hao5MoIaGXIzbhX4EQ84dtOkKYbwiY4pDpLfcHcw3B1lFKkVclMze8WAs4EdEww==} + /@aws-sdk/credential-provider-node@3.507.0: + resolution: {integrity: sha512-tkQnmOLkRBXfMLgDYHzogrqTNdtl0Im0ipzJb2IV5hfM5NoTfCf795e9A9isgwjSP/g/YEU0xQWxa4lq8LRtuA==} engines: {node: '>=14.0.0'} dependencies: - '@aws-sdk/credential-provider-env': 3.391.0 - '@aws-sdk/credential-provider-ini': 3.391.0 - '@aws-sdk/credential-provider-process': 3.391.0 - '@aws-sdk/credential-provider-sso': 3.391.0 - '@aws-sdk/credential-provider-web-identity': 3.391.0 - '@aws-sdk/types': 3.391.0 - '@smithy/credential-provider-imds': 2.0.1 - '@smithy/property-provider': 2.0.1 - '@smithy/shared-ini-file-loader': 2.0.1 - '@smithy/types': 2.2.0 - tslib: 2.6.1 + '@aws-sdk/credential-provider-env': 3.502.0 + '@aws-sdk/credential-provider-http': 3.503.1 + '@aws-sdk/credential-provider-ini': 3.507.0(@aws-sdk/credential-provider-node@3.507.0) + '@aws-sdk/credential-provider-process': 3.502.0 + '@aws-sdk/credential-provider-sso': 3.507.0(@aws-sdk/credential-provider-node@3.507.0) + '@aws-sdk/credential-provider-web-identity': 3.507.0(@aws-sdk/credential-provider-node@3.507.0) + '@aws-sdk/types': 3.502.0 + '@smithy/credential-provider-imds': 2.2.1 + '@smithy/property-provider': 2.1.1 + '@smithy/shared-ini-file-loader': 2.3.1 + '@smithy/types': 2.9.1 + tslib: 2.6.2 transitivePeerDependencies: - aws-crt dev: false - /@aws-sdk/credential-provider-process@3.378.0: - resolution: {integrity: sha512-KFTIy7u+wXj3eDua4rgS0tODzMnXtXhAm1RxzCW9FL5JLBBrd82ymCj1Dp72217Sw5Do6NjCnDTTNkCHZMA77w==} + /@aws-sdk/credential-provider-process@3.425.0: + resolution: {integrity: sha512-YY6tkLdvtb1Fgofp3b1UWO+5vwS14LJ/smGmuGpSba0V7gFJRdcrJ9bcb9vVgAGuMdjzRJ+bUKlLLtqXkaykEw==} engines: {node: '>=14.0.0'} + requiresBuild: true dependencies: - '@aws-sdk/types': 3.378.0 - '@smithy/property-provider': 2.0.3 - '@smithy/shared-ini-file-loader': 2.0.3 - '@smithy/types': 2.2.0 - tslib: 2.6.1 - dev: false + '@aws-sdk/types': 3.425.0 + '@smithy/property-provider': 2.0.12 + '@smithy/shared-ini-file-loader': 2.2.0 + '@smithy/types': 2.3.5 + tslib: 2.6.2 optional: true - /@aws-sdk/credential-provider-process@3.391.0: - resolution: {integrity: sha512-KMlzPlBI+hBmXDo+EoFZdLgCVRkRa9B9iEE6x0+hQQ6g9bW6HI7cDRVdceR1ZoPasSaNAZ9QOXMTIBxTpn0sPQ==} + /@aws-sdk/credential-provider-process@3.502.0: + resolution: {integrity: sha512-fJJowOjQ4infYQX0E1J3xFVlmuwEYJAFk0Mo1qwafWmEthsBJs+6BR2RiWDELHKrSK35u4Pf3fu3RkYuCtmQFw==} engines: {node: '>=14.0.0'} dependencies: - '@aws-sdk/types': 3.391.0 - '@smithy/property-provider': 2.0.1 - '@smithy/shared-ini-file-loader': 2.0.1 - '@smithy/types': 2.2.0 - tslib: 2.6.1 + '@aws-sdk/types': 3.502.0 + '@smithy/property-provider': 2.1.1 + '@smithy/shared-ini-file-loader': 2.3.1 + '@smithy/types': 2.9.1 + tslib: 2.6.2 dev: false - /@aws-sdk/credential-provider-sso@3.385.0: - resolution: {integrity: sha512-ETFnS+4ZKTAgT8boVpIpRuXA9wWGpNqOcI1RXtjsaIgQ9s8uNn2JPa8l71gZh861mzBC8Hadp1EpNu+43w4lkg==} + /@aws-sdk/credential-provider-sso@3.427.0: + resolution: {integrity: sha512-c+tXyS/i49erHs4bAp6vKNYeYlyQ0VNMBgoco0LCn1rL0REtHbfhWMnqDLF6c2n3yIWDOTrQu0D73Idnpy16eA==} engines: {node: '>=14.0.0'} + requiresBuild: true dependencies: - '@aws-sdk/client-sso': 3.382.0 - '@aws-sdk/token-providers': 3.385.0 - '@aws-sdk/types': 3.378.0 - '@smithy/property-provider': 2.0.3 - '@smithy/shared-ini-file-loader': 2.0.3 - '@smithy/types': 2.2.0 - tslib: 2.6.1 + '@aws-sdk/client-sso': 3.427.0 + '@aws-sdk/token-providers': 3.427.0 + '@aws-sdk/types': 3.425.0 + '@smithy/property-provider': 2.0.12 + '@smithy/shared-ini-file-loader': 2.2.0 + '@smithy/types': 2.3.5 + tslib: 2.6.2 transitivePeerDependencies: - aws-crt - dev: false optional: true - /@aws-sdk/credential-provider-sso@3.391.0: - resolution: {integrity: sha512-FT/WoiRHiKys+FcRwvjui0yKuzNtJdn2uGuI1hYE0gpW1wVmW02ouufLckJTmcw09THUZ4w53OoCVU5OY00p8A==} + /@aws-sdk/credential-provider-sso@3.507.0(@aws-sdk/credential-provider-node@3.507.0): + resolution: {integrity: sha512-6WBjou52QukFpDi4ezb19bcAx/bM8ge8qnJnRT02WVRmU6zFQ5yLD2fW1MFsbX3cwbey+wSqKd5FGE1Hukd5wQ==} engines: {node: '>=14.0.0'} dependencies: - '@aws-sdk/client-sso': 3.391.0 - '@aws-sdk/token-providers': 3.391.0 - '@aws-sdk/types': 3.391.0 - '@smithy/property-provider': 2.0.1 - '@smithy/shared-ini-file-loader': 2.0.1 - '@smithy/types': 2.2.0 - tslib: 2.6.1 + '@aws-sdk/client-sso': 3.507.0 + '@aws-sdk/token-providers': 3.507.0(@aws-sdk/credential-provider-node@3.507.0) + '@aws-sdk/types': 3.502.0 + '@smithy/property-provider': 2.1.1 + '@smithy/shared-ini-file-loader': 2.3.1 + '@smithy/types': 2.9.1 + tslib: 2.6.2 transitivePeerDependencies: + - '@aws-sdk/credential-provider-node' - aws-crt dev: false - /@aws-sdk/credential-provider-web-identity@3.378.0: - resolution: {integrity: sha512-GWjydOszhc4xDF8xuPtBvboglXQr0gwCW1oHAvmLcOT38+Hd6qnKywnMSeoXYRPgoKfF9TkWQgW1jxplzCG0UA==} + /@aws-sdk/credential-provider-web-identity@3.425.0: + resolution: {integrity: sha512-/0R65TgRzL01JU3SzloivWNwdkbIhr06uY/F5pBHf/DynQqaspKNfdHn6AiozgSVDfwRHFjKBTUy6wvf3QFkuA==} engines: {node: '>=14.0.0'} + requiresBuild: true dependencies: - '@aws-sdk/types': 3.378.0 - '@smithy/property-provider': 2.0.3 - '@smithy/types': 2.2.0 - tslib: 2.6.1 - dev: false + '@aws-sdk/types': 3.425.0 + '@smithy/property-provider': 2.0.12 + '@smithy/types': 2.3.5 + tslib: 2.6.2 optional: true - /@aws-sdk/credential-provider-web-identity@3.391.0: - resolution: {integrity: sha512-n0vYg82B8bc4rxKltVbVqclev7hx+elyS9pEnZs3YbnbWJq0qqsznXmDfLqd1TcWpa09PGXcah0nsRDolVThsA==} + /@aws-sdk/credential-provider-web-identity@3.507.0(@aws-sdk/credential-provider-node@3.507.0): + resolution: {integrity: sha512-f+aGMfazBimX7S06224JRYzGTaMh1uIhfj23tZylPJ05KxTVi5IO1RoqeI/uHLJ+bDOx+JHBC04g/oCdO4kHvw==} engines: {node: '>=14.0.0'} dependencies: - '@aws-sdk/types': 3.391.0 - '@smithy/property-provider': 2.0.1 - '@smithy/types': 2.2.0 - tslib: 2.6.1 + '@aws-sdk/client-sts': 3.507.0(@aws-sdk/credential-provider-node@3.507.0) + '@aws-sdk/types': 3.502.0 + '@smithy/property-provider': 2.1.1 + '@smithy/types': 2.9.1 + tslib: 2.6.2 + transitivePeerDependencies: + - '@aws-sdk/credential-provider-node' + - aws-crt dev: false - /@aws-sdk/credential-providers@3.385.0: - resolution: {integrity: sha512-II4WAFMk061Ud6n1Pux+5T3FQe6gLIwmpF+QgMH97TxJZWFiKyhmJ1Z0VArjo1wwcEPMyIN21Ij91ayop8agwQ==} + /@aws-sdk/credential-providers@3.427.0: + resolution: {integrity: sha512-rKKohSHju462vo+uQnPjcEZPBAfAMgGH6K1XyyCNpuOC0yYLkG87PYpvAQeb8riTrkHPX0dYUHuTHZ6zQgMGjA==} engines: {node: '>=14.0.0'} requiresBuild: true dependencies: - '@aws-sdk/client-cognito-identity': 3.385.0 - '@aws-sdk/client-sso': 3.382.0 - '@aws-sdk/client-sts': 3.385.0 - '@aws-sdk/credential-provider-cognito-identity': 3.385.0 - '@aws-sdk/credential-provider-env': 3.378.0 - '@aws-sdk/credential-provider-ini': 3.385.0 - '@aws-sdk/credential-provider-node': 3.385.0 - '@aws-sdk/credential-provider-process': 3.378.0 - '@aws-sdk/credential-provider-sso': 3.385.0 - '@aws-sdk/credential-provider-web-identity': 3.378.0 - '@aws-sdk/types': 3.378.0 - '@smithy/credential-provider-imds': 2.0.3 - '@smithy/property-provider': 2.0.3 - '@smithy/types': 2.2.0 - tslib: 2.6.1 + '@aws-sdk/client-cognito-identity': 3.427.0 + '@aws-sdk/client-sso': 3.427.0 + '@aws-sdk/client-sts': 3.427.0 + '@aws-sdk/credential-provider-cognito-identity': 3.427.0 + '@aws-sdk/credential-provider-env': 3.425.0 + '@aws-sdk/credential-provider-http': 3.425.0 + '@aws-sdk/credential-provider-ini': 3.427.0 + '@aws-sdk/credential-provider-node': 3.427.0 + '@aws-sdk/credential-provider-process': 3.425.0 + '@aws-sdk/credential-provider-sso': 3.427.0 + '@aws-sdk/credential-provider-web-identity': 3.425.0 + '@aws-sdk/types': 3.425.0 + '@smithy/credential-provider-imds': 2.0.16 + '@smithy/property-provider': 2.0.12 + '@smithy/types': 2.3.5 + tslib: 2.6.2 transitivePeerDependencies: - aws-crt - dev: false optional: true - /@aws-sdk/middleware-bucket-endpoint@3.391.0: - resolution: {integrity: sha512-R8poMkfi54kce6b0d9RQjNm2E+je/dpA1y/TTjCAoWfaBoq6X8UhX6ZD5wdlgg+38FK/2TPjrnXdsm4gtDJuUQ==} + /@aws-sdk/middleware-bucket-endpoint@3.502.0: + resolution: {integrity: sha512-mUSP2DUcjhO5zM2b21CvZ9AqwI8DaAeZA6NYHOxWGTV9BUxHcdGWXEjDkcVj9CQ0gvNwTtw6B5L/q52rVAnZbw==} engines: {node: '>=14.0.0'} dependencies: - '@aws-sdk/types': 3.391.0 - '@aws-sdk/util-arn-parser': 3.310.0 - '@smithy/protocol-http': 2.0.3 - '@smithy/types': 2.2.0 - '@smithy/util-config-provider': 2.0.0 - tslib: 2.6.1 + '@aws-sdk/types': 3.502.0 + '@aws-sdk/util-arn-parser': 3.495.0 + '@smithy/node-config-provider': 2.2.1 + '@smithy/protocol-http': 3.1.1 + '@smithy/types': 2.9.1 + '@smithy/util-config-provider': 2.2.1 + tslib: 2.6.2 dev: false - /@aws-sdk/middleware-expect-continue@3.391.0: - resolution: {integrity: sha512-BdZetUens7vx6PFcDehGTJGFYh/s2SyQk51r5u7OlzYTkdX6DhuBX2CzfzJbswFGKgSHXoiQY0WbSGmNOkRF3A==} + /@aws-sdk/middleware-expect-continue@3.502.0: + resolution: {integrity: sha512-DxfAuBVuPSt8as9xP57o8ks6ySVSjwO2NNNAdpLwk4KhEAPYEpHlf2yWYorYLrS+dDmwfYgOhRNoguuBdCu6ow==} engines: {node: '>=14.0.0'} dependencies: - '@aws-sdk/types': 3.391.0 - '@smithy/protocol-http': 2.0.3 - '@smithy/types': 2.2.0 - tslib: 2.6.1 + '@aws-sdk/types': 3.502.0 + '@smithy/protocol-http': 3.1.1 + '@smithy/types': 2.9.1 + tslib: 2.6.2 dev: false - /@aws-sdk/middleware-flexible-checksums@3.391.0: - resolution: {integrity: sha512-To9gjXzLvNQ6xbN2FtTFNjirvy1OmAuQR+mzZPgxFGgGKVPAKYz1+gFqHAEoFJVDyaxHMd8x4F7hEgDoPWQe7Q==} + /@aws-sdk/middleware-flexible-checksums@3.502.0: + resolution: {integrity: sha512-kCt2zQDFumz/LnJJJOSd2GW4dr8oT8YMJKgxC/pph3aRXoSHXRwhrMbFnQ8swEE9vjywxtcED8sym0b0tNhhoA==} engines: {node: '>=14.0.0'} dependencies: '@aws-crypto/crc32': 3.0.0 '@aws-crypto/crc32c': 3.0.0 - '@aws-sdk/types': 3.391.0 - '@smithy/is-array-buffer': 2.0.0 - '@smithy/protocol-http': 2.0.3 - '@smithy/types': 2.2.0 - '@smithy/util-utf8': 2.0.0 - tslib: 2.6.1 + '@aws-sdk/types': 3.502.0 + '@smithy/is-array-buffer': 2.1.1 + '@smithy/protocol-http': 3.1.1 + '@smithy/types': 2.9.1 + '@smithy/util-utf8': 2.1.1 + tslib: 2.6.2 dev: false - /@aws-sdk/middleware-host-header@3.379.1: - resolution: {integrity: sha512-LI4KpAFWNWVr2aH2vRVblr0Y8tvDz23lj8LOmbDmCrzd5M21nxuocI/8nEAQj55LiTIf9Zs+dHCdsyegnFXdrA==} + /@aws-sdk/middleware-host-header@3.425.0: + resolution: {integrity: sha512-E5Gt41LObQ+cr8QnLthwsH3MtVSNXy1AKJMowDr85h0vzqA/FHUkgHyOGntgozzjXT5M0MaSRYxS0xwTR5D4Ew==} engines: {node: '>=14.0.0'} + requiresBuild: true dependencies: - '@aws-sdk/types': 3.378.0 - '@smithy/protocol-http': 2.0.3 - '@smithy/types': 2.2.0 - tslib: 2.6.1 - dev: false + '@aws-sdk/types': 3.425.0 + '@smithy/protocol-http': 3.0.7 + '@smithy/types': 2.3.5 + tslib: 2.6.2 optional: true - /@aws-sdk/middleware-host-header@3.391.0: - resolution: {integrity: sha512-+nyNr0rb2ixY7mU48nibr7L7gsw37y4oELhqgnNKhcjZDJ34imBwKIMFa64n21FdftmhcjR8IdSpzXE9xrkJ8g==} + /@aws-sdk/middleware-host-header@3.502.0: + resolution: {integrity: sha512-EjnG0GTYXT/wJBmm5/mTjDcAkzU8L7wQjOzd3FTXuTCNNyvAvwrszbOj5FlarEw5XJBbQiZtBs+I5u9+zy560w==} engines: {node: '>=14.0.0'} dependencies: - '@aws-sdk/types': 3.391.0 - '@smithy/protocol-http': 2.0.3 - '@smithy/types': 2.2.0 - tslib: 2.6.1 + '@aws-sdk/types': 3.502.0 + '@smithy/protocol-http': 3.1.1 + '@smithy/types': 2.9.1 + tslib: 2.6.2 dev: false - /@aws-sdk/middleware-location-constraint@3.391.0: - resolution: {integrity: sha512-2ff6/OU7XTMqIZHkyMu4V1xD1iAER/pyT0FNCX2fcc8b0wr0ltBmsJ5Zh+hfMs06/oPO36NDcvJMat/waghHgQ==} + /@aws-sdk/middleware-location-constraint@3.502.0: + resolution: {integrity: sha512-fLRwPuTZvEWQkPjys03m3D6tYN4kf7zU6+c8mJxwvEg+yfBuv2RBsbd+Vn2bTisUjXvIg1kyBzONlpHoIyFneg==} engines: {node: '>=14.0.0'} dependencies: - '@aws-sdk/types': 3.391.0 - '@smithy/types': 2.2.0 - tslib: 2.6.1 + '@aws-sdk/types': 3.502.0 + '@smithy/types': 2.9.1 + tslib: 2.6.2 dev: false - /@aws-sdk/middleware-logger@3.378.0: - resolution: {integrity: sha512-l1DyaDLm3KeBMNMuANI3scWh8Xvu248x+vw6Z7ExWOhGXFmQ1MW7YvASg/SdxWkhlF9HmkkTif1LdMB22x6QDA==} + /@aws-sdk/middleware-logger@3.425.0: + resolution: {integrity: sha512-INE9XWRXx2f4a/r2vOU0tAmgctVp7nEaEasemNtVBYhqbKLZvr9ndLBSgKGgJ8LIcXAoISipaMuFiqIGkFsm7A==} engines: {node: '>=14.0.0'} + requiresBuild: true dependencies: - '@aws-sdk/types': 3.378.0 - '@smithy/types': 2.2.0 - tslib: 2.6.1 - dev: false + '@aws-sdk/types': 3.425.0 + '@smithy/types': 2.3.5 + tslib: 2.6.2 optional: true - /@aws-sdk/middleware-logger@3.391.0: - resolution: {integrity: sha512-KOwl5zo16b17JDhqILHBStccBQ2w35em7+/6vdkJdUII6OU8aVIFTlIQT9wOUvd4do6biIRBMZG3IK0Rg7mRDQ==} + /@aws-sdk/middleware-logger@3.502.0: + resolution: {integrity: sha512-FDyv6K4nCoHxbjLGS2H8ex8I0KDIiu4FJgVRPs140ZJy6gE5Pwxzv6YTzZGLMrnqcIs9gh065Lf6DjwMelZqaw==} engines: {node: '>=14.0.0'} dependencies: - '@aws-sdk/types': 3.391.0 - '@smithy/types': 2.2.0 - tslib: 2.6.1 + '@aws-sdk/types': 3.502.0 + '@smithy/types': 2.9.1 + tslib: 2.6.2 dev: false - /@aws-sdk/middleware-recursion-detection@3.378.0: - resolution: {integrity: sha512-mUMfHAz0oGNIWiTZHTVJb+I515Hqs2zx1j36Le4MMiiaMkPW1SRUF1FIwGuc1wh6E8jB5q+XfEMriDjRi4TZRA==} + /@aws-sdk/middleware-recursion-detection@3.425.0: + resolution: {integrity: sha512-77gnzJ5b91bgD75L/ugpOyerx6lR3oyS4080X1YI58EzdyBMkDrHM4FbMcY2RynETi3lwXCFzLRyZjWXY1mRlw==} engines: {node: '>=14.0.0'} + requiresBuild: true dependencies: - '@aws-sdk/types': 3.378.0 - '@smithy/protocol-http': 2.0.3 - '@smithy/types': 2.2.0 - tslib: 2.6.1 - dev: false + '@aws-sdk/types': 3.425.0 + '@smithy/protocol-http': 3.0.7 + '@smithy/types': 2.3.5 + tslib: 2.6.2 optional: true - /@aws-sdk/middleware-recursion-detection@3.391.0: - resolution: {integrity: sha512-hVR3z59G7pX4pjDQs9Ag1tMgbLeGXOzeAAaNP9fEtHSd3KBMAGQgN3K3b9WPjzE2W0EoloHRJMK4qxZErdde2g==} + /@aws-sdk/middleware-recursion-detection@3.502.0: + resolution: {integrity: sha512-hvbyGJbxeuezxOu8VfFmcV4ql1hKXLxHTe5FNYfEBat2KaZXVhc1Hg+4TvB06/53p+E8J99Afmumkqbxs2esUA==} engines: {node: '>=14.0.0'} dependencies: - '@aws-sdk/types': 3.391.0 - '@smithy/protocol-http': 2.0.3 - '@smithy/types': 2.2.0 - tslib: 2.6.1 + '@aws-sdk/types': 3.502.0 + '@smithy/protocol-http': 3.1.1 + '@smithy/types': 2.9.1 + tslib: 2.6.2 dev: false - /@aws-sdk/middleware-sdk-s3@3.391.0: - resolution: {integrity: sha512-/G77j3IdZFtzI6CWns5f//xOOJ8DezDD9sEvAlfSiBgJLaL3SUFZLmG+lHqEPzCQyNpNSY5RvuojtjloaLDi5A==} + /@aws-sdk/middleware-sdk-s3@3.502.0: + resolution: {integrity: sha512-GbGugrfyL5bNA/zw8iQll92yXBONfWSC8Ns00DtkOU1saPXp4/7WHtyyZGYdvPa73T1IsuZy9egpoYRBmRcd5Q==} engines: {node: '>=14.0.0'} dependencies: - '@aws-sdk/types': 3.391.0 - '@aws-sdk/util-arn-parser': 3.310.0 - '@smithy/protocol-http': 2.0.3 - '@smithy/types': 2.2.0 - tslib: 2.6.1 + '@aws-sdk/types': 3.502.0 + '@aws-sdk/util-arn-parser': 3.495.0 + '@smithy/node-config-provider': 2.2.1 + '@smithy/protocol-http': 3.1.1 + '@smithy/signature-v4': 2.1.1 + '@smithy/smithy-client': 2.3.1 + '@smithy/types': 2.9.1 + '@smithy/util-config-provider': 2.2.1 + tslib: 2.6.2 dev: false - /@aws-sdk/middleware-sdk-sts@3.379.1: - resolution: {integrity: sha512-SK3gSyT0XbLiY12+AjLFYL9YngxOXHnZF3Z33Cdd4a+AUYrVBV7JBEEGD1Nlwrcmko+3XgaKlmgUaR5s91MYvg==} + /@aws-sdk/middleware-sdk-sts@3.425.0: + resolution: {integrity: sha512-JFojrg76oKAoBknnr9EL5N2aJ1mRCtBqXoZYST58GSx8uYdFQ89qS65VNQ8JviBXzsrCNAn4vDhZ5Ch5E6TxGQ==} engines: {node: '>=14.0.0'} + requiresBuild: true dependencies: - '@aws-sdk/middleware-signing': 3.379.1 - '@aws-sdk/types': 3.378.0 - '@smithy/types': 2.2.0 - tslib: 2.6.1 - dev: false + '@aws-sdk/middleware-signing': 3.425.0 + '@aws-sdk/types': 3.425.0 + '@smithy/types': 2.3.5 + tslib: 2.6.2 optional: true - /@aws-sdk/middleware-sdk-sts@3.391.0: - resolution: {integrity: sha512-6ZXI3Z4QU+TnT5PwKWloGmRHG81tWeI18/zxf9wWzrO2NhYFvITzEJH0vWLLiXdWtn/BYfLULXtDvkTaepbI5A==} + /@aws-sdk/middleware-signing@3.425.0: + resolution: {integrity: sha512-ZpOfgJHk7ovQ0sSwg3tU4NxFOnz53lJlkJRf7S+wxQALHM0P2MJ6LYBrZaFMVsKiJxNIdZBXD6jclgHg72ZW6Q==} engines: {node: '>=14.0.0'} + requiresBuild: true dependencies: - '@aws-sdk/middleware-signing': 3.391.0 - '@aws-sdk/types': 3.391.0 - '@smithy/types': 2.2.0 - tslib: 2.6.1 - dev: false + '@aws-sdk/types': 3.425.0 + '@smithy/property-provider': 2.0.12 + '@smithy/protocol-http': 3.0.7 + '@smithy/signature-v4': 2.0.11 + '@smithy/types': 2.3.5 + '@smithy/util-middleware': 2.0.4 + tslib: 2.6.2 + optional: true - /@aws-sdk/middleware-signing@3.379.1: - resolution: {integrity: sha512-kBk2ZUvR84EM4fICjr8K+Ykpf8SI1UzzPp2/UVYZ0X+4H/ZCjfSqohGRwHykMqeplne9qHSL7/rGJs1H3l3gPg==} + /@aws-sdk/middleware-signing@3.502.0: + resolution: {integrity: sha512-4hF08vSzJ7L6sB+393gOFj3s2N6nLusYS0XrMW6wYNFU10IDdbf8Z3TZ7gysDJJHEGQPmTAesPEDBsasGWcMxg==} engines: {node: '>=14.0.0'} dependencies: - '@aws-sdk/types': 3.378.0 - '@smithy/property-provider': 2.0.3 - '@smithy/protocol-http': 2.0.3 - '@smithy/signature-v4': 2.0.1 - '@smithy/types': 2.2.0 - '@smithy/util-middleware': 2.0.0 - tslib: 2.6.1 + '@aws-sdk/types': 3.502.0 + '@smithy/property-provider': 2.1.1 + '@smithy/protocol-http': 3.1.1 + '@smithy/signature-v4': 2.1.1 + '@smithy/types': 2.9.1 + '@smithy/util-middleware': 2.1.1 + tslib: 2.6.2 dev: false - optional: true - /@aws-sdk/middleware-signing@3.391.0: - resolution: {integrity: sha512-2pAJJlZqaHc0d+cz2FTVrQmWi8ygKfqfczHUo/loCtOaMNtWXBHb/JsLEecs6cXdizy6gi3YsLz6VZYwY4Ssxw==} + /@aws-sdk/middleware-ssec@3.502.0: + resolution: {integrity: sha512-1nidVTIba6/aVjjzD/WNqWdzSyTrXOHO3Ddz2MGD8S1yGSrYz4iYaq4Bm/uosfdr8B1L0Ws0pjdRXrNfzSw/DQ==} engines: {node: '>=14.0.0'} dependencies: - '@aws-sdk/types': 3.391.0 - '@smithy/property-provider': 2.0.1 - '@smithy/protocol-http': 2.0.3 - '@smithy/signature-v4': 2.0.1 - '@smithy/types': 2.2.0 - '@smithy/util-middleware': 2.0.0 - tslib: 2.6.1 + '@aws-sdk/types': 3.502.0 + '@smithy/types': 2.9.1 + tslib: 2.6.2 dev: false - /@aws-sdk/middleware-ssec@3.391.0: - resolution: {integrity: sha512-Mhz0wBWccjwmFNb9zNLQD9HpPfU/Ygv7HtaPAkcmnWOMuUNhAS6aXExZc3QGE2owzAaLS2g3m24JEE3LsIYZJQ==} + /@aws-sdk/middleware-user-agent@3.427.0: + resolution: {integrity: sha512-y9HxYsNvnA3KqDl8w1jHeCwz4P9CuBEtu/G+KYffLeAMBsMZmh4SIkFFCO9wE/dyYg6+yo07rYcnnIfy7WA0bw==} engines: {node: '>=14.0.0'} + requiresBuild: true dependencies: - '@aws-sdk/types': 3.391.0 - '@smithy/types': 2.2.0 - tslib: 2.6.1 - dev: false + '@aws-sdk/types': 3.425.0 + '@aws-sdk/util-endpoints': 3.427.0 + '@smithy/protocol-http': 3.0.7 + '@smithy/types': 2.3.5 + tslib: 2.6.2 + optional: true - /@aws-sdk/middleware-user-agent@3.382.0: - resolution: {integrity: sha512-LFRW1jmXOrOAd3911ktn6oaYmuurNnulbdRMOUdwz99GGdLVFipQhOi9idKswb8IOhPa4jEVQt25Kcv7ctvu0A==} + /@aws-sdk/middleware-user-agent@3.502.0: + resolution: {integrity: sha512-TxbBZbRiXPH0AUxegqiNd9aM9zNSbfjtBs5MEfcBsweeT/B2O7K1EjP9+CkB8Xmk/5FLKhAKLr19b1TNoE27rw==} engines: {node: '>=14.0.0'} dependencies: - '@aws-sdk/types': 3.378.0 - '@aws-sdk/util-endpoints': 3.382.0 - '@smithy/protocol-http': 2.0.3 - '@smithy/types': 2.2.0 - tslib: 2.6.1 + '@aws-sdk/types': 3.502.0 + '@aws-sdk/util-endpoints': 3.502.0 + '@smithy/protocol-http': 3.1.1 + '@smithy/types': 2.9.1 + tslib: 2.6.2 dev: false - optional: true - /@aws-sdk/middleware-user-agent@3.391.0: - resolution: {integrity: sha512-LdK9uMNA14zqRw3B79Mhy7GX36qld/GYo93xuu+lr+AQ98leZEdc6GUbrtNDI3fP1Z8TMQcyHUKBml4/B+wXpQ==} + /@aws-sdk/region-config-resolver@3.425.0: + resolution: {integrity: sha512-u7uv/iUOapIJdRgRkO3wnpYsUgV6ponsZJQgVg/8L+n+Vo5PQL5gAcIuAOwcYSKQPFaeK+KbmByI4SyOK203Vw==} engines: {node: '>=14.0.0'} + requiresBuild: true dependencies: - '@aws-sdk/types': 3.391.0 - '@aws-sdk/util-endpoints': 3.391.0 - '@smithy/protocol-http': 2.0.3 - '@smithy/types': 2.2.0 - tslib: 2.6.1 - dev: false + '@smithy/node-config-provider': 2.1.1 + '@smithy/types': 2.3.5 + '@smithy/util-config-provider': 2.0.0 + '@smithy/util-middleware': 2.0.4 + tslib: 2.6.2 + optional: true - /@aws-sdk/s3-request-presigner@3.391.0: - resolution: {integrity: sha512-2cV6utjfV/8EvJjyBSowoYpmCy4HWb7b7PhkdJB5a3hItxi2NdWX2AZhSBit6xYhUdHvOuXcfG4TMGyH5S2NVQ==} + /@aws-sdk/region-config-resolver@3.502.0: + resolution: {integrity: sha512-mxmsX2AGgnSM+Sah7mcQCIneOsJQNiLX0COwEttuf8eO+6cLMAZvVudH3BnWTfea4/A9nuri9DLCqBvEmPrilg==} engines: {node: '>=14.0.0'} dependencies: - '@aws-sdk/signature-v4-multi-region': 3.391.0 - '@aws-sdk/types': 3.391.0 - '@aws-sdk/util-format-url': 3.391.0 - '@smithy/middleware-endpoint': 2.0.3 - '@smithy/protocol-http': 2.0.3 - '@smithy/smithy-client': 2.0.3 - '@smithy/types': 2.2.0 - tslib: 2.6.1 - transitivePeerDependencies: - - '@aws-sdk/signature-v4-crt' + '@aws-sdk/types': 3.502.0 + '@smithy/node-config-provider': 2.2.1 + '@smithy/types': 2.9.1 + '@smithy/util-config-provider': 2.2.1 + '@smithy/util-middleware': 2.1.1 + tslib: 2.6.2 dev: false - /@aws-sdk/signature-v4-multi-region@3.391.0: - resolution: {integrity: sha512-YMBWCkk8/Q85mqyf5eOn/XxAYflmxikYAU9ZL11fu9zPTUU2JsrsMJrsQmqia+Lp1jhQNQ9K3QFngG1hECflgQ==} + /@aws-sdk/s3-request-presigner@3.507.0: + resolution: {integrity: sha512-A3EGvXMeOvnG+qtAsmlcQyLP7+PlCePS+PsVqLm3Pz3C16avOTxTqOZIkYCqBBX2fnASr2qUr0d3cezBfsU7PQ==} engines: {node: '>=14.0.0'} - peerDependencies: - '@aws-sdk/signature-v4-crt': ^3.118.0 - peerDependenciesMeta: - '@aws-sdk/signature-v4-crt': - optional: true dependencies: - '@aws-sdk/types': 3.391.0 - '@smithy/protocol-http': 2.0.3 - '@smithy/signature-v4': 2.0.1 - '@smithy/types': 2.2.0 - tslib: 2.6.1 + '@aws-sdk/signature-v4-multi-region': 3.502.0 + '@aws-sdk/types': 3.502.0 + '@aws-sdk/util-format-url': 3.502.0 + '@smithy/middleware-endpoint': 2.4.1 + '@smithy/protocol-http': 3.1.1 + '@smithy/smithy-client': 2.3.1 + '@smithy/types': 2.9.1 + tslib: 2.6.2 dev: false - /@aws-sdk/token-providers@3.385.0: - resolution: {integrity: sha512-2A2Y7/bU5EaxQwLwLy7ojs+Wy5VOBkIlGPH7ZcpPaoQ1Hscwn3Wvx/DZmOvbyYfZ1CbIFutoHJlVxh6KZldUDw==} + /@aws-sdk/signature-v4-multi-region@3.502.0: + resolution: {integrity: sha512-NpOXtUXH0ZAgnyI3Y3s2fPrgwbsWoNMwdoXdFZvH0eDzzX80tim7Yuy6dzVA5zrxSzOYs1xjcOhM+4CmM0QZiw==} engines: {node: '>=14.0.0'} dependencies: - '@aws-sdk/types': 3.378.0 - '@smithy/property-provider': 2.0.3 - '@smithy/shared-ini-file-loader': 2.0.3 - '@smithy/types': 2.2.0 - tslib: 2.6.1 + '@aws-sdk/middleware-sdk-s3': 3.502.0 + '@aws-sdk/types': 3.502.0 + '@smithy/protocol-http': 3.1.1 + '@smithy/signature-v4': 2.1.1 + '@smithy/types': 2.9.1 + tslib: 2.6.2 dev: false - optional: true - /@aws-sdk/token-providers@3.391.0: - resolution: {integrity: sha512-kgfArsKLDJE71qQjfXiHiM5cZqgDHlMsqEx35+A65GmTWJaS1PGDqu3ZvVVU8E5mxnCCLw7vho21fsjvH6TBpg==} + /@aws-sdk/token-providers@3.427.0: + resolution: {integrity: sha512-4E5E+4p8lJ69PBY400dJXF06LUHYx5lkKzBEsYqWWhoZcoftrvi24ltIhUDoGVLkrLcTHZIWSdFAWSos4hXqeg==} engines: {node: '>=14.0.0'} + requiresBuild: true dependencies: '@aws-crypto/sha256-browser': 3.0.0 '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/middleware-host-header': 3.391.0 - '@aws-sdk/middleware-logger': 3.391.0 - '@aws-sdk/middleware-recursion-detection': 3.391.0 - '@aws-sdk/middleware-user-agent': 3.391.0 - '@aws-sdk/types': 3.391.0 - '@aws-sdk/util-endpoints': 3.391.0 - '@aws-sdk/util-user-agent-browser': 3.391.0 - '@aws-sdk/util-user-agent-node': 3.391.0 - '@smithy/config-resolver': 2.0.3 - '@smithy/fetch-http-handler': 2.0.3 - '@smithy/hash-node': 2.0.3 - '@smithy/invalid-dependency': 2.0.3 - '@smithy/middleware-content-length': 2.0.3 - '@smithy/middleware-endpoint': 2.0.3 - '@smithy/middleware-retry': 2.0.3 - '@smithy/middleware-serde': 2.0.3 - '@smithy/middleware-stack': 2.0.0 - '@smithy/node-config-provider': 2.0.3 - '@smithy/node-http-handler': 2.0.3 - '@smithy/property-provider': 2.0.1 - '@smithy/protocol-http': 2.0.3 - '@smithy/shared-ini-file-loader': 2.0.1 - '@smithy/smithy-client': 2.0.3 - '@smithy/types': 2.2.0 - '@smithy/url-parser': 2.0.3 + '@aws-sdk/middleware-host-header': 3.425.0 + '@aws-sdk/middleware-logger': 3.425.0 + '@aws-sdk/middleware-recursion-detection': 3.425.0 + '@aws-sdk/middleware-user-agent': 3.427.0 + '@aws-sdk/types': 3.425.0 + '@aws-sdk/util-endpoints': 3.427.0 + '@aws-sdk/util-user-agent-browser': 3.425.0 + '@aws-sdk/util-user-agent-node': 3.425.0 + '@smithy/config-resolver': 2.0.14 + '@smithy/fetch-http-handler': 2.2.2 + '@smithy/hash-node': 2.0.11 + '@smithy/invalid-dependency': 2.0.11 + '@smithy/middleware-content-length': 2.0.13 + '@smithy/middleware-endpoint': 2.0.11 + '@smithy/middleware-retry': 2.0.16 + '@smithy/middleware-serde': 2.0.11 + '@smithy/middleware-stack': 2.0.5 + '@smithy/node-config-provider': 2.1.1 + '@smithy/node-http-handler': 2.1.7 + '@smithy/property-provider': 2.0.12 + '@smithy/protocol-http': 3.0.7 + '@smithy/shared-ini-file-loader': 2.2.0 + '@smithy/smithy-client': 2.1.10 + '@smithy/types': 2.3.5 + '@smithy/url-parser': 2.0.11 '@smithy/util-base64': 2.0.0 '@smithy/util-body-length-browser': 2.0.0 - '@smithy/util-body-length-node': 2.0.0 - '@smithy/util-defaults-mode-browser': 2.0.3 - '@smithy/util-defaults-mode-node': 2.0.3 - '@smithy/util-retry': 2.0.0 + '@smithy/util-body-length-node': 2.1.0 + '@smithy/util-defaults-mode-browser': 2.0.14 + '@smithy/util-defaults-mode-node': 2.0.18 + '@smithy/util-retry': 2.0.4 '@smithy/util-utf8': 2.0.0 - tslib: 2.6.1 + tslib: 2.6.2 transitivePeerDependencies: - aws-crt - dev: false + optional: true - /@aws-sdk/types@3.378.0: - resolution: {integrity: sha512-qP0CvR/ItgktmN8YXpGQglzzR/6s0nrsQ4zIfx3HMwpsBTwuouYahcCtF1Vr82P4NFcoDA412EJahJ2pIqEd+w==} + /@aws-sdk/token-providers@3.507.0(@aws-sdk/credential-provider-node@3.507.0): + resolution: {integrity: sha512-ehOINGjoGJc6Puzon7ev4bXckkaZx18WNgMTNttYJhj3vTpj5LPSQbI/5SS927bEbpGMFz1+hJ6Ra5WGfbTcEQ==} engines: {node: '>=14.0.0'} dependencies: - '@smithy/types': 2.2.0 - tslib: 2.6.1 + '@aws-sdk/client-sso-oidc': 3.507.0(@aws-sdk/credential-provider-node@3.507.0) + '@aws-sdk/types': 3.502.0 + '@smithy/property-provider': 2.1.1 + '@smithy/shared-ini-file-loader': 2.3.1 + '@smithy/types': 2.9.1 + tslib: 2.6.2 + transitivePeerDependencies: + - '@aws-sdk/credential-provider-node' + - aws-crt dev: false + + /@aws-sdk/types@3.425.0: + resolution: {integrity: sha512-6lqbmorwerN4v+J5dqbHPAsjynI0mkEF+blf+69QTaKKGaxBBVaXgqoqul9RXYcK5MMrrYRbQIMd0zYOoy90kA==} + engines: {node: '>=14.0.0'} + requiresBuild: true + dependencies: + '@smithy/types': 2.3.5 + tslib: 2.6.2 optional: true - /@aws-sdk/types@3.391.0: - resolution: {integrity: sha512-QpYVFKMOnzHz/JMj/b8wb18qxiT92U/5r5MmtRz2R3LOH6ooTO96k4ozXCrYr0qNed1PAnOj73rPrrH2wnCJKQ==} + /@aws-sdk/types@3.502.0: + resolution: {integrity: sha512-M0DSPYe/gXhwD2QHgoukaZv5oDxhW3FfvYIrJptyqUq3OnPJBcDbihHjrE0PBtfh/9kgMZT60/fQ2NVFANfa2g==} engines: {node: '>=14.0.0'} dependencies: - '@smithy/types': 2.2.0 - tslib: 2.6.1 - dev: false + '@smithy/types': 2.9.1 + tslib: 2.6.2 - /@aws-sdk/util-arn-parser@3.310.0: - resolution: {integrity: sha512-jL8509owp/xB9+Or0pvn3Fe+b94qfklc2yPowZZIFAkFcCSIdkIglz18cPDWnYAcy9JGewpMS1COXKIUhZkJsA==} + /@aws-sdk/util-arn-parser@3.495.0: + resolution: {integrity: sha512-hwdA3XAippSEUxs7jpznwD63YYFR+LtQvlEcebPTgWR9oQgG9TfS+39PUfbnEeje1ICuOrN3lrFqFbmP9uzbMg==} engines: {node: '>=14.0.0'} dependencies: - tslib: 2.6.1 + tslib: 2.6.2 dev: false - /@aws-sdk/util-endpoints@3.382.0: - resolution: {integrity: sha512-flajPyjmjNG67fXk7l4GoTB/7J11VBqtFZXuuAZKhKU07Ia3IQupsFqNf5lV8D44ZgjnKH0fTGnv3dUALjW7Wg==} + /@aws-sdk/util-endpoints@3.427.0: + resolution: {integrity: sha512-rSyiAIFF/EVvity/+LWUqoTMJ0a25RAc9iqx0WZ4tf1UjuEXRRXxZEb+jEZg1bk+pY84gdLdx9z5E+MSJCZxNQ==} engines: {node: '>=14.0.0'} + requiresBuild: true dependencies: - '@aws-sdk/types': 3.378.0 - tslib: 2.6.1 - dev: false + '@aws-sdk/types': 3.425.0 + '@smithy/node-config-provider': 2.1.1 + tslib: 2.6.2 optional: true - /@aws-sdk/util-endpoints@3.391.0: - resolution: {integrity: sha512-zv4sYDTQhNxyLoekcE02/nk3xvoo6yCHDy1kDJk0MFxOKaqUB+CvZdQBR4YBLSDlD4o4DUBmdYgKT58FfbM8sQ==} + /@aws-sdk/util-endpoints@3.502.0: + resolution: {integrity: sha512-6LKFlJPp2J24r1Kpfoz5ESQn+1v5fEjDB3mtUKRdpwarhm3syu7HbKlHCF3KbcCOyahobvLvhoedT78rJFEeeg==} engines: {node: '>=14.0.0'} dependencies: - '@aws-sdk/types': 3.391.0 - tslib: 2.6.1 + '@aws-sdk/types': 3.502.0 + '@smithy/types': 2.9.1 + '@smithy/util-endpoints': 1.1.1 + tslib: 2.6.2 dev: false - /@aws-sdk/util-format-url@3.391.0: - resolution: {integrity: sha512-cddtpaYxKy8Hi2pCZonJ4RHx+T+nx3ESwr/A+r56jou2PQJiQZGg10rt366waU/GsgnVHvXHcC00CzGSbDkDGg==} + /@aws-sdk/util-format-url@3.502.0: + resolution: {integrity: sha512-4+0zBD0ZIJqtTzSE6VRruRwUx3lG+is8Egv+LN99X5y7i6OdrS9ePYHbCJ9FxkzTThgbkUq6k2W7psEDYvn4VA==} engines: {node: '>=14.0.0'} dependencies: - '@aws-sdk/types': 3.391.0 - '@smithy/querystring-builder': 2.0.3 - '@smithy/types': 2.2.0 - tslib: 2.6.1 + '@aws-sdk/types': 3.502.0 + '@smithy/querystring-builder': 2.1.1 + '@smithy/types': 2.9.1 + tslib: 2.6.2 dev: false /@aws-sdk/util-locate-window@3.310.0: resolution: {integrity: sha512-qo2t/vBTnoXpjKxlsC2e1gBrRm80M3bId27r0BRB2VniSSe7bL1mmzM+/HFtujm0iAxtPM+aLEflLJlJeDPg0w==} engines: {node: '>=14.0.0'} + requiresBuild: true dependencies: - tslib: 2.6.1 - dev: false + tslib: 2.6.2 - /@aws-sdk/util-user-agent-browser@3.378.0: - resolution: {integrity: sha512-FSCpagzftK1W+m7Ar6lpX7/Gr9y5P56nhFYz8U4EYQ4PkufS6czWX9YW+/FA5OYV0vlQ/SvPqMnzoHIPUNhZrQ==} + /@aws-sdk/util-user-agent-browser@3.425.0: + resolution: {integrity: sha512-22Y9iMtjGcFjGILR6/xdp1qRezlHVLyXtnpEsbuPTiernRCPk6zfAnK/ATH77r02MUjU057tdxVkd5umUBTn9Q==} + requiresBuild: true dependencies: - '@aws-sdk/types': 3.378.0 - '@smithy/types': 2.2.0 + '@aws-sdk/types': 3.425.0 + '@smithy/types': 2.3.5 bowser: 2.11.0 - tslib: 2.6.1 - dev: false + tslib: 2.6.2 optional: true - /@aws-sdk/util-user-agent-browser@3.391.0: - resolution: {integrity: sha512-6ipHOB1WdCBNeAMJauN7l2qNE0WLVaTNhkD290/ElXm1FHGTL8yw6lIDIjhIFO1bmbZxDiKApwDiG7ROhaJoxQ==} + /@aws-sdk/util-user-agent-browser@3.502.0: + resolution: {integrity: sha512-v8gKyCs2obXoIkLETAeEQ3AM+QmhHhst9xbM1cJtKUGsRlVIak/XyyD+kVE6kmMm1cjfudHpHKABWk9apQcIZQ==} dependencies: - '@aws-sdk/types': 3.391.0 - '@smithy/types': 2.2.0 + '@aws-sdk/types': 3.502.0 + '@smithy/types': 2.9.1 bowser: 2.11.0 - tslib: 2.6.1 + tslib: 2.6.2 dev: false - /@aws-sdk/util-user-agent-node@3.378.0: - resolution: {integrity: sha512-IdwVJV0E96MkJeFte4dlWqvB+oiqCiZ5lOlheY3W9NynTuuX0GGYNC8Y9yIsV8Oava1+ujpJq0ww6qXdYxmO4A==} + /@aws-sdk/util-user-agent-node@3.425.0: + resolution: {integrity: sha512-SIR4F5uQeeVAi8lv4OgRirtdtNi5zeyogTuQgGi9su8F/WP1N6JqxofcwpUY5f8/oJ2UlXr/tx1f09UHfJJzvA==} engines: {node: '>=14.0.0'} + requiresBuild: true peerDependencies: aws-crt: '>=1.0.0' peerDependenciesMeta: aws-crt: optional: true dependencies: - '@aws-sdk/types': 3.378.0 - '@smithy/node-config-provider': 2.0.3 - '@smithy/types': 2.2.0 - tslib: 2.6.1 - dev: false + '@aws-sdk/types': 3.425.0 + '@smithy/node-config-provider': 2.1.1 + '@smithy/types': 2.3.5 + tslib: 2.6.2 optional: true - /@aws-sdk/util-user-agent-node@3.391.0: - resolution: {integrity: sha512-PVvAK/Lf4BdB1eJIZtyFpGSslGQwKpYt9/hKs5NlR+qxBMXU9T0DnTqH4GiXZaazvXr7OUVWitIF2b7iKBMTow==} + /@aws-sdk/util-user-agent-node@3.502.0: + resolution: {integrity: sha512-9RjxpkGZKbTdl96tIJvAo+vZoz4P/cQh36SBUt9xfRfW0BtsaLyvSrvlR5wyUYhvRcC12Axqh/8JtnAPq//+Vw==} engines: {node: '>=14.0.0'} peerDependencies: aws-crt: '>=1.0.0' @@ -1218,23 +1358,24 @@ packages: aws-crt: optional: true dependencies: - '@aws-sdk/types': 3.391.0 - '@smithy/node-config-provider': 2.0.3 - '@smithy/types': 2.2.0 - tslib: 2.6.1 + '@aws-sdk/types': 3.502.0 + '@smithy/node-config-provider': 2.2.1 + '@smithy/types': 2.9.1 + tslib: 2.6.2 dev: false /@aws-sdk/util-utf8-browser@3.259.0: resolution: {integrity: sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==} + requiresBuild: true dependencies: - tslib: 2.6.1 - dev: false + tslib: 2.6.2 - /@aws-sdk/xml-builder@3.310.0: - resolution: {integrity: sha512-TqELu4mOuSIKQCqj63fGVs86Yh+vBx5nHRpWKNUNhB2nPTpfbziTs5c1X358be3peVWA4wPxW7Nt53KIg1tnNw==} + /@aws-sdk/xml-builder@3.496.0: + resolution: {integrity: sha512-GvEjh537IIeOw1ZkZuB37sV12u+ipS5Z1dwjEC/HAvhl5ac23ULtTr1/n+U1gLNN+BAKSWjKiQ2ksj8DiUzeyw==} engines: {node: '>=14.0.0'} dependencies: - tslib: 2.6.1 + '@smithy/types': 2.9.1 + tslib: 2.6.2 dev: false /@babel/code-frame@7.22.5: @@ -2742,7 +2883,7 @@ packages: resolution: {integrity: sha512-rLMyrXuO9jcAUCaQXCMjCMUsWrba5fzHlNK24xz5j2W6A/SRmK8mZJ/hn7V0fViLbxC0lPMtrK1eYzk6Fg03jA==} dependencies: '@firebase/util': 1.9.3 - tslib: 2.6.1 + tslib: 2.6.2 dev: false /@firebase/database-compat@0.3.4: @@ -2753,7 +2894,7 @@ packages: '@firebase/database-types': 0.10.4 '@firebase/logger': 0.4.0 '@firebase/util': 1.9.3 - tslib: 2.6.1 + tslib: 2.6.2 dev: false /@firebase/database-types@0.10.4: @@ -2771,19 +2912,19 @@ packages: '@firebase/logger': 0.4.0 '@firebase/util': 1.9.3 faye-websocket: 0.11.4 - tslib: 2.6.1 + tslib: 2.6.2 dev: false /@firebase/logger@0.4.0: resolution: {integrity: sha512-eRKSeykumZ5+cJPdxxJRgAC3G5NknY2GwEbKfymdnXtnT0Ucm4pspfR6GT4MUQEDuJwRVbVcSx85kgJulMoFFA==} dependencies: - tslib: 2.6.1 + tslib: 2.6.2 dev: false /@firebase/util@1.9.3: resolution: {integrity: sha512-DY02CRhOZwpzO36fHpuVysz6JZrscPiBXD0fXp6qSrL9oNOx5KWICKdR95C0lSITzxp0TZosVyHqzatE8JbcjA==} dependencies: - tslib: 2.6.1 + tslib: 2.6.2 dev: false /@floating-ui/core@1.4.1: @@ -2803,15 +2944,15 @@ packages: resolution: {integrity: sha512-m0G6wlnhm/AX0H12IOWtK8gASEMffnX08RtKkCgTdHb9JpHKGloI7icFfLg9ZmQeavcvR0PKmzxClyuFPSjKWw==} dev: false - /@google-cloud/firestore@6.7.0: - resolution: {integrity: sha512-bkH2jb5KkQSUa+NAvpip9HQ+rpYhi77IaqHovWuN07adVmvNXX08gPpvPWEzoXYa/wDjEVI7LiAtCWkJJEYTNg==} + /@google-cloud/firestore@6.8.0: + resolution: {integrity: sha512-JRpk06SmZXLGz0pNx1x7yU3YhkUXheKgH5hbDZ4kMsdhtfV5qPLJLRI4wv69K0cZorIk+zTMOwptue7hizo0eA==} engines: {node: '>=12.0.0'} requiresBuild: true dependencies: fast-deep-equal: 3.1.3 functional-red-black-tree: 1.0.1 google-gax: 3.6.1 - protobufjs: 7.2.4 + protobufjs: 7.2.5 transitivePeerDependencies: - encoding - supports-color @@ -2821,6 +2962,7 @@ packages: /@google-cloud/paginator@3.0.7: resolution: {integrity: sha512-jJNutk0arIQhmpUUQJPJErsojqo834KcyB6X7a1mxuic8i1tKXxde8E69IZxNZawRIlZdIK2QY4WALvlK5MzYQ==} engines: {node: '>=10'} + requiresBuild: true dependencies: arrify: 2.0.1 extend: 3.0.2 @@ -2830,12 +2972,14 @@ packages: /@google-cloud/projectify@3.0.0: resolution: {integrity: sha512-HRkZsNmjScY6Li8/kb70wjGlDDyLkVk3KvoEo9uIoxSjYLJasGiCch9+PqRVDOCGUFvEIqyogl+BeqILL4OJHA==} engines: {node: '>=12.0.0'} + requiresBuild: true dev: false optional: true /@google-cloud/promisify@3.0.1: resolution: {integrity: sha512-z1CjRjtQyBOYL+5Qr9DdYIfrdLBe746jRTYfaYU6MeXkqp7UfYs/jX16lFFVzZ7PGEJvqZNqYUEtb1mvDww4pA==} engines: {node: '>=12'} + requiresBuild: true dev: false optional: true @@ -2871,6 +3015,7 @@ packages: /@grpc/grpc-js@1.8.21: resolution: {integrity: sha512-KeyQeZpxeEBSqFVTi3q2K7PiPXmgBfECc4updA1ejCLjYmoAlvvM3ZMp5ztTDUCUQmoY3CpDxvchjO1+rFkoHg==} engines: {node: ^8.13.0 || >=10.10.0} + requiresBuild: true dependencies: '@grpc/proto-loader': 0.7.8 '@types/node': 20.4.7 @@ -2881,11 +3026,12 @@ packages: resolution: {integrity: sha512-GU12e2c8dmdXb7XUlOgYWZ2o2i+z9/VeACkxTA/zzAe2IjclC5PnVL0lpgjhrqfpDYHzM8B1TF6pqWegMYAzlA==} engines: {node: '>=6'} hasBin: true + requiresBuild: true dependencies: '@types/long': 4.0.2 lodash.camelcase: 4.3.0 long: 4.0.0 - protobufjs: 7.2.4 + protobufjs: 7.2.5 yargs: 17.7.2 dev: false optional: true @@ -2983,17 +3129,17 @@ packages: /@jsdoc/salty@0.2.5: resolution: {integrity: sha512-TfRP53RqunNe2HBobVBJ0VLhK1HbfvBYeTC1ahnN64PWvyYyGebmMiPkuwvD9fpw2ZbkoPb8Q7mwy0aR8Z9rvw==} engines: {node: '>=v12.0.0'} + requiresBuild: true dependencies: lodash: 4.17.21 dev: false optional: true - /@mongodb-js/saslprep@1.1.1: - resolution: {integrity: sha512-t7c5K033joZZMspnHg/gWPE4kandgc2OxE74aYOtGKfgB9VPuVJPix0H6fhmm2erj5PBJ21mqcx34lpIGtUCsQ==} + /@mongodb-js/saslprep@1.1.0: + resolution: {integrity: sha512-Xfijy7HvfzzqiOAhAepF4SGN5e9leLkMvg/OPOF97XemjfVCYN/oWa75wnkc6mltMSTwY+XlbhWgUOJmkFspSw==} requiresBuild: true dependencies: sparse-bitfield: 3.0.3 - dev: false optional: true /@nodelib/fs.scandir@2.1.5: @@ -3020,26 +3166,31 @@ packages: /@protobufjs/aspromise@1.1.2: resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} + requiresBuild: true dev: false optional: true /@protobufjs/base64@1.1.2: resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} + requiresBuild: true dev: false optional: true /@protobufjs/codegen@2.0.4: resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} + requiresBuild: true dev: false optional: true /@protobufjs/eventemitter@1.1.0: resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} + requiresBuild: true dev: false optional: true /@protobufjs/fetch@1.1.0: resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} + requiresBuild: true dependencies: '@protobufjs/aspromise': 1.1.2 '@protobufjs/inquire': 1.1.0 @@ -3048,26 +3199,31 @@ packages: /@protobufjs/float@1.0.2: resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} + requiresBuild: true dev: false optional: true /@protobufjs/inquire@1.1.0: resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} + requiresBuild: true dev: false optional: true /@protobufjs/path@1.1.2: resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} + requiresBuild: true dev: false optional: true /@protobufjs/pool@1.1.0: resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} + requiresBuild: true dev: false optional: true /@protobufjs/utf8@1.1.0: resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} + requiresBuild: true dev: false optional: true @@ -3232,491 +3388,840 @@ packages: rollup: 2.79.1 dev: false - /@smithy/abort-controller@2.0.3: - resolution: {integrity: sha512-LbQ4fdsVuQC3/18Z/uia5wnk9fk8ikfHl3laYCEGhboEMJ/6oVk3zhydqljMxBCftHGUv7yUrTnZ6EAQhOf+PA==} + /@smithy/abort-controller@2.0.11: + resolution: {integrity: sha512-MSzE1qR2JNyb7ot3blIOT3O3H0Jn06iNDEgHRaqZUwBgx5EG+VIx24Y21tlKofzYryIOcWpIohLrIIyocD6LMA==} engines: {node: '>=14.0.0'} + requiresBuild: true dependencies: - '@smithy/types': 2.2.0 - tslib: 2.6.1 + '@smithy/types': 2.3.5 + tslib: 2.6.2 + optional: true + + /@smithy/abort-controller@2.1.1: + resolution: {integrity: sha512-1+qdrUqLhaALYL0iOcN43EP6yAXXQ2wWZ6taf4S2pNGowmOc5gx+iMQv+E42JizNJjB0+gEadOXeV1Bf7JWL1Q==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/types': 2.9.1 + tslib: 2.6.2 dev: false - /@smithy/chunked-blob-reader-native@2.0.0: - resolution: {integrity: sha512-HM8V2Rp1y8+1343tkZUKZllFhEQPNmpNdgFAncbTsxkZ18/gqjk23XXv3qGyXWp412f3o43ZZ1UZHVcHrpRnCQ==} + /@smithy/chunked-blob-reader-native@2.1.1: + resolution: {integrity: sha512-zNW+43dltfNMUrBEYLMWgI8lQr0uhtTcUyxkgC9EP4j17WREzgSFMPUFVrVV6Rc2+QtWERYjb4tzZnQGa7R9fQ==} dependencies: - '@smithy/util-base64': 2.0.0 - tslib: 2.6.1 + '@smithy/util-base64': 2.1.1 + tslib: 2.6.2 dev: false - /@smithy/chunked-blob-reader@2.0.0: - resolution: {integrity: sha512-k+J4GHJsMSAIQPChGBrjEmGS+WbPonCXesoqP9fynIqjn7rdOThdH8FAeCmokP9mxTYKQAKoHCLPzNlm6gh7Wg==} + /@smithy/chunked-blob-reader@2.1.1: + resolution: {integrity: sha512-NjNFCKxC4jVvn+lUr3Yo4/PmUJj3tbyqH6GNHueyTGS5Q27vlEJ1MkNhUDV8QGxJI7Bodnc2pD18lU2zRfhHlQ==} dependencies: - tslib: 2.6.1 + tslib: 2.6.2 dev: false - /@smithy/config-resolver@2.0.3: - resolution: {integrity: sha512-E+fsc6BOzFOc6U6y9ogRH8Pw2HF1NVW14AAYy7l3OTXYWuYxHb/fzDZaA0FvD/dXyFoMy7AV1rYZsGzD4bMKzw==} + /@smithy/config-resolver@2.0.14: + resolution: {integrity: sha512-K1K+FuWQoy8j/G7lAmK85o03O89s2Vvh6kMFmzEmiHUoQCRH1rzbDtMnGNiaMHeSeYJ6y79IyTusdRG+LuWwtg==} engines: {node: '>=14.0.0'} + requiresBuild: true dependencies: - '@smithy/types': 2.2.0 + '@smithy/node-config-provider': 2.1.1 + '@smithy/types': 2.3.5 '@smithy/util-config-provider': 2.0.0 - '@smithy/util-middleware': 2.0.0 - tslib: 2.6.1 + '@smithy/util-middleware': 2.0.4 + tslib: 2.6.2 + optional: true + + /@smithy/config-resolver@2.1.1: + resolution: {integrity: sha512-lxfLDpZm+AWAHPFZps5JfDoO9Ux1764fOgvRUBpHIO8HWHcSN1dkgsago1qLRVgm1BZ8RCm8cgv99QvtaOWIhw==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/node-config-provider': 2.2.1 + '@smithy/types': 2.9.1 + '@smithy/util-config-provider': 2.2.1 + '@smithy/util-middleware': 2.1.1 + tslib: 2.6.2 dev: false - /@smithy/credential-provider-imds@2.0.1: - resolution: {integrity: sha512-8VxriuRINNEfVZjEFKBY75y9ZWAx73DZ5K/u+3LmB6r8WR2h3NaFxFKMlwlq0uzNdGhD1ouKBn9XWEGYHKiPLw==} + /@smithy/core@1.3.1: + resolution: {integrity: sha512-tf+NIu9FkOh312b6M9G4D68is4Xr7qptzaZGZUREELF8ysE1yLKphqt7nsomjKZVwW7WE5pDDex9idowNGRQ/Q==} engines: {node: '>=14.0.0'} dependencies: - '@smithy/node-config-provider': 2.0.1 - '@smithy/property-provider': 2.0.1 - '@smithy/types': 2.0.2 - '@smithy/url-parser': 2.0.1 - tslib: 2.6.1 + '@smithy/middleware-endpoint': 2.4.1 + '@smithy/middleware-retry': 2.1.1 + '@smithy/middleware-serde': 2.1.1 + '@smithy/protocol-http': 3.1.1 + '@smithy/smithy-client': 2.3.1 + '@smithy/types': 2.9.1 + '@smithy/util-middleware': 2.1.1 + tslib: 2.6.2 dev: false - /@smithy/credential-provider-imds@2.0.3: - resolution: {integrity: sha512-2e85iLgSuiGQ8BBFkot88kuv6sT5DHvkDO8FDvGwNunn2ybf24HhEkaWCMxK4pUeHtnA2dMa3hZbtfmJ7KJQig==} + /@smithy/credential-provider-imds@2.0.16: + resolution: {integrity: sha512-tKa2xF+69TvGxJT+lnJpGrKxUuAZDLYXFhqnPEgnHz+psTpkpcB4QRjHj63+uj83KaeFJdTfW201eLZeRn6FfA==} + engines: {node: '>=14.0.0'} + requiresBuild: true + dependencies: + '@smithy/node-config-provider': 2.1.1 + '@smithy/property-provider': 2.0.12 + '@smithy/types': 2.3.5 + '@smithy/url-parser': 2.0.11 + tslib: 2.6.2 + optional: true + + /@smithy/credential-provider-imds@2.2.1: + resolution: {integrity: sha512-7XHjZUxmZYnONheVQL7j5zvZXga+EWNgwEAP6OPZTi7l8J4JTeNh9aIOfE5fKHZ/ee2IeNOh54ZrSna+Vc6TFA==} engines: {node: '>=14.0.0'} dependencies: - '@smithy/node-config-provider': 2.0.3 - '@smithy/property-provider': 2.0.3 - '@smithy/types': 2.2.0 - '@smithy/url-parser': 2.0.3 - tslib: 2.6.1 + '@smithy/node-config-provider': 2.2.1 + '@smithy/property-provider': 2.1.1 + '@smithy/types': 2.9.1 + '@smithy/url-parser': 2.1.1 + tslib: 2.6.2 dev: false - /@smithy/eventstream-codec@2.0.1: - resolution: {integrity: sha512-/IiNB7gQM2y2ZC/GAWOWDa8+iXfhr1g9Xe5979cQEOdCWDISvrAiv18cn3OtIQUhbYOR3gm7QtCpkq1to2takQ==} + /@smithy/eventstream-codec@2.0.11: + resolution: {integrity: sha512-BQCTjxhCYRZIfXapa2LmZSaH8QUBGwMZw7XRN83hrdixbLjIcj+o549zjkedFS07Ve2TlvWUI6BTzP+nv7snBA==} + requiresBuild: true dependencies: '@aws-crypto/crc32': 3.0.0 - '@smithy/types': 2.2.0 + '@smithy/types': 2.3.5 '@smithy/util-hex-encoding': 2.0.0 - tslib: 2.6.1 - dev: false + tslib: 2.6.2 + optional: true - /@smithy/eventstream-codec@2.0.3: - resolution: {integrity: sha512-3l/uKZBsV/6uMe2qXvh1C8ut/w6JHKgy7ic7N2QPR1SSuNWKNQBX0iVBqJpPtQz0UDeQYM4cNmwDBX+hw74EEw==} + /@smithy/eventstream-codec@2.1.1: + resolution: {integrity: sha512-E8KYBxBIuU4c+zrpR22VsVrOPoEDzk35bQR3E+xm4k6Pa6JqzkDOdMyf9Atac5GPNKHJBdVaQ4JtjdWX2rl/nw==} dependencies: '@aws-crypto/crc32': 3.0.0 - '@smithy/types': 2.2.0 - '@smithy/util-hex-encoding': 2.0.0 - tslib: 2.6.1 + '@smithy/types': 2.9.1 + '@smithy/util-hex-encoding': 2.1.1 + tslib: 2.6.2 dev: false - /@smithy/eventstream-serde-browser@2.0.3: - resolution: {integrity: sha512-RwQeTFnc6nOP6iGjdnMFgDG8QtneHKptrVZxjc+be4KIoXGPyF3QAourxnrClxTl+MACXYUaCg6bWCozqfHMOw==} + /@smithy/eventstream-serde-browser@2.1.1: + resolution: {integrity: sha512-JvEdCmGlZUay5VtlT8/kdR6FlvqTDUiJecMjXsBb0+k1H/qc9ME5n2XKPo8q/MZwEIA1GmGgYMokKGjVvMiDow==} engines: {node: '>=14.0.0'} dependencies: - '@smithy/eventstream-serde-universal': 2.0.3 - '@smithy/types': 2.2.0 - tslib: 2.6.1 + '@smithy/eventstream-serde-universal': 2.1.1 + '@smithy/types': 2.9.1 + tslib: 2.6.2 dev: false - /@smithy/eventstream-serde-config-resolver@2.0.3: - resolution: {integrity: sha512-J8QzPnarBiJaPw5DBsZ5O2GHjfPHhCmKV5iVzdcAFt0PD81UWNL9HMwAKx99mY5WWPCaFKvb1yBeN2g/v4uA2w==} + /@smithy/eventstream-serde-config-resolver@2.1.1: + resolution: {integrity: sha512-EqNqXYp3+dk//NmW3NAgQr9bEQ7fsu/CcxQmTiq07JlaIcne/CBWpMZETyXm9w5LXkhduBsdXdlMscfDUDn2fA==} engines: {node: '>=14.0.0'} dependencies: - '@smithy/types': 2.2.0 - tslib: 2.6.1 + '@smithy/types': 2.9.1 + tslib: 2.6.2 dev: false - /@smithy/eventstream-serde-node@2.0.3: - resolution: {integrity: sha512-085r0AHMhwVF99rlAy8RVMhXMkxay4SdSwRdDUIe4MXQ6r2957BVpm3BcoxRpjcGgnoCldRc9tCRa0TclvUS5w==} + /@smithy/eventstream-serde-node@2.1.1: + resolution: {integrity: sha512-LF882q/aFidFNDX7uROAGxq3H0B7rjyPkV6QDn6/KDQ+CG7AFkRccjxRf1xqajq/Pe4bMGGr+VKAaoF6lELIQw==} engines: {node: '>=14.0.0'} dependencies: - '@smithy/eventstream-serde-universal': 2.0.3 - '@smithy/types': 2.2.0 - tslib: 2.6.1 + '@smithy/eventstream-serde-universal': 2.1.1 + '@smithy/types': 2.9.1 + tslib: 2.6.2 dev: false - /@smithy/eventstream-serde-universal@2.0.3: - resolution: {integrity: sha512-51nLy47MmU9Nb4dwlwsmP1XJViP72kuLtIqTeDeRSe5Ah4xfSP/df11roEhzUmE/rUYEkErj64RHkseeuFkCgg==} + /@smithy/eventstream-serde-universal@2.1.1: + resolution: {integrity: sha512-LR0mMT+XIYTxk4k2fIxEA1BPtW3685QlqufUEUAX1AJcfFfxNDKEvuCRZbO8ntJb10DrIFVJR9vb0MhDCi0sAQ==} engines: {node: '>=14.0.0'} dependencies: - '@smithy/eventstream-codec': 2.0.3 - '@smithy/types': 2.2.0 - tslib: 2.6.1 + '@smithy/eventstream-codec': 2.1.1 + '@smithy/types': 2.9.1 + tslib: 2.6.2 dev: false - /@smithy/fetch-http-handler@2.0.3: - resolution: {integrity: sha512-0if2hyn+tDkyK9Tg1bXpo3IMUaezz/FKlaUTwTey3m87hF8gb7a0nKaST4NURE2eUVimViGCB7SH3/i4wFXALg==} + /@smithy/fetch-http-handler@2.2.2: + resolution: {integrity: sha512-K7aRtRuaBjzlk+jWWeyfDTLAmRRvmA4fU8eHUXtjsuEDgi3f356ZE32VD2ssxIH13RCLVZbXMt5h7wHzYiSuVA==} + requiresBuild: true dependencies: - '@smithy/protocol-http': 2.0.3 - '@smithy/querystring-builder': 2.0.3 - '@smithy/types': 2.2.0 + '@smithy/protocol-http': 3.0.7 + '@smithy/querystring-builder': 2.0.11 + '@smithy/types': 2.3.5 '@smithy/util-base64': 2.0.0 - tslib: 2.6.1 + tslib: 2.6.2 + optional: true + + /@smithy/fetch-http-handler@2.4.1: + resolution: {integrity: sha512-VYGLinPsFqH68lxfRhjQaSkjXM7JysUOJDTNjHBuN/ykyRb2f1gyavN9+VhhPTWCy32L4yZ2fdhpCs/nStEicg==} + dependencies: + '@smithy/protocol-http': 3.1.1 + '@smithy/querystring-builder': 2.1.1 + '@smithy/types': 2.9.1 + '@smithy/util-base64': 2.1.1 + tslib: 2.6.2 dev: false - /@smithy/hash-blob-browser@2.0.3: - resolution: {integrity: sha512-YQywO2eGG4x3klQZ+R7G8X3oCgrzQaCNC3zYq7kcGibE2Z+q9Lzt3prYiODUwAihDJTCG09xHq1p9IW+z/fp+Q==} + /@smithy/hash-blob-browser@2.1.1: + resolution: {integrity: sha512-jizu1+2PAUjiGIfRtlPEU8Yo6zn+d78ti/ZHDesdf1SUn2BuZW433JlPoCOLH3dBoEEvTgLvQ8tUGSoTTALA+A==} dependencies: - '@smithy/chunked-blob-reader': 2.0.0 - '@smithy/chunked-blob-reader-native': 2.0.0 - '@smithy/types': 2.2.0 - tslib: 2.6.1 + '@smithy/chunked-blob-reader': 2.1.1 + '@smithy/chunked-blob-reader-native': 2.1.1 + '@smithy/types': 2.9.1 + tslib: 2.6.2 dev: false - /@smithy/hash-node@2.0.3: - resolution: {integrity: sha512-wtN9eiRKEiryXrPbWQ7Acu0D3Uk65+PowtTqOslViMZNcKNlYHsxOP1S9rb2klnzA3yY1WSPO1tG78pjhRlvrQ==} + /@smithy/hash-node@2.0.11: + resolution: {integrity: sha512-PbleVugN2tbhl1ZoNWVrZ1oTFFas/Hq+s6zGO8B9bv4w/StTriTKA9W+xZJACOj9X7zwfoTLbscM+avCB1KqOQ==} engines: {node: '>=14.0.0'} + requiresBuild: true dependencies: - '@smithy/types': 2.2.0 + '@smithy/types': 2.3.5 '@smithy/util-buffer-from': 2.0.0 '@smithy/util-utf8': 2.0.0 - tslib: 2.6.1 + tslib: 2.6.2 + optional: true + + /@smithy/hash-node@2.1.1: + resolution: {integrity: sha512-Qhoq0N8f2OtCnvUpCf+g1vSyhYQrZjhSwvJ9qvR8BUGOtTXiyv2x1OD2e6jVGmlpC4E4ax1USHoyGfV9JFsACg==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/types': 2.9.1 + '@smithy/util-buffer-from': 2.1.1 + '@smithy/util-utf8': 2.1.1 + tslib: 2.6.2 dev: false - /@smithy/hash-stream-node@2.0.3: - resolution: {integrity: sha512-rFUhbuynRMd1DlYewqXRog2bZIMaDL3sNTAK7fg+7DngPpus7hiIGuXn3tJNnCiqiNuxVrhi/ffWpwt21+8DtA==} + /@smithy/hash-stream-node@2.1.1: + resolution: {integrity: sha512-VgDaKcfCy0iHcmtAZgZ3Yw9g37Gkn2JsQiMtFQXUh8Wmo3GfNgDwLOtdhJ272pOT7DStzpe9cNr+eV5Au8KfQA==} engines: {node: '>=14.0.0'} dependencies: - '@smithy/types': 2.2.0 - '@smithy/util-utf8': 2.0.0 - tslib: 2.6.1 + '@smithy/types': 2.9.1 + '@smithy/util-utf8': 2.1.1 + tslib: 2.6.2 dev: false - /@smithy/invalid-dependency@2.0.3: - resolution: {integrity: sha512-GtmVXD/s+OZlFG1o3HfUI55aBJZXX5/iznAQkgjRGf8prYoO8GvSZLDWHXJp91arybaJxYd133oJORGf4YxGAg==} + /@smithy/invalid-dependency@2.0.11: + resolution: {integrity: sha512-zazq99ujxYv/NOf9zh7xXbNgzoVLsqE0wle8P/1zU/XdhPi/0zohTPKWUzIxjGdqb5hkkwfBkNkl5H+LE0mvgw==} + requiresBuild: true dependencies: - '@smithy/types': 2.2.0 - tslib: 2.6.1 + '@smithy/types': 2.3.5 + tslib: 2.6.2 + optional: true + + /@smithy/invalid-dependency@2.1.1: + resolution: {integrity: sha512-7WTgnKw+VPg8fxu2v9AlNOQ5yaz6RA54zOVB4f6vQuR0xFKd+RzlCpt0WidYTsye7F+FYDIaS/RnJW4pxjNInw==} + dependencies: + '@smithy/types': 2.9.1 + tslib: 2.6.2 dev: false /@smithy/is-array-buffer@2.0.0: resolution: {integrity: sha512-z3PjFjMyZNI98JFRJi/U0nGoLWMSJlDjAW4QUX2WNZLas5C0CmVV6LJ01JI0k90l7FvpmixjWxPFmENSClQ7ug==} engines: {node: '>=14.0.0'} + requiresBuild: true dependencies: - tslib: 2.6.1 + tslib: 2.6.2 + optional: true + + /@smithy/is-array-buffer@2.1.1: + resolution: {integrity: sha512-xozSQrcUinPpNPNPds4S7z/FakDTh1MZWtRP/2vQtYB/u3HYrX2UXuZs+VhaKBd6Vc7g2XPr2ZtwGBNDN6fNKQ==} + engines: {node: '>=14.0.0'} + dependencies: + tslib: 2.6.2 dev: false - /@smithy/md5-js@2.0.3: - resolution: {integrity: sha512-pYnD2US3SioMynHytq4n2BsB5L6uJ7pWKxl9sQqvWwYJXcT3VSnJ0/9adbVcWE+GrMRlGO4CpRg9SIKpdQYR+Q==} + /@smithy/md5-js@2.1.1: + resolution: {integrity: sha512-L3MbIYBIdLlT+MWTYrdVSv/dow1+6iZ1Ad7xS0OHxTTs17d753ZcpOV4Ro7M7tRAVWML/sg2IAp/zzCb6aAttg==} dependencies: - '@smithy/types': 2.2.0 - '@smithy/util-utf8': 2.0.0 - tslib: 2.6.1 + '@smithy/types': 2.9.1 + '@smithy/util-utf8': 2.1.1 + tslib: 2.6.2 dev: false - /@smithy/middleware-content-length@2.0.3: - resolution: {integrity: sha512-2FiZ5vu2+iMRL8XWNaREUqqNHjtBubaY9Jb2b3huZ9EbgrXsJfCszK6PPidHTLe+B4T7AISqdF4ZSp9VPXuelg==} + /@smithy/middleware-content-length@2.0.13: + resolution: {integrity: sha512-Md2kxWpaec3bXp1oERFPQPBhOXCkGSAF7uc1E+4rkwjgw3/tqAXRtbjbggu67HJdwaif76As8AV6XxbD1HzqTQ==} + engines: {node: '>=14.0.0'} + requiresBuild: true + dependencies: + '@smithy/protocol-http': 3.0.7 + '@smithy/types': 2.3.5 + tslib: 2.6.2 + optional: true + + /@smithy/middleware-content-length@2.1.1: + resolution: {integrity: sha512-rSr9ezUl9qMgiJR0UVtVOGEZElMdGFyl8FzWEF5iEKTlcWxGr2wTqGfDwtH3LAB7h+FPkxqv4ZU4cpuCN9Kf/g==} engines: {node: '>=14.0.0'} dependencies: - '@smithy/protocol-http': 2.0.3 - '@smithy/types': 2.2.0 - tslib: 2.6.1 + '@smithy/protocol-http': 3.1.1 + '@smithy/types': 2.9.1 + tslib: 2.6.2 dev: false - /@smithy/middleware-endpoint@2.0.3: - resolution: {integrity: sha512-gNleUHhu5OKk/nrA6WbpLUk/Wk2hcyCvaw7sZiKMazs+zdzWb0kYzynRf675uCWolbvlw9BvkrVaSJo5TRz+Mg==} + /@smithy/middleware-endpoint@2.0.11: + resolution: {integrity: sha512-mCugsvB15up6fqpzUEpMT4CuJmFkEI+KcozA7QMzYguXCaIilyMKsyxgamwmr+o7lo3QdjN0//XLQ9bWFL129g==} + engines: {node: '>=14.0.0'} + requiresBuild: true + dependencies: + '@smithy/middleware-serde': 2.0.11 + '@smithy/types': 2.3.5 + '@smithy/url-parser': 2.0.11 + '@smithy/util-middleware': 2.0.4 + tslib: 2.6.2 + optional: true + + /@smithy/middleware-endpoint@2.4.1: + resolution: {integrity: sha512-XPZTb1E2Oav60Ven3n2PFx+rX9EDsU/jSTA8VDamt7FXks67ekjPY/XrmmPDQaFJOTUHJNKjd8+kZxVO5Ael4Q==} engines: {node: '>=14.0.0'} dependencies: - '@smithy/middleware-serde': 2.0.3 - '@smithy/types': 2.2.0 - '@smithy/url-parser': 2.0.3 - '@smithy/util-middleware': 2.0.0 - tslib: 2.6.1 + '@smithy/middleware-serde': 2.1.1 + '@smithy/node-config-provider': 2.2.1 + '@smithy/shared-ini-file-loader': 2.3.1 + '@smithy/types': 2.9.1 + '@smithy/url-parser': 2.1.1 + '@smithy/util-middleware': 2.1.1 + tslib: 2.6.2 dev: false - /@smithy/middleware-retry@2.0.3: - resolution: {integrity: sha512-BpfaUwgOh8LpWP/x6KBb5IdBmd5+tEpTKIjDt7LWi3IVOYmRX5DjQo1eCEUqlKS1nxws/T7+/IyzvgBq8gF9rw==} + /@smithy/middleware-retry@2.0.16: + resolution: {integrity: sha512-Br5+0yoiMS0ugiOAfJxregzMMGIRCbX4PYo1kDHtLgvkA/d++aHbnHB819m5zOIAMPvPE7AThZgcsoK+WOsUTA==} engines: {node: '>=14.0.0'} + requiresBuild: true dependencies: - '@smithy/protocol-http': 2.0.3 - '@smithy/service-error-classification': 2.0.0 - '@smithy/types': 2.2.0 - '@smithy/util-middleware': 2.0.0 - '@smithy/util-retry': 2.0.0 - tslib: 2.6.1 + '@smithy/node-config-provider': 2.1.1 + '@smithy/protocol-http': 3.0.7 + '@smithy/service-error-classification': 2.0.4 + '@smithy/types': 2.3.5 + '@smithy/util-middleware': 2.0.4 + '@smithy/util-retry': 2.0.4 + tslib: 2.6.2 uuid: 8.3.2 - dev: false + optional: true - /@smithy/middleware-serde@2.0.3: - resolution: {integrity: sha512-5BxuOKL7pXqesvtunniDlvYQXVr7UJEF5nFVoK6+5chf5wplLA8IZWAn3NUcGq/f1u01w2m2q7atCoA6ftRLKA==} + /@smithy/middleware-retry@2.1.1: + resolution: {integrity: sha512-eMIHOBTXro6JZ+WWzZWd/8fS8ht5nS5KDQjzhNMHNRcG5FkNTqcKpYhw7TETMYzbLfhO5FYghHy1vqDWM4FLDA==} engines: {node: '>=14.0.0'} dependencies: - '@smithy/types': 2.2.0 - tslib: 2.6.1 + '@smithy/node-config-provider': 2.2.1 + '@smithy/protocol-http': 3.1.1 + '@smithy/service-error-classification': 2.1.1 + '@smithy/smithy-client': 2.3.1 + '@smithy/types': 2.9.1 + '@smithy/util-middleware': 2.1.1 + '@smithy/util-retry': 2.1.1 + tslib: 2.6.2 + uuid: 8.3.2 dev: false - /@smithy/middleware-stack@2.0.0: - resolution: {integrity: sha512-31XC1xNF65nlbc16yuh3wwTudmqs6qy4EseQUGF8A/p2m/5wdd/cnXJqpniy/XvXVwkHPz/GwV36HqzHtIKATQ==} + /@smithy/middleware-serde@2.0.11: + resolution: {integrity: sha512-NuxnjMyf4zQqhwwdh0OTj5RqpnuT6HcH5Xg5GrPijPcKzc2REXVEVK4Yyk8ckj8ez1XSj/bCmJ+oNjmqB02GWA==} engines: {node: '>=14.0.0'} + requiresBuild: true dependencies: - tslib: 2.6.1 - dev: false + '@smithy/types': 2.3.5 + tslib: 2.6.2 + optional: true - /@smithy/node-config-provider@2.0.1: - resolution: {integrity: sha512-Zoel4CPkKRTQ2XxmozZUfqBYqjPKL53/SvTDhJHj+VBSiJy6MXRav1iDCyFPS92t40Uh+Yi+Km5Ch3hQ+c/zSA==} + /@smithy/middleware-serde@2.1.1: + resolution: {integrity: sha512-D8Gq0aQBeE1pxf3cjWVkRr2W54t+cdM2zx78tNrVhqrDykRA7asq8yVJij1u5NDtKzKqzBSPYh7iW0svUKg76g==} engines: {node: '>=14.0.0'} dependencies: - '@smithy/property-provider': 2.0.1 - '@smithy/shared-ini-file-loader': 2.0.1 - '@smithy/types': 2.0.2 - tslib: 2.6.1 + '@smithy/types': 2.9.1 + tslib: 2.6.2 dev: false - /@smithy/node-config-provider@2.0.3: - resolution: {integrity: sha512-dYSVxOQMqtdmSOBW/J4RPvSYE4KKdGLgFHDJQGNsGo1d3y9IoNLwE32lT7doWwV0ryntlm4QZZwhfb3gISrTtA==} + /@smithy/middleware-stack@2.0.5: + resolution: {integrity: sha512-bVQU/rZzBY7CbSxIrDTGZYnBWKtIw+PL/cRc9B7etZk1IKSOe0NvKMJyWllfhfhrTeMF6eleCzOihIQympAvPw==} engines: {node: '>=14.0.0'} + requiresBuild: true dependencies: - '@smithy/property-provider': 2.0.3 - '@smithy/shared-ini-file-loader': 2.0.3 - '@smithy/types': 2.2.0 - tslib: 2.6.1 + '@smithy/types': 2.3.5 + tslib: 2.6.2 + optional: true + + /@smithy/middleware-stack@2.1.1: + resolution: {integrity: sha512-KPJhRlhsl8CjgGXK/DoDcrFGfAqoqvuwlbxy+uOO4g2Azn1dhH+GVfC3RAp+6PoL5PWPb+vt6Z23FP+Mr6qeCw==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/types': 2.9.1 + tslib: 2.6.2 dev: false - /@smithy/node-http-handler@2.0.3: - resolution: {integrity: sha512-wUO78aa0VVJVz54Lr1Nw6FYnkatbvh2saHgkT8fdtNWc7I/osaPMUJnRkBmTZZ5w+BIQ1rvr9dbGyYBTlRg2+Q==} + /@smithy/node-config-provider@2.1.1: + resolution: {integrity: sha512-1lF6s1YWBi1LBu2O30tD3jyTgMtuvk/Z1twzXM4GPYe4dmZix4nNREPJIPOcfFikNU2o0eTYP80+izx5F2jIJA==} + engines: {node: '>=14.0.0'} + requiresBuild: true + dependencies: + '@smithy/property-provider': 2.0.12 + '@smithy/shared-ini-file-loader': 2.2.0 + '@smithy/types': 2.3.5 + tslib: 2.6.2 + optional: true + + /@smithy/node-config-provider@2.2.1: + resolution: {integrity: sha512-epzK3x1xNxA9oJgHQ5nz+2j6DsJKdHfieb+YgJ7ATWxzNcB7Hc+Uya2TUck5MicOPhDV8HZImND7ZOecVr+OWg==} engines: {node: '>=14.0.0'} dependencies: - '@smithy/abort-controller': 2.0.3 - '@smithy/protocol-http': 2.0.3 - '@smithy/querystring-builder': 2.0.3 - '@smithy/types': 2.2.0 - tslib: 2.6.1 + '@smithy/property-provider': 2.1.1 + '@smithy/shared-ini-file-loader': 2.3.1 + '@smithy/types': 2.9.1 + tslib: 2.6.2 dev: false - /@smithy/property-provider@2.0.1: - resolution: {integrity: sha512-pmJRyY9SF6sutWIktIhe+bUdSQDxv/qZ4mYr3/u+u45riTPN7nmRxPo+e4sjWVoM0caKFjRSlj3tf5teRFy0Vg==} + /@smithy/node-http-handler@2.1.7: + resolution: {integrity: sha512-PQIKZXlp3awCDn/xNlCSTFE7aYG/5Tx33M05NfQmWYeB5yV1GZZOSz4dXpwiNJYTXb9jPqjl+ueXXkwtEluFFA==} + engines: {node: '>=14.0.0'} + requiresBuild: true + dependencies: + '@smithy/abort-controller': 2.0.11 + '@smithy/protocol-http': 3.0.7 + '@smithy/querystring-builder': 2.0.11 + '@smithy/types': 2.3.5 + tslib: 2.6.2 + optional: true + + /@smithy/node-http-handler@2.3.1: + resolution: {integrity: sha512-gLA8qK2nL9J0Rk/WEZSvgin4AppvuCYRYg61dcUo/uKxvMZsMInL5I5ZdJTogOvdfVug3N2dgI5ffcUfS4S9PA==} engines: {node: '>=14.0.0'} dependencies: - '@smithy/types': 2.0.2 - tslib: 2.6.1 + '@smithy/abort-controller': 2.1.1 + '@smithy/protocol-http': 3.1.1 + '@smithy/querystring-builder': 2.1.1 + '@smithy/types': 2.9.1 + tslib: 2.6.2 dev: false - /@smithy/property-provider@2.0.3: - resolution: {integrity: sha512-SHV1SINUNysJ5HyPrMLHLkdofgalk9+5FnQCB/985hqcUxstN616hPZ7ngOjLpdhKp0yu1ul/esE9Gd4qh1tgg==} + /@smithy/property-provider@2.0.12: + resolution: {integrity: sha512-Un/OvvuQ1Kg8WYtoMCicfsFFuHb/TKL3pCA6ZIo/WvNTJTR94RtoRnL7mY4XkkUAoFMyf6KjcQJ76y1FX7S5rw==} + engines: {node: '>=14.0.0'} + requiresBuild: true + dependencies: + '@smithy/types': 2.3.5 + tslib: 2.6.2 + optional: true + + /@smithy/property-provider@2.1.1: + resolution: {integrity: sha512-FX7JhhD/o5HwSwg6GLK9zxrMUrGnb3PzNBrcthqHKBc3dH0UfgEAU24xnJ8F0uow5mj17UeBEOI6o3CF2k7Mhw==} engines: {node: '>=14.0.0'} dependencies: - '@smithy/types': 2.2.0 - tslib: 2.6.1 + '@smithy/types': 2.9.1 + tslib: 2.6.2 dev: false - /@smithy/protocol-http@2.0.3: - resolution: {integrity: sha512-yzBYloviSLOwo2RT62vBRCPtk8mc/O2RMJfynEahbX8ZnduHpKaajvx3IuGubhamIbesi7M5HBVecDehBnlb9Q==} + /@smithy/protocol-http@3.0.7: + resolution: {integrity: sha512-HnZW8y+r66ntYueCDbLqKwWcMNWW8o3eVpSrHNluwtBJ/EUWfQHRKSiu6vZZtc6PGfPQWgVfucoCE/C3QufMAA==} engines: {node: '>=14.0.0'} + requiresBuild: true dependencies: - '@smithy/types': 2.2.0 - tslib: 2.6.1 + '@smithy/types': 2.3.5 + tslib: 2.6.2 + optional: true + + /@smithy/protocol-http@3.1.1: + resolution: {integrity: sha512-6ZRTSsaXuSL9++qEwH851hJjUA0OgXdQFCs+VDw4tGH256jQ3TjYY/i34N4vd24RV3nrjNsgd1yhb57uMoKbzQ==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/types': 2.9.1 + tslib: 2.6.2 dev: false - /@smithy/querystring-builder@2.0.3: - resolution: {integrity: sha512-HPSviVgGj9FT4jPdprkfSGF3nhFzpQMST1hOC1Oh6eaRB2KTQCsOZmS7U4IqGErVPafe6f/yRa1DV73B5gO50w==} + /@smithy/querystring-builder@2.0.11: + resolution: {integrity: sha512-b4kEbVMxpmfv2VWUITn2otckTi7GlMteZQxi+jlwedoATOGEyrCJPfRcYQJjbCi3fZ2QTfh3PcORvB27+j38Yg==} engines: {node: '>=14.0.0'} + requiresBuild: true dependencies: - '@smithy/types': 2.2.0 + '@smithy/types': 2.3.5 '@smithy/util-uri-escape': 2.0.0 - tslib: 2.6.1 - dev: false + tslib: 2.6.2 + optional: true - /@smithy/querystring-parser@2.0.1: - resolution: {integrity: sha512-h+e7k1z+IvI2sSbUBG9Aq46JsgLl4UqIUl6aigAlRBj+P6ocNXpM6Yn1vMBw5ijtXeZbYpd1YvCxwDgdw3jhmg==} + /@smithy/querystring-builder@2.1.1: + resolution: {integrity: sha512-C/ko/CeEa8jdYE4gt6nHO5XDrlSJ3vdCG0ZAc6nD5ZIE7LBp0jCx4qoqp7eoutBu7VrGMXERSRoPqwi1WjCPbg==} engines: {node: '>=14.0.0'} dependencies: - '@smithy/types': 2.0.2 - tslib: 2.6.1 + '@smithy/types': 2.9.1 + '@smithy/util-uri-escape': 2.1.1 + tslib: 2.6.2 dev: false - /@smithy/querystring-parser@2.0.3: - resolution: {integrity: sha512-AaiZ2osstDbmOTz5uY+96o0G1E7k1U7dCYrNT8FFcyffdhScTzG7fXr12f5peie2W0XFu2Ub+b6tQwFuZwPoBA==} + /@smithy/querystring-parser@2.0.11: + resolution: {integrity: sha512-YXe7jhi7s3dQ0Fu9dLoY/gLu6NCyy8tBWJL/v2c9i7/RLpHgKT+uT96/OqZkHizCJ4kr0ZD46tzMjql/o60KLg==} engines: {node: '>=14.0.0'} + requiresBuild: true dependencies: - '@smithy/types': 2.2.0 - tslib: 2.6.1 - dev: false + '@smithy/types': 2.3.5 + tslib: 2.6.2 + optional: true - /@smithy/service-error-classification@2.0.0: - resolution: {integrity: sha512-2z5Nafy1O0cTf69wKyNjGW/sNVMiqDnb4jgwfMG8ye8KnFJ5qmJpDccwIbJNhXIfbsxTg9SEec2oe1cexhMJvw==} + /@smithy/querystring-parser@2.1.1: + resolution: {integrity: sha512-H4+6jKGVhG1W4CIxfBaSsbm98lOO88tpDWmZLgkJpt8Zkk/+uG0FmmqMuCAc3HNM2ZDV+JbErxr0l5BcuIf/XQ==} engines: {node: '>=14.0.0'} + dependencies: + '@smithy/types': 2.9.1 + tslib: 2.6.2 dev: false - /@smithy/shared-ini-file-loader@2.0.1: - resolution: {integrity: sha512-a463YiZrPGvM+F336rIF8pLfQsHAdCRAn/BiI/EWzg5xLoxbC7GSxIgliDDXrOu0z8gT3nhVsif85eU6jyct3A==} + /@smithy/service-error-classification@2.0.4: + resolution: {integrity: sha512-77506l12I5gxTZqBkx3Wb0RqMG81bMYLaVQ+EqIWFwQDJRs5UFeXogKxSKojCmz1wLUziHZQXm03MBzPQiumQw==} engines: {node: '>=14.0.0'} + requiresBuild: true dependencies: - '@smithy/types': 2.2.0 - tslib: 2.6.1 + '@smithy/types': 2.3.5 + optional: true + + /@smithy/service-error-classification@2.1.1: + resolution: {integrity: sha512-txEdZxPUgM1PwGvDvHzqhXisrc5LlRWYCf2yyHfvITWioAKat7srQvpjMAvgzf0t6t7j8yHrryXU9xt7RZqFpw==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/types': 2.9.1 dev: false - /@smithy/shared-ini-file-loader@2.0.3: - resolution: {integrity: sha512-1Vgco3K0rN5YG2OStoS2zUrBzdcFqgqp475rGdag206PCh7AHzmVSGXL6OpWPAqZl29WUqXfMP8tHOLG0H6vkA==} + /@smithy/shared-ini-file-loader@2.2.0: + resolution: {integrity: sha512-xFXqs4vAb5BdkzHSRrTapFoaqS4/3m/CGZzdw46fBjYZ0paYuLAoMY60ICCn1FfGirG+PiJ3eWcqJNe4/SkfyA==} + engines: {node: '>=14.0.0'} + requiresBuild: true + dependencies: + '@smithy/types': 2.3.5 + tslib: 2.6.2 + optional: true + + /@smithy/shared-ini-file-loader@2.3.1: + resolution: {integrity: sha512-2E2kh24igmIznHLB6H05Na4OgIEilRu0oQpYXo3LCNRrawHAcfDKq9004zJs+sAMt2X5AbY87CUCJ7IpqpSgdw==} engines: {node: '>=14.0.0'} dependencies: - '@smithy/types': 2.2.0 - tslib: 2.6.1 + '@smithy/types': 2.9.1 + tslib: 2.6.2 dev: false - /@smithy/signature-v4@2.0.1: - resolution: {integrity: sha512-jztv5Mirca42ilxmMDjzLdXcoAmRhZskGafGL49sRo5u7swEZcToEFrq6vtX5YMbSyTVrE9Teog5EFexY5Ff2Q==} + /@smithy/signature-v4@2.0.11: + resolution: {integrity: sha512-EFVU1dT+2s8xi227l1A9O27edT/GNKvyAK6lZnIZ0zhIHq/jSLznvkk15aonGAM1kmhmZBVGpI7Tt0odueZK9A==} engines: {node: '>=14.0.0'} + requiresBuild: true dependencies: - '@smithy/eventstream-codec': 2.0.1 + '@smithy/eventstream-codec': 2.0.11 '@smithy/is-array-buffer': 2.0.0 - '@smithy/types': 2.2.0 + '@smithy/types': 2.3.5 '@smithy/util-hex-encoding': 2.0.0 - '@smithy/util-middleware': 2.0.0 + '@smithy/util-middleware': 2.0.4 '@smithy/util-uri-escape': 2.0.0 '@smithy/util-utf8': 2.0.0 - tslib: 2.6.1 - dev: false + tslib: 2.6.2 + optional: true - /@smithy/smithy-client@2.0.3: - resolution: {integrity: sha512-YP0HakPOJgvX2wvPEAGH9GB3NfuQE8CmBhR13bWtqWuIErmJnInTiSQcLSc0QiXHclH/8Qlq+qjKCR7N/4wvtQ==} + /@smithy/signature-v4@2.1.1: + resolution: {integrity: sha512-Hb7xub0NHuvvQD3YwDSdanBmYukoEkhqBjqoxo+bSdC0ryV9cTfgmNjuAQhTPYB6yeU7hTR+sPRiFMlxqv6kmg==} engines: {node: '>=14.0.0'} dependencies: - '@smithy/middleware-stack': 2.0.0 - '@smithy/types': 2.2.0 - '@smithy/util-stream': 2.0.3 - tslib: 2.6.1 + '@smithy/eventstream-codec': 2.1.1 + '@smithy/is-array-buffer': 2.1.1 + '@smithy/types': 2.9.1 + '@smithy/util-hex-encoding': 2.1.1 + '@smithy/util-middleware': 2.1.1 + '@smithy/util-uri-escape': 2.1.1 + '@smithy/util-utf8': 2.1.1 + tslib: 2.6.2 dev: false - /@smithy/types@2.0.2: - resolution: {integrity: sha512-wcymEjIXQ9+NEfE5Yt5TInAqe1o4n+Nh+rh00AwoazppmUt8tdo6URhc5gkDcOYrcvlDVAZE7uG69nDpEGUKxw==} + /@smithy/smithy-client@2.1.10: + resolution: {integrity: sha512-2OEmZDiW1Z196QHuQZ5M6cBE8FCSG0H2HADP1G+DY8P3agsvb0YJyfhyKuJbxIQy15tr3eDAK6FOrlbxgKOOew==} engines: {node: '>=14.0.0'} + requiresBuild: true dependencies: - tslib: 2.6.1 - dev: false + '@smithy/middleware-stack': 2.0.5 + '@smithy/types': 2.3.5 + '@smithy/util-stream': 2.0.15 + tslib: 2.6.2 + optional: true - /@smithy/types@2.2.0: - resolution: {integrity: sha512-Ahpt9KvD0mWeWiyaGo5EBE7KOByLl3jl4CD9Ps/r8qySgzVzo/4qsa+vvstOU3ZEriALmrPqUKIhqHt0Rn+m6g==} + /@smithy/smithy-client@2.3.1: + resolution: {integrity: sha512-YsTdU8xVD64r2pLEwmltrNvZV6XIAC50LN6ivDopdt+YiF/jGH6PY9zUOu0CXD/d8GMB8gbhnpPsdrjAXHS9QA==} engines: {node: '>=14.0.0'} dependencies: - tslib: 2.6.1 + '@smithy/middleware-endpoint': 2.4.1 + '@smithy/middleware-stack': 2.1.1 + '@smithy/protocol-http': 3.1.1 + '@smithy/types': 2.9.1 + '@smithy/util-stream': 2.1.1 + tslib: 2.6.2 dev: false - /@smithy/url-parser@2.0.1: - resolution: {integrity: sha512-NpHVOAwddo+OyyIoujDL9zGL96piHWrTNXqltWmBvlUoWgt1HPyBuKs6oHjioyFnNZXUqveTOkEEq0U5w6Uv8A==} + /@smithy/types@2.3.5: + resolution: {integrity: sha512-ehyDt8M9hehyxrLQGoA1BGPou8Js1Ocoh5M0ngDhJMqbFmNK5N6Xhr9/ZExWkyIW8XcGkiMPq3ZUEE0ScrhbuQ==} + engines: {node: '>=14.0.0'} + requiresBuild: true dependencies: - '@smithy/querystring-parser': 2.0.1 - '@smithy/types': 2.0.2 - tslib: 2.6.1 - dev: false + tslib: 2.6.2 + optional: true + + /@smithy/types@2.9.1: + resolution: {integrity: sha512-vjXlKNXyprDYDuJ7UW5iobdmyDm6g8dDG+BFUncAg/3XJaN45Gy5RWWWUVgrzIK7S4R1KWgIX5LeJcfvSI24bw==} + engines: {node: '>=14.0.0'} + dependencies: + tslib: 2.6.2 + + /@smithy/url-parser@2.0.11: + resolution: {integrity: sha512-h89yXMCCF+S5k9XIoKltMIWTYj+FcEkU/IIFZ6RtE222fskOTL4Iak6ZRG+ehSvZDt8yKEcxqheTDq7JvvtK3g==} + requiresBuild: true + dependencies: + '@smithy/querystring-parser': 2.0.11 + '@smithy/types': 2.3.5 + tslib: 2.6.2 + optional: true - /@smithy/url-parser@2.0.3: - resolution: {integrity: sha512-O7NlbDL4kh+th6qwtL7wNRcPCuOXFRWJzWKywfB/Nv56N1F8KiK0KbPn1z7MU5du/0LgjAMvhkg0mVDyiMCnqw==} + /@smithy/url-parser@2.1.1: + resolution: {integrity: sha512-qC9Bv8f/vvFIEkHsiNrUKYNl8uKQnn4BdhXl7VzQRP774AwIjiSMMwkbT+L7Fk8W8rzYVifzJNYxv1HwvfBo3Q==} dependencies: - '@smithy/querystring-parser': 2.0.3 - '@smithy/types': 2.2.0 - tslib: 2.6.1 + '@smithy/querystring-parser': 2.1.1 + '@smithy/types': 2.9.1 + tslib: 2.6.2 dev: false /@smithy/util-base64@2.0.0: resolution: {integrity: sha512-Zb1E4xx+m5Lud8bbeYi5FkcMJMnn+1WUnJF3qD7rAdXpaL7UjkFQLdmW5fHadoKbdHpwH9vSR8EyTJFHJs++tA==} engines: {node: '>=14.0.0'} + requiresBuild: true dependencies: '@smithy/util-buffer-from': 2.0.0 - tslib: 2.6.1 + tslib: 2.6.2 + optional: true + + /@smithy/util-base64@2.1.1: + resolution: {integrity: sha512-UfHVpY7qfF/MrgndI5PexSKVTxSZIdz9InghTFa49QOvuu9I52zLPLUHXvHpNuMb1iD2vmc6R+zbv/bdMipR/g==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/util-buffer-from': 2.1.1 + tslib: 2.6.2 dev: false /@smithy/util-body-length-browser@2.0.0: resolution: {integrity: sha512-JdDuS4ircJt+FDnaQj88TzZY3+njZ6O+D3uakS32f2VNnDo3vyEuNdBOh/oFd8Df1zSZOuH1HEChk2AOYDezZg==} + requiresBuild: true dependencies: - tslib: 2.6.1 + tslib: 2.6.2 + optional: true + + /@smithy/util-body-length-browser@2.1.1: + resolution: {integrity: sha512-ekOGBLvs1VS2d1zM2ER4JEeBWAvIOUKeaFch29UjjJsxmZ/f0L3K3x0dEETgh3Q9bkZNHgT+rkdl/J/VUqSRag==} + dependencies: + tslib: 2.6.2 dev: false - /@smithy/util-body-length-node@2.0.0: - resolution: {integrity: sha512-ZV7Z/WHTMxHJe/xL/56qZwSUcl63/5aaPAGjkfynJm4poILjdD4GmFI+V+YWabh2WJIjwTKZ5PNsuvPQKt93Mg==} + /@smithy/util-body-length-node@2.1.0: + resolution: {integrity: sha512-/li0/kj/y3fQ3vyzn36NTLGmUwAICb7Jbe/CsWCktW363gh1MOcpEcSO3mJ344Gv2dqz8YJCLQpb6hju/0qOWw==} + engines: {node: '>=14.0.0'} + requiresBuild: true + dependencies: + tslib: 2.6.2 + optional: true + + /@smithy/util-body-length-node@2.2.1: + resolution: {integrity: sha512-/ggJG+ta3IDtpNVq4ktmEUtOkH1LW64RHB5B0hcr5ZaWBmo96UX2cIOVbjCqqDickTXqBWZ4ZO0APuaPrD7Abg==} engines: {node: '>=14.0.0'} dependencies: - tslib: 2.6.1 + tslib: 2.6.2 dev: false /@smithy/util-buffer-from@2.0.0: resolution: {integrity: sha512-/YNnLoHsR+4W4Vf2wL5lGv0ksg8Bmk3GEGxn2vEQt52AQaPSCuaO5PM5VM7lP1K9qHRKHwrPGktqVoAHKWHxzw==} engines: {node: '>=14.0.0'} + requiresBuild: true dependencies: '@smithy/is-array-buffer': 2.0.0 - tslib: 2.6.1 + tslib: 2.6.2 + optional: true + + /@smithy/util-buffer-from@2.1.1: + resolution: {integrity: sha512-clhNjbyfqIv9Md2Mg6FffGVrJxw7bgK7s3Iax36xnfVj6cg0fUG7I4RH0XgXJF8bxi+saY5HR21g2UPKSxVCXg==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/is-array-buffer': 2.1.1 + tslib: 2.6.2 dev: false /@smithy/util-config-provider@2.0.0: resolution: {integrity: sha512-xCQ6UapcIWKxXHEU4Mcs2s7LcFQRiU3XEluM2WcCjjBtQkUN71Tb+ydGmJFPxMUrW/GWMgQEEGipLym4XG0jZg==} engines: {node: '>=14.0.0'} + requiresBuild: true dependencies: - tslib: 2.6.1 + tslib: 2.6.2 + optional: true + + /@smithy/util-config-provider@2.2.1: + resolution: {integrity: sha512-50VL/tx9oYYcjJn/qKqNy7sCtpD0+s8XEBamIFo4mFFTclKMNp+rsnymD796uybjiIquB7VCB/DeafduL0y2kw==} + engines: {node: '>=14.0.0'} + dependencies: + tslib: 2.6.2 dev: false - /@smithy/util-defaults-mode-browser@2.0.3: - resolution: {integrity: sha512-t9cirP55wYeSfDjjvPHSjNiuZj3wc9W3W3fjLXaVzuKKlKX98B9Vj7QM9WHJnFjJdsrYEwolLA8GVdqZeHOkHg==} + /@smithy/util-defaults-mode-browser@2.0.14: + resolution: {integrity: sha512-NupG7SWUucm3vJrvlpt9jG1XeoPJphjcivgcUUXhDJbUPy4F04LhlTiAhWSzwlCNcF8OJsMvZ/DWbpYD3pselw==} + engines: {node: '>= 10.0.0'} + requiresBuild: true + dependencies: + '@smithy/property-provider': 2.0.12 + '@smithy/smithy-client': 2.1.10 + '@smithy/types': 2.3.5 + bowser: 2.11.0 + tslib: 2.6.2 + optional: true + + /@smithy/util-defaults-mode-browser@2.1.1: + resolution: {integrity: sha512-lqLz/9aWRO6mosnXkArtRuQqqZBhNpgI65YDpww4rVQBuUT7qzKbDLG5AmnQTCiU4rOquaZO/Kt0J7q9Uic7MA==} engines: {node: '>= 10.0.0'} dependencies: - '@smithy/property-provider': 2.0.3 - '@smithy/types': 2.2.0 + '@smithy/property-provider': 2.1.1 + '@smithy/smithy-client': 2.3.1 + '@smithy/types': 2.9.1 bowser: 2.11.0 - tslib: 2.6.1 + tslib: 2.6.2 dev: false - /@smithy/util-defaults-mode-node@2.0.3: - resolution: {integrity: sha512-Gca+fL0h+tl8cbvoLDMWCVzs1CL4jWLWvz/I6MCYZzaEAKkmd1qO4kPzBeGaI6hGA/IbrlWCFg7L+MTPzLwzfg==} + /@smithy/util-defaults-mode-node@2.0.18: + resolution: {integrity: sha512-+3jMom/b/Cdp21tDnY4vKu249Al+G/P0HbRbct7/aSZDlROzv1tksaYukon6UUv7uoHn+/McqnsvqZHLlqvQ0g==} engines: {node: '>= 10.0.0'} + requiresBuild: true dependencies: - '@smithy/config-resolver': 2.0.3 - '@smithy/credential-provider-imds': 2.0.3 - '@smithy/node-config-provider': 2.0.3 - '@smithy/property-provider': 2.0.3 - '@smithy/types': 2.2.0 - tslib: 2.6.1 + '@smithy/config-resolver': 2.0.14 + '@smithy/credential-provider-imds': 2.0.16 + '@smithy/node-config-provider': 2.1.1 + '@smithy/property-provider': 2.0.12 + '@smithy/smithy-client': 2.1.10 + '@smithy/types': 2.3.5 + tslib: 2.6.2 + optional: true + + /@smithy/util-defaults-mode-node@2.1.1: + resolution: {integrity: sha512-tYVrc+w+jSBfBd267KDnvSGOh4NMz+wVH7v4CClDbkdPfnjvImBZsOURncT5jsFwR9KCuDyPoSZq4Pa6+eCUrA==} + engines: {node: '>= 10.0.0'} + dependencies: + '@smithy/config-resolver': 2.1.1 + '@smithy/credential-provider-imds': 2.2.1 + '@smithy/node-config-provider': 2.2.1 + '@smithy/property-provider': 2.1.1 + '@smithy/smithy-client': 2.3.1 + '@smithy/types': 2.9.1 + tslib: 2.6.2 + dev: false + + /@smithy/util-endpoints@1.1.1: + resolution: {integrity: sha512-sI4d9rjoaekSGEtq3xSb2nMjHMx8QXcz2cexnVyRWsy4yQ9z3kbDpX+7fN0jnbdOp0b3KSTZJZ2Yb92JWSanLw==} + engines: {node: '>= 14.0.0'} + dependencies: + '@smithy/node-config-provider': 2.2.1 + '@smithy/types': 2.9.1 + tslib: 2.6.2 dev: false /@smithy/util-hex-encoding@2.0.0: resolution: {integrity: sha512-c5xY+NUnFqG6d7HFh1IFfrm3mGl29lC+vF+geHv4ToiuJCBmIfzx6IeHLg+OgRdPFKDXIw6pvi+p3CsscaMcMA==} engines: {node: '>=14.0.0'} + requiresBuild: true dependencies: - tslib: 2.6.1 + tslib: 2.6.2 + optional: true + + /@smithy/util-hex-encoding@2.1.1: + resolution: {integrity: sha512-3UNdP2pkYUUBGEXzQI9ODTDK+Tcu1BlCyDBaRHwyxhA+8xLP8agEKQq4MGmpjqb4VQAjq9TwlCQX0kP6XDKYLg==} + engines: {node: '>=14.0.0'} + dependencies: + tslib: 2.6.2 dev: false - /@smithy/util-middleware@2.0.0: - resolution: {integrity: sha512-eCWX4ECuDHn1wuyyDdGdUWnT4OGyIzV0LN1xRttBFMPI9Ff/4heSHVxneyiMtOB//zpXWCha1/SWHJOZstG7kA==} + /@smithy/util-middleware@2.0.4: + resolution: {integrity: sha512-Pbu6P4MBwRcjrLgdTR1O4Y3c0sTZn2JdOiJNcgL7EcIStcQodj+6ZTXtbyU/WTEU3MV2NMA10LxFc3AWHZ3+4A==} + engines: {node: '>=14.0.0'} + requiresBuild: true + dependencies: + '@smithy/types': 2.3.5 + tslib: 2.6.2 + optional: true + + /@smithy/util-middleware@2.1.1: + resolution: {integrity: sha512-mKNrk8oz5zqkNcbcgAAepeJbmfUW6ogrT2Z2gDbIUzVzNAHKJQTYmH9jcy0jbWb+m7ubrvXKb6uMjkSgAqqsFA==} engines: {node: '>=14.0.0'} dependencies: - tslib: 2.6.1 + '@smithy/types': 2.9.1 + tslib: 2.6.2 dev: false - /@smithy/util-retry@2.0.0: - resolution: {integrity: sha512-/dvJ8afrElasuiiIttRJeoS2sy8YXpksQwiM/TcepqdRVp7u4ejd9C4IQURHNjlfPUT7Y6lCDSa2zQJbdHhVTg==} + /@smithy/util-retry@2.0.4: + resolution: {integrity: sha512-b+n1jBBKc77C1E/zfBe1Zo7S9OXGBiGn55N0apfhZHxPUP/fMH5AhFUUcWaJh7NAnah284M5lGkBKuhnr3yK5w==} + engines: {node: '>= 14.0.0'} + requiresBuild: true + dependencies: + '@smithy/service-error-classification': 2.0.4 + '@smithy/types': 2.3.5 + tslib: 2.6.2 + optional: true + + /@smithy/util-retry@2.1.1: + resolution: {integrity: sha512-Mg+xxWPTeSPrthpC5WAamJ6PW4Kbo01Fm7lWM1jmGRvmrRdsd3192Gz2fBXAMURyXpaNxyZf6Hr/nQ4q70oVEA==} engines: {node: '>= 14.0.0'} dependencies: - '@smithy/service-error-classification': 2.0.0 - tslib: 2.6.1 + '@smithy/service-error-classification': 2.1.1 + '@smithy/types': 2.9.1 + tslib: 2.6.2 dev: false - /@smithy/util-stream@2.0.3: - resolution: {integrity: sha512-+8n2vIyp6o9KHGey0PoGatcDthwVb7C/EzWfqojXrHhZOXy6l+hnWlfoF8zVerKYH2CUtravdJKRTy7vdkOXfQ==} + /@smithy/util-stream@2.0.15: + resolution: {integrity: sha512-A/hkYJPH2N5MCWYvky4tTpQihpYAEzqnUfxDyG3L/yMndy/2sLvxnyQal9Opuj1e9FiKSTeMyjnU9xxZGs0mRw==} engines: {node: '>=14.0.0'} + requiresBuild: true dependencies: - '@smithy/fetch-http-handler': 2.0.3 - '@smithy/node-http-handler': 2.0.3 - '@smithy/types': 2.2.0 + '@smithy/fetch-http-handler': 2.2.2 + '@smithy/node-http-handler': 2.1.7 + '@smithy/types': 2.3.5 '@smithy/util-base64': 2.0.0 '@smithy/util-buffer-from': 2.0.0 '@smithy/util-hex-encoding': 2.0.0 '@smithy/util-utf8': 2.0.0 - tslib: 2.6.1 + tslib: 2.6.2 + optional: true + + /@smithy/util-stream@2.1.1: + resolution: {integrity: sha512-J7SMIpUYvU4DQN55KmBtvaMc7NM3CZ2iWICdcgaovtLzseVhAqFRYqloT3mh0esrFw+3VEK6nQFteFsTqZSECQ==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/fetch-http-handler': 2.4.1 + '@smithy/node-http-handler': 2.3.1 + '@smithy/types': 2.9.1 + '@smithy/util-base64': 2.1.1 + '@smithy/util-buffer-from': 2.1.1 + '@smithy/util-hex-encoding': 2.1.1 + '@smithy/util-utf8': 2.1.1 + tslib: 2.6.2 dev: false /@smithy/util-uri-escape@2.0.0: resolution: {integrity: sha512-ebkxsqinSdEooQduuk9CbKcI+wheijxEb3utGXkCoYQkJnwTnLbH1JXGimJtUkQwNQbsbuYwG2+aFVyZf5TLaw==} engines: {node: '>=14.0.0'} + requiresBuild: true + dependencies: + tslib: 2.6.2 + optional: true + + /@smithy/util-uri-escape@2.1.1: + resolution: {integrity: sha512-saVzI1h6iRBUVSqtnlOnc9ssU09ypo7n+shdQ8hBTZno/9rZ3AuRYvoHInV57VF7Qn7B+pFJG7qTzFiHxWlWBw==} + engines: {node: '>=14.0.0'} dependencies: - tslib: 2.6.1 + tslib: 2.6.2 dev: false /@smithy/util-utf8@2.0.0: resolution: {integrity: sha512-rctU1VkziY84n5OXe3bPNpKR001ZCME2JCaBBFgtiM2hfKbHFudc/BkMuPab8hRbLd0j3vbnBTTZ1igBf0wgiQ==} engines: {node: '>=14.0.0'} + requiresBuild: true dependencies: '@smithy/util-buffer-from': 2.0.0 - tslib: 2.6.1 + tslib: 2.6.2 + optional: true + + /@smithy/util-utf8@2.1.1: + resolution: {integrity: sha512-BqTpzYEcUMDwAKr7/mVRUtHDhs6ZoXDi9NypMvMfOr/+u1NW7JgqodPDECiiLboEm6bobcPcECxzjtQh865e9A==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/util-buffer-from': 2.1.1 + tslib: 2.6.2 dev: false - /@smithy/util-waiter@2.0.3: - resolution: {integrity: sha512-3/Fzqoyecvh4cNvcHQDl1GznskXjGc9uZ8N6aoaPCKfsctgZad/J13xg8WC1UXc3PwKocHtuUvz0dRFDLaBppQ==} + /@smithy/util-waiter@2.1.1: + resolution: {integrity: sha512-kYy6BLJJNif+uqNENtJqWdXcpqo1LS+nj1AfXcDhOpqpSHJSAkVySLyZV9fkmuVO21lzGoxjvd1imGGJHph/IA==} engines: {node: '>=14.0.0'} dependencies: - '@smithy/abort-controller': 2.0.3 - '@smithy/types': 2.2.0 - tslib: 2.6.1 + '@smithy/abort-controller': 2.1.1 + '@smithy/types': 2.9.1 + tslib: 2.6.2 dev: false /@socket.io/component-emitter@3.1.0: @@ -4175,6 +4680,7 @@ packages: /@tootallnate/once@2.0.0: resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} engines: {node: '>= 10'} + requiresBuild: true dev: false optional: true @@ -4264,6 +4770,7 @@ packages: /@types/glob@8.1.0: resolution: {integrity: sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==} + requiresBuild: true dependencies: '@types/minimatch': 5.1.2 '@types/node': 20.4.7 @@ -4289,16 +4796,19 @@ packages: /@types/linkify-it@3.0.2: resolution: {integrity: sha512-HZQYqbiFVWufzCwexrvh694SOim8z2d+xJl5UNamcvQFejLY/2YUtzXHYi3cHdI7PMlS8ejH2slRAOJQ32aNbA==} + requiresBuild: true dev: false optional: true /@types/long@4.0.2: resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==} + requiresBuild: true dev: false optional: true /@types/markdown-it@12.2.3: resolution: {integrity: sha512-GKMHFfv3458yYy+v/N8gjufHO6MSZKCOXpZc5GXIWWy8uldwfmPn98vp81gZ5f9SVw8YYBctgfJ22a2d7AOMeQ==} + requiresBuild: true dependencies: '@types/linkify-it': 3.0.2 '@types/mdurl': 1.0.2 @@ -4307,6 +4817,7 @@ packages: /@types/mdurl@1.0.2: resolution: {integrity: sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA==} + requiresBuild: true dev: false optional: true @@ -4316,12 +4827,12 @@ packages: /@types/minimatch@5.1.2: resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} + requiresBuild: true dev: false optional: true /@types/node@20.4.7: resolution: {integrity: sha512-bUBrPjEry2QUTsnuEjzjbS7voGWCc30W0qzgMf90GPeDGFRakvrz47ju+oqDAKCXLUCe39u57/ORMl/O/04/9g==} - dev: false /@types/object.omit@3.0.0: resolution: {integrity: sha512-I27IoPpH250TUzc9FzXd0P1BV/BMJuzqD3jOz98ehf9dQqGkxlq+hO1bIqZGWqCg5bVOy0g4AUVJtnxe0klDmw==} @@ -4369,6 +4880,7 @@ packages: /@types/rimraf@3.0.2: resolution: {integrity: sha512-F3OznnSLAUxFrCEu/L5PY8+ny8DtcFRjx7fZZ9bycvXRi3KPTRS9HOitGZwvPg0juRhXFWIeKX58cnX5YqLohQ==} + requiresBuild: true dependencies: '@types/glob': 8.1.0 '@types/node': 20.4.7 @@ -4408,14 +4920,12 @@ packages: /@types/webidl-conversions@7.0.0: resolution: {integrity: sha512-xTE1E+YF4aWPJJeUzaZI5DRntlkY3+BCVJi0axFptnjGmAoWxkyREIh/XMrfxVLejwQxMCfDXdICo0VLxThrog==} - dev: false /@types/whatwg-url@8.2.2: resolution: {integrity: sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA==} dependencies: '@types/node': 20.4.7 '@types/webidl-conversions': 7.0.0 - dev: false /abbrev@1.1.1: resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} @@ -4424,6 +4934,7 @@ packages: /abort-controller@3.0.0: resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} engines: {node: '>=6.5'} + requiresBuild: true dependencies: event-target-shim: 5.0.1 dev: false @@ -4504,6 +5015,7 @@ packages: /agent-base@6.0.2: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} + requiresBuild: true dependencies: debug: 4.3.4 transitivePeerDependencies: @@ -4591,6 +5103,7 @@ packages: /arrify@2.0.1: resolution: {integrity: sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==} engines: {node: '>=8'} + requiresBuild: true dev: false optional: true @@ -4613,6 +5126,7 @@ packages: /async-retry@1.3.3: resolution: {integrity: sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==} + requiresBuild: true dependencies: retry: 0.13.1 dev: false @@ -4700,7 +5214,6 @@ packages: /base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - dev: false /base64id@2.0.0: resolution: {integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==} @@ -4709,6 +5222,7 @@ packages: /bignumber.js@9.1.1: resolution: {integrity: sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==} + requiresBuild: true dev: false optional: true @@ -4727,6 +5241,7 @@ packages: /bluebird@3.7.2: resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} + requiresBuild: true dev: false optional: true @@ -4756,7 +5271,7 @@ packages: /bowser@2.11.0: resolution: {integrity: sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==} - dev: false + requiresBuild: true /brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} @@ -4795,7 +5310,6 @@ packages: engines: {node: '>=6.9.0'} dependencies: buffer: 5.7.1 - dev: false /buffer-equal-constant-time@1.0.1: resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} @@ -4810,7 +5324,6 @@ packages: dependencies: base64-js: 1.5.1 ieee754: 1.1.13 - dev: false /builtin-modules@3.3.0: resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} @@ -4853,6 +5366,7 @@ packages: /catharsis@0.9.0: resolution: {integrity: sha512-prMTQVpcns/tzFgFVkVp6ak6RykZyWb3gu8ckUpd6YkTlacOd3DXGJjIpD4Q6zJirizvaiAjSSHlOsA+6sNh2A==} engines: {node: '>= 10'} + requiresBuild: true dependencies: lodash: 4.17.21 dev: false @@ -4905,7 +5419,7 @@ packages: normalize-path: 3.0.0 readdirp: 3.6.0 optionalDependencies: - fsevents: 2.3.2 + fsevents: 2.3.3 dev: true /ci@2.2.0: @@ -4940,6 +5454,7 @@ packages: /cliui@8.0.1: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} + requiresBuild: true dependencies: string-width: 4.2.3 strip-ansi: 6.0.1 @@ -5032,6 +5547,7 @@ packages: /compressible@2.0.18: resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} engines: {node: '>= 0.6'} + requiresBuild: true dependencies: mime-db: 1.52.0 dev: false @@ -5344,6 +5860,7 @@ packages: /duplexify@4.1.2: resolution: {integrity: sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==} + requiresBuild: true dependencies: end-of-stream: 1.4.4 inherits: 2.0.4 @@ -5380,6 +5897,7 @@ packages: /end-of-stream@1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + requiresBuild: true dependencies: once: 1.4.0 dev: false @@ -5412,11 +5930,13 @@ packages: /ent@2.2.0: resolution: {integrity: sha512-GHrMyVZQWvTIdDtpiEXdHZnFQKzeO09apj8Cbl4pKWy4i0Oprcq17usfDt5aO63swf0JOeMWjWQE/LzgSRuWpA==} + requiresBuild: true dev: false optional: true /entities@2.1.0: resolution: {integrity: sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==} + requiresBuild: true dev: false optional: true @@ -5451,6 +5971,7 @@ packages: /escape-string-regexp@2.0.0: resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} engines: {node: '>=8'} + requiresBuild: true dev: false optional: true @@ -5462,6 +5983,7 @@ packages: resolution: {integrity: sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==} engines: {node: '>=4.0'} hasBin: true + requiresBuild: true dependencies: esprima: 4.0.1 estraverse: 4.3.0 @@ -5575,6 +6097,7 @@ packages: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} hasBin: true + requiresBuild: true dev: false optional: true @@ -5593,6 +6116,7 @@ packages: /estraverse@4.3.0: resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} engines: {node: '>=4.0'} + requiresBuild: true dev: false optional: true @@ -5620,6 +6144,7 @@ packages: /event-target-shim@5.0.1: resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} engines: {node: '>=6'} + requiresBuild: true dev: false optional: true @@ -5704,6 +6229,7 @@ packages: /extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + requiresBuild: true dev: false optional: true @@ -5732,19 +6258,21 @@ packages: /fast-text-encoding@1.0.6: resolution: {integrity: sha512-VhXlQgj9ioXCqGstD37E/HBeqEGV/qOD/kmbVG8h5xKBYvM1L3lR1Zn4555cQ8GkYbJa8aJSipLPndE1k6zK2w==} + requiresBuild: true dev: false optional: true /fast-xml-parser@4.2.5: resolution: {integrity: sha512-B9/wizE4WngqQftFPmdaMYlXoJlJOYxGQOanC77fq9k8+Z0v5dDSVh+3glErdIROP//s/jgb7ZuxKfB8nVyo0g==} hasBin: true + requiresBuild: true dependencies: strnum: 1.0.5 - dev: false /fast-xml-parser@4.2.7: resolution: {integrity: sha512-J8r6BriSLO1uj2miOk1NW0YVm8AGOOu3Si2HQp/cSmo6EA4m3fcwu2WKjJ4RK9wMLBtg69y1kS8baDiQBR41Ig==} hasBin: true + requiresBuild: true dependencies: strnum: 1.0.5 dev: false @@ -5839,7 +6367,7 @@ packages: node-forge: 1.3.1 uuid: 9.0.0 optionalDependencies: - '@google-cloud/firestore': 6.7.0 + '@google-cloud/firestore': 6.8.0 '@google-cloud/storage': 6.12.0 transitivePeerDependencies: - encoding @@ -5909,8 +6437,8 @@ packages: /fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - /fsevents@2.3.2: - resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + /fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] requiresBuild: true @@ -5925,6 +6453,7 @@ packages: /gaxios@5.1.3: resolution: {integrity: sha512-95hVgBRgEIRQQQHIbnxBXeHbW4TqFk4ZDJW7wmVtvYar72FdhRIo1UGOLS2eRAKCPEdPBWu+M7+A33D9CdX9rA==} engines: {node: '>=12'} + requiresBuild: true dependencies: extend: 3.0.2 https-proxy-agent: 5.0.1 @@ -5939,6 +6468,7 @@ packages: /gcp-metadata@5.3.0: resolution: {integrity: sha512-FNTkdNEnBdlqF2oatizolQqNANMrcqJt6AAYt99B3y1aLLC8Hc5IOBb+ZnnzllodEEf6xMBp6wRcBbc16fa65w==} engines: {node: '>=12'} + requiresBuild: true dependencies: gaxios: 5.1.3 json-bigint: 1.0.0 @@ -6010,6 +6540,7 @@ packages: /glob@8.1.0: resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} engines: {node: '>=12'} + requiresBuild: true dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 @@ -6044,6 +6575,7 @@ packages: /google-auth-library@8.9.0: resolution: {integrity: sha512-f7aQCJODJFmYWN6PeNKzgvy9LI2tYmXnzpNDHEjG5sDNPgGb2FXQyTBnXeSH+PAtpKESFD+LmHw3Ox3mN7e1Fg==} engines: {node: '>=12'} + requiresBuild: true dependencies: arrify: 2.0.1 base64-js: 1.5.1 @@ -6064,6 +6596,7 @@ packages: resolution: {integrity: sha512-g/lcUjGcB6DSw2HxgEmCDOrI/CByOwqRvsuUvNalHUK2iPPPlmAIpbMbl62u0YufGMr8zgE3JL7th6dCb1Ry+w==} engines: {node: '>=12'} hasBin: true + requiresBuild: true dependencies: '@grpc/grpc-js': 1.8.21 '@grpc/proto-loader': 0.7.8 @@ -6090,6 +6623,7 @@ packages: resolution: {integrity: sha512-WPkN4yGtz05WZ5EhtlxNDWPhC4JIic6G8ePitwUWy4l+XPVYec+a0j0Ts47PDtW59y3RwAhUd9/h9ZZ63px6RQ==} engines: {node: '>=12.0.0'} hasBin: true + requiresBuild: true dependencies: node-forge: 1.3.1 dev: false @@ -6097,6 +6631,7 @@ packages: /graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + requiresBuild: true dev: false optional: true @@ -6106,6 +6641,7 @@ packages: /gtoken@6.1.2: resolution: {integrity: sha512-4ccGpzz7YAr7lxrT2neugmXQ3hP9ho2gcaityLVkiUecAiwiy60Ii8gRbZeOsXV19fYaRjgBSshs8kXw+NKCPQ==} engines: {node: '>=12.0.0'} + requiresBuild: true dependencies: gaxios: 5.1.3 google-p12-pem: 4.0.1 @@ -6182,6 +6718,7 @@ packages: /http-proxy-agent@5.0.0: resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} engines: {node: '>= 6'} + requiresBuild: true dependencies: '@tootallnate/once': 2.0.0 agent-base: 6.0.2 @@ -6194,6 +6731,7 @@ packages: /https-proxy-agent@5.0.1: resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} engines: {node: '>= 6'} + requiresBuild: true dependencies: agent-base: 6.0.2 debug: 4.3.4 @@ -6217,7 +6755,6 @@ packages: /ieee754@1.1.13: resolution: {integrity: sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==} - dev: false /ignore-by-default@1.0.1: resolution: {integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==} @@ -6249,7 +6786,6 @@ packages: /ip@2.0.0: resolution: {integrity: sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==} - dev: false /ipaddr.js@1.9.1: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} @@ -6338,6 +6874,7 @@ packages: /is-stream-ended@0.1.4: resolution: {integrity: sha512-xj0XPvmr7bQFTvirqnFr50o0hQIh6ZItDqloxt5aJrR4NQsYeSsyFQERYGCAzfindAcnKjINnwEEgLx4IqVzQw==} + requiresBuild: true dev: false optional: true @@ -6383,6 +6920,7 @@ packages: /js2xmlparser@4.0.2: resolution: {integrity: sha512-6n4D8gLlLf1n5mNLQPRfViYzu9RATblzPEtm1SthMX1Pjao0r9YI9nw7ZIfRxQMERS87mcswrg+r/OYrPRX6jA==} + requiresBuild: true dependencies: xmlcreate: 2.0.4 dev: false @@ -6392,6 +6930,7 @@ packages: resolution: {integrity: sha512-e8cIg2z62InH7azBBi3EsSEqrKx+nUtAS5bBcYTSpZFA+vhNPyhv8PTFZ0WsjOPDj04/dOLlm08EDcQJDqaGQg==} engines: {node: '>=12.0.0'} hasBin: true + requiresBuild: true dependencies: '@babel/parser': 7.22.7 '@jsdoc/salty': 0.2.5 @@ -6424,6 +6963,7 @@ packages: /json-bigint@1.0.0: resolution: {integrity: sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==} + requiresBuild: true dependencies: bignumber.js: 9.1.1 dev: false @@ -6479,6 +7019,7 @@ packages: /jwa@2.0.0: resolution: {integrity: sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==} + requiresBuild: true dependencies: buffer-equal-constant-time: 1.0.1 ecdsa-sig-formatter: 1.0.11 @@ -6509,6 +7050,7 @@ packages: /jws@4.0.0: resolution: {integrity: sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==} + requiresBuild: true dependencies: jwa: 2.0.0 safe-buffer: 5.2.1 @@ -6527,6 +7069,7 @@ packages: /klaw@3.0.0: resolution: {integrity: sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g==} + requiresBuild: true dependencies: graceful-fs: 4.2.11 dev: false @@ -6546,6 +7089,7 @@ packages: /levn@0.3.0: resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==} engines: {node: '>= 0.8.0'} + requiresBuild: true dependencies: prelude-ls: 1.1.2 type-check: 0.3.2 @@ -6569,6 +7113,7 @@ packages: /linkify-it@3.0.3: resolution: {integrity: sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==} + requiresBuild: true dependencies: uc.micro: 1.0.6 dev: false @@ -6600,6 +7145,7 @@ packages: /lodash.camelcase@4.3.0: resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + requiresBuild: true dev: false optional: true @@ -6678,11 +7224,13 @@ packages: /long@4.0.0: resolution: {integrity: sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==} + requiresBuild: true dev: false optional: true /long@5.2.3: resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==} + requiresBuild: true dev: false optional: true @@ -6745,6 +7293,7 @@ packages: /markdown-it-anchor@8.6.7(@types/markdown-it@12.2.3)(markdown-it@12.3.2): resolution: {integrity: sha512-FlCHFwNnutLgVTflOYHPW2pPcl2AACqVzExlkGQNsi4CJgqOHN7YTgDd4LuhgN1BFO3TS0vLAruV1Td6dwWPJA==} + requiresBuild: true peerDependencies: '@types/markdown-it': '*' markdown-it: '*' @@ -6757,6 +7306,7 @@ packages: /markdown-it@12.3.2: resolution: {integrity: sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==} hasBin: true + requiresBuild: true dependencies: argparse: 2.0.1 entities: 2.1.0 @@ -6781,6 +7331,7 @@ packages: resolution: {integrity: sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==} engines: {node: '>= 12'} hasBin: true + requiresBuild: true dev: false optional: true @@ -6799,7 +7350,7 @@ packages: /memory-pager@1.5.0: resolution: {integrity: sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==} - dev: false + requiresBuild: true optional: true /merge-descriptors@1.0.1: @@ -6851,6 +7402,7 @@ packages: resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} engines: {node: '>=10.0.0'} hasBin: true + requiresBuild: true dev: false optional: true @@ -6878,6 +7430,7 @@ packages: /minimatch@5.1.6: resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} engines: {node: '>=10'} + requiresBuild: true dependencies: brace-expansion: 2.0.1 dev: false @@ -6885,6 +7438,7 @@ packages: /minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + requiresBuild: true dev: false optional: true @@ -6892,6 +7446,7 @@ packages: resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} engines: {node: '>=10'} hasBin: true + requiresBuild: true dev: false optional: true @@ -6932,7 +7487,6 @@ packages: dependencies: '@types/whatwg-url': 8.2.2 whatwg-url: 11.0.0 - dev: false /mongodb@4.17.1: resolution: {integrity: sha512-MBuyYiPUPRTqfH2dV0ya4dcr2E5N52ocBuZ8Sgg/M030nGF78v855B3Z27mZJnp8PxjnUquEnAtjOsphgMZOlQ==} @@ -6942,11 +7496,10 @@ packages: mongodb-connection-string-url: 2.6.0 socks: 2.7.1 optionalDependencies: - '@aws-sdk/credential-providers': 3.385.0 - '@mongodb-js/saslprep': 1.1.1 + '@aws-sdk/credential-providers': 3.427.0 + '@mongodb-js/saslprep': 1.1.0 transitivePeerDependencies: - aws-crt - dev: false /mongoose@6.12.0: resolution: {integrity: sha512-sd/q83C6TBRPBrrD2A/POSbA/exbCFM2WOuY7Lf2JuIJFlHFG39zYSDTTAEiYlzIfahNOLmXPxBGFxdAch41Mw==} @@ -7012,6 +7565,7 @@ packages: /node-fetch@2.6.12: resolution: {integrity: sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==} engines: {node: 4.x || >=6.0.0} + requiresBuild: true peerDependencies: encoding: ^0.1.0 peerDependenciesMeta: @@ -7089,6 +7643,7 @@ packages: /object-hash@3.0.0: resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} engines: {node: '>= 6'} + requiresBuild: true dev: false optional: true @@ -7142,6 +7697,7 @@ packages: /optionator@0.8.3: resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} engines: {node: '>= 0.8.0'} + requiresBuild: true dependencies: deep-is: 0.1.4 fast-levenshtein: 2.0.6 @@ -7310,6 +7866,7 @@ packages: /prelude-ls@1.1.2: resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} engines: {node: '>= 0.8.0'} + requiresBuild: true dev: false optional: true @@ -7471,8 +8028,9 @@ packages: /proto3-json-serializer@1.1.1: resolution: {integrity: sha512-AwAuY4g9nxx0u52DnSMkqqgyLHaW/XaPLtaAo3y/ZCfeaQB/g4YDH4kb8Wc/mWzWvu0YjOznVnfn373MVZZrgw==} engines: {node: '>=12.0.0'} + requiresBuild: true dependencies: - protobufjs: 7.2.4 + protobufjs: 7.2.5 dev: false optional: true @@ -7480,6 +8038,7 @@ packages: resolution: {integrity: sha512-VPWMgIcRNyQwWUv8OLPyGQ/0lQY/QTQAVN5fh+XzfDwsVw1FZ2L3DM/bcBf8WPiRz2tNpaov9lPZfNcmNo6LXA==} engines: {node: '>=12.0.0'} hasBin: true + requiresBuild: true peerDependencies: protobufjs: ^7.0.0 dependencies: @@ -7517,6 +8076,26 @@ packages: dev: false optional: true + /protobufjs@7.2.5: + resolution: {integrity: sha512-gGXRSXvxQ7UiPgfw8gevrfRWcTlSbOFg+p/N+JVJEK5VhueL2miT6qTymqAmjr1Q5WbOCyJbyrk6JfWKwlFn6A==} + engines: {node: '>=12.0.0'} + requiresBuild: 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': 20.4.7 + long: 5.2.3 + dev: false + optional: true + /proxy-addr@2.0.7: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} engines: {node: '>= 0.10'} @@ -7886,6 +8465,7 @@ packages: /requizzle@0.2.4: resolution: {integrity: sha512-JRrFk1D4OQ4SqovXOgdav+K8EAhSB/LJZqCz8tbX0KObcdeM15Ss59ozWMBWmmINMagCwmqn4ZNryUGpBsl6Jw==} + requiresBuild: true dependencies: lodash: 4.17.21 dev: false @@ -7923,6 +8503,7 @@ packages: /retry-request@5.0.2: resolution: {integrity: sha512-wfI3pk7EE80lCIXprqh7ym48IHYdwmAAzESdbU8Q9l7pnRCk9LEhpbOTNKjz6FARLm/Bl5m+4F0ABxOkYUujSQ==} engines: {node: '>=12'} + requiresBuild: true dependencies: debug: 4.3.4 extend: 3.0.2 @@ -7934,6 +8515,7 @@ packages: /retry@0.13.1: resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} engines: {node: '>= 4'} + requiresBuild: true dev: false optional: true @@ -7965,7 +8547,7 @@ packages: engines: {node: '>=10.0.0'} hasBin: true optionalDependencies: - fsevents: 2.3.2 + fsevents: 2.3.3 dev: false /rope-sequence@1.3.4: @@ -8117,7 +8699,6 @@ packages: /smart-buffer@4.2.0: resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} - dev: false /socket.io-adapter@2.5.2: resolution: {integrity: sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA==} @@ -8161,7 +8742,6 @@ packages: dependencies: ip: 2.0.0 smart-buffer: 4.2.0 - dev: false /source-map-support@0.5.21: resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} @@ -8187,9 +8767,9 @@ packages: /sparse-bitfield@3.0.3: resolution: {integrity: sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==} + requiresBuild: true dependencies: memory-pager: 1.5.0 - dev: false optional: true /stack-trace@0.0.10: @@ -8203,6 +8783,7 @@ packages: /stream-events@1.0.5: resolution: {integrity: sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==} + requiresBuild: true dependencies: stubs: 3.0.0 dev: false @@ -8210,6 +8791,7 @@ packages: /stream-shift@1.0.1: resolution: {integrity: sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==} + requiresBuild: true dev: false optional: true @@ -8239,10 +8821,11 @@ packages: /strnum@1.0.5: resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==} - dev: false + requiresBuild: true /stubs@3.0.0: resolution: {integrity: sha512-PdHt7hHUJKxvTCgbKX9C1V/ftOcjJQgz8BZwNfV5c4B6dcGqlpelTbJ999jBGZ2jYiPAwcX5dP6oBwVlBlUbxw==} + requiresBuild: true dev: false optional: true @@ -8360,6 +8943,7 @@ packages: /teeny-request@8.0.3: resolution: {integrity: sha512-jJZpA5He2y52yUhA7pyAGZlgQpcB+xLjcN0eUFxr9c8hP/H7uOXbBNVo/O0C/xVfJLJs680jvkFgVJEEvk9+ww==} engines: {node: '>=12'} + requiresBuild: true dependencies: http-proxy-agent: 5.0.0 https-proxy-agent: 5.0.1 @@ -8416,6 +9000,7 @@ packages: /tmp@0.2.1: resolution: {integrity: sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==} engines: {node: '>=8.17.0'} + requiresBuild: true dependencies: rimraf: 3.0.2 dev: false @@ -8446,6 +9031,7 @@ packages: /tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + requiresBuild: true dev: false optional: true @@ -8454,7 +9040,6 @@ packages: engines: {node: '>=12'} dependencies: punycode: 2.3.0 - dev: false /triple-beam@1.4.1: resolution: {integrity: sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==} @@ -8463,15 +9048,15 @@ packages: /tslib@1.14.1: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} - dev: false + requiresBuild: true - /tslib@2.6.1: - resolution: {integrity: sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==} - dev: false + /tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} /type-check@0.3.2: resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} engines: {node: '>= 0.8.0'} + requiresBuild: true dependencies: prelude-ls: 1.1.2 dev: false @@ -8513,6 +9098,7 @@ packages: resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==} engines: {node: '>=0.8.0'} hasBin: true + requiresBuild: true dev: false optional: true @@ -8529,6 +9115,7 @@ packages: /underscore@1.13.6: resolution: {integrity: sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==} + requiresBuild: true dev: false optional: true @@ -8617,7 +9204,6 @@ packages: /uuid@8.3.2: resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} hasBin: true - dev: false /uuid@9.0.0: resolution: {integrity: sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==} @@ -8660,13 +9246,13 @@ packages: /webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + requiresBuild: true dev: false optional: true /webidl-conversions@7.0.0: resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} engines: {node: '>=12'} - dev: false /websocket-driver@0.7.4: resolution: {integrity: sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==} @@ -8688,10 +9274,10 @@ packages: dependencies: tr46: 3.0.0 webidl-conversions: 7.0.0 - dev: false /whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + requiresBuild: true dependencies: tr46: 0.0.3 webidl-conversions: 3.0.1 @@ -8747,6 +9333,7 @@ packages: /word-wrap@1.2.5: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} + requiresBuild: true dev: false optional: true @@ -8780,6 +9367,7 @@ packages: /xmlcreate@2.0.4: resolution: {integrity: sha512-nquOebG4sngPmGPICTS5EnxqhKbCmz5Ox5hsszI2T6U5qdrJizBc+0ilYSEjTSzU0yZcmvppztXe/5Al5fUwdg==} + requiresBuild: true dev: false optional: true @@ -8820,6 +9408,7 @@ packages: /yargs-parser@21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} + requiresBuild: true dev: false optional: true @@ -8849,6 +9438,7 @@ packages: /yargs@17.7.2: resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} engines: {node: '>=12'} + requiresBuild: true dependencies: cliui: 8.0.1 escalade: 3.1.1 @@ -8863,3 +9453,4 @@ packages: /yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} + requiresBuild: true diff --git a/sampleGenerator b/sampleGenerator deleted file mode 160000 index bd4329c1..00000000 --- a/sampleGenerator +++ /dev/null @@ -1 +0,0 @@ -Subproject commit bd4329c15405a09c94e7b78e19ff296b4c2d0fb3 diff --git a/scripts/profileImageUrlUpdater.js b/scripts/profileImageUrlUpdater.js new file mode 100644 index 00000000..78ebe778 --- /dev/null +++ b/scripts/profileImageUrlUpdater.js @@ -0,0 +1,36 @@ +// Issue #173을 해결하기 위한 DB 마이그레이션 스크립트입니다. +// https://github.com/sparcs-kaist/taxi-back/issues/173 + +const { MongoClient } = require("mongodb"); +const { mongo: mongoUrl, aws: awsEnv } = require("../loadenv"); + +const time = Date.now(); + +const client = new MongoClient(mongoUrl); +const db = client.db("taxi"); +const users = db.collection("users"); + +async function run() { + try { + for await (const doc of users.find()) { + // 이미 변환이 완료된 경우에는 Pass합니다. + if (doc.profileImageUrl.startsWith(awsEnv.s3Url)) continue; + + await users.findOneAndUpdate( + { _id: doc._id }, + { + $set: { + profileImageUrl: `${awsEnv.s3Url}/profile-img/${doc.profileImageUrl}?token=${time}`, + }, + } + ); + } + } catch (err) { + console.log(err); + } finally { + await client.close(); + } +} +run().then(() => { + console.log("Done!"); +}); diff --git a/src/middlewares/session.js b/src/middlewares/session.js index c4bdec63..5412ba1c 100644 --- a/src/middlewares/session.js +++ b/src/middlewares/session.js @@ -1,30 +1,14 @@ const expressSession = require("express-session"); -const redis = require("redis"); -const MongoStore = require("connect-mongo"); -const RedisStore = require("connect-redis")(expressSession); -const { - redis: redisUrl, - mongo: mongoUrl, - session: sessionSecret, -} = require("../../loadenv"); -const logger = require("../modules/logger"); - -// 환경변수 REDIS_PATH 유무에 따라 session 저장 방식이 변경됩니다. -let sessionStore = null; -if (redisUrl) { - const client = redis.createClient({ - url: redisUrl, - legacyMode: true, - }); - client.connect().catch(logger.error); - sessionStore = new RedisStore({ client }); -} else { - sessionStore = MongoStore.create({ mongoUrl }); -} +const { nodeEnv, session: sessionConfig } = require("../../loadenv"); +const sessionStore = require("../modules/stores/sessionStore"); module.exports = expressSession({ - secret: sessionSecret, + secret: sessionConfig.secret, resave: false, saveUninitialized: false, store: sessionStore, + cookie: { + maxAge: sessionConfig.expiry, + secure: nodeEnv === "production", + }, }); diff --git a/src/modules/auths/login.js b/src/modules/auths/login.js index 8181c991..9c72434f 100644 --- a/src/modules/auths/login.js +++ b/src/modules/auths/login.js @@ -1,14 +1,15 @@ +const { session: sessionConfig } = require("../../../loadenv"); const logger = require("../logger"); const getLoginInfo = (req) => { if (req.session.loginInfo) { const { id, sid, oid, name, time } = req.session.loginInfo; const timeFlow = Date.now() - time; - if (timeFlow > 14 * 24 * 3600 * 1000 /* 14일 */) { - // if (timeFlow > 1 * 3600 * 1000 /* 1시간 */) { + // 14일이 지난 세션에 대해서는 로그인 정보를 반환하지 않습니다. + // 세션은 새로운 요청 시 갱신되지 않습니다. + if (timeFlow > sessionConfig.expiry) { return { id: undefined, sid: undefined, oid: undefined, name: undefined }; } - req.session.loginInfo.time = Date.now(); return { id, sid, oid, name }; } return { id: undefined, sid: undefined, oid: undefined, name: undefined }; diff --git a/src/modules/modifyProfile.js b/src/modules/modifyProfile.js index 0d15bd58..e8702f98 100755 --- a/src/modules/modifyProfile.js +++ b/src/modules/modifyProfile.js @@ -1,4 +1,5 @@ const crypto = require("crypto"); +const aws = require("./stores/aws"); const nouns = [ "재료역학", @@ -81,7 +82,7 @@ const generateNickname = (id) => { // 기존 프로필 사진의 URI 중 하나를 무작위로 선택해 반환합니다. const generateProfileImageUrl = () => { const ridx = crypto.randomInt(defaultProfile.length); - return `default/${defaultProfile[ridx]}`; + return aws.getS3Url(`/profile-img/default/${defaultProfile[ridx]}`); }; // 사용자의 이름과 성을 받아, 한글인지 영어인지에 따라 전체 이름을 반환합니다. diff --git a/src/modules/socket.js b/src/modules/socket.js index bca99161..38da23d5 100644 --- a/src/modules/socket.js +++ b/src/modules/socket.js @@ -219,9 +219,11 @@ const emitUpdateEvent = async (io, roomId) => { throw new IllegalArgumentsException(); } - part.forEach(({ user }) => io.in(`user-${user}`).emit("chat_update"), { - roomId, - }); + part.forEach(({ user }) => + io.in(`user-${user}`).emit("chat_update", { + roomId, + }) + ); return true; } catch (err) { @@ -233,37 +235,13 @@ const emitUpdateEvent = async (io, roomId) => { // https://socket.io/how-to/use-with-express-session 참고 const startSocketServer = (server) => { const io = new Server(server, { - allowRequest: (req, callback) => { - const fakeRes = { - getHeader() { - return []; - }, - setHeader(key, values) { - req.cookieHolder = values[0]; - }, - writeHead() {}, - }; - sessionMiddleware(req, fakeRes, () => { - if (req.session) { - fakeRes.writeHead(); - req.session.save(); - } - callback(null, true); - }); - }, cors: { origin: corsWhiteList, methods: ["GET", "POST"], credentials: true, }, }); - - io.engine.on("initial_headers", (headers, req) => { - if (req.cookieHolder) { - headers["set-cookie"] = req.cookieHolder; - delete req.cookieHolder; - } - }); + io.engine.use(sessionMiddleware); io.on("connection", (socket) => { try { diff --git a/src/modules/stores/mongo.js b/src/modules/stores/mongo.js index f05f266a..695845fc 100755 --- a/src/modules/stores/mongo.js +++ b/src/modules/stores/mongo.js @@ -1,7 +1,6 @@ const mongoose = require("mongoose"); const Schema = mongoose.Schema; -const { mongo: mongoUrl } = require("../../../loadenv"); const logger = require("../logger"); const userSchema = Schema({ @@ -184,23 +183,27 @@ database.on("error", function (err) { logger.error("데이터베이스 연결 에러 발생: " + err); mongoose.disconnect(); }); -database.on("disconnected", function () { - // 데이터베이스 연결이 끊어지면 5초 후 재연결을 시도합니다. - logger.error("데이터베이스와 연결이 끊어졌습니다!"); - setTimeout(() => { - mongoose.connect(mongoUrl, { - useNewUrlParser: true, - useUnifiedTopology: true, - }); - }, 5000); -}); -const connectDatabase = () => +const connectDatabase = (mongoUrl) => { + database.on("disconnected", function () { + // 데이터베이스 연결이 끊어지면 5초 후 재연결을 시도합니다. + logger.error("데이터베이스와 연결이 끊어졌습니다!"); + setTimeout(() => { + mongoose.connect(mongoUrl, { + useNewUrlParser: true, + useUnifiedTopology: true, + }); + }, 5000); + }); + mongoose.connect(mongoUrl, { useNewUrlParser: true, useUnifiedTopology: true, }); + return database; +}; + module.exports = { connectDatabase, userModel: mongoose.model("User", userSchema), diff --git a/src/modules/stores/sessionStore.js b/src/modules/stores/sessionStore.js new file mode 100644 index 00000000..fca4da55 --- /dev/null +++ b/src/modules/stores/sessionStore.js @@ -0,0 +1,37 @@ +const expressSession = require("express-session"); +const redis = require("redis"); +const MongoStore = require("connect-mongo"); +const RedisStore = require("connect-redis")(expressSession); +const { + redis: redisUrl, + mongo: mongoUrl, + session: sessionConfig, +} = require("../../../loadenv"); +const logger = require("../logger"); + +const getSessionStore = (redisUrl) => { + // 환경변수 REDIS_PATH 유무에 따라 session 저장 방식이 변경됩니다. + if (redisUrl) { + const client = redis.createClient({ + url: redisUrl, + legacyMode: true, + }); + + // redis client 연결 성공 시 로그를 출력합니다. + client.on("ready", () => { + logger.info("Redis session store is connected!"); + }); + + // redis client 에러 발생 시 1초에 두 번 재연결을 시도합니다. + client.on("error", (err) => { + logger.error(err); + }); + + client.connect().catch(logger.error); + return new RedisStore({ client, ttl: sessionConfig.expiry }); + } else { + return MongoStore.create({ mongoUrl }); + } +}; + +module.exports = getSessionStore(redisUrl); diff --git a/src/routes/docs/auth.js b/src/routes/docs/auth.js new file mode 100644 index 00000000..a5d6eae6 --- /dev/null +++ b/src/routes/docs/auth.js @@ -0,0 +1,427 @@ +const tag = "auth"; +const apiPrefix = "/auth"; + +const authDocs = {}; +authDocs[`${apiPrefix}/sparcssso`] = { + get: { + tags: [tag], + summary: "SPARCS SSO 로그인 페이지로 리다이렉트", + description: + "Prod의 경우 SSO 로그인 페이지로, Dev의 경우 replace 페이지로 리다이렉트함.", + parameters: [ + { + in: "query", + name: "redirect", + schema: { + type: "string", + }, + description: "리다이렉트 URI", + }, + { + in: "query", + name: "isApp", + schema: { + type: "boolean", + }, + description: "앱인지 여부", + }, + ], + responses: { + 302: { + description: "SPARCS SSO 로그인 페이지로 리다이렉트", + headers: { + Location: { + type: "string", + description: "SPARCS SSO 로그인 페이지", + format: "uri", + }, + }, + }, + }, + }, +}; + +authDocs[`${apiPrefix}/sparcssso/callback`] = { + get: { + tags: [tag], + summary: "SPARCS SSO 로그인 페이지에서 다시 리다이렉트를 처리", + description: + "SPARCS SSO 로그인 페이지로부터 프론트로 다시 리다이렉트되었을 때 로그인을 시도함.", + parameters: [ + { + in: "query", + name: "code", + schema: { + type: "string", + }, + description: "SSO server에서 부여한 유저 정보를 위한 code", + }, + { + in: "query", + name: "state", + schema: { + type: "string", + }, + description: "login 성공 여부 확인을 위한 state", + }, + ], + responses: { + 302: { + description: + "로그인 성공 후 페이지 URI로, 혹은 로그인 실패 URI로 리다이렉트", + headers: { + Location: { + type: "string", + description: "로그인 성공 후 페이지 URI, 혹은 로그인 실패 URI", + format: "uri", + }, + }, + }, + 400: { + content: { + "text/html": { + example: "SparcsssoCallbackHandler : invalid request", + }, + }, + }, + }, + }, +}; + +authDocs[`${apiPrefix}/logout`] = { + get: { + tags: [tag], + summary: "세션 삭제 및 사용자 로그아웃", + description: "세션 삭제 및 사용자 로그아웃", + parameters: [ + { + in: "query", + name: "redirect", + schema: { + type: "string", + }, + description: "로그아웃 후 리다이렉트 URI", + }, + ], + responses: { + 200: { + content: { + "application/json": { + schema: { + type: "object", + properties: { + ssoLogoutUrl: { + type: "string", + description: "SSO 로그아웃 URL", + }, + }, + }, + }, + }, + }, + 500: { + content: { + "text/html": { + example: "Auth/logout : internal server error", + }, + }, + }, + }, + }, +}; + +authDocs[`${apiPrefix}/app/token/login`] = { + get: { + tags: [tag], + summary: "Access token을 사용하여 로그인", + description: "앱에서 Access Token을 사용하여 로그인 시도", + parameters: [ + { + in: "query", + name: "accessToken", + schema: { + type: "string", + }, + description: "만료 되지 않은 유효한 JWT Access Token", + }, + { + in: "query", + name: "deviceToken", + schema: { + type: "string", + }, + description: "Device Token", + }, + ], + responses: { + 200: { + description: "성공 메세지", + content: { + "text/html": { + example: "success", + }, + }, + }, + 400: { + content: { + "text/html": { + example: "invalid request", + }, + }, + }, + 401: { + content: { + "application/json": { + schema: { + type: "object", + properties: { + message: { + type: "string", + }, + }, + }, + examples: { + "Invalid token": { + value: { + message: "Invalid token", + }, + }, + "Expired token": { + value: { + message: "Expired token", + }, + }, + "Not Access token": { + value: { + message: "Not Access token", + }, + }, + "No corresponding user": { + value: { + message: "No corresponding user", + }, + }, + }, + }, + }, + }, + 500: { + content: { + "text/html": { + example: "server error", + }, + }, + }, + }, + }, +}; + +authDocs[`${apiPrefix}/app/token/refresh`] = { + get: { + tags: [tag], + summary: "만료된 Access Token 갱신", + description: "앱에서 Access Token을 Refresh Token을 활용하여 갱신", + parameters: [ + { + in: "query", + name: "accessToken", + schema: { + type: "string", + }, + description: "만료된 유효한 JWT Access Token", + }, + { + in: "query", + name: "refreshToken", + schema: { + type: "string", + }, + description: "만료되지 않은 유효한 JWT Refresh Token", + }, + ], + responses: { + 200: { + content: { + "application/json": { + schema: { + type: "object", + properties: { + accessToken: { + type: "string", + description: "새로운 JWT Access Token", + }, + refreshToken: { + type: "string", + description: "새로운 Refresh Token", + }, + }, + }, + }, + }, + }, + 400: { + "text/html": { + example: "invalid request", + }, + }, + 401: { + content: { + "application/json": { + schema: { + type: "object", + properties: { + message: { + type: "string", + }, + }, + }, + examples: { + "Invalid access token": { + value: { + message: "Invalid access token", + }, + }, + "Invalid token": { + value: { + message: "Invalid token", + }, + }, + "Expired token": { + value: { + message: "Expired token", + }, + }, + "Not Refresh token": { + value: { + message: "Not Refresh token", + }, + }, + }, + }, + }, + }, + 501: { + content: { + "text/html": { + example: "server error", + }, + }, + }, + }, + }, +}; + +authDocs[`${apiPrefix}/app/device`] = { + post: { + tags: [tag], + summary: "기기의 Device Token을 데이터베이스에 등록", + description: "App 기기의 Device Token을 데이터베이스에 등록", + requestBody: { + content: { + "application/json": { + schema: { + type: "object", + properties: { + accessToken: { + type: "string", + description: "만료 되지 않은 유효한 JWT Access Token", + }, + deviceToken: { + type: "string", + description: "Firebase 라이브러리에서 제공해주는 Device Token", + }, + }, + }, + }, + }, + }, + responses: { + 200: { + description: "성공 메세지", + content: { + "text/html": { + example: "success", + }, + }, + }, + 400: { + content: { + "text/html": { + example: "invalid request", + }, + }, + }, + 401: { + content: { + "text/html": { + example: "unauthorized", + }, + }, + }, + 500: { + content: { + "text/html": { + example: "server error", + }, + }, + }, + }, + }, + delete: { + tags: [tag], + summary: "기기의 Device Token을 데이터베이스에서 삭제", + description: "App 기기의 Device Token을 데이터베이스에 삭제", + requestBody: { + content: { + "application/json": { + schema: { + type: "object", + properties: { + accessToken: { + type: "string", + description: "만료 되지 않은 유효한 JWT accessToken", + }, + deviceToken: { + type: "string", + description: "Firebase 라이브러리에서 제공해주는 DeviceToken", + }, + }, + }, + }, + }, + }, + responses: { + 200: { + description: "성공 메세지", + content: { + "text/html": { + example: "success", + }, + }, + }, + 400: { + content: { + "text/html": { + example: "invalid request", + }, + }, + }, + 401: { + content: { + "text/html": { + example: "unauthorized", + }, + }, + }, + 500: { + content: { + "text/html": { + example: "server error", + }, + }, + }, + }, + }, +}; + +module.exports = authDocs; diff --git a/src/routes/docs/auth.md b/src/routes/docs/auth.md deleted file mode 100644 index 799ddd01..00000000 --- a/src/routes/docs/auth.md +++ /dev/null @@ -1,180 +0,0 @@ -## `/auth` **(for production)** - -- 사용자 생성, 로그인, 로그아웃 등 사용자 상태 관리를 지원하는 API. -- SPARCS SSO를 사용하는 프로덕션 용 API. - -### `/sparcssso` **(GET)** - -- SPARCS SSO 로그인 페이지로 리다이렉트. - -#### URL Parameters - -- 없음 - -#### Response - -- SPARCS SSO 로그인 페이지로 리다이렉트. - -#### Errors - -- 없음 - -### `/sparcssso/callback` **(GET)** - -- SPARCS SSO 로그인 페이지로부터 다시 리다이렉트되었을 때 로그인을 시도함 - -#### URL Parameters - -- state -- code - -#### Response - -- DB에 존재하는 id면 로그인 진행 후 프론트엔드의 첫 페이지로 리다이렉트 -- DB에 존재하지 않는 id면 새로운 사용자를 만들고 로그인을 진행한 후 프론트엔드의 첫 페이지로 리다이렉트 - -#### Errors - -- 없음 - -### `/logout` **(GET)** - -- 세션을 삭제하여 사용자를 로그아웃시킴 - -#### URL Parameters - -- 없음 - -#### Response - -```javascript -{ - ssoLogoutUrl: String, // sso 로그아웃 url -} -``` - -#### Errors - -- 500 / "internal server error" - -### `/getToken` **(GET)** - -- 세션의 로그인 정보를 토큰으로 만들어 반환 - -#### URL Parameters - -- 없음 - -#### Response - -```javascript -{ - status: 200, - data: String, //JSON Web Token -} -``` - -#### Errors - -- 403 "not logged in" - -### `/app/token/generate` **(GET)** - -- SPARCSSSO로 로그인을 진행하고 로그인 정보를 담아 ACCESSTOKEN, REFRESHTOKEN을 반환 - -#### URL Parameters - -- None - -#### Response - -app's deep link -형식 APP_URI_SCHEME + ://login?accessToken=[ACCESSTOKEN]&refreshToken=[REFRESHTOKEN] - -#### Errors - -- 없음 - -### `/app/token/refresh` **(GET)** - -- 만료된 access token을 refresh token을 활용하여 갱신 - -#### URL Parameters - -- accessToken / 만료된 유효한 JWT Access Token이어야 함 -- refreshToken / 만료되지 않은 유효한 JWT Refresh Token 이어야 함. - -#### Response - -```javascript -{ - accessToken: [newAccessToken], // JSON Web Token - refreshToken: [newRefreshToken], //JSON Web Token -} -``` - -#### Errors - -- 401 / Invalid Access Token -- 401 / Invalid Token -- 401 / Expired Token -- 401 / Not Refresh Token -- 501 / Server Error - -### `/app/token/login` **(GET)** - -- access token을 사용하여 로그인 - -#### URL Parameters - -- accessToken / 만료 되지 않은 유효한 JWT accessToken 이어야 함 - -#### Response - -None / 세션 기록 - -#### Errors - -- 401 / Invalid Access Token -- 401 / Invalid Token -- 401 / Expired Token -- 401 / Not Refresh Token -- 501 / Server Error - -### `/app/device` **(POST)** - -- 기기의 deviceToken을 데이터베이스에 등록 - -#### URL Parameters - -- accessToken / 만료 되지 않은 유효한 JWT accessToken 이어야 함 -- deviceToken / Firebase 라이브러리에서 제공해주는 DeviceToken 이어야 함 - -#### Response - -None - -#### Errors - -- 400 / invalid request ( URL Parameters가 누락되어 있음 ) -- 401 / unauthorized ( 토큰이 유효하지 않음 ) -- 500 / server error - -### `/app/device` **(DELETE)** - -- 기기의 deviceToken을 데이터베이스에서 삭제 - -#### URL Parameters - -- accessToken / 만료 되지 않은 유효한 JWT accessToken 이어야 함 -- deviceToken / Firebase 라이브러리에서 제공해주는 DeviceToken 이어야 함 - -#### Response - -None - -#### Errors - -- 400 / invalid request ( URL Parameters가 누락되어 있음 ) -- 401 / unauthorized ( 토큰이 유효하지 않음 ) -- 500 / server error diff --git a/src/routes/docs/chats.js b/src/routes/docs/chats.js new file mode 100644 index 00000000..97fc1352 --- /dev/null +++ b/src/routes/docs/chats.js @@ -0,0 +1,513 @@ +const { objectIdPattern } = require("./utils"); + +const tag = "chats"; +const apiPrefix = "/chats"; + +const chatsDocs = {}; +chatsDocs[`${apiPrefix}`] = { + post: { + tags: [tag], + summary: "가장 최근 채팅 가져오기", + description: "가장 최근에 도착한 60개의 채팅을 가져옵니다.", + requestBody: { + content: { + "application/json": { + schema: { + type: "object", + properties: { + roomId: { + type: "string", + pattern: objectIdPattern, + description: "채팅을 보내는 방의 id", + }, + }, + }, + }, + }, + }, + responses: { + 200: { + content: { + "application/json": { + schema: { + type: "object", + properties: { + result: { + type: "boolean", + value: true, + }, + }, + }, + }, + }, + }, + 403: { + content: { + "text/html": { + examples: { + "소켓 연결 오류": { value: "Chat/ : socket did not connected" }, + "유저가 방에 참여하지 않음": { + value: "Chat/ : user did not participated in the room", + }, + }, + }, + }, + }, + 500: { + content: { + "text/html": { + example: "Chat/ : internal server error", + }, + }, + }, + }, + }, +}; + +chatsDocs[`${apiPrefix}/load/before`] = { + post: { + tags: [tag], + summary: "특정 시점 이전의 채팅 가져오기", + description: "lastMsgDate 이전에 도착한 60개의 채팅을 가져옵니다.", + requestBody: { + content: { + "application/json": { + schema: { + type: "object", + properties: { + roomId: { + type: "string", + pattern: objectIdPattern, + description: "채팅을 보내는 방의 id", + }, + lastMsgDate: { + type: "string", + format: "date-time", + description: "이전 채팅을 가져올 특정 시점", + }, + }, + }, + }, + }, + }, + responses: { + 200: { + content: { + "application/json": { + schema: { + type: "object", + properties: { + result: { + type: "boolean", + value: true, + }, + }, + }, + }, + }, + }, + 403: { + content: { + "text/html": { + examples: { + "소켓 연결 오류": { + value: "Chat/load/before : socket did not connected", + }, + "유저가 방에 참여하지 않음": { + value: + "Chat/load/before : user did not participated in the room", + }, + }, + }, + }, + }, + 500: { + content: { + "text/html": { + example: "Chat/load/before : internal server error", + }, + }, + }, + }, + }, +}; + +chatsDocs[`${apiPrefix}/load/after`] = { + post: { + tags: [tag], + summary: "특정 시점 이후 채팅 가져오기", + description: "lastMsgDate 이후에 도착한 60개의 채팅을 가져옵니다.", + requestBody: { + content: { + "application/json": { + schema: { + type: "object", + properties: { + roomId: { + type: "string", + pattern: objectIdPattern, + description: "채팅을 보내는 방의 id", + }, + lastMsgDate: { + type: "string", + format: "date-time", + description: "이전 채팅을 가져올 특정 시점", + }, + }, + }, + }, + }, + }, + responses: { + 200: { + content: { + "application/json": { + schema: { + type: "object", + properties: { + result: { + type: "boolean", + value: true, + }, + }, + }, + }, + }, + }, + 403: { + content: { + "text/html": { + examples: { + "소켓 연결 오류": { + value: "Chat/load/after : socket did not connected", + }, + "유저가 방에 참여하지 않음": { + value: + "Chat/load/after : user did not participated in the room", + }, + }, + }, + }, + }, + 500: { + content: { + "text/html": { + example: "Chat/load/after : internal server error", + }, + }, + }, + }, + }, +}; + +chatsDocs[`${apiPrefix}/send`] = { + post: { + tags: [tag], + summary: "채팅 요청 처리", + description: `채팅 요청을 처리합니다.
+ socker 통신을 통하여 같은 방에 있는 user들에게 이 채팅을 전송합니다.
+
+ 채팅 기록은 아래와 같이 구성됩니다.
+ + Chat { + roomId: ObjectId, //방의 objectId + type: String, // 메시지 종류 ("text": 일반 메시지, "s3img": S3에 업로드된 이미지, "in": 입장 메시지, "out": 퇴장 메시지, "payment": 결제 메시지, "settlement": 정산 완료 메시지, "account": 계좌 전송 메시지) + authorId: ObejctId, //작성자의 objectId + content: String, // 메시지 내용 (메시지 종류에 따라 포맷이 상이함) + time: String(ISO 8601), // ex) 2024-01-08T01:52:00.000Z + isValid: Boolean, // 클라이언트가 보낸 메시지가 유효한 지 여부. 클라이언트가 이미지를 업로드했을 때, 해당 이미지가 제대로 업로드됐는지 확인하기 전까지 이미지를 보여주지 않기 위해 사용됨. + } + `, + requestBody: { + content: { + "application/json": { + schema: { + type: "object", + properties: { + roomId: { + type: "string", + pattern: objectIdPattern, + description: "채팅을 보내는 방의 id", + }, + type: { + type: "string", + enum: [ + "text", + "s3img", + "in", + "out", + "payment", + "settlement", + "account", + "departure", + "arrival", + ], + description: `채팅 메시지의 유형
+ 일반 text의 경우 *text*, 사진의 경우 *s3img*
+ 기타 종류의 채팅의 경우(입장, 퇴장 메시지 등) 정해진 type의 채팅을 사용`, + }, + content: { + type: "string", + example: "안녕하세요~!", + description: "채팅 메세지의 본문", + }, + }, + }, + }, + }, + }, + responses: { + 200: { + content: { + "application/json": { + schema: { + type: "object", + properties: { + result: { + type: "boolean", + value: true, + }, + }, + }, + }, + }, + }, + 403: { + content: { + "text/html": { + examples: { + "소켓 연결 오류": { + value: "Chat/send : socket did not connected", + }, + "유저가 방에 참여하지 않음": { + value: "Chat/send : user did not participated in the room", + }, + }, + }, + }, + }, + 500: { + content: { + "text/html": { + example: "Chat/send : internal server error", + }, + }, + }, + }, + }, +}; + +chatsDocs[`${apiPrefix}/read`] = { + post: { + tags: [tag], + summary: "채팅 읽은 시각 업데이트 요청", + description: `채팅 읽은 시각의 업데이트 요청을 처리합니다.
+ socket 통신을 통하여 같은 방에 있는 user들에게 업데이트를 요청합니다.`, + requestBody: { + content: { + "application/json": { + schema: { + type: "object", + properties: { + roomId: { + type: "string", + pattern: objectIdPattern, + description: "채팅을 보내는 방의 id", + }, + }, + }, + }, + }, + }, + responses: { + 200: { + content: { + "application/json": { + schema: { + type: "object", + properties: { + result: { + type: "boolean", + value: true, + }, + }, + }, + }, + }, + }, + 403: { + content: { + "text/html": { + example: "Chat/read : socket did not connected", + }, + }, + }, + 404: { + content: { + "text/html": { + example: "Chat/read : cannot find room info", + }, + }, + }, + 500: { + content: { + "text/html": { + examples: { + "소켓 이벤트 전송 오류": { + value: "Chat/read : failed to emit socket events", + }, + "기타 서버 오류": { + value: "Chat/read : internal server error", + }, + }, + }, + }, + }, + }, + }, +}; + +chatsDocs[`${apiPrefix}/uploadChatImg/getPUrl`] = { + post: { + tags: [tag], + summary: "채팅 이미지를 업로드할 수 있는 Presigned-url을 발급", + description: `채팅 이미지를 업로드 하기 위한 Presigned-url을 발급합니다.
+ 이미지 전송을 위해 \`s3img\` 형식의 chat document를 생성 후 저장하며,
+ presigned-url은 aws S3 api를 통해 생성됩니다.`, + requestBody: { + content: { + "application/json": { + schema: { + type: "object", + properties: { + roomId: { + type: "string", + pattern: objectIdPattern, + description: "채팅 이미지를 보내는 방의 id", + }, + type: { + type: "string", + enum: ["image/png", "image/jpg", "image/jpeg"], + description: "채팅 이미지의 파일 형식", + }, + }, + }, + }, + }, + }, + responses: { + 200: { + content: { + "application/json": { + schema: { + type: "object", + properties: { + id: { + type: "string", + pattern: objectIdPattern, + description: "생성된 chat Document의 object id", + }, + url: { + type: "string", + example: "https://s3.{region}.amazonaws.com/{bucket-name}", + description: "taxi s3 url 주소", + }, + fields: { + type: "object", + properties: { + bucket: { + type: "string", + example: "bucket-name", + }, + "Content-Type": { + type: "string", + enum: ["image/png", "image/jpg", "image/jpeg"], + }, + key: { + type: "string", + pattern: `^chat-img/[a-fA-F\d]{24}$`, + }, + }, + description: "image의 key, type, bucket와 같은 정보", + }, + }, + }, + }, + }, + }, + 403: { + content: { + "text/html": { + example: "Chat/uploadChatImg/getPUrl : did not joined the chatting", + }, + }, + }, + 500: { + content: { + "text/html": { + example: "Chat/uploadChatImg/getPUrl : internal server error", + }, + }, + }, + }, + }, +}; + +chatsDocs[`${apiPrefix}/uploadChatImg/done`] = { + post: { + tags: [tag], + summary: "채팅 이미지 업로드 완료 여부 확인", + description: `채팅 이미지가 제대로 업로드 되었는지 확인합니다.
+ 이미지가 제대로 업로드 되었다면, socket 통신을 통해 채팅 이미지를 전송합니다.
+ 이때 채팅의 \`content\`에는 s3에 저장된 url을 나타내는 채팅의 object id를 넣어줍니다.`, + requestBody: { + content: { + "application/json": { + schema: { + type: "object", + properties: { + roomId: { + type: "string", + pattern: objectIdPattern, + description: "채팅 이미지를 보내는 방의 id", + }, + }, + }, + }, + }, + }, + responses: { + 200: { + content: { + "application/json": { + schema: { + type: "object", + properties: { + result: { + type: "boolean", + value: true, + }, + }, + }, + }, + }, + }, + 404: { + content: { + "text/html": { + example: "Chat/uploadChatImg/done : no corresponding chat", + }, + }, + }, + 500: { + content: { + "text/html": { + example: "Chat/uploadChatImg/getPUrl : internal server error", + }, + }, + }, + }, + }, +}; + +module.exports = chatsDocs; diff --git a/src/routes/docs/chats.md b/src/routes/docs/chats.md deleted file mode 100644 index 307d2def..00000000 --- a/src/routes/docs/chats.md +++ /dev/null @@ -1,99 +0,0 @@ -## `chats`: 채팅 시 발생하는 이벤트 정리 - -Taxi의 채팅 기능은 Socket.IO 라이브러리를 이용해 구현되어 있습니다. -클라이언트에서의 일반적인 Socket.IO 사용법은 [공식 문서](https://socket.io/docs/v4/client-socket-instance/)를 참조해주세요. -아래와 같은 채팅 이벤트들이 구현되어 있습니다. - -- `chats-join` -- `chats-receive` -- `chats-send` -- `chats-load` -- `chats-disconnected` (삭제해야 함) - -서버로부터 받은 모든 채팅 기록은 아래와 같은 자료형으로 구성되어 있습니다. - -```javascript -Chat { - roomId: ObjectId, //방의 objectId - type: String, // 메시지 종류("text": 일반 메시지, "in": 입장 메시지, "out": 퇴장 메시지, "s3img": S3에 업로드된 이미지, "payment": 결제 메시지, "settlement": 정산 완료 메시지) - authorId: ObejctId, //작성자의 objectId - content: String, // 메시지 내용(메시지 종류에 따라 포맷이 상이하며, 하단 참조) - time: String(ISO 8601), // ex) '2022-01-12T13:58:20.180Z' - isValid: Boolean, // 클라이언트가 보낸 메시지가 유효한 지 여부. 클라이언트가 이미지를 업로드했을 때, 해당 이미지가 제대로 업로드됐는지 확인하기 전까지 이미지를 보여주지 않기 위해 사용됨. -} -``` - -### 1. `chats-join` - -방에 새 사용자가 참여할 때 이 이벤트를 발생시키세요. -필요한 인자는 `roomId`입니다. - -- `roomId`: 방의 ObjectID (`String`), Socket.IO 서버와 연결을 시도할 때 사용자는 로그인이 되어 있어야 하며, 들어가려는 채팅방에 참여자로 참여하고 있어야 합니다. - -```javascript -const socket = io(server_address, { withCredentials: true }); -socket.emit("chats-join", roomId); -``` - -채팅방 접속이 정상적으로 완료되면, Socket.io 서버는 최근 30개의 메시지들(`Chat` 배열)을 전송합니다. - -```javascript -socket.on("chats-join", (chats) => { - // 최근 30개의 채팅 메시지 출력 - console.log(chats); -}); -``` - -### 2. `chats-send` - -채팅 메시지를 보낼 때 이 이벤트를 발생시키세요. -필요한 인자는 `roomId`와 `content`입니다. - -- `roomId`: 참여중인 방의 ObjectID(`String`) -- `content`: 보낼 텍스트(`String`) - -```javascript -socket.emit("chats-send", { roomId, content }); -``` - -메시지 전송이 성공/실패하면, Socket.IO 서버도 `chats-send` 이벤트를 발생시킵니다. - -```javascript -socket.on("chats-send", (response) => { - // 최근 30개의 채팅 메시지 출력 - console.log(response); -}); -``` - -`response`는 전송이 성공했을 경우 `{done: true}`, 실패했을 경우 `{err: true}`입니다. - -### 3. `chats-receive` - -이 이벤트는 서버나 다른 사용자가 채팅 메시지를 전송했을 때 발생합니다. 아래와 같이 `chat`에 접근하여 해당 메시지의 내용을 확인할 수 있습니다. - -```javascript -socket.on("chats-receive", (chat) => { - // 새로운 메시지 출력 - console.log(chat); -}); -``` - -### 4. `chats-load` - -과거 대화 목록을 더 불러오려면 이 이벤트를 발생시키세요. 필요한 인자는 `lastDate`와 `amount`(선택 사항) 입니다. - -- `lastDate`: 현재 클라이언트에서 불러온 채팅들 중 가장 오래된 것의 생성 시각. 서버는 이보다 먼저 생성된 메시지들을 반환합니다. ISO8601을 만족하는 `String`이어야 합니다. e.g.) `"2022-03-15T13:57:04.732Z"` -- `amount` (선택 사항): 불러올 과거 메시지의 수. 1~50의 자연수여야 하며, 입력하지 않은 경우 30개의 메시지를 가져옵니다. - -```javascript -socket.emit("chats-load", { lastDate: "2022-03-15T13:57:04.732Z", amount: 30 }); -``` - -`chats-load` 이벤트가 발생하면 서버는 클라이언트에 다시 `chats-load` 이벤트를 발생시켜 과거 채팅들(`Chat` 배열)을 보냅니다. - -```javascript -socket.on("chats-load", (chats) => { - // 과거 메시지들 출력 - console.log(chats); -}); -``` diff --git a/src/routes/docs/locations.js b/src/routes/docs/locations.js index 530788eb..34773482 100644 --- a/src/routes/docs/locations.js +++ b/src/routes/docs/locations.js @@ -1,52 +1,53 @@ -const locationsDocs = { - "/locations": { - get: { - tags: ["locations"], - summary: "출발지/도착지 정보 반환", - description: - "출발지/도착지로 사용 가능한 장소 목록 조회 및 요청 처리 당시 서버 시각 반환
\n (로그인된 상태에서만 접근 가능)", - responses: { - 200: { - description: - "서버에 저장된 location이 없을 경우, locations은 빈 배열", - content: { - "application/json": { - schema: { - type: "object", - properties: { - locations: { - type: "array", - description: "출발지/도착지로 사용 가능한 장소 목록", - items: { - type: "object", - properties: { - priority: { - type: "number", - }, - isValid: { - type: "boolean", - }, - _id: { - type: "string", - }, - koName: { - type: "string", - description: "장소의 한국어 명칭", - example: "택시승강장", - }, - enName: { - type: "string", - description: "장소의 영어 명칭", - example: "Taxi Stand", - }, +const tag = "locations"; +const apiPrefix = "/locations"; + +const locationsDocs = {}; +locationsDocs[`${apiPrefix}`] = { + get: { + tags: [tag], + summary: "출발지/도착지 정보 반환", + description: `출발지/도착지로 사용 가능한 장소 목록 조회 및 요청 처리 당시 서버 시각 반환
+ (로그인된 상태에서만 접근 가능)`, + responses: { + 200: { + description: "서버에 저장된 location이 없을 경우, locations은 빈 배열", + content: { + "application/json": { + schema: { + type: "object", + properties: { + locations: { + type: "array", + description: "출발지/도착지로 사용 가능한 장소 목록", + items: { + type: "object", + properties: { + priority: { + type: "number", + }, + isValid: { + type: "boolean", + }, + _id: { + type: "string", + }, + koName: { + type: "string", + description: "장소의 한국어 명칭", + example: "택시승강장", + }, + enName: { + type: "string", + description: "장소의 영어 명칭", + example: "Taxi Stand", }, }, }, - serverTime: { - type: "string", - format: "date-time", - description: "요청 처리 당시 서버 시각", - }, + }, + serverTime: { + type: "string", + format: "date-time", + description: "요청 처리 당시 서버 시각", }, }, }, diff --git a/src/routes/docs/logininfo.js b/src/routes/docs/logininfo.js index f572f942..59b5e0a8 100644 --- a/src/routes/docs/logininfo.js +++ b/src/routes/docs/logininfo.js @@ -1,89 +1,94 @@ -const logininfoDocs = { - "/logininfo": { - get: { - tags: ["logininfo"], - summary: "사용자 정보 반환", - description: "로그인되어 있는 사용자의 정보를 반환", - responses: { - 200: { - description: - "사용자의 로그인 세션이 유효한 경우, 현재 로그인된 사용자의 정보를 반환,
\n 세션이 유효하지 않은 경우, 빈 오브젝트를 반환", - content: { - "application/json": { - schema: { - type: "object", - properties: { - oid: { - type: "string", - }, - id: { - type: "string", - description: "사용자 id", - }, - name: { - type: "string", - description: "사용자 이름", - }, - nickname: { - type: "string", - }, - withdraw: { - type: "boolean", - }, - phoneNumber: { - type: "string", - description: "사용자 전화번호", - }, - ban: { - type: "boolean", - }, - joinat: { - type: "string", - format: "date-time", - }, - agreeOnTermsOfService: { - type: "boolean", - }, - subinfo: { - type: "object", - properties: { - kaist: { - type: "string", - description: "KAIST 학번(8자리)", - minLength: 8, - maxLength: 8, - example: "20190052", - }, - sparcs: { - type: "string", - }, - facebook: { - type: "string", - }, - twitter: { - type: "string", - }, +const { objectIdPattern } = require("./utils"); + +const tag = "logininfo"; +const apiPrefix = "/logininfo"; + +const logininfoDocs = {}; +logininfoDocs[`${apiPrefix}`] = { + get: { + tags: [tag], + summary: "사용자 정보 반환", + description: "로그인되어 있는 사용자의 정보를 반환", + responses: { + 200: { + description: + "사용자의 로그인 세션이 유효한 경우, 현재 로그인된 사용자의 정보를 반환,
\n 세션이 유효하지 않은 경우, 빈 오브젝트를 반환", + content: { + "application/json": { + schema: { + type: "object", + properties: { + oid: { + type: "string", + type: objectIdPattern, + }, + id: { + type: "string", + description: "사용자 id", + }, + name: { + type: "string", + description: "사용자 이름", + }, + nickname: { + type: "string", + }, + withdraw: { + type: "boolean", + }, + phoneNumber: { + type: "string", + description: "사용자 전화번호", + }, + ban: { + type: "boolean", + }, + joinat: { + type: "string", + format: "date-time", + }, + agreeOnTermsOfService: { + type: "boolean", + }, + subinfo: { + type: "object", + properties: { + kaist: { + type: "string", + description: "KAIST 학번(8자리)", + minLength: 8, + maxLength: 8, + example: "20190052", + }, + sparcs: { + type: "string", + }, + facebook: { + type: "string", + }, + twitter: { + type: "string", }, }, - email: { - type: "string", - example: "geon6757@kaist.ac.kr", - }, - profileImgUrl: { - type: "string", - }, - account: { - type: "string", - }, - deviceToken: { - type: "string", - description: - "클라이언트의 디바이스 토큰, 세션에 저장되어 있지 않은 경우 undefined", - }, - deviceType: { - type: "string", - enum: ["web", "app"], - }, + }, + email: { + type: "string", + example: "geon6757@kaist.ac.kr", + }, + profileImgUrl: { + type: "string", + }, + account: { + type: "string", + }, + deviceToken: { + type: "string", + description: + "클라이언트의 디바이스 토큰, 세션에 저장되어 있지 않은 경우 undefined", + }, + deviceType: { + type: "string", + enum: ["web", "app"], }, }, }, diff --git a/src/routes/docs/reports.js b/src/routes/docs/reports.js index 0210197e..b3976e7b 100644 --- a/src/routes/docs/reports.js +++ b/src/routes/docs/reports.js @@ -1,79 +1,86 @@ -const reportsDocs = { - "/reports/create": { - post: { - tags: ["reports"], - summary: "신고 작성", - description: "주어진 유저를 전달된 사유로 신고함", - requestBody: { - description: "Update an existent user in the store", - content: { - "application/json": { - schema: { - $ref: "#/components/schemas/createHandler", - }, +const { objectIdPattern } = require("./utils"); + +const tag = "reports"; +const apiPrefix = "/reports"; + +const reportsDocs = {}; +reportsDocs[`${apiPrefix}/create`] = { + post: { + tags: [tag], + summary: "신고 작성", + description: "주어진 유저를 전달된 사유로 신고함", + requestBody: { + description: "Update an existent user in the store", + content: { + "application/json": { + schema: { + $ref: "#/components/schemas/createHandler", }, }, }, - responses: { - 200: { - description: "report successful", - content: { - "text/plain": { - schema: { - type: "string", - example: "report successful", - }, + }, + responses: { + 200: { + description: "report successful", + content: { + "text/plain": { + schema: { + type: "string", + example: "report successful", }, }, }, - 500: { - description: "internal server error", - content: { - "text/plain": { - schema: { - type: "string", - example: "internal server error", - }, - }, + }, + 500: { + description: "internal server error", + content: { + "text/html": { + example: "User/report : internal server error", }, }, }, }, }, - "/reports/searchByUser": { - get: { - tags: ["reports"], - summary: "신고 내역 반환", - description: - "로그인된 사용자의 신고한 내역과, 신고받은 내역을 반환한다
1000개의 limit이 있다.", - responses: { - 200: { - description: "신고된 내역과 신고 받은 내역", - content: { - "application/json": { - schema: { - type: "object", - properties: { - reporting: { - type: "array", +}; + +reportsDocs[`${apiPrefix}/searchByUser`] = { + get: { + tags: [tag], + summary: "신고 내역 반환", + description: + "로그인된 사용자의 신고한 내역과, 신고받은 내역을 반환한다
1000개의 limit이 있다.", + responses: { + 200: { + description: "신고된 내역과 신고 받은 내역", + content: { + "application/json": { + schema: { + type: "object", + properties: { + reporting: { + type: "array", + items: { + type: "string", + pattern: objectIdPattern, }, - reported: { - type: "array", + }, + reported: { + type: "array", + items: { + type: "string", + pattern: objectIdPattern, }, }, }, }, }, }, - 500: { - description: "internal server error", - content: { - "text/plain": { - schema: { - type: "string", - example: "internal server error", - }, - }, + }, + 500: { + description: "internal server error", + content: { + "text/html": { + example: "report/searchByUser : internal server error", }, }, }, diff --git a/src/routes/docs/reportsSchema.js b/src/routes/docs/reportsSchema.js index 841918cf..654e1178 100644 --- a/src/routes/docs/reportsSchema.js +++ b/src/routes/docs/reportsSchema.js @@ -1,3 +1,5 @@ +const { objectIdPattern } = require("./utils"); + const reportsSchema = { createHandler: { type: "object", @@ -5,7 +7,7 @@ const reportsSchema = { properties: { reportedId: { type: "string", - pattern: "^[a-fA-F\\d]{24}$", + pattern: objectIdPattern, }, type: { type: "string", diff --git a/src/routes/docs/rooms.js b/src/routes/docs/rooms.js new file mode 100644 index 00000000..3292b127 --- /dev/null +++ b/src/routes/docs/rooms.js @@ -0,0 +1,830 @@ +const { roomsSchema } = require("./roomsSchema"); +const { objectIdPattern, roomsPattern } = require("./utils"); + +const tag = "rooms"; +const apiPrefix = "/rooms"; + +const roomsDocs = {}; + +roomsDocs[`${apiPrefix}/create`] = { + post: { + tags: [tag], + summary: "방 생성", + description: `방을 생성합니다. 한 유저당 최대 5개의 진행중인 방에 참여할 수 있습니다.
`, + requestBody: { + content: { + "application/json": { + schema: { + type: "object", + properties: { + name: { + type: "string", + pattern: roomsPattern.rooms.name, + description: `방 이름
+ 1~50 글자로 구성되며 영어 대소문자, 숫자, 한글, 특정 특수기호("-", ",", ".", "?", "!", "_")만 가능`, + }, + from: { + type: "string", + pattern: roomsPattern.rooms.from, + description: "출발지 location Document의 ObjectId", + }, + to: { + type: "string", + pattern: roomsPattern.rooms.to, + description: "도착지 location Document의 ObjectId", + }, + time: { + type: "string", + format: "date-time", + description: "방 출발 시각. 현재 이후여야 함.", + }, + maxPartLength: { + type: "integer", + minimum: 2, + maximum: 4, + description: "방의 최대 인원 수", + }, + }, + }, + }, + }, + }, + responses: { + 200: { + description: "생성 완성된 방 목록", + content: { + "application/json": { + schema: { + $ref: "#/components/schemas/room", + }, + }, + }, + }, + 400: { + content: { + "application/json": { + schema: { + type: "object", + properties: { + error: { + type: "string", + }, + }, + }, + examples: { + "출발지와 도착지가 같음": { + value: { + error: "Room/create : locations are same", + }, + }, + "현재로부터 2주일보다 이후의 방을 생성": { + value: { + error: + "Room/create : cannot over 2 weeks on the basis of current Date", + }, + }, + "존재하지 않는 location Document를 입력": { + value: { + error: "Rooms/create : no corresponding locations", + }, + }, + "사용자가 참여하는 진행 중 방이 5개 이상": { + value: { + error: "Rooms/create : participating in too many rooms", + }, + }, + }, + }, + }, + }, + 500: { + description: "내부 서버 오류", + content: { + "application/json": { + schema: { + type: "object", + properties: { + error: { + type: "string", + }, + }, + }, + example: { + error: "Rooms/create : internal server error", + }, + }, + }, + }, + }, + }, +}; + +roomsDocs[`${apiPrefix}/publicInfo`] = { + get: { + tags: [tag], + summary: "정산 정보를 제외한 방 세부 사항 반환", + description: + "특정 id 방의 정산 정보를 제외한 세부사항을 반환합니다. 로그인을 하지 않아도 접근 가능합니다.", + parameters: [ + { + in: "query", + name: "id", + schema: { + type: "string", + pattern: objectIdPattern, + }, + description: "찾고 싶은 방의 Object id", + }, + ], + responses: { + 200: { + description: "방의 세부 정보가 담긴 room Object", + content: { + "application/json": { + schema: { + $ref: "#/components/schemas/room", + }, + }, + }, + }, + 404: { + description: "해당 id가 존재하지 않음", + content: { + "application/json": { + schema: { + type: "object", + properties: { + error: { + type: "string", + }, + }, + }, + example: { + error: "Rooms/publicInfo : id does not exist", + }, + }, + }, + }, + 500: { + description: "내부 서버 오류", + content: { + "application/json": { + schema: { + type: "object", + properties: { + error: { + type: "string", + }, + }, + }, + example: { + error: "Rooms/publicInfo : internal server error", + }, + }, + }, + }, + }, + }, +}; + +roomsDocs[`${apiPrefix}/info`] = { + get: { + tags: [tag], + summary: "방 세부 사항 반환", + description: "유저가 참여한 방의 세부사항을 반환합니다.", + parameters: [ + { + in: "query", + name: "id", + schema: { + type: "string", + pattern: objectIdPattern, + }, + description: "찾고 싶은 방의 Object id", + }, + ], + responses: { + 200: { + description: "방의 세부 정보가 담긴 room Object", + content: { + "application/json": { + schema: { + $ref: "#/components/schemas/room", + }, + }, + }, + }, + 404: { + description: "해당 id가 존재하지 않음", + content: { + "application/json": { + schema: { + type: "object", + properties: { + error: { + type: "string", + }, + }, + }, + example: { + error: "Rooms/info : id does not exist", + }, + }, + }, + }, + 500: { + description: "내부 서버 오류", + content: { + "application/json": { + schema: { + type: "object", + properties: { + error: { + type: "string", + }, + }, + }, + example: { + error: "Rooms/info : internal server error", + }, + }, + }, + }, + }, + }, +}; + +roomsDocs[`${apiPrefix}/join`] = { + post: { + tags: [tag], + summary: "진행 중인 방에 참여", + description: `room의 ID를 받아 해당 room의 참가자 목록에 요청을 보낸 사용자를 추가합니다.
+ 하나의 User는 최대 5개의 진행중인 방에 참여할 수 있습니다.
+ 아직 정원이 차지 않은 방과 아직 출발하지 않은 방에만 참여할 수 있습니다.`, + requestBody: { + content: { + "application/json": { + schema: { + type: "object", + properties: { + roomId: { + type: "string", + pattern: objectIdPattern, + }, + }, + }, + }, + }, + }, + responses: { + 200: { + description: "방의 세부 정보가 담긴 room Object", + content: { + "application/json": { + schema: { + $ref: "#/components/schemas/room", + }, + }, + }, + }, + 400: { + content: { + "application/json": { + schema: { + type: "object", + properties: { + error: { + type: "string", + }, + }, + }, + examples: { + "사용자가 참여하는 진행 중 방이 5개 이상": { + value: { + error: "Rooms/join : participating in too many rooms", + }, + }, + "입력한 시간의 방이 이미 출발함": { + value: { + error: "Room/join : The room has already departed", + }, + }, + "방의 인원이 모두 찼음": { + value: { + error: "Room/join : The room is already full", + }, + }, + }, + }, + }, + }, + 404: { + description: "해당 id를 가진 방이 존재하지 않음", + content: { + "application/json": { + schema: { + type: "object", + properties: { + error: { + type: "string", + }, + }, + }, + example: { + error: "Rooms/join : no corresponding room", + }, + }, + }, + }, + 409: { + description: "사용자가 이미 참여중임", + content: { + "application/json": { + schema: { + type: "object", + properties: { + error: { + type: "string", + }, + }, + }, + example: { + error: "Rooms/join : {userID} Already in room", + }, + }, + }, + }, + 500: { + description: "내부 서버 오류", + content: { + "text/html": { + example: "Rooms/join : internal server error", + }, + }, + }, + }, + }, +}; + +roomsDocs[`${apiPrefix}/abort`] = { + post: { + tags: [tag], + summary: "참여 중인 방에서 퇴장", + description: `room의 ID를 받아 해당 room의 참가자 목록에서 요청을 보낸 사용자를 삭제합니다.
+ 출발했지만 정산이 완료되지 않은 방에서는 나갈 수 없습니다.`, + requestBody: { + content: { + "application/json": { + schema: { + type: "object", + properties: { + roomId: { + type: "string", + pattern: objectIdPattern, + }, + }, + }, + }, + }, + }, + responses: { + 200: { + content: { + "application/json": { + schema: { + $ref: "#/components/schemas/room", + }, + }, + }, + }, + 400: { + content: { + "application/json": { + schema: { + type: "object", + properties: { + error: { + type: "string", + }, + }, + }, + examples: { + "잘못된 userId를 포함한 요청임": { + value: { + error: "Rooms/abort : Bad request", + }, + }, + "정산이 되지 않은 출발한 방은 나갈 수 없음": { + value: { + error: + "Rooms/abort : cannot exit room. Settlement is not done", + }, + }, + }, + }, + }, + }, + 403: { + description: "사용자가 해당 방의 구성원이 아님", + content: { + "application/json": { + schema: { + type: "object", + properties: { + error: { + type: "string", + }, + }, + }, + example: { + error: "Rooms/abort : did not joined the room", + }, + }, + }, + }, + 404: { + description: "해당 id를 가진 방이 존재하지 않음", + content: { + "application/json": { + schema: { + type: "object", + properties: { + error: { + type: "string", + }, + }, + }, + example: { + error: "Rooms/abort : no corresponding room", + }, + }, + }, + }, + 500: { + description: "내부 서버 오류", + content: { + "application/json": { + schema: { + type: "object", + properties: { + error: { + type: "string", + }, + }, + }, + example: { + error: "Rooms/abort : internal server error", + }, + }, + }, + }, + }, + }, +}; + +roomsDocs[`${apiPrefix}/search`] = { + get: { + tags: [tag], + summary: "방 검색", + description: `출발지/도착지/날짜를 받아 조건에 맞는 방을 검색합니다.
+ 조건에 맞는 방이 있을 경우, 방들의 정보를 반환하고 없다면 빈 배열을 반환합니다.
+ 로그인을 하지 않아도 접근 가능합니다.`, + parameters: [ + { + in: "query", + name: "name", + schema: { + type: "string", + }, + description: `검색할 방의 이름
+ 주어진 경우 해당 텍스트가 방의 이름에 포함된 방들만 반환.
+ 주어지지 않은 경우 임의의 이름을 가지는 방들을 검색.`, + }, + { + in: "query", + name: "from", + schema: { + type: "string", + pattern: objectIdPattern, + }, + description: `출발지 Document의 ObjectId
+ 주어진 경우 출발지가 일치하는 방들만 반환.
+ 주어지지 않은 경우 임의의 출발지를 가지는 방들을 검색.`, + }, + { + in: "query", + name: "to", + schema: { + type: "string", + pattern: objectIdPattern, + }, + description: `도착지 Document의 ObjectId
+ 주어진 경우 도착지가 일치하는 방들만 반환.
+ 주어지지 않은 경우 임의의 도착지를 가지는 방들을 검색.`, + }, + { + in: "query", + name: "time", + schema: { + type: "string", + format: "date-time", + }, + description: `출발 시각
+ 주어진 경우 주어진 시간부터 주어진 시간부터 그 다음에 찾아오는 오전 5시 전에 출발하는 방들만 반환.
+ 주어지지 않은 경우 현재 시각부터 그 다음으로 찾아오는 오전 5시 전까지의 방들을 반환.`, + }, + { + in: "query", + name: "withTime", + schema: { + type: "boolean", + }, + description: `검색 옵션에 시간 옵션이 포함되어 있는지 여부.
+ false이고 검색하는 날짜가 오늘 이후인 경우 검색하는 시간을 0시 0분 0초로 설정함.`, + }, + { + in: "query", + name: "maxPartLength", + schema: { + type: "integer", + }, + description: ` 방의 최대 인원 수.
+ 주어진 경우 최대 인원 수가 일치하는 방들만 반환.
+ 주어지지 않은 경우 임의의 최대 인원 수를 가지는 방들을 검색.`, + }, + { + in: "query", + name: "isHome", + schema: { + type: "boolean", + }, + description: `홈 페이지 검색인지 여부
+ true인 경우 검색 날짜 범위를 7일로 설정.
+ false인 경우 검색 날짜 범위를 14일로 설정.
`, + }, + ], + responses: { + 200: { + content: { + "application/json": { + schema: { + type: "array", + items: { + $ref: "#/components/schemas/room", + }, + }, + }, + }, + }, + 400: { + content: { + "application/json": { + schema: { + type: "object", + properties: { + error: { + type: "string", + }, + }, + }, + examples: { + "출발지와 도착지가 같음": { + value: { + error: "Room/search : Bad request", + }, + }, + "출발/도착지가 존재하지 않는 장소": { + value: { + error: "Room/search : no corresponding locations", + }, + }, + }, + }, + }, + }, + 500: { + description: "내부 서버 오류", + content: { + "application/json": { + schema: { + type: "object", + properties: { + error: { + type: "string", + }, + }, + }, + example: { + error: "Rooms/search : internal server error", + }, + }, + }, + }, + }, + }, +}; + +roomsDocs[`${apiPrefix}/searchByUser`] = { + get: { + tags: [tag], + summary: "사용자가 참여 중인 방 검색", + description: `로그인 된 사용자가 참여 중인 방을 검색합니다.
+ 정산 완료 여부 기준으로 진행 중인 방과 완료된 방을 \`ongoing\`과 \`done\`으로 각각 분리하여 응답을 전송합니다.
+ (\`ongoing\`은 \`isOver\`이 flase인 방, \`done\`은 \`isOver\`이 true인 방을 의미합니다.)`, + parameters: {}, + responses: { + 200: { + content: { + "application/json": { + schema: { + type: "object", + properties: { + ongoing: { + type: "array", + items: { + $ref: "#/components/schemas/room", + }, + }, + done: { + type: "array", + items: { + $ref: "#/components/schemas/room", + }, + }, + }, + }, + }, + }, + }, + 500: { + description: "내부 서버 오류", + content: { + "application/json": { + schema: { + type: "object", + properties: { + error: { + type: "string", + }, + }, + }, + example: { + error: "Rooms/searchByUser : internal server error", + }, + }, + }, + }, + }, + }, +}; + +roomsDocs[`${apiPrefix}/commitPayment`] = { + post: { + tags: [tag], + summary: "방 결제 처리", + description: `해당 방에 요청을 보낸 유저를 결제자로 처리합니다.
+ 이미 출발한 방에 대해서만 요청을 처리합니다.
+ 방의 \`part\` 배열에서 요청을 보낸 유저의 \`isSettlement\` 속성은 \`paid\`로 설정됩니다.
+ 나머지 유저들의 \`isSettlement\` 속성을 \`send-required\`로 설정합니다.`, + requestBody: { + content: { + "application/json": { + schema: { + type: "object", + properties: { + roomId: { + type: "string", + pattern: objectIdPattern, + }, + }, + }, + }, + }, + }, + responses: { + 200: { + description: "결제 정보가 수정된 방의 세부 정보가 담긴 room Object", + content: { + "application/json": { + schema: { + $ref: "#/components/schemas/room", + }, + }, + }, + }, + 404: { + description: `잘못된 방 요청
+ (사용자가 참여 중인 방이 아니거나, 이미 다른 사람이 결제자이거나, 아직 방이 출발하지 않은 경우)`, + content: { + "application/json": { + schema: { + type: "object", + properties: { + error: { + type: "string", + }, + }, + }, + example: { + error: "Rooms/:id/commitPayment : cannot find settlement info", + }, + }, + }, + }, + 500: { + description: "내부 서버 오류", + content: { + "application/json": { + schema: { + type: "object", + properties: { + error: { + type: "string", + }, + }, + }, + example: { + error: "Rooms/:id/commitPayment : internal server error", + }, + }, + }, + }, + }, + }, +}; + +roomsDocs[`${apiPrefix}/commitSettlement`] = { + post: { + tags: [tag], + summary: "방 정산 완료 처리", + description: `해당 방에 요청을 보낸 유저를 정산 완료로 처리합니다.
+ 방의 \`part\` 배열에서 요청을 보낸 유저의 \`isSettlement\` 속성은 \`send-required\`에서 \`sent\`로 변경합니다.
+ 방의 참여한 유저들이 모두 정산완료를 하면 방의 \`isOver\` 속성이 \`true\`로 변경되며, 과거 방으로 취급됩니다.`, + requestBody: { + content: { + "application/json": { + schema: { + type: "object", + properties: { + roomId: { + type: "string", + pattern: objectIdPattern, + }, + }, + }, + }, + }, + }, + responses: { + 200: { + description: "결제 정보가 수정된 방의 세부 정보가 담긴 room Object", + content: { + "application/json": { + schema: { + $ref: "#/components/schemas/room", + }, + }, + }, + }, + 404: { + description: `잘못된 방 요청
+ (사용자가 참여 중인 방이 아니거나, 사용자가 결제를 했거나 이미 정산한 경우)`, + content: { + "application/json": { + schema: { + type: "object", + properties: { + error: { + type: "string", + }, + }, + }, + example: { + error: "Rooms/:id/settlement : cannot find settlement info", + }, + }, + }, + }, + 500: { + description: "내부 서버 오류", + content: { + "application/json": { + schema: { + type: "object", + properties: { + error: { + type: "string", + }, + }, + }, + example: { + error: "Rooms/:id/settlement : internal server error", + }, + }, + }, + }, + }, + }, +}; + +module.exports = roomsDocs; diff --git a/src/routes/docs/rooms.md b/src/routes/docs/rooms.md deleted file mode 100755 index 3346d753..00000000 --- a/src/routes/docs/rooms.md +++ /dev/null @@ -1,367 +0,0 @@ -# `/rooms` API - -## Table of contents - -- [`/rooms` API](#rooms-api) - - [Table of contents](#table-of-contents) - - [Description](#description) - - [Available endpoints](#available-endpoints) - - [`/publicInfo` **(GET)**](#publicinfo-get) - - [URL parameters](#url-parameters) - - [Response](#response) - - [Errors](#errors) - - [`/info` **(GET)**](#info-get) - - [URL parameters](#url-parameters-1) - - [Response](#response-1) - - [Errors](#errors-1) - - [`/create` **(POST)**](#create-post) - - [POST request form](#post-request-form) - - [Errors](#errors-2) - - [Response](#response-2) - - [`/join` (POST)](#join-post) - - [request JSON form](#request-json-form) - - [Errors](#errors-3) - - [`/abort` (POST)](#abort-post) - - [request JSON form](#request-json-form-1) - - [Errors](#errors-4) - - [`/search` **(GET)**](#search-get) - - [URL parameters](#url-parameters-2) - - [Response](#response-3) - - [Errors](#errors-5) - - [`/searchByUser` **(GET)**](#searchbyuser-get) - - [URL parameters](#url-parameters-3) - - [Response](#response-4) - - [Errors](#errors-6) - - [`/commitPayment` **(POST)**](#commitpayment-post) - - [Request Body](#request-body) - - [Response](#response-5) - - [Errors](#errors-7) - - [`/commitSettlement/` **(POST)**](#commitsettlement-post) - - [Request Body](#request-body-1) - - [Response](#response-6) - - [Errors](#errors-8) - - [`/edit/` **(POST)** **(for dev)**](#edit-post-for-dev) - - [POST request form](#post-request-form-1) - - [Response](#response-7) - - [Errors](#errors-9) - - [`/getAllRoom` **(GET)** (for dev)](#getallroom-get-for-dev) - - [`/removeAllRoom` **(GET)** (for dev)](#removeallroom-get-for-dev) - - [`/:id/delete/` **(GET)** **(for dev)**](#iddelete-get-for-dev) - - [URL Parameters](#url-parameters-4) - - [Response](#response-8) - - [Errors](#errors-10) - -## Description - -- 방 생성/수정/삭제/조회 기능을 지원하는 API. -- `/publicInfo`, `/search`를 제외한 endpoint는 로그인된 상태에서만 접근 가능 -- Request form에서 요구하는 property 이름에 ? 이 붙은 경우 필수가 아니라는 뜻 -- 방을 반환할 경우 그 type은 다음과 같다. - -```javascript -Room { - _id: ObjectId, //ObjectID - name: String, // 1~50글자로 구성되며 영어 대소문자, 숫자, 한글, "-", ",", ".", "?", "!", "_"로만 이루어져야 함. - from: { - _id: ObjectId, // 출발지 document의 ObjectId - koName: String, // 출발지의 한국어 명칭 - enName: String, // 출발지의 영어 명칭 - }, - to: { - _id: ObjectId, // 도착지 document의 ObjectId - koName: String, // 도착지의 한국어 명칭 - enName: String, // 도착지의 영어 명칭 - }, - time: String(ISO 8601), // ex) 방 출발 시각. '2022-01-12T13:58:20.180Z' - isDeparted: Boolean, // 이미 출발한 택시인지 여부 (출발했으면 true) - part: [ - { - _id: ObjectId, // part의 ObjectId - user: { - _id: ObjectId, // 참여 중인 사용자 Document의 ObjectId - name: String, // 참여 중인 사용자 이름 - nickname: String, // 참여 중인 사용자 닉네임 - profileImageUrl: String, // 프로필 사진 url - isSettlement: String || undefined, //해당 사용자의 정산 상태 (주의: "/publicInfo"와 "/search"에서는 isSettlement 속성이 undefined로 설정됨). - }, - } - ], - maxPartLength: Number(2~4), //방의 최대 인원 수 - madeat: String(ISO 8601), // ex) 방 생성 시각. '2022-01-12T13:58:20.180Z' - settlementTotal: Number(2~4), // 정산이 완료된 사용자 수 (주의: "/publicInfo"와 "/search"에서는 settlementTotal 속성이 undefined로 설정됨). - isOver: Boolean, // 요청을 보낸 사용자가 해당 방의 정산을 완료됐는지 여부(완료 시 true) (주의: rooms/search에서는 isOver 속성을 반환하지 않고 undefined를 반환함). - __v: Number, // 문서 버전. mongoDB 내부적으로 사용됨. -} -``` - -`settlementStatus` 속성은 아래 네 가지 값들 중 하나를 가진다. - -1. `"not-departed"` : 아무도 결제/정산하지 않은 상태 -2. `"paid"` : 택시비를 결제한 참가가 "결제하기" 버튼을 누르면 해당 참가자에게 설정되는 정산 상태. -3. `"send-required"` : 특정 참가자가 "결제하기" 버튼을 눌렀을 때 그 방의 나머지 참가자에게 설정되는 정산 상태. -4. `"sent"` : 정산 상태가`"send-required"`인 사용자가 "정산하기" 버튼을 눌렀을 때 그 사용자에게 설정되는 정산 상태. - -## Available endpoints - -### `/publicInfo` **(GET)** - -ID를 parameter로 받아 해당 ID의 room의 정보 출력 - -#### URL parameters - -- id : 조회할 room의 ID - -#### Response - -- 해당 방의 정보 -- 각 참여자의 isSettlement 속성과 방의 settlementTotal 속성은 undefined로 설정됨. - -#### Errors - -- 404 "id does not exist" -- 500 "internal server error" - -### `/info` **(GET)** - -ID를 parameter로 받아 해당 ID의 room의 정보 출력 - -#### URL parameters - -- id : 조회할 room의 ID - -#### Response - -- 해당 방의 정보 - -#### Errors - -- 403 "not logged in" -- 403 "did not joined the room" -- 404 "id does not exist" -- 500 "internal server error" - -### `/create` **(POST)** - -요청을 받아 room을 생성 -하나의 User는 최대 5개의 진행중인 방에 참여할 수 있다. - -#### POST request form - -`Request body` - -```javascript -{ - name : String, // 방 이름. 문서 상단에 명시된 규칙을 만족시켜야 함 - from : ObjectId, // 출발지 Document의 ObjectId - to : ObjectId, // 도착지 Document의 ObjectId - time : Date, // 방 출발 시각. 현재 이후여야 함. - part? : String[], // 방 사람들의 ObjectId. 따라서 빈 배열로 요청하시면 됩니다. - maxPartLength: Number(2~4), //방의 최대 인원 수 -} -``` - -#### Errors - -- 400 "bad request" -- 400 "participating in too many rooms" -- 400 "locations are same" -- 400 "no corresponding locations" -- 500 "internal server error" - -#### Response - -- 새로이 만들어진 방 - -### `/join` (POST) - -room의 ID를 받아 해당 room의 참가자 목록에 요청을 보낸 사용자를 추가한다. -하나의 User는 최대 5개의 진행중인 방에 참여할 수 있다. -아직 정원이 차지 않은 방과 아직 출발하지 않은 방에만 참여할 수 있다. - -#### request JSON form - -```javascript -{ - roomId : ObjectId, // 초대 혹은 참여하려는 방 Document의 ObjectId -} -``` - -#### Errors - -- 400 "Bad request" -- 400 "participating in too many rooms" -- 400 "The room is full" -- 400 "The room has already departed" -- 404 "no corresponding room" -- 409 "{userID} Already in room" -- 500 "internal server error" - -### `/abort` (POST) - -room의 ID를 받아 해당 room의 참가자 목록에서 요청을 보낸 사용자를 삭제한다. -출발했지만 정산이 완료되지 않은 방에서는 나갈 수 없다. - -#### request JSON form - -```javascript -{ - roomId : ObjectId, // 초대 혹은 참여하려는 방 Document의 ObjectId -} -``` - -#### Errors - -- 400 "Bad request" -- 400 "cannot exit room. Settlement is not done" -- 404 "no corresponding room" -- 500 "internal server error" - - -### `/search` **(GET)** - -출발지/도착지/날짜를 받아 해당하는 room들을 반환한다. - -#### URL parameters - -- name?: String, // 검색할 방의 이름. 주어진 경우 해당 텍스트가 방의 이름에 포함된 방들만 반환. 주어지지 않은 경우 임의의 이름을 가지는 방들을 검색. -- from? : ObjectId, // 출발지 Document의 ObjectId. 주어진 경우 출발지가 일치하는 방들만 반환. 주어지지 않은 경우 임의의 출발지를 가지는 방들을 검색. -- to? : ObjectId, // 도착지 Document의 ObjectId. 주어진 경우 도착지가 일치하는 방들만 반환. 주어지지 않은 경우 임의의 도착지를 가지는 방들을 검색. -- time? : Date, // 출발 시각. 주어진 경우 주어진 시간부터 주어진 시간부터 그 다음에 찾아오는 오전 5시 전에 출발하는 방들만 반환. 주어지지 않은 경우 현재 시각부터 그 다음으로 찾아오는 오전 5시 전까지의 방들을 반환. -- withTime? : Boolean, // 검색 옵션에 시간 옵션이 포함되어 있는지 여부. false이고 검색하는 날짜가 오늘 이후인 경우 검색하는 시간을 0시 0분 0초로 설정함. -- maxPartLength?: Number(2~4), // 방의 최대 인원 수. 주어진 경우 최대 인원 수가 일치하는 방들만 반환. 주어지지 않은 경우 임의의 최대 인원 수를 가지는 방들을 검색. - - -#### Response - -조건에 맞는 방**들**의 정보: `Room[]` -조건에 일치하는 방이 없더라도 빈 배열을 반환함. - -#### Errors - -- 400 "Bad request" -- 400 "no corresponding locations" -- 500 "Internal server error" - -### `/searchByUser` **(GET)** - -로그인된 사용자가 참여 중인 room들을 반환한다. - -#### URL parameters - -없음. - -#### Response - -```javascript -{ - ongoing: [Room], // 정산이 완료되지 않은 방 (방의 isOver 속성이 false인 방) - done: [Room], // 정산이 완료된 방 (방의 isOver 속성이 true인 방) -} -``` - -#### Errors - -- 403 "not logged in" -- 500 "internal server error" - - -### `/commitPayment` **(POST)** - -- ID를 받아 해당 방에 요청을 보낸 유저를 결제자로 처리 -- 이미 출발한 방(현재 시각이 출발 시각 이후인 경우)에 대해서만 요청을 처리함 -- 방의 part 배열에서 요청을 보낸 유저의 isSettlement 속성을 `paid`로 설정하고, 나머지 유저들의 isSettlement 속성을 `"send-required"`로 설정함. - -#### Request Body - -- roomId : 정산할 room의 ID - -#### Response - -- 멤버들의 정산정보가 반영된 방의 정보 - -#### Errors - -- 400 "Bad request": 로그인이 되어있지 않은 경우 -- 404 "cannot find settlement info": 사용자가 참여 중인 방이 아니거나, 이미 다른 사람이 결제자이거나, 아직 방이 출발하지 않은 경우 -- 500 "internal server error" - - - -### `/commitSettlement/` **(POST)** - -- ID를 받아 해당 방에 요청을 보낸 유저의 정산을 완료로 처리 -- 방의 part 배열에서 요청을 보낸 유저의 isSettlement 속성을 `send-required`에서 `"sent"`로 변경함. -- 방에 참여한 멤버들이 모두 정산완료를 하면 방의 `isOver` 속성이 `true`로 변경되며, 과거 방으로 취급됨 - -#### Request Body - -- roomId : 정산할 room의 ID - -#### Response - -- 멤버들의 정산정보가 반영된 방의 정보 - -#### Errors - -- 400 "Bad request" : 로그인이 되어있지 않은 경우 -- 404 "cannot find settlement info": 사용자가 참여중인 방이 아니거나, 사용자가 결제를 했거나 이미 정산한 경우 -- 500 "internal server error" - -### `/edit/` **(POST)** **(for dev)** - -- ID와 수정할 데이터를 JSON으로 받아 해당 ID의 room을 수정 -- 방에 참여중인 사용자만 정보를 수정할 수 있음. -- 프론트엔드에서 쓰일 일은 없어 보임. - -#### POST request form - -```javascript -{ - roomId : String, // 수정할 room의 ID - name? : String, // 방 이름. 문서 상단에 명시된 규칙을 만족시켜야 함 - from? : ObjectId, // 출발지 Document의 ObjectId - to? : ObjectId, // 도착지 Document의 ObjectId - time? : Date, // 방 출발 시각. 현재 이후여야 함. - maxPartLength?: Number(2~4), // 방의 최대 인원 수. 현재 참여 인원수보다 크거나 같은 값이어야 함. -} -``` - -#### Response - -- 변경된 방의 정보 - -#### Errors - -- 400 "Bad request" -- 404 "id does not exist" -- 500 "internal server error" - -### `/getAllRoom` **(GET)** (for dev) - -모든 방 가져옴 - -### `/removeAllRoom` **(GET)** (for dev) - -모든 방 삭제 - -### `/:id/delete/` **(GET)** **(for dev)** - -ID를 받아 해당 ID의 room을 제거 - -#### URL Parameters - -- id : 삭제할 room의 ID - -#### Response - -```javascript -{ - id: ObjectId, // 삭제할 방 Document의 ObjectId - isDeleted: true -} -``` - -#### Errors - -- 404 "ID does not exist" -- 500 "Internal server error" \ No newline at end of file diff --git a/src/routes/docs/roomsSchema.js b/src/routes/docs/roomsSchema.js new file mode 100644 index 00000000..e256c5dd --- /dev/null +++ b/src/routes/docs/roomsSchema.js @@ -0,0 +1,90 @@ +const { objectIdPattern, roomsPattern } = require("./utils"); + +const participantSchema = { + part: { + type: "object", + required: ["_id", "name", "nickname", "profileImageUrl", "readAt"], + properties: { + _id: { + type: "string", + pattern: objectIdPattern, + }, + name: { + type: "string", + }, + nickname: { + type: "string", + }, + profileImageUrl: { + type: "string", + }, + isSettlement: { + type: "string", + enum: ["not-departed", "paid", "send-required", "sent"], + default: "not-departed", + }, + readAt: { + type: "string", + format: "date-time", + }, + }, + }, +}; + +const roomsSchema = { + room: { + type: "object", + required: [ + "name", + "from", + "to", + "time", + "part", + "madeat", + "maxPartLength", + "isDeparted", + ], + properties: { + name: { + type: "string", + pattern: objectIdPattern, + }, + from: { + type: "string", + pattern: objectIdPattern, + }, + to: { + type: "string", + pattern: objectIdPattern, + }, + time: { + type: "string", + format: "date-time", + }, + part: { + type: "array", + items: participantSchema["part"], + }, + madeat: { + type: "string", + format: "date-time", + }, + maxPartLength: { + type: "integer", + default: 4, + }, + settlementTotal: { + type: "integer", + default: 0, + }, + isOver: { + type: "boolean", + }, + isDeparted: { + type: "boolean", + }, + }, + }, +}; + +module.exports = { roomsSchema, participantSchema }; diff --git a/src/routes/docs/swaggerDocs.js b/src/routes/docs/swaggerDocs.js index c6c13060..a6dab17a 100644 --- a/src/routes/docs/swaggerDocs.js +++ b/src/routes/docs/swaggerDocs.js @@ -1,8 +1,34 @@ const reportsSchema = require("./reportsSchema"); +const { participantSchema, roomsSchema } = require("./roomsSchema"); const reportsDocs = require("./reports"); const logininfoDocs = require("./logininfo"); const locationsDocs = require("./locations"); +const authDocs = require("./auth"); const usersDocs = require("./users"); +const roomsDocs = require("./rooms"); +const chatsDocs = require("./chats"); +const { port, nodeEnv } = require("../../../loadenv"); + +const serverList = [ + { + url: `http://localhost:${port}`, + description: "local api server", + development: true, + production: false, + }, + { + url: "https://taxi.sparcs.org/api", + description: "taxi main api server", + development: true, + production: true, + }, + { + url: "https://taxi.dev.sparcs.org/api", + description: "taxi dev api server", + development: true, + production: false, + }, +]; const swaggerDocs = { openapi: "3.0.3", @@ -11,6 +37,7 @@ const swaggerDocs = { version: "1.0.0", }, basePath: "/", + servers: serverList.filter((server) => server[nodeEnv]), tags: [ { name: "locations", @@ -24,10 +51,22 @@ const swaggerDocs = { name: "reports", description: "사용자 신고 및 신고 기록 조회", }, + { + name: "auth", + description: "사용자 생성, 로그인, 로그아웃 등 사용자 상태 관리 지원", + }, { name: "users", description: "유저 계정 정보 수정 및 조회", }, + { + name: "rooms", + description: "방 생성/수정/삭제/조회 및 관리 지원", + }, + { + name: "chats", + description: "채팅 시 발생하는 이벤트 정리", + }, ], consumes: ["application/json"], produces: ["application/json"], @@ -36,10 +75,15 @@ const swaggerDocs = { ...logininfoDocs, ...locationsDocs, ...usersDocs, + ...authDocs, + ...chatsDocs, + ...roomsDocs, }, components: { schemas: { ...reportsSchema, + ...participantSchema, + ...roomsSchema, }, }, }; diff --git a/src/routes/docs/users.js b/src/routes/docs/users.js index e76cd2b4..3cd8aa96 100644 --- a/src/routes/docs/users.js +++ b/src/routes/docs/users.js @@ -2,6 +2,120 @@ const tag = "users"; const apiPrefix = "/users"; const usersDocs = {}; +usersDocs[`${apiPrefix}/agreeOnTermsOfService`] = { + post: { + tags: [tag], + summary: "이용 약관에 동의", + description: + "요청을 보낸 유저의 약관 동의 여부를 동의함으로 변경합니다. 철회는 불가능합니다.", + responses: { + 200: { + content: { + "text/html": { + example: + "Users/agreeOnTermsOfService : agree on Terms of Service successful", + }, + }, + }, + 400: { + content: { + "text/html": { + example: "Users/agreeOnTermsOfService : already agreed", + }, + }, + }, + 500: { + content: { + "text/html": { + example: "Users/agreeOnTermsOfService : internal server error", + }, + }, + }, + }, + }, +}; + +usersDocs[`${apiPrefix}/getAgreeOnTermsOfService`] = { + get: { + tags: [tag], + summary: "이용 약관 동의 여부 전송", + description: + "요청을 보낸 유저의 이용 약관 동의 여부를 json 형태로 전송합니다.", + responses: { + 200: { + content: { + "application/json": { + schema: { + type: "object", + properties: { + agreeOnTermsOfService: { + type: "boolean", + description: "유저의 이용 약관 동의 여부", + example: true, + }, + }, + }, + }, + }, + }, + 500: { + content: { + "text/html": { + example: "Users/getAgreeOnTermsOfService : internal server error", + }, + }, + }, + }, + }, +}; + +usersDocs[`${apiPrefix}/editNickname`] = { + post: { + tags: [tag], + summary: "유저의 닉네임 변경", + description: "유저의 닉네임을 요청한 닉네임으로 변경합니다.", + requestBody: { + content: { + "application/json": { + schema: { + type: "object", + properties: { + nickname: { + type: "string", + example: "끈질긴 열과 분자의 이동", + description: "유저의 새 닉네임", + }, + }, + }, + }, + }, + }, + responses: { + 200: { + content: { + "text/html": { + example: "Users/editNickname : edit user nickname successful", + }, + }, + }, + 400: { + content: { + "text/html": { + example: "Users/editNickname : such user id does not exist", + }, + }, + }, + 500: { + content: { + "text/html": { + example: "Users/editNickname : internal server error", + }, + }, + }, + }, + }, +}; + usersDocs[`${apiPrefix}/resetNickname`] = { get: { tags: [tag], @@ -11,21 +125,171 @@ usersDocs[`${apiPrefix}/resetNickname`] = { 200: { content: { "text/html": { - example: "User/resetNickname : reset user nickname successful", + example: "Users/resetNickname : reset user nickname successful", + }, + }, + }, + 400: { + content: { + "text/html": { + example: "Users/resetNickname : such user does not exist", + }, + }, + }, + 500: { + content: { + "text/html": { + example: "Users/resetNickname : internal server error", + }, + }, + }, + }, + }, +}; + +usersDocs[`${apiPrefix}/editAccount`] = { + post: { + tags: [tag], + summary: "유저의 계좌 번호 변경", + description: "유저의 계좌 번호를 요청한 계좌 번호로 변경합니다.", + requestBody: { + content: { + "application/json": { + schema: { + type: "object", + properties: { + account: { + type: "string", + description: "유저의 새 계좌 번호", + }, + }, + }, + }, + }, + }, + responses: { + 200: { + content: { + "text/html": { + example: "Users/editAccount : edit user account successful", }, }, }, 400: { content: { "text/html": { - example: "User/resetNickname : such user does not exist", + example: "Users/editAccount : such user id does not exist", + }, + }, + }, + 500: { + content: { + "text/html": { + example: "Users/editAccount : internal server error", + }, + }, + }, + }, + }, +}; + +usersDocs[`${apiPrefix}/editProfileImg/getPUrl`] = { + post: { + tags: [tag], + summary: "프로필 이미지 업로드를 위한 presigned-url 발급", + description: `유저의 프로필 이미지는 AWS S3에서 관리됩니다. 변경할 프로필을 업로드 하기 위한 주소인 presigned-url을 발급합니다.
+
+ **프로필 사진은 아래 규칙을 만족해야 합니다:**
+ 1. 파일 형식은 image/png, image/jpg, image/jpeg 중 하나
+ 2. 파일 크기는 최대 50 MB`, + requestBody: { + content: { + "application/json": { + schema: { + type: "object", + properties: { + type: { + type: "string", + description: "업로드할 이미지 type", + example: "image/png", + }, + }, + }, + }, + }, + }, + responses: { + 200: { + content: { + "application/json": { + schema: { + type: "object", + properties: { + url: { + type: "string", + description: "이미지 업로드를 위한 presigned-url", + }, + fields: { + type: "object", + properties: { + "Content-Type": { + type: "string", + description: "이미지의 type", + }, + key: { + type: "string", + description: "이미지의 S3 파일 경로", + }, + }, + description: "업로드 파일의 type 및 key 정보", + }, + }, + }, }, }, }, 500: { + contnet: { + "text/html": { + example: "Users/editProfileImg/getPUrl : internal server error", + }, + }, + }, + }, + }, +}; + +usersDocs[`${apiPrefix}/editProfileImg/done`] = { + get: { + tags: [tag], + summary: "프로필 이미지 정상 업로드 여부 확인", + description: `프로필 이미지가 S3에 정상적으로 업로드 되었는지 확인합니다.
+ 정상적으로 확인 되었다면, 유저의 \`profileImageUrl\` 정보를 새 프로필 이미지 파일명으로 업데이트 합니다.`, + responses: { + 200: { content: { + "application/json": { + schema: { + type: "object", + properties: { + result: { + type: "boolean", + description: "정상적인 업로드 성공 여부", + }, + profileImageUrl: { + type: "string", + description: + "새 프로필 이미지 파일명 (업로드 실패 시 `undefined`)", + }, + }, + }, + }, + }, + }, + 500: { + contnet: { "text/html": { - example: "User/resetNickname : internal server error", + example: "Users/editProfileImg/done : internal server error", }, }, }, @@ -43,21 +307,21 @@ usersDocs[`${apiPrefix}/resetProfileImg`] = { content: { "text/html": { example: - "User/resetProfileImg : reset user profile image successful", + "Users/resetProfileImg : reset user profile image successful", }, }, }, 400: { content: { "text/html": { - example: "User/resetProfileImg : such user does not exist", + example: "Users/resetProfileImg : such user does not exist", }, }, }, 500: { content: { "text/html": { - example: "User/resetProfileImg : internal server error", + example: "Users/resetProfileImg : internal server error", }, }, }, diff --git a/src/routes/docs/users.md b/src/routes/docs/users.md deleted file mode 100755 index 6b46963b..00000000 --- a/src/routes/docs/users.md +++ /dev/null @@ -1,305 +0,0 @@ -## `/users` - -- 사용자 정보 조회 및 수정 기능을 지원하는 API. -- 로그인된 상태에서만 접근 가능 -- 사용자를 반환할 경우 그 type은 다음과 같다. - -```javascript -User { - name: String, - nickname: String, // 3글자 이상 25글자 이하로 구성되며 영어 대소문자, 한글, " ", 0~9, "-", "_" 으로만 이루어져야 함. - id: String, - withdraw: Boolean, - ban: Boolean, - joinat: Date, - agreeOnTermsOfService: { type: Boolean, default: false }, //이용약관 동의 여부 - room: [Room], - subinfo: { - kaist: String, - sparcs: String, - facebook: String, - twitter: String, - }, - email: String, - __v: Number, -} -``` - -### `/agreeOnTermsOfService` **(POST)** - -- 이용 약관에 동의함 (철회 불가) - -#### URL Parameters, Request JSON form - -- 없음 - -#### Response - -- 200 "agree on Terms of Service successful" -- 400 "already agreed" -- 500 "internal server error" - -### `/getAgreeOnTermsOfService` **(GET)** - -- 이용 약관 동의 여부를 가져옴 - -#### URL Parameters, Request JSON form - -- 없음 - -#### Response - -```javascript -{ - agreeOnTermsOfService: Boolean -}, -``` - -### `/editNickname` **(POST)** - -- 해당 사용자의 닉네임을 새로 설정함. -- 새로운 닉네임은 상술한 규칙을 만족해야 함. - -#### URL Parameters - -- user_id : 사용자의 SPARCS SSO ID - -#### request JSON form - -```javascript -{ - nickname: String, // 새 닉네임 -} -``` - -#### Response - -```javascript -{ - status: 200, - data: "edit user nickname successful", -} -``` - -#### Errors - -- 400 "wrong nickname" -- 400 "such user id does not exist" -- 403 "not logged in" -- 500 "internal server error" - -### `/editProfileImg/getPUrl` **(POST)** - -- 프로필 이미지를 업로드할 수 있는 Presigned-url을 발급합니다. -- 프로필 사진은 아래 규칙을 만족해야 함. - 1. 파일 형식은 image/png, image/jpg, image/jpeg 중 하나 - 2. 파일 크기는 최대 50 MB - -#### URL Parameters - -- type : 업로드할 이미지 type - -#### request JSON form - -```javascript -{ - url: String, // pre-signed url - fields: Object, // post fields -} -``` - -#### Errors - -- 500 "internal server error" - -### `/editProfileImg/done` **(GET)** - -- 프로필 이미지가 S3에 정상적으로 업로드가 되었는지 확인합니다. - -#### URL Parameters - -- 없음 - -#### request JSON form - -```javascript -{ - result: Boolean, // 정상적으로 업로드 되었으면 true - profileImageUrl?: user._id, // 정상적으로 업로드 되었으면 새 프로필 이미지 파일명, 그렇지 않은 경우 undefined -} -``` - -#### Errors - -- 500 "internal server error" - -### `/` **(GET)** (for dev) - -- 사용자 전체 리스트를 반환함. - -#### URL Parameters - -- 없음 - -#### Response - -```javascript -{ - status: 200, - data: User[], // 전체 사용자 리스트 -} -``` - -#### Errors - -- 없음 - -### `/rooms` **(GET)** (for dev) - -- 사용자의 방 리스트를 반환함. - -#### URL Parameters - -- id : User document의 id - -#### Response - -```javascript -{ - id: String, // 요청된 id - rooms: Room[], // 방 리스트 -} -``` - -#### Errors - -- 404 "user/rooms : such id does not exist" -- 500 "user/rooms : internal server error" - -### `/:id` **(GET)** (for dev) - -- 사용자 정보를 반환함. - -#### URL Parameters - -- id : User document의 id - -#### Response - -```javascript -{ - status: 200, - data: User, //id에 대응되는 사용자 정보 -} -``` - -#### Errors - -- 404 "user/:id : such id does not exist" -- 500 "user/:id : internal server error" - -### `/:id/edit` **(POST)** (for dev) - -- 새 사용자 정보를 받아 업데이트함. - -#### URL Parameters - -- id : User document의 id - -#### request JSON form - -```javascript -User; //수정할 사용자 정보 -``` - -#### Response - -```javascript -{ - status: 200, - data: "edit user successful", -} -``` - -#### Errors - -- 400 "such id does not exist" - -### `/:id/ban` **(GET)** (for dev) - -- 해당 사용자를 밴함. - -#### URL Parameters - -- id : User document의 id - -#### Response - -```javascript -{ - status: 200, - data: "The user banned successfully", -} -``` - -#### Errors - -- 400 "The user does not exist" -- 409 "The user is already banned" -- 500 "User/ban : Error 500" - -### `/:id/unban` **(GET)** (for dev) - -- 해당 사용자를 밴 해제함. - -#### URL Parameters - -- id : User document의 id - -#### Response - -```javascript -{ - status: 200, - data: "The user unbanned successfully", -} -``` - -#### Errors - -- 400 "The user does not exist" -- 409 "The user is already banned" -- 500 "User/unban : Error 500" - -### `/:id/participate` **(POST)** (for dev) - -- 해당 사용자를 특정 방에 참여시킴. - -#### URL Parameters - -- id : User document의 id - -#### request JSON form - -```javascript -{ - room: String, // Room document의 id -} -``` - -#### Response - -```javascript -{ - status: 200, - data: "User/participate : Successful", -} -``` - -#### Errors - -- 400 "User/participate : Bad request" -- 400 "User/participate : No corresponding room" -- 400 "The user does not exist" -- 409 "The user already entered the room" -- 500 "User/participate : Error 500" diff --git a/src/routes/docs/utils.js b/src/routes/docs/utils.js new file mode 100644 index 00000000..8181ceac --- /dev/null +++ b/src/routes/docs/utils.js @@ -0,0 +1,12 @@ +const objectIdPattern = `^[a-fA-F\d]{24}$`; +const roomsPattern = { + rooms: { + name: RegExp( + "^[A-Za-z0-9가-힣ㄱ-ㅎㅏ-ㅣ,.?! _~/#'\\\\@=\"\\-\\^()+*<>{}[\\]]{1,50}$" + ), + from: RegExp("^[A-Za-z0-9가-힣 -]{1,20}$"), + to: RegExp("^[A-Za-z0-9가-힣 -]{1,20}$"), + }, +}; + +module.exports = { objectIdPattern, roomsPattern }; diff --git a/src/sampleGenerator/.gitignore b/src/sampleGenerator/.gitignore new file mode 100644 index 00000000..2909449b --- /dev/null +++ b/src/sampleGenerator/.gitignore @@ -0,0 +1,107 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# TypeScript v1 declaration files +typings/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variables file +.env +.env.test + +# parcel-bundler cache (https://parceljs.org/) +.cache + +# Next.js build output +.next + +# Nuxt.js build / generate output +.nuxt +dist + +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and *not* Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# public + +# vuepress build output +.vuepress/dist + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# TernJS port file +.tern-port + +# MongoDB Dump +dump/ diff --git a/src/sampleGenerator/README.md b/src/sampleGenerator/README.md new file mode 100644 index 00000000..5afd5960 --- /dev/null +++ b/src/sampleGenerator/README.md @@ -0,0 +1,28 @@ +# taxiSampleGenerator + +이 node 프로그램은 SPARCS-Taxi 프로젝트를 위한 샘플 사용자, 방, 채팅 목록을 생성합니다. +현재 이 프로그램으로 생성된 샘플 채팅 데이터는 입, 퇴장 메시지들과 일반 채팅 메시지들로만 구성되어 있습니다. + +**WARNING** +스크립트 실행 시 기존에 MongoDB에 저장된 사용자, 방, 채팅 정보는 **삭제**됩니다! + +**SETUP** + +1. *(optional)* Root directory의 `.env.test` 파일에 다음 내용을 추가합니다. + ``` + #방과 각각의 방의 채팅 개수 + SAMPLE_NUM_OF_ROOMS=2 + SAMPLE_NUM_OF_CHATS=200 + #채팅 간 최대 시간 간격(단위: 초, 소수도 가능) + SAMPLE_MAXIMUM_INTERVAL_BETWEEN_CHATS=20 + #새로운 채팅이 각각 입/퇴장 메시지일 확률(각각 10%) + SAMPLE_OCCURENCE_OF_JOIN=0.1 + SAMPLE_OCCURENCE_OF_ABORT=0.1 + ``` +1. sampleData.json에 장소, 유저, 방 데이터를 입력합니다. + javascript `User { "id": "sampleId", 사용자 id }` + +1. `pnpm start`로 샘플 채팅 데이터를 만들 수 있습니다. + +1. `pnpm run dumpDB`으로 현재 DB를 덤프할 수 있습니다. +1. `pnpm run restoreDB`로 과거 DB를 덤프 파일로부터 복원할 수 있습니다. diff --git a/src/sampleGenerator/index.js b/src/sampleGenerator/index.js new file mode 100644 index 00000000..e83a9335 --- /dev/null +++ b/src/sampleGenerator/index.js @@ -0,0 +1,47 @@ +const { + generateUser, + generateRoom, + generateSampleLocations, + generateChats, +} = require("./src/testData"); +const { connectDatabase } = require("../modules/stores/mongo"); +const { mongo: mongoUrl, numberOfChats, numberOfRooms } = require("./loadenv"); + +const database = connectDatabase(mongoUrl); + +const fs = require("fs"); +const sampleData = JSON.parse(fs.readFileSync("./sampleData.json")); + +const main = async () => { + await database.db.dropDatabase(); + + const { users, locations } = sampleData; + + const userOids = []; + const roomOids = []; + + for (const [index, user] of users.entries()) { + const userOid = await generateUser(user.id, index + 1, user.isAdmin); + userOids.push(userOid); + } + + const sampleLocationOids = await generateSampleLocations(locations); + + for (const index of Array(numberOfRooms).keys()) { + const roomOid = await generateRoom( + sampleLocationOids, + index + 1, + 7, + userOids[0] + ); //하드코딩: 일주일 뒤에 출발하는 방(들)을 만듭니다. + roomOids.push(roomOid); + } + + for (const roomOid of roomOids) { + await generateChats(roomOid, userOids, numberOfChats); + } + console.log("끝! 스크립트 실행을 중단하셔도 됩니다."); + process.exit(0); +}; + +database.on("open", main); diff --git a/src/sampleGenerator/loadenv.js b/src/sampleGenerator/loadenv.js new file mode 100644 index 00000000..0843789b --- /dev/null +++ b/src/sampleGenerator/loadenv.js @@ -0,0 +1,13 @@ +// Root directory에 있는 .env.test 파일을 읽어옴 +require("dotenv").config({ path: "../../.env.test" }); + +module.exports = { + mongo: process.env.DB_PATH, // required + numberOfRooms: parseInt(process.env.SAMPLE_NUM_OF_ROOMS ?? 2), // optional + numberOfChats: parseInt(process.env.SAMPLE_NUM_OF_CHATS ?? 200), // optional + maximumIntervalBtwChats: parseFloat( + process.env.SAMPLE_MAXIMUM_INTERVAL_BETWEEN_CHATS ?? 20 + ), // optional + occurenceOfJoin: parseFloat(process.env.SAMPLE_OCCURENCE_OF_JOIN ?? 0.1), // optional + occurenceOfAbort: parseFloat(process.env.SAMPLE_OCCURENCE_OF_ABORT ?? 0.1), // optional +}; diff --git a/src/sampleGenerator/package.json b/src/sampleGenerator/package.json new file mode 100644 index 00000000..3c7473bc --- /dev/null +++ b/src/sampleGenerator/package.json @@ -0,0 +1,17 @@ +{ + "name": "taxisamplegenerator", + "version": "1.0.0", + "description": "sample generator", + "main": "index.js", + "scripts": { + "preinstall": "npx only-allow pnpm", + "start": "node index.js", + "test": "echo \"Error: no test specified\" && exit 1", + "dumpDB": "node tools/dump.js", + "restoreDB": "node tools/restore.js" + }, + "keywords": [ + "test" + ], + "license": "ISC" +} diff --git a/src/sampleGenerator/sampleData.json b/src/sampleGenerator/sampleData.json new file mode 100644 index 00000000..546812cd --- /dev/null +++ b/src/sampleGenerator/sampleData.json @@ -0,0 +1,112 @@ +{ + "users": [ + { + "id": "sunday", + "isAdmin": true + }, + { + "id": "monday", + "isAdmin": true + }, + { + "id": "tuesday", + "isAdmin": true + }, + { + "id": "wednesday", + "isAdmin": true + } + ], + "locations": [ + { + "koName": "택시승강장", + "enName": "Taxi Stand", + "longitude": 127.359507, + "latitude": 36.373199 + }, + { + "koName": "대전역", + "enName": "Daejeon Station", + "longitude": 127.434522, + "latitude": 36.331894 + }, + { + "koName": "갤러리아 타임월드", + "enName": "Galleria Timeworld", + "longitude": 127.378188, + "latitude": 36.351938 + }, + { + "koName": "궁동 로데오거리", + "enName": "Gung-dong Rodeo Street", + "longitude": 127.350161, + "latitude": 36.362785 + }, + { + "koName": "대전복합터미널", + "enName": "Daejeon Terminal Complex", + "longitude": 127.350161, + "latitude": 36.362785 + }, + { + "koName": "만년중학교", + "enName": "Mannyon Middle School", + "longitude": 127.375993, + "latitude": 36.366990 + }, + { + "koName": "서대전역", + "enName": "Seodaejeon Station", + "longitude": 127.403933, + "latitude": 36.322517 + }, + { + "koName": "신세계백화점", + "enName": "Shinsegae Department Store", + "longitude": 127.381905, + "latitude": 36.375168 + }, + { + "koName": "오리연못", + "enName": "Duck Pond", + "longitude": 127.362371, + "latitude": 36.367715 + }, + { + "koName": "월평역", + "enName": "Wolpyeong Station", + "longitude": 127.364352, + "latitude": 36.358271 + }, + { + "koName": "유성구청", + "enName": "Yuseong-gu Office", + "longitude": 127.356384, + "latitude": 36.362084 + }, + { + "koName": "유성 고속버스터미널", + "enName": "Yuseong Express Bus Terminal", + "longitude": 127.336467, + "latitude": 36.358279 + }, + { + "koName": "유성 시외버스터미널", + "enName": "Yuseong Intercity Bus Terminal", + "longitude": 127.335971, + "latitude": 36.355604 + }, + { + "koName": "대전청사 고속버스터미널", + "enName": "Government Complex Express Bus Terminal", + "longitude": 127.390504, + "latitude": 36.361462 + }, + { + "koName": "대전청사 시외버스터미널", + "enName": "Government Complex Intercity Bus Terminal", + "longitude": 127.379759, + "latitude": 36.361512 + } + ] +} diff --git a/src/sampleGenerator/src/testData.js b/src/sampleGenerator/src/testData.js new file mode 100644 index 00000000..1209c52a --- /dev/null +++ b/src/sampleGenerator/src/testData.js @@ -0,0 +1,199 @@ +const { + userModel, + roomModel, + locationModel, + chatModel, +} = require("../../modules/stores/mongo"); +const { generateProfileImageUrl } = require("../../modules/modifyProfile"); + +const { + maximumIntervalBtwChats, + occurenceOfJoin, + occurenceOfAbort, +} = require("../loadenv"); + +const generateUser = async (id, num, isAdmin) => { + const newUser = new userModel({ + id: id, + name: `${id}-name`, + nickname: `${id}-nickname`, + profileImageUrl: generateProfileImageUrl(), + joinat: Date.now(), + subinfo: { + kaist: new String(20230000 + num), // ^-^ + sparcs: "", + facebook: "", + twitter: "", + }, + email: `${id}@kaist.ac.kr`, + isAdmin: isAdmin, + }); + await newUser.save(); + return newUser._id; +}; + +const generateSampleLocations = async (locations) => { + if (locations.length === 0) { + console.log("Please provide location(s)!"); + } + + for (const location of locations) { + const locationDocument = new locationModel({ + koName: location.koName, + enName: location.enName, + longitude: location.longitude, + latitude: location.latitude, + }); + await locationDocument.save(); + } + + const locationDocuments = await locationModel.find().lean(); + return locationDocuments.map((locationDocument) => locationDocument._id); +}; + +const generateRoom = async (sampleLocationOids, num, daysAfter, creatorId) => { + const date = new Date(); + date.setDate(date.getDate() + daysAfter); + + let fromIdx = 0; + let toIdx = 0; + + while (fromIdx === toIdx) { + fromIdx = Math.floor(Math.random() * sampleLocationOids.length); + toIdx = Math.floor(Math.random() * sampleLocationOids.length); + } + + const newRoom = new roomModel({ + name: `test-${num}`, + from: sampleLocationOids[fromIdx], + to: sampleLocationOids[toIdx], + time: date, + part: [{ user: creatorId }], + madeat: Date.now(), + maxPartLength: 4, + }); + await newRoom.save(); + return newRoom._id; +}; + +const joinUserToRoom = async (userIdsInRoom, userIdsOutRoom, roomId) => { + // 들어올 사용자를 무작위로 선택 + const authorIdx = Math.floor(Math.random() * userIdsOutRoom.length); + const userOid = userIdsOutRoom[authorIdx]; + + // 방, 유저 상태 갱신 + userIdsInRoom.push(userOid); + userIdsOutRoom.splice(authorIdx, 1); + const user = await userModel.findById(userOid, "ongoingRoom"); + user.ongoingRoom.push(roomId); + await user.save(); + + return { userIdsInRoom, userIdsOutRoom, userOid }; +}; + +const abortUserfromRoom = async (userIdsInRoom, userIdsOutRoom, roomId) => { + // 나갈 사용자를 무작위로 선택 + const authorIdx = Math.floor(Math.random() * userIdsInRoom.length); + const userOid = userIdsInRoom[authorIdx]; + + // 방, 유저 상태 갱신 + userIdsOutRoom.push(userOid); + userIdsInRoom.splice(authorIdx, 1); + const user = await userModel.findById(userOid, "ongoingRoom"); + user.ongoingRoom.splice(user.ongoingRoom.indexOf(roomId), 1); + await user.save(); + + return { userIdsInRoom, userIdsOutRoom, userOid }; +}; + +const generateNormalChat = async (i, roomId, userOid, time) => { + const user = await userModel.findById(userOid); + const newChat = new chatModel({ + roomId: roomId, + type: "text", + authorId: user._id, + content: `안녕하세요! (${i}번째 메시지)`, + time: time, + inValid: false, + }); + await newChat.save(); +}; + +const generateJoinAbortChat = async (roomId, userOid, isJoining, time) => { + const user = await userModel.findById(userOid); + const newChat = new chatModel({ + roomId: roomId, + type: isJoining ? "in" : "out", + authorId: user._id, + content: user.id, + time: time, + isValid: false, + }); + await newChat.save(); +}; + +const generateChats = async (roomId, userOids, numOfChats) => { + const roomPopulateQuery = [{ path: "part", select: "id name nickname -_id" }]; + const room = await roomModel.findById(roomId).populate(roomPopulateQuery); + + let userIdsInRoom = []; + let userIdsOutRoom = userOids.map((userOid) => userOid); + let lastTime = Date.now(); + const maximumIntervalBtwChatsMilliseconds = 1000 * maximumIntervalBtwChats; + + for (const i of Array(numOfChats).keys()) { + lastTime += Math.floor(Math.random() * maximumIntervalBtwChatsMilliseconds); + const event = Math.random(); + + if ( + userIdsInRoom.length === 0 || + (event < occurenceOfJoin && userIdsOutRoom.length !== 0) + ) { + // 더 들어올 사용자가 있을 경우, 더 들어옴 + // 방, 유저 상태 갱신 + let userOid; + ({ userIdsInRoom, userIdsOutRoom, userOid } = await joinUserToRoom( + userIdsInRoom, + userIdsOutRoom, + roomId + )); + // 입장 메시지 생성 + await generateJoinAbortChat(roomId, userOid, true, lastTime); + } else if ( + occurenceOfJoin <= event && + event < occurenceOfJoin + occurenceOfAbort && + userIdsInRoom.length > 1 + ) { + // 나갈 사용자가 있을 경우, 나감 + // 방, 유저 상태 갱신 + let userOid; + ({ userIdsInRoom, userIdsOutRoom, userOid } = await abortUserfromRoom( + userIdsInRoom, + userIdsOutRoom, + roomId + )); + // 퇴장 메시지 생성 + await generateJoinAbortChat(roomId, userOid, false, lastTime); + } else { + // 방이 비어있지 않을 경우, 일반 채팅 메시지를 만듦 + if (userIdsInRoom.length !== 0) { + const authorIdx = Math.floor(Math.random() * userIdsInRoom.length); + const user = userIdsInRoom[authorIdx]; + await generateNormalChat(i, roomId, user, lastTime); + } + } + } + // 현재 참여중인 사용자 기준으로 방의 part 리스트를 업데이트함 + room.part = userIdsInRoom.map((userOid) => { + return { user: userOid }; + }); + await room.save(); + return; +}; + +module.exports = { + generateUser, + generateRoom, + generateSampleLocations, + generateChats, +}; diff --git a/src/sampleGenerator/tools/dump.js b/src/sampleGenerator/tools/dump.js new file mode 100644 index 00000000..7d26d802 --- /dev/null +++ b/src/sampleGenerator/tools/dump.js @@ -0,0 +1,20 @@ +const util = require("util"); +const path = require("path"); +const exec = util.promisify(require("child_process").exec); +const { mongo: mongoUrl } = require("../loadenv"); + +const main = async () => { + const { stdout, stderr } = await exec( + `mongodump ${mongoUrl} --out ${path.resolve("dump")}` + ); + console.log("dump 디렉토리에 데이터베이스 데이터를 덤프했습니다."); + process.exit(0); +}; + +try { + main(); +} catch { + console.log( + "DB 연결 주소가 올바르지 않습니다. DB 연결 주소를 다시 한 번 확인해주세요." + ); +} diff --git a/src/sampleGenerator/tools/restore.js b/src/sampleGenerator/tools/restore.js new file mode 100644 index 00000000..5c14c98b --- /dev/null +++ b/src/sampleGenerator/tools/restore.js @@ -0,0 +1,23 @@ +const util = require("util"); +const path = require("path"); +const exec = util.promisify(require("child_process").exec); +const { mongo: mongoUrl } = require("../loadenv"); + +const main = async () => { + const dbName = mongoUrl.split("/").pop(); + const { stdout, stderr } = await exec( + `mongorestore ${mongoUrl} ${path.resolve("dump", dbName)}` + ); + console.log( + "dump 디렉토리로부터 데이터베이스 정보를 성공적으로 복원했습니다." + ); + process.exit(0); +}; + +try { + main(); +} catch { + console.log( + "DB를 덤프해올 디렉토리가 존재하지 않습니다. 경로를 다시 한 번 확인해주세요." + ); +} diff --git a/src/services/chats.js b/src/services/chats.js index abcbd073..ca74d774 100644 --- a/src/services/chats.js +++ b/src/services/chats.js @@ -273,7 +273,7 @@ const uploadChatImgDoneHandler = async (req, res) => { if (!user) { return res .status(500) - .send("Chat/uploadChatImg/getPUrl : internal server error"); + .send("Chat/uploadChatImg/done : internal server error"); } if (!chat) { return res.status(404).json({ @@ -294,7 +294,7 @@ const uploadChatImgDoneHandler = async (req, res) => { if (err) { return res .status(500) - .send("Chat/uploadChatImg/getPUrl : internal server error"); + .send("Chat/uploadChatImg/done : internal server error"); } chat.content = chat._id; diff --git a/src/services/rooms.js b/src/services/rooms.js index d4b7557e..a2562c67 100644 --- a/src/services/rooms.js +++ b/src/services/rooms.js @@ -110,13 +110,13 @@ const publicInfoHandler = async (req, res) => { res.send(formatSettlement(roomObject, { includeSettlement: false })); } else { res.status(404).json({ - error: "Rooms/info : id does not exist", + error: "Rooms/publicInfo : id does not exist", }); } } catch (err) { logger.error(err); res.status(500).json({ - error: "Rooms/info : internal server error", + error: "Rooms/publicInfo : internal server error", }); } }; @@ -153,7 +153,7 @@ const joinHandler = async (req, res) => { // 사용자의 참여중인 진행중인 방이 5개 이상이면 오류를 반환합니다. if (user.ongoingRoom.length >= 5) { return res.status(400).json({ - error: "Rooms/create : participating in too many rooms", + error: "Rooms/join : participating in too many rooms", }); } @@ -244,7 +244,7 @@ const abortHandler = async (req, res) => { .indexOf(user._id.toString()); if (roomPartIndex === -1) { return res.status(403).json({ - error: "Rooms/info : did not joined the room", + error: "Rooms/abort : did not joined the room", }); } @@ -254,7 +254,7 @@ const abortHandler = async (req, res) => { // 방의 출발시간이 지나고 정산이 되지 않으면 나갈 수 없음 if (isOvertime(room, req.timestamp) && userOngoingRoomIndex !== -1) { return res.status(400).json({ - error: "Rooms/info : cannot exit room. Settlement is not done", + error: "Rooms/abort : cannot exit room. Settlement is not done", }); } @@ -377,7 +377,6 @@ const searchHandler = async (req, res) => { .limit(1000) .populate(roomPopulateOption) .lean(); - res.json( rooms.map((room) => formatSettlement(room, { includeSettlement: false })) ); diff --git a/src/services/users.js b/src/services/users.js index 895f4051..4d8486dc 100644 --- a/src/services/users.js +++ b/src/services/users.js @@ -18,13 +18,13 @@ const agreeOnTermsOfServiceHandler = async (req, res) => { res .status(200) .send( - "User/agreeOnTermsOfService : agree on Terms of Service successful" + "Users/agreeOnTermsOfService : agree on Terms of Service successful" ); } else { - res.status(400).send("User/agreeOnTermsOfService : already agreed"); + res.status(400).send("Users/agreeOnTermsOfService : already agreed"); } } catch { - res.status(500).send("User/agreeOnTermsOfService : internal server error"); + res.status(500).send("Users/agreeOnTermsOfService : internal server error"); } }; @@ -36,7 +36,9 @@ const getAgreeOnTermsOfServiceHandler = async (req, res) => { const agreeOnTermsOfService = user.agreeOnTermsOfService === true; res.json({ agreeOnTermsOfService }); } catch { - res.status(500).send("/getAgreeOnTermsOfService : internal server error"); + res + .status(500) + .send("Users/getAgreeOnTermsOfService : internal server error"); } }; @@ -55,13 +57,15 @@ const editNicknameHandler = async (req, res) => { req.timestamp ); - res.status(200).send("User/editNickname : edit user nickname successful"); + res + .status(200) + .send("Users/editNickname : edit user nickname successful"); } else { - res.status(400).send("User/editNickname : such user id does not exist"); + res.status(400).send("Users/editNickname : such user id does not exist"); } } catch (err) { logger.error(err); - res.status(500).send("User/editNickname : internal server error"); + res.status(500).send("Users/editNickname : internal server error"); } }; @@ -81,13 +85,13 @@ const editAccountHandler = async (req, res) => { newAccount ); - res.status(200).send("User/editAccount : edit user account successful"); + res.status(200).send("Users/editAccount : edit user account successful"); } else { - res.status(400).send("User/editAccount : such user id does not exist"); + res.status(400).send("Users/editAccount : such user id does not exist"); } } catch (err) { logger.error(err); - res.status(500).send("User/editAccount : internal server error"); + res.status(500).send("Users/editAccount : internal server error"); } }; @@ -98,13 +102,15 @@ const editProfileImgGetPUrlHandler = async (req, res) => { if (!user) { return res .status(500) - .send("User/editProfileImg/getPUrl : internal server error"); + .send("Users/editProfileImg/getPUrl : internal server error"); } const key = `profile-img/${user._id}`; const data = await aws.getUploadPUrlPost(key, type); res.json({ url: data }); } catch (e) { - res.status(500).send("User/editProfileImg/getPUrl : internal server error"); + res + .status(500) + .send("Users/editProfileImg/getPUrl : internal server error"); } }; @@ -114,7 +120,7 @@ const editProfileImgDoneHandler = async (req, res) => { if (!user) { return res .status(500) - .send("User/editProfileImg/done : internal server error"); + .send("Users/editProfileImg/done : internal server error"); } const key = `profile-img/${user._id}`; aws.foundObject(key, async (err) => { @@ -122,25 +128,25 @@ const editProfileImgDoneHandler = async (req, res) => { logger.error(err); return res .status(500) - .send("User/editProfileImg/done : internal server error"); + .send("Users/editProfileImg/done : internal server error"); } const userAfter = await userModel.findOneAndUpdate( { id: req.userId }, - { profileImageUrl: user._id }, + { profileImageUrl: aws.getS3Url(`/${key}?token=${req.timestamp}`) }, { new: true } ); if (!userAfter) { return res .status(500) - .send("User/editProfileImg/done : internal server error"); + .send("Users/editProfileImg/done : internal server error"); } res.json({ result: true, - profileImageUrl: userAfter._id, + profileImageUrl: userAfter.profileImageUrl, }); }); } catch (e) { - res.status(500).send("User/editProfileImg/done : internal server error"); + res.status(500).send("Users/editProfileImg/done : internal server error"); } }; @@ -154,11 +160,13 @@ const resetNicknameHandler = async (req, res) => { if (!result) return res .status(400) - .send("User/resetNickname : such user does not exist"); - res.status(200).send("User/resetNickname : reset user nickname successful"); + .send("Users/resetNickname : such user does not exist"); + res + .status(200) + .send("Users/resetNickname : reset user nickname successful"); } catch (err) { logger.error(err); - res.status(500).send("User/resetNickname : internal server error"); + res.status(500).send("Users/resetNickname : internal server error"); } }; @@ -172,12 +180,12 @@ const resetProfileImgHandler = async (req, res) => { if (!result) return res .status(400) - .send("User/resetProfileImg : such user does not exist"); + .send("Users/resetProfileImg : such user does not exist"); res .status(200) - .send("User/resetProfileImg : reset user profile image successful"); + .send("Users/resetProfileImg : reset user profile image successful"); } catch (err) { - res.status(500).send("User/resetProfileImg : internal server error"); + res.status(500).send("Users/resetProfileImg : internal server error"); } }; diff --git a/test/services/users.js b/test/services/users.js index 7667eb49..393a79e5 100644 --- a/test/services/users.js +++ b/test/services/users.js @@ -15,7 +15,7 @@ describe("[users] 1.agreeOnTermsOfServiceHandler", () => { it("should return correct response from handler", async () => { const testUser1 = await userGenerator("test1", testData); const msg = - "User/agreeOnTermsOfService : agree on Terms of Service successful"; + "Users/agreeOnTermsOfService : agree on Terms of Service successful"; let req = httpMocks.createRequest({ userId: testUser1.id, }); @@ -50,7 +50,7 @@ describe("[users] 3.editNicknameHandler", () => { it("should return correct response from handler", async () => { const testUser1 = await userModel.findOne({ id: "test1" }); - const msg = "User/editNickname : edit user nickname successful"; + const msg = "Users/editNickname : edit user nickname successful"; let req = httpMocks.createRequest({ userId: testUser1.id, body: { @@ -77,7 +77,7 @@ describe("[users] 4.editAccountHandler", () => { it("should return correct response from handler", async () => { const testUser1 = await userModel.findOne({ id: "test1" }); - const msg = "User/editAccount : edit user account successful"; + const msg = "Users/editAccount : edit user account successful"; let req = httpMocks.createRequest({ userId: testUser1.id, body: { diff --git a/test/utils.js b/test/utils.js index b3920e83..e537913b 100644 --- a/test/utils.js +++ b/test/utils.js @@ -7,8 +7,9 @@ const { connectDatabase, } = require("../src/modules/stores/mongo"); const { generateProfileImageUrl } = require("../src/modules/modifyProfile"); +const { mongo: mongoUrl } = require("../loadenv"); -connectDatabase(); +connectDatabase(mongoUrl); // 테스트를 위한 유저 생성 함수 const userGenerator = async (username, testData) => {