diff --git a/.github/workflows/deploy-playground-and-test.yml b/.github/workflows/deploy-playground-and-test.yml deleted file mode 100644 index b8335f17b..000000000 --- a/.github/workflows/deploy-playground-and-test.yml +++ /dev/null @@ -1,283 +0,0 @@ -name: Deploy Playground Apps to Vercel and Test on React -env: - VERCEL_TOKEN: ${{ secrets.VERCEL_TOKEN }} - VERCEL_ORG_ID: ${{ secrets.VERCEL_ORG_ID }} - BRANCH_NAME_RAW: ${{ github.head_ref || github.ref_name }} - -on: - pull_request: - push: - branches: - - develop - -jobs: - deploy: - runs-on: ubuntu-24.04 - - steps: - - name: Checkout code - uses: actions/checkout@v4 - - - name: Set up Node.js - uses: actions/setup-node@v4 - - - name: Cache node modules - id: cache-npm - uses: actions/cache@v3 - env: - cache-name: cache-node-modules - with: - path: | - ~/.npm - ./node_modules - key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('**/package-lock.json') }}-force-1 - restore-keys: | - ${{ runner.os }}-build-${{ env.cache-name }}- - ${{ runner.os }}-build- - ${{ runner.os }}- - - - if: ${{ steps.cache-npm.outputs.cache-hit != 'true' }} - name: Install Dependencies - run: | - npm i - npm install lerna - npm install vercel@33.2.0 - npm list - - - name: Check ESLint Errors - run: npm run lint - - - name: Check Prettier Formatting - run: npm run prettier:check - - - name: Build SDKs - run: | - npm run build - npm run build:bundler:local - - - name: Normalize branch name - run: | - echo "BRANCH_NAME=$(echo $BRANCH_NAME_RAW | tr '/_' '-')" >> "$GITHUB_ENV" - shell: bash - - - name: Deploy react playground to Vercel - run: | - npx vercel link --yes --project react-playground --scope corbado -t $VERCEL_TOKEN - npx vercel pull -t $VERCEL_TOKEN - npx vercel build -t $VERCEL_TOKEN - url="$(npx vercel deploy --prebuilt -t ${{ secrets.VERCEL_TOKEN }})" - npx vercel alias -S corbado -t ${{ secrets.VERCEL_TOKEN }} "$url" $BRANCH_NAME.react.playground.corbado.io - env: - VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID_REACT_PLAYGROUND }} - - - name: Deploy connect next playground to Vercel - run: | - npx vercel link --yes --project connect-next-playground --scope corbado -t $VERCEL_TOKEN - npx vercel pull --environment=preview -t $VERCEL_TOKEN - npx vercel build -t $VERCEL_TOKEN - url="$(npx vercel deploy --prebuilt -t ${{ secrets.VERCEL_TOKEN }})" - npx vercel alias -S corbado -t ${{ secrets.VERCEL_TOKEN }} "$url" $BRANCH_NAME.connect-next.playground.corbado.io - env: - VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID_CONNECT_NEXT_PLAYGROUND }} - - - name: Deploy web-js playground to Vercel - run: | - npx vercel link --yes --project web-js-playground --scope corbado -t $VERCEL_TOKEN - npx vercel pull -t $VERCEL_TOKEN - npx vercel build -t $VERCEL_TOKEN - url="$(npx vercel deploy --prebuilt -t ${{ secrets.VERCEL_TOKEN }})" - npx vercel alias -S corbado -t ${{ secrets.VERCEL_TOKEN }} "$url" $BRANCH_NAME.web-js.playground.corbado.io - env: - VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID_WEB_JS_PLAYGROUND }} - - - name: Deploy web-js-script playground to Vercel - run: | - npx vercel link --yes --project web-js-script-playground --scope corbado -t $VERCEL_TOKEN - npx vercel pull -t $VERCEL_TOKEN - npx vercel build -t $VERCEL_TOKEN - url="$(npx vercel deploy --prebuilt -t ${{ secrets.VERCEL_TOKEN }})" - npx vercel alias -S corbado -t ${{ secrets.VERCEL_TOKEN }} "$url" $BRANCH_NAME.web-js-script.playground.corbado.io - env: - VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID_WEB_JS_SCRIPT_PLAYGROUND }} - - test: - needs: deploy - timeout-minutes: 60 - runs-on: ubuntu-24.04 - - steps: - - name: Checkout code - uses: actions/checkout@v4 - - - name: Set up Node.js - uses: actions/setup-node@v4 - - - name: Get installed Playwright version - id: playwright-version - run: echo "::set-output name=version::$(yarn why --json @playwright/test | grep -h 'workspace:.' | jq --raw-output '.children[].locator' | sed -e 's/@playwright\/test@.*://')" - - - name: Cache node modules - id: cache-npm - uses: actions/cache@v3 - env: - cache-name: cache-node-modules - with: - path: | - ~/.npm - key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('**/package-lock.json') }} - restore-keys: | - ${{ runner.os }}-build-${{ env.cache-name }}- - ${{ runner.os }}-build- - ${{ runner.os }}- - - - if: ${{ steps.cache-npm.outputs.cache-hit != 'true' }} - name: List the state of node modules - continue-on-error: true - run: | - cd packages/tests-e2e - npm list - - - name: Install Dependencies - run: | - cd packages/tests-e2e - npm install - sudo apt-get update - sudo apt-get install -y libxml2-utils - - - uses: actions/cache@v3 - id: playwright-cache - with: - path: '~/.cache/ms-playwright' - key: '${{ runner.os }}-playwright-${{ steps.playwright-version.outputs.version }}' - restore-keys: | - ${{ runner.os }}-playwright- - - - name: Install Playwright's dependencies - if: steps.playwright-cache.outputs.cache-hit != 'true' - run: | - cd packages/tests-e2e - npx playwright install --with-deps - - - name: Create a log stream on AWS CloudWatch - env: - AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} - AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - AWS_REGION: ${{ secrets.AWS_REGION }} - run: | - TIMESTAMP=$(date +%s000) - echo "LOG_STREAM_NAME=javascript-$TIMESTAMP" >> $GITHUB_ENV - aws logs create-log-stream --log-group-name "test-results-board" --log-stream-name "javascript-$TIMESTAMP" - - - name: Run Complete tests for react - run: | - cd packages/tests-e2e - BRANCH_NAME=$(echo $BRANCH_NAME_RAW | tr '/_' '-') - export PLAYWRIGHT_TEST_URL="https://$BRANCH_NAME.react.playground.corbado.io" - set +e - npx playwright test --config=playwright.config.complete.ts - EXIT_CODE=$? - if [ $EXIT_CODE -ne 0 ]; then - echo "COMPLETE_REACT_FAILED=true" >> $GITHUB_ENV - fi - env: - PLAYWRIGHT_NUM_CORES: 4 - PLAYWRIGHT_JWT_TOKEN: ${{ secrets.PLAYWRIGHT_JWT_TOKEN }} - PLAYWRIGHT_GOOGLE_EMAIL: ${{ secrets.PLAYWRIGHT_GOOGLE_EMAIL }} - PLAYWRIGHT_GOOGLE_PASSWORD: ${{ secrets.PLAYWRIGHT_GOOGLE_PASSWORD }} - PLAYWRIGHT_GOOGLE_TOTP_SECRET: ${{ secrets.PLAYWRIGHT_GOOGLE_TOTP_SECRET }} - GITHUB_RUN_ID: ${{ github.run_id }} - SLACK_BOT_USER_OAUTH_TOKEN: ${{ secrets.SLACK_BOT_USER_OAUTH_TOKEN }} - GITHUB_BRANCH_NAME: ${{ github.ref_name }} - continue-on-error: true - - - uses: actions/upload-artifact@v4 - with: - name: playwright-report-complete-react - path: packages/tests-e2e/playwright-report/ - retention-days: 30 - - - name: Send logs to AWS CloudWatch - env: - AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} - AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - AWS_REGION: ${{ secrets.AWS_REGION }} - run: | - cd packages/tests-e2e - TESTS=$(xmllint --xpath 'string(/testsuites/@tests)' test-results/results.xml) - FAILURES=$(xmllint --xpath 'string(/testsuites/@failures)' test-results/results.xml) - SKIPPED=$(xmllint --xpath 'string(/testsuites/@skipped)' test-results/results.xml) - ERRORS=$(xmllint --xpath 'string(/testsuites/@errors)' test-results/results.xml) - TIME=$(xmllint --xpath 'string(/testsuites/@time)' test-results/results.xml) - PASSED=$((TESTS - FAILURES - ERRORS - SKIPPED)) - FAILED=$((FAILURES + ERRORS)) - TIMESTAMP=$(date +%s000) - LOG_EVENT_JSON="[{\"timestamp\":$TIMESTAMP,\"message\":\"{\\\"application\\\":\\\"complete\\\",\\\"platform\\\":\\\"react\\\",\\\"run_type\\\":\\\"commitly\\\",\\\"execution_time\\\":$TIME,\\\"passed\\\":$PASSED,\\\"failed\\\":$FAILED,\\\"link\\\":\\\"https://github.com/corbado/javascript/actions/runs/${GITHUB_RUN_ID}\\\"}\"}]" - aws logs put-log-events --log-group-name "test-results-board" --log-stream-name "$LOG_STREAM_NAME" --log-events "$LOG_EVENT_JSON" - - - name: Run Connect tests for react - run: | - cd packages/tests-e2e - BRANCH_NAME=$(echo $BRANCH_NAME_RAW | tr '/_' '-') - export PLAYWRIGHT_TEST_URL="https://$BRANCH_NAME.connect-next.playground.corbado.io" - set +e - npx playwright test --config=playwright.config.connect.ts - EXIT_CODE=$? - if [ $EXIT_CODE -ne 0 ]; then - echo "CONNECT_REACT_FAILED=true" >> $GITHUB_ENV - fi - env: - PLAYWRIGHT_NUM_CORES: 4 - BACKEND_API_BASIC_AUTH: ${{ secrets.BACKEND_API_BASIC_AUTH }} - PLAYWRIGHT_CONNECT_PROJECT_ID: ${{ secrets.PLAYWRIGHT_CONNECT_PROJECT_ID }} - PLAYWRIGHT_NGROK_AUTH_TOKEN: ${{ secrets.PLAYWRIGHT_NGROK_AUTH_TOKEN }} - GITHUB_RUN_ID: ${{ github.run_id }} - SLACK_BOT_USER_OAUTH_TOKEN: ${{ secrets.SLACK_BOT_USER_OAUTH_TOKEN }} - GITHUB_BRANCH_NAME: ${{ env.BRANCH_NAME_RAW }} - continue-on-error: true - - - uses: actions/upload-artifact@v4 - with: - name: playwright-report-connect-react - path: packages/tests-e2e/playwright-report/ - retention-days: 30 - - - name: Send logs to AWS CloudWatch - env: - AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} - AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - AWS_REGION: ${{ secrets.AWS_REGION }} - run: | - cd packages/tests-e2e - TESTS=$(xmllint --xpath 'string(/testsuites/@tests)' test-results/results.xml) - FAILURES=$(xmllint --xpath 'string(/testsuites/@failures)' test-results/results.xml) - SKIPPED=$(xmllint --xpath 'string(/testsuites/@skipped)' test-results/results.xml) - ERRORS=$(xmllint --xpath 'string(/testsuites/@errors)' test-results/results.xml) - TIME=$(xmllint --xpath 'string(/testsuites/@time)' test-results/results.xml) - PASSED=$((TESTS - FAILURES - ERRORS - SKIPPED)) - FAILED=$((FAILURES + ERRORS)) - TIMESTAMP=$(date +%s000) - LOG_EVENT_JSON="[{\"timestamp\":$TIMESTAMP,\"message\":\"{\\\"application\\\":\\\"connect\\\",\\\"platform\\\":\\\"react\\\",\\\"run_type\\\":\\\"commitly\\\",\\\"execution_time\\\":$TIME,\\\"passed\\\":$PASSED,\\\"failed\\\":$FAILED,\\\"link\\\":\\\"https://github.com/corbado/javascript/actions/runs/${GITHUB_RUN_ID}\\\"}\"}]" - aws logs put-log-events --log-group-name "test-results-board" --log-stream-name "$LOG_STREAM_NAME" --log-events "$LOG_EVENT_JSON" - - - name: Aggregate results - run: | - FAILED_STEPS="" - if [ "${COMPLETE_REACT_FAILED}" = "true" ]; then - FAILED_STEPS="${FAILED_STEPS} Complete-React" - fi - if [ "${COMPLETE_WEBJS_FAILED}" = "true" ]; then - FAILED_STEPS="${FAILED_STEPS} Complete-WebJs" - fi - if [ "${COMPLETE_WEBJSSCRIPT_FAILED}" = "true" ]; then - FAILED_STEPS="${FAILED_STEPS} Complete-WebJsScript" - fi - if [ "${CONNECT_REACT_FAILED}" = "true" ]; then - FAILED_STEPS="${FAILED_STEPS} Connect-React" - fi - - if [ -n "$FAILED_STEPS" ]; then - echo "The following test steps have failed: $FAILED_STEPS" - exit 1 - else - echo "All tests passed." - fi diff --git a/.github/workflows/deploy-playgrounds.yml b/.github/workflows/deploy-playgrounds.yml new file mode 100644 index 000000000..0b4d240fa --- /dev/null +++ b/.github/workflows/deploy-playgrounds.yml @@ -0,0 +1,102 @@ +name: Deploy Playground Apps to Vercel +env: + VERCEL_TOKEN: ${{ secrets.VERCEL_TOKEN }} + VERCEL_ORG_ID: ${{ secrets.VERCEL_ORG_ID }} + BRANCH_NAME_RAW: ${{ github.head_ref || github.ref_name }} + +on: + pull_request: + push: + branches: + - develop + +jobs: + deploy: + runs-on: ubuntu-24.04 + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Set up Node.js + uses: actions/setup-node@v4 + + - name: Cache node modules + id: cache-npm + uses: actions/cache@v3 + env: + cache-name: cache-node-modules + with: + path: | + ~/.npm + ./node_modules + key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('**/package-lock.json') }}-force-1 + restore-keys: | + ${{ runner.os }}-build-${{ env.cache-name }}- + ${{ runner.os }}-build- + ${{ runner.os }}- + + - if: ${{ steps.cache-npm.outputs.cache-hit != 'true' }} + name: Install Dependencies + run: | + npm i + npm install lerna + npm install vercel@33.2.0 + npm list + + - name: Check ESLint Errors + run: npm run lint + + - name: Check Prettier Formatting + run: npm run prettier:check + + - name: Build SDKs + run: | + npm run build + npm run build:bundler:local + + - name: Normalize branch name + run: | + echo "BRANCH_NAME=$(echo $BRANCH_NAME_RAW | tr '/_' '-')" >> "$GITHUB_ENV" + shell: bash + + - name: Deploy react playground to Vercel + run: | + npx vercel link --yes --project react-playground --scope corbado -t $VERCEL_TOKEN + npx vercel pull -t $VERCEL_TOKEN + npx vercel build -t $VERCEL_TOKEN + url="$(npx vercel deploy --prebuilt -t ${{ secrets.VERCEL_TOKEN }})" + npx vercel alias -S corbado -t ${{ secrets.VERCEL_TOKEN }} "$url" $BRANCH_NAME.react.playground.corbado.io + env: + VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID_REACT_PLAYGROUND }} + + - name: Deploy connect next playground to Vercel + run: | + npx vercel link --yes --project connect-next-playground --scope corbado -t $VERCEL_TOKEN + npx vercel pull --environment=preview -t $VERCEL_TOKEN + npx vercel build -t $VERCEL_TOKEN + url="$(npx vercel deploy --prebuilt -t ${{ secrets.VERCEL_TOKEN }})" + npx vercel alias -S corbado -t ${{ secrets.VERCEL_TOKEN }} "$url" $BRANCH_NAME.connect-next.playground.corbado.io + env: + VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID_CONNECT_NEXT_PLAYGROUND }} + + - name: Deploy web-js playground to Vercel + run: | + npx vercel link --yes --project web-js-playground --scope corbado -t $VERCEL_TOKEN + npx vercel pull -t $VERCEL_TOKEN + npx vercel build -t $VERCEL_TOKEN + url="$(npx vercel deploy --prebuilt -t ${{ secrets.VERCEL_TOKEN }})" + npx vercel alias -S corbado -t ${{ secrets.VERCEL_TOKEN }} "$url" $BRANCH_NAME.web-js.playground.corbado.io + env: + VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID_WEB_JS_PLAYGROUND }} + + - name: Deploy web-js-script playground to Vercel + run: | + npx vercel link --yes --project web-js-script-playground --scope corbado -t $VERCEL_TOKEN + npx vercel pull -t $VERCEL_TOKEN + npx vercel build -t $VERCEL_TOKEN + url="$(npx vercel deploy --prebuilt -t ${{ secrets.VERCEL_TOKEN }})" + npx vercel alias -S corbado -t ${{ secrets.VERCEL_TOKEN }} "$url" $BRANCH_NAME.web-js-script.playground.corbado.io + env: + VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID_WEB_JS_SCRIPT_PLAYGROUND }} + diff --git a/.github/workflows/test-all.yml b/.github/workflows/test-all.yml index eb4ea9ea0..6440c7db3 100644 --- a/.github/workflows/test-all.yml +++ b/.github/workflows/test-all.yml @@ -20,10 +20,6 @@ jobs: - name: Set up Node.js uses: actions/setup-node@v4 - - name: Get installed Playwright version - id: playwright-version - run: echo "::set-output name=version::$(yarn why --json @playwright/test | grep -h 'workspace:.' | jq --raw-output '.children[].locator' | sed -e 's/@playwright\/test@.*://')" - - name: Cache node modules id: cache-npm uses: actions/cache@v3 @@ -32,12 +28,30 @@ jobs: with: path: | ~/.npm - key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('**/package-lock.json') }} + ./node_modules + key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('**/package-lock.json') }}-force-1 restore-keys: | ${{ runner.os }}-build-${{ env.cache-name }}- ${{ runner.os }}-build- ${{ runner.os }}- + - if: ${{ steps.cache-npm.outputs.cache-hit != 'true' }} + name: Install root dependencies + run: | + npm i + npm install lerna + npm install vercel@33.2.0 + npm list + + - name: Build SDKs + run: | + npm run build + npm run build:bundler:local + + - name: Get installed Playwright version + id: playwright-version + run: echo "::set-output name=version::$(yarn why --json @playwright/test | grep -h 'workspace:.' | jq --raw-output '.children[].locator' | sed -e 's/@playwright\/test@.*://')" + - if: ${{ steps.cache-npm.outputs.cache-hit != 'true' }} name: List the state of node modules continue-on-error: true @@ -45,7 +59,7 @@ jobs: cd packages/tests-e2e npm list - - name: Install Dependencies + - name: Install dependencies run: | cd packages/tests-e2e npm install @@ -79,16 +93,10 @@ jobs: - name: Run Complete tests for react run: | cd packages/tests-e2e - BRANCH_NAME=$(echo $BRANCH_NAME_RAW | tr '/_' '-') - export PLAYWRIGHT_TEST_URL="https://$BRANCH_NAME.react.playground.corbado.io" - set +e npx playwright test --config=playwright.config.complete.ts - EXIT_CODE=$? - if [ $EXIT_CODE -ne 0 ]; then - echo "COMPLETE_REACT_FAILED=true" >> $GITHUB_ENV - fi env: PLAYWRIGHT_NUM_CORES: 4 + PLAYWRIGHT_TEST_URL: ${{ secrets.PLAYWRIGHT_TEST_URL }} PLAYWRIGHT_JWT_TOKEN: ${{ secrets.PLAYWRIGHT_JWT_TOKEN }} PLAYWRIGHT_GOOGLE_EMAIL: ${{ secrets.PLAYWRIGHT_GOOGLE_EMAIL }} PLAYWRIGHT_GOOGLE_PASSWORD: ${{ secrets.PLAYWRIGHT_GOOGLE_PASSWORD }} @@ -125,16 +133,10 @@ jobs: - name: Run Complete tests for web-js run: | cd packages/tests-e2e - BRANCH_NAME=$(echo $BRANCH_NAME_RAW | tr '/_' '-') - export PLAYWRIGHT_TEST_URL="https://$BRANCH_NAME.web-js.playground.corbado.io" - set +e npx playwright test --config=playwright.config.complete.ts - EXIT_CODE=$? - if [ $EXIT_CODE -ne 0 ]; then - echo "COMPLETE_WEBJS_FAILED=true" >> $GITHUB_ENV - fi env: PLAYWRIGHT_NUM_CORES: 4 + PLAYWRIGHT_TEST_URL: ${{ secrets.PLAYWRIGHT_TEST_URL }} PLAYWRIGHT_JWT_TOKEN: ${{ secrets.PLAYWRIGHT_JWT_TOKEN }} PLAYWRIGHT_GOOGLE_EMAIL: ${{ secrets.PLAYWRIGHT_GOOGLE_EMAIL }} PLAYWRIGHT_GOOGLE_PASSWORD: ${{ secrets.PLAYWRIGHT_GOOGLE_PASSWORD }} @@ -171,16 +173,10 @@ jobs: - name: Run Complete tests for web-js-script run: | cd packages/tests-e2e - BRANCH_NAME=$(echo $BRANCH_NAME_RAW | tr '/_' '-') - export PLAYWRIGHT_TEST_URL="https://$BRANCH_NAME.web-js-script.playground.corbado.io" - set +e npx playwright test --config=playwright.config.complete.ts - EXIT_CODE=$? - if [ $EXIT_CODE -ne 0 ]; then - echo "COMPLETE_WEBJSSCRIPT_FAILED=true" >> $GITHUB_ENV - fi env: PLAYWRIGHT_NUM_CORES: 4 + PLAYWRIGHT_TEST_URL: ${{ secrets.PLAYWRIGHT_TEST_URL }} PLAYWRIGHT_JWT_TOKEN: ${{ secrets.PLAYWRIGHT_JWT_TOKEN }} PLAYWRIGHT_GOOGLE_EMAIL: ${{ secrets.PLAYWRIGHT_GOOGLE_EMAIL }} PLAYWRIGHT_GOOGLE_PASSWORD: ${{ secrets.PLAYWRIGHT_GOOGLE_PASSWORD }} @@ -217,22 +213,24 @@ jobs: - name: Run Connect tests for react run: | cd packages/tests-e2e - BRANCH_NAME=$(echo $BRANCH_NAME_RAW | tr '/_' '-') - export PLAYWRIGHT_TEST_URL="https://$BRANCH_NAME.connect-next.playground.corbado.io" - set +e npx playwright test --config=playwright.config.connect.ts - EXIT_CODE=$? - if [ $EXIT_CODE -ne 0 ]; then - echo "CONNECT_REACT_FAILED=true" >> $GITHUB_ENV - fi env: PLAYWRIGHT_NUM_CORES: 4 - BACKEND_API_BASIC_AUTH: ${{ secrets.BACKEND_API_BASIC_AUTH }} + PLAYWRIGHT_TEST_URL: ${{ secrets.PLAYWRIGHT_TEST_URL }} + NEXT_PUBLIC_CORBADO_PROJECT_ID: ${{ secrets.NEXT_PUBLIC_CORBADO_PROJECT_ID }} + NEXT_PUBLIC_CORBADO_FRONTEND_API_URL_SUFFIX: ${{ secrets.NEXT_PUBLIC_CORBADO_FRONTEND_API_URL_SUFFIX }} + CORBADO_BACKEND_API_URL: ${{ secrets.CORBADO_BACKEND_API_URL }} + CORBADO_BACKEND_API_BASIC_AUTH: ${{ secrets.CORBADO_BACKEND_API_BASIC_AUTH }} PLAYWRIGHT_CONNECT_PROJECT_ID: ${{ secrets.PLAYWRIGHT_CONNECT_PROJECT_ID }} PLAYWRIGHT_NGROK_AUTH_TOKEN: ${{ secrets.PLAYWRIGHT_NGROK_AUTH_TOKEN }} - GITHUB_RUN_ID: ${{ github.run_id }} - SLACK_BOT_USER_OAUTH_TOKEN: ${{ secrets.SLACK_BOT_USER_OAUTH_TOKEN }} - GITHUB_BRANCH_NAME: ${{ env.BRANCH_NAME_RAW }} + AWS_COGNITO_USER_POOL_ID: ${{ secrets.AWS_COGNITO_USER_POOL_ID }} + NEXT_PUBLIC_AWS_COGNITO_USER_POOL_ID: ${{ secrets.AWS_COGNITO_USER_POOL_ID }} + AWS_COGNITO_CLIENT_ID: ${{ secrets.AWS_COGNITO_CLIENT_ID }} + NEXT_PUBLIC_AWS_COGNITO_CLIENT_ID: ${{ secrets.NEXT_PUBLIC_AWS_COGNITO_CLIENT_ID }} + AWS_COGNITO_CLIENT_SECRET: ${{ secrets.AWS_COGNITO_CLIENT_SECRET }} + AWS_REGION: ${{ secrets.AWS_REGION }} + AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID_CONNECT_PLAYGROUND }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY_CONNECT_PLAYGROUND }} continue-on-error: true - uses: actions/upload-artifact@v4 diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 000000000..49ebba426 --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,159 @@ +name: Test on React +env: + BRANCH_NAME_RAW: ${{ github.head_ref || github.ref_name }} + +on: + pull_request: + push: + branches: + - develop + +jobs: + test: + timeout-minutes: 60 + runs-on: ubuntu-24.04 + strategy: + fail-fast: false + matrix: + include: + - testType: complete + configFile: playwright.config.complete.ts + - testType: connect + configFile: playwright.config.connect.ts + env: + PLAYWRIGHT_NUM_CORES: 4 + PLAYWRIGHT_TEST_URL: ${{ secrets.PLAYWRIGHT_TEST_URL }} + + PLAYWRIGHT_JWT_TOKEN: ${{ secrets.PLAYWRIGHT_JWT_TOKEN }} + PLAYWRIGHT_GOOGLE_EMAIL: ${{ secrets.PLAYWRIGHT_GOOGLE_EMAIL }} + PLAYWRIGHT_GOOGLE_PASSWORD: ${{ secrets.PLAYWRIGHT_GOOGLE_PASSWORD }} + PLAYWRIGHT_GOOGLE_TOTP_SECRET: ${{ secrets.PLAYWRIGHT_GOOGLE_TOTP_SECRET }} + + NEXT_PUBLIC_CORBADO_PROJECT_ID: ${{ secrets.NEXT_PUBLIC_CORBADO_PROJECT_ID }} + NEXT_PUBLIC_CORBADO_FRONTEND_API_URL_SUFFIX: ${{ secrets.NEXT_PUBLIC_CORBADO_FRONTEND_API_URL_SUFFIX }} + CORBADO_BACKEND_API_URL: ${{ secrets.CORBADO_BACKEND_API_URL }} + CORBADO_BACKEND_API_BASIC_AUTH: ${{ secrets.CORBADO_BACKEND_API_BASIC_AUTH }} + PLAYWRIGHT_CONNECT_PROJECT_ID: ${{ secrets.PLAYWRIGHT_CONNECT_PROJECT_ID }} + PLAYWRIGHT_NGROK_AUTH_TOKEN: ${{ secrets.PLAYWRIGHT_NGROK_AUTH_TOKEN }} + AWS_COGNITO_USER_POOL_ID: ${{ secrets.AWS_COGNITO_USER_POOL_ID }} + NEXT_PUBLIC_AWS_COGNITO_USER_POOL_ID: ${{ secrets.AWS_COGNITO_USER_POOL_ID }} + AWS_COGNITO_CLIENT_ID: ${{ secrets.AWS_COGNITO_CLIENT_ID }} + NEXT_PUBLIC_AWS_COGNITO_CLIENT_ID: ${{ vars.NEXT_PUBLIC_AWS_COGNITO_CLIENT_ID }} + AWS_COGNITO_CLIENT_SECRET: ${{ secrets.AWS_COGNITO_CLIENT_SECRET }} + AWS_REGION: ${{ secrets.AWS_REGION }} + AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID_CONNECT_PLAYGROUND }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY_CONNECT_PLAYGROUND }} + + GITHUB_RUN_ID: ${{ github.run_id }} + SLACK_BOT_USER_OAUTH_TOKEN: ${{ secrets.SLACK_BOT_USER_OAUTH_TOKEN }} + GITHUB_BRANCH_NAME: ${{ github.ref_name }} + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Set up Node.js + uses: actions/setup-node@v4 + + - name: Cache node modules + id: cache-npm + uses: actions/cache@v3 + env: + cache-name: cache-node-modules + with: + path: | + ~/.npm + ./node_modules + key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('**/package-lock.json') }}-force-1 + restore-keys: | + ${{ runner.os }}-build-${{ env.cache-name }}- + ${{ runner.os }}-build- + ${{ runner.os }}- + + - if: ${{ steps.cache-npm.outputs.cache-hit != 'true' }} + name: Install root dependencies + run: | + npm i + npm install lerna + npm install vercel@33.2.0 + npm list + + - name: Build SDKs + run: | + npm run build + npm run build:bundler:local + + - name: Get installed Playwright version + id: playwright-version + run: echo "::set-output name=version::$(yarn why --json @playwright/test | grep -h 'workspace:.' | jq --raw-output '.children[].locator' | sed -e 's/@playwright\/test@.*://')" + + - if: ${{ steps.cache-npm.outputs.cache-hit != 'true' }} + name: List the state of node modules + continue-on-error: true + run: | + cd packages/tests-e2e + npm list + + - name: Install dependencies + run: | + cd packages/tests-e2e + npm install + sudo apt-get update + sudo apt-get install -y libxml2-utils + + - uses: actions/cache@v3 + id: playwright-cache + with: + path: '~/.cache/ms-playwright' + key: '${{ runner.os }}-playwright-${{ steps.playwright-version.outputs.version }}' + restore-keys: | + ${{ runner.os }}-playwright- + + - name: Install Playwright's dependencies + if: steps.playwright-cache.outputs.cache-hit != 'true' + run: | + cd packages/tests-e2e + npx playwright install --with-deps + + - name: Create a log stream on AWS CloudWatch + env: + AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + AWS_REGION: ${{ secrets.AWS_REGION }} + run: | + TIMESTAMP=$(date +%s000) + RANDOM_SUFFIX=$(head /dev/urandom | tr -dc a-z0-9 | head -c 6) + LOG_STREAM_NAME="javascript-${TIMESTAMP}-${RANDOM_SUFFIX}" + echo "LOG_STREAM_NAME=$LOG_STREAM_NAME" >> $GITHUB_ENV + aws logs create-log-stream --log-group-name "test-results-board" --log-stream-name "$LOG_STREAM_NAME" + + - name: Run ${{ matrix.testType }} tests for react + working-directory: packages/tests-e2e + run: | + npx playwright test --config=${{ matrix.configFile }} + + - uses: actions/upload-artifact@v4 + if: always() + with: + name: playwright-report-${{ matrix.testType }}-react + path: packages/tests-e2e/playwright-report/ + retention-days: 30 + + - name: Send logs to AWS CloudWatch + if: always() + env: + AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + AWS_REGION: ${{ secrets.AWS_REGION }} + run: | + cd packages/tests-e2e + TESTS=$(xmllint --xpath 'string(/testsuites/@tests)' test-results/results.xml) + FAILURES=$(xmllint --xpath 'string(/testsuites/@failures)' test-results/results.xml) + SKIPPED=$(xmllint --xpath 'string(/testsuites/@skipped)' test-results/results.xml) + ERRORS=$(xmllint --xpath 'string(/testsuites/@errors)' test-results/results.xml) + TIME=$(xmllint --xpath 'string(/testsuites/@time)' test-results/results.xml) + PASSED=$((TESTS - FAILURES - ERRORS - SKIPPED)) + FAILED=$((FAILURES + ERRORS)) + TIMESTAMP=$(date +%s000) + LOG_EVENT_JSON="[{\"timestamp\":$TIMESTAMP,\"message\":\"{\\\"application\\\":\\\"${{ matrix.testType }}\\\",\\\"platform\\\":\\\"react\\\",\\\"run_type\\\":\\\"commitly\\\",\\\"execution_time\\\":$TIME,\\\"passed\\\":$PASSED,\\\"failed\\\":$FAILED,\\\"link\\\":\\\"https://github.com/corbado/javascript/actions/runs/${GITHUB_RUN_ID}\\\"}\"}]" + aws logs put-log-events --log-group-name "test-results-board" --log-stream-name "$LOG_STREAM_NAME" --log-events "$LOG_EVENT_JSON" diff --git a/package-lock.json b/package-lock.json index 51de54f94..962eeee3b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -45,7 +45,6 @@ }, "node_modules/@alloc/quick-lru": { "version": "5.2.0", - "dev": true, "license": "MIT", "engines": { "node": ">=10" @@ -87,6 +86,392 @@ "dev": true, "license": "ISC" }, + "node_modules/@aws-amplify/analytics": { + "version": "7.0.86", + "resolved": "https://registry.npmjs.org/@aws-amplify/analytics/-/analytics-7.0.86.tgz", + "integrity": "sha512-1CEaP6hA1kdBcDbXOg0MFw7Kpwu6Lt93S7r0/Oy/vu9bR3AzKPe/muT8euljmCFl/bY16zqZvY6vUW+WeA0jIw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/client-firehose": "3.621.0", + "@aws-sdk/client-kinesis": "3.621.0", + "@aws-sdk/client-personalize-events": "3.621.0", + "@smithy/util-utf8": "2.0.0", + "tslib": "^2.5.0" + }, + "peerDependencies": { + "@aws-amplify/core": "^6.1.0" + } + }, + "node_modules/@aws-amplify/analytics/node_modules/@smithy/is-array-buffer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", + "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-amplify/analytics/node_modules/@smithy/util-buffer-from": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", + "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-amplify/analytics/node_modules/@smithy/util-utf8": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.0.0.tgz", + "integrity": "sha512-rctU1VkziY84n5OXe3bPNpKR001ZCME2JCaBBFgtiM2hfKbHFudc/BkMuPab8hRbLd0j3vbnBTTZ1igBf0wgiQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-amplify/api": { + "version": "6.3.17", + "resolved": "https://registry.npmjs.org/@aws-amplify/api/-/api-6.3.17.tgz", + "integrity": "sha512-r7nmL7F8w60CAaSoOlX0YAUPCtxfHflhObe4XXGsAmXipcRi8xah/+ybGmwVLDp4J40dLir4bUaA84A/BW3doA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-amplify/api-graphql": "4.7.21", + "@aws-amplify/api-rest": "4.3.0", + "@aws-amplify/data-schema": "^1.7.0", + "rxjs": "^7.8.1", + "tslib": "^2.5.0" + }, + "peerDependencies": { + "@aws-amplify/core": "^6.1.0" + } + }, + "node_modules/@aws-amplify/api-graphql": { + "version": "4.7.21", + "resolved": "https://registry.npmjs.org/@aws-amplify/api-graphql/-/api-graphql-4.7.21.tgz", + "integrity": "sha512-rSfXtFyCJQeevDGE7TbDgH2xQKvukc+zO+Q9YinevPkGpL9zY4kl9Y5BfxKB/vPCvxR2DQTjeNu4fMlsjt9Zgw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-amplify/api-rest": "4.3.0", + "@aws-amplify/core": "6.13.1", + "@aws-amplify/data-schema": "^1.7.0", + "@aws-sdk/types": "3.387.0", + "graphql": "15.8.0", + "rxjs": "^7.8.1", + "tslib": "^2.5.0", + "uuid": "^11.0.0" + } + }, + "node_modules/@aws-amplify/api-graphql/node_modules/@aws-sdk/types": { + "version": "3.387.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.387.0.tgz", + "integrity": "sha512-YTjFabNwjTF+6yl88f0/tWff018qmmgMmjlw45s6sdVKueWxdxV68U7gepNLF2nhaQPZa6FDOBoA51NaviVs0Q==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^2.1.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-amplify/api-graphql/node_modules/@smithy/types": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.12.0.tgz", + "integrity": "sha512-QwYgloJ0sVNBeBuBs65cIkTbfzV/Q6ZNPCJ99EICFEdJYG50nGIY/uYXp+TbsdJReIuPr0a0kXmCvren3MbRRw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-amplify/api-graphql/node_modules/uuid": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", + "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/esm/bin/uuid" + } + }, + "node_modules/@aws-amplify/api-rest": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@aws-amplify/api-rest/-/api-rest-4.3.0.tgz", + "integrity": "sha512-gU8/uFOM5iwMN/FJV6UHSMij3tXQXO/cdtQsTuw5XfcwIeauAIefu5MUY6lTyJbIUny8IRbmjs8DjCUsms13Dw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.5.0" + }, + "peerDependencies": { + "@aws-amplify/core": "^6.1.0" + } + }, + "node_modules/@aws-amplify/auth": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/@aws-amplify/auth/-/auth-6.15.0.tgz", + "integrity": "sha512-VahO4aN/jxufP225bpWBfX4LCK9lram3mSNQsCSs2hJdDnEKvFdpd90cQz6XXRybyYOmkhjNeAgGp4qLwv5BHg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-js": "5.2.0", + "@smithy/types": "^3.3.0", + "tslib": "^2.5.0" + }, + "peerDependencies": { + "@aws-amplify/core": "^6.1.0" + } + }, + "node_modules/@aws-amplify/core": { + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/@aws-amplify/core/-/core-6.13.1.tgz", + "integrity": "sha512-PtSGhC7pv+xdr4Ozy6jzeZraB/kjBZiK9tOLOaBH5Trt0pBuLbh2mneE7a72xHGf64XJbl7v3MWPaVscb8KXkw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/types": "3.398.0", + "@smithy/util-hex-encoding": "2.0.0", + "@types/uuid": "^9.0.0", + "js-cookie": "^3.0.5", + "rxjs": "^7.8.1", + "tslib": "^2.5.0", + "uuid": "^11.0.0" + } + }, + "node_modules/@aws-amplify/core/node_modules/@aws-sdk/types": { + "version": "3.398.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.398.0.tgz", + "integrity": "sha512-r44fkS+vsEgKCuEuTV+TIk0t0m5ZlXHNjSDYEUvzLStbbfUFiNus/YG4UCa0wOk9R7VuQI67badsvvPeVPCGDQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-amplify/core/node_modules/@smithy/types": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.12.0.tgz", + "integrity": "sha512-QwYgloJ0sVNBeBuBs65cIkTbfzV/Q6ZNPCJ99EICFEdJYG50nGIY/uYXp+TbsdJReIuPr0a0kXmCvren3MbRRw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-amplify/core/node_modules/@smithy/util-hex-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-2.0.0.tgz", + "integrity": "sha512-c5xY+NUnFqG6d7HFh1IFfrm3mGl29lC+vF+geHv4ToiuJCBmIfzx6IeHLg+OgRdPFKDXIw6pvi+p3CsscaMcMA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-amplify/core/node_modules/uuid": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", + "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/esm/bin/uuid" + } + }, + "node_modules/@aws-amplify/data-schema": { + "version": "1.21.1", + "resolved": "https://registry.npmjs.org/@aws-amplify/data-schema/-/data-schema-1.21.1.tgz", + "integrity": "sha512-ZR7zHcjW9NKlCI39F03Ou/q//fobYNRe0w++3Ne75FU2eGGpi7MCIYEP5Hghued/PZkAuarF5dRt79aQt76V8w==", + "license": "Apache-2.0", + "dependencies": { + "@aws-amplify/data-schema-types": "*", + "@smithy/util-base64": "^3.0.0", + "@types/aws-lambda": "^8.10.134", + "@types/json-schema": "^7.0.15", + "rxjs": "^7.8.1" + } + }, + "node_modules/@aws-amplify/data-schema-types": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@aws-amplify/data-schema-types/-/data-schema-types-1.2.0.tgz", + "integrity": "sha512-1hy2r7jl3hQ5J/CGjhmPhFPcdGSakfme1ZLjlTMJZILfYifZLSlGRKNCelMb3J5N9203hyeT5XDi5yR47JL1TQ==", + "license": "Apache-2.0", + "dependencies": { + "graphql": "15.8.0", + "rxjs": "^7.8.1" + } + }, + "node_modules/@aws-amplify/datastore": { + "version": "5.0.88", + "resolved": "https://registry.npmjs.org/@aws-amplify/datastore/-/datastore-5.0.88.tgz", + "integrity": "sha512-kpmat3af05QBe488pv3Zo07iFVZjA9SkIa3ZJTb8OQYZw+iV717G94fnHnpGrt7+RyyMkxLsxN8NKbEsta9Xcg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-amplify/api": "6.3.17", + "@aws-amplify/api-graphql": "4.7.21", + "buffer": "4.9.2", + "idb": "5.0.6", + "immer": "9.0.6", + "rxjs": "^7.8.1", + "ulid": "^2.3.0" + }, + "peerDependencies": { + "@aws-amplify/core": "^6.1.0" + } + }, + "node_modules/@aws-amplify/datastore/node_modules/buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "license": "MIT", + "dependencies": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "node_modules/@aws-amplify/datastore/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" + }, + "node_modules/@aws-amplify/notifications": { + "version": "2.0.86", + "resolved": "https://registry.npmjs.org/@aws-amplify/notifications/-/notifications-2.0.86.tgz", + "integrity": "sha512-OEf1JGSC8r8EtqORRgpE6aG67TjhV5sWyEM/DakXu8ZqYgErqfrSxiVjLsutIz8LJA4tvjGUFgLheZ3IjEtE8Q==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.398.0", + "lodash": "^4.17.21", + "tslib": "^2.5.0" + }, + "peerDependencies": { + "@aws-amplify/core": "^6.1.0" + } + }, + "node_modules/@aws-amplify/notifications/node_modules/@aws-sdk/types": { + "version": "3.398.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.398.0.tgz", + "integrity": "sha512-r44fkS+vsEgKCuEuTV+TIk0t0m5ZlXHNjSDYEUvzLStbbfUFiNus/YG4UCa0wOk9R7VuQI67badsvvPeVPCGDQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-amplify/notifications/node_modules/@smithy/types": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.12.0.tgz", + "integrity": "sha512-QwYgloJ0sVNBeBuBs65cIkTbfzV/Q6ZNPCJ99EICFEdJYG50nGIY/uYXp+TbsdJReIuPr0a0kXmCvren3MbRRw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-amplify/storage": { + "version": "6.9.5", + "resolved": "https://registry.npmjs.org/@aws-amplify/storage/-/storage-6.9.5.tgz", + "integrity": "sha512-wUKg/gffDRdJ3P08HQ7HTTfmB8+WBS8lPxXAzMk67LD4yaFNfIrzQCExTO5uz6at1rmZeN4eHvQicxcwCR9m1Q==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.398.0", + "@smithy/md5-js": "2.0.7", + "buffer": "4.9.2", + "crc-32": "1.2.2", + "fast-xml-parser": "^4.4.1", + "tslib": "^2.5.0" + }, + "peerDependencies": { + "@aws-amplify/core": "^6.1.0" + } + }, + "node_modules/@aws-amplify/storage/node_modules/@aws-sdk/types": { + "version": "3.398.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.398.0.tgz", + "integrity": "sha512-r44fkS+vsEgKCuEuTV+TIk0t0m5ZlXHNjSDYEUvzLStbbfUFiNus/YG4UCa0wOk9R7VuQI67badsvvPeVPCGDQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^2.2.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-amplify/storage/node_modules/@smithy/types": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.12.0.tgz", + "integrity": "sha512-QwYgloJ0sVNBeBuBs65cIkTbfzV/Q6ZNPCJ99EICFEdJYG50nGIY/uYXp+TbsdJReIuPr0a0kXmCvren3MbRRw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-amplify/storage/node_modules/buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "license": "MIT", + "dependencies": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "node_modules/@aws-amplify/storage/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" + }, + "node_modules/@aws-crypto/crc32": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-5.2.0.tgz", + "integrity": "sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, "node_modules/@aws-crypto/sha256-browser": { "version": "5.2.0", "license": "Apache-2.0", @@ -243,85 +628,5294 @@ } }, "node_modules/@aws-sdk/client-cognito-identity-provider": { - "version": "3.600.0", + "version": "3.862.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity-provider/-/client-cognito-identity-provider-3.862.0.tgz", + "integrity": "sha512-3CPtrAU9XJQ52byeqj99PwAcgOTkw84kH+FwG1V8Jb4/xqRgJg2Lkg1lZ9u29xAB6dcfsMQWy4dOo4ztsT6JOA==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.600.0", - "@aws-sdk/client-sts": "3.600.0", - "@aws-sdk/core": "3.598.0", - "@aws-sdk/credential-provider-node": "3.600.0", - "@aws-sdk/middleware-host-header": "3.598.0", - "@aws-sdk/middleware-logger": "3.598.0", - "@aws-sdk/middleware-recursion-detection": "3.598.0", - "@aws-sdk/middleware-user-agent": "3.598.0", - "@aws-sdk/region-config-resolver": "3.598.0", - "@aws-sdk/types": "3.598.0", - "@aws-sdk/util-endpoints": "3.598.0", - "@aws-sdk/util-user-agent-browser": "3.598.0", - "@aws-sdk/util-user-agent-node": "3.598.0", - "@smithy/config-resolver": "^3.0.2", - "@smithy/core": "^2.2.1", - "@smithy/fetch-http-handler": "^3.0.2", - "@smithy/hash-node": "^3.0.1", - "@smithy/invalid-dependency": "^3.0.1", - "@smithy/middleware-content-length": "^3.0.1", - "@smithy/middleware-endpoint": "^3.0.2", - "@smithy/middleware-retry": "^3.0.4", - "@smithy/middleware-serde": "^3.0.1", - "@smithy/middleware-stack": "^3.0.1", - "@smithy/node-config-provider": "^3.1.1", - "@smithy/node-http-handler": "^3.0.1", - "@smithy/protocol-http": "^4.0.1", - "@smithy/smithy-client": "^3.1.2", - "@smithy/types": "^3.1.0", - "@smithy/url-parser": "^3.0.1", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.4", - "@smithy/util-defaults-mode-node": "^3.0.4", - "@smithy/util-endpoints": "^2.0.2", - "@smithy/util-middleware": "^3.0.1", - "@smithy/util-retry": "^3.0.1", - "@smithy/util-utf8": "^3.0.0", + "@aws-sdk/core": "3.862.0", + "@aws-sdk/credential-provider-node": "3.862.0", + "@aws-sdk/middleware-host-header": "3.862.0", + "@aws-sdk/middleware-logger": "3.862.0", + "@aws-sdk/middleware-recursion-detection": "3.862.0", + "@aws-sdk/middleware-user-agent": "3.862.0", + "@aws-sdk/region-config-resolver": "3.862.0", + "@aws-sdk/types": "3.862.0", + "@aws-sdk/util-endpoints": "3.862.0", + "@aws-sdk/util-user-agent-browser": "3.862.0", + "@aws-sdk/util-user-agent-node": "3.862.0", + "@smithy/config-resolver": "^4.1.5", + "@smithy/core": "^3.8.0", + "@smithy/fetch-http-handler": "^5.1.1", + "@smithy/hash-node": "^4.0.5", + "@smithy/invalid-dependency": "^4.0.5", + "@smithy/middleware-content-length": "^4.0.5", + "@smithy/middleware-endpoint": "^4.1.18", + "@smithy/middleware-retry": "^4.1.19", + "@smithy/middleware-serde": "^4.0.9", + "@smithy/middleware-stack": "^4.0.5", + "@smithy/node-config-provider": "^4.1.4", + "@smithy/node-http-handler": "^4.1.1", + "@smithy/protocol-http": "^5.1.3", + "@smithy/smithy-client": "^4.4.10", + "@smithy/types": "^4.3.2", + "@smithy/url-parser": "^4.0.5", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-body-length-browser": "^4.0.0", + "@smithy/util-body-length-node": "^4.0.0", + "@smithy/util-defaults-mode-browser": "^4.0.26", + "@smithy/util-defaults-mode-node": "^4.0.26", + "@smithy/util-endpoints": "^3.0.7", + "@smithy/util-middleware": "^4.0.5", + "@smithy/util-retry": "^4.0.7", + "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/client-sso": { - "version": "3.624.0", + "node_modules/@aws-sdk/client-cognito-identity-provider/node_modules/@smithy/abort-controller": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.5.tgz", + "integrity": "sha512-jcrqdTQurIrBbUm4W2YdLVMQDoL0sA9DTxYd2s+R/y+2U9NLOP7Xf/YqfSg1FZhlZIYEnvk2mwbyvIfdLEPo8g==", "license": "Apache-2.0", "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.624.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.620.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.614.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.3.2", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.14", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.1.12", + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity-provider/node_modules/@smithy/config-resolver": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.1.5.tgz", + "integrity": "sha512-viuHMxBAqydkB0AfWwHIdwf/PRH2z5KHGUzqyRtS/Wv+n3IHI993Sk76VCA7dD/+GzgGOmlJDITfPcJC1nIVIw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.1.4", + "@smithy/types": "^4.3.2", + "@smithy/util-config-provider": "^4.0.0", + "@smithy/util-middleware": "^4.0.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity-provider/node_modules/@smithy/core": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.8.0.tgz", + "integrity": "sha512-EYqsIYJmkR1VhVE9pccnk353xhs+lB6btdutJEtsp7R055haMJp2yE16eSxw8fv+G0WUY6vqxyYOP8kOqawxYQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/middleware-serde": "^4.0.9", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-body-length-browser": "^4.0.0", + "@smithy/util-middleware": "^4.0.5", + "@smithy/util-stream": "^4.2.4", + "@smithy/util-utf8": "^4.0.0", + "@types/uuid": "^9.0.1", + "tslib": "^2.6.2", + "uuid": "^9.0.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity-provider/node_modules/@smithy/credential-provider-imds": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.0.7.tgz", + "integrity": "sha512-dDzrMXA8d8riFNiPvytxn0mNwR4B3h8lgrQ5UjAGu6T9z/kRg/Xncf4tEQHE/+t25sY8IH3CowcmWi+1U5B1Gw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.1.4", + "@smithy/property-provider": "^4.0.5", + "@smithy/types": "^4.3.2", + "@smithy/url-parser": "^4.0.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity-provider/node_modules/@smithy/fetch-http-handler": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.1.1.tgz", + "integrity": "sha512-61WjM0PWmZJR+SnmzaKI7t7G0UkkNFboDpzIdzSoy7TByUzlxo18Qlh9s71qug4AY4hlH/CwXdubMtkcNEb/sQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^5.1.3", + "@smithy/querystring-builder": "^4.0.5", + "@smithy/types": "^4.3.2", + "@smithy/util-base64": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity-provider/node_modules/@smithy/hash-node": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.0.5.tgz", + "integrity": "sha512-cv1HHkKhpyRb6ahD8Vcfb2Hgz67vNIXEp2vnhzfxLFGRukLCNEA5QdsorbUEzXma1Rco0u3rx5VTqbM06GcZqQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.3.2", + "@smithy/util-buffer-from": "^4.0.0", + "@smithy/util-utf8": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity-provider/node_modules/@smithy/invalid-dependency": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.0.5.tgz", + "integrity": "sha512-IVnb78Qtf7EJpoEVo7qJ8BEXQwgC4n3igeJNNKEj/MLYtapnx8A67Zt/J3RXAj2xSO1910zk0LdFiygSemuLow==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity-provider/node_modules/@smithy/is-array-buffer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.0.0.tgz", + "integrity": "sha512-saYhF8ZZNoJDTvJBEWgeBccCg+yvp1CX+ed12yORU3NilJScfc6gfch2oVb4QgxZrGUx3/ZJlb+c/dJbyupxlw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity-provider/node_modules/@smithy/middleware-content-length": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.0.5.tgz", + "integrity": "sha512-l1jlNZoYzoCC7p0zCtBDE5OBXZ95yMKlRlftooE5jPWQn4YBPLgsp+oeHp7iMHaTGoUdFqmHOPa8c9G3gBsRpQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity-provider/node_modules/@smithy/middleware-endpoint": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.1.18.tgz", + "integrity": "sha512-ZhvqcVRPZxnZlokcPaTwb+r+h4yOIOCJmx0v2d1bpVlmP465g3qpVSf7wxcq5zZdu4jb0H4yIMxuPwDJSQc3MQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^3.8.0", + "@smithy/middleware-serde": "^4.0.9", + "@smithy/node-config-provider": "^4.1.4", + "@smithy/shared-ini-file-loader": "^4.0.5", + "@smithy/types": "^4.3.2", + "@smithy/url-parser": "^4.0.5", + "@smithy/util-middleware": "^4.0.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity-provider/node_modules/@smithy/middleware-retry": { + "version": "4.1.19", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.1.19.tgz", + "integrity": "sha512-X58zx/NVECjeuUB6A8HBu4bhx72EoUz+T5jTMIyeNKx2lf+Gs9TmWPNNkH+5QF0COjpInP/xSpJGJ7xEnAklQQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.1.4", + "@smithy/protocol-http": "^5.1.3", + "@smithy/service-error-classification": "^4.0.7", + "@smithy/smithy-client": "^4.4.10", + "@smithy/types": "^4.3.2", + "@smithy/util-middleware": "^4.0.5", + "@smithy/util-retry": "^4.0.7", + "@types/uuid": "^9.0.1", + "tslib": "^2.6.2", + "uuid": "^9.0.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity-provider/node_modules/@smithy/middleware-serde": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.0.9.tgz", + "integrity": "sha512-uAFFR4dpeoJPGz8x9mhxp+RPjo5wW0QEEIPPPbLXiRRWeCATf/Km3gKIVR5vaP8bN1kgsPhcEeh+IZvUlBv6Xg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity-provider/node_modules/@smithy/middleware-stack": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.0.5.tgz", + "integrity": "sha512-/yoHDXZPh3ocRVyeWQFvC44u8seu3eYzZRveCMfgMOBcNKnAmOvjbL9+Cp5XKSIi9iYA9PECUuW2teDAk8T+OQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity-provider/node_modules/@smithy/node-config-provider": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.4.tgz", + "integrity": "sha512-+UDQV/k42jLEPPHSn39l0Bmc4sB1xtdI9Gd47fzo/0PbXzJ7ylgaOByVjF5EeQIumkepnrJyfx86dPa9p47Y+w==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/property-provider": "^4.0.5", + "@smithy/shared-ini-file-loader": "^4.0.5", + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity-provider/node_modules/@smithy/node-http-handler": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.1.1.tgz", + "integrity": "sha512-RHnlHqFpoVdjSPPiYy/t40Zovf3BBHc2oemgD7VsVTFFZrU5erFFe0n52OANZZ/5sbshgD93sOh5r6I35Xmpaw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/abort-controller": "^4.0.5", + "@smithy/protocol-http": "^5.1.3", + "@smithy/querystring-builder": "^4.0.5", + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity-provider/node_modules/@smithy/property-provider": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.5.tgz", + "integrity": "sha512-R/bswf59T/n9ZgfgUICAZoWYKBHcsVDurAGX88zsiUtOTA/xUAPyiT+qkNCPwFn43pZqN84M4MiUsbSGQmgFIQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity-provider/node_modules/@smithy/protocol-http": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.3.tgz", + "integrity": "sha512-fCJd2ZR7D22XhDY0l+92pUag/7je2BztPRQ01gU5bMChcyI0rlly7QFibnYHzcxDvccMjlpM/Q1ev8ceRIb48w==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity-provider/node_modules/@smithy/querystring-builder": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.5.tgz", + "integrity": "sha512-NJeSCU57piZ56c+/wY+AbAw6rxCCAOZLCIniRE7wqvndqxcKKDOXzwWjrY7wGKEISfhL9gBbAaWWgHsUGedk+A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.3.2", + "@smithy/util-uri-escape": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity-provider/node_modules/@smithy/querystring-parser": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.0.5.tgz", + "integrity": "sha512-6SV7md2CzNG/WUeTjVe6Dj8noH32r4MnUeFKZrnVYsQxpGSIcphAanQMayi8jJLZAWm6pdM9ZXvKCpWOsIGg0w==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity-provider/node_modules/@smithy/service-error-classification": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.0.7.tgz", + "integrity": "sha512-XvRHOipqpwNhEjDf2L5gJowZEm5nsxC16pAZOeEcsygdjv9A2jdOh3YoDQvOXBGTsaJk6mNWtzWalOB9976Wlg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.3.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity-provider/node_modules/@smithy/shared-ini-file-loader": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.5.tgz", + "integrity": "sha512-YVVwehRDuehgoXdEL4r1tAAzdaDgaC9EQvhK0lEbfnbrd0bd5+CTQumbdPryX3J2shT7ZqQE+jPW4lmNBAB8JQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity-provider/node_modules/@smithy/smithy-client": { + "version": "4.4.10", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.4.10.tgz", + "integrity": "sha512-iW6HjXqN0oPtRS0NK/zzZ4zZeGESIFcxj2FkWed3mcK8jdSdHzvnCKXSjvewESKAgGKAbJRA+OsaqKhkdYRbQQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^3.8.0", + "@smithy/middleware-endpoint": "^4.1.18", + "@smithy/middleware-stack": "^4.0.5", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", + "@smithy/util-stream": "^4.2.4", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity-provider/node_modules/@smithy/types": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity-provider/node_modules/@smithy/url-parser": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.0.5.tgz", + "integrity": "sha512-j+733Um7f1/DXjYhCbvNXABV53NyCRRA54C7bNEIxNPs0YjfRxeMKjjgm2jvTYrciZyCjsicHwQ6Q0ylo+NAUw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/querystring-parser": "^4.0.5", + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity-provider/node_modules/@smithy/util-base64": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.0.0.tgz", + "integrity": "sha512-CvHfCmO2mchox9kjrtzoHkWHxjHZzaFojLc8quxXY7WAAMAg43nuxwv95tATVgQFNDwd4M9S1qFzj40Ul41Kmg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^4.0.0", + "@smithy/util-utf8": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity-provider/node_modules/@smithy/util-body-length-browser": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.0.0.tgz", + "integrity": "sha512-sNi3DL0/k64/LO3A256M+m3CDdG6V7WKWHdAiBBMUN8S3hK3aMPhwnPik2A/a2ONN+9doY9UxaLfgqsIRg69QA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity-provider/node_modules/@smithy/util-body-length-node": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.0.0.tgz", + "integrity": "sha512-q0iDP3VsZzqJyje8xJWEJCNIu3lktUGVoSy1KB0UWym2CL1siV3artm+u1DFYTLejpsrdGyCSWBdGNjJzfDPjg==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity-provider/node_modules/@smithy/util-buffer-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.0.0.tgz", + "integrity": "sha512-9TOQ7781sZvddgO8nxueKi3+yGvkY35kotA0Y6BWRajAv8jjmigQ1sBwz0UX47pQMYXJPahSKEKYFgt+rXdcug==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity-provider/node_modules/@smithy/util-config-provider": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.0.0.tgz", + "integrity": "sha512-L1RBVzLyfE8OXH+1hsJ8p+acNUSirQnWQ6/EgpchV88G6zGBTDPdXiiExei6Z1wR2RxYvxY/XLw6AMNCCt8H3w==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity-provider/node_modules/@smithy/util-defaults-mode-browser": { + "version": "4.0.26", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.0.26.tgz", + "integrity": "sha512-xgl75aHIS/3rrGp7iTxQAOELYeyiwBu+eEgAk4xfKwJJ0L8VUjhO2shsDpeil54BOFsqmk5xfdesiewbUY5tKQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/property-provider": "^4.0.5", + "@smithy/smithy-client": "^4.4.10", + "@smithy/types": "^4.3.2", + "bowser": "^2.11.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity-provider/node_modules/@smithy/util-defaults-mode-node": { + "version": "4.0.26", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.0.26.tgz", + "integrity": "sha512-z81yyIkGiLLYVDetKTUeCZQ8x20EEzvQjrqJtb/mXnevLq2+w3XCEWTJ2pMp401b6BkEkHVfXb/cROBpVauLMQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/config-resolver": "^4.1.5", + "@smithy/credential-provider-imds": "^4.0.7", + "@smithy/node-config-provider": "^4.1.4", + "@smithy/property-provider": "^4.0.5", + "@smithy/smithy-client": "^4.4.10", + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity-provider/node_modules/@smithy/util-endpoints": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.0.7.tgz", + "integrity": "sha512-klGBP+RpBp6V5JbrY2C/VKnHXn3d5V2YrifZbmMY8os7M6m8wdYFoO6w/fe5VkP+YVwrEktW3IWYaSQVNZJ8oQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.1.4", + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity-provider/node_modules/@smithy/util-hex-encoding": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.0.0.tgz", + "integrity": "sha512-Yk5mLhHtfIgW2W2WQZWSg5kuMZCVbvhFmC7rV4IO2QqnZdbEFPmQnCcGMAX2z/8Qj3B9hYYNjZOhWym+RwhePw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity-provider/node_modules/@smithy/util-middleware": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.5.tgz", + "integrity": "sha512-N40PfqsZHRSsByGB81HhSo+uvMxEHT+9e255S53pfBw/wI6WKDI7Jw9oyu5tJTLwZzV5DsMha3ji8jk9dsHmQQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity-provider/node_modules/@smithy/util-retry": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.0.7.tgz", + "integrity": "sha512-TTO6rt0ppK70alZpkjwy+3nQlTiqNfoXja+qwuAchIEAIoSZW8Qyd76dvBv3I5bCpE38APafG23Y/u270NspiQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/service-error-classification": "^4.0.7", + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity-provider/node_modules/@smithy/util-stream": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.2.4.tgz", + "integrity": "sha512-vSKnvNZX2BXzl0U2RgCLOwWaAP9x/ddd/XobPK02pCbzRm5s55M53uwb1rl/Ts7RXZvdJZerPkA+en2FDghLuQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/fetch-http-handler": "^5.1.1", + "@smithy/node-http-handler": "^4.1.1", + "@smithy/types": "^4.3.2", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-buffer-from": "^4.0.0", + "@smithy/util-hex-encoding": "^4.0.0", + "@smithy/util-utf8": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity-provider/node_modules/@smithy/util-uri-escape": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.0.0.tgz", + "integrity": "sha512-77yfbCbQMtgtTylO9itEAdpPXSog3ZxMe09AEhm0dU0NLTalV70ghDZFR+Nfi1C60jnJoh/Re4090/DuZh2Omg==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity-provider/node_modules/@smithy/util-utf8": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.0.0.tgz", + "integrity": "sha512-b+zebfKCfRdgNJDknHCob3O7FpeYQN6ZG6YLExMcasDHsCXlsXCEuiPZeLnJLpwa5dvPetGlnGCiMHuLwGvFow==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/client-sso": { + "version": "3.624.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.624.0", + "@aws-sdk/middleware-host-header": "3.620.0", + "@aws-sdk/middleware-logger": "3.609.0", + "@aws-sdk/middleware-recursion-detection": "3.620.0", + "@aws-sdk/middleware-user-agent": "3.620.0", + "@aws-sdk/region-config-resolver": "3.614.0", + "@aws-sdk/types": "3.609.0", + "@aws-sdk/util-endpoints": "3.614.0", + "@aws-sdk/util-user-agent-browser": "3.609.0", + "@aws-sdk/util-user-agent-node": "3.614.0", + "@smithy/config-resolver": "^3.0.5", + "@smithy/core": "^2.3.2", + "@smithy/fetch-http-handler": "^3.2.4", + "@smithy/hash-node": "^3.0.3", + "@smithy/invalid-dependency": "^3.0.3", + "@smithy/middleware-content-length": "^3.0.5", + "@smithy/middleware-endpoint": "^3.1.0", + "@smithy/middleware-retry": "^3.0.14", + "@smithy/middleware-serde": "^3.0.3", + "@smithy/middleware-stack": "^3.0.3", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/node-http-handler": "^3.1.4", + "@smithy/protocol-http": "^4.1.0", + "@smithy/smithy-client": "^3.1.12", + "@smithy/types": "^3.3.0", + "@smithy/url-parser": "^3.0.3", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-body-length-node": "^3.0.0", + "@smithy/util-defaults-mode-browser": "^3.0.14", + "@smithy/util-defaults-mode-node": "^3.0.14", + "@smithy/util-endpoints": "^2.0.5", + "@smithy/util-middleware": "^3.0.3", + "@smithy/util-retry": "^3.0.3", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/client-sso-oidc": { + "version": "3.624.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.624.0", + "@aws-sdk/credential-provider-node": "3.624.0", + "@aws-sdk/middleware-host-header": "3.620.0", + "@aws-sdk/middleware-logger": "3.609.0", + "@aws-sdk/middleware-recursion-detection": "3.620.0", + "@aws-sdk/middleware-user-agent": "3.620.0", + "@aws-sdk/region-config-resolver": "3.614.0", + "@aws-sdk/types": "3.609.0", + "@aws-sdk/util-endpoints": "3.614.0", + "@aws-sdk/util-user-agent-browser": "3.609.0", + "@aws-sdk/util-user-agent-node": "3.614.0", + "@smithy/config-resolver": "^3.0.5", + "@smithy/core": "^2.3.2", + "@smithy/fetch-http-handler": "^3.2.4", + "@smithy/hash-node": "^3.0.3", + "@smithy/invalid-dependency": "^3.0.3", + "@smithy/middleware-content-length": "^3.0.5", + "@smithy/middleware-endpoint": "^3.1.0", + "@smithy/middleware-retry": "^3.0.14", + "@smithy/middleware-serde": "^3.0.3", + "@smithy/middleware-stack": "^3.0.3", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/node-http-handler": "^3.1.4", + "@smithy/protocol-http": "^4.1.0", + "@smithy/smithy-client": "^3.1.12", + "@smithy/types": "^3.3.0", + "@smithy/url-parser": "^3.0.3", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-body-length-node": "^3.0.0", + "@smithy/util-defaults-mode-browser": "^3.0.14", + "@smithy/util-defaults-mode-node": "^3.0.14", + "@smithy/util-endpoints": "^2.0.5", + "@smithy/util-middleware": "^3.0.3", + "@smithy/util-retry": "^3.0.3", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sts": "^3.624.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/client-sts": { + "version": "3.624.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/client-sso-oidc": "3.624.0", + "@aws-sdk/core": "3.624.0", + "@aws-sdk/credential-provider-node": "3.624.0", + "@aws-sdk/middleware-host-header": "3.620.0", + "@aws-sdk/middleware-logger": "3.609.0", + "@aws-sdk/middleware-recursion-detection": "3.620.0", + "@aws-sdk/middleware-user-agent": "3.620.0", + "@aws-sdk/region-config-resolver": "3.614.0", + "@aws-sdk/types": "3.609.0", + "@aws-sdk/util-endpoints": "3.614.0", + "@aws-sdk/util-user-agent-browser": "3.609.0", + "@aws-sdk/util-user-agent-node": "3.614.0", + "@smithy/config-resolver": "^3.0.5", + "@smithy/core": "^2.3.2", + "@smithy/fetch-http-handler": "^3.2.4", + "@smithy/hash-node": "^3.0.3", + "@smithy/invalid-dependency": "^3.0.3", + "@smithy/middleware-content-length": "^3.0.5", + "@smithy/middleware-endpoint": "^3.1.0", + "@smithy/middleware-retry": "^3.0.14", + "@smithy/middleware-serde": "^3.0.3", + "@smithy/middleware-stack": "^3.0.3", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/node-http-handler": "^3.1.4", + "@smithy/protocol-http": "^4.1.0", + "@smithy/smithy-client": "^3.1.12", + "@smithy/types": "^3.3.0", + "@smithy/url-parser": "^3.0.3", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-body-length-node": "^3.0.0", + "@smithy/util-defaults-mode-browser": "^3.0.14", + "@smithy/util-defaults-mode-node": "^3.0.14", + "@smithy/util-endpoints": "^2.0.5", + "@smithy/util-middleware": "^3.0.3", + "@smithy/util-retry": "^3.0.3", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/core": { + "version": "3.624.0", + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^2.3.2", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/protocol-http": "^4.1.0", + "@smithy/signature-v4": "^4.1.0", + "@smithy/smithy-client": "^3.1.12", + "@smithy/types": "^3.3.0", + "@smithy/util-middleware": "^3.0.3", + "fast-xml-parser": "4.4.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/credential-provider-env": { + "version": "3.620.1", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/credential-provider-http": { + "version": "3.622.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/fetch-http-handler": "^3.2.4", + "@smithy/node-http-handler": "^3.1.4", + "@smithy/property-provider": "^3.1.3", + "@smithy/protocol-http": "^4.1.0", + "@smithy/smithy-client": "^3.1.12", + "@smithy/types": "^3.3.0", + "@smithy/util-stream": "^3.1.3", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.624.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.620.1", + "@aws-sdk/credential-provider-http": "3.622.0", + "@aws-sdk/credential-provider-process": "3.620.1", + "@aws-sdk/credential-provider-sso": "3.624.0", + "@aws-sdk/credential-provider-web-identity": "3.621.0", + "@aws-sdk/types": "3.609.0", + "@smithy/credential-provider-imds": "^3.2.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sts": "^3.624.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/credential-provider-node": { + "version": "3.624.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.620.1", + "@aws-sdk/credential-provider-http": "3.622.0", + "@aws-sdk/credential-provider-ini": "3.624.0", + "@aws-sdk/credential-provider-process": "3.620.1", + "@aws-sdk/credential-provider-sso": "3.624.0", + "@aws-sdk/credential-provider-web-identity": "3.621.0", + "@aws-sdk/types": "3.609.0", + "@smithy/credential-provider-imds": "^3.2.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/credential-provider-process": { + "version": "3.620.1", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.624.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/client-sso": "3.624.0", + "@aws-sdk/token-providers": "3.614.0", + "@aws-sdk/types": "3.609.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.621.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sts": "^3.621.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/middleware-host-header": { + "version": "3.620.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/protocol-http": "^4.1.0", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/middleware-logger": { + "version": "3.609.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.620.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/protocol-http": "^4.1.0", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.620.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@aws-sdk/util-endpoints": "3.614.0", + "@smithy/protocol-http": "^4.1.0", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/region-config-resolver": { + "version": "3.614.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/types": "^3.3.0", + "@smithy/util-config-provider": "^3.0.0", + "@smithy/util-middleware": "^3.0.3", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/token-providers": { + "version": "3.614.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sso-oidc": "^3.614.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/types": { + "version": "3.609.0", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/util-endpoints": { + "version": "3.614.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/types": "^3.3.0", + "@smithy/util-endpoints": "^2.0.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.609.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/types": "^3.3.0", + "bowser": "^2.11.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.614.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/signature-v4": { + "version": "4.1.0", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^3.0.0", + "@smithy/protocol-http": "^4.1.0", + "@smithy/types": "^3.3.0", + "@smithy/util-hex-encoding": "^3.0.0", + "@smithy/util-middleware": "^3.0.3", + "@smithy/util-uri-escape": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-firehose": { + "version": "3.621.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-firehose/-/client-firehose-3.621.0.tgz", + "integrity": "sha512-XAjAkXdb35PDvBYph609Fxn4g00HYH/U6N4+KjF9gLQrdTU+wkjf3D9YD02DZNbApJVcu4eIxWh/8M25YkW02A==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/client-sso-oidc": "3.621.0", + "@aws-sdk/client-sts": "3.621.0", + "@aws-sdk/core": "3.621.0", + "@aws-sdk/credential-provider-node": "3.621.0", + "@aws-sdk/middleware-host-header": "3.620.0", + "@aws-sdk/middleware-logger": "3.609.0", + "@aws-sdk/middleware-recursion-detection": "3.620.0", + "@aws-sdk/middleware-user-agent": "3.620.0", + "@aws-sdk/region-config-resolver": "3.614.0", + "@aws-sdk/types": "3.609.0", + "@aws-sdk/util-endpoints": "3.614.0", + "@aws-sdk/util-user-agent-browser": "3.609.0", + "@aws-sdk/util-user-agent-node": "3.614.0", + "@smithy/config-resolver": "^3.0.5", + "@smithy/core": "^2.3.1", + "@smithy/fetch-http-handler": "^3.2.4", + "@smithy/hash-node": "^3.0.3", + "@smithy/invalid-dependency": "^3.0.3", + "@smithy/middleware-content-length": "^3.0.5", + "@smithy/middleware-endpoint": "^3.1.0", + "@smithy/middleware-retry": "^3.0.13", + "@smithy/middleware-serde": "^3.0.3", + "@smithy/middleware-stack": "^3.0.3", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/node-http-handler": "^3.1.4", + "@smithy/protocol-http": "^4.1.0", + "@smithy/smithy-client": "^3.1.11", + "@smithy/types": "^3.3.0", + "@smithy/url-parser": "^3.0.3", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-body-length-node": "^3.0.0", + "@smithy/util-defaults-mode-browser": "^3.0.13", + "@smithy/util-defaults-mode-node": "^3.0.13", + "@smithy/util-endpoints": "^2.0.5", + "@smithy/util-middleware": "^3.0.3", + "@smithy/util-retry": "^3.0.3", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-firehose/node_modules/@aws-sdk/client-sso": { + "version": "3.621.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.621.0.tgz", + "integrity": "sha512-xpKfikN4u0BaUYZA9FGUMkkDmfoIP0Q03+A86WjqDWhcOoqNA1DkHsE4kZ+r064ifkPUfcNuUvlkVTEoBZoFjA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.621.0", + "@aws-sdk/middleware-host-header": "3.620.0", + "@aws-sdk/middleware-logger": "3.609.0", + "@aws-sdk/middleware-recursion-detection": "3.620.0", + "@aws-sdk/middleware-user-agent": "3.620.0", + "@aws-sdk/region-config-resolver": "3.614.0", + "@aws-sdk/types": "3.609.0", + "@aws-sdk/util-endpoints": "3.614.0", + "@aws-sdk/util-user-agent-browser": "3.609.0", + "@aws-sdk/util-user-agent-node": "3.614.0", + "@smithy/config-resolver": "^3.0.5", + "@smithy/core": "^2.3.1", + "@smithy/fetch-http-handler": "^3.2.4", + "@smithy/hash-node": "^3.0.3", + "@smithy/invalid-dependency": "^3.0.3", + "@smithy/middleware-content-length": "^3.0.5", + "@smithy/middleware-endpoint": "^3.1.0", + "@smithy/middleware-retry": "^3.0.13", + "@smithy/middleware-serde": "^3.0.3", + "@smithy/middleware-stack": "^3.0.3", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/node-http-handler": "^3.1.4", + "@smithy/protocol-http": "^4.1.0", + "@smithy/smithy-client": "^3.1.11", + "@smithy/types": "^3.3.0", + "@smithy/url-parser": "^3.0.3", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-body-length-node": "^3.0.0", + "@smithy/util-defaults-mode-browser": "^3.0.13", + "@smithy/util-defaults-mode-node": "^3.0.13", + "@smithy/util-endpoints": "^2.0.5", + "@smithy/util-middleware": "^3.0.3", + "@smithy/util-retry": "^3.0.3", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-firehose/node_modules/@aws-sdk/core": { + "version": "3.621.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.621.0.tgz", + "integrity": "sha512-CtOwWmDdEiINkGXD93iGfXjN0WmCp9l45cDWHHGa8lRgEDyhuL7bwd/pH5aSzj0j8SiQBG2k0S7DHbd5RaqvbQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^2.3.1", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/protocol-http": "^4.1.0", + "@smithy/signature-v4": "^4.1.0", + "@smithy/smithy-client": "^3.1.11", + "@smithy/types": "^3.3.0", + "@smithy/util-middleware": "^3.0.3", + "fast-xml-parser": "4.4.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-firehose/node_modules/@aws-sdk/credential-provider-env": { + "version": "3.620.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.620.1.tgz", + "integrity": "sha512-ExuILJ2qLW5ZO+rgkNRj0xiAipKT16Rk77buvPP8csR7kkCflT/gXTyzRe/uzIiETTxM7tr8xuO9MP/DQXqkfg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-firehose/node_modules/@aws-sdk/credential-provider-http": { + "version": "3.621.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.621.0.tgz", + "integrity": "sha512-/jc2tEsdkT1QQAI5Dvoci50DbSxtJrevemwFsm0B73pwCcOQZ5ZwwSdVqGsPutzYzUVx3bcXg3LRL7jLACqRIg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/fetch-http-handler": "^3.2.4", + "@smithy/node-http-handler": "^3.1.4", + "@smithy/property-provider": "^3.1.3", + "@smithy/protocol-http": "^4.1.0", + "@smithy/smithy-client": "^3.1.11", + "@smithy/types": "^3.3.0", + "@smithy/util-stream": "^3.1.3", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-firehose/node_modules/@aws-sdk/credential-provider-node": { + "version": "3.621.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.621.0.tgz", + "integrity": "sha512-4JqpccUgz5Snanpt2+53hbOBbJQrSFq7E1sAAbgY6BKVQUsW5qyXqnjvSF32kDeKa5JpBl3bBWLZl04IadcPHw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.620.1", + "@aws-sdk/credential-provider-http": "3.621.0", + "@aws-sdk/credential-provider-ini": "3.621.0", + "@aws-sdk/credential-provider-process": "3.620.1", + "@aws-sdk/credential-provider-sso": "3.621.0", + "@aws-sdk/credential-provider-web-identity": "3.621.0", + "@aws-sdk/types": "3.609.0", + "@smithy/credential-provider-imds": "^3.2.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-firehose/node_modules/@aws-sdk/credential-provider-node/node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.621.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.621.0.tgz", + "integrity": "sha512-0EWVnSc+JQn5HLnF5Xv405M8n4zfdx9gyGdpnCmAmFqEDHA8LmBdxJdpUk1Ovp/I5oPANhjojxabIW5f1uU0RA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.620.1", + "@aws-sdk/credential-provider-http": "3.621.0", + "@aws-sdk/credential-provider-process": "3.620.1", + "@aws-sdk/credential-provider-sso": "3.621.0", + "@aws-sdk/credential-provider-web-identity": "3.621.0", + "@aws-sdk/types": "3.609.0", + "@smithy/credential-provider-imds": "^3.2.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sts": "^3.621.0" + } + }, + "node_modules/@aws-sdk/client-firehose/node_modules/@aws-sdk/credential-provider-node/node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.621.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.621.0.tgz", + "integrity": "sha512-w7ASSyfNvcx7+bYGep3VBgC3K6vEdLmlpjT7nSIHxxQf+WSdvy+HynwJosrpZax0sK5q0D1Jpn/5q+r5lwwW6w==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sts": "^3.621.0" + } + }, + "node_modules/@aws-sdk/client-firehose/node_modules/@aws-sdk/credential-provider-process": { + "version": "3.620.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.620.1.tgz", + "integrity": "sha512-hWqFMidqLAkaV9G460+1at6qa9vySbjQKKc04p59OT7lZ5cO5VH5S4aI05e+m4j364MBROjjk2ugNvfNf/8ILg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-firehose/node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.621.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.621.0.tgz", + "integrity": "sha512-Kza0jcFeA/GEL6xJlzR2KFf1PfZKMFnxfGzJzl5yN7EjoGdMijl34KaRyVnfRjnCWcsUpBWKNIDk9WZVMY9yiw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/client-sso": "3.621.0", + "@aws-sdk/token-providers": "3.614.0", + "@aws-sdk/types": "3.609.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-firehose/node_modules/@aws-sdk/credential-provider-sso/node_modules/@aws-sdk/token-providers": { + "version": "3.614.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.614.0.tgz", + "integrity": "sha512-okItqyY6L9IHdxqs+Z116y5/nda7rHxLvROxtAJdLavWTYDydxrZstImNgGWTeVdmc0xX2gJCI77UYUTQWnhRw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sso-oidc": "^3.614.0" + } + }, + "node_modules/@aws-sdk/client-firehose/node_modules/@aws-sdk/middleware-host-header": { + "version": "3.620.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.620.0.tgz", + "integrity": "sha512-VMtPEZwqYrII/oUkffYsNWY9PZ9xpNJpMgmyU0rlDQ25O1c0Hk3fJmZRe6pEkAJ0omD7kLrqGl1DUjQVxpd/Rg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/protocol-http": "^4.1.0", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-firehose/node_modules/@aws-sdk/middleware-logger": { + "version": "3.609.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.609.0.tgz", + "integrity": "sha512-S62U2dy4jMDhDFDK5gZ4VxFdWzCtLzwbYyFZx2uvPYTECkepLUfzLic2BHg2Qvtu4QjX+oGE3P/7fwaGIsGNuQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-firehose/node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.620.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.620.0.tgz", + "integrity": "sha512-nh91S7aGK3e/o1ck64sA/CyoFw+gAYj2BDOnoNa6ouyCrVJED96ZXWbhye/fz9SgmNUZR2g7GdVpiLpMKZoI5w==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/protocol-http": "^4.1.0", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-firehose/node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.620.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.620.0.tgz", + "integrity": "sha512-bvS6etn+KsuL32ubY5D3xNof1qkenpbJXf/ugGXbg0n98DvDFQ/F+SMLxHgbnER5dsKYchNnhmtI6/FC3HFu/A==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@aws-sdk/util-endpoints": "3.614.0", + "@smithy/protocol-http": "^4.1.0", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-firehose/node_modules/@aws-sdk/region-config-resolver": { + "version": "3.614.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.614.0.tgz", + "integrity": "sha512-vDCeMXvic/LU0KFIUjpC3RiSTIkkvESsEfbVHiHH0YINfl8HnEqR5rj+L8+phsCeVg2+LmYwYxd5NRz4PHxt5g==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/types": "^3.3.0", + "@smithy/util-config-provider": "^3.0.0", + "@smithy/util-middleware": "^3.0.3", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-firehose/node_modules/@aws-sdk/types": { + "version": "3.609.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.609.0.tgz", + "integrity": "sha512-+Tqnh9w0h2LcrUsdXyT1F8mNhXz+tVYBtP19LpeEGntmvHwa2XzvLUCWpoIAIVsHp5+HdB2X9Sn0KAtmbFXc2Q==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-firehose/node_modules/@aws-sdk/util-endpoints": { + "version": "3.614.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.614.0.tgz", + "integrity": "sha512-wK2cdrXHH4oz4IomV/yrGkftU9A+ITB6nFL+rxxyO78is2ifHJpFdV4aqk4LSkXYPi6CXWNru/Dqc7yiKXgJPw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/types": "^3.3.0", + "@smithy/util-endpoints": "^2.0.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-firehose/node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.609.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.609.0.tgz", + "integrity": "sha512-fojPU+mNahzQ0YHYBsx0ZIhmMA96H+ZIZ665ObU9tl+SGdbLneVZVikGve+NmHTQwHzwkFsZYYnVKAkreJLAtA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/types": "^3.3.0", + "bowser": "^2.11.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-sdk/client-firehose/node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.614.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.614.0.tgz", + "integrity": "sha512-15ElZT88peoHnq5TEoEtZwoXTXRxNrk60TZNdpl/TUBJ5oNJ9Dqb5Z4ryb8ofN6nm9aFf59GVAerFDz8iUoHBA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } + } + }, + "node_modules/@aws-sdk/client-firehose/node_modules/@smithy/signature-v4": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-4.2.4.tgz", + "integrity": "sha512-5JWeMQYg81TgU4cG+OexAWdvDTs5JDdbEZx+Qr1iPbvo91QFGzjy0IkXAKaXUHqmKUJgSHK0ZxnCkgZpzkeNTA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^3.0.0", + "@smithy/protocol-http": "^4.1.8", + "@smithy/types": "^3.7.2", + "@smithy/util-hex-encoding": "^3.0.0", + "@smithy/util-middleware": "^3.0.11", + "@smithy/util-uri-escape": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-firehose/node_modules/@smithy/util-middleware": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-3.0.11.tgz", + "integrity": "sha512-dWpyc1e1R6VoXrwLoLDd57U1z6CwNSdkM69Ie4+6uYh2GC7Vg51Qtan7ITzczuVpqezdDTKJGJB95fFvvjU/ow==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.7.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-kinesis": { + "version": "3.621.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-kinesis/-/client-kinesis-3.621.0.tgz", + "integrity": "sha512-53Omt/beFmTQPjQNpMuPMk5nMzYVsXCRiO+MeqygZEKYG1fWw/UGluCWVbi7WjClOHacsW8lQcsqIRvkPDFNag==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/client-sso-oidc": "3.621.0", + "@aws-sdk/client-sts": "3.621.0", + "@aws-sdk/core": "3.621.0", + "@aws-sdk/credential-provider-node": "3.621.0", + "@aws-sdk/middleware-host-header": "3.620.0", + "@aws-sdk/middleware-logger": "3.609.0", + "@aws-sdk/middleware-recursion-detection": "3.620.0", + "@aws-sdk/middleware-user-agent": "3.620.0", + "@aws-sdk/region-config-resolver": "3.614.0", + "@aws-sdk/types": "3.609.0", + "@aws-sdk/util-endpoints": "3.614.0", + "@aws-sdk/util-user-agent-browser": "3.609.0", + "@aws-sdk/util-user-agent-node": "3.614.0", + "@smithy/config-resolver": "^3.0.5", + "@smithy/core": "^2.3.1", + "@smithy/eventstream-serde-browser": "^3.0.5", + "@smithy/eventstream-serde-config-resolver": "^3.0.3", + "@smithy/eventstream-serde-node": "^3.0.4", + "@smithy/fetch-http-handler": "^3.2.4", + "@smithy/hash-node": "^3.0.3", + "@smithy/invalid-dependency": "^3.0.3", + "@smithy/middleware-content-length": "^3.0.5", + "@smithy/middleware-endpoint": "^3.1.0", + "@smithy/middleware-retry": "^3.0.13", + "@smithy/middleware-serde": "^3.0.3", + "@smithy/middleware-stack": "^3.0.3", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/node-http-handler": "^3.1.4", + "@smithy/protocol-http": "^4.1.0", + "@smithy/smithy-client": "^3.1.11", + "@smithy/types": "^3.3.0", + "@smithy/url-parser": "^3.0.3", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-body-length-node": "^3.0.0", + "@smithy/util-defaults-mode-browser": "^3.0.13", + "@smithy/util-defaults-mode-node": "^3.0.13", + "@smithy/util-endpoints": "^2.0.5", + "@smithy/util-middleware": "^3.0.3", + "@smithy/util-retry": "^3.0.3", + "@smithy/util-utf8": "^3.0.0", + "@smithy/util-waiter": "^3.1.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-kinesis/node_modules/@aws-sdk/client-sso": { + "version": "3.621.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.621.0.tgz", + "integrity": "sha512-xpKfikN4u0BaUYZA9FGUMkkDmfoIP0Q03+A86WjqDWhcOoqNA1DkHsE4kZ+r064ifkPUfcNuUvlkVTEoBZoFjA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.621.0", + "@aws-sdk/middleware-host-header": "3.620.0", + "@aws-sdk/middleware-logger": "3.609.0", + "@aws-sdk/middleware-recursion-detection": "3.620.0", + "@aws-sdk/middleware-user-agent": "3.620.0", + "@aws-sdk/region-config-resolver": "3.614.0", + "@aws-sdk/types": "3.609.0", + "@aws-sdk/util-endpoints": "3.614.0", + "@aws-sdk/util-user-agent-browser": "3.609.0", + "@aws-sdk/util-user-agent-node": "3.614.0", + "@smithy/config-resolver": "^3.0.5", + "@smithy/core": "^2.3.1", + "@smithy/fetch-http-handler": "^3.2.4", + "@smithy/hash-node": "^3.0.3", + "@smithy/invalid-dependency": "^3.0.3", + "@smithy/middleware-content-length": "^3.0.5", + "@smithy/middleware-endpoint": "^3.1.0", + "@smithy/middleware-retry": "^3.0.13", + "@smithy/middleware-serde": "^3.0.3", + "@smithy/middleware-stack": "^3.0.3", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/node-http-handler": "^3.1.4", + "@smithy/protocol-http": "^4.1.0", + "@smithy/smithy-client": "^3.1.11", + "@smithy/types": "^3.3.0", + "@smithy/url-parser": "^3.0.3", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-body-length-node": "^3.0.0", + "@smithy/util-defaults-mode-browser": "^3.0.13", + "@smithy/util-defaults-mode-node": "^3.0.13", + "@smithy/util-endpoints": "^2.0.5", + "@smithy/util-middleware": "^3.0.3", + "@smithy/util-retry": "^3.0.3", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-kinesis/node_modules/@aws-sdk/core": { + "version": "3.621.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.621.0.tgz", + "integrity": "sha512-CtOwWmDdEiINkGXD93iGfXjN0WmCp9l45cDWHHGa8lRgEDyhuL7bwd/pH5aSzj0j8SiQBG2k0S7DHbd5RaqvbQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^2.3.1", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/protocol-http": "^4.1.0", + "@smithy/signature-v4": "^4.1.0", + "@smithy/smithy-client": "^3.1.11", + "@smithy/types": "^3.3.0", + "@smithy/util-middleware": "^3.0.3", + "fast-xml-parser": "4.4.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-kinesis/node_modules/@aws-sdk/credential-provider-env": { + "version": "3.620.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.620.1.tgz", + "integrity": "sha512-ExuILJ2qLW5ZO+rgkNRj0xiAipKT16Rk77buvPP8csR7kkCflT/gXTyzRe/uzIiETTxM7tr8xuO9MP/DQXqkfg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-kinesis/node_modules/@aws-sdk/credential-provider-http": { + "version": "3.621.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.621.0.tgz", + "integrity": "sha512-/jc2tEsdkT1QQAI5Dvoci50DbSxtJrevemwFsm0B73pwCcOQZ5ZwwSdVqGsPutzYzUVx3bcXg3LRL7jLACqRIg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/fetch-http-handler": "^3.2.4", + "@smithy/node-http-handler": "^3.1.4", + "@smithy/property-provider": "^3.1.3", + "@smithy/protocol-http": "^4.1.0", + "@smithy/smithy-client": "^3.1.11", + "@smithy/types": "^3.3.0", + "@smithy/util-stream": "^3.1.3", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-kinesis/node_modules/@aws-sdk/credential-provider-node": { + "version": "3.621.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.621.0.tgz", + "integrity": "sha512-4JqpccUgz5Snanpt2+53hbOBbJQrSFq7E1sAAbgY6BKVQUsW5qyXqnjvSF32kDeKa5JpBl3bBWLZl04IadcPHw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.620.1", + "@aws-sdk/credential-provider-http": "3.621.0", + "@aws-sdk/credential-provider-ini": "3.621.0", + "@aws-sdk/credential-provider-process": "3.620.1", + "@aws-sdk/credential-provider-sso": "3.621.0", + "@aws-sdk/credential-provider-web-identity": "3.621.0", + "@aws-sdk/types": "3.609.0", + "@smithy/credential-provider-imds": "^3.2.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-kinesis/node_modules/@aws-sdk/credential-provider-node/node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.621.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.621.0.tgz", + "integrity": "sha512-0EWVnSc+JQn5HLnF5Xv405M8n4zfdx9gyGdpnCmAmFqEDHA8LmBdxJdpUk1Ovp/I5oPANhjojxabIW5f1uU0RA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.620.1", + "@aws-sdk/credential-provider-http": "3.621.0", + "@aws-sdk/credential-provider-process": "3.620.1", + "@aws-sdk/credential-provider-sso": "3.621.0", + "@aws-sdk/credential-provider-web-identity": "3.621.0", + "@aws-sdk/types": "3.609.0", + "@smithy/credential-provider-imds": "^3.2.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sts": "^3.621.0" + } + }, + "node_modules/@aws-sdk/client-kinesis/node_modules/@aws-sdk/credential-provider-node/node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.621.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.621.0.tgz", + "integrity": "sha512-w7ASSyfNvcx7+bYGep3VBgC3K6vEdLmlpjT7nSIHxxQf+WSdvy+HynwJosrpZax0sK5q0D1Jpn/5q+r5lwwW6w==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sts": "^3.621.0" + } + }, + "node_modules/@aws-sdk/client-kinesis/node_modules/@aws-sdk/credential-provider-process": { + "version": "3.620.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.620.1.tgz", + "integrity": "sha512-hWqFMidqLAkaV9G460+1at6qa9vySbjQKKc04p59OT7lZ5cO5VH5S4aI05e+m4j364MBROjjk2ugNvfNf/8ILg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-kinesis/node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.621.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.621.0.tgz", + "integrity": "sha512-Kza0jcFeA/GEL6xJlzR2KFf1PfZKMFnxfGzJzl5yN7EjoGdMijl34KaRyVnfRjnCWcsUpBWKNIDk9WZVMY9yiw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/client-sso": "3.621.0", + "@aws-sdk/token-providers": "3.614.0", + "@aws-sdk/types": "3.609.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-kinesis/node_modules/@aws-sdk/credential-provider-sso/node_modules/@aws-sdk/token-providers": { + "version": "3.614.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.614.0.tgz", + "integrity": "sha512-okItqyY6L9IHdxqs+Z116y5/nda7rHxLvROxtAJdLavWTYDydxrZstImNgGWTeVdmc0xX2gJCI77UYUTQWnhRw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sso-oidc": "^3.614.0" + } + }, + "node_modules/@aws-sdk/client-kinesis/node_modules/@aws-sdk/middleware-host-header": { + "version": "3.620.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.620.0.tgz", + "integrity": "sha512-VMtPEZwqYrII/oUkffYsNWY9PZ9xpNJpMgmyU0rlDQ25O1c0Hk3fJmZRe6pEkAJ0omD7kLrqGl1DUjQVxpd/Rg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/protocol-http": "^4.1.0", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-kinesis/node_modules/@aws-sdk/middleware-logger": { + "version": "3.609.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.609.0.tgz", + "integrity": "sha512-S62U2dy4jMDhDFDK5gZ4VxFdWzCtLzwbYyFZx2uvPYTECkepLUfzLic2BHg2Qvtu4QjX+oGE3P/7fwaGIsGNuQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-kinesis/node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.620.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.620.0.tgz", + "integrity": "sha512-nh91S7aGK3e/o1ck64sA/CyoFw+gAYj2BDOnoNa6ouyCrVJED96ZXWbhye/fz9SgmNUZR2g7GdVpiLpMKZoI5w==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/protocol-http": "^4.1.0", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-kinesis/node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.620.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.620.0.tgz", + "integrity": "sha512-bvS6etn+KsuL32ubY5D3xNof1qkenpbJXf/ugGXbg0n98DvDFQ/F+SMLxHgbnER5dsKYchNnhmtI6/FC3HFu/A==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@aws-sdk/util-endpoints": "3.614.0", + "@smithy/protocol-http": "^4.1.0", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-kinesis/node_modules/@aws-sdk/region-config-resolver": { + "version": "3.614.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.614.0.tgz", + "integrity": "sha512-vDCeMXvic/LU0KFIUjpC3RiSTIkkvESsEfbVHiHH0YINfl8HnEqR5rj+L8+phsCeVg2+LmYwYxd5NRz4PHxt5g==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/types": "^3.3.0", + "@smithy/util-config-provider": "^3.0.0", + "@smithy/util-middleware": "^3.0.3", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-kinesis/node_modules/@aws-sdk/types": { + "version": "3.609.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.609.0.tgz", + "integrity": "sha512-+Tqnh9w0h2LcrUsdXyT1F8mNhXz+tVYBtP19LpeEGntmvHwa2XzvLUCWpoIAIVsHp5+HdB2X9Sn0KAtmbFXc2Q==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-kinesis/node_modules/@aws-sdk/util-endpoints": { + "version": "3.614.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.614.0.tgz", + "integrity": "sha512-wK2cdrXHH4oz4IomV/yrGkftU9A+ITB6nFL+rxxyO78is2ifHJpFdV4aqk4LSkXYPi6CXWNru/Dqc7yiKXgJPw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/types": "^3.3.0", + "@smithy/util-endpoints": "^2.0.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-kinesis/node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.609.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.609.0.tgz", + "integrity": "sha512-fojPU+mNahzQ0YHYBsx0ZIhmMA96H+ZIZ665ObU9tl+SGdbLneVZVikGve+NmHTQwHzwkFsZYYnVKAkreJLAtA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/types": "^3.3.0", + "bowser": "^2.11.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-sdk/client-kinesis/node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.614.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.614.0.tgz", + "integrity": "sha512-15ElZT88peoHnq5TEoEtZwoXTXRxNrk60TZNdpl/TUBJ5oNJ9Dqb5Z4ryb8ofN6nm9aFf59GVAerFDz8iUoHBA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } + } + }, + "node_modules/@aws-sdk/client-kinesis/node_modules/@smithy/signature-v4": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-4.2.4.tgz", + "integrity": "sha512-5JWeMQYg81TgU4cG+OexAWdvDTs5JDdbEZx+Qr1iPbvo91QFGzjy0IkXAKaXUHqmKUJgSHK0ZxnCkgZpzkeNTA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^3.0.0", + "@smithy/protocol-http": "^4.1.8", + "@smithy/types": "^3.7.2", + "@smithy/util-hex-encoding": "^3.0.0", + "@smithy/util-middleware": "^3.0.11", + "@smithy/util-uri-escape": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-kinesis/node_modules/@smithy/util-middleware": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-3.0.11.tgz", + "integrity": "sha512-dWpyc1e1R6VoXrwLoLDd57U1z6CwNSdkM69Ie4+6uYh2GC7Vg51Qtan7ITzczuVpqezdDTKJGJB95fFvvjU/ow==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.7.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-personalize-events": { + "version": "3.621.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-personalize-events/-/client-personalize-events-3.621.0.tgz", + "integrity": "sha512-qkVkqYvOe3WVuVNL/gRITGYFfHJCx2ijGFK7H3hNUJH3P4AwskmouAd1pWf+3cbGedRnj2is7iw7E602LeJIHA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/client-sso-oidc": "3.621.0", + "@aws-sdk/client-sts": "3.621.0", + "@aws-sdk/core": "3.621.0", + "@aws-sdk/credential-provider-node": "3.621.0", + "@aws-sdk/middleware-host-header": "3.620.0", + "@aws-sdk/middleware-logger": "3.609.0", + "@aws-sdk/middleware-recursion-detection": "3.620.0", + "@aws-sdk/middleware-user-agent": "3.620.0", + "@aws-sdk/region-config-resolver": "3.614.0", + "@aws-sdk/types": "3.609.0", + "@aws-sdk/util-endpoints": "3.614.0", + "@aws-sdk/util-user-agent-browser": "3.609.0", + "@aws-sdk/util-user-agent-node": "3.614.0", + "@smithy/config-resolver": "^3.0.5", + "@smithy/core": "^2.3.1", + "@smithy/fetch-http-handler": "^3.2.4", + "@smithy/hash-node": "^3.0.3", + "@smithy/invalid-dependency": "^3.0.3", + "@smithy/middleware-content-length": "^3.0.5", + "@smithy/middleware-endpoint": "^3.1.0", + "@smithy/middleware-retry": "^3.0.13", + "@smithy/middleware-serde": "^3.0.3", + "@smithy/middleware-stack": "^3.0.3", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/node-http-handler": "^3.1.4", + "@smithy/protocol-http": "^4.1.0", + "@smithy/smithy-client": "^3.1.11", + "@smithy/types": "^3.3.0", + "@smithy/url-parser": "^3.0.3", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-body-length-node": "^3.0.0", + "@smithy/util-defaults-mode-browser": "^3.0.13", + "@smithy/util-defaults-mode-node": "^3.0.13", + "@smithy/util-endpoints": "^2.0.5", + "@smithy/util-middleware": "^3.0.3", + "@smithy/util-retry": "^3.0.3", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-personalize-events/node_modules/@aws-sdk/client-sso": { + "version": "3.621.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.621.0.tgz", + "integrity": "sha512-xpKfikN4u0BaUYZA9FGUMkkDmfoIP0Q03+A86WjqDWhcOoqNA1DkHsE4kZ+r064ifkPUfcNuUvlkVTEoBZoFjA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.621.0", + "@aws-sdk/middleware-host-header": "3.620.0", + "@aws-sdk/middleware-logger": "3.609.0", + "@aws-sdk/middleware-recursion-detection": "3.620.0", + "@aws-sdk/middleware-user-agent": "3.620.0", + "@aws-sdk/region-config-resolver": "3.614.0", + "@aws-sdk/types": "3.609.0", + "@aws-sdk/util-endpoints": "3.614.0", + "@aws-sdk/util-user-agent-browser": "3.609.0", + "@aws-sdk/util-user-agent-node": "3.614.0", + "@smithy/config-resolver": "^3.0.5", + "@smithy/core": "^2.3.1", + "@smithy/fetch-http-handler": "^3.2.4", + "@smithy/hash-node": "^3.0.3", + "@smithy/invalid-dependency": "^3.0.3", + "@smithy/middleware-content-length": "^3.0.5", + "@smithy/middleware-endpoint": "^3.1.0", + "@smithy/middleware-retry": "^3.0.13", + "@smithy/middleware-serde": "^3.0.3", + "@smithy/middleware-stack": "^3.0.3", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/node-http-handler": "^3.1.4", + "@smithy/protocol-http": "^4.1.0", + "@smithy/smithy-client": "^3.1.11", + "@smithy/types": "^3.3.0", + "@smithy/url-parser": "^3.0.3", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-body-length-node": "^3.0.0", + "@smithy/util-defaults-mode-browser": "^3.0.13", + "@smithy/util-defaults-mode-node": "^3.0.13", + "@smithy/util-endpoints": "^2.0.5", + "@smithy/util-middleware": "^3.0.3", + "@smithy/util-retry": "^3.0.3", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-personalize-events/node_modules/@aws-sdk/core": { + "version": "3.621.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.621.0.tgz", + "integrity": "sha512-CtOwWmDdEiINkGXD93iGfXjN0WmCp9l45cDWHHGa8lRgEDyhuL7bwd/pH5aSzj0j8SiQBG2k0S7DHbd5RaqvbQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^2.3.1", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/protocol-http": "^4.1.0", + "@smithy/signature-v4": "^4.1.0", + "@smithy/smithy-client": "^3.1.11", + "@smithy/types": "^3.3.0", + "@smithy/util-middleware": "^3.0.3", + "fast-xml-parser": "4.4.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-personalize-events/node_modules/@aws-sdk/credential-provider-env": { + "version": "3.620.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.620.1.tgz", + "integrity": "sha512-ExuILJ2qLW5ZO+rgkNRj0xiAipKT16Rk77buvPP8csR7kkCflT/gXTyzRe/uzIiETTxM7tr8xuO9MP/DQXqkfg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-personalize-events/node_modules/@aws-sdk/credential-provider-http": { + "version": "3.621.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.621.0.tgz", + "integrity": "sha512-/jc2tEsdkT1QQAI5Dvoci50DbSxtJrevemwFsm0B73pwCcOQZ5ZwwSdVqGsPutzYzUVx3bcXg3LRL7jLACqRIg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/fetch-http-handler": "^3.2.4", + "@smithy/node-http-handler": "^3.1.4", + "@smithy/property-provider": "^3.1.3", + "@smithy/protocol-http": "^4.1.0", + "@smithy/smithy-client": "^3.1.11", + "@smithy/types": "^3.3.0", + "@smithy/util-stream": "^3.1.3", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-personalize-events/node_modules/@aws-sdk/credential-provider-node": { + "version": "3.621.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.621.0.tgz", + "integrity": "sha512-4JqpccUgz5Snanpt2+53hbOBbJQrSFq7E1sAAbgY6BKVQUsW5qyXqnjvSF32kDeKa5JpBl3bBWLZl04IadcPHw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.620.1", + "@aws-sdk/credential-provider-http": "3.621.0", + "@aws-sdk/credential-provider-ini": "3.621.0", + "@aws-sdk/credential-provider-process": "3.620.1", + "@aws-sdk/credential-provider-sso": "3.621.0", + "@aws-sdk/credential-provider-web-identity": "3.621.0", + "@aws-sdk/types": "3.609.0", + "@smithy/credential-provider-imds": "^3.2.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-personalize-events/node_modules/@aws-sdk/credential-provider-node/node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.621.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.621.0.tgz", + "integrity": "sha512-0EWVnSc+JQn5HLnF5Xv405M8n4zfdx9gyGdpnCmAmFqEDHA8LmBdxJdpUk1Ovp/I5oPANhjojxabIW5f1uU0RA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.620.1", + "@aws-sdk/credential-provider-http": "3.621.0", + "@aws-sdk/credential-provider-process": "3.620.1", + "@aws-sdk/credential-provider-sso": "3.621.0", + "@aws-sdk/credential-provider-web-identity": "3.621.0", + "@aws-sdk/types": "3.609.0", + "@smithy/credential-provider-imds": "^3.2.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sts": "^3.621.0" + } + }, + "node_modules/@aws-sdk/client-personalize-events/node_modules/@aws-sdk/credential-provider-node/node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.621.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.621.0.tgz", + "integrity": "sha512-w7ASSyfNvcx7+bYGep3VBgC3K6vEdLmlpjT7nSIHxxQf+WSdvy+HynwJosrpZax0sK5q0D1Jpn/5q+r5lwwW6w==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sts": "^3.621.0" + } + }, + "node_modules/@aws-sdk/client-personalize-events/node_modules/@aws-sdk/credential-provider-process": { + "version": "3.620.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.620.1.tgz", + "integrity": "sha512-hWqFMidqLAkaV9G460+1at6qa9vySbjQKKc04p59OT7lZ5cO5VH5S4aI05e+m4j364MBROjjk2ugNvfNf/8ILg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-personalize-events/node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.621.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.621.0.tgz", + "integrity": "sha512-Kza0jcFeA/GEL6xJlzR2KFf1PfZKMFnxfGzJzl5yN7EjoGdMijl34KaRyVnfRjnCWcsUpBWKNIDk9WZVMY9yiw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/client-sso": "3.621.0", + "@aws-sdk/token-providers": "3.614.0", + "@aws-sdk/types": "3.609.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-personalize-events/node_modules/@aws-sdk/credential-provider-sso/node_modules/@aws-sdk/token-providers": { + "version": "3.614.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.614.0.tgz", + "integrity": "sha512-okItqyY6L9IHdxqs+Z116y5/nda7rHxLvROxtAJdLavWTYDydxrZstImNgGWTeVdmc0xX2gJCI77UYUTQWnhRw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sso-oidc": "^3.614.0" + } + }, + "node_modules/@aws-sdk/client-personalize-events/node_modules/@aws-sdk/middleware-host-header": { + "version": "3.620.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.620.0.tgz", + "integrity": "sha512-VMtPEZwqYrII/oUkffYsNWY9PZ9xpNJpMgmyU0rlDQ25O1c0Hk3fJmZRe6pEkAJ0omD7kLrqGl1DUjQVxpd/Rg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/protocol-http": "^4.1.0", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-personalize-events/node_modules/@aws-sdk/middleware-logger": { + "version": "3.609.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.609.0.tgz", + "integrity": "sha512-S62U2dy4jMDhDFDK5gZ4VxFdWzCtLzwbYyFZx2uvPYTECkepLUfzLic2BHg2Qvtu4QjX+oGE3P/7fwaGIsGNuQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-personalize-events/node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.620.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.620.0.tgz", + "integrity": "sha512-nh91S7aGK3e/o1ck64sA/CyoFw+gAYj2BDOnoNa6ouyCrVJED96ZXWbhye/fz9SgmNUZR2g7GdVpiLpMKZoI5w==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/protocol-http": "^4.1.0", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-personalize-events/node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.620.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.620.0.tgz", + "integrity": "sha512-bvS6etn+KsuL32ubY5D3xNof1qkenpbJXf/ugGXbg0n98DvDFQ/F+SMLxHgbnER5dsKYchNnhmtI6/FC3HFu/A==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@aws-sdk/util-endpoints": "3.614.0", + "@smithy/protocol-http": "^4.1.0", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-personalize-events/node_modules/@aws-sdk/region-config-resolver": { + "version": "3.614.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.614.0.tgz", + "integrity": "sha512-vDCeMXvic/LU0KFIUjpC3RiSTIkkvESsEfbVHiHH0YINfl8HnEqR5rj+L8+phsCeVg2+LmYwYxd5NRz4PHxt5g==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/types": "^3.3.0", + "@smithy/util-config-provider": "^3.0.0", + "@smithy/util-middleware": "^3.0.3", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-personalize-events/node_modules/@aws-sdk/types": { + "version": "3.609.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.609.0.tgz", + "integrity": "sha512-+Tqnh9w0h2LcrUsdXyT1F8mNhXz+tVYBtP19LpeEGntmvHwa2XzvLUCWpoIAIVsHp5+HdB2X9Sn0KAtmbFXc2Q==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-personalize-events/node_modules/@aws-sdk/util-endpoints": { + "version": "3.614.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.614.0.tgz", + "integrity": "sha512-wK2cdrXHH4oz4IomV/yrGkftU9A+ITB6nFL+rxxyO78is2ifHJpFdV4aqk4LSkXYPi6CXWNru/Dqc7yiKXgJPw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/types": "^3.3.0", + "@smithy/util-endpoints": "^2.0.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-personalize-events/node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.609.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.609.0.tgz", + "integrity": "sha512-fojPU+mNahzQ0YHYBsx0ZIhmMA96H+ZIZ665ObU9tl+SGdbLneVZVikGve+NmHTQwHzwkFsZYYnVKAkreJLAtA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/types": "^3.3.0", + "bowser": "^2.11.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-sdk/client-personalize-events/node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.614.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.614.0.tgz", + "integrity": "sha512-15ElZT88peoHnq5TEoEtZwoXTXRxNrk60TZNdpl/TUBJ5oNJ9Dqb5Z4ryb8ofN6nm9aFf59GVAerFDz8iUoHBA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } + } + }, + "node_modules/@aws-sdk/client-personalize-events/node_modules/@smithy/signature-v4": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-4.2.4.tgz", + "integrity": "sha512-5JWeMQYg81TgU4cG+OexAWdvDTs5JDdbEZx+Qr1iPbvo91QFGzjy0IkXAKaXUHqmKUJgSHK0ZxnCkgZpzkeNTA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^3.0.0", + "@smithy/protocol-http": "^4.1.8", + "@smithy/types": "^3.7.2", + "@smithy/util-hex-encoding": "^3.0.0", + "@smithy/util-middleware": "^3.0.11", + "@smithy/util-uri-escape": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-personalize-events/node_modules/@smithy/util-middleware": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-3.0.11.tgz", + "integrity": "sha512-dWpyc1e1R6VoXrwLoLDd57U1z6CwNSdkM69Ie4+6uYh2GC7Vg51Qtan7ITzczuVpqezdDTKJGJB95fFvvjU/ow==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.7.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-sso": { + "version": "3.862.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.862.0.tgz", + "integrity": "sha512-zHf7Bn22K09BdFgiGg6yWfy927djGhs58KB5qpqD2ie7u796TvetPH14p6UUAOGyk6aah+wR/WLFFoc+51uADA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.862.0", + "@aws-sdk/middleware-host-header": "3.862.0", + "@aws-sdk/middleware-logger": "3.862.0", + "@aws-sdk/middleware-recursion-detection": "3.862.0", + "@aws-sdk/middleware-user-agent": "3.862.0", + "@aws-sdk/region-config-resolver": "3.862.0", + "@aws-sdk/types": "3.862.0", + "@aws-sdk/util-endpoints": "3.862.0", + "@aws-sdk/util-user-agent-browser": "3.862.0", + "@aws-sdk/util-user-agent-node": "3.862.0", + "@smithy/config-resolver": "^4.1.5", + "@smithy/core": "^3.8.0", + "@smithy/fetch-http-handler": "^5.1.1", + "@smithy/hash-node": "^4.0.5", + "@smithy/invalid-dependency": "^4.0.5", + "@smithy/middleware-content-length": "^4.0.5", + "@smithy/middleware-endpoint": "^4.1.18", + "@smithy/middleware-retry": "^4.1.19", + "@smithy/middleware-serde": "^4.0.9", + "@smithy/middleware-stack": "^4.0.5", + "@smithy/node-config-provider": "^4.1.4", + "@smithy/node-http-handler": "^4.1.1", + "@smithy/protocol-http": "^5.1.3", + "@smithy/smithy-client": "^4.4.10", + "@smithy/types": "^4.3.2", + "@smithy/url-parser": "^4.0.5", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-body-length-browser": "^4.0.0", + "@smithy/util-body-length-node": "^4.0.0", + "@smithy/util-defaults-mode-browser": "^4.0.26", + "@smithy/util-defaults-mode-node": "^4.0.26", + "@smithy/util-endpoints": "^3.0.7", + "@smithy/util-middleware": "^4.0.5", + "@smithy/util-retry": "^4.0.7", + "@smithy/util-utf8": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc": { + "version": "3.621.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.621.0.tgz", + "integrity": "sha512-mMjk3mFUwV2Y68POf1BQMTF+F6qxt5tPu6daEUCNGC9Cenk3h2YXQQoS4/eSyYzuBiYk3vx49VgleRvdvkg8rg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.621.0", + "@aws-sdk/credential-provider-node": "3.621.0", + "@aws-sdk/middleware-host-header": "3.620.0", + "@aws-sdk/middleware-logger": "3.609.0", + "@aws-sdk/middleware-recursion-detection": "3.620.0", + "@aws-sdk/middleware-user-agent": "3.620.0", + "@aws-sdk/region-config-resolver": "3.614.0", + "@aws-sdk/types": "3.609.0", + "@aws-sdk/util-endpoints": "3.614.0", + "@aws-sdk/util-user-agent-browser": "3.609.0", + "@aws-sdk/util-user-agent-node": "3.614.0", + "@smithy/config-resolver": "^3.0.5", + "@smithy/core": "^2.3.1", + "@smithy/fetch-http-handler": "^3.2.4", + "@smithy/hash-node": "^3.0.3", + "@smithy/invalid-dependency": "^3.0.3", + "@smithy/middleware-content-length": "^3.0.5", + "@smithy/middleware-endpoint": "^3.1.0", + "@smithy/middleware-retry": "^3.0.13", + "@smithy/middleware-serde": "^3.0.3", + "@smithy/middleware-stack": "^3.0.3", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/node-http-handler": "^3.1.4", + "@smithy/protocol-http": "^4.1.0", + "@smithy/smithy-client": "^3.1.11", + "@smithy/types": "^3.3.0", + "@smithy/url-parser": "^3.0.3", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-body-length-node": "^3.0.0", + "@smithy/util-defaults-mode-browser": "^3.0.13", + "@smithy/util-defaults-mode-node": "^3.0.13", + "@smithy/util-endpoints": "^2.0.5", + "@smithy/util-middleware": "^3.0.3", + "@smithy/util-retry": "^3.0.3", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sts": "^3.621.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/client-sso": { + "version": "3.621.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.621.0.tgz", + "integrity": "sha512-xpKfikN4u0BaUYZA9FGUMkkDmfoIP0Q03+A86WjqDWhcOoqNA1DkHsE4kZ+r064ifkPUfcNuUvlkVTEoBZoFjA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.621.0", + "@aws-sdk/middleware-host-header": "3.620.0", + "@aws-sdk/middleware-logger": "3.609.0", + "@aws-sdk/middleware-recursion-detection": "3.620.0", + "@aws-sdk/middleware-user-agent": "3.620.0", + "@aws-sdk/region-config-resolver": "3.614.0", + "@aws-sdk/types": "3.609.0", + "@aws-sdk/util-endpoints": "3.614.0", + "@aws-sdk/util-user-agent-browser": "3.609.0", + "@aws-sdk/util-user-agent-node": "3.614.0", + "@smithy/config-resolver": "^3.0.5", + "@smithy/core": "^2.3.1", + "@smithy/fetch-http-handler": "^3.2.4", + "@smithy/hash-node": "^3.0.3", + "@smithy/invalid-dependency": "^3.0.3", + "@smithy/middleware-content-length": "^3.0.5", + "@smithy/middleware-endpoint": "^3.1.0", + "@smithy/middleware-retry": "^3.0.13", + "@smithy/middleware-serde": "^3.0.3", + "@smithy/middleware-stack": "^3.0.3", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/node-http-handler": "^3.1.4", + "@smithy/protocol-http": "^4.1.0", + "@smithy/smithy-client": "^3.1.11", + "@smithy/types": "^3.3.0", + "@smithy/url-parser": "^3.0.3", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-body-length-node": "^3.0.0", + "@smithy/util-defaults-mode-browser": "^3.0.13", + "@smithy/util-defaults-mode-node": "^3.0.13", + "@smithy/util-endpoints": "^2.0.5", + "@smithy/util-middleware": "^3.0.3", + "@smithy/util-retry": "^3.0.3", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/core": { + "version": "3.621.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.621.0.tgz", + "integrity": "sha512-CtOwWmDdEiINkGXD93iGfXjN0WmCp9l45cDWHHGa8lRgEDyhuL7bwd/pH5aSzj0j8SiQBG2k0S7DHbd5RaqvbQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^2.3.1", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/protocol-http": "^4.1.0", + "@smithy/signature-v4": "^4.1.0", + "@smithy/smithy-client": "^3.1.11", + "@smithy/types": "^3.3.0", + "@smithy/util-middleware": "^3.0.3", + "fast-xml-parser": "4.4.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/credential-provider-env": { + "version": "3.620.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.620.1.tgz", + "integrity": "sha512-ExuILJ2qLW5ZO+rgkNRj0xiAipKT16Rk77buvPP8csR7kkCflT/gXTyzRe/uzIiETTxM7tr8xuO9MP/DQXqkfg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/credential-provider-http": { + "version": "3.621.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.621.0.tgz", + "integrity": "sha512-/jc2tEsdkT1QQAI5Dvoci50DbSxtJrevemwFsm0B73pwCcOQZ5ZwwSdVqGsPutzYzUVx3bcXg3LRL7jLACqRIg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/fetch-http-handler": "^3.2.4", + "@smithy/node-http-handler": "^3.1.4", + "@smithy/property-provider": "^3.1.3", + "@smithy/protocol-http": "^4.1.0", + "@smithy/smithy-client": "^3.1.11", + "@smithy/types": "^3.3.0", + "@smithy/util-stream": "^3.1.3", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.621.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.621.0.tgz", + "integrity": "sha512-0EWVnSc+JQn5HLnF5Xv405M8n4zfdx9gyGdpnCmAmFqEDHA8LmBdxJdpUk1Ovp/I5oPANhjojxabIW5f1uU0RA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.620.1", + "@aws-sdk/credential-provider-http": "3.621.0", + "@aws-sdk/credential-provider-process": "3.620.1", + "@aws-sdk/credential-provider-sso": "3.621.0", + "@aws-sdk/credential-provider-web-identity": "3.621.0", + "@aws-sdk/types": "3.609.0", + "@smithy/credential-provider-imds": "^3.2.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sts": "^3.621.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/credential-provider-node": { + "version": "3.621.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.621.0.tgz", + "integrity": "sha512-4JqpccUgz5Snanpt2+53hbOBbJQrSFq7E1sAAbgY6BKVQUsW5qyXqnjvSF32kDeKa5JpBl3bBWLZl04IadcPHw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.620.1", + "@aws-sdk/credential-provider-http": "3.621.0", + "@aws-sdk/credential-provider-ini": "3.621.0", + "@aws-sdk/credential-provider-process": "3.620.1", + "@aws-sdk/credential-provider-sso": "3.621.0", + "@aws-sdk/credential-provider-web-identity": "3.621.0", + "@aws-sdk/types": "3.609.0", + "@smithy/credential-provider-imds": "^3.2.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/credential-provider-process": { + "version": "3.620.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.620.1.tgz", + "integrity": "sha512-hWqFMidqLAkaV9G460+1at6qa9vySbjQKKc04p59OT7lZ5cO5VH5S4aI05e+m4j364MBROjjk2ugNvfNf/8ILg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.621.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.621.0.tgz", + "integrity": "sha512-Kza0jcFeA/GEL6xJlzR2KFf1PfZKMFnxfGzJzl5yN7EjoGdMijl34KaRyVnfRjnCWcsUpBWKNIDk9WZVMY9yiw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/client-sso": "3.621.0", + "@aws-sdk/token-providers": "3.614.0", + "@aws-sdk/types": "3.609.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.621.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.621.0.tgz", + "integrity": "sha512-w7ASSyfNvcx7+bYGep3VBgC3K6vEdLmlpjT7nSIHxxQf+WSdvy+HynwJosrpZax0sK5q0D1Jpn/5q+r5lwwW6w==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sts": "^3.621.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/middleware-host-header": { + "version": "3.620.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.620.0.tgz", + "integrity": "sha512-VMtPEZwqYrII/oUkffYsNWY9PZ9xpNJpMgmyU0rlDQ25O1c0Hk3fJmZRe6pEkAJ0omD7kLrqGl1DUjQVxpd/Rg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/protocol-http": "^4.1.0", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/middleware-logger": { + "version": "3.609.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.609.0.tgz", + "integrity": "sha512-S62U2dy4jMDhDFDK5gZ4VxFdWzCtLzwbYyFZx2uvPYTECkepLUfzLic2BHg2Qvtu4QjX+oGE3P/7fwaGIsGNuQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.620.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.620.0.tgz", + "integrity": "sha512-nh91S7aGK3e/o1ck64sA/CyoFw+gAYj2BDOnoNa6ouyCrVJED96ZXWbhye/fz9SgmNUZR2g7GdVpiLpMKZoI5w==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/protocol-http": "^4.1.0", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.620.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.620.0.tgz", + "integrity": "sha512-bvS6etn+KsuL32ubY5D3xNof1qkenpbJXf/ugGXbg0n98DvDFQ/F+SMLxHgbnER5dsKYchNnhmtI6/FC3HFu/A==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@aws-sdk/util-endpoints": "3.614.0", + "@smithy/protocol-http": "^4.1.0", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/region-config-resolver": { + "version": "3.614.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.614.0.tgz", + "integrity": "sha512-vDCeMXvic/LU0KFIUjpC3RiSTIkkvESsEfbVHiHH0YINfl8HnEqR5rj+L8+phsCeVg2+LmYwYxd5NRz4PHxt5g==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/types": "^3.3.0", + "@smithy/util-config-provider": "^3.0.0", + "@smithy/util-middleware": "^3.0.3", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/token-providers": { + "version": "3.614.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.614.0.tgz", + "integrity": "sha512-okItqyY6L9IHdxqs+Z116y5/nda7rHxLvROxtAJdLavWTYDydxrZstImNgGWTeVdmc0xX2gJCI77UYUTQWnhRw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sso-oidc": "^3.614.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/types": { + "version": "3.609.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.609.0.tgz", + "integrity": "sha512-+Tqnh9w0h2LcrUsdXyT1F8mNhXz+tVYBtP19LpeEGntmvHwa2XzvLUCWpoIAIVsHp5+HdB2X9Sn0KAtmbFXc2Q==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/util-endpoints": { + "version": "3.614.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.614.0.tgz", + "integrity": "sha512-wK2cdrXHH4oz4IomV/yrGkftU9A+ITB6nFL+rxxyO78is2ifHJpFdV4aqk4LSkXYPi6CXWNru/Dqc7yiKXgJPw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/types": "^3.3.0", + "@smithy/util-endpoints": "^2.0.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.609.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.609.0.tgz", + "integrity": "sha512-fojPU+mNahzQ0YHYBsx0ZIhmMA96H+ZIZ665ObU9tl+SGdbLneVZVikGve+NmHTQwHzwkFsZYYnVKAkreJLAtA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/types": "^3.3.0", + "bowser": "^2.11.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.614.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.614.0.tgz", + "integrity": "sha512-15ElZT88peoHnq5TEoEtZwoXTXRxNrk60TZNdpl/TUBJ5oNJ9Dqb5Z4ryb8ofN6nm9aFf59GVAerFDz8iUoHBA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/signature-v4": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-4.2.4.tgz", + "integrity": "sha512-5JWeMQYg81TgU4cG+OexAWdvDTs5JDdbEZx+Qr1iPbvo91QFGzjy0IkXAKaXUHqmKUJgSHK0ZxnCkgZpzkeNTA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^3.0.0", + "@smithy/protocol-http": "^4.1.8", + "@smithy/types": "^3.7.2", + "@smithy/util-hex-encoding": "^3.0.0", + "@smithy/util-middleware": "^3.0.11", + "@smithy/util-uri-escape": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/util-middleware": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-3.0.11.tgz", + "integrity": "sha512-dWpyc1e1R6VoXrwLoLDd57U1z6CwNSdkM69Ie4+6uYh2GC7Vg51Qtan7ITzczuVpqezdDTKJGJB95fFvvjU/ow==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.7.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/abort-controller": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.5.tgz", + "integrity": "sha512-jcrqdTQurIrBbUm4W2YdLVMQDoL0sA9DTxYd2s+R/y+2U9NLOP7Xf/YqfSg1FZhlZIYEnvk2mwbyvIfdLEPo8g==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/config-resolver": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.1.5.tgz", + "integrity": "sha512-viuHMxBAqydkB0AfWwHIdwf/PRH2z5KHGUzqyRtS/Wv+n3IHI993Sk76VCA7dD/+GzgGOmlJDITfPcJC1nIVIw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.1.4", + "@smithy/types": "^4.3.2", + "@smithy/util-config-provider": "^4.0.0", + "@smithy/util-middleware": "^4.0.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/core": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.8.0.tgz", + "integrity": "sha512-EYqsIYJmkR1VhVE9pccnk353xhs+lB6btdutJEtsp7R055haMJp2yE16eSxw8fv+G0WUY6vqxyYOP8kOqawxYQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/middleware-serde": "^4.0.9", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-body-length-browser": "^4.0.0", + "@smithy/util-middleware": "^4.0.5", + "@smithy/util-stream": "^4.2.4", + "@smithy/util-utf8": "^4.0.0", + "@types/uuid": "^9.0.1", + "tslib": "^2.6.2", + "uuid": "^9.0.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/credential-provider-imds": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.0.7.tgz", + "integrity": "sha512-dDzrMXA8d8riFNiPvytxn0mNwR4B3h8lgrQ5UjAGu6T9z/kRg/Xncf4tEQHE/+t25sY8IH3CowcmWi+1U5B1Gw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.1.4", + "@smithy/property-provider": "^4.0.5", + "@smithy/types": "^4.3.2", + "@smithy/url-parser": "^4.0.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/fetch-http-handler": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.1.1.tgz", + "integrity": "sha512-61WjM0PWmZJR+SnmzaKI7t7G0UkkNFboDpzIdzSoy7TByUzlxo18Qlh9s71qug4AY4hlH/CwXdubMtkcNEb/sQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^5.1.3", + "@smithy/querystring-builder": "^4.0.5", + "@smithy/types": "^4.3.2", + "@smithy/util-base64": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/hash-node": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.0.5.tgz", + "integrity": "sha512-cv1HHkKhpyRb6ahD8Vcfb2Hgz67vNIXEp2vnhzfxLFGRukLCNEA5QdsorbUEzXma1Rco0u3rx5VTqbM06GcZqQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.3.2", + "@smithy/util-buffer-from": "^4.0.0", + "@smithy/util-utf8": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/invalid-dependency": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.0.5.tgz", + "integrity": "sha512-IVnb78Qtf7EJpoEVo7qJ8BEXQwgC4n3igeJNNKEj/MLYtapnx8A67Zt/J3RXAj2xSO1910zk0LdFiygSemuLow==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/is-array-buffer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.0.0.tgz", + "integrity": "sha512-saYhF8ZZNoJDTvJBEWgeBccCg+yvp1CX+ed12yORU3NilJScfc6gfch2oVb4QgxZrGUx3/ZJlb+c/dJbyupxlw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/middleware-content-length": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.0.5.tgz", + "integrity": "sha512-l1jlNZoYzoCC7p0zCtBDE5OBXZ95yMKlRlftooE5jPWQn4YBPLgsp+oeHp7iMHaTGoUdFqmHOPa8c9G3gBsRpQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/middleware-endpoint": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.1.18.tgz", + "integrity": "sha512-ZhvqcVRPZxnZlokcPaTwb+r+h4yOIOCJmx0v2d1bpVlmP465g3qpVSf7wxcq5zZdu4jb0H4yIMxuPwDJSQc3MQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^3.8.0", + "@smithy/middleware-serde": "^4.0.9", + "@smithy/node-config-provider": "^4.1.4", + "@smithy/shared-ini-file-loader": "^4.0.5", + "@smithy/types": "^4.3.2", + "@smithy/url-parser": "^4.0.5", + "@smithy/util-middleware": "^4.0.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/middleware-retry": { + "version": "4.1.19", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.1.19.tgz", + "integrity": "sha512-X58zx/NVECjeuUB6A8HBu4bhx72EoUz+T5jTMIyeNKx2lf+Gs9TmWPNNkH+5QF0COjpInP/xSpJGJ7xEnAklQQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.1.4", + "@smithy/protocol-http": "^5.1.3", + "@smithy/service-error-classification": "^4.0.7", + "@smithy/smithy-client": "^4.4.10", + "@smithy/types": "^4.3.2", + "@smithy/util-middleware": "^4.0.5", + "@smithy/util-retry": "^4.0.7", + "@types/uuid": "^9.0.1", + "tslib": "^2.6.2", + "uuid": "^9.0.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/middleware-serde": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.0.9.tgz", + "integrity": "sha512-uAFFR4dpeoJPGz8x9mhxp+RPjo5wW0QEEIPPPbLXiRRWeCATf/Km3gKIVR5vaP8bN1kgsPhcEeh+IZvUlBv6Xg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/middleware-stack": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.0.5.tgz", + "integrity": "sha512-/yoHDXZPh3ocRVyeWQFvC44u8seu3eYzZRveCMfgMOBcNKnAmOvjbL9+Cp5XKSIi9iYA9PECUuW2teDAk8T+OQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/node-config-provider": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.4.tgz", + "integrity": "sha512-+UDQV/k42jLEPPHSn39l0Bmc4sB1xtdI9Gd47fzo/0PbXzJ7ylgaOByVjF5EeQIumkepnrJyfx86dPa9p47Y+w==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/property-provider": "^4.0.5", + "@smithy/shared-ini-file-loader": "^4.0.5", + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/node-http-handler": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.1.1.tgz", + "integrity": "sha512-RHnlHqFpoVdjSPPiYy/t40Zovf3BBHc2oemgD7VsVTFFZrU5erFFe0n52OANZZ/5sbshgD93sOh5r6I35Xmpaw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/abort-controller": "^4.0.5", + "@smithy/protocol-http": "^5.1.3", + "@smithy/querystring-builder": "^4.0.5", + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/property-provider": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.5.tgz", + "integrity": "sha512-R/bswf59T/n9ZgfgUICAZoWYKBHcsVDurAGX88zsiUtOTA/xUAPyiT+qkNCPwFn43pZqN84M4MiUsbSGQmgFIQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/protocol-http": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.3.tgz", + "integrity": "sha512-fCJd2ZR7D22XhDY0l+92pUag/7je2BztPRQ01gU5bMChcyI0rlly7QFibnYHzcxDvccMjlpM/Q1ev8ceRIb48w==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/querystring-builder": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.5.tgz", + "integrity": "sha512-NJeSCU57piZ56c+/wY+AbAw6rxCCAOZLCIniRE7wqvndqxcKKDOXzwWjrY7wGKEISfhL9gBbAaWWgHsUGedk+A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.3.2", + "@smithy/util-uri-escape": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/querystring-parser": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.0.5.tgz", + "integrity": "sha512-6SV7md2CzNG/WUeTjVe6Dj8noH32r4MnUeFKZrnVYsQxpGSIcphAanQMayi8jJLZAWm6pdM9ZXvKCpWOsIGg0w==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/service-error-classification": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.0.7.tgz", + "integrity": "sha512-XvRHOipqpwNhEjDf2L5gJowZEm5nsxC16pAZOeEcsygdjv9A2jdOh3YoDQvOXBGTsaJk6mNWtzWalOB9976Wlg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.3.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/shared-ini-file-loader": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.5.tgz", + "integrity": "sha512-YVVwehRDuehgoXdEL4r1tAAzdaDgaC9EQvhK0lEbfnbrd0bd5+CTQumbdPryX3J2shT7ZqQE+jPW4lmNBAB8JQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/smithy-client": { + "version": "4.4.10", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.4.10.tgz", + "integrity": "sha512-iW6HjXqN0oPtRS0NK/zzZ4zZeGESIFcxj2FkWed3mcK8jdSdHzvnCKXSjvewESKAgGKAbJRA+OsaqKhkdYRbQQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^3.8.0", + "@smithy/middleware-endpoint": "^4.1.18", + "@smithy/middleware-stack": "^4.0.5", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", + "@smithy/util-stream": "^4.2.4", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/types": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/url-parser": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.0.5.tgz", + "integrity": "sha512-j+733Um7f1/DXjYhCbvNXABV53NyCRRA54C7bNEIxNPs0YjfRxeMKjjgm2jvTYrciZyCjsicHwQ6Q0ylo+NAUw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/querystring-parser": "^4.0.5", + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-base64": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.0.0.tgz", + "integrity": "sha512-CvHfCmO2mchox9kjrtzoHkWHxjHZzaFojLc8quxXY7WAAMAg43nuxwv95tATVgQFNDwd4M9S1qFzj40Ul41Kmg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^4.0.0", + "@smithy/util-utf8": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-body-length-browser": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.0.0.tgz", + "integrity": "sha512-sNi3DL0/k64/LO3A256M+m3CDdG6V7WKWHdAiBBMUN8S3hK3aMPhwnPik2A/a2ONN+9doY9UxaLfgqsIRg69QA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-body-length-node": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.0.0.tgz", + "integrity": "sha512-q0iDP3VsZzqJyje8xJWEJCNIu3lktUGVoSy1KB0UWym2CL1siV3artm+u1DFYTLejpsrdGyCSWBdGNjJzfDPjg==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-buffer-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.0.0.tgz", + "integrity": "sha512-9TOQ7781sZvddgO8nxueKi3+yGvkY35kotA0Y6BWRajAv8jjmigQ1sBwz0UX47pQMYXJPahSKEKYFgt+rXdcug==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-config-provider": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.0.0.tgz", + "integrity": "sha512-L1RBVzLyfE8OXH+1hsJ8p+acNUSirQnWQ6/EgpchV88G6zGBTDPdXiiExei6Z1wR2RxYvxY/XLw6AMNCCt8H3w==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-defaults-mode-browser": { + "version": "4.0.26", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.0.26.tgz", + "integrity": "sha512-xgl75aHIS/3rrGp7iTxQAOELYeyiwBu+eEgAk4xfKwJJ0L8VUjhO2shsDpeil54BOFsqmk5xfdesiewbUY5tKQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/property-provider": "^4.0.5", + "@smithy/smithy-client": "^4.4.10", + "@smithy/types": "^4.3.2", + "bowser": "^2.11.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-defaults-mode-node": { + "version": "4.0.26", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.0.26.tgz", + "integrity": "sha512-z81yyIkGiLLYVDetKTUeCZQ8x20EEzvQjrqJtb/mXnevLq2+w3XCEWTJ2pMp401b6BkEkHVfXb/cROBpVauLMQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/config-resolver": "^4.1.5", + "@smithy/credential-provider-imds": "^4.0.7", + "@smithy/node-config-provider": "^4.1.4", + "@smithy/property-provider": "^4.0.5", + "@smithy/smithy-client": "^4.4.10", + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-endpoints": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.0.7.tgz", + "integrity": "sha512-klGBP+RpBp6V5JbrY2C/VKnHXn3d5V2YrifZbmMY8os7M6m8wdYFoO6w/fe5VkP+YVwrEktW3IWYaSQVNZJ8oQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.1.4", + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-hex-encoding": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.0.0.tgz", + "integrity": "sha512-Yk5mLhHtfIgW2W2WQZWSg5kuMZCVbvhFmC7rV4IO2QqnZdbEFPmQnCcGMAX2z/8Qj3B9hYYNjZOhWym+RwhePw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-middleware": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.5.tgz", + "integrity": "sha512-N40PfqsZHRSsByGB81HhSo+uvMxEHT+9e255S53pfBw/wI6WKDI7Jw9oyu5tJTLwZzV5DsMha3ji8jk9dsHmQQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-retry": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.0.7.tgz", + "integrity": "sha512-TTO6rt0ppK70alZpkjwy+3nQlTiqNfoXja+qwuAchIEAIoSZW8Qyd76dvBv3I5bCpE38APafG23Y/u270NspiQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/service-error-classification": "^4.0.7", + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-stream": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.2.4.tgz", + "integrity": "sha512-vSKnvNZX2BXzl0U2RgCLOwWaAP9x/ddd/XobPK02pCbzRm5s55M53uwb1rl/Ts7RXZvdJZerPkA+en2FDghLuQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/fetch-http-handler": "^5.1.1", + "@smithy/node-http-handler": "^4.1.1", + "@smithy/types": "^4.3.2", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-buffer-from": "^4.0.0", + "@smithy/util-hex-encoding": "^4.0.0", + "@smithy/util-utf8": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-uri-escape": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.0.0.tgz", + "integrity": "sha512-77yfbCbQMtgtTylO9itEAdpPXSog3ZxMe09AEhm0dU0NLTalV70ghDZFR+Nfi1C60jnJoh/Re4090/DuZh2Omg==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-utf8": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.0.0.tgz", + "integrity": "sha512-b+zebfKCfRdgNJDknHCob3O7FpeYQN6ZG6YLExMcasDHsCXlsXCEuiPZeLnJLpwa5dvPetGlnGCiMHuLwGvFow==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sts": { + "version": "3.621.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.621.0.tgz", + "integrity": "sha512-707uiuReSt+nAx6d0c21xLjLm2lxeKc7padxjv92CIrIocnQSlJPxSCM7r5zBhwiahJA6MNQwmTl2xznU67KgA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/client-sso-oidc": "3.621.0", + "@aws-sdk/core": "3.621.0", + "@aws-sdk/credential-provider-node": "3.621.0", + "@aws-sdk/middleware-host-header": "3.620.0", + "@aws-sdk/middleware-logger": "3.609.0", + "@aws-sdk/middleware-recursion-detection": "3.620.0", + "@aws-sdk/middleware-user-agent": "3.620.0", + "@aws-sdk/region-config-resolver": "3.614.0", + "@aws-sdk/types": "3.609.0", + "@aws-sdk/util-endpoints": "3.614.0", + "@aws-sdk/util-user-agent-browser": "3.609.0", + "@aws-sdk/util-user-agent-node": "3.614.0", + "@smithy/config-resolver": "^3.0.5", + "@smithy/core": "^2.3.1", + "@smithy/fetch-http-handler": "^3.2.4", + "@smithy/hash-node": "^3.0.3", + "@smithy/invalid-dependency": "^3.0.3", + "@smithy/middleware-content-length": "^3.0.5", + "@smithy/middleware-endpoint": "^3.1.0", + "@smithy/middleware-retry": "^3.0.13", + "@smithy/middleware-serde": "^3.0.3", + "@smithy/middleware-stack": "^3.0.3", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/node-http-handler": "^3.1.4", + "@smithy/protocol-http": "^4.1.0", + "@smithy/smithy-client": "^3.1.11", + "@smithy/types": "^3.3.0", + "@smithy/url-parser": "^3.0.3", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-body-length-node": "^3.0.0", + "@smithy/util-defaults-mode-browser": "^3.0.13", + "@smithy/util-defaults-mode-node": "^3.0.13", + "@smithy/util-endpoints": "^2.0.5", + "@smithy/util-middleware": "^3.0.3", + "@smithy/util-retry": "^3.0.3", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-sts/node_modules/@aws-sdk/client-sso": { + "version": "3.621.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.621.0.tgz", + "integrity": "sha512-xpKfikN4u0BaUYZA9FGUMkkDmfoIP0Q03+A86WjqDWhcOoqNA1DkHsE4kZ+r064ifkPUfcNuUvlkVTEoBZoFjA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.621.0", + "@aws-sdk/middleware-host-header": "3.620.0", + "@aws-sdk/middleware-logger": "3.609.0", + "@aws-sdk/middleware-recursion-detection": "3.620.0", + "@aws-sdk/middleware-user-agent": "3.620.0", + "@aws-sdk/region-config-resolver": "3.614.0", + "@aws-sdk/types": "3.609.0", + "@aws-sdk/util-endpoints": "3.614.0", + "@aws-sdk/util-user-agent-browser": "3.609.0", + "@aws-sdk/util-user-agent-node": "3.614.0", + "@smithy/config-resolver": "^3.0.5", + "@smithy/core": "^2.3.1", + "@smithy/fetch-http-handler": "^3.2.4", + "@smithy/hash-node": "^3.0.3", + "@smithy/invalid-dependency": "^3.0.3", + "@smithy/middleware-content-length": "^3.0.5", + "@smithy/middleware-endpoint": "^3.1.0", + "@smithy/middleware-retry": "^3.0.13", + "@smithy/middleware-serde": "^3.0.3", + "@smithy/middleware-stack": "^3.0.3", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/node-http-handler": "^3.1.4", + "@smithy/protocol-http": "^4.1.0", + "@smithy/smithy-client": "^3.1.11", + "@smithy/types": "^3.3.0", + "@smithy/url-parser": "^3.0.3", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-body-length-node": "^3.0.0", + "@smithy/util-defaults-mode-browser": "^3.0.13", + "@smithy/util-defaults-mode-node": "^3.0.13", + "@smithy/util-endpoints": "^2.0.5", + "@smithy/util-middleware": "^3.0.3", + "@smithy/util-retry": "^3.0.3", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-sts/node_modules/@aws-sdk/core": { + "version": "3.621.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.621.0.tgz", + "integrity": "sha512-CtOwWmDdEiINkGXD93iGfXjN0WmCp9l45cDWHHGa8lRgEDyhuL7bwd/pH5aSzj0j8SiQBG2k0S7DHbd5RaqvbQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^2.3.1", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/protocol-http": "^4.1.0", + "@smithy/signature-v4": "^4.1.0", + "@smithy/smithy-client": "^3.1.11", + "@smithy/types": "^3.3.0", + "@smithy/util-middleware": "^3.0.3", + "fast-xml-parser": "4.4.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-sts/node_modules/@aws-sdk/credential-provider-env": { + "version": "3.620.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.620.1.tgz", + "integrity": "sha512-ExuILJ2qLW5ZO+rgkNRj0xiAipKT16Rk77buvPP8csR7kkCflT/gXTyzRe/uzIiETTxM7tr8xuO9MP/DQXqkfg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-sts/node_modules/@aws-sdk/credential-provider-http": { + "version": "3.621.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.621.0.tgz", + "integrity": "sha512-/jc2tEsdkT1QQAI5Dvoci50DbSxtJrevemwFsm0B73pwCcOQZ5ZwwSdVqGsPutzYzUVx3bcXg3LRL7jLACqRIg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/fetch-http-handler": "^3.2.4", + "@smithy/node-http-handler": "^3.1.4", + "@smithy/property-provider": "^3.1.3", + "@smithy/protocol-http": "^4.1.0", + "@smithy/smithy-client": "^3.1.11", + "@smithy/types": "^3.3.0", + "@smithy/util-stream": "^3.1.3", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-sts/node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.621.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.621.0.tgz", + "integrity": "sha512-0EWVnSc+JQn5HLnF5Xv405M8n4zfdx9gyGdpnCmAmFqEDHA8LmBdxJdpUk1Ovp/I5oPANhjojxabIW5f1uU0RA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.620.1", + "@aws-sdk/credential-provider-http": "3.621.0", + "@aws-sdk/credential-provider-process": "3.620.1", + "@aws-sdk/credential-provider-sso": "3.621.0", + "@aws-sdk/credential-provider-web-identity": "3.621.0", + "@aws-sdk/types": "3.609.0", + "@smithy/credential-provider-imds": "^3.2.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sts": "^3.621.0" + } + }, + "node_modules/@aws-sdk/client-sts/node_modules/@aws-sdk/credential-provider-node": { + "version": "3.621.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.621.0.tgz", + "integrity": "sha512-4JqpccUgz5Snanpt2+53hbOBbJQrSFq7E1sAAbgY6BKVQUsW5qyXqnjvSF32kDeKa5JpBl3bBWLZl04IadcPHw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.620.1", + "@aws-sdk/credential-provider-http": "3.621.0", + "@aws-sdk/credential-provider-ini": "3.621.0", + "@aws-sdk/credential-provider-process": "3.620.1", + "@aws-sdk/credential-provider-sso": "3.621.0", + "@aws-sdk/credential-provider-web-identity": "3.621.0", + "@aws-sdk/types": "3.609.0", + "@smithy/credential-provider-imds": "^3.2.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-sts/node_modules/@aws-sdk/credential-provider-process": { + "version": "3.620.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.620.1.tgz", + "integrity": "sha512-hWqFMidqLAkaV9G460+1at6qa9vySbjQKKc04p59OT7lZ5cO5VH5S4aI05e+m4j364MBROjjk2ugNvfNf/8ILg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-sts/node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.621.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.621.0.tgz", + "integrity": "sha512-Kza0jcFeA/GEL6xJlzR2KFf1PfZKMFnxfGzJzl5yN7EjoGdMijl34KaRyVnfRjnCWcsUpBWKNIDk9WZVMY9yiw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/client-sso": "3.621.0", + "@aws-sdk/token-providers": "3.614.0", + "@aws-sdk/types": "3.609.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-sts/node_modules/@aws-sdk/credential-provider-sso/node_modules/@aws-sdk/token-providers": { + "version": "3.614.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.614.0.tgz", + "integrity": "sha512-okItqyY6L9IHdxqs+Z116y5/nda7rHxLvROxtAJdLavWTYDydxrZstImNgGWTeVdmc0xX2gJCI77UYUTQWnhRw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sso-oidc": "^3.614.0" + } + }, + "node_modules/@aws-sdk/client-sts/node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.621.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.621.0.tgz", + "integrity": "sha512-w7ASSyfNvcx7+bYGep3VBgC3K6vEdLmlpjT7nSIHxxQf+WSdvy+HynwJosrpZax0sK5q0D1Jpn/5q+r5lwwW6w==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sts": "^3.621.0" + } + }, + "node_modules/@aws-sdk/client-sts/node_modules/@aws-sdk/middleware-host-header": { + "version": "3.620.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.620.0.tgz", + "integrity": "sha512-VMtPEZwqYrII/oUkffYsNWY9PZ9xpNJpMgmyU0rlDQ25O1c0Hk3fJmZRe6pEkAJ0omD7kLrqGl1DUjQVxpd/Rg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/protocol-http": "^4.1.0", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-sts/node_modules/@aws-sdk/middleware-logger": { + "version": "3.609.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.609.0.tgz", + "integrity": "sha512-S62U2dy4jMDhDFDK5gZ4VxFdWzCtLzwbYyFZx2uvPYTECkepLUfzLic2BHg2Qvtu4QjX+oGE3P/7fwaGIsGNuQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-sts/node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.620.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.620.0.tgz", + "integrity": "sha512-nh91S7aGK3e/o1ck64sA/CyoFw+gAYj2BDOnoNa6ouyCrVJED96ZXWbhye/fz9SgmNUZR2g7GdVpiLpMKZoI5w==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/protocol-http": "^4.1.0", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-sts/node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.620.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.620.0.tgz", + "integrity": "sha512-bvS6etn+KsuL32ubY5D3xNof1qkenpbJXf/ugGXbg0n98DvDFQ/F+SMLxHgbnER5dsKYchNnhmtI6/FC3HFu/A==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@aws-sdk/util-endpoints": "3.614.0", + "@smithy/protocol-http": "^4.1.0", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-sts/node_modules/@aws-sdk/region-config-resolver": { + "version": "3.614.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.614.0.tgz", + "integrity": "sha512-vDCeMXvic/LU0KFIUjpC3RiSTIkkvESsEfbVHiHH0YINfl8HnEqR5rj+L8+phsCeVg2+LmYwYxd5NRz4PHxt5g==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/types": "^3.3.0", + "@smithy/util-config-provider": "^3.0.0", + "@smithy/util-middleware": "^3.0.3", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-sts/node_modules/@aws-sdk/types": { + "version": "3.609.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.609.0.tgz", + "integrity": "sha512-+Tqnh9w0h2LcrUsdXyT1F8mNhXz+tVYBtP19LpeEGntmvHwa2XzvLUCWpoIAIVsHp5+HdB2X9Sn0KAtmbFXc2Q==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-sts/node_modules/@aws-sdk/util-endpoints": { + "version": "3.614.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.614.0.tgz", + "integrity": "sha512-wK2cdrXHH4oz4IomV/yrGkftU9A+ITB6nFL+rxxyO78is2ifHJpFdV4aqk4LSkXYPi6CXWNru/Dqc7yiKXgJPw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/types": "^3.3.0", + "@smithy/util-endpoints": "^2.0.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-sts/node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.609.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.609.0.tgz", + "integrity": "sha512-fojPU+mNahzQ0YHYBsx0ZIhmMA96H+ZIZ665ObU9tl+SGdbLneVZVikGve+NmHTQwHzwkFsZYYnVKAkreJLAtA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/types": "^3.3.0", + "bowser": "^2.11.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-sdk/client-sts/node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.614.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.614.0.tgz", + "integrity": "sha512-15ElZT88peoHnq5TEoEtZwoXTXRxNrk60TZNdpl/TUBJ5oNJ9Dqb5Z4ryb8ofN6nm9aFf59GVAerFDz8iUoHBA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } + } + }, + "node_modules/@aws-sdk/client-sts/node_modules/@smithy/signature-v4": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-4.2.4.tgz", + "integrity": "sha512-5JWeMQYg81TgU4cG+OexAWdvDTs5JDdbEZx+Qr1iPbvo91QFGzjy0IkXAKaXUHqmKUJgSHK0ZxnCkgZpzkeNTA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^3.0.0", + "@smithy/protocol-http": "^4.1.8", + "@smithy/types": "^3.7.2", + "@smithy/util-hex-encoding": "^3.0.0", + "@smithy/util-middleware": "^3.0.11", + "@smithy/util-uri-escape": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-sts/node_modules/@smithy/util-middleware": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-3.0.11.tgz", + "integrity": "sha512-dWpyc1e1R6VoXrwLoLDd57U1z6CwNSdkM69Ie4+6uYh2GC7Vg51Qtan7ITzczuVpqezdDTKJGJB95fFvvjU/ow==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.7.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/core": { + "version": "3.862.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.862.0.tgz", + "integrity": "sha512-oJ5Au3QCAQmOmh7PD7dUxnPDxWsT9Z95XEOiJV027//11pwRSUMiNSvW8srPa3i7CZRNjz5QHX6O4KqX9PxNsQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.862.0", + "@aws-sdk/xml-builder": "3.862.0", + "@smithy/core": "^3.8.0", + "@smithy/node-config-provider": "^4.1.4", + "@smithy/property-provider": "^4.0.5", + "@smithy/protocol-http": "^5.1.3", + "@smithy/signature-v4": "^5.1.3", + "@smithy/smithy-client": "^4.4.10", + "@smithy/types": "^4.3.2", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-body-length-browser": "^4.0.0", + "@smithy/util-middleware": "^4.0.5", + "@smithy/util-utf8": "^4.0.0", + "fast-xml-parser": "5.2.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/core/node_modules/@smithy/abort-controller": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.5.tgz", + "integrity": "sha512-jcrqdTQurIrBbUm4W2YdLVMQDoL0sA9DTxYd2s+R/y+2U9NLOP7Xf/YqfSg1FZhlZIYEnvk2mwbyvIfdLEPo8g==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/core/node_modules/@smithy/core": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.8.0.tgz", + "integrity": "sha512-EYqsIYJmkR1VhVE9pccnk353xhs+lB6btdutJEtsp7R055haMJp2yE16eSxw8fv+G0WUY6vqxyYOP8kOqawxYQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/middleware-serde": "^4.0.9", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-body-length-browser": "^4.0.0", + "@smithy/util-middleware": "^4.0.5", + "@smithy/util-stream": "^4.2.4", + "@smithy/util-utf8": "^4.0.0", + "@types/uuid": "^9.0.1", + "tslib": "^2.6.2", + "uuid": "^9.0.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/core/node_modules/@smithy/fetch-http-handler": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.1.1.tgz", + "integrity": "sha512-61WjM0PWmZJR+SnmzaKI7t7G0UkkNFboDpzIdzSoy7TByUzlxo18Qlh9s71qug4AY4hlH/CwXdubMtkcNEb/sQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^5.1.3", + "@smithy/querystring-builder": "^4.0.5", + "@smithy/types": "^4.3.2", + "@smithy/util-base64": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/core/node_modules/@smithy/is-array-buffer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.0.0.tgz", + "integrity": "sha512-saYhF8ZZNoJDTvJBEWgeBccCg+yvp1CX+ed12yORU3NilJScfc6gfch2oVb4QgxZrGUx3/ZJlb+c/dJbyupxlw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/core/node_modules/@smithy/middleware-endpoint": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.1.18.tgz", + "integrity": "sha512-ZhvqcVRPZxnZlokcPaTwb+r+h4yOIOCJmx0v2d1bpVlmP465g3qpVSf7wxcq5zZdu4jb0H4yIMxuPwDJSQc3MQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^3.8.0", + "@smithy/middleware-serde": "^4.0.9", + "@smithy/node-config-provider": "^4.1.4", + "@smithy/shared-ini-file-loader": "^4.0.5", + "@smithy/types": "^4.3.2", + "@smithy/url-parser": "^4.0.5", + "@smithy/util-middleware": "^4.0.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/core/node_modules/@smithy/middleware-serde": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.0.9.tgz", + "integrity": "sha512-uAFFR4dpeoJPGz8x9mhxp+RPjo5wW0QEEIPPPbLXiRRWeCATf/Km3gKIVR5vaP8bN1kgsPhcEeh+IZvUlBv6Xg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/core/node_modules/@smithy/middleware-stack": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.0.5.tgz", + "integrity": "sha512-/yoHDXZPh3ocRVyeWQFvC44u8seu3eYzZRveCMfgMOBcNKnAmOvjbL9+Cp5XKSIi9iYA9PECUuW2teDAk8T+OQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/core/node_modules/@smithy/node-config-provider": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.4.tgz", + "integrity": "sha512-+UDQV/k42jLEPPHSn39l0Bmc4sB1xtdI9Gd47fzo/0PbXzJ7ylgaOByVjF5EeQIumkepnrJyfx86dPa9p47Y+w==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/property-provider": "^4.0.5", + "@smithy/shared-ini-file-loader": "^4.0.5", + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/core/node_modules/@smithy/node-http-handler": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.1.1.tgz", + "integrity": "sha512-RHnlHqFpoVdjSPPiYy/t40Zovf3BBHc2oemgD7VsVTFFZrU5erFFe0n52OANZZ/5sbshgD93sOh5r6I35Xmpaw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/abort-controller": "^4.0.5", + "@smithy/protocol-http": "^5.1.3", + "@smithy/querystring-builder": "^4.0.5", + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/core/node_modules/@smithy/property-provider": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.5.tgz", + "integrity": "sha512-R/bswf59T/n9ZgfgUICAZoWYKBHcsVDurAGX88zsiUtOTA/xUAPyiT+qkNCPwFn43pZqN84M4MiUsbSGQmgFIQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/core/node_modules/@smithy/protocol-http": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.3.tgz", + "integrity": "sha512-fCJd2ZR7D22XhDY0l+92pUag/7je2BztPRQ01gU5bMChcyI0rlly7QFibnYHzcxDvccMjlpM/Q1ev8ceRIb48w==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/core/node_modules/@smithy/querystring-builder": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.5.tgz", + "integrity": "sha512-NJeSCU57piZ56c+/wY+AbAw6rxCCAOZLCIniRE7wqvndqxcKKDOXzwWjrY7wGKEISfhL9gBbAaWWgHsUGedk+A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.3.2", + "@smithy/util-uri-escape": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/core/node_modules/@smithy/querystring-parser": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.0.5.tgz", + "integrity": "sha512-6SV7md2CzNG/WUeTjVe6Dj8noH32r4MnUeFKZrnVYsQxpGSIcphAanQMayi8jJLZAWm6pdM9ZXvKCpWOsIGg0w==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/core/node_modules/@smithy/shared-ini-file-loader": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.5.tgz", + "integrity": "sha512-YVVwehRDuehgoXdEL4r1tAAzdaDgaC9EQvhK0lEbfnbrd0bd5+CTQumbdPryX3J2shT7ZqQE+jPW4lmNBAB8JQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/core/node_modules/@smithy/smithy-client": { + "version": "4.4.10", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.4.10.tgz", + "integrity": "sha512-iW6HjXqN0oPtRS0NK/zzZ4zZeGESIFcxj2FkWed3mcK8jdSdHzvnCKXSjvewESKAgGKAbJRA+OsaqKhkdYRbQQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^3.8.0", + "@smithy/middleware-endpoint": "^4.1.18", + "@smithy/middleware-stack": "^4.0.5", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", + "@smithy/util-stream": "^4.2.4", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/core/node_modules/@smithy/types": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/core/node_modules/@smithy/url-parser": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.0.5.tgz", + "integrity": "sha512-j+733Um7f1/DXjYhCbvNXABV53NyCRRA54C7bNEIxNPs0YjfRxeMKjjgm2jvTYrciZyCjsicHwQ6Q0ylo+NAUw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/querystring-parser": "^4.0.5", + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/core/node_modules/@smithy/util-base64": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.0.0.tgz", + "integrity": "sha512-CvHfCmO2mchox9kjrtzoHkWHxjHZzaFojLc8quxXY7WAAMAg43nuxwv95tATVgQFNDwd4M9S1qFzj40Ul41Kmg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^4.0.0", + "@smithy/util-utf8": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/core/node_modules/@smithy/util-body-length-browser": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.0.0.tgz", + "integrity": "sha512-sNi3DL0/k64/LO3A256M+m3CDdG6V7WKWHdAiBBMUN8S3hK3aMPhwnPik2A/a2ONN+9doY9UxaLfgqsIRg69QA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/core/node_modules/@smithy/util-buffer-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.0.0.tgz", + "integrity": "sha512-9TOQ7781sZvddgO8nxueKi3+yGvkY35kotA0Y6BWRajAv8jjmigQ1sBwz0UX47pQMYXJPahSKEKYFgt+rXdcug==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/core/node_modules/@smithy/util-hex-encoding": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.0.0.tgz", + "integrity": "sha512-Yk5mLhHtfIgW2W2WQZWSg5kuMZCVbvhFmC7rV4IO2QqnZdbEFPmQnCcGMAX2z/8Qj3B9hYYNjZOhWym+RwhePw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/core/node_modules/@smithy/util-middleware": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.5.tgz", + "integrity": "sha512-N40PfqsZHRSsByGB81HhSo+uvMxEHT+9e255S53pfBw/wI6WKDI7Jw9oyu5tJTLwZzV5DsMha3ji8jk9dsHmQQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/core/node_modules/@smithy/util-stream": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.2.4.tgz", + "integrity": "sha512-vSKnvNZX2BXzl0U2RgCLOwWaAP9x/ddd/XobPK02pCbzRm5s55M53uwb1rl/Ts7RXZvdJZerPkA+en2FDghLuQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/fetch-http-handler": "^5.1.1", + "@smithy/node-http-handler": "^4.1.1", + "@smithy/types": "^4.3.2", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-buffer-from": "^4.0.0", + "@smithy/util-hex-encoding": "^4.0.0", + "@smithy/util-utf8": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/core/node_modules/@smithy/util-uri-escape": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.0.0.tgz", + "integrity": "sha512-77yfbCbQMtgtTylO9itEAdpPXSog3ZxMe09AEhm0dU0NLTalV70ghDZFR+Nfi1C60jnJoh/Re4090/DuZh2Omg==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/core/node_modules/@smithy/util-utf8": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.0.0.tgz", + "integrity": "sha512-b+zebfKCfRdgNJDknHCob3O7FpeYQN6ZG6YLExMcasDHsCXlsXCEuiPZeLnJLpwa5dvPetGlnGCiMHuLwGvFow==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/core/node_modules/fast-xml-parser": { + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.2.5.tgz", + "integrity": "sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "dependencies": { + "strnum": "^2.1.0" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, + "node_modules/@aws-sdk/core/node_modules/strnum": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.1.1.tgz", + "integrity": "sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT" + }, + "node_modules/@aws-sdk/credential-provider-cognito-identity": { + "version": "3.624.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/client-cognito-identity": "3.624.0", + "@aws-sdk/types": "3.609.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@aws-sdk/types": { + "version": "3.609.0", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-env": { + "version": "3.862.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.862.0.tgz", + "integrity": "sha512-/nafSJMuixcrCN1SmsOBIQ5m1fhr9ZnCxw3JZD9qJm3yNXhAshqAC+KcA3JGFnvdBVLhY/pUpdoQmxZmuFJItQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.862.0", + "@aws-sdk/types": "3.862.0", + "@smithy/property-provider": "^4.0.5", + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-env/node_modules/@smithy/property-provider": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.5.tgz", + "integrity": "sha512-R/bswf59T/n9ZgfgUICAZoWYKBHcsVDurAGX88zsiUtOTA/xUAPyiT+qkNCPwFn43pZqN84M4MiUsbSGQmgFIQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-env/node_modules/@smithy/types": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-http": { + "version": "3.862.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.862.0.tgz", + "integrity": "sha512-JnF3vH6GxvPuMGSI5QsmVlmWc0ebElEiJvUGByTMSr/BfzywZdJBKzPVqViwNqAW5cBWiZ/rpL+ekZ24Nb0Vow==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.862.0", + "@aws-sdk/types": "3.862.0", + "@smithy/fetch-http-handler": "^5.1.1", + "@smithy/node-http-handler": "^4.1.1", + "@smithy/property-provider": "^4.0.5", + "@smithy/protocol-http": "^5.1.3", + "@smithy/smithy-client": "^4.4.10", + "@smithy/types": "^4.3.2", + "@smithy/util-stream": "^4.2.4", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/abort-controller": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.5.tgz", + "integrity": "sha512-jcrqdTQurIrBbUm4W2YdLVMQDoL0sA9DTxYd2s+R/y+2U9NLOP7Xf/YqfSg1FZhlZIYEnvk2mwbyvIfdLEPo8g==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/core": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.8.0.tgz", + "integrity": "sha512-EYqsIYJmkR1VhVE9pccnk353xhs+lB6btdutJEtsp7R055haMJp2yE16eSxw8fv+G0WUY6vqxyYOP8kOqawxYQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/middleware-serde": "^4.0.9", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-body-length-browser": "^4.0.0", + "@smithy/util-middleware": "^4.0.5", + "@smithy/util-stream": "^4.2.4", + "@smithy/util-utf8": "^4.0.0", + "@types/uuid": "^9.0.1", + "tslib": "^2.6.2", + "uuid": "^9.0.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/fetch-http-handler": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.1.1.tgz", + "integrity": "sha512-61WjM0PWmZJR+SnmzaKI7t7G0UkkNFboDpzIdzSoy7TByUzlxo18Qlh9s71qug4AY4hlH/CwXdubMtkcNEb/sQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^5.1.3", + "@smithy/querystring-builder": "^4.0.5", + "@smithy/types": "^4.3.2", + "@smithy/util-base64": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/is-array-buffer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.0.0.tgz", + "integrity": "sha512-saYhF8ZZNoJDTvJBEWgeBccCg+yvp1CX+ed12yORU3NilJScfc6gfch2oVb4QgxZrGUx3/ZJlb+c/dJbyupxlw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/middleware-endpoint": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.1.18.tgz", + "integrity": "sha512-ZhvqcVRPZxnZlokcPaTwb+r+h4yOIOCJmx0v2d1bpVlmP465g3qpVSf7wxcq5zZdu4jb0H4yIMxuPwDJSQc3MQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^3.8.0", + "@smithy/middleware-serde": "^4.0.9", + "@smithy/node-config-provider": "^4.1.4", + "@smithy/shared-ini-file-loader": "^4.0.5", + "@smithy/types": "^4.3.2", + "@smithy/url-parser": "^4.0.5", + "@smithy/util-middleware": "^4.0.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/middleware-serde": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.0.9.tgz", + "integrity": "sha512-uAFFR4dpeoJPGz8x9mhxp+RPjo5wW0QEEIPPPbLXiRRWeCATf/Km3gKIVR5vaP8bN1kgsPhcEeh+IZvUlBv6Xg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/middleware-stack": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.0.5.tgz", + "integrity": "sha512-/yoHDXZPh3ocRVyeWQFvC44u8seu3eYzZRveCMfgMOBcNKnAmOvjbL9+Cp5XKSIi9iYA9PECUuW2teDAk8T+OQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/node-config-provider": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.4.tgz", + "integrity": "sha512-+UDQV/k42jLEPPHSn39l0Bmc4sB1xtdI9Gd47fzo/0PbXzJ7ylgaOByVjF5EeQIumkepnrJyfx86dPa9p47Y+w==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/property-provider": "^4.0.5", + "@smithy/shared-ini-file-loader": "^4.0.5", + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/node-http-handler": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.1.1.tgz", + "integrity": "sha512-RHnlHqFpoVdjSPPiYy/t40Zovf3BBHc2oemgD7VsVTFFZrU5erFFe0n52OANZZ/5sbshgD93sOh5r6I35Xmpaw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/abort-controller": "^4.0.5", + "@smithy/protocol-http": "^5.1.3", + "@smithy/querystring-builder": "^4.0.5", + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/property-provider": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.5.tgz", + "integrity": "sha512-R/bswf59T/n9ZgfgUICAZoWYKBHcsVDurAGX88zsiUtOTA/xUAPyiT+qkNCPwFn43pZqN84M4MiUsbSGQmgFIQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/protocol-http": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.3.tgz", + "integrity": "sha512-fCJd2ZR7D22XhDY0l+92pUag/7je2BztPRQ01gU5bMChcyI0rlly7QFibnYHzcxDvccMjlpM/Q1ev8ceRIb48w==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/querystring-builder": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.5.tgz", + "integrity": "sha512-NJeSCU57piZ56c+/wY+AbAw6rxCCAOZLCIniRE7wqvndqxcKKDOXzwWjrY7wGKEISfhL9gBbAaWWgHsUGedk+A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.3.2", + "@smithy/util-uri-escape": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/querystring-parser": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.0.5.tgz", + "integrity": "sha512-6SV7md2CzNG/WUeTjVe6Dj8noH32r4MnUeFKZrnVYsQxpGSIcphAanQMayi8jJLZAWm6pdM9ZXvKCpWOsIGg0w==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/shared-ini-file-loader": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.5.tgz", + "integrity": "sha512-YVVwehRDuehgoXdEL4r1tAAzdaDgaC9EQvhK0lEbfnbrd0bd5+CTQumbdPryX3J2shT7ZqQE+jPW4lmNBAB8JQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/smithy-client": { + "version": "4.4.10", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.4.10.tgz", + "integrity": "sha512-iW6HjXqN0oPtRS0NK/zzZ4zZeGESIFcxj2FkWed3mcK8jdSdHzvnCKXSjvewESKAgGKAbJRA+OsaqKhkdYRbQQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^3.8.0", + "@smithy/middleware-endpoint": "^4.1.18", + "@smithy/middleware-stack": "^4.0.5", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", + "@smithy/util-stream": "^4.2.4", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/types": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/url-parser": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.0.5.tgz", + "integrity": "sha512-j+733Um7f1/DXjYhCbvNXABV53NyCRRA54C7bNEIxNPs0YjfRxeMKjjgm2jvTYrciZyCjsicHwQ6Q0ylo+NAUw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/querystring-parser": "^4.0.5", + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/util-base64": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.0.0.tgz", + "integrity": "sha512-CvHfCmO2mchox9kjrtzoHkWHxjHZzaFojLc8quxXY7WAAMAg43nuxwv95tATVgQFNDwd4M9S1qFzj40Ul41Kmg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^4.0.0", + "@smithy/util-utf8": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/util-body-length-browser": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.0.0.tgz", + "integrity": "sha512-sNi3DL0/k64/LO3A256M+m3CDdG6V7WKWHdAiBBMUN8S3hK3aMPhwnPik2A/a2ONN+9doY9UxaLfgqsIRg69QA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/util-buffer-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.0.0.tgz", + "integrity": "sha512-9TOQ7781sZvddgO8nxueKi3+yGvkY35kotA0Y6BWRajAv8jjmigQ1sBwz0UX47pQMYXJPahSKEKYFgt+rXdcug==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/util-hex-encoding": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.0.0.tgz", + "integrity": "sha512-Yk5mLhHtfIgW2W2WQZWSg5kuMZCVbvhFmC7rV4IO2QqnZdbEFPmQnCcGMAX2z/8Qj3B9hYYNjZOhWym+RwhePw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/util-middleware": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.5.tgz", + "integrity": "sha512-N40PfqsZHRSsByGB81HhSo+uvMxEHT+9e255S53pfBw/wI6WKDI7Jw9oyu5tJTLwZzV5DsMha3ji8jk9dsHmQQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/util-stream": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.2.4.tgz", + "integrity": "sha512-vSKnvNZX2BXzl0U2RgCLOwWaAP9x/ddd/XobPK02pCbzRm5s55M53uwb1rl/Ts7RXZvdJZerPkA+en2FDghLuQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/fetch-http-handler": "^5.1.1", + "@smithy/node-http-handler": "^4.1.1", + "@smithy/types": "^4.3.2", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-buffer-from": "^4.0.0", + "@smithy/util-hex-encoding": "^4.0.0", + "@smithy/util-utf8": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/util-uri-escape": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.0.0.tgz", + "integrity": "sha512-77yfbCbQMtgtTylO9itEAdpPXSog3ZxMe09AEhm0dU0NLTalV70ghDZFR+Nfi1C60jnJoh/Re4090/DuZh2Omg==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/util-utf8": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.0.0.tgz", + "integrity": "sha512-b+zebfKCfRdgNJDknHCob3O7FpeYQN6ZG6YLExMcasDHsCXlsXCEuiPZeLnJLpwa5dvPetGlnGCiMHuLwGvFow==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.862.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.862.0.tgz", + "integrity": "sha512-LkpZ2S9DQCTHTPu1p0Qg5bM5DN/b/cEflW269RoeuYpiznxdV8r/mqYuhh/VPXQKkBZdiILe4/OODtg+vk4S0A==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.862.0", + "@aws-sdk/credential-provider-env": "3.862.0", + "@aws-sdk/credential-provider-http": "3.862.0", + "@aws-sdk/credential-provider-process": "3.862.0", + "@aws-sdk/credential-provider-sso": "3.862.0", + "@aws-sdk/credential-provider-web-identity": "3.862.0", + "@aws-sdk/nested-clients": "3.862.0", + "@aws-sdk/types": "3.862.0", + "@smithy/credential-provider-imds": "^4.0.7", + "@smithy/property-provider": "^4.0.5", + "@smithy/shared-ini-file-loader": "^4.0.5", + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/credential-provider-imds": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.0.7.tgz", + "integrity": "sha512-dDzrMXA8d8riFNiPvytxn0mNwR4B3h8lgrQ5UjAGu6T9z/kRg/Xncf4tEQHE/+t25sY8IH3CowcmWi+1U5B1Gw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.1.4", + "@smithy/property-provider": "^4.0.5", + "@smithy/types": "^4.3.2", + "@smithy/url-parser": "^4.0.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/node-config-provider": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.4.tgz", + "integrity": "sha512-+UDQV/k42jLEPPHSn39l0Bmc4sB1xtdI9Gd47fzo/0PbXzJ7ylgaOByVjF5EeQIumkepnrJyfx86dPa9p47Y+w==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/property-provider": "^4.0.5", + "@smithy/shared-ini-file-loader": "^4.0.5", + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/property-provider": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.5.tgz", + "integrity": "sha512-R/bswf59T/n9ZgfgUICAZoWYKBHcsVDurAGX88zsiUtOTA/xUAPyiT+qkNCPwFn43pZqN84M4MiUsbSGQmgFIQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/querystring-parser": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.0.5.tgz", + "integrity": "sha512-6SV7md2CzNG/WUeTjVe6Dj8noH32r4MnUeFKZrnVYsQxpGSIcphAanQMayi8jJLZAWm6pdM9ZXvKCpWOsIGg0w==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/shared-ini-file-loader": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.5.tgz", + "integrity": "sha512-YVVwehRDuehgoXdEL4r1tAAzdaDgaC9EQvhK0lEbfnbrd0bd5+CTQumbdPryX3J2shT7ZqQE+jPW4lmNBAB8JQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/types": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/url-parser": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.0.5.tgz", + "integrity": "sha512-j+733Um7f1/DXjYhCbvNXABV53NyCRRA54C7bNEIxNPs0YjfRxeMKjjgm2jvTYrciZyCjsicHwQ6Q0ylo+NAUw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/querystring-parser": "^4.0.5", + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-node": { + "version": "3.862.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.862.0.tgz", + "integrity": "sha512-4+X/LdEGPCBMlhn6MCcNJ5yJ8k+yDXeSO1l9X49NNQiG60SH/yObB3VvotcHWC+A3EEZx4dOw/ylcPt86e7Irg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.862.0", + "@aws-sdk/credential-provider-http": "3.862.0", + "@aws-sdk/credential-provider-ini": "3.862.0", + "@aws-sdk/credential-provider-process": "3.862.0", + "@aws-sdk/credential-provider-sso": "3.862.0", + "@aws-sdk/credential-provider-web-identity": "3.862.0", + "@aws-sdk/types": "3.862.0", + "@smithy/credential-provider-imds": "^4.0.7", + "@smithy/property-provider": "^4.0.5", + "@smithy/shared-ini-file-loader": "^4.0.5", + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-node/node_modules/@smithy/credential-provider-imds": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.0.7.tgz", + "integrity": "sha512-dDzrMXA8d8riFNiPvytxn0mNwR4B3h8lgrQ5UjAGu6T9z/kRg/Xncf4tEQHE/+t25sY8IH3CowcmWi+1U5B1Gw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.1.4", + "@smithy/property-provider": "^4.0.5", + "@smithy/types": "^4.3.2", + "@smithy/url-parser": "^4.0.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-node/node_modules/@smithy/node-config-provider": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.4.tgz", + "integrity": "sha512-+UDQV/k42jLEPPHSn39l0Bmc4sB1xtdI9Gd47fzo/0PbXzJ7ylgaOByVjF5EeQIumkepnrJyfx86dPa9p47Y+w==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/property-provider": "^4.0.5", + "@smithy/shared-ini-file-loader": "^4.0.5", + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-node/node_modules/@smithy/property-provider": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.5.tgz", + "integrity": "sha512-R/bswf59T/n9ZgfgUICAZoWYKBHcsVDurAGX88zsiUtOTA/xUAPyiT+qkNCPwFn43pZqN84M4MiUsbSGQmgFIQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-node/node_modules/@smithy/querystring-parser": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.0.5.tgz", + "integrity": "sha512-6SV7md2CzNG/WUeTjVe6Dj8noH32r4MnUeFKZrnVYsQxpGSIcphAanQMayi8jJLZAWm6pdM9ZXvKCpWOsIGg0w==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-node/node_modules/@smithy/shared-ini-file-loader": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.5.tgz", + "integrity": "sha512-YVVwehRDuehgoXdEL4r1tAAzdaDgaC9EQvhK0lEbfnbrd0bd5+CTQumbdPryX3J2shT7ZqQE+jPW4lmNBAB8JQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-node/node_modules/@smithy/types": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-node/node_modules/@smithy/url-parser": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.0.5.tgz", + "integrity": "sha512-j+733Um7f1/DXjYhCbvNXABV53NyCRRA54C7bNEIxNPs0YjfRxeMKjjgm2jvTYrciZyCjsicHwQ6Q0ylo+NAUw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/querystring-parser": "^4.0.5", + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-process": { + "version": "3.862.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.862.0.tgz", + "integrity": "sha512-bR/eRCjRsilAuaUpNzTWWE4sUxJC4k571+4LLxE6Xo+0oYHfH+Ih00+sQRX06s4SqZZROdppissm3OOr5d26qA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.862.0", + "@aws-sdk/types": "3.862.0", + "@smithy/property-provider": "^4.0.5", + "@smithy/shared-ini-file-loader": "^4.0.5", + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-process/node_modules/@smithy/property-provider": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.5.tgz", + "integrity": "sha512-R/bswf59T/n9ZgfgUICAZoWYKBHcsVDurAGX88zsiUtOTA/xUAPyiT+qkNCPwFn43pZqN84M4MiUsbSGQmgFIQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-process/node_modules/@smithy/shared-ini-file-loader": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.5.tgz", + "integrity": "sha512-YVVwehRDuehgoXdEL4r1tAAzdaDgaC9EQvhK0lEbfnbrd0bd5+CTQumbdPryX3J2shT7ZqQE+jPW4lmNBAB8JQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-process/node_modules/@smithy/types": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.862.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.862.0.tgz", + "integrity": "sha512-1E1rTKWJAbzN/uiIXFPCVAS2PrZgy87O6BEO69404bI7o/iYHOfohfn66bdSqBnZ7Tn/hFJdCk6i23U3pibf5w==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/client-sso": "3.862.0", + "@aws-sdk/core": "3.862.0", + "@aws-sdk/token-providers": "3.862.0", + "@aws-sdk/types": "3.862.0", + "@smithy/property-provider": "^4.0.5", + "@smithy/shared-ini-file-loader": "^4.0.5", + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-sso/node_modules/@smithy/property-provider": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.5.tgz", + "integrity": "sha512-R/bswf59T/n9ZgfgUICAZoWYKBHcsVDurAGX88zsiUtOTA/xUAPyiT+qkNCPwFn43pZqN84M4MiUsbSGQmgFIQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-sso/node_modules/@smithy/shared-ini-file-loader": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.5.tgz", + "integrity": "sha512-YVVwehRDuehgoXdEL4r1tAAzdaDgaC9EQvhK0lEbfnbrd0bd5+CTQumbdPryX3J2shT7ZqQE+jPW4lmNBAB8JQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-sso/node_modules/@smithy/types": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.862.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.862.0.tgz", + "integrity": "sha512-Skv07eOS4usDf/Bna3FWKIo0/35qhxb22Z/OxrbNtx2Hxa/upp42S+Y6fA9qzgLqXMNYDZngKYwwMPtzrbkMAg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.862.0", + "@aws-sdk/nested-clients": "3.862.0", + "@aws-sdk/types": "3.862.0", + "@smithy/property-provider": "^4.0.5", + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-web-identity/node_modules/@smithy/property-provider": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.5.tgz", + "integrity": "sha512-R/bswf59T/n9ZgfgUICAZoWYKBHcsVDurAGX88zsiUtOTA/xUAPyiT+qkNCPwFn43pZqN84M4MiUsbSGQmgFIQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-web-identity/node_modules/@smithy/types": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-providers": { + "version": "3.624.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/client-cognito-identity": "3.624.0", + "@aws-sdk/client-sso": "3.624.0", + "@aws-sdk/client-sts": "3.624.0", + "@aws-sdk/credential-provider-cognito-identity": "3.624.0", + "@aws-sdk/credential-provider-env": "3.620.1", + "@aws-sdk/credential-provider-http": "3.622.0", + "@aws-sdk/credential-provider-ini": "3.624.0", + "@aws-sdk/credential-provider-node": "3.624.0", + "@aws-sdk/credential-provider-process": "3.620.1", + "@aws-sdk/credential-provider-sso": "3.624.0", + "@aws-sdk/credential-provider-web-identity": "3.621.0", + "@aws-sdk/types": "3.609.0", + "@smithy/credential-provider-imds": "^3.2.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/client-sso": { + "version": "3.624.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.624.0", + "@aws-sdk/middleware-host-header": "3.620.0", + "@aws-sdk/middleware-logger": "3.609.0", + "@aws-sdk/middleware-recursion-detection": "3.620.0", + "@aws-sdk/middleware-user-agent": "3.620.0", + "@aws-sdk/region-config-resolver": "3.614.0", + "@aws-sdk/types": "3.609.0", + "@aws-sdk/util-endpoints": "3.614.0", + "@aws-sdk/util-user-agent-browser": "3.609.0", + "@aws-sdk/util-user-agent-node": "3.614.0", + "@smithy/config-resolver": "^3.0.5", + "@smithy/core": "^2.3.2", + "@smithy/fetch-http-handler": "^3.2.4", + "@smithy/hash-node": "^3.0.3", + "@smithy/invalid-dependency": "^3.0.3", + "@smithy/middleware-content-length": "^3.0.5", + "@smithy/middleware-endpoint": "^3.1.0", + "@smithy/middleware-retry": "^3.0.14", + "@smithy/middleware-serde": "^3.0.3", + "@smithy/middleware-stack": "^3.0.3", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/node-http-handler": "^3.1.4", + "@smithy/protocol-http": "^4.1.0", + "@smithy/smithy-client": "^3.1.12", + "@smithy/types": "^3.3.0", + "@smithy/url-parser": "^3.0.3", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-body-length-node": "^3.0.0", + "@smithy/util-defaults-mode-browser": "^3.0.14", + "@smithy/util-defaults-mode-node": "^3.0.14", + "@smithy/util-endpoints": "^2.0.5", + "@smithy/util-middleware": "^3.0.3", + "@smithy/util-retry": "^3.0.3", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/client-sso-oidc": { + "version": "3.624.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.624.0", + "@aws-sdk/credential-provider-node": "3.624.0", + "@aws-sdk/middleware-host-header": "3.620.0", + "@aws-sdk/middleware-logger": "3.609.0", + "@aws-sdk/middleware-recursion-detection": "3.620.0", + "@aws-sdk/middleware-user-agent": "3.620.0", + "@aws-sdk/region-config-resolver": "3.614.0", + "@aws-sdk/types": "3.609.0", + "@aws-sdk/util-endpoints": "3.614.0", + "@aws-sdk/util-user-agent-browser": "3.609.0", + "@aws-sdk/util-user-agent-node": "3.614.0", + "@smithy/config-resolver": "^3.0.5", + "@smithy/core": "^2.3.2", + "@smithy/fetch-http-handler": "^3.2.4", + "@smithy/hash-node": "^3.0.3", + "@smithy/invalid-dependency": "^3.0.3", + "@smithy/middleware-content-length": "^3.0.5", + "@smithy/middleware-endpoint": "^3.1.0", + "@smithy/middleware-retry": "^3.0.14", + "@smithy/middleware-serde": "^3.0.3", + "@smithy/middleware-stack": "^3.0.3", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/node-http-handler": "^3.1.4", + "@smithy/protocol-http": "^4.1.0", + "@smithy/smithy-client": "^3.1.12", + "@smithy/types": "^3.3.0", + "@smithy/url-parser": "^3.0.3", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-body-length-node": "^3.0.0", + "@smithy/util-defaults-mode-browser": "^3.0.14", + "@smithy/util-defaults-mode-node": "^3.0.14", + "@smithy/util-endpoints": "^2.0.5", + "@smithy/util-middleware": "^3.0.3", + "@smithy/util-retry": "^3.0.3", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sts": "^3.624.0" + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/client-sts": { + "version": "3.624.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/client-sso-oidc": "3.624.0", + "@aws-sdk/core": "3.624.0", + "@aws-sdk/credential-provider-node": "3.624.0", + "@aws-sdk/middleware-host-header": "3.620.0", + "@aws-sdk/middleware-logger": "3.609.0", + "@aws-sdk/middleware-recursion-detection": "3.620.0", + "@aws-sdk/middleware-user-agent": "3.620.0", + "@aws-sdk/region-config-resolver": "3.614.0", + "@aws-sdk/types": "3.609.0", + "@aws-sdk/util-endpoints": "3.614.0", + "@aws-sdk/util-user-agent-browser": "3.609.0", + "@aws-sdk/util-user-agent-node": "3.614.0", + "@smithy/config-resolver": "^3.0.5", + "@smithy/core": "^2.3.2", + "@smithy/fetch-http-handler": "^3.2.4", + "@smithy/hash-node": "^3.0.3", + "@smithy/invalid-dependency": "^3.0.3", + "@smithy/middleware-content-length": "^3.0.5", + "@smithy/middleware-endpoint": "^3.1.0", + "@smithy/middleware-retry": "^3.0.14", + "@smithy/middleware-serde": "^3.0.3", + "@smithy/middleware-stack": "^3.0.3", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/node-http-handler": "^3.1.4", + "@smithy/protocol-http": "^4.1.0", + "@smithy/smithy-client": "^3.1.12", "@smithy/types": "^3.3.0", "@smithy/url-parser": "^3.0.3", "@smithy/util-base64": "^3.0.0", @@ -339,1342 +5933,1685 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/client-sso-oidc": { - "version": "3.624.0", + "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/core": { + "version": "3.624.0", + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^2.3.2", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/protocol-http": "^4.1.0", + "@smithy/signature-v4": "^4.1.0", + "@smithy/smithy-client": "^3.1.12", + "@smithy/types": "^3.3.0", + "@smithy/util-middleware": "^3.0.3", + "fast-xml-parser": "4.4.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/credential-provider-env": { + "version": "3.620.1", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/credential-provider-http": { + "version": "3.622.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/fetch-http-handler": "^3.2.4", + "@smithy/node-http-handler": "^3.1.4", + "@smithy/property-provider": "^3.1.3", + "@smithy/protocol-http": "^4.1.0", + "@smithy/smithy-client": "^3.1.12", + "@smithy/types": "^3.3.0", + "@smithy/util-stream": "^3.1.3", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.624.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.620.1", + "@aws-sdk/credential-provider-http": "3.622.0", + "@aws-sdk/credential-provider-process": "3.620.1", + "@aws-sdk/credential-provider-sso": "3.624.0", + "@aws-sdk/credential-provider-web-identity": "3.621.0", + "@aws-sdk/types": "3.609.0", + "@smithy/credential-provider-imds": "^3.2.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sts": "^3.624.0" + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/credential-provider-node": { + "version": "3.624.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.620.1", + "@aws-sdk/credential-provider-http": "3.622.0", + "@aws-sdk/credential-provider-ini": "3.624.0", + "@aws-sdk/credential-provider-process": "3.620.1", + "@aws-sdk/credential-provider-sso": "3.624.0", + "@aws-sdk/credential-provider-web-identity": "3.621.0", + "@aws-sdk/types": "3.609.0", + "@smithy/credential-provider-imds": "^3.2.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/credential-provider-process": { + "version": "3.620.1", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.624.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/client-sso": "3.624.0", + "@aws-sdk/token-providers": "3.614.0", + "@aws-sdk/types": "3.609.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.621.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sts": "^3.621.0" + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/middleware-host-header": { + "version": "3.620.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/protocol-http": "^4.1.0", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/middleware-logger": { + "version": "3.609.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.620.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/protocol-http": "^4.1.0", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.620.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@aws-sdk/util-endpoints": "3.614.0", + "@smithy/protocol-http": "^4.1.0", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/region-config-resolver": { + "version": "3.614.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/types": "^3.3.0", + "@smithy/util-config-provider": "^3.0.0", + "@smithy/util-middleware": "^3.0.3", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/token-providers": { + "version": "3.614.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sso-oidc": "^3.614.0" + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/types": { + "version": "3.609.0", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/util-endpoints": { + "version": "3.614.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/types": "^3.3.0", + "@smithy/util-endpoints": "^2.0.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.609.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/types": "^3.3.0", + "bowser": "^2.11.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.614.0", "license": "Apache-2.0", "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.624.0", - "@aws-sdk/credential-provider-node": "3.624.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.620.0", - "@aws-sdk/region-config-resolver": "3.614.0", "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.614.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.3.2", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.14", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.1.12", "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.14", - "@smithy/util-defaults-mode-node": "^3.0.14", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" }, "peerDependencies": { - "@aws-sdk/client-sts": "^3.624.0" + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/client-sts": { - "version": "3.624.0", + "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/signature-v4": { + "version": "4.1.0", "license": "Apache-2.0", "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.624.0", - "@aws-sdk/core": "3.624.0", - "@aws-sdk/credential-provider-node": "3.624.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.620.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.614.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.3.2", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.14", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", + "@smithy/is-array-buffer": "^3.0.0", "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.1.12", "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.14", - "@smithy/util-defaults-mode-node": "^3.0.14", - "@smithy/util-endpoints": "^2.0.5", + "@smithy/util-hex-encoding": "^3.0.0", "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", + "@smithy/util-uri-escape": "^3.0.0", "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/middleware-host-header": { + "version": "3.862.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.862.0.tgz", + "integrity": "sha512-jDje8dCFeFHfuCAxMDXBs8hy8q9NCTlyK4ThyyfAj3U4Pixly2mmzY2u7b7AyGhWsjJNx8uhTjlYq5zkQPQCYw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.862.0", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/middleware-host-header/node_modules/@smithy/protocol-http": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.3.tgz", + "integrity": "sha512-fCJd2ZR7D22XhDY0l+92pUag/7je2BztPRQ01gU5bMChcyI0rlly7QFibnYHzcxDvccMjlpM/Q1ev8ceRIb48w==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/middleware-host-header/node_modules/@smithy/types": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/middleware-logger": { + "version": "3.862.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.862.0.tgz", + "integrity": "sha512-N/bXSJznNBR/i7Ofmf9+gM6dx/SPBK09ZWLKsW5iQjqKxAKn/2DozlnE54uiEs1saHZWoNDRg69Ww4XYYSlG1Q==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.862.0", + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/middleware-logger/node_modules/@smithy/types": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.862.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.862.0.tgz", + "integrity": "sha512-KVoo3IOzEkTq97YKM4uxZcYFSNnMkhW/qj22csofLegZi5fk90ztUnnaeKfaEJHfHp/tm1Y3uSoOXH45s++kKQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.862.0", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/middleware-recursion-detection/node_modules/@smithy/protocol-http": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.3.tgz", + "integrity": "sha512-fCJd2ZR7D22XhDY0l+92pUag/7je2BztPRQ01gU5bMChcyI0rlly7QFibnYHzcxDvccMjlpM/Q1ev8ceRIb48w==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/middleware-recursion-detection/node_modules/@smithy/types": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.862.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.862.0.tgz", + "integrity": "sha512-7OOaGbAw7Kg1zoKO9wV8cA5NnJC+RYsocjmP3FZ0FiKa7gbmeQ6Cfheunzd1Re9fgelgL3OIRjqO5mSmOIhyhA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.862.0", + "@aws-sdk/types": "3.862.0", + "@aws-sdk/util-endpoints": "3.862.0", + "@smithy/core": "^3.8.0", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/middleware-user-agent/node_modules/@smithy/abort-controller": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.5.tgz", + "integrity": "sha512-jcrqdTQurIrBbUm4W2YdLVMQDoL0sA9DTxYd2s+R/y+2U9NLOP7Xf/YqfSg1FZhlZIYEnvk2mwbyvIfdLEPo8g==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/middleware-user-agent/node_modules/@smithy/core": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.8.0.tgz", + "integrity": "sha512-EYqsIYJmkR1VhVE9pccnk353xhs+lB6btdutJEtsp7R055haMJp2yE16eSxw8fv+G0WUY6vqxyYOP8kOqawxYQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/middleware-serde": "^4.0.9", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-body-length-browser": "^4.0.0", + "@smithy/util-middleware": "^4.0.5", + "@smithy/util-stream": "^4.2.4", + "@smithy/util-utf8": "^4.0.0", + "@types/uuid": "^9.0.1", + "tslib": "^2.6.2", + "uuid": "^9.0.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/middleware-user-agent/node_modules/@smithy/fetch-http-handler": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.1.1.tgz", + "integrity": "sha512-61WjM0PWmZJR+SnmzaKI7t7G0UkkNFboDpzIdzSoy7TByUzlxo18Qlh9s71qug4AY4hlH/CwXdubMtkcNEb/sQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^5.1.3", + "@smithy/querystring-builder": "^4.0.5", + "@smithy/types": "^4.3.2", + "@smithy/util-base64": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/middleware-user-agent/node_modules/@smithy/is-array-buffer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.0.0.tgz", + "integrity": "sha512-saYhF8ZZNoJDTvJBEWgeBccCg+yvp1CX+ed12yORU3NilJScfc6gfch2oVb4QgxZrGUx3/ZJlb+c/dJbyupxlw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/middleware-user-agent/node_modules/@smithy/middleware-serde": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.0.9.tgz", + "integrity": "sha512-uAFFR4dpeoJPGz8x9mhxp+RPjo5wW0QEEIPPPbLXiRRWeCATf/Km3gKIVR5vaP8bN1kgsPhcEeh+IZvUlBv6Xg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/middleware-user-agent/node_modules/@smithy/node-http-handler": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.1.1.tgz", + "integrity": "sha512-RHnlHqFpoVdjSPPiYy/t40Zovf3BBHc2oemgD7VsVTFFZrU5erFFe0n52OANZZ/5sbshgD93sOh5r6I35Xmpaw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/abort-controller": "^4.0.5", + "@smithy/protocol-http": "^5.1.3", + "@smithy/querystring-builder": "^4.0.5", + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/middleware-user-agent/node_modules/@smithy/protocol-http": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.3.tgz", + "integrity": "sha512-fCJd2ZR7D22XhDY0l+92pUag/7je2BztPRQ01gU5bMChcyI0rlly7QFibnYHzcxDvccMjlpM/Q1ev8ceRIb48w==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/middleware-user-agent/node_modules/@smithy/querystring-builder": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.5.tgz", + "integrity": "sha512-NJeSCU57piZ56c+/wY+AbAw6rxCCAOZLCIniRE7wqvndqxcKKDOXzwWjrY7wGKEISfhL9gBbAaWWgHsUGedk+A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.3.2", + "@smithy/util-uri-escape": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/middleware-user-agent/node_modules/@smithy/types": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/core": { - "version": "3.624.0", + "node_modules/@aws-sdk/middleware-user-agent/node_modules/@smithy/util-base64": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.0.0.tgz", + "integrity": "sha512-CvHfCmO2mchox9kjrtzoHkWHxjHZzaFojLc8quxXY7WAAMAg43nuxwv95tATVgQFNDwd4M9S1qFzj40Ul41Kmg==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^2.3.2", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/signature-v4": "^4.1.0", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", - "@smithy/util-middleware": "^3.0.3", - "fast-xml-parser": "4.4.1", + "@smithy/util-buffer-from": "^4.0.0", + "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/credential-provider-env": { - "version": "3.620.1", + "node_modules/@aws-sdk/middleware-user-agent/node_modules/@smithy/util-body-length-browser": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.0.0.tgz", + "integrity": "sha512-sNi3DL0/k64/LO3A256M+m3CDdG6V7WKWHdAiBBMUN8S3hK3aMPhwnPik2A/a2ONN+9doY9UxaLfgqsIRg69QA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/credential-provider-http": { - "version": "3.622.0", + "node_modules/@aws-sdk/middleware-user-agent/node_modules/@smithy/util-buffer-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.0.0.tgz", + "integrity": "sha512-9TOQ7781sZvddgO8nxueKi3+yGvkY35kotA0Y6BWRajAv8jjmigQ1sBwz0UX47pQMYXJPahSKEKYFgt+rXdcug==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/property-provider": "^3.1.3", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", - "@smithy/util-stream": "^3.1.3", + "@smithy/is-array-buffer": "^4.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.624.0", + "node_modules/@aws-sdk/middleware-user-agent/node_modules/@smithy/util-hex-encoding": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.0.0.tgz", + "integrity": "sha512-Yk5mLhHtfIgW2W2WQZWSg5kuMZCVbvhFmC7rV4IO2QqnZdbEFPmQnCcGMAX2z/8Qj3B9hYYNjZOhWym+RwhePw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/credential-provider-env": "3.620.1", - "@aws-sdk/credential-provider-http": "3.622.0", - "@aws-sdk/credential-provider-process": "3.620.1", - "@aws-sdk/credential-provider-sso": "3.624.0", - "@aws-sdk/credential-provider-web-identity": "3.621.0", - "@aws-sdk/types": "3.609.0", - "@smithy/credential-provider-imds": "^3.2.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/middleware-user-agent/node_modules/@smithy/util-middleware": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.5.tgz", + "integrity": "sha512-N40PfqsZHRSsByGB81HhSo+uvMxEHT+9e255S53pfBw/wI6WKDI7Jw9oyu5tJTLwZzV5DsMha3ji8jk9dsHmQQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.624.0" + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/credential-provider-node": { - "version": "3.624.0", + "node_modules/@aws-sdk/middleware-user-agent/node_modules/@smithy/util-stream": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.2.4.tgz", + "integrity": "sha512-vSKnvNZX2BXzl0U2RgCLOwWaAP9x/ddd/XobPK02pCbzRm5s55M53uwb1rl/Ts7RXZvdJZerPkA+en2FDghLuQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/credential-provider-env": "3.620.1", - "@aws-sdk/credential-provider-http": "3.622.0", - "@aws-sdk/credential-provider-ini": "3.624.0", - "@aws-sdk/credential-provider-process": "3.620.1", - "@aws-sdk/credential-provider-sso": "3.624.0", - "@aws-sdk/credential-provider-web-identity": "3.621.0", - "@aws-sdk/types": "3.609.0", - "@smithy/credential-provider-imds": "^3.2.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", + "@smithy/fetch-http-handler": "^5.1.1", + "@smithy/node-http-handler": "^4.1.1", + "@smithy/types": "^4.3.2", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-buffer-from": "^4.0.0", + "@smithy/util-hex-encoding": "^4.0.0", + "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/credential-provider-process": { - "version": "3.620.1", + "node_modules/@aws-sdk/middleware-user-agent/node_modules/@smithy/util-uri-escape": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.0.0.tgz", + "integrity": "sha512-77yfbCbQMtgtTylO9itEAdpPXSog3ZxMe09AEhm0dU0NLTalV70ghDZFR+Nfi1C60jnJoh/Re4090/DuZh2Omg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.624.0", + "node_modules/@aws-sdk/middleware-user-agent/node_modules/@smithy/util-utf8": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.0.0.tgz", + "integrity": "sha512-b+zebfKCfRdgNJDknHCob3O7FpeYQN6ZG6YLExMcasDHsCXlsXCEuiPZeLnJLpwa5dvPetGlnGCiMHuLwGvFow==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/client-sso": "3.624.0", - "@aws-sdk/token-providers": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", + "@smithy/util-buffer-from": "^4.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.621.0", + "node_modules/@aws-sdk/nested-clients": { + "version": "3.862.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.862.0.tgz", + "integrity": "sha512-fPrfXa+m9S0DA5l8+p4A9NFQ22lEHm/ezaUWWWs6F3/U49lR6yKhNAGji3LlIG7b7ZdTJ3smAcaxNHclJsoQIg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/types": "^3.3.0", + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.862.0", + "@aws-sdk/middleware-host-header": "3.862.0", + "@aws-sdk/middleware-logger": "3.862.0", + "@aws-sdk/middleware-recursion-detection": "3.862.0", + "@aws-sdk/middleware-user-agent": "3.862.0", + "@aws-sdk/region-config-resolver": "3.862.0", + "@aws-sdk/types": "3.862.0", + "@aws-sdk/util-endpoints": "3.862.0", + "@aws-sdk/util-user-agent-browser": "3.862.0", + "@aws-sdk/util-user-agent-node": "3.862.0", + "@smithy/config-resolver": "^4.1.5", + "@smithy/core": "^3.8.0", + "@smithy/fetch-http-handler": "^5.1.1", + "@smithy/hash-node": "^4.0.5", + "@smithy/invalid-dependency": "^4.0.5", + "@smithy/middleware-content-length": "^4.0.5", + "@smithy/middleware-endpoint": "^4.1.18", + "@smithy/middleware-retry": "^4.1.19", + "@smithy/middleware-serde": "^4.0.9", + "@smithy/middleware-stack": "^4.0.5", + "@smithy/node-config-provider": "^4.1.4", + "@smithy/node-http-handler": "^4.1.1", + "@smithy/protocol-http": "^5.1.3", + "@smithy/smithy-client": "^4.4.10", + "@smithy/types": "^4.3.2", + "@smithy/url-parser": "^4.0.5", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-body-length-browser": "^4.0.0", + "@smithy/util-body-length-node": "^4.0.0", + "@smithy/util-defaults-mode-browser": "^4.0.26", + "@smithy/util-defaults-mode-node": "^4.0.26", + "@smithy/util-endpoints": "^3.0.7", + "@smithy/util-middleware": "^4.0.5", + "@smithy/util-retry": "^4.0.7", + "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/abort-controller": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.5.tgz", + "integrity": "sha512-jcrqdTQurIrBbUm4W2YdLVMQDoL0sA9DTxYd2s+R/y+2U9NLOP7Xf/YqfSg1FZhlZIYEnvk2mwbyvIfdLEPo8g==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.621.0" + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/middleware-host-header": { - "version": "3.620.0", + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/config-resolver": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.1.5.tgz", + "integrity": "sha512-viuHMxBAqydkB0AfWwHIdwf/PRH2z5KHGUzqyRtS/Wv+n3IHI993Sk76VCA7dD/+GzgGOmlJDITfPcJC1nIVIw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", + "@smithy/node-config-provider": "^4.1.4", + "@smithy/types": "^4.3.2", + "@smithy/util-config-provider": "^4.0.0", + "@smithy/util-middleware": "^4.0.5", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/middleware-logger": { - "version": "3.609.0", + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/core": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.8.0.tgz", + "integrity": "sha512-EYqsIYJmkR1VhVE9pccnk353xhs+lB6btdutJEtsp7R055haMJp2yE16eSxw8fv+G0WUY6vqxyYOP8kOqawxYQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/types": "^3.3.0", + "@smithy/middleware-serde": "^4.0.9", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-body-length-browser": "^4.0.0", + "@smithy/util-middleware": "^4.0.5", + "@smithy/util-stream": "^4.2.4", + "@smithy/util-utf8": "^4.0.0", + "@types/uuid": "^9.0.1", + "tslib": "^2.6.2", + "uuid": "^9.0.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/credential-provider-imds": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.0.7.tgz", + "integrity": "sha512-dDzrMXA8d8riFNiPvytxn0mNwR4B3h8lgrQ5UjAGu6T9z/kRg/Xncf4tEQHE/+t25sY8IH3CowcmWi+1U5B1Gw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.1.4", + "@smithy/property-provider": "^4.0.5", + "@smithy/types": "^4.3.2", + "@smithy/url-parser": "^4.0.5", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.620.0", + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/fetch-http-handler": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.1.1.tgz", + "integrity": "sha512-61WjM0PWmZJR+SnmzaKI7t7G0UkkNFboDpzIdzSoy7TByUzlxo18Qlh9s71qug4AY4hlH/CwXdubMtkcNEb/sQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", + "@smithy/protocol-http": "^5.1.3", + "@smithy/querystring-builder": "^4.0.5", + "@smithy/types": "^4.3.2", + "@smithy/util-base64": "^4.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.620.0", + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/hash-node": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.0.5.tgz", + "integrity": "sha512-cv1HHkKhpyRb6ahD8Vcfb2Hgz67vNIXEp2vnhzfxLFGRukLCNEA5QdsorbUEzXma1Rco0u3rx5VTqbM06GcZqQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.614.0", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", + "@smithy/types": "^4.3.2", + "@smithy/util-buffer-from": "^4.0.0", + "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/region-config-resolver": { - "version": "3.614.0", + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/invalid-dependency": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.0.5.tgz", + "integrity": "sha512-IVnb78Qtf7EJpoEVo7qJ8BEXQwgC4n3igeJNNKEj/MLYtapnx8A67Zt/J3RXAj2xSO1910zk0LdFiygSemuLow==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/types": "^3.3.0", - "@smithy/util-config-provider": "^3.0.0", - "@smithy/util-middleware": "^3.0.3", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/token-providers": { - "version": "3.614.0", + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/is-array-buffer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.0.0.tgz", + "integrity": "sha512-saYhF8ZZNoJDTvJBEWgeBccCg+yvp1CX+ed12yORU3NilJScfc6gfch2oVb4QgxZrGUx3/ZJlb+c/dJbyupxlw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/middleware-content-length": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.0.5.tgz", + "integrity": "sha512-l1jlNZoYzoCC7p0zCtBDE5OBXZ95yMKlRlftooE5jPWQn4YBPLgsp+oeHp7iMHaTGoUdFqmHOPa8c9G3gBsRpQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" }, - "peerDependencies": { - "@aws-sdk/client-sso-oidc": "^3.614.0" + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/types": { - "version": "3.609.0", + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/middleware-endpoint": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.1.18.tgz", + "integrity": "sha512-ZhvqcVRPZxnZlokcPaTwb+r+h4yOIOCJmx0v2d1bpVlmP465g3qpVSf7wxcq5zZdu4jb0H4yIMxuPwDJSQc3MQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^3.3.0", + "@smithy/core": "^3.8.0", + "@smithy/middleware-serde": "^4.0.9", + "@smithy/node-config-provider": "^4.1.4", + "@smithy/shared-ini-file-loader": "^4.0.5", + "@smithy/types": "^4.3.2", + "@smithy/url-parser": "^4.0.5", + "@smithy/util-middleware": "^4.0.5", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/util-endpoints": { - "version": "3.614.0", + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/middleware-retry": { + "version": "4.1.19", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.1.19.tgz", + "integrity": "sha512-X58zx/NVECjeuUB6A8HBu4bhx72EoUz+T5jTMIyeNKx2lf+Gs9TmWPNNkH+5QF0COjpInP/xSpJGJ7xEnAklQQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/types": "^3.3.0", - "@smithy/util-endpoints": "^2.0.5", + "@smithy/node-config-provider": "^4.1.4", + "@smithy/protocol-http": "^5.1.3", + "@smithy/service-error-classification": "^4.0.7", + "@smithy/smithy-client": "^4.4.10", + "@smithy/types": "^4.3.2", + "@smithy/util-middleware": "^4.0.5", + "@smithy/util-retry": "^4.0.7", + "@types/uuid": "^9.0.1", + "tslib": "^2.6.2", + "uuid": "^9.0.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/middleware-serde": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.0.9.tgz", + "integrity": "sha512-uAFFR4dpeoJPGz8x9mhxp+RPjo5wW0QEEIPPPbLXiRRWeCATf/Km3gKIVR5vaP8bN1kgsPhcEeh+IZvUlBv6Xg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.609.0", + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/middleware-stack": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.0.5.tgz", + "integrity": "sha512-/yoHDXZPh3ocRVyeWQFvC44u8seu3eYzZRveCMfgMOBcNKnAmOvjbL9+Cp5XKSIi9iYA9PECUuW2teDAk8T+OQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/types": "^3.3.0", - "bowser": "^2.11.0", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.614.0", + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/node-config-provider": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.4.tgz", + "integrity": "sha512-+UDQV/k42jLEPPHSn39l0Bmc4sB1xtdI9Gd47fzo/0PbXzJ7ylgaOByVjF5EeQIumkepnrJyfx86dPa9p47Y+w==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/types": "^3.3.0", + "@smithy/property-provider": "^4.0.5", + "@smithy/shared-ini-file-loader": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/node-http-handler": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.1.1.tgz", + "integrity": "sha512-RHnlHqFpoVdjSPPiYy/t40Zovf3BBHc2oemgD7VsVTFFZrU5erFFe0n52OANZZ/5sbshgD93sOh5r6I35Xmpaw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/abort-controller": "^4.0.5", + "@smithy/protocol-http": "^5.1.3", + "@smithy/querystring-builder": "^4.0.5", + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" }, - "peerDependencies": { - "aws-crt": ">=1.0.0" + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/property-provider": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.5.tgz", + "integrity": "sha512-R/bswf59T/n9ZgfgUICAZoWYKBHcsVDurAGX88zsiUtOTA/xUAPyiT+qkNCPwFn43pZqN84M4MiUsbSGQmgFIQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" }, - "peerDependenciesMeta": { - "aws-crt": { - "optional": true - } + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/signature-v4": { - "version": "4.1.0", + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/protocol-http": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.3.tgz", + "integrity": "sha512-fCJd2ZR7D22XhDY0l+92pUag/7je2BztPRQ01gU5bMChcyI0rlly7QFibnYHzcxDvccMjlpM/Q1ev8ceRIb48w==", "license": "Apache-2.0", "dependencies": { - "@smithy/is-array-buffer": "^3.0.0", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", - "@smithy/util-hex-encoding": "^3.0.0", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-uri-escape": "^3.0.0", - "@smithy/util-utf8": "^3.0.0", + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/querystring-builder": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.5.tgz", + "integrity": "sha512-NJeSCU57piZ56c+/wY+AbAw6rxCCAOZLCIniRE7wqvndqxcKKDOXzwWjrY7wGKEISfhL9gBbAaWWgHsUGedk+A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.3.2", + "@smithy/util-uri-escape": "^4.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-sso": { - "version": "3.598.0", + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/querystring-parser": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.0.5.tgz", + "integrity": "sha512-6SV7md2CzNG/WUeTjVe6Dj8noH32r4MnUeFKZrnVYsQxpGSIcphAanQMayi8jJLZAWm6pdM9ZXvKCpWOsIGg0w==", "license": "Apache-2.0", "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.598.0", - "@aws-sdk/middleware-host-header": "3.598.0", - "@aws-sdk/middleware-logger": "3.598.0", - "@aws-sdk/middleware-recursion-detection": "3.598.0", - "@aws-sdk/middleware-user-agent": "3.598.0", - "@aws-sdk/region-config-resolver": "3.598.0", - "@aws-sdk/types": "3.598.0", - "@aws-sdk/util-endpoints": "3.598.0", - "@aws-sdk/util-user-agent-browser": "3.598.0", - "@aws-sdk/util-user-agent-node": "3.598.0", - "@smithy/config-resolver": "^3.0.2", - "@smithy/core": "^2.2.1", - "@smithy/fetch-http-handler": "^3.0.2", - "@smithy/hash-node": "^3.0.1", - "@smithy/invalid-dependency": "^3.0.1", - "@smithy/middleware-content-length": "^3.0.1", - "@smithy/middleware-endpoint": "^3.0.2", - "@smithy/middleware-retry": "^3.0.4", - "@smithy/middleware-serde": "^3.0.1", - "@smithy/middleware-stack": "^3.0.1", - "@smithy/node-config-provider": "^3.1.1", - "@smithy/node-http-handler": "^3.0.1", - "@smithy/protocol-http": "^4.0.1", - "@smithy/smithy-client": "^3.1.2", - "@smithy/types": "^3.1.0", - "@smithy/url-parser": "^3.0.1", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.4", - "@smithy/util-defaults-mode-node": "^3.0.4", - "@smithy/util-endpoints": "^2.0.2", - "@smithy/util-middleware": "^3.0.1", - "@smithy/util-retry": "^3.0.1", - "@smithy/util-utf8": "^3.0.0", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-sso-oidc": { - "version": "3.600.0", + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/service-error-classification": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.0.7.tgz", + "integrity": "sha512-XvRHOipqpwNhEjDf2L5gJowZEm5nsxC16pAZOeEcsygdjv9A2jdOh3YoDQvOXBGTsaJk6mNWtzWalOB9976Wlg==", "license": "Apache-2.0", "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sts": "3.600.0", - "@aws-sdk/core": "3.598.0", - "@aws-sdk/credential-provider-node": "3.600.0", - "@aws-sdk/middleware-host-header": "3.598.0", - "@aws-sdk/middleware-logger": "3.598.0", - "@aws-sdk/middleware-recursion-detection": "3.598.0", - "@aws-sdk/middleware-user-agent": "3.598.0", - "@aws-sdk/region-config-resolver": "3.598.0", - "@aws-sdk/types": "3.598.0", - "@aws-sdk/util-endpoints": "3.598.0", - "@aws-sdk/util-user-agent-browser": "3.598.0", - "@aws-sdk/util-user-agent-node": "3.598.0", - "@smithy/config-resolver": "^3.0.2", - "@smithy/core": "^2.2.1", - "@smithy/fetch-http-handler": "^3.0.2", - "@smithy/hash-node": "^3.0.1", - "@smithy/invalid-dependency": "^3.0.1", - "@smithy/middleware-content-length": "^3.0.1", - "@smithy/middleware-endpoint": "^3.0.2", - "@smithy/middleware-retry": "^3.0.4", - "@smithy/middleware-serde": "^3.0.1", - "@smithy/middleware-stack": "^3.0.1", - "@smithy/node-config-provider": "^3.1.1", - "@smithy/node-http-handler": "^3.0.1", - "@smithy/protocol-http": "^4.0.1", - "@smithy/smithy-client": "^3.1.2", - "@smithy/types": "^3.1.0", - "@smithy/url-parser": "^3.0.1", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.4", - "@smithy/util-defaults-mode-node": "^3.0.4", - "@smithy/util-endpoints": "^2.0.2", - "@smithy/util-middleware": "^3.0.1", - "@smithy/util-retry": "^3.0.1", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" + "@smithy/types": "^4.3.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-sts": { - "version": "3.600.0", + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/shared-ini-file-loader": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.5.tgz", + "integrity": "sha512-YVVwehRDuehgoXdEL4r1tAAzdaDgaC9EQvhK0lEbfnbrd0bd5+CTQumbdPryX3J2shT7ZqQE+jPW4lmNBAB8JQ==", "license": "Apache-2.0", "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.600.0", - "@aws-sdk/core": "3.598.0", - "@aws-sdk/credential-provider-node": "3.600.0", - "@aws-sdk/middleware-host-header": "3.598.0", - "@aws-sdk/middleware-logger": "3.598.0", - "@aws-sdk/middleware-recursion-detection": "3.598.0", - "@aws-sdk/middleware-user-agent": "3.598.0", - "@aws-sdk/region-config-resolver": "3.598.0", - "@aws-sdk/types": "3.598.0", - "@aws-sdk/util-endpoints": "3.598.0", - "@aws-sdk/util-user-agent-browser": "3.598.0", - "@aws-sdk/util-user-agent-node": "3.598.0", - "@smithy/config-resolver": "^3.0.2", - "@smithy/core": "^2.2.1", - "@smithy/fetch-http-handler": "^3.0.2", - "@smithy/hash-node": "^3.0.1", - "@smithy/invalid-dependency": "^3.0.1", - "@smithy/middleware-content-length": "^3.0.1", - "@smithy/middleware-endpoint": "^3.0.2", - "@smithy/middleware-retry": "^3.0.4", - "@smithy/middleware-serde": "^3.0.1", - "@smithy/middleware-stack": "^3.0.1", - "@smithy/node-config-provider": "^3.1.1", - "@smithy/node-http-handler": "^3.0.1", - "@smithy/protocol-http": "^4.0.1", - "@smithy/smithy-client": "^3.1.2", - "@smithy/types": "^3.1.0", - "@smithy/url-parser": "^3.0.1", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.4", - "@smithy/util-defaults-mode-node": "^3.0.4", - "@smithy/util-endpoints": "^2.0.2", - "@smithy/util-middleware": "^3.0.1", - "@smithy/util-retry": "^3.0.1", - "@smithy/util-utf8": "^3.0.0", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/core": { - "version": "3.598.0", + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/smithy-client": { + "version": "4.4.10", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.4.10.tgz", + "integrity": "sha512-iW6HjXqN0oPtRS0NK/zzZ4zZeGESIFcxj2FkWed3mcK8jdSdHzvnCKXSjvewESKAgGKAbJRA+OsaqKhkdYRbQQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^2.2.1", - "@smithy/protocol-http": "^4.0.1", - "@smithy/signature-v4": "^3.1.0", - "@smithy/smithy-client": "^3.1.2", - "@smithy/types": "^3.1.0", - "fast-xml-parser": "4.2.5", + "@smithy/core": "^3.8.0", + "@smithy/middleware-endpoint": "^4.1.18", + "@smithy/middleware-stack": "^4.0.5", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", + "@smithy/util-stream": "^4.2.4", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/core/node_modules/fast-xml-parser": { - "version": "4.2.5", - "funding": [ - { - "type": "paypal", - "url": "https://paypal.me/naturalintelligence" - }, - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "license": "MIT", + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/types": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", + "license": "Apache-2.0", "dependencies": { - "strnum": "^1.0.5" + "tslib": "^2.6.2" }, - "bin": { - "fxparser": "src/cli/cli.js" + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-cognito-identity": { - "version": "3.624.0", + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/url-parser": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.0.5.tgz", + "integrity": "sha512-j+733Um7f1/DXjYhCbvNXABV53NyCRRA54C7bNEIxNPs0YjfRxeMKjjgm2jvTYrciZyCjsicHwQ6Q0ylo+NAUw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/client-cognito-identity": "3.624.0", - "@aws-sdk/types": "3.609.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/types": "^3.3.0", + "@smithy/querystring-parser": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@aws-sdk/types": { - "version": "3.609.0", + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/util-base64": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.0.0.tgz", + "integrity": "sha512-CvHfCmO2mchox9kjrtzoHkWHxjHZzaFojLc8quxXY7WAAMAg43nuxwv95tATVgQFNDwd4M9S1qFzj40Ul41Kmg==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^3.3.0", + "@smithy/util-buffer-from": "^4.0.0", + "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-env": { - "version": "3.598.0", + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/util-body-length-browser": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.0.0.tgz", + "integrity": "sha512-sNi3DL0/k64/LO3A256M+m3CDdG6V7WKWHdAiBBMUN8S3hK3aMPhwnPik2A/a2ONN+9doY9UxaLfgqsIRg69QA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.598.0", - "@smithy/property-provider": "^3.1.1", - "@smithy/types": "^3.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-http": { - "version": "3.598.0", + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/util-body-length-node": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.0.0.tgz", + "integrity": "sha512-q0iDP3VsZzqJyje8xJWEJCNIu3lktUGVoSy1KB0UWym2CL1siV3artm+u1DFYTLejpsrdGyCSWBdGNjJzfDPjg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.598.0", - "@smithy/fetch-http-handler": "^3.0.2", - "@smithy/node-http-handler": "^3.0.1", - "@smithy/property-provider": "^3.1.1", - "@smithy/protocol-http": "^4.0.1", - "@smithy/smithy-client": "^3.1.2", - "@smithy/types": "^3.1.0", - "@smithy/util-stream": "^3.0.2", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.598.0", + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/util-buffer-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.0.0.tgz", + "integrity": "sha512-9TOQ7781sZvddgO8nxueKi3+yGvkY35kotA0Y6BWRajAv8jjmigQ1sBwz0UX47pQMYXJPahSKEKYFgt+rXdcug==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/credential-provider-env": "3.598.0", - "@aws-sdk/credential-provider-http": "3.598.0", - "@aws-sdk/credential-provider-process": "3.598.0", - "@aws-sdk/credential-provider-sso": "3.598.0", - "@aws-sdk/credential-provider-web-identity": "3.598.0", - "@aws-sdk/types": "3.598.0", - "@smithy/credential-provider-imds": "^3.1.1", - "@smithy/property-provider": "^3.1.1", - "@smithy/shared-ini-file-loader": "^3.1.1", - "@smithy/types": "^3.1.0", + "@smithy/is-array-buffer": "^4.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.598.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.600.0", + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/util-config-provider": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.0.0.tgz", + "integrity": "sha512-L1RBVzLyfE8OXH+1hsJ8p+acNUSirQnWQ6/EgpchV88G6zGBTDPdXiiExei6Z1wR2RxYvxY/XLw6AMNCCt8H3w==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/credential-provider-env": "3.598.0", - "@aws-sdk/credential-provider-http": "3.598.0", - "@aws-sdk/credential-provider-ini": "3.598.0", - "@aws-sdk/credential-provider-process": "3.598.0", - "@aws-sdk/credential-provider-sso": "3.598.0", - "@aws-sdk/credential-provider-web-identity": "3.598.0", - "@aws-sdk/types": "3.598.0", - "@smithy/credential-provider-imds": "^3.1.1", - "@smithy/property-provider": "^3.1.1", - "@smithy/shared-ini-file-loader": "^3.1.1", - "@smithy/types": "^3.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-process": { - "version": "3.598.0", + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/util-defaults-mode-browser": { + "version": "4.0.26", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.0.26.tgz", + "integrity": "sha512-xgl75aHIS/3rrGp7iTxQAOELYeyiwBu+eEgAk4xfKwJJ0L8VUjhO2shsDpeil54BOFsqmk5xfdesiewbUY5tKQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.598.0", - "@smithy/property-provider": "^3.1.1", - "@smithy/shared-ini-file-loader": "^3.1.1", - "@smithy/types": "^3.1.0", + "@smithy/property-provider": "^4.0.5", + "@smithy/smithy-client": "^4.4.10", + "@smithy/types": "^4.3.2", + "bowser": "^2.11.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.598.0", + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/util-defaults-mode-node": { + "version": "4.0.26", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.0.26.tgz", + "integrity": "sha512-z81yyIkGiLLYVDetKTUeCZQ8x20EEzvQjrqJtb/mXnevLq2+w3XCEWTJ2pMp401b6BkEkHVfXb/cROBpVauLMQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/client-sso": "3.598.0", - "@aws-sdk/token-providers": "3.598.0", - "@aws-sdk/types": "3.598.0", - "@smithy/property-provider": "^3.1.1", - "@smithy/shared-ini-file-loader": "^3.1.1", - "@smithy/types": "^3.1.0", + "@smithy/config-resolver": "^4.1.5", + "@smithy/credential-provider-imds": "^4.0.7", + "@smithy/node-config-provider": "^4.1.4", + "@smithy/property-provider": "^4.0.5", + "@smithy/smithy-client": "^4.4.10", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.598.0", + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/util-endpoints": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.0.7.tgz", + "integrity": "sha512-klGBP+RpBp6V5JbrY2C/VKnHXn3d5V2YrifZbmMY8os7M6m8wdYFoO6w/fe5VkP+YVwrEktW3IWYaSQVNZJ8oQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.598.0", - "@smithy/property-provider": "^3.1.1", - "@smithy/types": "^3.1.0", + "@smithy/node-config-provider": "^4.1.4", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.598.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-providers": { - "version": "3.624.0", + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/util-hex-encoding": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.0.0.tgz", + "integrity": "sha512-Yk5mLhHtfIgW2W2WQZWSg5kuMZCVbvhFmC7rV4IO2QqnZdbEFPmQnCcGMAX2z/8Qj3B9hYYNjZOhWym+RwhePw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/client-cognito-identity": "3.624.0", - "@aws-sdk/client-sso": "3.624.0", - "@aws-sdk/client-sts": "3.624.0", - "@aws-sdk/credential-provider-cognito-identity": "3.624.0", - "@aws-sdk/credential-provider-env": "3.620.1", - "@aws-sdk/credential-provider-http": "3.622.0", - "@aws-sdk/credential-provider-ini": "3.624.0", - "@aws-sdk/credential-provider-node": "3.624.0", - "@aws-sdk/credential-provider-process": "3.620.1", - "@aws-sdk/credential-provider-sso": "3.624.0", - "@aws-sdk/credential-provider-web-identity": "3.621.0", - "@aws-sdk/types": "3.609.0", - "@smithy/credential-provider-imds": "^3.2.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/client-sso": { - "version": "3.624.0", + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/util-middleware": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.5.tgz", + "integrity": "sha512-N40PfqsZHRSsByGB81HhSo+uvMxEHT+9e255S53pfBw/wI6WKDI7Jw9oyu5tJTLwZzV5DsMha3ji8jk9dsHmQQ==", "license": "Apache-2.0", "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.624.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.620.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.614.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.3.2", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.14", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.14", - "@smithy/util-defaults-mode-node": "^3.0.14", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-utf8": "^3.0.0", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/client-sso-oidc": { - "version": "3.624.0", + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/util-retry": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.0.7.tgz", + "integrity": "sha512-TTO6rt0ppK70alZpkjwy+3nQlTiqNfoXja+qwuAchIEAIoSZW8Qyd76dvBv3I5bCpE38APafG23Y/u270NspiQ==", "license": "Apache-2.0", "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.624.0", - "@aws-sdk/credential-provider-node": "3.624.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.620.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.614.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.3.2", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.14", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.14", - "@smithy/util-defaults-mode-node": "^3.0.14", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-utf8": "^3.0.0", + "@smithy/service-error-classification": "^4.0.7", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.624.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/client-sts": { - "version": "3.624.0", + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/util-stream": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.2.4.tgz", + "integrity": "sha512-vSKnvNZX2BXzl0U2RgCLOwWaAP9x/ddd/XobPK02pCbzRm5s55M53uwb1rl/Ts7RXZvdJZerPkA+en2FDghLuQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/fetch-http-handler": "^5.1.1", + "@smithy/node-http-handler": "^4.1.1", + "@smithy/types": "^4.3.2", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-buffer-from": "^4.0.0", + "@smithy/util-hex-encoding": "^4.0.0", + "@smithy/util-utf8": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/util-uri-escape": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.0.0.tgz", + "integrity": "sha512-77yfbCbQMtgtTylO9itEAdpPXSog3ZxMe09AEhm0dU0NLTalV70ghDZFR+Nfi1C60jnJoh/Re4090/DuZh2Omg==", "license": "Apache-2.0", "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.624.0", - "@aws-sdk/core": "3.624.0", - "@aws-sdk/credential-provider-node": "3.624.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.620.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.614.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.3.2", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.14", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.14", - "@smithy/util-defaults-mode-node": "^3.0.14", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/core": { - "version": "3.624.0", + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/util-utf8": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.0.0.tgz", + "integrity": "sha512-b+zebfKCfRdgNJDknHCob3O7FpeYQN6ZG6YLExMcasDHsCXlsXCEuiPZeLnJLpwa5dvPetGlnGCiMHuLwGvFow==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^2.3.2", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/signature-v4": "^4.1.0", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", - "@smithy/util-middleware": "^3.0.3", - "fast-xml-parser": "4.4.1", + "@smithy/util-buffer-from": "^4.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/credential-provider-env": { - "version": "3.620.1", + "node_modules/@aws-sdk/region-config-resolver": { + "version": "3.862.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.862.0.tgz", + "integrity": "sha512-VisR+/HuVFICrBPY+q9novEiE4b3mvDofWqyvmxHcWM7HumTz9ZQSuEtnlB/92GVM3KDUrR9EmBHNRrfXYZkcQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/types": "^3.3.0", + "@aws-sdk/types": "3.862.0", + "@smithy/node-config-provider": "^4.1.4", + "@smithy/types": "^4.3.2", + "@smithy/util-config-provider": "^4.0.0", + "@smithy/util-middleware": "^4.0.5", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/credential-provider-http": { - "version": "3.622.0", + "node_modules/@aws-sdk/region-config-resolver/node_modules/@smithy/node-config-provider": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.4.tgz", + "integrity": "sha512-+UDQV/k42jLEPPHSn39l0Bmc4sB1xtdI9Gd47fzo/0PbXzJ7ylgaOByVjF5EeQIumkepnrJyfx86dPa9p47Y+w==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/property-provider": "^3.1.3", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", - "@smithy/util-stream": "^3.1.3", + "@smithy/property-provider": "^4.0.5", + "@smithy/shared-ini-file-loader": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.624.0", + "node_modules/@aws-sdk/region-config-resolver/node_modules/@smithy/property-provider": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.5.tgz", + "integrity": "sha512-R/bswf59T/n9ZgfgUICAZoWYKBHcsVDurAGX88zsiUtOTA/xUAPyiT+qkNCPwFn43pZqN84M4MiUsbSGQmgFIQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/credential-provider-env": "3.620.1", - "@aws-sdk/credential-provider-http": "3.622.0", - "@aws-sdk/credential-provider-process": "3.620.1", - "@aws-sdk/credential-provider-sso": "3.624.0", - "@aws-sdk/credential-provider-web-identity": "3.621.0", - "@aws-sdk/types": "3.609.0", - "@smithy/credential-provider-imds": "^3.2.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.624.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/credential-provider-node": { - "version": "3.624.0", + "node_modules/@aws-sdk/region-config-resolver/node_modules/@smithy/shared-ini-file-loader": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.5.tgz", + "integrity": "sha512-YVVwehRDuehgoXdEL4r1tAAzdaDgaC9EQvhK0lEbfnbrd0bd5+CTQumbdPryX3J2shT7ZqQE+jPW4lmNBAB8JQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/credential-provider-env": "3.620.1", - "@aws-sdk/credential-provider-http": "3.622.0", - "@aws-sdk/credential-provider-ini": "3.624.0", - "@aws-sdk/credential-provider-process": "3.620.1", - "@aws-sdk/credential-provider-sso": "3.624.0", - "@aws-sdk/credential-provider-web-identity": "3.621.0", - "@aws-sdk/types": "3.609.0", - "@smithy/credential-provider-imds": "^3.2.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/credential-provider-process": { - "version": "3.620.1", + "node_modules/@aws-sdk/region-config-resolver/node_modules/@smithy/types": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.624.0", + "node_modules/@aws-sdk/region-config-resolver/node_modules/@smithy/util-config-provider": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.0.0.tgz", + "integrity": "sha512-L1RBVzLyfE8OXH+1hsJ8p+acNUSirQnWQ6/EgpchV88G6zGBTDPdXiiExei6Z1wR2RxYvxY/XLw6AMNCCt8H3w==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/client-sso": "3.624.0", - "@aws-sdk/token-providers": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.621.0", + "node_modules/@aws-sdk/region-config-resolver/node_modules/@smithy/util-middleware": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.5.tgz", + "integrity": "sha512-N40PfqsZHRSsByGB81HhSo+uvMxEHT+9e255S53pfBw/wI6WKDI7Jw9oyu5tJTLwZzV5DsMha3ji8jk9dsHmQQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/types": "^3.3.0", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.621.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/middleware-host-header": { - "version": "3.620.0", + "node_modules/@aws-sdk/token-providers": { + "version": "3.862.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.862.0.tgz", + "integrity": "sha512-p3u7aom3WQ7ArFByNbccRIkCssk5BB4IUX9oFQa2P0MOFCbkKFBLG7WMegRXhq5grOHmI4SRftEDDy3CcoTqSQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", + "@aws-sdk/core": "3.862.0", + "@aws-sdk/nested-clients": "3.862.0", + "@aws-sdk/types": "3.862.0", + "@smithy/property-provider": "^4.0.5", + "@smithy/shared-ini-file-loader": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/middleware-logger": { - "version": "3.609.0", + "node_modules/@aws-sdk/token-providers/node_modules/@smithy/property-provider": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.5.tgz", + "integrity": "sha512-R/bswf59T/n9ZgfgUICAZoWYKBHcsVDurAGX88zsiUtOTA/xUAPyiT+qkNCPwFn43pZqN84M4MiUsbSGQmgFIQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/types": "^3.3.0", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.620.0", + "node_modules/@aws-sdk/token-providers/node_modules/@smithy/shared-ini-file-loader": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.5.tgz", + "integrity": "sha512-YVVwehRDuehgoXdEL4r1tAAzdaDgaC9EQvhK0lEbfnbrd0bd5+CTQumbdPryX3J2shT7ZqQE+jPW4lmNBAB8JQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.620.0", + "node_modules/@aws-sdk/token-providers/node_modules/@smithy/types": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.614.0", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/region-config-resolver": { - "version": "3.614.0", + "node_modules/@aws-sdk/types": { + "version": "3.862.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.862.0.tgz", + "integrity": "sha512-Bei+RL0cDxxV+lW2UezLbCYYNeJm6Nzee0TpW0FfyTRBhH9C1XQh4+x+IClriXvgBnRquTMMYsmJfvx8iyLKrg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/types": "^3.3.0", - "@smithy/util-config-provider": "^3.0.0", - "@smithy/util-middleware": "^3.0.3", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/token-providers": { - "version": "3.614.0", + "node_modules/@aws-sdk/types/node_modules/@smithy/types": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sso-oidc": "^3.614.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/types": { - "version": "3.609.0", + "node_modules/@aws-sdk/util-endpoints": { + "version": "3.862.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.862.0.tgz", + "integrity": "sha512-eCZuScdE9MWWkHGM2BJxm726MCmWk/dlHjOKvkM0sN1zxBellBMw5JohNss1Z8/TUmnW2gb9XHTOiHuGjOdksA==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^3.3.0", + "@aws-sdk/types": "3.862.0", + "@smithy/types": "^4.3.2", + "@smithy/url-parser": "^4.0.5", + "@smithy/util-endpoints": "^3.0.7", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/util-endpoints": { - "version": "3.614.0", + "node_modules/@aws-sdk/util-endpoints/node_modules/@smithy/node-config-provider": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.4.tgz", + "integrity": "sha512-+UDQV/k42jLEPPHSn39l0Bmc4sB1xtdI9Gd47fzo/0PbXzJ7ylgaOByVjF5EeQIumkepnrJyfx86dPa9p47Y+w==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/types": "^3.3.0", - "@smithy/util-endpoints": "^2.0.5", + "@smithy/property-provider": "^4.0.5", + "@smithy/shared-ini-file-loader": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.609.0", + "node_modules/@aws-sdk/util-endpoints/node_modules/@smithy/property-provider": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.5.tgz", + "integrity": "sha512-R/bswf59T/n9ZgfgUICAZoWYKBHcsVDurAGX88zsiUtOTA/xUAPyiT+qkNCPwFn43pZqN84M4MiUsbSGQmgFIQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/types": "^3.3.0", - "bowser": "^2.11.0", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.614.0", + "node_modules/@aws-sdk/util-endpoints/node_modules/@smithy/querystring-parser": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.0.5.tgz", + "integrity": "sha512-6SV7md2CzNG/WUeTjVe6Dj8noH32r4MnUeFKZrnVYsQxpGSIcphAanQMayi8jJLZAWm6pdM9ZXvKCpWOsIGg0w==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/types": "^3.3.0", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "aws-crt": ">=1.0.0" - }, - "peerDependenciesMeta": { - "aws-crt": { - "optional": true - } + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/signature-v4": { - "version": "4.1.0", + "node_modules/@aws-sdk/util-endpoints/node_modules/@smithy/shared-ini-file-loader": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.5.tgz", + "integrity": "sha512-YVVwehRDuehgoXdEL4r1tAAzdaDgaC9EQvhK0lEbfnbrd0bd5+CTQumbdPryX3J2shT7ZqQE+jPW4lmNBAB8JQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/is-array-buffer": "^3.0.0", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", - "@smithy/util-hex-encoding": "^3.0.0", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-uri-escape": "^3.0.0", - "@smithy/util-utf8": "^3.0.0", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/middleware-host-header": { - "version": "3.598.0", + "node_modules/@aws-sdk/util-endpoints/node_modules/@smithy/types": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.598.0", - "@smithy/protocol-http": "^4.0.1", - "@smithy/types": "^3.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/middleware-logger": { - "version": "3.598.0", + "node_modules/@aws-sdk/util-endpoints/node_modules/@smithy/url-parser": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.0.5.tgz", + "integrity": "sha512-j+733Um7f1/DXjYhCbvNXABV53NyCRRA54C7bNEIxNPs0YjfRxeMKjjgm2jvTYrciZyCjsicHwQ6Q0ylo+NAUw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.598.0", - "@smithy/types": "^3.1.0", + "@smithy/querystring-parser": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.598.0", + "node_modules/@aws-sdk/util-endpoints/node_modules/@smithy/util-endpoints": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.0.7.tgz", + "integrity": "sha512-klGBP+RpBp6V5JbrY2C/VKnHXn3d5V2YrifZbmMY8os7M6m8wdYFoO6w/fe5VkP+YVwrEktW3IWYaSQVNZJ8oQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.598.0", - "@smithy/protocol-http": "^4.0.1", - "@smithy/types": "^3.1.0", + "@smithy/node-config-provider": "^4.1.4", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.598.0", + "node_modules/@aws-sdk/util-locate-window": { + "version": "3.568.0", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.598.0", - "@aws-sdk/util-endpoints": "3.598.0", - "@smithy/protocol-http": "^4.0.1", - "@smithy/types": "^3.1.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/region-config-resolver": { - "version": "3.598.0", + "node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.862.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.862.0.tgz", + "integrity": "sha512-BmPTlm0r9/10MMr5ND9E92r8KMZbq5ltYXYpVcUbAsnB1RJ8ASJuRoLne5F7mB3YMx0FJoOTuSq7LdQM3LgW3Q==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.862.0", + "@smithy/types": "^4.3.2", + "bowser": "^2.11.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-sdk/util-user-agent-browser/node_modules/@smithy/types": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.598.0", - "@smithy/node-config-provider": "^3.1.1", - "@smithy/types": "^3.1.0", - "@smithy/util-config-provider": "^3.0.0", - "@smithy/util-middleware": "^3.0.1", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/token-providers": { - "version": "3.598.0", + "node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.862.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.862.0.tgz", + "integrity": "sha512-KtJdSoa1Vmwquy+zwiqRQjtsuKaHlVcZm8tsTchHbc6809/VeaC+ZZOqlil9IWOOyWNGIX8GTRwP9TEb8cT5Gw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.598.0", - "@smithy/property-provider": "^3.1.1", - "@smithy/shared-ini-file-loader": "^3.1.1", - "@smithy/types": "^3.1.0", + "@aws-sdk/middleware-user-agent": "3.862.0", + "@aws-sdk/types": "3.862.0", + "@smithy/node-config-provider": "^4.1.4", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" }, "peerDependencies": { - "@aws-sdk/client-sso-oidc": "^3.598.0" + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } } }, - "node_modules/@aws-sdk/types": { - "version": "3.598.0", + "node_modules/@aws-sdk/util-user-agent-node/node_modules/@smithy/node-config-provider": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.4.tgz", + "integrity": "sha512-+UDQV/k42jLEPPHSn39l0Bmc4sB1xtdI9Gd47fzo/0PbXzJ7ylgaOByVjF5EeQIumkepnrJyfx86dPa9p47Y+w==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^3.1.0", + "@smithy/property-provider": "^4.0.5", + "@smithy/shared-ini-file-loader": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/util-endpoints": { - "version": "3.598.0", + "node_modules/@aws-sdk/util-user-agent-node/node_modules/@smithy/property-provider": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.5.tgz", + "integrity": "sha512-R/bswf59T/n9ZgfgUICAZoWYKBHcsVDurAGX88zsiUtOTA/xUAPyiT+qkNCPwFn43pZqN84M4MiUsbSGQmgFIQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.598.0", - "@smithy/types": "^3.1.0", - "@smithy/util-endpoints": "^2.0.2", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/util-locate-window": { - "version": "3.568.0", + "node_modules/@aws-sdk/util-user-agent-node/node_modules/@smithy/shared-ini-file-loader": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.5.tgz", + "integrity": "sha512-YVVwehRDuehgoXdEL4r1tAAzdaDgaC9EQvhK0lEbfnbrd0bd5+CTQumbdPryX3J2shT7ZqQE+jPW4lmNBAB8JQ==", "license": "Apache-2.0", "dependencies": { + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/util-user-agent-node/node_modules/@smithy/types": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.598.0", + "node_modules/@aws-sdk/xml-builder": { + "version": "3.862.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.862.0.tgz", + "integrity": "sha512-6Ed0kmC1NMbuFTEgNmamAUU1h5gShgxL1hBVLbEzUa3trX5aJBz1vU4bXaBTvOYUAnOHtiy1Ml4AMStd6hJnFA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.598.0", - "@smithy/types": "^3.1.0", - "bowser": "^2.11.0", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.598.0", + "node_modules/@aws-sdk/xml-builder/node_modules/@smithy/types": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.598.0", - "@smithy/node-config-provider": "^3.1.1", - "@smithy/types": "^3.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "aws-crt": ">=1.0.0" - }, - "peerDependenciesMeta": { - "aws-crt": { - "optional": true - } + "node": ">=18.0.0" } }, "node_modules/@babel/code-frame": { @@ -3422,7 +9359,7 @@ }, "node_modules/@cspotcode/source-map-support": { "version": "0.8.1", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "0.3.9" @@ -4489,7 +10426,6 @@ }, "node_modules/@isaacs/cliui": { "version": "8.0.2", - "dev": true, "license": "ISC", "dependencies": { "string-width": "^5.1.2", @@ -4505,7 +10441,6 @@ }, "node_modules/@isaacs/cliui/node_modules/ansi-regex": { "version": "6.0.1", - "dev": true, "license": "MIT", "engines": { "node": ">=12" @@ -4516,7 +10451,6 @@ }, "node_modules/@isaacs/cliui/node_modules/ansi-styles": { "version": "6.2.1", - "dev": true, "license": "MIT", "engines": { "node": ">=12" @@ -4527,12 +10461,10 @@ }, "node_modules/@isaacs/cliui/node_modules/emoji-regex": { "version": "9.2.2", - "dev": true, "license": "MIT" }, "node_modules/@isaacs/cliui/node_modules/string-width": { "version": "5.1.2", - "dev": true, "license": "MIT", "dependencies": { "eastasianwidth": "^0.2.0", @@ -4548,7 +10480,6 @@ }, "node_modules/@isaacs/cliui/node_modules/strip-ansi": { "version": "7.1.0", - "dev": true, "license": "MIT", "dependencies": { "ansi-regex": "^6.0.1" @@ -4562,7 +10493,6 @@ }, "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { "version": "8.1.0", - "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^6.1.0", @@ -4600,7 +10530,6 @@ "version": "0.3.8", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", - "dev": true, "license": "MIT", "dependencies": { "@jridgewell/set-array": "^1.2.1", @@ -4615,7 +10544,6 @@ "version": "0.3.25", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dev": true, "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", @@ -4624,7 +10552,6 @@ }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.1", - "dev": true, "license": "MIT", "engines": { "node": ">=6.0.0" @@ -4634,7 +10561,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "dev": true, "license": "MIT", "engines": { "node": ">=6.0.0" @@ -4653,12 +10579,11 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "dev": true, "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.9", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", @@ -5088,7 +11013,6 @@ }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", - "dev": true, "license": "MIT", "dependencies": { "@nodelib/fs.stat": "2.0.5", @@ -5100,7 +11024,6 @@ }, "node_modules/@nodelib/fs.stat": { "version": "2.0.5", - "dev": true, "license": "MIT", "engines": { "node": ">= 8" @@ -5108,7 +11031,6 @@ }, "node_modules/@nodelib/fs.walk": { "version": "1.2.8", - "dev": true, "license": "MIT", "dependencies": { "@nodelib/fs.scandir": "2.1.5", @@ -6070,7 +11992,6 @@ }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", - "dev": true, "license": "MIT", "optional": true, "engines": { @@ -6093,6 +12014,85 @@ "node": ">=18" } }, + "node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz", + "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-primitive": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", + "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-separator": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.1.7.tgz", + "integrity": "sha512-0HEb8R9E8A+jZjvmFCy/J4xhbXy3TV+9XSnGJ3KvTtjlIUy/YQ/p6UYZvi7YbeoeXdyU9+Y3scizK6hkY37baA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/@remix-run/router": { "version": "1.14.1", "license": "MIT", @@ -6626,6 +12626,73 @@ "node": ">=16.0.0" } }, + "node_modules/@smithy/eventstream-codec": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-3.1.10.tgz", + "integrity": "sha512-323B8YckSbUH0nMIpXn7HZsAVKHYHFUODa8gG9cHo0ySvA1fr5iWaNT+iIL0UCqUzG6QPHA3BSsBtRQou4mMqQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/crc32": "5.2.0", + "@smithy/types": "^3.7.2", + "@smithy/util-hex-encoding": "^3.0.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@smithy/eventstream-serde-browser": { + "version": "3.0.14", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-3.0.14.tgz", + "integrity": "sha512-kbrt0vjOIihW3V7Cqj1SXQvAI5BR8SnyQYsandva0AOR307cXAc+IhPngxIPslxTLfxwDpNu0HzCAq6g42kCPg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/eventstream-serde-universal": "^3.0.13", + "@smithy/types": "^3.7.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/eventstream-serde-config-resolver": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-3.0.11.tgz", + "integrity": "sha512-P2pnEp4n75O+QHjyO7cbw/vsw5l93K/8EWyjNCAAybYwUmj3M+hjSQZ9P5TVdUgEG08ueMAP5R4FkuSkElZ5tQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.7.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/eventstream-serde-node": { + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-3.0.13.tgz", + "integrity": "sha512-zqy/9iwbj8Wysmvi7Lq7XFLeDgjRpTbCfwBhJa8WbrylTAHiAu6oQTwdY7iu2lxigbc9YYr9vPv5SzYny5tCXQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/eventstream-serde-universal": "^3.0.13", + "@smithy/types": "^3.7.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/eventstream-serde-universal": { + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-3.0.13.tgz", + "integrity": "sha512-L1Ib66+gg9uTnqp/18Gz4MDpJPKRE44geOjOQ2SVc0eiaO5l255ADziATZgjQjqumC7yPtp1XnjHlF1srcwjKw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/eventstream-codec": "^3.1.10", + "@smithy/types": "^3.7.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, "node_modules/@smithy/fetch-http-handler": { "version": "3.2.4", "license": "Apache-2.0", @@ -6668,6 +12735,67 @@ "node": ">=16.0.0" } }, + "node_modules/@smithy/md5-js": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-2.0.7.tgz", + "integrity": "sha512-2i2BpXF9pI5D1xekqUsgQ/ohv5+H//G9FlawJrkOJskV18PgJ8LiNbLiskMeYt07yAsSTZR7qtlcAaa/GQLWww==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^2.3.1", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/md5-js/node_modules/@smithy/is-array-buffer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", + "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/md5-js/node_modules/@smithy/types": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.12.0.tgz", + "integrity": "sha512-QwYgloJ0sVNBeBuBs65cIkTbfzV/Q6ZNPCJ99EICFEdJYG50nGIY/uYXp+TbsdJReIuPr0a0kXmCvren3MbRRw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/md5-js/node_modules/@smithy/util-buffer-from": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", + "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/md5-js/node_modules/@smithy/util-utf8": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", + "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/@smithy/middleware-content-length": { "version": "3.0.5", "license": "Apache-2.0", @@ -6736,113 +12864,218 @@ "node": ">=16.0.0" } }, - "node_modules/@smithy/node-config-provider": { - "version": "3.1.4", + "node_modules/@smithy/node-config-provider": { + "version": "3.1.4", + "license": "Apache-2.0", + "dependencies": { + "@smithy/property-provider": "^3.1.3", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/node-http-handler": { + "version": "3.1.4", + "license": "Apache-2.0", + "dependencies": { + "@smithy/abort-controller": "^3.1.1", + "@smithy/protocol-http": "^4.1.0", + "@smithy/querystring-builder": "^3.0.3", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/property-provider": { + "version": "3.1.3", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/protocol-http": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-4.1.8.tgz", + "integrity": "sha512-hmgIAVyxw1LySOwkgMIUN0kjN8TG9Nc85LJeEmEE/cNEe2rkHDUWhnJf2gxcSRFLWsyqWsrZGw40ROjUogg+Iw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.7.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/querystring-builder": { + "version": "3.0.3", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.3.0", + "@smithy/util-uri-escape": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/querystring-parser": { + "version": "3.0.3", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/service-error-classification": { + "version": "3.0.3", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.3.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/shared-ini-file-loader": { + "version": "3.1.4", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/signature-v4": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.1.3.tgz", + "integrity": "sha512-mARDSXSEgllNzMw6N+mC+r1AQlEBO3meEAkR/UlfAgnMzJUB3goRBWgip1EAMG99wh36MDqzo86SfIX5Y+VEaw==", "license": "Apache-2.0", "dependencies": { - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", + "@smithy/is-array-buffer": "^4.0.0", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", + "@smithy/util-hex-encoding": "^4.0.0", + "@smithy/util-middleware": "^4.0.5", + "@smithy/util-uri-escape": "^4.0.0", + "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@smithy/node-http-handler": { - "version": "3.1.4", + "node_modules/@smithy/signature-v4/node_modules/@smithy/is-array-buffer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.0.0.tgz", + "integrity": "sha512-saYhF8ZZNoJDTvJBEWgeBccCg+yvp1CX+ed12yORU3NilJScfc6gfch2oVb4QgxZrGUx3/ZJlb+c/dJbyupxlw==", "license": "Apache-2.0", "dependencies": { - "@smithy/abort-controller": "^3.1.1", - "@smithy/protocol-http": "^4.1.0", - "@smithy/querystring-builder": "^3.0.3", - "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@smithy/property-provider": { - "version": "3.1.3", + "node_modules/@smithy/signature-v4/node_modules/@smithy/protocol-http": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.3.tgz", + "integrity": "sha512-fCJd2ZR7D22XhDY0l+92pUag/7je2BztPRQ01gU5bMChcyI0rlly7QFibnYHzcxDvccMjlpM/Q1ev8ceRIb48w==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^3.3.0", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@smithy/protocol-http": { - "version": "4.1.0", + "node_modules/@smithy/signature-v4/node_modules/@smithy/types": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@smithy/querystring-builder": { - "version": "3.0.3", + "node_modules/@smithy/signature-v4/node_modules/@smithy/util-buffer-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.0.0.tgz", + "integrity": "sha512-9TOQ7781sZvddgO8nxueKi3+yGvkY35kotA0Y6BWRajAv8jjmigQ1sBwz0UX47pQMYXJPahSKEKYFgt+rXdcug==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^3.3.0", - "@smithy/util-uri-escape": "^3.0.0", + "@smithy/is-array-buffer": "^4.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@smithy/querystring-parser": { - "version": "3.0.3", + "node_modules/@smithy/signature-v4/node_modules/@smithy/util-hex-encoding": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.0.0.tgz", + "integrity": "sha512-Yk5mLhHtfIgW2W2WQZWSg5kuMZCVbvhFmC7rV4IO2QqnZdbEFPmQnCcGMAX2z/8Qj3B9hYYNjZOhWym+RwhePw==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@smithy/service-error-classification": { - "version": "3.0.3", + "node_modules/@smithy/signature-v4/node_modules/@smithy/util-middleware": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.5.tgz", + "integrity": "sha512-N40PfqsZHRSsByGB81HhSo+uvMxEHT+9e255S53pfBw/wI6WKDI7Jw9oyu5tJTLwZzV5DsMha3ji8jk9dsHmQQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^3.3.0" + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@smithy/shared-ini-file-loader": { - "version": "3.1.4", + "node_modules/@smithy/signature-v4/node_modules/@smithy/util-uri-escape": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.0.0.tgz", + "integrity": "sha512-77yfbCbQMtgtTylO9itEAdpPXSog3ZxMe09AEhm0dU0NLTalV70ghDZFR+Nfi1C60jnJoh/Re4090/DuZh2Omg==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@smithy/signature-v4": { - "version": "3.1.1", + "node_modules/@smithy/signature-v4/node_modules/@smithy/util-utf8": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.0.0.tgz", + "integrity": "sha512-b+zebfKCfRdgNJDknHCob3O7FpeYQN6ZG6YLExMcasDHsCXlsXCEuiPZeLnJLpwa5dvPetGlnGCiMHuLwGvFow==", "license": "Apache-2.0", "dependencies": { - "@smithy/is-array-buffer": "^3.0.0", - "@smithy/types": "^3.2.0", - "@smithy/util-hex-encoding": "^3.0.0", - "@smithy/util-middleware": "^3.0.2", - "@smithy/util-uri-escape": "^3.0.0", - "@smithy/util-utf8": "^3.0.0", + "@smithy/util-buffer-from": "^4.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/smithy-client": { @@ -6861,7 +13094,9 @@ } }, "node_modules/@smithy/types": { - "version": "3.3.0", + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.7.2.tgz", + "integrity": "sha512-bNwBYYmN8Eh9RyjS1p2gW6MIhSO2rl7X9QeLM8iTdcGRP+eDiIWDt66c9IysCc22gefKszZv+ubV9qZc7hdESg==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -7042,6 +13277,33 @@ "node": ">=16.0.0" } }, + "node_modules/@smithy/util-waiter": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-3.2.0.tgz", + "integrity": "sha512-PpjSboaDUE6yl+1qlg3Si57++e84oXdWGbuFUSAciXsVfEZJJJupR2Nb0QuXHiunt2vGR+1PTizOMvnUPaG2Qg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/abort-controller": "^3.1.9", + "@smithy/types": "^3.7.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/util-waiter/node_modules/@smithy/abort-controller": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-3.1.9.tgz", + "integrity": "sha512-yiW0WI30zj8ZKoSYNx90no7ugVn3khlyH/z5W8qtKBtVE6awRALbhSG+2SAHA1r6bO/6M9utxYKVZ3PCJ1rWxw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.7.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, "node_modules/@swc/counter": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", @@ -7246,22 +13508,22 @@ }, "node_modules/@tsconfig/node10": { "version": "1.0.9", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/@tsconfig/node12": { "version": "1.0.11", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/@tsconfig/node14": { "version": "1.0.3", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/@tsconfig/node16": { "version": "1.0.4", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/@tufjs/canonical-json": { @@ -7329,6 +13591,12 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/aws-lambda": { + "version": "8.10.152", + "resolved": "https://registry.npmjs.org/@types/aws-lambda/-/aws-lambda-8.10.152.tgz", + "integrity": "sha512-soT/c2gYBnT5ygwiHPmd9a1bftj462NWVk2tKCc1PYHSIacB2UwbTS2zYG4jzag1mRDuzg/OjtxQjQ2NKRB6Rw==", + "license": "MIT" + }, "node_modules/@types/babel__core": { "version": "7.20.5", "dev": true, @@ -7512,7 +13780,6 @@ }, "node_modules/@types/json-schema": { "version": "7.0.15", - "dev": true, "license": "MIT" }, "node_modules/@types/jsonwebtoken": { @@ -7583,7 +13850,7 @@ }, "node_modules/@types/prop-types": { "version": "15.7.11", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/@types/qs": { @@ -7598,7 +13865,7 @@ "version": "18.3.22", "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.22.tgz", "integrity": "sha512-vUhG0YmQZ7kL/tmKLrD3g5zXbXXreZXB3pmROW8bg3CnLnpjkRVwUlLne7Ufa2r9yJ8+/6B73RzhAek5TBKh2Q==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@types/prop-types": "*", @@ -7609,7 +13876,7 @@ "version": "18.3.7", "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz", "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", - "dev": true, + "devOptional": true, "license": "MIT", "peerDependencies": { "@types/react": "^18.0.0" @@ -7665,6 +13932,12 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/uuid": { + "version": "9.0.8", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.8.tgz", + "integrity": "sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==", + "license": "MIT" + }, "node_modules/@types/web-bluetooth": { "version": "0.0.20", "dev": true, @@ -8271,6 +14544,13 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/@zeit/schemas": { + "version": "2.36.0", + "resolved": "https://registry.npmjs.org/@zeit/schemas/-/schemas-2.36.0.tgz", + "integrity": "sha512-7kjMwcChYEzMKjeex9ZFXkt1AyNov9R5HZtjBKVsmVpw7pa7ZtlCGvCBC2vnnXctaYN+aRI61HjIqeetZW5ROg==", + "dev": true, + "license": "MIT" + }, "node_modules/@zkochan/js-yaml": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/@zkochan/js-yaml/-/js-yaml-0.0.7.tgz", @@ -8301,11 +14581,25 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/acorn": { "version": "8.14.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", - "dev": true, + "devOptional": true, "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -8360,7 +14654,7 @@ "version": "8.3.4", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "acorn": "^8.11.0" @@ -8452,6 +14746,16 @@ "dev": true, "license": "MIT" }, + "node_modules/ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.1.0" + } + }, "node_modules/ansi-colors": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", @@ -8489,7 +14793,6 @@ }, "node_modules/ansi-regex": { "version": "5.0.1", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -8497,7 +14800,6 @@ }, "node_modules/ansi-styles": { "version": "4.3.0", - "dev": true, "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -8511,12 +14813,10 @@ }, "node_modules/any-promise": { "version": "1.3.0", - "dev": true, "license": "MIT" }, "node_modules/anymatch": { "version": "3.1.3", - "dev": true, "license": "ISC", "dependencies": { "normalize-path": "^3.0.0", @@ -8533,9 +14833,30 @@ "dev": true, "license": "ISC" }, + "node_modules/arch": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", + "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, "node_modules/arg": { "version": "4.1.3", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/argparse": { @@ -8711,6 +15032,31 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/aws-amplify": { + "version": "6.15.5", + "resolved": "https://registry.npmjs.org/aws-amplify/-/aws-amplify-6.15.5.tgz", + "integrity": "sha512-FdH2V4z/mkBkVRBb1Mk9jBxM1ieoW+6kmVSS8V1lLQP4v91ImBa5Kc+BEek+Fo++eNzfgtZD7cLUTEqQzbkvWw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-amplify/analytics": "7.0.86", + "@aws-amplify/api": "6.3.17", + "@aws-amplify/auth": "6.15.0", + "@aws-amplify/core": "6.13.1", + "@aws-amplify/datastore": "5.0.88", + "@aws-amplify/notifications": "2.0.86", + "@aws-amplify/storage": "6.9.5", + "tslib": "^2.5.0" + } + }, + "node_modules/aws-jwt-verify": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/aws-jwt-verify/-/aws-jwt-verify-5.1.0.tgz", + "integrity": "sha512-98ioOBMyrLU5jW5rPvkJo20XlNB2rAX3tZR3BM6AamfBkOoSRLV1EyGkbgHQzgFOWyQ7yV8+tce6M24rOpMkgw==", + "license": "Apache-2.0", + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/aws-sdk": { "version": "2.1646.0", "hasInstallScript": true, @@ -8910,7 +15256,6 @@ }, "node_modules/balanced-match": { "version": "1.0.2", - "dev": true, "license": "MIT" }, "node_modules/base64-js": { @@ -8956,7 +15301,6 @@ }, "node_modules/binary-extensions": { "version": "2.2.0", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -8981,9 +15325,156 @@ "dev": true, "license": "ISC" }, - "node_modules/bowser": { - "version": "2.11.0", - "license": "MIT" + "node_modules/bowser": { + "version": "2.11.0", + "license": "MIT" + }, + "node_modules/boxen": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.0.0.tgz", + "integrity": "sha512-j//dBVuyacJbvW+tvZ9HuH03fZ46QcaKvvhZickZqtB271DxJ7SNRSNxrV/dZX0085m7hISRZWbzWlJvx/rHSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-align": "^3.0.1", + "camelcase": "^7.0.0", + "chalk": "^5.0.1", + "cli-boxes": "^3.0.0", + "string-width": "^5.1.2", + "type-fest": "^2.13.0", + "widest-line": "^4.0.1", + "wrap-ansi": "^8.0.1" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/boxen/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/boxen/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/boxen/node_modules/camelcase": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", + "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/boxen/node_modules/chalk": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", + "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/boxen/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/boxen/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/boxen/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/boxen/node_modules/type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/boxen/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } }, "node_modules/brace-expansion": { "version": "1.1.11", @@ -8998,7 +15489,6 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, "license": "MIT", "dependencies": { "fill-range": "^7.1.1" @@ -9110,6 +15600,16 @@ "node": ">=12.17" } }, + "node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/cac": { "version": "6.7.14", "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", @@ -9324,7 +15824,6 @@ }, "node_modules/camelcase-css": { "version": "2.0.1", - "dev": true, "license": "MIT", "engines": { "node": ">= 6" @@ -9412,6 +15911,22 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/chalk-template": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/chalk-template/-/chalk-template-0.4.0.tgz", + "integrity": "sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/chalk-template?sponsor=1" + } + }, "node_modules/chardet": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", @@ -9434,7 +15949,6 @@ }, "node_modules/chokidar": { "version": "3.5.3", - "dev": true, "funding": [ { "type": "individual", @@ -9460,7 +15974,6 @@ }, "node_modules/chokidar/node_modules/glob-parent": { "version": "5.1.2", - "dev": true, "license": "ISC", "dependencies": { "is-glob": "^4.0.1" @@ -9499,6 +16012,18 @@ "node": ">=8" } }, + "node_modules/class-variance-authority": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz", + "integrity": "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==", + "license": "Apache-2.0", + "dependencies": { + "clsx": "^2.1.1" + }, + "funding": { + "url": "https://polar.sh/cva" + } + }, "node_modules/classnames": { "version": "2.5.1", "license": "MIT" @@ -9524,6 +16049,19 @@ "node": ">=6" } }, + "node_modules/cli-boxes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", + "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/cli-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", @@ -9566,6 +16104,48 @@ "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", "license": "MIT" }, + "node_modules/clipboardy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-3.0.0.tgz", + "integrity": "sha512-Su+uU5sr1jkUy1sGRpLKjKrvEOVXgSgiSInwa/qeID6aJ07yh+5NWc3h2QfjHjBnfX4LhtFcuAWKUsJ3r+fjbg==", + "dev": true, + "license": "MIT", + "dependencies": { + "arch": "^2.2.0", + "execa": "^5.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/clipboardy/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, "node_modules/cliui": { "version": "8.0.1", "dev": true, @@ -9631,6 +16211,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/cmd-shim": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/cmd-shim/-/cmd-shim-6.0.3.tgz", @@ -9657,7 +16246,6 @@ }, "node_modules/color-convert": { "version": "2.0.1", - "devOptional": true, "license": "MIT", "dependencies": { "color-name": "~1.1.4" @@ -9668,7 +16256,6 @@ }, "node_modules/color-name": { "version": "1.1.4", - "devOptional": true, "license": "MIT" }, "node_modules/color-string": { @@ -9751,6 +16338,62 @@ "dot-prop": "^5.1.0" } }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/compression/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT" + }, "node_modules/concat-map": { "version": "0.0.1", "dev": true, @@ -9790,6 +16433,16 @@ "dev": true, "license": "ISC" }, + "node_modules/content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/conventional-changelog-angular": { "version": "7.0.0", "dev": true, @@ -9995,9 +16648,21 @@ "version": "1.5.10", "license": "MIT" }, + "node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "license": "Apache-2.0", + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, "node_modules/create-require": { "version": "1.1.1", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/cross-env": { @@ -10021,7 +16686,6 @@ "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dev": true, "license": "MIT", "dependencies": { "path-key": "^3.1.0", @@ -10100,7 +16764,6 @@ }, "node_modules/cssesc": { "version": "3.0.0", - "dev": true, "license": "MIT", "bin": { "cssesc": "bin/cssesc" @@ -10138,7 +16801,7 @@ }, "node_modules/csstype": { "version": "3.1.3", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/dargs": { @@ -10360,6 +17023,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/deep-is": { "version": "0.1.4", "dev": true, @@ -10471,12 +17144,11 @@ }, "node_modules/didyoumean": { "version": "1.2.2", - "dev": true, "license": "Apache-2.0" }, "node_modules/diff": { "version": "4.0.2", - "dev": true, + "devOptional": true, "license": "BSD-3-Clause", "engines": { "node": ">=0.3.1" @@ -10505,7 +17177,6 @@ }, "node_modules/dlv": { "version": "1.1.3", - "dev": true, "license": "MIT" }, "node_modules/doctrine": { @@ -10727,7 +17398,6 @@ }, "node_modules/eastasianwidth": { "version": "0.2.0", - "dev": true, "license": "MIT" }, "node_modules/ecdsa-sig-formatter": { @@ -10762,7 +17432,6 @@ }, "node_modules/emoji-regex": { "version": "8.0.0", - "dev": true, "license": "MIT" }, "node_modules/encoding": { @@ -11465,7 +18134,6 @@ }, "node_modules/fast-glob": { "version": "3.3.2", - "dev": true, "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -11480,7 +18148,6 @@ }, "node_modules/fast-glob/node_modules/glob-parent": { "version": "5.1.2", - "dev": true, "license": "ISC", "dependencies": { "is-glob": "^4.0.1" @@ -11546,7 +18213,6 @@ }, "node_modules/fastq": { "version": "1.16.0", - "dev": true, "license": "ISC", "dependencies": { "reusify": "^1.0.4" @@ -11652,7 +18318,6 @@ "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" @@ -11864,7 +18529,6 @@ }, "node_modules/foreground-child": { "version": "3.1.1", - "dev": true, "license": "ISC", "dependencies": { "cross-spawn": "^7.0.0", @@ -11879,7 +18543,6 @@ }, "node_modules/foreground-child/node_modules/signal-exit": { "version": "4.1.0", - "dev": true, "license": "ISC", "engines": { "node": ">=14" @@ -12269,7 +18932,6 @@ }, "node_modules/glob-parent": { "version": "6.0.2", - "dev": true, "license": "ISC", "dependencies": { "is-glob": "^4.0.3" @@ -12385,6 +19047,15 @@ "dev": true, "license": "MIT" }, + "node_modules/graphql": { + "version": "15.8.0", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-15.8.0.tgz", + "integrity": "sha512-5gghUc24tP9HRznNpV2+FIoq3xKkj5dTQqf4v0CpdPbFVwFkWoxOM+o+2OC9ZSvjEMTjfmG9QT+gcvggTwW1zw==", + "license": "MIT", + "engines": { + "node": ">= 10.x" + } + }, "node_modules/handlebars": { "version": "4.7.8", "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", @@ -12776,11 +19447,16 @@ "postcss": "^8.1.0" } }, + "node_modules/idb": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/idb/-/idb-5.0.6.tgz", + "integrity": "sha512-/PFvOWPzRcEPmlDt5jEvzVZVs0wyd/EvGvkDIcbBpGuMMLQKrTPG0TxvE2UJtgZtCQCmOtM2QD7yQJBVEjKGOw==", + "license": "ISC" + }, "node_modules/ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true, "funding": [ { "type": "github", @@ -12844,6 +19520,16 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/immer": { + "version": "9.0.6", + "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.6.tgz", + "integrity": "sha512-G95ivKpy+EvVAnAab4fVa4YGYn24J1SpEktnJX7JJ45Bd7xqME/SCplFzYFmTbrkwZbQ4xJK1xMTUYBkN6pWsQ==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, "node_modules/import-fresh": { "version": "3.3.0", "dev": true, @@ -12937,6 +19623,16 @@ "prop-types": "^15.8.1" } }, + "node_modules/input-otp": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/input-otp/-/input-otp-1.4.2.tgz", + "integrity": "sha512-l3jWwYNvrEa6NTCt7BECfCm48GvwuZzkoeG3gBL2w4CHeOXW3eKFmf9UNYkNfYc3mxMrthMnxjIE07MT0zLBQA==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc" + } + }, "node_modules/inquirer": { "version": "8.2.6", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.6.tgz", @@ -13047,7 +19743,6 @@ }, "node_modules/is-binary-path": { "version": "2.1.0", - "dev": true, "license": "MIT", "dependencies": { "binary-extensions": "^2.0.0" @@ -13098,7 +19793,6 @@ "version": "2.16.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", - "dev": true, "license": "MIT", "dependencies": { "hasown": "^2.0.2" @@ -13145,7 +19839,6 @@ }, "node_modules/is-extglob": { "version": "2.1.1", - "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -13153,7 +19846,6 @@ }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -13174,7 +19866,6 @@ }, "node_modules/is-glob": { "version": "4.0.3", - "dev": true, "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" @@ -13221,7 +19912,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, "license": "MIT", "engines": { "node": ">=0.12.0" @@ -13280,6 +19970,19 @@ "node": ">=0.10.0" } }, + "node_modules/is-port-reachable": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-port-reachable/-/is-port-reachable-4.0.0.tgz", + "integrity": "sha512-9UoipoxYmSk6Xy7QFgRv2HDyaysmgSG75TFQs6S+3pDM7ZhKTF/bskZV+0UlABHzKjNVhPjYCLfeZUEg1wXxig==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-potential-custom-element-name": { "version": "1.0.1", "dev": true, @@ -13453,7 +20156,6 @@ }, "node_modules/isexe": { "version": "2.0.0", - "dev": true, "license": "ISC" }, "node_modules/isobject": { @@ -13466,7 +20168,6 @@ }, "node_modules/jackspeak": { "version": "2.3.6", - "dev": true, "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/cliui": "^8.0.2" @@ -13626,7 +20327,6 @@ }, "node_modules/jiti": { "version": "1.21.0", - "dev": true, "license": "MIT", "bin": { "jiti": "bin/jiti.js" @@ -13646,6 +20346,15 @@ "url": "https://github.com/sponsors/panva" } }, + "node_modules/js-cookie": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.5.tgz", + "integrity": "sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==", + "license": "MIT", + "engines": { + "node": ">=14" + } + }, "node_modules/js-tokens": { "version": "4.0.0", "license": "MIT" @@ -14335,7 +21044,6 @@ }, "node_modules/lilconfig": { "version": "2.1.0", - "dev": true, "license": "MIT", "engines": { "node": ">=10" @@ -14421,7 +21129,6 @@ }, "node_modules/lodash": { "version": "4.17.21", - "dev": true, "license": "MIT" }, "node_modules/lodash.clonedeep": { @@ -14561,6 +21268,15 @@ "lru-cache": "6.0.0" } }, + "node_modules/lucide-react": { + "version": "0.507.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.507.0.tgz", + "integrity": "sha512-XfgE6gvAHwAtnbUvWiTTHx4S3VGR+cUJHEc0vrh9Ogu672I1Tue2+Cp/8JJqpytgcBHAB1FVI297W4XGNwc2dQ==", + "license": "ISC", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, "node_modules/lz-string": { "version": "1.5.0", "dev": true, @@ -14585,7 +21301,7 @@ }, "node_modules/make-error": { "version": "1.3.6", - "dev": true, + "devOptional": true, "license": "ISC" }, "node_modules/make-fetch-happen": { @@ -14868,7 +21584,6 @@ }, "node_modules/merge2": { "version": "1.4.1", - "dev": true, "license": "MIT", "engines": { "node": ">= 8" @@ -14878,7 +21593,6 @@ "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dev": true, "license": "MIT", "dependencies": { "braces": "^3.0.3", @@ -14975,7 +21689,6 @@ }, "node_modules/minipass": { "version": "7.1.2", - "dev": true, "license": "ISC", "engines": { "node": ">=16 || 14 >=14.17" @@ -15181,7 +21894,6 @@ }, "node_modules/mz": { "version": "2.7.0", - "dev": true, "license": "MIT", "dependencies": { "any-promise": "^1.0.0", @@ -15564,7 +22276,6 @@ }, "node_modules/normalize-path": { "version": "3.0.0", - "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -15887,7 +22598,6 @@ }, "node_modules/object-hash": { "version": "3.0.0", - "dev": true, "license": "MIT", "engines": { "node": ">= 6" @@ -16003,6 +22713,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/once": { "version": "1.4.0", "dev": true, @@ -16408,9 +23128,15 @@ "node": ">=0.10.0" } }, + "node_modules/path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==", + "dev": true, + "license": "(WTFPL OR MIT)" + }, "node_modules/path-key": { "version": "3.1.1", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -16418,12 +23144,10 @@ }, "node_modules/path-parse": { "version": "1.0.7", - "dev": true, "license": "MIT" }, "node_modules/path-scurry": { "version": "1.11.1", - "dev": true, "license": "BlueOak-1.0.0", "dependencies": { "lru-cache": "^10.2.0", @@ -16438,9 +23162,15 @@ }, "node_modules/path-scurry/node_modules/lru-cache": { "version": "10.4.3", - "dev": true, "license": "ISC" }, + "node_modules/path-to-regexp": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.3.0.tgz", + "integrity": "sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw==", + "dev": true, + "license": "MIT" + }, "node_modules/path-type": { "version": "4.0.0", "dev": true, @@ -16481,7 +23211,6 @@ }, "node_modules/picomatch": { "version": "2.3.1", - "dev": true, "license": "MIT", "engines": { "node": ">=8.6" @@ -16505,7 +23234,6 @@ }, "node_modules/pirates": { "version": "4.0.6", - "dev": true, "license": "MIT", "engines": { "node": ">= 6" @@ -16672,7 +23400,6 @@ "version": "8.5.3", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", - "dev": true, "funding": [ { "type": "opencollective", @@ -16699,7 +23426,6 @@ }, "node_modules/postcss-import": { "version": "15.1.0", - "dev": true, "license": "MIT", "dependencies": { "postcss-value-parser": "^4.0.0", @@ -16715,7 +23441,6 @@ }, "node_modules/postcss-import/node_modules/resolve": { "version": "1.22.8", - "dev": true, "license": "MIT", "dependencies": { "is-core-module": "^2.13.0", @@ -16731,7 +23456,6 @@ }, "node_modules/postcss-js": { "version": "4.0.1", - "dev": true, "license": "MIT", "dependencies": { "camelcase-css": "^2.0.1" @@ -16749,7 +23473,6 @@ }, "node_modules/postcss-load-config": { "version": "4.0.2", - "dev": true, "funding": [ { "type": "opencollective", @@ -16783,7 +23506,6 @@ }, "node_modules/postcss-load-config/node_modules/lilconfig": { "version": "3.0.0", - "dev": true, "license": "MIT", "engines": { "node": ">=14" @@ -16846,7 +23568,6 @@ }, "node_modules/postcss-nested": { "version": "6.0.1", - "dev": true, "license": "MIT", "dependencies": { "postcss-selector-parser": "^6.0.11" @@ -16864,7 +23585,6 @@ }, "node_modules/postcss-selector-parser": { "version": "6.0.15", - "dev": true, "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -16876,7 +23596,6 @@ }, "node_modules/postcss-value-parser": { "version": "4.2.0", - "dev": true, "license": "MIT" }, "node_modules/prelude-ls": { @@ -17063,6 +23782,15 @@ "node": ">=6" } }, + "node_modules/qrcode.react": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/qrcode.react/-/qrcode.react-4.2.0.tgz", + "integrity": "sha512-QpgqWi8rD9DsS9EP3z7BT+5lY5SFhsqGjpgW5DY/i3mK4M9DTBNz3ErMi8BWYEfI3L0d8GIbGmcdFAS1uIRGjA==", + "license": "ISC", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, "node_modules/querystring": { "version": "0.2.0", "engines": { @@ -17076,7 +23804,6 @@ }, "node_modules/queue-microtask": { "version": "1.2.3", - "dev": true, "funding": [ { "type": "github", @@ -17111,6 +23838,42 @@ "safe-buffer": "^5.1.0" } }, + "node_modules/range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/rc/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/react": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", @@ -17241,7 +24004,6 @@ }, "node_modules/read-cache": { "version": "1.0.0", - "dev": true, "license": "MIT", "dependencies": { "pify": "^2.3.0" @@ -17249,7 +24011,6 @@ }, "node_modules/read-cache/node_modules/pify": { "version": "2.3.0", - "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -17530,7 +24291,6 @@ }, "node_modules/readdirp": { "version": "3.6.0", - "dev": true, "license": "MIT", "dependencies": { "picomatch": "^2.2.1" @@ -17636,6 +24396,30 @@ "node": ">=4" } }, + "node_modules/registry-auth-token": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz", + "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "rc": "^1.1.6", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/registry-url": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", + "integrity": "sha512-ZbgR5aZEdf4UKZVBPYIgaglBmSF2Hi94s2PcIHhRGFjKYu+chjJdYfHn4rt3hB6eCKLJ8giVIIfgMa1ehDfZKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "rc": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/regjsgen": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", @@ -17801,7 +24585,6 @@ }, "node_modules/reusify": { "version": "1.0.4", - "dev": true, "license": "MIT", "engines": { "iojs": ">=1.0.0", @@ -17927,7 +24710,6 @@ }, "node_modules/run-parallel": { "version": "1.2.0", - "dev": true, "funding": [ { "type": "github", @@ -18110,6 +24892,115 @@ "randombytes": "^2.1.0" } }, + "node_modules/serve": { + "version": "14.2.4", + "resolved": "https://registry.npmjs.org/serve/-/serve-14.2.4.tgz", + "integrity": "sha512-qy1S34PJ/fcY8gjVGszDB3EXiPSk5FKhUa7tQe0UPRddxRidc2V6cNHPNewbE1D7MAkgLuWEt3Vw56vYy73tzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@zeit/schemas": "2.36.0", + "ajv": "8.12.0", + "arg": "5.0.2", + "boxen": "7.0.0", + "chalk": "5.0.1", + "chalk-template": "0.4.0", + "clipboardy": "3.0.0", + "compression": "1.7.4", + "is-port-reachable": "4.0.0", + "serve-handler": "6.1.6", + "update-check": "1.5.4" + }, + "bin": { + "serve": "build/main.js" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/serve-handler": { + "version": "6.1.6", + "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.6.tgz", + "integrity": "sha512-x5RL9Y2p5+Sh3D38Fh9i/iQ5ZK+e4xuXRd/pGbM4D13tgo/MGwbttUk8emytcr1YYzBYs+apnUngBDFYfpjPuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "3.0.0", + "content-disposition": "0.5.2", + "mime-types": "2.1.18", + "minimatch": "3.1.2", + "path-is-inside": "1.0.2", + "path-to-regexp": "3.3.0", + "range-parser": "1.2.0" + } + }, + "node_modules/serve-handler/node_modules/mime-db": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-handler/node_modules/mime-types": { + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "~1.33.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/serve/node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true, + "license": "MIT" + }, + "node_modules/serve/node_modules/chalk": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.0.1.tgz", + "integrity": "sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/serve/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, "node_modules/set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", @@ -18200,7 +25091,6 @@ }, "node_modules/shebang-command": { "version": "2.0.0", - "dev": true, "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" @@ -18211,7 +25101,6 @@ }, "node_modules/shebang-regex": { "version": "3.0.0", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -18551,7 +25440,6 @@ }, "node_modules/string-width": { "version": "4.2.3", - "dev": true, "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", @@ -18565,7 +25453,6 @@ "node_modules/string-width-cjs": { "name": "string-width", "version": "4.2.3", - "dev": true, "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", @@ -18639,7 +25526,6 @@ }, "node_modules/strip-ansi": { "version": "6.0.1", - "dev": true, "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" @@ -18651,7 +25537,6 @@ "node_modules/strip-ansi-cjs": { "name": "strip-ansi", "version": "6.0.1", - "dev": true, "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" @@ -18780,7 +25665,6 @@ }, "node_modules/sucrase": { "version": "3.35.0", - "dev": true, "license": "MIT", "dependencies": { "@jridgewell/gen-mapping": "^0.3.2", @@ -18801,7 +25685,6 @@ }, "node_modules/sucrase/node_modules/brace-expansion": { "version": "2.0.1", - "dev": true, "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" @@ -18809,7 +25692,6 @@ }, "node_modules/sucrase/node_modules/commander": { "version": "4.1.1", - "dev": true, "license": "MIT", "engines": { "node": ">= 6" @@ -18817,7 +25699,6 @@ }, "node_modules/sucrase/node_modules/glob": { "version": "10.3.10", - "dev": true, "license": "ISC", "dependencies": { "foreground-child": "^3.1.0", @@ -18838,12 +25719,10 @@ }, "node_modules/sucrase/node_modules/lines-and-columns": { "version": "1.2.4", - "dev": true, "license": "MIT" }, "node_modules/sucrase/node_modules/minimatch": { "version": "9.0.3", - "dev": true, "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" @@ -18868,7 +25747,6 @@ }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -18882,9 +25760,18 @@ "dev": true, "license": "MIT" }, + "node_modules/tailwind-merge": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.3.1.tgz", + "integrity": "sha512-gBXpgUm/3rp1lMZZrM/w7D8GKqshif0zAymAhbCyIt8KMe+0v9DQ7cdYLR4FHH/cKpdTXb+A/tKKU3eolfsI+g==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } + }, "node_modules/tailwindcss": { "version": "3.4.1", - "dev": true, "license": "MIT", "dependencies": { "@alloc/quick-lru": "^5.2.0", @@ -18918,14 +25805,21 @@ "node": ">=14.0.0" } }, + "node_modules/tailwindcss-animate": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/tailwindcss-animate/-/tailwindcss-animate-1.0.7.tgz", + "integrity": "sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==", + "license": "MIT", + "peerDependencies": { + "tailwindcss": ">=3.0.0 || insiders" + } + }, "node_modules/tailwindcss/node_modules/arg": { "version": "5.0.2", - "dev": true, "license": "MIT" }, "node_modules/tailwindcss/node_modules/resolve": { "version": "1.22.8", - "dev": true, "license": "MIT", "dependencies": { "is-core-module": "^2.13.0", @@ -19102,7 +25996,6 @@ }, "node_modules/thenify": { "version": "3.3.1", - "dev": true, "license": "MIT", "dependencies": { "any-promise": "^1.0.0" @@ -19110,7 +26003,6 @@ }, "node_modules/thenify-all": { "version": "1.6.0", - "dev": true, "license": "MIT", "dependencies": { "thenify": ">= 3.1.0 < 4" @@ -19275,7 +26167,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, "license": "MIT", "dependencies": { "is-number": "^7.0.0" @@ -19357,7 +26248,6 @@ }, "node_modules/ts-interface-checker": { "version": "0.1.13", - "dev": true, "license": "Apache-2.0" }, "node_modules/ts-loader": { @@ -19389,7 +26279,7 @@ }, "node_modules/ts-node": { "version": "10.9.2", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@cspotcode/source-map-support": "^0.8.0", @@ -19600,7 +26490,7 @@ "version": "5.8.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", - "dev": true, + "devOptional": true, "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", @@ -19652,6 +26542,15 @@ "node": ">=0.8.0" } }, + "node_modules/ulid": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/ulid/-/ulid-2.4.0.tgz", + "integrity": "sha512-fIRiVTJNcSRmXKPZtGzFQv9WRrZ3M9eoptl/teFJvjOzmpU+/K/JH6HZ8deBfb5vMEpicJcLn7JmvdknlMq7Zg==", + "license": "MIT", + "bin": { + "ulid": "bin/cli.js" + } + }, "node_modules/unbox-primitive": { "version": "1.0.2", "dev": true, @@ -19793,6 +26692,17 @@ "browserslist": ">= 4.21.0" } }, + "node_modules/update-check": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/update-check/-/update-check-1.5.4.tgz", + "integrity": "sha512-5YHsflzHP4t1G+8WGPlvKbJEbAJGCgw+Em+dGR1KmBUbr1J36SJBqlHLjR7oob7sco5hWHGQVcr9B2poIVDDTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "registry-auth-token": "3.3.2", + "registry-url": "3.1.0" + } + }, "node_modules/uri-js": { "version": "4.4.1", "dev": true, @@ -19840,7 +26750,6 @@ }, "node_modules/util-deprecate": { "version": "1.0.2", - "dev": true, "license": "MIT" }, "node_modules/utila": { @@ -19863,7 +26772,7 @@ }, "node_modules/v8-compile-cache-lib": { "version": "3.0.1", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/validate-npm-package-license": { @@ -19885,6 +26794,16 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/vite": { "version": "6.3.5", "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.5.tgz", @@ -21746,6 +28665,34 @@ "node": ">=10" } }, + "node_modules/wait-port": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/wait-port/-/wait-port-1.1.0.tgz", + "integrity": "sha512-3e04qkoN3LxTMLakdqeWth8nih8usyg+sf1Bgdf9wwUkp05iuK1eSY/QpLvscT/+F/gA89+LpUmmgBtesbqI2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.2", + "commander": "^9.3.0", + "debug": "^4.3.4" + }, + "bin": { + "wait-port": "bin/wait-port.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/wait-port/node_modules/commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || >=14" + } + }, "node_modules/walk-up-path": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/walk-up-path/-/walk-up-path-3.0.1.tgz", @@ -21781,6 +28728,10 @@ "resolved": "playground/web-js", "link": true }, + "node_modules/web-js-script": { + "resolved": "playground/web-js-script", + "link": true + }, "node_modules/web-streams-polyfill": { "version": "3.3.2", "dev": true, @@ -21948,7 +28899,6 @@ }, "node_modules/which": { "version": "2.0.2", - "dev": true, "license": "ISC", "dependencies": { "isexe": "^2.0.0" @@ -22033,6 +28983,76 @@ "string-width": "^1.0.2 || 2 || 3 || 4" } }, + "node_modules/widest-line": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", + "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", + "dev": true, + "license": "MIT", + "dependencies": { + "string-width": "^5.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/widest-line/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/widest-line/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/widest-line/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/widest-line/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/wildcard": { "version": "2.0.1", "dev": true, @@ -22063,7 +29083,6 @@ "node_modules/wrap-ansi-cjs": { "name": "wrap-ansi", "version": "7.0.0", - "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", @@ -22278,7 +29297,6 @@ "version": "2.7.1", "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.1.tgz", "integrity": "sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ==", - "dev": true, "license": "ISC", "bin": { "yaml": "bin.mjs" @@ -22351,7 +29369,7 @@ }, "node_modules/yn": { "version": "3.1.1", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=6" @@ -22460,7 +29478,7 @@ }, "packages/shared-util": { "name": "@corbado/shared-util", - "version": "1.0.10", + "version": "1.0.11", "license": "MIT", "devDependencies": { "@babel/core": "^7.24.0", @@ -22919,9 +29937,11 @@ "devDependencies": { "@playwright/test": "^1.47.0", "@types/node": "^20.10.5", + "get-port": "^5.1.1", "ngrok": "^5.0.0-beta.2", "node-2fa": "^2.0.3", - "playwright-slack-report": "^1.1.72" + "playwright-slack-report": "^1.1.72", + "wait-port": "^1.1.0" } }, "packages/types": { @@ -22973,17 +29993,29 @@ "name": "connect-react-next", "version": "0.1.0", "dependencies": { - "@aws-sdk/client-cognito-identity-provider": "^3.423.0", + "@aws-sdk/client-cognito-identity-provider": "^3.799.0", "@aws-sdk/credential-providers": "^3.624.0", "@corbado/connect-react": "*", + "@radix-ui/react-separator": "^1.1.7", + "@radix-ui/react-slot": "^1.2.0", + "aws-amplify": "^6.14.4", + "aws-jwt-verify": "^5.0.0", "aws-sdk": "^2.1646.0", "axios": "^1.7.3", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", "crypto-js": "^4.2.0", + "input-otp": "^1.4.2", + "jose": "^6.0.10", "jsonwebtoken": "^9.0.2", "jwks-rsa": "^3.1.0", + "lucide-react": "^0.507.0", "next": "15.2.4", + "qrcode.react": "^4.2.0", "react": "^18", "react-dom": "^18", + "tailwind-merge": "^3.2.0", + "tailwindcss-animate": "^1.0.7", "totp-generator": "^1.0.0" }, "devDependencies": { @@ -22997,6 +30029,15 @@ "typescript": "^5" } }, + "playground/connect-next/node_modules/jose": { + "version": "6.0.12", + "resolved": "https://registry.npmjs.org/jose/-/jose-6.0.12.tgz", + "integrity": "sha512-T8xypXs8CpmiIi78k0E+Lk7T2zlK4zDyg+o1CZ4AkOHgDg98ogdP2BeZ61lTFKFyoEwJ9RgAgN+SdM3iPgNonQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, "playground/react": { "name": "react-ui", "version": "0.1.0", @@ -24058,7 +31099,15 @@ }, "devDependencies": { "dotenv-webpack": "^8.0.1", - "html-webpack-plugin": "^5.6.3" + "html-webpack-plugin": "^5.6.3", + "serve": "^14.2.4" + } + }, + "playground/web-js-script": { + "version": "1.0.0", + "license": "ISC", + "devDependencies": { + "serve": "^14.2.4" } } } diff --git a/packages/connect-react/src/components/append/AppendInitScreen.tsx b/packages/connect-react/src/components/append/AppendInitScreen.tsx index c53d96c35..8a6916eaf 100644 --- a/packages/connect-react/src/components/append/AppendInitScreen.tsx +++ b/packages/connect-react/src/components/append/AppendInitScreen.tsx @@ -154,7 +154,6 @@ const AppendInitScreen = () => { const handleSubmit = useCallback( async (attestationOptions: string, showErrorIfCancelled: boolean) => { - console.log('handleSubmit', attestationOptions); if (appendLoading || skipping) { return; } diff --git a/packages/connect-react/src/components/login-second-factor/InitScreen.tsx b/packages/connect-react/src/components/login-second-factor/InitScreen.tsx index 334a0f74f..1d6627d1f 100644 --- a/packages/connect-react/src/components/login-second-factor/InitScreen.tsx +++ b/packages/connect-react/src/components/login-second-factor/InitScreen.tsx @@ -113,8 +113,6 @@ const InitScreen = () => { return handleSituation(LoginSituationCode.CboApiNotAvailablePostAuthenticator); } - console.log('loginContinue', res.val); - try { await config.onComplete(res.val.session); } catch { diff --git a/packages/connect-react/src/components/passkeyList/PasskeyListScreen.tsx b/packages/connect-react/src/components/passkeyList/PasskeyListScreen.tsx index 72750265c..644198235 100644 --- a/packages/connect-react/src/components/passkeyList/PasskeyListScreen.tsx +++ b/packages/connect-react/src/components/passkeyList/PasskeyListScreen.tsx @@ -166,7 +166,6 @@ const PasskeyListScreen = () => { return handleSituation(PasskeyListSituationCode.CboApiNotAvailableDuringInitialLoad, passkeyList.val); } - console.log('passkeyList', passkeyList.val.passkeys); setPasskeyListToken(listTokenRes); setPasskeyList(passkeyList.val.passkeys); statefulLoader.current.finish(); diff --git a/packages/tests-e2e/.env.complete.ci b/packages/tests-e2e/.env.complete.ci index 636344bea..5e5a4cb60 100644 --- a/packages/tests-e2e/.env.complete.ci +++ b/packages/tests-e2e/.env.complete.ci @@ -1,3 +1,3 @@ DEVELOPERPANEL_API_URL=https://console.cloud.corbado-staging.io -BACKEND_API_URL=https://backendapi.cloud.corbado-staging.io +CORBADO_BACKEND_API_URL=https://backendapi.cloud.corbado-staging.io FRONTEND_API_URL_SUFFIX=frontendapi.cloud.corbado-staging.io diff --git a/packages/tests-e2e/.env.complete.example b/packages/tests-e2e/.env.complete.example index 7b0d36135..2a5850d4e 100644 --- a/packages/tests-e2e/.env.complete.example +++ b/packages/tests-e2e/.env.complete.example @@ -1,7 +1,7 @@ # save to .env.local -PLAYWRIGHT_TEST_URL=http://localhost:3000 +PLAYWRIGHT_TEST_URL=http://localhost DEVELOPERPANEL_API_URL=https://console.cloud.corbado-staging.io -BACKEND_API_URL=https://backendapi.cloud.corbado-staging.io +CORBADO_BACKEND_API_URL=https://backendapi.cloud.corbado-staging.io FRONTEND_API_URL_SUFFIX= PLAYWRIGHT_GOOGLE_EMAIL= PLAYWRIGHT_GOOGLE_PASSWORD= diff --git a/packages/tests-e2e/.env.connect.ci b/packages/tests-e2e/.env.connect.ci index 136997e7b..6aff2d306 100644 --- a/packages/tests-e2e/.env.connect.ci +++ b/packages/tests-e2e/.env.connect.ci @@ -1,3 +1,3 @@ -BACKEND_API_URL=https://backendapi.cloud.corbado-staging.io +CORBADO_BACKEND_API_URL=https://backendapi.cloud.corbado-staging.io #DEVELOPERPANEL_API_URL=https://console.cloud.corbado-staging.io #FRONTEND_API_URL_SUFFIX=frontendapi.cloud.corbado-staging.io diff --git a/packages/tests-e2e/.env.connect.example b/packages/tests-e2e/.env.connect.example index 7d08eec39..6d922847d 100644 --- a/packages/tests-e2e/.env.connect.example +++ b/packages/tests-e2e/.env.connect.example @@ -1,6 +1,6 @@ # save to .env.local -PLAYWRIGHT_TEST_URL=https://develop.connect-next.playground.corbado.io +PLAYWRIGHT_TEST_URL=http://localhost DEVELOPERPANEL_API_URL=https://console.cloud.corbado-staging.io -BACKEND_API_URL=https://backendapi.cloud.corbado-staging.io -BACKEND_API_BASIC_AUTH= +CORBADO_BACKEND_API_URL=https://backendapi.cloud.corbado-staging.io +CORBADO_BACKEND_API_BASIC_AUTH= PLAYWRIGHT_NGROK_AUTH_TOKEN= diff --git a/packages/tests-e2e/README.md b/packages/tests-e2e/README.md index 78fbe14ee..d5a33afdc 100644 --- a/packages/tests-e2e/README.md +++ b/packages/tests-e2e/README.md @@ -4,46 +4,24 @@ This package currently contains all the end-to-end tests for testing the React p ## Running Tests Locally -This package is intended to test the local Playground React deployment connected to the staging backend deployment. +Playground is locally run within Playwright for both Complete and Connect tests. For reference look at `utils/playground.ts`. -### Setup +This means that tests can simply be run with a single command. The command depends on whether you want to run it headless or with UI. -Copy the contents of .env.example into .env.local. -For `PLAYWRIGHT_JWT_TOKEN` environment variable, request the JWT token from Martin or Stefan. -For `PLAYWRIGHT_MICROSOFT_EMAIL` and `PLAYWRIGHT_MICROSOFT_PASSWORD` environment variables, request the credentials from Anders or Martin. You can also create your own Microsoft account for testing. +### Headless -Make sure that the local Playground React deployment is configured to connect to the staging frontend API endpoints in `playground/react/.env`. - -``` -REACT_APP_CORBADO_FRONTEND_API_URL_SUFFIX=frontendapi.cloud.corbado-staging.io ``` - -Run the Playground React project locally. - -```console -$ cd playground/react -$ npm start +cd packages/tests-e2e +npm run e2e:complete +npm run e2e:connect ``` -Now Playwright is ready to test the local Playground deployment. - ### With UI -```console -$ cd packages/tests-e2e -$ npx playwright test --config=playwright.config.complete.ts --ui --project=nightly -``` - -### From CLI - -```console -npx playwright test --config=playwright.config.complete.ts --project=nightly ``` - -Alternatively, you can do: - -```console -npm run e2e:ui:nightly +cd packages/tests-e2e +npm run e2e:complete:ui +npm run e2e:connect:ui ``` ## Generating JWT Token @@ -78,3 +56,11 @@ echo $JWT The first segment of the script contains all the information that must be extracted from the backend deployment. As evident in the script, the token is valid for around 34 days. The token is intended to be renewed monthly using this script. For rewnewal, it is not necessary to extract all the information in the first segment. + +## Authoring rules (connect2) + +- Knowledge about page structure lives in `/models` only. Scenarios call model methods, not raw selectors. +- All passkey authenticator interactions flow through `VirtualAuthenticator`. +- All TOTP authenticator interactions flow through `AuthenticatorApp`. +- Scenarios set up app state via navigation helpers and avoid duplicating UI logic. +- Prefer explicit `awaitPage/visible` checks when changing screens. diff --git a/packages/tests-e2e/package.json b/packages/tests-e2e/package.json index aa87efa6b..c869b6e0f 100644 --- a/packages/tests-e2e/package.json +++ b/packages/tests-e2e/package.json @@ -24,9 +24,11 @@ "devDependencies": { "@playwright/test": "^1.47.0", "@types/node": "^20.10.5", + "get-port": "^5.1.1", "ngrok": "^5.0.0-beta.2", "node-2fa": "^2.0.3", - "playwright-slack-report": "^1.1.72" + "playwright-slack-report": "^1.1.72", + "wait-port": "^1.1.0" }, "dependencies": { "dotenv": "^16.4.5" diff --git a/packages/tests-e2e/playwright.config.complete.ts b/packages/tests-e2e/playwright.config.complete.ts index 5f3163afa..8364eaaf6 100644 --- a/packages/tests-e2e/playwright.config.complete.ts +++ b/packages/tests-e2e/playwright.config.complete.ts @@ -13,6 +13,27 @@ if (process.env.CI) { dotenv.config({ path: path.resolve(__dirname, '.env.complete.local'), override: true }); } +// type PlaygroundType = 'react' | 'web-js' | 'web-js-script'; +// +// const PLAYGROUND_TYPE: PlaygroundType = +// (process.env.PLAYGROUND_TYPE as PlaygroundType) || 'react'; +// +// let webServerCommand: string; +// +// switch (PLAYGROUND_TYPE) { +// case 'react': +// webServerCommand = 'cd ../../playground/react && npm i && npm run build && npm run preview'; +// break; +// case 'web-js': +// webServerCommand = 'npm run serve:web-js-playground'; +// break; +// case 'web-js-script': +// webServerCommand = 'npm run serve:web-js-script-playground'; +// break; +// default: +// throw new Error(`Unknown PLAYGROUND_TYPE: ${PLAYGROUND_TYPE}`); +// } + export default defineConfig({ testDir: './src/complete', // fullyParallel: true, @@ -53,7 +74,7 @@ export default defineConfig({ use: { actionTimeout: operationTimeout, // default: none navigationTimeout: operationTimeout, // default: none - baseURL: process.env.PLAYWRIGHT_TEST_URL, + // baseURL: process.env.PLAYWRIGHT_TEST_URL, screenshot: 'only-on-failure', video: 'retain-on-failure', trace: 'retain-on-failure', @@ -72,4 +93,5 @@ export default defineConfig({ testMatch: ['scenarios/passkey-list-general/*.ts'], }, ], + globalSetup: 'src/complete/utils/playground.ts', }); diff --git a/packages/tests-e2e/playwright.config.connect.ts b/packages/tests-e2e/playwright.config.connect.ts index 526da0fb3..1626916d2 100644 --- a/packages/tests-e2e/playwright.config.connect.ts +++ b/packages/tests-e2e/playwright.config.connect.ts @@ -2,7 +2,7 @@ import { defineConfig } from '@playwright/test'; import dotenv from 'dotenv'; import path from 'path'; -import { operationTimeout, totalTimeout } from './src/connect/utils/Constants'; +const operationTimeout = 5000; if (process.env.CI) { dotenv.config({ path: path.resolve(__dirname, '.env.connect.ci'), override: true }); @@ -12,7 +12,6 @@ if (process.env.CI) { export default defineConfig({ testDir: './src/connect', - // fullyParallel: true, forbidOnly: !!process.env.CI, retries: 4, workers: process.env.CI @@ -20,55 +19,33 @@ export default defineConfig({ ? parseInt(process.env.PLAYWRIGHT_NUM_CORES, 10) - 1 : undefined : undefined, - reporter: [ - // [ - // '../../node_modules/playwright-slack-report/dist/src/SlackReporter.js', - // { - // channels: ['corbado-tests'], - // sendResults: 'always', - // showInThread: true, - // meta: [ - // { - // key: 'Test Run Info', - // value: `https://github.com/corbado/javascript/actions/runs/${process.env.GITHUB_RUN_ID}`, - // }, - // { key: 'branch', value: `${process.env.GITHUB_BRANCH_NAME}` }, - // ], - // }, - // ], - ['html'], - ['junit', { outputFile: 'test-results/results.xml' }], - ], - timeout: totalTimeout, // default: 30000ms + reporter: [['html'], ['junit', { outputFile: 'test-results/results.xml' }]], + timeout: 120000, // default: 30000ms expect: { timeout: operationTimeout, // default: 5000ms }, use: { userAgent: - 'Mozilla/5.0 (Macintosh; Intel Mac OS X 15.3.2) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/129.0.6668.29 Safari/537.36', + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 15.3.2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36', actionTimeout: operationTimeout, // default: none navigationTimeout: operationTimeout, // default: none - baseURL: process.env.PLAYWRIGHT_TEST_URL, screenshot: 'only-on-failure', video: 'retain-on-failure', trace: 'retain-on-failure', }, projects: [ { - name: 'login-component', - testMatch: ['scenarios/login.spec.ts'], - }, - { - name: 'append-component', + name: 'append', testMatch: ['scenarios/append.spec.ts'], }, { - name: 'passkey-list-component', - testMatch: ['scenarios/passkey-list.spec.ts'], + name: 'login', + testMatch: ['scenarios/login.spec.ts'], }, { - name: 'misc', - testMatch: ['scenarios/misc.spec.ts'], + name: 'network-blocking', + testMatch: ['scenarios/network-blocking.spec.ts'], }, ], + globalSetup: 'src/connect/utils/Playground.ts', }); diff --git a/packages/tests-e2e/src/complete/models/CorbadoAuthModel.ts b/packages/tests-e2e/src/complete/models/CorbadoAuthModel.ts index b9a854142..d5e4a6a15 100644 --- a/packages/tests-e2e/src/complete/models/CorbadoAuthModel.ts +++ b/packages/tests-e2e/src/complete/models/CorbadoAuthModel.ts @@ -34,10 +34,10 @@ export class CorbadoAuthModel { this.phoneVerify = new PhoneVerifyBlockModel(page); } - async load(projectId: string, passkeySupport?: boolean, hashCode?: string) { + async load(projectId: string, port: number, passkeySupport?: boolean, hashCode?: string) { this.projectId = projectId; - let url = `/${this.projectId}/auth`; + let url = `${process.env.PLAYWRIGHT_TEST_URL}:${port.toString()}/${this.projectId}/auth`; if (hashCode) { url += `#${hashCode}`; } diff --git a/packages/tests-e2e/src/complete/models/PasskeyListModel.ts b/packages/tests-e2e/src/complete/models/PasskeyListModel.ts index ac14fc440..3fc560b36 100644 --- a/packages/tests-e2e/src/complete/models/PasskeyListModel.ts +++ b/packages/tests-e2e/src/complete/models/PasskeyListModel.ts @@ -21,14 +21,14 @@ export class PasskeyListModel { this.virtualAuthenticator = virtualAuthenticator; } - async load(projectId: string, passkeySupport?: boolean) { + async load(projectId: string, port: number, passkeySupport?: boolean) { this.projectId = projectId; if (passkeySupport !== undefined) { await this.virtualAuthenticator.addWebAuthn(passkeySupport); } - const url = `/${this.projectId}/auth#signup-init`; + const url = `${process.env.PLAYWRIGHT_TEST_URL}:${port.toString()}/${this.projectId}/auth#signup-init`; await this.page.goto(url); await this.page.waitForSelector('.cb-container-body'); diff --git a/packages/tests-e2e/src/complete/models/corbado-auth-blocks/EmailVerifyBlockModel.ts b/packages/tests-e2e/src/complete/models/corbado-auth-blocks/EmailVerifyBlockModel.ts index acb6916cb..17291b31d 100644 --- a/packages/tests-e2e/src/complete/models/corbado-auth-blocks/EmailVerifyBlockModel.ts +++ b/packages/tests-e2e/src/complete/models/corbado-auth-blocks/EmailVerifyBlockModel.ts @@ -27,8 +27,8 @@ export class EmailVerifyBlockModel { } } - async clickEmailLink(projectID: string, email: string, authType: AuthType, type: LinkType) { - const link = await this.#generateEmailLink(projectID, email, authType, type); + async clickEmailLink(projectID: string, port: number, email: string, authType: AuthType, type: LinkType) { + const link = await this.#generateEmailLink(projectID, port, email, authType, type); await this.page.goto(link); } @@ -64,7 +64,7 @@ export class EmailVerifyBlockModel { ).toBeVisible(); } - async #generateEmailLink(projectID: string, email: string, authType: AuthType, linkType: LinkType) { + async #generateEmailLink(projectID: string, port: number, email: string, authType: AuthType, linkType: LinkType) { const key = `cbo_auth_process-${projectID}`; const cboAuthProcessRaw = await this.page.evaluate(k => localStorage.getItem(k), key); if (!cboAuthProcessRaw) { @@ -89,6 +89,6 @@ export class EmailVerifyBlockModel { const serializedBlock = btoa(JSON.stringify(urlBlock)); - return `${process.env.PLAYWRIGHT_TEST_URL}/${projectID}/auth?corbadoEmailLinkID=${serializedBlock}&corbadoToken=${linkType}`; + return `http://localhost:${port.toString()}/${projectID}/auth?corbadoEmailLinkID=${serializedBlock}&corbadoToken=${linkType}`; } } diff --git a/packages/tests-e2e/src/complete/scenarios/corbado-auth-component-configs/email-username-verification-at-signup.spec.ts b/packages/tests-e2e/src/complete/scenarios/corbado-auth-component-configs/email-username-verification-at-signup.spec.ts index fe964f40a..f1ad5c1d7 100644 --- a/packages/tests-e2e/src/complete/scenarios/corbado-auth-component-configs/email-username-verification-at-signup.spec.ts +++ b/packages/tests-e2e/src/complete/scenarios/corbado-auth-component-configs/email-username-verification-at-signup.spec.ts @@ -1,3 +1,5 @@ +import type { ChildProcess } from 'node:child_process'; + import { test } from '../../fixtures/CorbadoAuth'; import { OtpCodeType } from '../../models/corbado-auth-blocks/EmailVerifyBlockModel'; import { SignupInitBlockModel } from '../../models/corbado-auth-blocks/SignupInitBlockModel'; @@ -8,9 +10,12 @@ import { ScreenNames, } from '../../utils/constants'; import { createProjectNew, deleteProjectNew, makeIdentifier, setComponentConfig } from '../../utils/developerpanel'; +import { killPlaygroundNew, spawnPlaygroundNew } from '../../utils/playground'; test.describe('tests that focus on these identifiers: email (verification at signup) + username', () => { let projectId: string; + let server: ChildProcess; + let port: number; test.beforeAll(async () => { projectId = await createProjectNew(); @@ -21,14 +26,18 @@ test.describe('tests that focus on these identifiers: email (verification at sig ]), makeIdentifier(IdentifierType.Username, IdentifierEnforceVerification.None, true, []), ]); + + ({ server, port } = await spawnPlaygroundNew(projectId)); }); test.afterAll(async () => { await deleteProjectNew(projectId); + + killPlaygroundNew(server); }); test('signup with passkey (happy path)', async ({ model }) => { - await model.load(projectId, true, 'signup-init'); + await model.load(projectId, port, true, 'signup-init'); const email = SignupInitBlockModel.generateRandomEmail(); const username = SignupInitBlockModel.generateRandomUsername(); diff --git a/packages/tests-e2e/src/complete/scenarios/corbado-auth-component-configs/email-verification-at-login.spec.ts b/packages/tests-e2e/src/complete/scenarios/corbado-auth-component-configs/email-verification-at-login.spec.ts index eec905dd0..21c52c5d4 100644 --- a/packages/tests-e2e/src/complete/scenarios/corbado-auth-component-configs/email-verification-at-login.spec.ts +++ b/packages/tests-e2e/src/complete/scenarios/corbado-auth-component-configs/email-verification-at-login.spec.ts @@ -1,3 +1,5 @@ +import type { ChildProcess } from 'node:child_process'; + import { test } from '../../fixtures/CorbadoAuth'; import { OtpCodeType } from '../../models/corbado-auth-blocks/EmailVerifyBlockModel'; import { SignupInitBlockModel } from '../../models/corbado-auth-blocks/SignupInitBlockModel'; @@ -8,9 +10,12 @@ import { ScreenNames, } from '../../utils/constants'; import { createProjectNew, deleteProjectNew, makeIdentifier, setComponentConfig } from '../../utils/developerpanel'; +import { killPlaygroundNew, spawnPlaygroundNew } from '../../utils/playground'; test.describe('tests that focus on these identifiers: email (verification at login)', () => { let projectId: string; + let server: ChildProcess; + let port: number; test.beforeAll(async () => { projectId = await createProjectNew(); @@ -20,14 +25,18 @@ test.describe('tests that focus on these identifiers: email (verification at log IdentifierVerification.EmailOtp, ]), ]); + + ({ server, port } = await spawnPlaygroundNew(projectId)); }); test.afterAll(async () => { await deleteProjectNew(projectId); + + killPlaygroundNew(server); }); test('signup with passkey (happy path)', async ({ model }) => { - await model.load(projectId, true, 'signup-init'); + await model.load(projectId, port, true, 'signup-init'); const email = SignupInitBlockModel.generateRandomEmail(); await model.signupInit.fillEmail(email); @@ -44,7 +53,7 @@ test.describe('tests that focus on these identifiers: email (verification at log }); test('signup with passkey (one passkey retry)', async ({ model }) => { - await model.load(projectId, true, 'signup-init'); + await model.load(projectId, port, true, 'signup-init'); const email = SignupInitBlockModel.generateRandomEmail(); await model.signupInit.fillEmail(email); @@ -58,7 +67,7 @@ test.describe('tests that focus on these identifiers: email (verification at log }); test('signup with explicit fallback', async ({ model }) => { - await model.load(projectId, true, 'signup-init'); + await model.load(projectId, port, true, 'signup-init'); const email = SignupInitBlockModel.generateRandomEmail(); await model.signupInit.fillEmail(email); @@ -70,7 +79,7 @@ test.describe('tests that focus on these identifiers: email (verification at log await model.logout(); // no passkey is available => we expect an emailVerify block - await model.load(projectId, undefined, 'login-init'); + await model.load(projectId, port, undefined, 'login-init'); await model.loginInit.fillEmailUsername(email); await model.loginInit.submitPrimary(); await model.emailVerify.fillOtpCode(OtpCodeType.Correct); @@ -82,7 +91,7 @@ test.describe('tests that focus on these identifiers: email (verification at log // during signup, the fallback is initiated automatically (user does not have to click on the fallback button) // during login, we don't ask the user to append a passkey test('signup with fallback (passkeys not available)', async ({ model }) => { - await model.load(projectId, false, 'signup-init'); + await model.load(projectId, port, false, 'signup-init'); const email = SignupInitBlockModel.generateRandomEmail(); await model.signupInit.fillEmail(email); @@ -93,7 +102,7 @@ test.describe('tests that focus on these identifiers: email (verification at log await model.logout(); // no passkey is available => we expect an emailVerify block - await model.load(projectId, undefined, 'login-init'); + await model.load(projectId, port, undefined, 'login-init'); await model.loginInit.fillEmailUsername(email); await model.loginInit.submitPrimary(); await model.emailVerify.fillOtpCode(OtpCodeType.Correct); diff --git a/packages/tests-e2e/src/complete/scenarios/corbado-auth-component-configs/email-verification-at-signup.spec.ts b/packages/tests-e2e/src/complete/scenarios/corbado-auth-component-configs/email-verification-at-signup.spec.ts index 0c2978d98..8f6a1b88c 100644 --- a/packages/tests-e2e/src/complete/scenarios/corbado-auth-component-configs/email-verification-at-signup.spec.ts +++ b/packages/tests-e2e/src/complete/scenarios/corbado-auth-component-configs/email-verification-at-signup.spec.ts @@ -1,3 +1,5 @@ +import type { ChildProcess } from 'node:child_process'; + import { test } from '../../fixtures/CorbadoAuth'; import { OtpCodeType } from '../../models/corbado-auth-blocks/EmailVerifyBlockModel'; import { SignupInitBlockModel } from '../../models/corbado-auth-blocks/SignupInitBlockModel'; @@ -8,10 +10,13 @@ import { ScreenNames, } from '../../utils/constants'; import { createProjectNew, deleteProjectNew, makeIdentifier, setComponentConfig } from '../../utils/developerpanel'; +import { killPlaygroundNew, spawnPlaygroundNew } from '../../utils/playground'; // this is the default component config that we offer test.describe('tests that focus on these identifiers: email (verification at signup)', () => { let projectId: string; + let server: ChildProcess; + let port: number; test.beforeAll(async () => { projectId = await createProjectNew(); @@ -21,14 +26,18 @@ test.describe('tests that focus on these identifiers: email (verification at sig IdentifierVerification.EmailOtp, ]), ]); + + ({ server, port } = await spawnPlaygroundNew(projectId)); }); test.afterAll(async () => { await deleteProjectNew(projectId); + + killPlaygroundNew(server); }); test('signup with passkey (happy path)', async ({ model }) => { - await model.load(projectId, true, 'signup-init'); + await model.load(projectId, port, true, 'signup-init'); const email = SignupInitBlockModel.generateRandomEmail(); await model.signupInit.fillEmail(email); @@ -45,7 +54,7 @@ test.describe('tests that focus on these identifiers: email (verification at sig }); test('signup with passkey (one passkey retry)', async ({ model }) => { - await model.load(projectId, true, 'signup-init'); + await model.load(projectId, port, true, 'signup-init'); const email = SignupInitBlockModel.generateRandomEmail(); await model.signupInit.fillEmail(email); @@ -61,7 +70,7 @@ test.describe('tests that focus on these identifiers: email (verification at sig }); test('signup with explicit fallback', async ({ model }) => { - await model.load(projectId, true, 'signup-init'); + await model.load(projectId, port, true, 'signup-init'); const email = SignupInitBlockModel.generateRandomEmail(); await model.signupInit.fillEmail(email); @@ -73,7 +82,7 @@ test.describe('tests that focus on these identifiers: email (verification at sig await model.logout(); // no passkey is available => we expect an emailVerify block - await model.load(projectId, undefined, 'login-init'); + await model.load(projectId, port, undefined, 'login-init'); await model.loginInit.fillEmailUsername(email); await model.loginInit.submitPrimary(); await model.emailVerify.fillOtpCode(OtpCodeType.Correct); @@ -85,7 +94,7 @@ test.describe('tests that focus on these identifiers: email (verification at sig // during signup, the fallback is initiated automatically (user does not have to click on the fallback button) // during login, we don't ask the user to append a passkey test('signup with fallback (passkeys not available)', async ({ model }) => { - await model.load(projectId, false, 'signup-init'); + await model.load(projectId, port, false, 'signup-init'); const email = SignupInitBlockModel.generateRandomEmail(); await model.signupInit.fillEmail(email); @@ -96,7 +105,7 @@ test.describe('tests that focus on these identifiers: email (verification at sig await model.logout(); // no passkey is available => we expect an emailVerify block - await model.load(projectId, undefined, 'login-init'); + await model.load(projectId, port, undefined, 'login-init'); await model.loginInit.fillEmailUsername(email); await model.loginInit.submitPrimary(); await model.emailVerify.fillOtpCode(OtpCodeType.Correct); diff --git a/packages/tests-e2e/src/complete/scenarios/corbado-auth-component-configs/email-verification-none.spec.ts b/packages/tests-e2e/src/complete/scenarios/corbado-auth-component-configs/email-verification-none.spec.ts index a69569d4b..0622178ba 100644 --- a/packages/tests-e2e/src/complete/scenarios/corbado-auth-component-configs/email-verification-none.spec.ts +++ b/packages/tests-e2e/src/complete/scenarios/corbado-auth-component-configs/email-verification-none.spec.ts @@ -1,3 +1,5 @@ +import type { ChildProcess } from 'node:child_process'; + import { test } from '../../fixtures/CorbadoAuth'; import { OtpCodeType } from '../../models/corbado-auth-blocks/EmailVerifyBlockModel'; import { SignupInitBlockModel } from '../../models/corbado-auth-blocks/SignupInitBlockModel'; @@ -8,9 +10,12 @@ import { ScreenNames, } from '../../utils/constants'; import { createProjectNew, deleteProjectNew, makeIdentifier, setComponentConfig } from '../../utils/developerpanel'; +import { killPlaygroundNew, spawnPlaygroundNew } from '../../utils/playground'; test.describe('tests that focus on these identifiers: email (verification none)', () => { let projectId: string; + let server: ChildProcess; + let port: number; test.beforeAll(async () => { projectId = await createProjectNew(); @@ -18,14 +23,18 @@ test.describe('tests that focus on these identifiers: email (verification none)' await setComponentConfig(projectId, [ makeIdentifier(IdentifierType.Email, IdentifierEnforceVerification.None, true, [IdentifierVerification.EmailOtp]), ]); + + ({ server, port } = await spawnPlaygroundNew(projectId)); }); test.afterAll(async () => { await deleteProjectNew(projectId); + + killPlaygroundNew(server); }); test('signup with passkey (happy path)', async ({ model }) => { - await model.load(projectId, true, 'signup-init'); + await model.load(projectId, port, true, 'signup-init'); const email = SignupInitBlockModel.generateRandomEmail(); await model.signupInit.fillEmail(email); @@ -41,7 +50,7 @@ test.describe('tests that focus on these identifiers: email (verification none)' }); test('signup with passkey (one passkey retry)', async ({ model }) => { - await model.load(projectId, true, 'signup-init'); + await model.load(projectId, port, true, 'signup-init'); const email = SignupInitBlockModel.generateRandomEmail(); await model.signupInit.fillEmail(email); @@ -55,7 +64,7 @@ test.describe('tests that focus on these identifiers: email (verification none)' }); test('signup with explicit fallback', async ({ model }) => { - await model.load(projectId, true, 'signup-init'); + await model.load(projectId, port, true, 'signup-init'); const email = SignupInitBlockModel.generateRandomEmail(); await model.signupInit.fillEmail(email); @@ -67,7 +76,7 @@ test.describe('tests that focus on these identifiers: email (verification none)' await model.logout(); // no passkey is available => we expect an emailVerify block - await model.load(projectId, undefined, 'login-init'); + await model.load(projectId, port, undefined, 'login-init'); await model.loginInit.fillEmailUsername(email); await model.loginInit.submitPrimary(); await model.emailVerify.fillOtpCode(OtpCodeType.Correct); @@ -79,7 +88,7 @@ test.describe('tests that focus on these identifiers: email (verification none)' // during signup, the fallback is initiated automatically (user does not have to click on the fallback button) // during login, we don't ask the user to append a passkey test('signup with fallback (passkeys not available)', async ({ model }) => { - await model.load(projectId, false, 'signup-init'); + await model.load(projectId, port, false, 'signup-init'); const email = SignupInitBlockModel.generateRandomEmail(); await model.signupInit.fillEmail(email); @@ -90,7 +99,7 @@ test.describe('tests that focus on these identifiers: email (verification none)' await model.logout(); // no passkey is available => we expect an emailVerify block - await model.load(projectId, undefined, 'login-init'); + await model.load(projectId, port, undefined, 'login-init'); await model.loginInit.fillEmailUsername(email); await model.loginInit.submitPrimary(); await model.emailVerify.fillOtpCode(OtpCodeType.Correct); diff --git a/packages/tests-e2e/src/complete/scenarios/corbado-auth-component-configs/phone-verification-at-signup.spec.ts b/packages/tests-e2e/src/complete/scenarios/corbado-auth-component-configs/phone-verification-at-signup.spec.ts index 8dbb7e022..3465c7421 100644 --- a/packages/tests-e2e/src/complete/scenarios/corbado-auth-component-configs/phone-verification-at-signup.spec.ts +++ b/packages/tests-e2e/src/complete/scenarios/corbado-auth-component-configs/phone-verification-at-signup.spec.ts @@ -1,3 +1,5 @@ +import type { ChildProcess } from 'node:child_process'; + import { test } from '../../fixtures/CorbadoAuth'; import { OtpCodeType } from '../../models/corbado-auth-blocks/PhoneVerifyBlockModel'; import { SignupInitBlockModel } from '../../models/corbado-auth-blocks/SignupInitBlockModel'; @@ -8,9 +10,12 @@ import { ScreenNames, } from '../../utils/constants'; import { createProjectNew, deleteProjectNew, makeIdentifier, setComponentConfig } from '../../utils/developerpanel'; +import { killPlaygroundNew, spawnPlaygroundNew } from '../../utils/playground'; test.describe('tests that focus on these identifiers: phone (verification at signup)', () => { let projectId: string; + let server: ChildProcess; + let port: number; test.beforeAll(async () => { projectId = await createProjectNew(); @@ -20,14 +25,18 @@ test.describe('tests that focus on these identifiers: phone (verification at sig IdentifierVerification.PhoneOtp, ]), ]); + + ({ server, port } = await spawnPlaygroundNew(projectId)); }); test.afterAll(async () => { await deleteProjectNew(projectId); + + killPlaygroundNew(server); }); test('signup with passkey (happy path)', async ({ model }) => { - await model.load(projectId, true, 'signup-init'); + await model.load(projectId, port, true, 'signup-init'); const identifier = SignupInitBlockModel.generateRandomPhone(); await model.signupInit.fillPhone(identifier); @@ -44,7 +53,7 @@ test.describe('tests that focus on these identifiers: phone (verification at sig }); test('signup with passkey (one passkey retry)', async ({ model }) => { - await model.load(projectId, true, 'signup-init'); + await model.load(projectId, port, true, 'signup-init'); const identifier = SignupInitBlockModel.generateRandomPhone(); await model.signupInit.fillPhone(identifier); @@ -60,7 +69,7 @@ test.describe('tests that focus on these identifiers: phone (verification at sig }); test('signup with explicit fallback', async ({ model }) => { - await model.load(projectId, true, 'signup-init'); + await model.load(projectId, port, true, 'signup-init'); const identifier = SignupInitBlockModel.generateRandomPhone(); await model.signupInit.fillPhone(identifier); @@ -72,7 +81,7 @@ test.describe('tests that focus on these identifiers: phone (verification at sig await model.logout(); // no passkey is available => we expect an phoneVerify block - await model.load(projectId, undefined, 'login-init'); + await model.load(projectId, port, undefined, 'login-init'); await model.loginInit.fillPhone(identifier); await model.loginInit.submitPrimary(); await model.phoneVerify.fillOtpCode(OtpCodeType.Correct); @@ -84,7 +93,7 @@ test.describe('tests that focus on these identifiers: phone (verification at sig // during signup, the fallback is initiated automatically (user does not have to click on the fallback button) // during login, we don't ask the user to append a passkey test('signup with fallback (passkeys not available)', async ({ model }) => { - await model.load(projectId, false, 'signup-init'); + await model.load(projectId, port, false, 'signup-init'); const identifier = SignupInitBlockModel.generateRandomPhone(); await model.signupInit.fillPhone(identifier); @@ -95,7 +104,7 @@ test.describe('tests that focus on these identifiers: phone (verification at sig await model.logout(); // no passkey is available => we expect an phoneVerify block - await model.load(projectId, undefined, 'login-init'); + await model.load(projectId, port, undefined, 'login-init'); await model.loginInit.fillPhone(identifier); await model.loginInit.submitPrimary(); await model.phoneVerify.fillOtpCode(OtpCodeType.Correct); diff --git a/packages/tests-e2e/src/complete/scenarios/corbado-auth-component-configs/username.spec.ts b/packages/tests-e2e/src/complete/scenarios/corbado-auth-component-configs/username.spec.ts index b45301f80..9bb45fce9 100644 --- a/packages/tests-e2e/src/complete/scenarios/corbado-auth-component-configs/username.spec.ts +++ b/packages/tests-e2e/src/complete/scenarios/corbado-auth-component-configs/username.spec.ts @@ -1,10 +1,15 @@ +import type { ChildProcess } from 'node:child_process'; + import { test } from '../../fixtures/CorbadoAuth'; import { SignupInitBlockModel } from '../../models/corbado-auth-blocks/SignupInitBlockModel'; import { IdentifierEnforceVerification, IdentifierType, ScreenNames } from '../../utils/constants'; import { createProjectNew, deleteProjectNew, makeIdentifier, setComponentConfig } from '../../utils/developerpanel'; +import { killPlaygroundNew, spawnPlaygroundNew } from '../../utils/playground'; test.describe('tests that focus on these identifiers: username', () => { let projectId: string; + let server: ChildProcess; + let port: number; test.beforeAll(async () => { projectId = await createProjectNew(); @@ -12,14 +17,18 @@ test.describe('tests that focus on these identifiers: username', () => { await setComponentConfig(projectId, [ makeIdentifier(IdentifierType.Username, IdentifierEnforceVerification.None, true, []), ]); + + ({ server, port } = await spawnPlaygroundNew(projectId)); }); test.afterAll(async () => { await deleteProjectNew(projectId); + + killPlaygroundNew(server); }); test('signup with passkey (happy path)', async ({ model }) => { - await model.load(projectId, true, 'signup-init'); + await model.load(projectId, port, true, 'signup-init'); const identifier = SignupInitBlockModel.generateRandomUsername(); await model.signupInit.fillUsername(identifier); @@ -35,7 +44,7 @@ test.describe('tests that focus on these identifiers: username', () => { }); test('signup with passkey (one passkey retry)', async ({ model }) => { - await model.load(projectId, true, 'signup-init'); + await model.load(projectId, port, true, 'signup-init'); const identifier = SignupInitBlockModel.generateRandomUsername(); await model.signupInit.fillUsername(identifier); @@ -51,7 +60,7 @@ test.describe('tests that focus on these identifiers: username', () => { // this tests a dead end scenario where passkeys are not available but the user can not signup // TODO: fix test.skip('signup with fallback (passkeys not available)', async ({ model }) => { - await model.load(projectId, false, 'signup-init'); + await model.load(projectId, port, false, 'signup-init'); const identifier = SignupInitBlockModel.generateRandomUsername(); await model.signupInit.fillUsername(identifier); diff --git a/packages/tests-e2e/src/complete/scenarios/corbado-auth-general/email-link-verify-obfuscation.spec.ts b/packages/tests-e2e/src/complete/scenarios/corbado-auth-general/email-link-verify-obfuscation.spec.ts index abd51326b..1ca5dc63e 100644 --- a/packages/tests-e2e/src/complete/scenarios/corbado-auth-general/email-link-verify-obfuscation.spec.ts +++ b/packages/tests-e2e/src/complete/scenarios/corbado-auth-general/email-link-verify-obfuscation.spec.ts @@ -1,3 +1,5 @@ +import type { ChildProcess } from 'node:child_process'; + import { expect, test } from '../../fixtures/CorbadoAuth'; import { LinkType } from '../../models/corbado-auth-blocks/EmailVerifyBlockModel'; import { SignupInitBlockModel } from '../../models/corbado-auth-blocks/SignupInitBlockModel'; @@ -9,9 +11,12 @@ import { ScreenNames, } from '../../utils/constants'; import { createProjectNew, deleteProjectNew, makeIdentifier, setComponentConfig } from '../../utils/developerpanel'; +import { killPlaygroundNew, spawnPlaygroundNew } from '../../utils/playground'; test.describe('email-verify block should obfuscate email addresses if they have not been provided by the user during login', () => { let projectId: string; + let server: ChildProcess; + let port: number; test.beforeAll(async () => { projectId = await createProjectNew(); @@ -22,14 +27,18 @@ test.describe('email-verify block should obfuscate email addresses if they have ]), makeIdentifier(IdentifierType.Username, IdentifierEnforceVerification.None, true, []), ]); + + ({ server, port } = await spawnPlaygroundNew(projectId)); }); test.afterAll(async () => { await deleteProjectNew(projectId); + + killPlaygroundNew(server); }); test('email is obfuscated during login if the login is started with username', async ({ model, page }) => { - await model.load(projectId, false, 'signup-init'); + await model.load(projectId, port, false, 'signup-init'); const email = SignupInitBlockModel.generateRandomEmail(); const username = SignupInitBlockModel.generateRandomUsername(); @@ -38,18 +47,18 @@ test.describe('email-verify block should obfuscate email addresses if they have await model.signupInit.submitPrimary(); await model.expectScreen(ScreenNames.EmailLinkSentSignup); - await model.emailVerify.clickEmailLink(projectId, email, AuthType.Login, LinkType.Correct); + await model.emailVerify.clickEmailLink(projectId, port, email, AuthType.Login, LinkType.Correct); await model.expectScreen(ScreenNames.End); await model.logout(); - await model.load(projectId, false, 'login-init'); + await model.load(projectId, port, false, 'login-init'); await model.loginInit.fillEmailUsername(username); await model.loginInit.submitPrimary(); await model.expectScreen(ScreenNames.EmailLinkSentLogin); await expect(page.getByText(email)).toHaveCount(0); - await model.load(projectId, false, 'login-init'); + await model.load(projectId, port, false, 'login-init'); await model.loginInit.fillEmailUsername(email); await model.loginInit.submitPrimary(); diff --git a/packages/tests-e2e/src/complete/scenarios/corbado-auth-general/email-otp-verify-general.spec.ts b/packages/tests-e2e/src/complete/scenarios/corbado-auth-general/email-otp-verify-general.spec.ts index 1d5f8ce6e..c06064719 100644 --- a/packages/tests-e2e/src/complete/scenarios/corbado-auth-general/email-otp-verify-general.spec.ts +++ b/packages/tests-e2e/src/complete/scenarios/corbado-auth-general/email-otp-verify-general.spec.ts @@ -8,10 +8,14 @@ import { ScreenNames, } from '../../utils/constants'; import { createProjectNew, deleteProjectNew, makeIdentifier, setComponentConfig } from '../../utils/developerpanel'; +import { killPlaygroundNew, spawnPlaygroundNew } from '../../utils/playground'; +import type { ChildProcess } from 'node:child_process'; // Here we test everything on LoginInit screen test.describe('general email-verify functionalities', () => { let projectId: string; + let server: ChildProcess; + let port: number; test.beforeAll(async () => { projectId = await createProjectNew(); @@ -19,14 +23,18 @@ test.describe('general email-verify functionalities', () => { await setComponentConfig(projectId, [ makeIdentifier(IdentifierType.Email, IdentifierEnforceVerification.None, true, [IdentifierVerification.EmailOtp]), ]); + + ({ server, port } = await spawnPlaygroundNew(projectId)); }); test.afterAll(async () => { await deleteProjectNew(projectId); + + killPlaygroundNew(server); }); test('signup with fallback (one retry)', async ({ model }) => { - await model.load(projectId, false, 'signup-init'); + await model.load(projectId, port, false, 'signup-init'); const email = SignupInitBlockModel.generateRandomEmail(); await model.signupInit.fillEmail(email); @@ -41,7 +49,7 @@ test.describe('general email-verify functionalities', () => { }); test('signup with fallback + identifier change', async ({ model }) => { - await model.load(projectId, false, 'signup-init'); + await model.load(projectId, port, false, 'signup-init'); const email1 = SignupInitBlockModel.generateRandomEmail(); await model.signupInit.fillEmail(email1); @@ -58,7 +66,7 @@ test.describe('general email-verify functionalities', () => { await model.logout(); // only login with email2 should be possible - await model.load(projectId, false, 'login-init'); + await model.load(projectId, port, false, 'login-init'); await model.loginInit.fillEmailUsername(email1); await model.loginInit.submitPrimary(); await model.loginInit.expectTextError("Couldn't find your account."); @@ -69,7 +77,7 @@ test.describe('general email-verify functionalities', () => { }); test('signup with fallback + identifier change (abort + continue with email 1)', async ({ model }) => { - await model.load(projectId, false, 'signup-init'); + await model.load(projectId, port, false, 'signup-init'); const email1 = SignupInitBlockModel.generateRandomEmail(); await model.signupInit.fillEmail(email1); @@ -86,7 +94,7 @@ test.describe('general email-verify functionalities', () => { await model.logout(); // only login with email1 should be possible - await model.load(projectId, false, 'login-init'); + await model.load(projectId, port, false, 'login-init'); await model.loginInit.fillEmailUsername(email2); await model.loginInit.submitPrimary(); await model.loginInit.expectTextError("Couldn't find your account."); @@ -100,7 +108,7 @@ test.describe('general email-verify functionalities', () => { // then we start a new process and signup with email 2 // during verification we try to switch back to email 1 => this must fail test('signup with fallback + identifier change (email already exists)', async ({ model }) => { - await model.load(projectId, false, 'signup-init'); + await model.load(projectId, port, false, 'signup-init'); const email1 = SignupInitBlockModel.generateRandomEmail(); await model.signupInit.fillEmail(email1); @@ -109,7 +117,7 @@ test.describe('general email-verify functionalities', () => { await model.expectScreen(ScreenNames.End); await model.logout(); - await model.load(projectId, false, 'signup-init'); + await model.load(projectId, port, false, 'signup-init'); const email2 = SignupInitBlockModel.generateRandomEmail(); await model.signupInit.fillEmail(email2); @@ -123,7 +131,7 @@ test.describe('general email-verify functionalities', () => { // TODO: fix test.skip('signup with explicit fallback (too many wrong codes)', async ({ model }) => { - await model.load(projectId, false, 'signup-init'); + await model.load(projectId, port, false, 'signup-init'); const email = SignupInitBlockModel.generateRandomEmail(); await model.signupInit.fillEmail(email); diff --git a/packages/tests-e2e/src/complete/scenarios/corbado-auth-general/login-init-email.spec.ts b/packages/tests-e2e/src/complete/scenarios/corbado-auth-general/login-init-email.spec.ts index 5a74ba044..932b848cb 100644 --- a/packages/tests-e2e/src/complete/scenarios/corbado-auth-general/login-init-email.spec.ts +++ b/packages/tests-e2e/src/complete/scenarios/corbado-auth-general/login-init-email.spec.ts @@ -1,3 +1,5 @@ +import type { ChildProcess } from 'node:child_process'; + import { test } from '../../fixtures/CorbadoAuth'; import { IdentifierEnforceVerification, @@ -6,10 +8,13 @@ import { ScreenNames, } from '../../utils/constants'; import { createProjectNew, deleteProjectNew, makeIdentifier, setComponentConfig } from '../../utils/developerpanel'; +import { killPlaygroundNew, spawnPlaygroundNew } from '../../utils/playground'; // Here we test everything on LoginInit screen test.describe('login-init', () => { let projectId: string; + let server: ChildProcess; + let port: number; test.beforeAll(async () => { projectId = await createProjectNew(); @@ -17,14 +22,18 @@ test.describe('login-init', () => { await setComponentConfig(projectId, [ makeIdentifier(IdentifierType.Email, IdentifierEnforceVerification.None, true, [IdentifierVerification.EmailOtp]), ]); + + ({ server, port } = await spawnPlaygroundNew(projectId)); }); test.afterAll(async () => { await deleteProjectNew(projectId); + + killPlaygroundNew(server); }); test('bad user input: empty email', async ({ model }) => { - await model.load(projectId, true, 'login-init'); + await model.load(projectId, port, true, 'login-init'); await model.loginInit.fillEmailUsername(''); await model.loginInit.submitPrimary(); @@ -33,7 +42,7 @@ test.describe('login-init', () => { // TODO: fix and enable test.skip('bad user input: invalid email', async ({ model }) => { - await model.load(projectId, true, 'login-init'); + await model.load(projectId, port, true, 'login-init'); await model.loginInit.fillEmailUsername('a@a'); await model.loginInit.submitPrimary(); @@ -41,7 +50,7 @@ test.describe('login-init', () => { }); test('bad user input: non-existing email', async ({ model }) => { - await model.load(projectId, true, 'login-init'); + await model.load(projectId, port, true, 'login-init'); await model.loginInit.fillEmailUsername('integration-test+notexist@corbado.com'); await model.loginInit.submitPrimary(); @@ -53,7 +62,7 @@ test.describe('login-init', () => { // TODO: bad user input: non-existing phone test('switch to signup', async ({ model }) => { - await model.load(projectId, true, 'login-init'); + await model.load(projectId, port, true, 'login-init'); await model.expectScreen(ScreenNames.InitLogin); await model.loginInit.navigateToSignup(); @@ -63,7 +72,7 @@ test.describe('login-init', () => { // after a signup with passkey a passkey button should be shown // the button should disappear after when one explicitly switches the identifier test('passkey button should be shown', async ({ model }) => { - await model.load(projectId, true); + await model.load(projectId, port, true); await model.defaultSignupWithPasskey(); @@ -71,7 +80,7 @@ test.describe('login-init', () => { await model.expectScreen(ScreenNames.InitLogin); await model.loginInit.expectPasskeyButton(true); - await model.load(projectId); + await model.load(projectId, port); await model.loginInit.expectPasskeyButton(true); await model.passkeyVerify.performAutomaticPasskeyVerification(() => model.loginInit.submitPasskeyButton()); @@ -86,10 +95,10 @@ test.describe('login-init', () => { // after a signup without passkey no passkey button should be shown test('passkey button should not be shown', async ({ model }) => { - await model.load(projectId, true); + await model.load(projectId, port, true); await model.defaultSignupWithFallback(); - await model.load(projectId, undefined, 'login-init'); + await model.load(projectId, port, undefined, 'login-init'); // after a signup with passkey a passkey button should be shown => we use it to login await model.expectScreen(ScreenNames.InitLogin); diff --git a/packages/tests-e2e/src/complete/scenarios/corbado-auth-general/login-init-no-public-signup.spec.ts b/packages/tests-e2e/src/complete/scenarios/corbado-auth-general/login-init-no-public-signup.spec.ts index 284c4f43d..18532b3a9 100644 --- a/packages/tests-e2e/src/complete/scenarios/corbado-auth-general/login-init-no-public-signup.spec.ts +++ b/packages/tests-e2e/src/complete/scenarios/corbado-auth-general/login-init-no-public-signup.spec.ts @@ -1,3 +1,5 @@ +import type { ChildProcess } from 'node:child_process'; + import { expect, test } from '../../fixtures/CorbadoAuth'; import { IdentifierEnforceVerification, @@ -6,11 +8,14 @@ import { ScreenNames, } from '../../utils/constants'; import { createProjectNew, deleteProjectNew, makeIdentifier, setComponentConfig } from '../../utils/developerpanel'; +import { killPlaygroundNew, spawnPlaygroundNew } from '../../utils/playground'; // Developers can disable public signup // In that case UI components no longer will allow a signup test.describe('login-init no public signup', () => { let projectId: string; + let server: ChildProcess; + let port: number; test.beforeAll(async () => { projectId = await createProjectNew(); @@ -26,19 +31,25 @@ test.describe('login-init no public signup', () => { false, false, ); + + ({ server, port } = await spawnPlaygroundNew(projectId)); }); - test.afterAll(async () => deleteProjectNew(projectId)); + test.afterAll(async () => { + await deleteProjectNew(projectId); + + killPlaygroundNew(server); + }); test('switch to signup should not be possible (button)', async ({ model, page }) => { - await model.load(projectId, true, 'login-init'); + await model.load(projectId, port, true, 'login-init'); await model.expectScreen(ScreenNames.InitLogin); await expect(page.getByRole('button', { name: 'Sign up' })).toBeHidden(); }); test('switch to signup should not be possible (hashCode)', async ({ model }) => { - await model.load(projectId, true, 'signup-init'); + await model.load(projectId, port, true, 'signup-init'); await model.expectScreen(ScreenNames.InitLogin); }); diff --git a/packages/tests-e2e/src/complete/scenarios/corbado-auth-general/phone-otp-verify-obfuscation.spec.ts b/packages/tests-e2e/src/complete/scenarios/corbado-auth-general/phone-otp-verify-obfuscation.spec.ts index 0344f3da0..15fa69962 100644 --- a/packages/tests-e2e/src/complete/scenarios/corbado-auth-general/phone-otp-verify-obfuscation.spec.ts +++ b/packages/tests-e2e/src/complete/scenarios/corbado-auth-general/phone-otp-verify-obfuscation.spec.ts @@ -1,3 +1,5 @@ +import type { ChildProcess } from 'node:child_process'; + import { expect, test } from '../../fixtures/CorbadoAuth'; import { OtpCodeType } from '../../models/corbado-auth-blocks/PhoneVerifyBlockModel'; import { SignupInitBlockModel } from '../../models/corbado-auth-blocks/SignupInitBlockModel'; @@ -8,9 +10,12 @@ import { ScreenNames, } from '../../utils/constants'; import { createProjectNew, deleteProjectNew, makeIdentifier, setComponentConfig } from '../../utils/developerpanel'; +import { killPlaygroundNew, spawnPlaygroundNew } from '../../utils/playground'; test.describe('phone-verify block should obfuscate phone numbers if they have not been provided by the user during login', () => { let projectId: string; + let server: ChildProcess; + let port: number; test.beforeAll(async () => { projectId = await createProjectNew(); @@ -19,14 +24,18 @@ test.describe('phone-verify block should obfuscate phone numbers if they have no makeIdentifier(IdentifierType.Phone, IdentifierEnforceVerification.None, true, [IdentifierVerification.PhoneOtp]), makeIdentifier(IdentifierType.Username, IdentifierEnforceVerification.None, true, []), ]); + + ({ server, port } = await spawnPlaygroundNew(projectId)); }); test.afterAll(async () => { await deleteProjectNew(projectId); + + killPlaygroundNew(server); }); test('phone number is obfuscated during login if the login is started with username', async ({ model, page }) => { - await model.load(projectId, false, 'signup-init'); + await model.load(projectId, port, false, 'signup-init'); const phone = SignupInitBlockModel.generateRandomPhone(); const username = SignupInitBlockModel.generateRandomUsername(); @@ -37,14 +46,14 @@ test.describe('phone-verify block should obfuscate phone numbers if they have no await model.expectScreen(ScreenNames.End); await model.logout(); - await model.load(projectId, false, 'login-init'); + await model.load(projectId, port, false, 'login-init'); await model.loginInit.fillEmailUsername(username); await model.loginInit.submitPrimary(); await model.expectScreen(ScreenNames.PhoneOtpLogin); await expect(page.getByText(phone)).toHaveCount(0); - await model.load(projectId, false, 'login-init'); + await model.load(projectId, port, false, 'login-init'); await model.loginInit.switchToInputPhone(); await model.loginInit.fillPhone(phone); await model.loginInit.submitPrimary(); diff --git a/packages/tests-e2e/src/complete/scenarios/corbado-auth-general/routing.spec.ts b/packages/tests-e2e/src/complete/scenarios/corbado-auth-general/routing.spec.ts index 597caf893..77f6f2f65 100644 --- a/packages/tests-e2e/src/complete/scenarios/corbado-auth-general/routing.spec.ts +++ b/packages/tests-e2e/src/complete/scenarios/corbado-auth-general/routing.spec.ts @@ -1,3 +1,5 @@ +import type { ChildProcess } from 'node:child_process'; + import { test } from '../../fixtures/CorbadoAuth'; import { SignupInitBlockModel } from '../../models/corbado-auth-blocks/SignupInitBlockModel'; import { @@ -7,9 +9,12 @@ import { ScreenNames, } from '../../utils/constants'; import { createProjectNew, deleteProjectNew, makeIdentifier, setComponentConfig } from '../../utils/developerpanel'; +import { killPlaygroundNew, spawnPlaygroundNew } from '../../utils/playground'; test.describe('routing', () => { let projectId: string; + let server: ChildProcess; + let port: number; test.beforeAll(async () => { projectId = await createProjectNew(); @@ -17,26 +22,30 @@ test.describe('routing', () => { await setComponentConfig(projectId, [ makeIdentifier(IdentifierType.Email, IdentifierEnforceVerification.None, true, [IdentifierVerification.EmailOtp]), ]); + + ({ server, port } = await spawnPlaygroundNew(projectId)); }); test.afterAll(async () => { await deleteProjectNew(projectId); + + killPlaygroundNew(server); }); test('initial routing should happen depending on the hashCode (signup-init)', async ({ model }) => { - await model.load(projectId, true, 'signup-init'); + await model.load(projectId, port, true, 'signup-init'); await model.expectScreen(ScreenNames.InitSignup); }); test('initial routing should happen depending on the hashCode (login-init)', async ({ model }) => { - await model.load(projectId, true, 'login-init'); + await model.load(projectId, port, true, 'login-init'); await model.expectScreen(ScreenNames.InitLogin); }); test('initial routing should happen depending on local storage', async ({ model }) => { - await model.load(projectId, true); + await model.load(projectId, port, true); // by default the signup screen is loaded await model.expectScreen(ScreenNames.InitSignup); diff --git a/packages/tests-e2e/src/complete/scenarios/corbado-auth-general/signup-init.spec.ts b/packages/tests-e2e/src/complete/scenarios/corbado-auth-general/signup-init.spec.ts index a78ec0896..659c4db49 100644 --- a/packages/tests-e2e/src/complete/scenarios/corbado-auth-general/signup-init.spec.ts +++ b/packages/tests-e2e/src/complete/scenarios/corbado-auth-general/signup-init.spec.ts @@ -1,10 +1,15 @@ +import type { ChildProcess } from 'node:child_process'; + import { test } from '../../fixtures/CorbadoAuth'; import { SignupInitBlockModel } from '../../models/corbado-auth-blocks/SignupInitBlockModel'; import { IdentifierEnforceVerification, IdentifierType, IdentifierVerification } from '../../utils/constants'; import { createProjectNew, deleteProjectNew, makeIdentifier, setComponentConfig } from '../../utils/developerpanel'; +import { killPlaygroundNew, spawnPlaygroundNew } from '../../utils/playground'; test.describe('signup-init', () => { let projectId: string; + let server: ChildProcess; + let port: number; test.beforeAll(async () => { projectId = await createProjectNew(); @@ -14,14 +19,18 @@ test.describe('signup-init', () => { makeIdentifier(IdentifierType.Phone, IdentifierEnforceVerification.None, true, [IdentifierVerification.PhoneOtp]), makeIdentifier(IdentifierType.Username, IdentifierEnforceVerification.None, true, []), ]); + + ({ server, port } = await spawnPlaygroundNew(projectId)); }); test.afterAll(async () => { await deleteProjectNew(projectId); + + killPlaygroundNew(server); }); test('bad user input: all fields empty', async ({ model }) => { - await model.load(projectId, true, 'signup-init'); + await model.load(projectId, port, true, 'signup-init'); await model.signupInit.fillEmail(''); await model.signupInit.fillPhone(''); @@ -34,7 +43,7 @@ test.describe('signup-init', () => { }); test('bad user input: invalid fields (simple)', async ({ model }) => { - await model.load(projectId, true, 'signup-init'); + await model.load(projectId, port, true, 'signup-init'); await model.signupInit.fillEmail('asdf@asdf'); await model.signupInit.fillPhone('1234'); @@ -47,7 +56,7 @@ test.describe('signup-init', () => { }); test('bad user input: duplicate fields', async ({ model }) => { - await model.load(projectId, true, 'signup-init'); + await model.load(projectId, port, true, 'signup-init'); const email = SignupInitBlockModel.generateRandomEmail(); const phone = SignupInitBlockModel.generateRandomPhone(); @@ -60,7 +69,7 @@ test.describe('signup-init', () => { await model.passkeyAppend.startPasskeyOperation(true); await model.logout(); - await model.load(projectId, undefined, 'signup-init'); + await model.load(projectId, port, undefined, 'signup-init'); await model.signupInit.fillEmail(email); await model.signupInit.fillPhone(phone); diff --git a/packages/tests-e2e/src/complete/scenarios/corbado-auth-general/socials.spec.ts b/packages/tests-e2e/src/complete/scenarios/corbado-auth-general/socials.spec.ts index 402ab93bd..f1ce8784d 100644 --- a/packages/tests-e2e/src/complete/scenarios/corbado-auth-general/socials.spec.ts +++ b/packages/tests-e2e/src/complete/scenarios/corbado-auth-general/socials.spec.ts @@ -1,3 +1,5 @@ +import type { ChildProcess } from 'node:child_process'; + import { test } from '../../fixtures/CorbadoAuth'; import { IdentifierEnforceVerification, @@ -15,9 +17,12 @@ import { makeSocialProvider, setComponentConfig, } from '../../utils/developerpanel'; +import { killPlaygroundNew, spawnPlaygroundNew } from '../../utils/playground'; test.describe('social logins', () => { let projectId: string; + let server: ChildProcess; + let port: number; // Google social login requires longer timeout test.describe.configure({ timeout: socialTotalTimeout }); @@ -42,14 +47,18 @@ test.describe('social logins', () => { makeSocialProvider(SocialProviderType.Google), ], ); + + ({ server, port } = await spawnPlaygroundNew(projectId)); }); test.afterEach(async () => { await deleteProjectNew(projectId); + + killPlaygroundNew(server); }); test('socials should be rendered on UI component if they are activated', async ({ model }) => { - await model.load(projectId, true, 'signup-init'); + await model.load(projectId, port, true, 'signup-init'); // by default the signup screen is loaded await model.expectScreen(ScreenNames.InitSignup); @@ -70,7 +79,7 @@ test.describe('social logins', () => { // Reason for skip: https://www.notion.so/Issues-related-to-email-and-social-login-in-tests-javascript-complete-1bceeb954aa280148c34d10aac8c2117 test.skip('signup with socials should be possible (account does not exist)', async ({ model }) => { - await model.load(projectId, true, 'signup-init'); + await model.load(projectId, port, true, 'signup-init'); const email = process.env.PLAYWRIGHT_GOOGLE_EMAIL ?? ''; const password = process.env.PLAYWRIGHT_GOOGLE_PASSWORD ?? ''; @@ -81,7 +90,7 @@ test.describe('social logins', () => { }); test.skip('signup with social should be possible (account exists, social has been linked)', async ({ model }) => { - await model.load(projectId, true, 'signup-init'); + await model.load(projectId, port, true, 'signup-init'); const email = process.env.PLAYWRIGHT_GOOGLE_EMAIL ?? ''; const password = process.env.PLAYWRIGHT_GOOGLE_PASSWORD ?? ''; @@ -93,7 +102,7 @@ test.describe('social logins', () => { await model.expectScreen(ScreenNames.End); await model.logout(); - await model.load(projectId, true, 'signup-init'); + await model.load(projectId, port, true, 'signup-init'); await model.signupInit.resubmitSocialGoogle(); // TODO: should successfully log in, but gets redirected to login-init instead. @@ -104,7 +113,7 @@ test.describe('social logins', () => { test.skip('signup with social should not be possible (account exists, social has not been linked)', async ({ model, }) => { - await model.load(projectId, true, 'signup-init'); + await model.load(projectId, port, true, 'signup-init'); const email = process.env.PLAYWRIGHT_GOOGLE_EMAIL ?? ''; const password = process.env.PLAYWRIGHT_GOOGLE_PASSWORD ?? ''; @@ -116,7 +125,7 @@ test.describe('social logins', () => { await model.expectScreen(ScreenNames.End); await model.logout(); - await model.load(projectId, true, 'signup-init'); + await model.load(projectId, port, true, 'signup-init'); await model.signupInit.submitSocialGoogle(email, password, secret); await model.expectScreen(ScreenNames.InitLogin); @@ -124,7 +133,7 @@ test.describe('social logins', () => { test.skip('login with social should be possible (account does not exist)', async ({ model }) => { // redirects to passkey append screen - await model.load(projectId, true, 'login-init'); + await model.load(projectId, port, true, 'login-init'); const email = process.env.PLAYWRIGHT_GOOGLE_EMAIL ?? ''; const password = process.env.PLAYWRIGHT_GOOGLE_PASSWORD ?? ''; @@ -135,7 +144,7 @@ test.describe('social logins', () => { }); test.skip('login with social should be possible (account exists, social has been linked)', async ({ model }) => { - await model.load(projectId, true, 'signup-init'); + await model.load(projectId, port, true, 'signup-init'); const email = process.env.PLAYWRIGHT_GOOGLE_EMAIL ?? ''; const password = process.env.PLAYWRIGHT_GOOGLE_PASSWORD ?? ''; @@ -147,7 +156,7 @@ test.describe('social logins', () => { await model.expectScreen(ScreenNames.End); await model.logout(); - await model.load(projectId, true, 'login-init'); + await model.load(projectId, port, true, 'login-init'); await model.signupInit.resubmitSocialGoogle(); await model.expectScreen(ScreenNames.End); @@ -157,7 +166,7 @@ test.describe('social logins', () => { test.skip('login with social should not be possible (account exists, social has not been linked)', async ({ model, }) => { - await model.load(projectId, true, 'signup-init'); + await model.load(projectId, port, true, 'signup-init'); const email = process.env.PLAYWRIGHT_GOOGLE_EMAIL ?? ''; const password = process.env.PLAYWRIGHT_GOOGLE_PASSWORD ?? ''; @@ -169,7 +178,7 @@ test.describe('social logins', () => { await model.expectScreen(ScreenNames.End); await model.logout(); - await model.load(projectId, true, 'login-init'); + await model.load(projectId, port, true, 'login-init'); await model.signupInit.submitSocialGoogle(email, password, secret); // TODO: should redirect to login-init screen, but gets successfully logged in insteaad. diff --git a/packages/tests-e2e/src/complete/scenarios/passkey-list-general/general.spec.ts b/packages/tests-e2e/src/complete/scenarios/passkey-list-general/general.spec.ts index e1ebff189..55f67ec69 100644 --- a/packages/tests-e2e/src/complete/scenarios/passkey-list-general/general.spec.ts +++ b/packages/tests-e2e/src/complete/scenarios/passkey-list-general/general.spec.ts @@ -1,9 +1,14 @@ +import type { ChildProcess } from 'node:child_process'; + +import { passkeyListTest } from '../../fixtures/PasskeyList'; import { IdentifierEnforceVerification, IdentifierType, IdentifierVerification } from '../../utils/constants'; import { createProjectNew, deleteProjectNew, makeIdentifier, setComponentConfig } from '../../utils/developerpanel'; -import { passkeyListTest } from '../../fixtures/PasskeyList'; +import { killPlaygroundNew, spawnPlaygroundNew } from '../../utils/playground'; passkeyListTest.describe('passkey list - general', () => { let projectId: string; + let server: ChildProcess; + let port: number; passkeyListTest.beforeAll(async () => { projectId = await createProjectNew(); @@ -13,14 +18,18 @@ passkeyListTest.describe('passkey list - general', () => { IdentifierVerification.EmailOtp, ]), ]); + + ({ server, port } = await spawnPlaygroundNew(projectId)); }); passkeyListTest.afterAll(async () => { await deleteProjectNew(projectId); + + killPlaygroundNew(server); }); passkeyListTest('passkey list allows adding and deleting passkeys (passkeys are supported)', async ({ model }) => { - await model.load(projectId, true); + await model.load(projectId, port, true); await model.expectPasskeys(0); await model.appendNewPasskey(true); @@ -31,7 +40,7 @@ passkeyListTest.describe('passkey list - general', () => { // currently it seems impossible to test for duplicate passkeys with virtual authenticator passkeyListTest('passkey list error handling (cancel, duplicate passkeys)', async ({ model }) => { - await model.load(projectId, true); + await model.load(projectId, port, true); await model.expectPasskeys(0); await model.appendNewPasskey(false); diff --git a/packages/tests-e2e/src/complete/utils/developerpanel.ts b/packages/tests-e2e/src/complete/utils/developerpanel.ts index 36713e016..32673dce9 100644 --- a/packages/tests-e2e/src/complete/utils/developerpanel.ts +++ b/packages/tests-e2e/src/complete/utils/developerpanel.ts @@ -34,7 +34,7 @@ export const createProjectNew = async () => { body: JSON.stringify({ name, allowStaticChallenges: true, - webauthnRPID: process.env.CI ? 'playground.corbado.io' : 'localhost', + webauthnRPID: process.env.CI ? 'localhost' : 'localhost', }), }); expect(createRes.ok).toBeTruthy(); diff --git a/packages/tests-e2e/src/complete/utils/playground.ts b/packages/tests-e2e/src/complete/utils/playground.ts new file mode 100644 index 000000000..a2423b914 --- /dev/null +++ b/packages/tests-e2e/src/complete/utils/playground.ts @@ -0,0 +1,121 @@ +import type { ChildProcess } from 'node:child_process'; +import { spawn } from 'node:child_process'; + +import getPort from 'get-port'; +import path from 'path'; +import waitPort from 'wait-port'; + +type PlaygroundType = 'react' | 'web-js' | 'web-js-script'; +const PLAYGROUND_TYPE: PlaygroundType = (process.env.PLAYGROUND_TYPE as PlaygroundType) || 'react'; + +function getPlaygroundDir(): string { + switch (PLAYGROUND_TYPE) { + case 'react': + return path.resolve(__dirname, '../../../../../playground/react'); + case 'web-js': + return path.resolve(__dirname, '../../../../../playground/web-js'); + case 'web-js-script': + return path.resolve(__dirname, '../../../../../playground/web-js-script'); + default: + throw new Error(`Unknown PLAYGROUND_TYPE: ${PLAYGROUND_TYPE}`); + } +} + +function getPlaygroundBuildArgs(): string[] | null { + switch (PLAYGROUND_TYPE) { + case 'react': + return ['run', 'build']; + case 'web-js': + return ['run', 'build']; + case 'web-js-script': + return null; + default: + throw new Error(`Unknown PLAYGROUND_TYPE: ${PLAYGROUND_TYPE}`); + } +} + +function getPlaygroundStartArgs(port: number): string[] { + switch (PLAYGROUND_TYPE) { + case 'react': + return ['run', 'preview', '--', '--port', port.toString()]; + case 'web-js': + return ['run', 'serve', '--', '-l', port.toString()]; + case 'web-js-script': + return ['run', 'serve', '--', '-l', port.toString()]; + default: + throw new Error(`Unknown PLAYGROUND_TYPE: ${PLAYGROUND_TYPE}`); + } +} + +export async function spawnPlaygroundNew(projectId: string): Promise<{ + server: ChildProcess; + port: number; +}> { + const port = await getPort(); + + const playgroundDir = getPlaygroundDir(); + const server = spawn('npm', getPlaygroundStartArgs(port), { + cwd: playgroundDir, + env: { + ...process.env, + VITE_CORBADO_PROJECT_ID_ManualTesting: projectId, + }, + stdio: 'ignore', + shell: true, + }); + const ok = await waitPort({ host: 'localhost', port, timeout: 15_000, output: 'silent' }); + if (!ok) { + server.kill(); + throw new Error(`Server never came up on port ${port}`); + } + + return { server, port }; +} + +export function killPlaygroundNew(server: ChildProcess) { + server.kill(); +} + +export default async function installPlaygroundDeps() { + const playgroundDir = getPlaygroundDir(); + + const installProcess = spawn('npm', ['install'], { + cwd: playgroundDir, + stdio: 'inherit', + shell: true, + }); + + await new Promise((resolve, reject) => { + installProcess.on('close', (code: number) => { + if (code === 0) { + console.log(`[Global Setup] Dependencies installed successfully in ${playgroundDir}.`); + const buildCommand = getPlaygroundBuildArgs(); + if (!buildCommand) { + console.log(`[Global Setup] No build step required for ${PLAYGROUND_TYPE}.`); + return resolve(); + } + const buildProcess = spawn('npm', buildCommand, { + cwd: playgroundDir, + stdio: 'inherit', + shell: true, + }); + buildProcess.on('close', (buildCode: number) => { + if (buildCode === 0) { + console.log(`[Global Setup] Playground built successfully in ${playgroundDir}.`); + resolve(); + } else { + reject(new Error(`[Global Setup] npm run build failed in ${playgroundDir} with code ${buildCode}`)); + } + }); + buildProcess.on('error', (err: Error) => { + reject(new Error(`[Global Setup] Failed to start build process: ${err.message}`)); + }); + } else { + reject(new Error(`[Global Setup] npm install failed in ${playgroundDir} with code ${code}`)); + } + }); + installProcess.on('error', (err: Error) => { + reject(new Error(`[Global Setup] Failed to start npm install process: ${err.message}`)); + }); + }); +} diff --git a/packages/tests-e2e/src/connect/fixtures/BaseTest.ts b/packages/tests-e2e/src/connect/fixtures/BaseTest.ts deleted file mode 100644 index 7d1ad37e6..000000000 --- a/packages/tests-e2e/src/connect/fixtures/BaseTest.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { test as base } from '@playwright/test'; - -import { BaseModel } from '../models/BaseModel'; -import { CDPSessionManager } from '../utils/CDPSessionManager'; -import { NetworkRequestBlocker } from '../utils/NetworkRequestBlocker'; -import { VirtualAuthenticator } from '../utils/VirtualAuthenticator'; - -export const test = base.extend<{ model: BaseModel }>({ - model: async ({ page }, use) => { - const cdpManager = new CDPSessionManager(); - await cdpManager.initialize(page); - - const authenticator = new VirtualAuthenticator(cdpManager); - const blocker = new NetworkRequestBlocker(cdpManager); - - const model = new BaseModel(page, authenticator, blocker); - - await use(model); - }, -}); - -export { expect } from '@playwright/test'; diff --git a/packages/tests-e2e/src/connect/models/AppendModel.ts b/packages/tests-e2e/src/connect/models/AppendModel.ts deleted file mode 100644 index 63b6757b6..000000000 --- a/packages/tests-e2e/src/connect/models/AppendModel.ts +++ /dev/null @@ -1,45 +0,0 @@ -import type { Page } from '@playwright/test'; - -import { ErrorTexts, ScreenNames } from '../utils/Constants'; -import { expectError, expectScreen } from '../utils/ExpectScreen'; -import type { VirtualAuthenticator } from '../utils/VirtualAuthenticator'; - -export class AppendModel { - page: Page; - authenticator: VirtualAuthenticator; - - constructor(page: Page, authenticator: VirtualAuthenticator) { - this.page = page; - this.authenticator = authenticator; - } - - appendPasskey(complete: boolean) { - const operationTrigger = () => this.page.getByRole('button', { name: 'Continue' }).click(); - if (complete) { - return this.authenticator.startAndCompletePasskeyOperation(operationTrigger); - } else { - return this.authenticator.startAndCancelPasskeyOperation(operationTrigger, () => - expectError(this.page, ErrorTexts.CancelledPasskey), - ); - } - } - - autoAppendPasskey(complete: boolean, operationTrigger: () => Promise) { - if (complete) { - return this.authenticator.startAndCompletePasskeyOperation(operationTrigger); - } else { - return this.authenticator.startAndCancelPasskeyOperation(operationTrigger, async () => { - await expectScreen(this.page, ScreenNames.PasskeyAppend); - await this.page.waitForSelector('.button-loading-container', { state: 'detached' }); - }); - } - } - - confirmAppended() { - return this.page.getByRole('button', { name: 'Continue' }).click(); - } - - skipAppend() { - return this.page.locator('.cb-append-skip').click(); - } -} diff --git a/packages/tests-e2e/src/connect/models/BaseModel.ts b/packages/tests-e2e/src/connect/models/BaseModel.ts deleted file mode 100644 index f3d87f0ad..000000000 --- a/packages/tests-e2e/src/connect/models/BaseModel.ts +++ /dev/null @@ -1,79 +0,0 @@ -import type { Page } from '@playwright/test'; - -import type { ErrorTexts } from '../utils/Constants'; -import { ScreenNames } from '../utils/Constants'; -import { expectError, expectScreen } from '../utils/ExpectScreen'; -import type { NetworkRequestBlocker } from '../utils/NetworkRequestBlocker'; -import type { VirtualAuthenticator } from '../utils/VirtualAuthenticator'; -import { AppendModel } from './AppendModel'; -import { HomeModel } from './HomeModel'; -import { LoginModel } from './LoginModel'; -import { MFAModel } from './MFAModel'; -import { PasskeyListModel } from './PasskeyListModel'; -import { SignupModel } from './SignupModel'; -import { StorageModel } from './StorageModel'; -import { WebhookModel } from './WebhookModel'; - -export class BaseModel { - page: Page; - authenticator: VirtualAuthenticator; - blocker: NetworkRequestBlocker; - signup: SignupModel; - login: LoginModel; - append: AppendModel; - home: HomeModel; - passkeyList: PasskeyListModel; - webhook: WebhookModel; - storage: StorageModel; - mfa: MFAModel; - email = ''; - - constructor(page: Page, authenticator: VirtualAuthenticator, blocker: NetworkRequestBlocker) { - this.page = page; - this.authenticator = authenticator; - this.blocker = blocker; - this.login = new LoginModel(page, authenticator); - this.append = new AppendModel(page, authenticator); - this.signup = new SignupModel(page, this.append); - this.mfa = new MFAModel(page, this.append); - this.home = new HomeModel(page); - this.passkeyList = new PasskeyListModel(page, authenticator); - this.webhook = new WebhookModel(page); - this.storage = new StorageModel(page); - } - - loadSignup() { - return this.page.goto('/signup'); - } - - loadLogin() { - return this.page.goto('/login'); - } - - loadHome() { - return this.page.goto('/home'); - } - - expectScreen(screenName: ScreenNames) { - return expectScreen(this.page, screenName); - } - - expectError(message: ErrorTexts) { - return expectError(this.page, message); - } - - async createUser(invited: boolean, append: boolean) { - this.email = await this.signup.autofillCredentials(); - await this.signup.submit(invited, append); - this.mfa.registerTokenUsed(); - if (invited) { - if (append) { - await this.expectScreen(ScreenNames.PasskeyAppended); - await this.append.confirmAppended(); - } else { - await this.expectScreen(ScreenNames.PasskeyAppend); - await this.append.skipAppend(); - } - } - } -} diff --git a/packages/tests-e2e/src/connect/models/BasePage.ts b/packages/tests-e2e/src/connect/models/BasePage.ts new file mode 100644 index 000000000..e695a4b91 --- /dev/null +++ b/packages/tests-e2e/src/connect/models/BasePage.ts @@ -0,0 +1,79 @@ +import type { Page } from '@playwright/test'; + +export abstract class BasePage { + readonly page: Page; + + protected constructor(page: Page) { + this.page = page; + } + + abstract visible(): Promise; + + clickButton(label: string): Promise { + return this.page.getByRole('button', { name: label }).click(); + } + + clickLink(label: string): Promise { + return this.page.getByRole('link', { name: label }).click(); + } + + clickText(text: string): Promise { + return this.page.getByText(text).click(); + } + + async waitForHeading(text: string): Promise { + try { + await this.page.getByRole('heading', { name: text }).waitFor({ state: 'visible', timeout: 10000 }); + return true; + } catch { + return false; + } + } + + async waitForText(text: string): Promise { + try { + await this.page.getByText(text).waitFor({ state: 'visible', timeout: 10000 }); + return true; + } catch { + return false; + } + } + + async waitForButton(label: string): Promise { + try { + await this.page.getByRole('button', { name: label }).waitFor({ state: 'visible', timeout: 10000 }); + return true; + } catch { + return false; + } + } + + async waitBySelector(selector: string): Promise { + try { + await this.page.locator(selector).waitFor({ state: 'visible', timeout: 10000 }); + return true; + } catch { + return false; + } + } + + expectText(text: string): Promise { + return this.page.getByText(text).waitFor({ state: 'visible' }); + } + + // client-state + async clearProcessState(): Promise { + return this.localStorageClearByPrefix('cbo_connect_process'); + } + + private localStorageClearByPrefix(prefix: string): Promise { + return this.page.evaluate(prefix => { + for (let i = localStorage.length - 1; i >= 0; i--) { + const key = localStorage.key(i); + if (key && key.startsWith(prefix)) { + localStorage.removeItem(key); + } + } + }, prefix); + } +} diff --git a/packages/tests-e2e/src/connect/models/HomeModel.ts b/packages/tests-e2e/src/connect/models/HomeModel.ts deleted file mode 100644 index d412a4cd1..000000000 --- a/packages/tests-e2e/src/connect/models/HomeModel.ts +++ /dev/null @@ -1,17 +0,0 @@ -import type { Page } from '@playwright/test'; - -export class HomeModel { - page: Page; - - constructor(page: Page) { - this.page = page; - } - - logout(): Promise { - return this.page.getByRole('button', { name: 'Logout' }).click(); - } - - gotoPasskeyList(): Promise { - return this.page.getByRole('button', { name: 'Passkey List' }).click(); - } -} diff --git a/packages/tests-e2e/src/connect/models/LoginModel.ts b/packages/tests-e2e/src/connect/models/LoginModel.ts deleted file mode 100644 index bdc9114df..000000000 --- a/packages/tests-e2e/src/connect/models/LoginModel.ts +++ /dev/null @@ -1,69 +0,0 @@ -import type { Page } from '@playwright/test'; -import { expect } from '@playwright/test'; - -import { ScreenNames } from '../utils/Constants'; -import { expectScreen } from '../utils/ExpectScreen'; -import type { VirtualAuthenticator } from '../utils/VirtualAuthenticator'; - -export class LoginModel { - page: Page; - authenticator: VirtualAuthenticator; - - constructor(page: Page, authenticator: VirtualAuthenticator) { - this.page = page; - this.authenticator = authenticator; - } - - submitPasskeyButton(complete: boolean) { - const operationTrigger = () => this.page.locator('.cb-passkey-button').click(); - if (complete) { - return this.authenticator.startAndCompletePasskeyOperation(operationTrigger); - } else { - return this.authenticator.startAndCancelPasskeyOperation(operationTrigger, () => - expectScreen(this.page, ScreenNames.PasskeyError1), - ); - } - } - - removePasskeyButton() { - return this.page.locator('.cb-switch').click(); - } - - async repeatedlyFailPasskeyInput() { - const operationTrigger1 = () => this.page.getByRole('button', { name: 'Continue' }).click(); - await this.authenticator.startAndCancelPasskeyOperation(operationTrigger1, () => - expectScreen(this.page, ScreenNames.PasskeyError2), - ); - - const operationTrigger2 = () => this.page.getByRole('button', { name: 'Try again' }).click(); - await this.authenticator.startAndCancelPasskeyOperation(operationTrigger2, () => this.page.waitForTimeout(100)); - await this.authenticator.startAndCancelPasskeyOperation(operationTrigger2, () => this.page.waitForTimeout(100)); - await this.authenticator.startAndCancelPasskeyOperation(operationTrigger2, () => - expectScreen(this.page, ScreenNames.InitLoginFallback), - ); - } - - async submitEmail(email: string, withPasskey: boolean) { - await this.page.getByLabel('Email address').fill(email); - if (withPasskey) { - const operationTrigger = () => this.page.getByRole('button', { name: 'Login' }).click(); - await this.authenticator.startAndCompletePasskeyOperation(operationTrigger); - } else { - await this.page.getByRole('button', { name: 'Login' }).click(); - } - } - - async submitFallbackCredentials(email: string, password: string, emailAutofilled = false) { - if (emailAutofilled) { - await expect(this.page.getByPlaceholder('Email')).toHaveValue(email); - } else { - await this.page.getByPlaceholder('Email').fill(email); - } - await this.page.getByPlaceholder('Password').fill(password); - await this.page.getByRole('button', { name: 'Login' }).click(); - } - - submitConditionalUI(operationTrigger: () => Promise) { - return this.authenticator.startAndCompletePasskeyOperation(operationTrigger); - } -} diff --git a/packages/tests-e2e/src/connect/models/LoginPage.ts b/packages/tests-e2e/src/connect/models/LoginPage.ts new file mode 100644 index 000000000..38bc96f20 --- /dev/null +++ b/packages/tests-e2e/src/connect/models/LoginPage.ts @@ -0,0 +1,112 @@ +import type { Page } from '@playwright/test'; + +import { BasePage } from './BasePage'; +import { PostLoginPage } from './PostLoginPage'; +import { ProfilePage } from './ProfilePage'; +import { SignupPage } from './SignupPage'; + +export enum LoginStatus { + PasskeyOneTap, + PasskeyTextField, + FallbackFirst, + FallbackSecondTOTP, + PasskeyErrorSoft, +} + +export class LoginPage extends BasePage { + page: Page; + + constructor(page: Page) { + super(page); + this.page = page; + } + + visible(): Promise { + return this.waitForHeading('Login'); + } + + static async awaitPage(page: Page): Promise { + const loginPage = new LoginPage(page); + if (!(await loginPage.visible())) { + throw new Error('Login page not visible'); + } + + return loginPage; + } + + async navigateToSignup(): Promise { + await this.clickLink('Sign up'); + + return SignupPage.awaitPage(this.page); + } + + async awaitState(status: LoginStatus): Promise { + switch (status) { + case LoginStatus.PasskeyOneTap: + return this.waitForButton('Login with Passkey'); + case LoginStatus.PasskeyTextField: + return this.waitForButton('Login'); + case LoginStatus.FallbackFirst: + return this.waitForButton('Login'); + case LoginStatus.FallbackSecondTOTP: + return this.waitForHeading('Check your authenticator'); + case LoginStatus.PasskeyErrorSoft: + default: + return true; + } + } + + async loginWithOneTap(): Promise { + await this.clickButton('Login with Passkey'); + + return new ProfilePage(this.page); + } + + async loginWithOneTapAndCancel(): Promise { + await this.clickButton('Login with Passkey'); + // Stay on login page after cancel + return LoginPage.awaitPage(this.page); + } + + async switchAccount(): Promise { + await this.clickText('Switch account'); + } + + loginWithCUI(): ProfilePage { + return new ProfilePage(this.page); + } + + async loginWithIdentifier(email: string): Promise { + await this.page.getByLabel('Email address').fill(email); + await this.clickButton('Login'); + + return new ProfilePage(this.page); + } + + async loginWithIdentifierAndPasswordIdentifierFirst(email: string, password: string): Promise { + await this.page.getByLabel('Email address').fill(email); + await this.clickButton('Login'); + await this.page.getByLabel('Password').fill(password); + await this.clickButton('Login'); + } + + async loginWithIdentifierAndPassword(email: string, password: string) { + await this.page.getByLabel('Email address').fill(email); + await this.page.getByLabel('Password').fill(password); + await this.clickButton('Login'); + } + + async completeLoginWithTOTP(code: string): Promise { + await this.page.getByRole('textbox').fill(code); + return new PostLoginPage(this.page); + } + + async loginWithIdentifierButNoSuccess(email: string): Promise { + await this.page.getByLabel('Email address').fill(email); + await this.clickButton('Login'); + } + + async awaitErrorMessage(text: string): Promise { + return this.waitForText(text); + } +} diff --git a/packages/tests-e2e/src/connect/models/MFAModel.ts b/packages/tests-e2e/src/connect/models/MFAModel.ts deleted file mode 100644 index 8e5adda1c..000000000 --- a/packages/tests-e2e/src/connect/models/MFAModel.ts +++ /dev/null @@ -1,36 +0,0 @@ -import type { Page } from '@playwright/test'; -import { expect } from '@playwright/test'; - -import type { AppendModel } from './AppendModel'; - -export class MFAModel { - page: Page; - append: AppendModel; - timestamp: number; - - constructor(page: Page, append: AppendModel) { - this.page = page; - this.append = append; - this.timestamp = Date.now(); - } - - registerTokenUsed() { - this.timestamp = Date.now(); - } - - async autofillTOTP() { - await this.page.waitForTimeout(31000 - (Date.now() - this.timestamp)); - await this.page.getByRole('button', { name: 'Autofill TOTP' }).click(); - await expect(this.page.getByPlaceholder('TOTP')).toHaveValue(/.+/); - this.registerTokenUsed(); - } - - submit(invited: boolean, autoAppend: boolean) { - if (invited) { - const operationTrigger = () => this.page.getByRole('button', { name: 'Submit' }).click(); - return this.append.autoAppendPasskey(autoAppend, operationTrigger); - } else { - return this.page.getByRole('button', { name: 'Submit' }).click(); - } - } -} diff --git a/packages/tests-e2e/src/connect/models/MFAPage.ts b/packages/tests-e2e/src/connect/models/MFAPage.ts new file mode 100644 index 000000000..7ca80b5aa --- /dev/null +++ b/packages/tests-e2e/src/connect/models/MFAPage.ts @@ -0,0 +1,48 @@ +import type { Page } from '@playwright/test'; + +import type { AuthenticatorApp } from '../utils/AuthenticatorApp'; +import { BasePage } from './BasePage'; +import { PostLoginPage } from './PostLoginPage'; +import { ProfilePage } from './ProfilePage'; + +export class MFAPage extends BasePage { + constructor(page: Page) { + super(page); + } + + async visible(): Promise { + return this.waitForHeading('Protect your account'); + } + + async awaitPage(): Promise { + if (!(await this.visible())) { + throw new Error('MFA page not visible'); + } + + return this; + } + + async setupAndConfirmTOTPReturnProfile(authenticator: AuthenticatorApp): Promise<[string, ProfilePage]> { + await this.clickButton('Use Authenticator instead'); + + const sharedKey = await this.page.getByRole('img').getAttribute('aria-label'); + if (!sharedKey) throw new Error('sharedKey not found'); + + await this.clickButton('Continue'); + + const code1 = await authenticator.addBySecret(sharedKey); + if (!code1) throw new Error('Failed to add TOTP secret'); + await this.inputTOTP(code1); + + return [sharedKey, new ProfilePage(this.page)]; + } + + async confirm(code: string): Promise { + await this.page.keyboard.type(code); + return new PostLoginPage(this.page); + } + + async inputTOTP(code: string): Promise { + await this.page.getByRole('textbox').fill(code); + } +} diff --git a/packages/tests-e2e/src/connect/models/PasskeyListModel.ts b/packages/tests-e2e/src/connect/models/PasskeyListModel.ts deleted file mode 100644 index 7644268f4..000000000 --- a/packages/tests-e2e/src/connect/models/PasskeyListModel.ts +++ /dev/null @@ -1,48 +0,0 @@ -import type { Page } from '@playwright/test'; -import { expect } from '@playwright/test'; - -import type { VirtualAuthenticator } from '../utils/VirtualAuthenticator'; - -export class PasskeyListModel { - page: Page; - authenticator: VirtualAuthenticator; - - constructor(page: Page, authenticator: VirtualAuthenticator) { - this.page = page; - this.authenticator = authenticator; - } - - expectPasskeys(n: number) { - return expect(this.page.locator('.cb-passkey-list-item')).toHaveCount(n); - } - - async deletePasskey(index: number) { - await this.page.locator('.cb-passkey-list-item-delete-icon').nth(index).click(); - await this.page.getByRole('button', { name: 'Delete' }).click(); - } - - createPasskey(complete: boolean, postOperationCheck: (() => Promise) | null = null) { - const operationTrigger = (): Promise => this.page.getByRole('button', { name: 'Add a passkey' }).click(); - if (complete) { - if (postOperationCheck === null) { - return this.authenticator.startAndCompletePasskeyOperation(operationTrigger); - } else { - return this.authenticator.startAndCompletePasskeyOperation(operationTrigger, postOperationCheck); - } - } else { - return this.authenticator.startAndCancelPasskeyOperation(operationTrigger, () => - expect(this.page.locator('.cb-notification-text')).toHaveText( - 'You have cancelled setting up your passkey. Please try again.', - ), - ); - } - } - - checkCreatePasskeyDisabled() { - return expect(this.page.getByRole('button', { name: 'Add a passkey' })).not.toBeVisible(); - } - - confirmModal() { - return this.page.getByRole('button', { name: 'Okay' }).click(); - } -} diff --git a/packages/tests-e2e/src/connect/models/PostLoginPage.ts b/packages/tests-e2e/src/connect/models/PostLoginPage.ts new file mode 100644 index 000000000..e87ba3994 --- /dev/null +++ b/packages/tests-e2e/src/connect/models/PostLoginPage.ts @@ -0,0 +1,64 @@ +import type { Page } from '@playwright/test'; + +import { BasePage } from './BasePage'; +import { MFAPage } from './MFAPage'; +import { ProfilePage } from './ProfilePage'; + +export class PostLoginPage extends BasePage { + constructor(page: Page) { + super(page); + } + + async visible(): Promise { + return this.waitForHeading('Simplify Your Login'); + } + + autoSkipAfterSignup(): MFAPage { + return new MFAPage(this.page); + } + + autoSkip(): ProfilePage { + return new ProfilePage(this.page); + } + + async awaitPage(): Promise { + if (!(await this.visible())) { + throw new Error('Post login page not visible'); + } + + return this; + } + + async awaitErrorMessage(text: string): Promise { + return this.waitForText(text); + } + + async continue(expectAutoAppend: boolean): Promise { + if (!expectAutoAppend) { + await this.clickButton('Continue'); + } + + await this.expectText('Passkey Created Successfully'); + await this.clickButton('Continue'); + + return new ProfilePage(this.page); + } + + async continueWithCancel(expectAutoAppend: boolean): Promise { + if (!expectAutoAppend) { + await this.clickButton('Continue'); + } + } + + async skip(): Promise { + await this.clickText('Skip'); + + return new ProfilePage(this.page); + } + + async skipAfterSignup(): Promise { + await this.clickText('Skip'); + + return new MFAPage(this.page).awaitPage(); + } +} diff --git a/packages/tests-e2e/src/connect/models/ProfilePage.ts b/packages/tests-e2e/src/connect/models/ProfilePage.ts new file mode 100644 index 000000000..360d088e0 --- /dev/null +++ b/packages/tests-e2e/src/connect/models/ProfilePage.ts @@ -0,0 +1,76 @@ +import type { Page } from '@playwright/test'; + +import { BasePage } from './BasePage'; +import { LoginPage } from './LoginPage'; + +export enum ProfileStatus { + ListEmpty, + ListWithInitialError, + ListWithPasskeys, + ListWithoutPasskeySupport, +} + +export class ProfilePage extends BasePage { + page: Page; + + constructor(page: Page) { + super(page); + this.page = page; + } + + async awaitPage(): Promise { + if (!(await this.visible())) { + throw new Error('Profile page not visible'); + } + + return this; + } + + visible(): Promise { + return this.waitForHeading('Your profile'); + } + + async logout(): Promise { + await this.page.getByRole('button', { name: 'Logout' }).click(); + + return LoginPage.awaitPage(this.page); + } + + async appendPasskey() { + return this.clickButton('Add a passkey'); + } + + async deletePasskeyByIndex(index: number, complete: boolean) { + const item = this.page.locator('div.cb-passkey-list-item-delete-icon').nth(index); + await item.click(); + if (complete) { + await this.page.locator('.cb-modal').getByRole('button', { name: 'Delete' }).click(); + } else { + await this.page.locator('.cb-modal').getByRole('button', { name: 'Cancel' }).click(); + } + } + + async awaitState(status: ProfileStatus): Promise { + switch (status) { + case ProfileStatus.ListEmpty: + return this.waitForText('There is currently no passkey saved for this account.'); + case ProfileStatus.ListWithInitialError: + return this.waitForText('We were unable to show you your list of passkeys due to an error. Try again later.'); + case ProfileStatus.ListWithPasskeys: + return this.waitBySelector('div.cb-passkey-list-item-delete-icon'); + case ProfileStatus.ListWithoutPasskeySupport: { + const appendAllowed = await this.waitForText('Add a passkey'); + return !appendAllowed; + } + } + } + + async getPasskeyCount(): Promise { + const passkeyList = this.page.locator('div.cb-passkey-list-item-delete-icon'); + return await passkeyList.count(); + } + + async awaitErrorMessage(text: string): Promise { + return this.waitForText(text); + } +} diff --git a/packages/tests-e2e/src/connect/models/SignupModel.ts b/packages/tests-e2e/src/connect/models/SignupModel.ts deleted file mode 100644 index 852d34993..000000000 --- a/packages/tests-e2e/src/connect/models/SignupModel.ts +++ /dev/null @@ -1,27 +0,0 @@ -import type { Page } from '@playwright/test'; - -import type { AppendModel } from './AppendModel'; - -export class SignupModel { - page: Page; - append: AppendModel; - - constructor(page: Page, append: AppendModel) { - this.page = page; - this.append = append; - } - - async autofillCredentials(): Promise { - await this.page.getByRole('button', { name: 'auto' }).click(); - return await this.page.getByPlaceholder('Email').inputValue(); - } - - submit(invited: boolean, autoAppend: boolean) { - if (invited) { - const operationTrigger = () => this.page.getByRole('button', { name: 'Sign up' }).click(); - return this.append.autoAppendPasskey(autoAppend, operationTrigger); - } else { - return this.page.getByRole('button', { name: 'Sign up' }).click(); - } - } -} diff --git a/packages/tests-e2e/src/connect/models/SignupPage.ts b/packages/tests-e2e/src/connect/models/SignupPage.ts new file mode 100644 index 000000000..25f026314 --- /dev/null +++ b/packages/tests-e2e/src/connect/models/SignupPage.ts @@ -0,0 +1,42 @@ +import type { Page } from '@playwright/test'; + +import { BasePage } from './BasePage'; +import { LoginPage } from './LoginPage'; +import { PostLoginPage } from './PostLoginPage'; + +export class SignupPage extends BasePage { + private readonly page: Page; + + constructor(page: Page) { + super(page); + this.page = page; + } + + visible(): Promise { + return this.waitForHeading('Sign up'); + } + + static async awaitPage(page: Page): Promise { + const signupPage = new SignupPage(page); + if (!(await signupPage.visible())) { + throw new Error('Signup page not visible'); + } + + return signupPage; + } + + async navigateToLogin(): Promise { + await this.page.getByRole('button', { name: 'Login instead' }).click(); + + return new LoginPage(this.page); + } + + async submit(email: string, phoneNumber: string, password: string): Promise { + await this.page.getByPlaceholder('Email').fill(email); + await this.page.getByPlaceholder('Phone').fill(phoneNumber); + await this.page.getByPlaceholder('Password').fill(password); + await this.page.getByRole('button', { name: 'Sign up' }).click(); + + return new PostLoginPage(this.page); + } +} diff --git a/packages/tests-e2e/src/connect/models/StorageModel.ts b/packages/tests-e2e/src/connect/models/StorageModel.ts deleted file mode 100644 index f28ba1971..000000000 --- a/packages/tests-e2e/src/connect/models/StorageModel.ts +++ /dev/null @@ -1,134 +0,0 @@ -import type { Page } from '@playwright/test'; -import { expect } from '@playwright/test'; - -import { ScreenNames } from '../utils/Constants'; -import { expectScreen } from '../utils/ExpectScreen'; - -export class StorageModel { - page: Page; - - constructor(page: Page) { - this.page = page; - } - - async loadInvitationToken() { - await this.page.goto('/login?invitationToken=inv-token-correct'); - await expectScreen(this.page, ScreenNames.InitLogin); - } - - async checkInvitationToken() { - const cboConnectInvitationRaw = await this.page.evaluate(k => localStorage.getItem(k), 'cbo_connect_invitation'); - if (!cboConnectInvitationRaw) { - throw new Error('cbo_connect_invitation not found in local storage'); - } - const cboConnectInvitation = JSON.parse(cboConnectInvitationRaw); - expect(cboConnectInvitation.token).toEqual('inv-token-correct'); - } - - deleteInvitationToken() { - return this.page.evaluate(k => localStorage.removeItem(k), 'cbo_connect_invitation'); - } - - async getProcessID(): Promise { - const key = `cbo_connect_process-${process.env.PLAYWRIGHT_CONNECT_PROJECT_ID}`; - const cboConnectProcessRaw = await this.page.evaluate(k => localStorage.getItem(k), key); - if (!cboConnectProcessRaw) { - throw new Error('cbo_connect_process not found in local storage'); - } - const cboConnectProcess = JSON.parse(cboConnectProcessRaw); - expect(cboConnectProcess.id).not.toBeNull(); - - return cboConnectProcess.id; - } - - async checkProcessID(expectedID: string) { - expect(await this.getProcessID()).toEqual(expectedID); - } - - async getLoginLifetime(): Promise { - const key = `cbo_connect_process-${process.env.PLAYWRIGHT_CONNECT_PROJECT_ID}`; - const cboConnectProcessRaw = await this.page.evaluate(k => localStorage.getItem(k), key); - if (!cboConnectProcessRaw) { - throw new Error('cbo_connect_process not found in local storage'); - } - const cboConnectProcess = JSON.parse(cboConnectProcessRaw); - return cboConnectProcess.loginData.expiresAt; - } - - async setLoginLifetime(newLifetime: number) { - const key = `cbo_connect_process-${process.env.PLAYWRIGHT_CONNECT_PROJECT_ID}`; - const cboConnectProcessRaw = await this.page.evaluate(k => localStorage.getItem(k), key); - if (!cboConnectProcessRaw) { - throw new Error('cbo_connect_process not found in local storage'); - } - const cboConnectProcess = JSON.parse(cboConnectProcessRaw); - cboConnectProcess.loginData.expiresAt = newLifetime; - await this.page.evaluate(({ k, p }) => localStorage.setItem(k, JSON.stringify(p)), { - k: key, - p: cboConnectProcess, - }); - } - - async getAppendLifetime(): Promise { - const key = `cbo_connect_process-${process.env.PLAYWRIGHT_CONNECT_PROJECT_ID}`; - const cboConnectProcessRaw = await this.page.evaluate(k => localStorage.getItem(k), key); - if (!cboConnectProcessRaw) { - throw new Error('cbo_connect_process not found in local storage'); - } - const cboConnectProcess = JSON.parse(cboConnectProcessRaw); - return cboConnectProcess.appendData.expiresAt; - } - - async setAppendLifetime(newLifetime: number) { - const key = `cbo_connect_process-${process.env.PLAYWRIGHT_CONNECT_PROJECT_ID}`; - const cboConnectProcessRaw = await this.page.evaluate(k => localStorage.getItem(k), key); - if (!cboConnectProcessRaw) { - throw new Error('cbo_connect_process not found in local storage'); - } - const cboConnectProcess = JSON.parse(cboConnectProcessRaw); - cboConnectProcess.appendData.expiresAt = newLifetime; - await this.page.evaluate(({ k, p }) => localStorage.setItem(k, JSON.stringify(p)), { - k: key, - p: cboConnectProcess, - }); - } - - async getManageLifetime(): Promise { - const key = `cbo_connect_process-${process.env.PLAYWRIGHT_CONNECT_PROJECT_ID}`; - const cboConnectProcessRaw = await this.page.evaluate(k => localStorage.getItem(k), key); - if (!cboConnectProcessRaw) { - throw new Error('cbo_connect_process not found in local storage'); - } - const cboConnectProcess = JSON.parse(cboConnectProcessRaw); - return cboConnectProcess.manageData.expiresAt; - } - - async setManageLifetime(newLifetime: number) { - const key = `cbo_connect_process-${process.env.PLAYWRIGHT_CONNECT_PROJECT_ID}`; - const cboConnectProcessRaw = await this.page.evaluate(k => localStorage.getItem(k), key); - if (!cboConnectProcessRaw) { - throw new Error('cbo_connect_process not found in local storage'); - } - const cboConnectProcess = JSON.parse(cboConnectProcessRaw); - cboConnectProcess.manageData.expiresAt = newLifetime; - await this.page.evaluate(({ k, p }) => localStorage.setItem(k, JSON.stringify(p)), { - k: key, - p: cboConnectProcess, - }); - } - - async checkLoginDataDeleted() { - const key = `cbo_connect_process-${process.env.PLAYWRIGHT_CONNECT_PROJECT_ID}`; - const cboConnectProcessRaw = await this.page.evaluate(k => localStorage.getItem(k), key); - if (!cboConnectProcessRaw) { - throw new Error('cbo_connect_process not found in local storage'); - } - const cboConnectProcess = JSON.parse(cboConnectProcessRaw); - expect(cboConnectProcess.loginData).toBeNull(); - } - - async clearLocalStorageAndCookies() { - await this.page.evaluate(() => localStorage.clear()); - await this.page.context().clearCookies(); - } -} diff --git a/packages/tests-e2e/src/connect/models/WebhookModel.ts b/packages/tests-e2e/src/connect/models/WebhookModel.ts deleted file mode 100644 index 51dd6d274..000000000 --- a/packages/tests-e2e/src/connect/models/WebhookModel.ts +++ /dev/null @@ -1,102 +0,0 @@ -import { createServer } from 'node:http'; -import type { Server } from 'node:net'; - -import type { Page } from '@playwright/test'; -import { expect } from '@playwright/test'; -import ngrok from 'ngrok'; - -import { WebhookTypes } from '../utils/Constants'; - -export class WebhookModel { - page: Page; - webhookServer: Server | null = null; - webhookEndpointID: string | null = null; - latestWebhookType: WebhookTypes | null = null; - - constructor(page: Page) { - this.page = page; - } - - async createWebhookEndpoint(webhookTypes: WebhookTypes[]) { - if (this.webhookServer || this.webhookEndpointID) { - throw new Error('Webhook endpoint already created'); - } - - if (!process.env.PLAYWRIGHT_CONNECT_PROJECT_ID) { - throw new Error('PLAYWRIGHT_CONNECT_PROJECT_ID not set'); - } - - const port = 3001; - - await new Promise(resolve => { - this.webhookServer = createServer((req, res) => { - if (req.method === 'POST' && req.url === '/webhook') { - let body = ''; - req.on('data', chunk => (body += chunk)); - req.on('end', () => { - const receivedWebhookType = JSON.parse(body).type; - expect(Object.values(WebhookTypes)).toContain(receivedWebhookType); - this.latestWebhookType = receivedWebhookType as WebhookTypes; - res.writeHead(200); - res.end('OK'); - }); - } else { - res.writeHead(404); - res.end(); - } - }); - this.webhookServer.listen(port, () => { - console.log(`Webhook server running at http://localhost:${port}`); - resolve(this.webhookServer); - }); - }); - - const publicUrl = await ngrok.connect({ - addr: port, - authtoken: process.env.PLAYWRIGHT_NGROK_AUTH_TOKEN, - }); - const createRes = await fetch(`${process.env.BACKEND_API_URL}/v2/webhookEndpoints`, { - method: 'POST', - headers: { - Authorization: `Basic ${process.env.BACKEND_API_BASIC_AUTH}`, - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ - url: `${publicUrl}/webhook`, - subscribedEvents: webhookTypes, - customHeaders: { 'X-Custom-Header': 'custom-value' }, - }), - }); - expect(createRes.ok).toBeTruthy(); - - const res_data = await createRes.json(); - console.log(res_data); - this.webhookEndpointID = res_data.id; - } - - expectWebhookRequest(webhookType: WebhookTypes) { - expect(this.latestWebhookType).toEqual(webhookType); - } - - async deleteWebhookEndpoint() { - if (!this.webhookServer || !this.webhookEndpointID) { - throw new Error('Webhook endpoint not yet created'); - } - - if (!process.env.PLAYWRIGHT_CONNECT_PROJECT_ID) { - throw new Error('PLAYWRIGHT_CONNECT_PROJECT_ID not set'); - } - - const deleteRes = await fetch(`${process.env.BACKEND_API_URL}/v2/webhookEndpoints/${this.webhookEndpointID}`, { - method: 'DELETE', - headers: { - Authorization: `Basic ${process.env.BACKEND_API_BASIC_AUTH}`, - 'Content-Type': 'application/json', - }, - }); - expect(deleteRes.ok).toBeTruthy(); - - this.webhookServer.close(); - await ngrok.disconnect(); - } -} diff --git a/packages/tests-e2e/src/connect/scenarios/append.spec.ts b/packages/tests-e2e/src/connect/scenarios/append.spec.ts index d50d4138e..486ecbf47 100644 --- a/packages/tests-e2e/src/connect/scenarios/append.spec.ts +++ b/packages/tests-e2e/src/connect/scenarios/append.spec.ts @@ -1,73 +1,109 @@ -import { expect } from '@playwright/test'; +import type { ChildProcess } from 'node:child_process'; -import { test } from '../fixtures/BaseTest'; -import { password, ScreenNames } from '../utils/Constants'; -import { loadBeforePasskeyAppend, setupNetworkBlocker, setupUser, setupVirtualAuthenticator } from './hooks'; +import { expect, test } from '@playwright/test'; -test.describe('append component', () => { - setupVirtualAuthenticator(test); - setupNetworkBlocker(test); - setupUser(test, true, false); - loadBeforePasskeyAppend(test); +import { LoginPage, LoginStatus } from '../models/LoginPage'; +import { ProfileStatus } from '../models/ProfilePage'; +import { AuthenticatorApp } from '../utils/AuthenticatorApp'; +import { killPlaygroundNew, spawnPlaygroundNew } from '../utils/Playground'; +import { TestDataFactory } from '../utils/TestDataFactory'; +import { VirtualAuthenticator } from '../utils/VirtualAuthenticator'; - test('successful passkey append on login', async ({ model }) => { - await model.mfa.submit(true, true); - await model.expectScreen(ScreenNames.PasskeyAppended); +test.describe('append flows', () => { + let server: ChildProcess; + let port: number; - await model.append.confirmAppended(); - await model.expectScreen(ScreenNames.Home); + test.beforeAll(async () => { + ({ server, port } = await spawnPlaygroundNew()); }); - test('failed passkey append on login', async ({ model }) => { - await model.mfa.submit(true, false); + test.afterAll(() => { + killPlaygroundNew(server); }); - test('Corbado FAPI unavailable after authentication', async ({ model }) => { - await model.blocker.blockCorbadoFAPIFinishEndpoint(); - - await model.mfa.submit(true, true); - await model.expectScreen(ScreenNames.Home); + test('testAppendAfterSignUp', async ({ page }) => { + await page.goto(`${process.env.PLAYWRIGHT_TEST_URL}:${port.toString()}/login?invitationToken=inv-token-correct`); + const loginPage = new LoginPage(page); + const signupPage = await loginPage.navigateToSignup(); + const virtualAuthenticator = await VirtualAuthenticator.init(page); + + const email = TestDataFactory.generateEmail(); + + await virtualAuthenticator.modeCancel(); + const postLoginPage = await signupPage.submit(email, TestDataFactory.phoneNumber, TestDataFactory.password); + await postLoginPage.continueWithCancel(true); + await postLoginPage.continueWithCancel(false); + expect( + await postLoginPage.awaitErrorMessage('You have cancelled setting up your passkey. Please try again.'), + ).toBeTruthy(); + + await virtualAuthenticator.modeComplete(); + const profilePage = await postLoginPage.continue(false); + expect(await profilePage.awaitState(ProfileStatus.ListWithPasskeys)).toBeTruthy(); + expect(await profilePage.getPasskeyCount()).toBe(1); + const loginPage2 = await profilePage.logout(); + + expect(await loginPage2.awaitState(LoginStatus.PasskeyOneTap)).toBeTruthy(); + const postLoginPage4 = await loginPage2.loginWithOneTap(); + expect(await profilePage.awaitState(ProfileStatus.ListWithPasskeys)).toBeTruthy(); + await postLoginPage4.appendPasskey(); + await postLoginPage4.awaitErrorMessage('No passkey created'); + expect(await profilePage.getPasskeyCount()).toBe(1); }); -}); - -test.describe('skip append component', () => { - setupVirtualAuthenticator(test); - setupNetworkBlocker(test); - setupUser(test, true, false); - - test('Corbado FAPI unavailable', async ({ model }) => { - await model.home.logout(); - await model.expectScreen(ScreenNames.InitLogin); - - await model.login.submitEmail(model.email, false); - await model.expectScreen(ScreenNames.InitLoginFallback); - - await model.blocker.blockCorbadoFAPI(); - - await model.login.submitFallbackCredentials(model.email, password, true); - await model.expectScreen(ScreenNames.MFA); - - await model.mfa.autofillTOTP(); - await model.mfa.submit(false, false); - - await model.expectScreen(ScreenNames.Home); - }); - - test('expired append lifetime leads to skipped append screen', async ({ model }) => { - await model.home.logout(); - await model.expectScreen(ScreenNames.InitLogin); - - await model.login.submitEmail(model.email, false); - await model.expectScreen(ScreenNames.InitLoginFallback); - expect(await model.storage.getAppendLifetime()).toBeGreaterThan(Math.floor(Date.now() / 1000)); - - await model.storage.setAppendLifetime(Math.floor(Date.now() / 1000) - 1); - await model.storage.deleteInvitationToken(); - await model.login.submitFallbackCredentials(model.email, password, true); - await model.expectScreen(ScreenNames.MFA); - await model.mfa.autofillTOTP(); - await model.mfa.submit(false, false); - await model.expectScreen(ScreenNames.Home); + test('testAppendAfterSignUpSkipped', async ({ page }) => { + test.setTimeout(120000); // 120 seconds + await page.goto(`${process.env.PLAYWRIGHT_TEST_URL}:${port.toString()}/login?invitationToken=inv-token-correct`); + const loginPage = new LoginPage(page); + const signupPage = await loginPage.navigateToSignup(); + const virtualAuthenticator = await VirtualAuthenticator.init(page); + + const email = TestDataFactory.generateEmail(); + + // First attempt to create passkey is cancelled, user skips, then sets up TOTP and logs in later + await virtualAuthenticator.modeCancel(); + const postLoginPage = await signupPage.submit(email, TestDataFactory.phoneNumber, TestDataFactory.password); + const mfaPage = await postLoginPage.skipAfterSignup(); + + // Confirm TOTP to end on profile + const authenticator = new AuthenticatorApp(); + const [sharedKey, profilePage] = await mfaPage.setupAndConfirmTOTPReturnProfile(authenticator); + + // Initially no passkeys + expect(await profilePage.getPasskeyCount()).toBe(0); + + const loginPage2 = await profilePage.logout(); + await virtualAuthenticator.modeCancel(); + expect(await loginPage2.awaitState(LoginStatus.PasskeyTextField)).toBeTruthy(); + await loginPage2.loginWithIdentifierAndPasswordIdentifierFirst(email, TestDataFactory.password); + expect(await loginPage2.awaitState(LoginStatus.FallbackSecondTOTP)).toBeTruthy(); + + // MFA page appears, confirm with next code + const codeFirst = await authenticator.getCode(sharedKey); + const postLoginPage2 = await loginPage2.completeLoginWithTOTP(codeFirst!); + const profilePage2 = await postLoginPage2.skip(); + + await virtualAuthenticator.modeComplete(); + expect(await profilePage2.awaitState(ProfileStatus.ListEmpty)).toBeTruthy(); + await profilePage2.appendPasskey(); + expect(await profilePage2.awaitState(ProfileStatus.ListWithPasskeys)).toBeTruthy(); + const loginPage3 = await profilePage2.logout(); + + expect(await loginPage3.awaitState(LoginStatus.PasskeyOneTap)).toBeTruthy(); + const profilePage3 = await loginPage3.loginWithOneTap(); + expect(await profilePage3.awaitState(ProfileStatus.ListWithPasskeys)).toBeTruthy(); + expect(await profilePage3.getPasskeyCount()).toBe(1); + await profilePage3.deletePasskeyByIndex(0, true); + expect(await profilePage3.awaitState(ProfileStatus.ListEmpty)).toBeTruthy(); + + await virtualAuthenticator.modeCancel(); + const loginPage4 = await profilePage3.logout(); + expect(await loginPage4.awaitState(LoginStatus.PasskeyTextField)).toBeTruthy(); + await virtualAuthenticator.modeComplete(); + await loginPage4.loginWithIdentifierAndPasswordIdentifierFirst(email, TestDataFactory.password); + expect(await loginPage4.awaitState(LoginStatus.FallbackSecondTOTP)).toBeTruthy(); + const codeSecond = await authenticator.getCode(sharedKey); + const postLoginPage3 = await loginPage4.completeLoginWithTOTP(codeSecond!); + await postLoginPage3.awaitPage(); }); }); diff --git a/packages/tests-e2e/src/connect/scenarios/client-state.spec.ts b/packages/tests-e2e/src/connect/scenarios/client-state.spec.ts new file mode 100644 index 000000000..412988b79 --- /dev/null +++ b/packages/tests-e2e/src/connect/scenarios/client-state.spec.ts @@ -0,0 +1,20 @@ +import type { ChildProcess } from 'node:child_process'; + +import { test } from '@playwright/test'; + +import { killPlaygroundNew, spawnPlaygroundNew } from '../utils/Playground'; + +test.describe('client-state flows', () => { + let server: ChildProcess; + let port: number; + + test.beforeAll(async () => { + ({ server, port } = await spawnPlaygroundNew()); + }); + + test.afterAll(() => { + killPlaygroundNew(server); + }); + + test('testCookieBasedSync', async ({ page }) => {}); +}); diff --git a/packages/tests-e2e/src/connect/scenarios/hooks.ts b/packages/tests-e2e/src/connect/scenarios/hooks.ts deleted file mode 100644 index 4f05a47e2..000000000 --- a/packages/tests-e2e/src/connect/scenarios/hooks.ts +++ /dev/null @@ -1,119 +0,0 @@ -import type { - PlaywrightTestArgs, - PlaywrightTestOptions, - PlaywrightWorkerArgs, - PlaywrightWorkerOptions, - TestType, -} from '@playwright/test'; - -import type { BaseModel } from '../models/BaseModel'; -import type { WebhookTypes } from '../utils/Constants'; -import { password, ScreenNames } from '../utils/Constants'; - -export function setupVirtualAuthenticator( - test: TestType< - PlaywrightTestArgs & PlaywrightTestOptions & { model: BaseModel }, - PlaywrightWorkerArgs & PlaywrightWorkerOptions - >, -) { - test.beforeEach(async ({ model }) => { - await model.authenticator.addWebAuthn(); - }); - - test.afterEach(async ({ model }) => { - await model.authenticator.removeWebAuthn(); - }); -} - -export function setupNetworkBlocker( - test: TestType< - PlaywrightTestArgs & PlaywrightTestOptions & { model: BaseModel }, - PlaywrightWorkerArgs & PlaywrightWorkerOptions - >, -) { - test.beforeEach(async ({ model }) => { - await model.blocker.enableBlocking(); - }); -} - -export function setupWebhooks( - test: TestType< - PlaywrightTestArgs & PlaywrightTestOptions & { model: BaseModel }, - PlaywrightWorkerArgs & PlaywrightWorkerOptions - >, - webhookTypes: WebhookTypes[], -) { - test.beforeEach(async ({ model }) => { - await model.webhook.createWebhookEndpoint(webhookTypes); - }); - - test.afterEach(async ({ model }) => { - await model.webhook.deleteWebhookEndpoint(); - }); -} - -export function loadInvitationToken( - test: TestType< - PlaywrightTestArgs & PlaywrightTestOptions & { model: BaseModel }, - PlaywrightWorkerArgs & PlaywrightWorkerOptions - >, -) { - test.beforeEach(async ({ model }) => { - await model.storage.loadInvitationToken(); - }); -} - -export function setupUser( - test: TestType< - PlaywrightTestArgs & PlaywrightTestOptions & { model: BaseModel }, - PlaywrightWorkerArgs & PlaywrightWorkerOptions - >, - invited = true, - append = true, -) { - test.beforeEach(async ({ model }) => { - if (invited) { - await model.storage.loadInvitationToken(); - } - await model.loadSignup(); - await model.expectScreen(ScreenNames.InitSignup); - await model.createUser(invited, append); - await model.expectScreen(ScreenNames.Home); - }); -} - -// assumes that setupUser(test, true, false) has been called right before -export function loadBeforePasskeyAppend( - test: TestType< - PlaywrightTestArgs & PlaywrightTestOptions & { model: BaseModel }, - PlaywrightWorkerArgs & PlaywrightWorkerOptions - >, -) { - test.beforeEach(async ({ model }) => { - await model.home.logout(); - await model.expectScreen(ScreenNames.InitLogin); - - await model.login.submitEmail(model.email, false); - await model.expectScreen(ScreenNames.InitLoginFallback); - - await model.login.submitFallbackCredentials(model.email, password, true); - await model.expectScreen(ScreenNames.MFA); - - await model.mfa.autofillTOTP(); - // await model.mfa.submit(); - // await model.expectScreen(ScreenNames.PasskeyAppend); - }); -} - -// assumes that setupUser(test, true, true) has been called right before -export function loadPasskeyList( - test: TestType< - PlaywrightTestArgs & PlaywrightTestOptions & { model: BaseModel }, - PlaywrightWorkerArgs & PlaywrightWorkerOptions - >, -) { - test.beforeEach(async ({ model }) => { - await model.home.gotoPasskeyList(); - await model.expectScreen(ScreenNames.PasskeyList); - }); -} diff --git a/packages/tests-e2e/src/connect/scenarios/login.spec.ts b/packages/tests-e2e/src/connect/scenarios/login.spec.ts index 104413850..066dfcda2 100644 --- a/packages/tests-e2e/src/connect/scenarios/login.spec.ts +++ b/packages/tests-e2e/src/connect/scenarios/login.spec.ts @@ -1,193 +1,145 @@ -import { expect } from '@playwright/test'; +import type { ChildProcess } from 'node:child_process'; -import { test } from '../fixtures/BaseTest'; -import { ErrorTexts, password, ScreenNames } from '../utils/Constants'; -import { loadInvitationToken, setupNetworkBlocker, setupUser, setupVirtualAuthenticator } from './hooks'; +import { expect, test } from '@playwright/test'; -test.describe('login component (without invitation token)', () => { - setupUser(test, false); +import { LoginPage, LoginStatus } from '../models/LoginPage'; +import { VirtualAuthenticator } from '../utils/VirtualAuthenticator'; +import { TestDataFactory } from '../utils/TestDataFactory'; +import { ProfileStatus } from '../models/ProfilePage'; +import { AuthenticatorApp } from '../utils/AuthenticatorApp'; +import { killPlaygroundNew, spawnPlaygroundNew } from '../utils/Playground'; - test('successful login with credentials', async ({ model }) => { - await model.home.logout(); - await model.expectScreen(ScreenNames.InitLoginFallback); +test.describe('login flows', () => { + let server: ChildProcess; + let port: number; - await model.login.submitFallbackCredentials(model.email, password); - await model.expectScreen(ScreenNames.MFA); - - await model.mfa.autofillTOTP(); - await model.mfa.submit(false, false); - await model.expectScreen(ScreenNames.Home); - }); -}); - -test.describe('login component (with invitation token, without passkeys)', () => { - setupVirtualAuthenticator(test); - setupUser(test, true, false); - - test('successful login with credentials', async ({ model }) => { - await model.home.logout(); - await model.expectScreen(ScreenNames.InitLogin); - - await model.login.submitEmail(model.email, false); - await model.expectScreen(ScreenNames.InitLoginFallback); - - await model.login.submitFallbackCredentials(model.email, password, true); - await model.expectScreen(ScreenNames.MFA); - - await model.mfa.autofillTOTP(); - await model.mfa.submit(true, false); - - await model.append.skipAppend(); - await model.expectScreen(ScreenNames.Home); - }); -}); - -test.describe('login component (with invitation token, with passkeys)', () => { - setupVirtualAuthenticator(test); - setupNetworkBlocker(test); - setupUser(test, true, true); - - test('successful login with passkey', async ({ model }) => { - await model.home.logout(); - await model.expectScreen(ScreenNames.InitLoginOneTap); - - await model.login.removePasskeyButton(); - await model.expectScreen(ScreenNames.InitLogin); - - await model.login.submitEmail(model.email, true); - await model.expectScreen(ScreenNames.Home); - }); - - test('successful login with passkey (conditional UI)', async ({ model }) => { - await model.home.logout(); - await model.expectScreen(ScreenNames.InitLoginOneTap); - - await model.login.submitConditionalUI(async () => { - await model.login.removePasskeyButton(); - }); - await model.expectScreen(ScreenNames.Home); - }); - - test('successful login with passkey (one-tap)', async ({ model }) => { - await model.home.logout(); - await model.expectScreen(ScreenNames.InitLoginOneTap); - - await model.login.submitPasskeyButton(true); - await model.expectScreen(ScreenNames.Home); + test.beforeAll(async () => { + ({ server, port } = await spawnPlaygroundNew()); }); - test('attempt login with repeated failed passkey input', async ({ model }) => { - await model.home.logout(); - await model.expectScreen(ScreenNames.InitLoginOneTap); - - await model.login.submitPasskeyButton(false); - await model.login.repeatedlyFailPasskeyInput(); + test.afterAll(() => { + killPlaygroundNew(server); }); - test('Corbado FAPI unavailable after authentication', async ({ model }) => { - await model.home.logout(); - await model.expectScreen(ScreenNames.InitLoginOneTap); + test('testLoginWithTextField', async ({ page }) => { + await page.goto(`${process.env.PLAYWRIGHT_TEST_URL}:${port.toString()}/login?invitationToken=inv-token-correct`); + const loginPage = new LoginPage(page); + const signupPage = await loginPage.navigateToSignup(); + const virtualAuthenticator = await VirtualAuthenticator.init(page); + await virtualAuthenticator.modeComplete(); - await model.blocker.blockCorbadoFAPIFinishEndpoint(); + const email = TestDataFactory.generateEmail(); + const postLoginPage = await signupPage.submit(email, TestDataFactory.phoneNumber, TestDataFactory.password); + const profilePage = await postLoginPage.continue(true); + await profilePage.awaitPage(); - await model.login.submitPasskeyButton(true); - await model.expectScreen(ScreenNames.InitLoginFallback); - }); + await virtualAuthenticator.modeCancel(); + const loginPage2 = await profilePage.logout(); - test('passkey signature validation fails', async ({ model }) => { - await model.home.logout(); - await model.expectScreen(ScreenNames.InitLoginOneTap); + await loginPage2.switchAccount(); - await model.authenticator.clearCredentials(); - await model.authenticator.addDummyCredential(); + await virtualAuthenticator.modeComplete(); + const profilePage2 = await loginPage2.loginWithIdentifier(email); + await profilePage2.awaitPage(); - await model.login.submitConditionalUI(async () => { - await model.login.removePasskeyButton(); - }); - await model.expectScreen(ScreenNames.InitLoginFallback); - await model.expectError(ErrorTexts.PasskeySignatureValidationFail); + expect(await profilePage2.awaitState(ProfileStatus.ListWithPasskeys)).toBeTruthy(); }); - test('attempt login with server-side deleted passkey', async ({ model }) => { - await model.home.gotoPasskeyList(); - await model.expectScreen(ScreenNames.PasskeyList); - - await model.passkeyList.expectPasskeys(1); - await model.passkeyList.deletePasskey(0); - await model.passkeyList.expectPasskeys(0); - - await model.loadHome(); - await model.expectScreen(ScreenNames.Home); - - await model.login.submitConditionalUI(async () => { - await model.home.logout(); - }); - await model.expectScreen(ScreenNames.InitLoginFallback); - await model.expectError(ErrorTexts.DeletedPasskeyUsed); + test('testLoginWithOneTap', async ({ page }) => { + await page.goto(`${process.env.PLAYWRIGHT_TEST_URL}:${port.toString()}/login?invitationToken=inv-token-correct`); + const loginPage = new LoginPage(page); + const signupPage = await loginPage.navigateToSignup(); + const virtualAuthenticator = await VirtualAuthenticator.init(page); + await virtualAuthenticator.modeComplete(); + + const email = TestDataFactory.generateEmail(); + const postLoginPage = await signupPage.submit(email, TestDataFactory.phoneNumber, TestDataFactory.password); + const profilePage = await postLoginPage.continue(true); + await profilePage.awaitPage(); + const loginPage2 = await profilePage.logout(); + + // cancel first one-tap + await virtualAuthenticator.modeCancel(); + await loginPage2.loginWithOneTapAndCancel(); + + // then succeed + await virtualAuthenticator.modeComplete(); + const profilePage2 = await loginPage2.loginWithOneTap(); + await profilePage2.awaitPage(); + + expect(await profilePage2.awaitState(ProfileStatus.ListWithPasskeys)).toBeTruthy(); }); - // TODO: unskip when loginData reset feature is fixed - test.skip('successful login deletes loginData', async ({ model }) => { - await model.home.logout(); - await model.expectScreen(ScreenNames.InitLoginOneTap); - - await model.login.removePasskeyButton(); - await model.expectScreen(ScreenNames.InitLogin); - - await model.login.submitEmail(model.email, true); - await model.expectScreen(ScreenNames.Home); - await model.storage.checkLoginDataDeleted(); + test('testLoginWithCUI', async ({ page }) => { + await page.goto(`${process.env.PLAYWRIGHT_TEST_URL}:${port.toString()}/login?invitationToken=inv-token-correct`); + const loginPage = new LoginPage(page); + const signupPage = await loginPage.navigateToSignup(); + const virtualAuthenticator = await VirtualAuthenticator.init(page); + await virtualAuthenticator.modeComplete(); + + const email = TestDataFactory.generateEmail(); + const postLoginPage = await signupPage.submit(email, TestDataFactory.phoneNumber, TestDataFactory.password); + const profilePage = await postLoginPage.continue(true); + await profilePage.awaitPage(); + + const loginPage2 = await profilePage.logout(); + await loginPage2.switchAccount(); + await loginPage2.loginWithCUI().awaitPage(); }); -}); -test.describe('login component (without user)', () => { - setupVirtualAuthenticator(test); - setupNetworkBlocker(test); - loadInvitationToken(test); + test('testLoginErrorStates', async ({ page }) => { + await page.goto(`${process.env.PLAYWRIGHT_TEST_URL}:${port.toString()}/login?invitationToken=inv-token-correct`); + const loginPage = new LoginPage(page); + await VirtualAuthenticator.init(page); + const nonExistingEmail = 'integration-test+0000000000@corbado.com'; - test('attempt login with incomplete credentials', async ({ model }) => { - await model.loadLogin(); - await model.expectScreen(ScreenNames.InitLogin); - - await model.login.submitEmail('', false); - await model.expectError(ErrorTexts.EmptyEmail); + expect(await loginPage.awaitState(LoginStatus.PasskeyTextField)).toBeTruthy(); + await loginPage.loginWithIdentifierButNoSuccess(nonExistingEmail); + expect(await loginPage.awaitState(LoginStatus.PasskeyTextField)).toBeTruthy(); + expect(loginPage.awaitErrorMessage('There is no account registered to that email address.')).toBeTruthy(); }); - test('attempt login with unknown credentials', async ({ model }) => { - await model.loadLogin(); - await model.expectScreen(ScreenNames.InitLogin); - - await model.login.submitEmail('integration-test+unknown@corbado.com', false); - await model.expectError(ErrorTexts.UnknownEmail); - }); - - test('Corbado FAPI unavailable', async ({ model }) => { - await model.blocker.blockCorbadoFAPI(); - - await model.loadLogin(); - // It seems that the InitLogin page is now cached so that email needs to be submitted before reaching the InitLoginFallback screen. - await model.login.submitEmail('integration-test+dummy@corbado.com', false); - await model.expectScreen(ScreenNames.InitLoginFallback); + test('testLoginErrorStatesGradualRollout', async ({ page }) => { + await page.goto(`${process.env.PLAYWRIGHT_TEST_URL}:${port.toString()}/login`); + const loginPage = new LoginPage(page); + const signupPage = await loginPage.navigateToSignup(); + const virtualAuthenticator = await VirtualAuthenticator.init(page); + await virtualAuthenticator.modeComplete(); + + const email = TestDataFactory.generateEmail(); + const postLoginPage = await signupPage.submit(email, TestDataFactory.phoneNumber, TestDataFactory.password); + const mfaPage = await postLoginPage.autoSkipAfterSignup().awaitPage(); + + const authenticator = new AuthenticatorApp(); + const [sharedKey, profilePage] = await mfaPage.setupAndConfirmTOTPReturnProfile(authenticator); + await profilePage.awaitPage(); + expect(await profilePage.awaitState(ProfileStatus.ListWithoutPasskeySupport)).toBeTruthy(); + + const loginPage2 = await profilePage.logout(); + expect(await loginPage2.awaitState(LoginStatus.FallbackFirst)).toBeTruthy(); + await loginPage2.loginWithIdentifierAndPassword(email, TestDataFactory.password); + expect(await loginPage2.awaitState(LoginStatus.FallbackSecondTOTP)).toBeTruthy(); + const codeFirst = await authenticator.getCode(sharedKey); + const postLoginPage2 = await loginPage2.completeLoginWithTOTP(codeFirst!); + await postLoginPage2.autoSkip().awaitPage(); }); - test('invitation token and process id persists after page refresh', async ({ model }) => { - await model.expectScreen(ScreenNames.InitLogin); - await model.storage.checkInvitationToken(); - const processId = await model.storage.getProcessID(); - - await model.loadLogin(); - await model.expectScreen(ScreenNames.InitLogin); - await model.storage.checkInvitationToken(); - await model.storage.checkProcessID(processId); - }); - - test('expired login lifetime leads to fallback screen', async ({ model }) => { - await model.expectScreen(ScreenNames.InitLogin); - expect(await model.storage.getLoginLifetime()).toBeGreaterThan(Math.floor(Date.now() / 1000)); - - await model.storage.setLoginLifetime(Math.floor(Date.now() / 1000) - 1); - await model.storage.deleteInvitationToken(); - await model.loadLogin(); - await model.expectScreen(ScreenNames.InitLoginFallback); + test('testLoginErrorStatesPasskeyDeletedServerSide', async ({ page }) => { + await page.goto(`${process.env.PLAYWRIGHT_TEST_URL}:${port.toString()}/login?invitationToken=inv-token-correct`); + const loginPage = new LoginPage(page); + const signupPage = await loginPage.navigateToSignup(); + const virtualAuthenticator = await VirtualAuthenticator.init(page); + await virtualAuthenticator.modeComplete(); + + const email = TestDataFactory.generateEmail(); + const postLoginPage = await signupPage.submit(email, TestDataFactory.phoneNumber, TestDataFactory.password); + const profilePage = await postLoginPage.continue(true); + await profilePage.awaitPage(); + expect(await profilePage.awaitState(ProfileStatus.ListWithPasskeys)).toBeTruthy(); + await profilePage.deletePasskeyByIndex(0, true); + const loginPage2 = await profilePage.logout(); + + await loginPage2.awaitErrorMessage('You previously deleted this passkey. Use your password to log in instead.'); + expect(await loginPage2.awaitState(LoginStatus.FallbackFirst)).toBeTruthy(); }); }); diff --git a/packages/tests-e2e/src/connect/scenarios/misc.spec.ts b/packages/tests-e2e/src/connect/scenarios/misc.spec.ts deleted file mode 100644 index 001cff981..000000000 --- a/packages/tests-e2e/src/connect/scenarios/misc.spec.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { test } from '../fixtures/BaseTest'; -import { ScreenNames, WebhookTypes } from '../utils/Constants'; -import { - loadBeforePasskeyAppend, - loadPasskeyList, - setupNetworkBlocker, - setupUser, - setupVirtualAuthenticator, - setupWebhooks, -} from './hooks'; - -test.describe.serial('webhook tests', () => { - test.describe('login component (webhook)', () => { - setupVirtualAuthenticator(test); - setupNetworkBlocker(test); - setupUser(test, true, true); - setupWebhooks(test, [WebhookTypes.Login]); - - test('successful login with passkey (+ webhook)', async ({ model }) => { - await model.home.logout(); - await model.expectScreen(ScreenNames.InitLoginOneTap); - - await model.login.removePasskeyButton(); - await model.expectScreen(ScreenNames.InitLogin); - - await model.login.submitEmail(model.email, true); - await model.expectScreen(ScreenNames.Home); - - model.webhook.expectWebhookRequest(WebhookTypes.Login); - }); - }); - - test.describe('append component (webhook)', () => { - setupVirtualAuthenticator(test); - setupNetworkBlocker(test); - setupUser(test, true, false); - loadBeforePasskeyAppend(test); - setupWebhooks(test, [WebhookTypes.Create]); - - test('successful passkey append on login (+ webhook)', async ({ model }) => { - await model.mfa.submit(true, true); - await model.expectScreen(ScreenNames.PasskeyAppended); - - await model.append.confirmAppended(); - await model.expectScreen(ScreenNames.Home); - - model.webhook.expectWebhookRequest(WebhookTypes.Create); - }); - }); - - test.describe('passkey-list component (webhook)', () => { - setupVirtualAuthenticator(test); - setupNetworkBlocker(test); - setupUser(test, true, false); - loadPasskeyList(test); - setupWebhooks(test, [WebhookTypes.Create, WebhookTypes.Delete]); - - test('list, delete, create passkey (+ webhook)', async ({ model }) => { - await model.passkeyList.expectPasskeys(0); - await model.passkeyList.createPasskey(true); - await model.passkeyList.expectPasskeys(1); - model.webhook.expectWebhookRequest(WebhookTypes.Create); - - await model.passkeyList.deletePasskey(0); - await model.passkeyList.expectPasskeys(0); - model.webhook.expectWebhookRequest(WebhookTypes.Delete); - }); - }); -}); diff --git a/packages/tests-e2e/src/connect/scenarios/network-blocking.spec.ts b/packages/tests-e2e/src/connect/scenarios/network-blocking.spec.ts new file mode 100644 index 000000000..d7e55f121 --- /dev/null +++ b/packages/tests-e2e/src/connect/scenarios/network-blocking.spec.ts @@ -0,0 +1,147 @@ +import type { ChildProcess } from 'node:child_process'; + +import { expect, test } from '@playwright/test'; + +import { LoginPage, LoginStatus } from '../models/LoginPage'; +import { VirtualAuthenticator } from '../utils/VirtualAuthenticator'; +import { TestDataFactory } from '../utils/TestDataFactory'; +import { NetworkRequestBlocker } from '../utils/NetworkRequestBlocker'; +import { AuthenticatorApp } from '../utils/AuthenticatorApp'; +import { ProfileStatus } from '../models/ProfilePage'; +import { killPlaygroundNew, spawnPlaygroundNew } from '../utils/Playground'; + +test.describe('network blocking flows', () => { + let server: ChildProcess; + let port: number; + + test.beforeAll(async () => { + ({ server, port } = await spawnPlaygroundNew()); + }); + + test.afterAll(() => { + killPlaygroundNew(server); + }); + + test('testLoginErrorStatesNetworkBlocking', async ({ page }) => { + await page.goto(`${process.env.PLAYWRIGHT_TEST_URL}:${port.toString()}/login?invitationToken=inv-token-correct`); + const loginPage = new LoginPage(page); + const signupPage = await loginPage.navigateToSignup(); + const virtualAuthenticator = await VirtualAuthenticator.init(page); + await virtualAuthenticator.modeComplete(); + const networkBlocker = await NetworkRequestBlocker.init(page); + + const email = TestDataFactory.generateEmail(); + const postLoginPage = await signupPage.submit(email, TestDataFactory.phoneNumber, TestDataFactory.password); + const profilePage = await postLoginPage.continue(true); + await profilePage.awaitPage(); + + await networkBlocker.loginInit(); + const loginPage2 = await profilePage.logout(); + expect(await loginPage2.awaitState(LoginStatus.FallbackFirst)).toBeTruthy(); + + await networkBlocker.loginStart(); + await page.reload(); + expect(await loginPage2.awaitState(LoginStatus.PasskeyOneTap)).toBeTruthy(); + await virtualAuthenticator.modeCancel(); + await loginPage2.switchAccount(); + await virtualAuthenticator.modeComplete(); + await loginPage2.loginWithIdentifierButNoSuccess(email); + expect(await loginPage2.awaitState(LoginStatus.FallbackFirst)).toBeTruthy(); + + await networkBlocker.loginFinish(); + await page.reload(); + expect(await loginPage2.awaitState(LoginStatus.FallbackFirst)).toBeTruthy(); + + await networkBlocker.unblockAll(); + await page.reload(); + await loginPage2.loginWithCUI().awaitPage(); + }); + + test('testAppendErrorStatesPasskeyAppendBlocked', async ({ page }) => { + await page.goto(`${process.env.PLAYWRIGHT_TEST_URL}:${port.toString()}/login?invitationToken=inv-token-correct`); + const loginPage = new LoginPage(page); + const signupPage = await loginPage.navigateToSignup(); + const virtualAuthenticator = await VirtualAuthenticator.init(page); + await virtualAuthenticator.modeComplete(); + const networkBlocker = await NetworkRequestBlocker.init(page); + + const email = TestDataFactory.generateEmail(); + + await networkBlocker.appendInit(); + const postLoginPage = await signupPage.submit(email, TestDataFactory.phoneNumber, TestDataFactory.password); + const mfaPage = postLoginPage.autoSkipAfterSignup(); + + const authenticator = new AuthenticatorApp(); + const [sharedKey, profilePage] = await mfaPage.setupAndConfirmTOTPReturnProfile(authenticator); + expect(await profilePage.awaitState(ProfileStatus.ListEmpty)).toBeTruthy(); + + await networkBlocker.appendStart(); + const loginPage2 = await profilePage.logout(); + await loginPage2.loginWithIdentifierAndPasswordIdentifierFirst(email, TestDataFactory.password); + const codeFirst = await authenticator.getCode(sharedKey); + const postLoginPage2 = await loginPage2.completeLoginWithTOTP(codeFirst!); + await postLoginPage2.autoSkip().awaitPage(); + + await networkBlocker.appendFinish(); + const loginPage3 = await profilePage.logout(); + await loginPage3.loginWithIdentifierAndPasswordIdentifierFirst(email, TestDataFactory.password); + const codeSecond = await authenticator.getCode(sharedKey); + const postLoginPage3 = await loginPage3.completeLoginWithTOTP(codeSecond!); + await postLoginPage3.autoSkip().awaitPage(); + }); + + test('testManageErrorStatesNetworkBlocking', async ({ page }) => { + await page.goto(`${process.env.PLAYWRIGHT_TEST_URL}:${port.toString()}/login?invitationToken=inv-token-correct`); + const loginPage = new LoginPage(page); + const signupPage = await loginPage.navigateToSignup(); + const virtualAuthenticator = await VirtualAuthenticator.init(page); + await virtualAuthenticator.modeComplete(); + const networkBlocker = await NetworkRequestBlocker.init(page); + + const email = TestDataFactory.generateEmail(); + const postLoginPage = await signupPage.submit(email, TestDataFactory.phoneNumber, TestDataFactory.password); + const profilePage = await postLoginPage.continue(true); + await profilePage.awaitPage(); + expect(await profilePage.awaitState(ProfileStatus.ListWithPasskeys)).toBeTruthy(); + + await profilePage.clearProcessState(); + await networkBlocker.manageInit(); + await page.reload(); + expect(await profilePage.awaitState(ProfileStatus.ListWithInitialError)).toBeTruthy(); + expect( + await profilePage.awaitErrorMessage('Unable to access passkeys. Check your connection and try again.'), + ).toBeTruthy(); + + await networkBlocker.manageList(); + await page.reload(); + expect(await profilePage.awaitState(ProfileStatus.ListWithInitialError)).toBeTruthy(); + expect( + await profilePage.awaitErrorMessage('Unable to access passkeys. Check your connection and try again.'), + ).toBeTruthy(); + + await networkBlocker.appendStart(); + await page.reload(); + expect(await profilePage.awaitState(ProfileStatus.ListWithPasskeys)).toBeTruthy(); + expect(await profilePage.getPasskeyCount()).toBe(1); + await profilePage.appendPasskey(); + expect(await profilePage.awaitErrorMessage('Passkey creation failed. Please try again later.')).toBeTruthy(); + expect(await profilePage.getPasskeyCount()).toBe(1); + + await networkBlocker.appendFinish(); + await page.reload(); + expect(await profilePage.awaitState(ProfileStatus.ListWithPasskeys)).toBeTruthy(); + await profilePage.deletePasskeyByIndex(0, true); + expect(await profilePage.awaitState(ProfileStatus.ListEmpty)).toBeTruthy(); + await profilePage.appendPasskey(); + expect(await profilePage.awaitErrorMessage('Passkey creation failed. Please try again later.')).toBeTruthy(); + expect(await profilePage.awaitState(ProfileStatus.ListEmpty)).toBeTruthy(); + + await networkBlocker.manageDelete(); + await page.reload(); + expect(await profilePage.awaitState(ProfileStatus.ListEmpty)).toBeTruthy(); + await profilePage.appendPasskey(); + expect(await profilePage.awaitState(ProfileStatus.ListWithPasskeys)).toBeTruthy(); + await profilePage.deletePasskeyByIndex(0, true); + expect(await profilePage.awaitErrorMessage('Passkey deletion failed. Please try again later.')).toBeTruthy(); + }); +}); diff --git a/packages/tests-e2e/src/connect/scenarios/passkey-list.spec.ts b/packages/tests-e2e/src/connect/scenarios/passkey-list.spec.ts deleted file mode 100644 index 880d0b8a2..000000000 --- a/packages/tests-e2e/src/connect/scenarios/passkey-list.spec.ts +++ /dev/null @@ -1,121 +0,0 @@ -import { expect, test } from '../fixtures/BaseTest'; -import { ErrorTexts, ScreenNames } from '../utils/Constants'; -import { loadPasskeyList, setupNetworkBlocker, setupUser, setupVirtualAuthenticator } from './hooks'; - -test.describe('passkey-list component', () => { - setupVirtualAuthenticator(test); - setupNetworkBlocker(test); - setupUser(test, true, false); - loadPasskeyList(test); - - test('list, delete, create passkey', async ({ model }) => { - await model.passkeyList.expectPasskeys(0); - await model.passkeyList.createPasskey(true); - await model.passkeyList.expectPasskeys(1); - await model.passkeyList.deletePasskey(0); - await model.passkeyList.expectPasskeys(0); - }); - - test('abort passkey creation', async ({ model }) => { - await model.passkeyList.expectPasskeys(0); - await model.passkeyList.createPasskey(false); - await model.passkeyList.expectPasskeys(0); - }); - - test('Connect Token endpoint unavailable during passkey creation', async ({ model }) => { - await model.passkeyList.expectPasskeys(0); - - await model.blocker.blockCorbadoConnectTokenEndpoint(); - - await model.page.getByRole('button', { name: 'Add a passkey' }).click(); - await model.expectError(ErrorTexts.PasskeyCreateFail); - await model.passkeyList.expectPasskeys(0); - }); - - test('Corbado FAPI unavailable during passkey creation', async ({ model }) => { - await model.passkeyList.expectPasskeys(0); - - await model.blocker.blockCorbadoFAPI(); - - await model.page.getByRole('button', { name: 'Add a passkey' }).click(); - await model.expectError(ErrorTexts.PasskeyCreateFail); - await model.passkeyList.expectPasskeys(0); - }); - - test('passkey already registered', async ({ model }) => { - await model.passkeyList.expectPasskeys(0); - await model.passkeyList.createPasskey(true); - await model.passkeyList.expectPasskeys(1); - - await model.passkeyList.createPasskey(true, () => - expect(model.page.getByRole('heading', { name: 'No passkey created' })).toBeVisible(), - ); - await expect(model.page.getByText('No passkey created')).toBeVisible(); - - await model.passkeyList.confirmModal(); - await model.passkeyList.expectPasskeys(1); - }); - - test('Connect Token endpoint unavailable during passkey deletion', async ({ model }) => { - await model.passkeyList.expectPasskeys(0); - await model.passkeyList.createPasskey(true); - await model.passkeyList.expectPasskeys(1); - - await model.blocker.blockCorbadoConnectTokenEndpoint(); - - await model.passkeyList.deletePasskey(0); - await model.expectError(ErrorTexts.PasskeyDeleteFail); - await model.passkeyList.expectPasskeys(1); - }); - - test('Corbado FAPI unavailable during passkey deletion', async ({ model }) => { - await model.passkeyList.expectPasskeys(0); - await model.passkeyList.createPasskey(true); - await model.passkeyList.expectPasskeys(1); - - await model.blocker.blockCorbadoFAPI(); - - await model.passkeyList.deletePasskey(0); - await model.expectError(ErrorTexts.PasskeyDeleteFail); - await model.passkeyList.expectPasskeys(1); - }); -}); - -test.describe('skip passkey-list component', () => { - setupVirtualAuthenticator(test); - setupNetworkBlocker(test); - setupUser(test, true, true); - - test('Connect Token endpoint unavailable', async ({ model }) => { - await model.blocker.blockCorbadoConnectTokenEndpoint(); - - await model.home.gotoPasskeyList(); - await model.expectScreen(ScreenNames.PasskeyList); - await model.expectError(ErrorTexts.PasskeyFetchFail); - }); - - test('Corbado FAPI unavailable', async ({ model }) => { - await model.blocker.blockCorbadoFAPI(); - - await model.home.gotoPasskeyList(); - await model.expectScreen(ScreenNames.PasskeyList); - await model.expectError(ErrorTexts.PasskeyFetchFail); - }); - - test('expired manage lifetime leads to skipped passkey-list screen', async ({ model }) => { - await model.home.gotoPasskeyList(); - await model.expectScreen(ScreenNames.PasskeyList); - await model.passkeyList.expectPasskeys(1); - await model.loadHome(); - await model.expectScreen(ScreenNames.Home); - expect(await model.storage.getManageLifetime()).toBeGreaterThan(Math.floor(Date.now() / 1000)); - - await model.storage.setManageLifetime(Math.floor(Date.now() / 1000) - 1); - await model.storage.deleteInvitationToken(); - - await model.home.gotoPasskeyList(); - await model.expectScreen(ScreenNames.PasskeyList); - await model.passkeyList.expectPasskeys(1); - await model.passkeyList.checkCreatePasskeyDisabled(); - }); -}); diff --git a/packages/tests-e2e/src/connect/utils/AuthenticatorApp.ts b/packages/tests-e2e/src/connect/utils/AuthenticatorApp.ts new file mode 100644 index 000000000..9960c2468 --- /dev/null +++ b/packages/tests-e2e/src/connect/utils/AuthenticatorApp.ts @@ -0,0 +1,55 @@ +// A lightweight TOTP helper mirroring the Android AuthenticatorApp behavior +// - addBySecret(secret): registers a secret and returns the current code +// - getCode(secret): waits until next 30s boundary if needed, then returns next code + +import { generateToken } from 'node-2fa'; + +type WrappedTOTP = { + secret: string; + nextBoundary: number; // ms timestamp of next 30s boundary +}; + +export class AuthenticatorApp { + #existing = new Map(); + + async addBySecret(secret: string): Promise { + try { + const now = Date.now(); + const result = generateToken(secret); + if (!result) return null; + + const boundary = this.#calculateNextBoundary(now, 30_000); + this.#existing.set(secret, { secret, nextBoundary: boundary }); + return result.token; + } catch { + return null; + } + } + + async getCode(secret: string): Promise { + const wrapped = this.#existing.get(secret); + if (!wrapped) return null; + + const now = Date.now(); + if (now < wrapped.nextBoundary) { + await new Promise(resolve => setTimeout(resolve, wrapped.nextBoundary - now)); + } + + const then = Date.now(); + const result = generateToken(secret); + if (!result) return null; + + wrapped.nextBoundary = this.#calculateNextBoundary(then, 30_000); + this.#existing.set(secret, wrapped); + return result.token; + } + + clear() { + this.#existing.clear(); + } + + #calculateNextBoundary(timeMillis: number, periodMillis: number): number { + const periods = Math.floor(timeMillis / periodMillis); + return (periods + 1) * periodMillis; + } +} diff --git a/packages/tests-e2e/src/connect/utils/CDPSessionManager.ts b/packages/tests-e2e/src/connect/utils/CDPSessionManager.ts deleted file mode 100644 index 49d28660e..000000000 --- a/packages/tests-e2e/src/connect/utils/CDPSessionManager.ts +++ /dev/null @@ -1,16 +0,0 @@ -import type { CDPSession, Page } from '@playwright/test'; - -export class CDPSessionManager { - #cdpClient: CDPSession | null = null; - - async initialize(page: Page) { - this.#cdpClient = await page.context().newCDPSession(page); - } - - getClient(): CDPSession { - if (!this.#cdpClient) { - throw new Error('CDP client not initialized'); - } - return this.#cdpClient; - } -} diff --git a/packages/tests-e2e/src/connect/utils/Constants.ts b/packages/tests-e2e/src/connect/utils/Constants.ts deleted file mode 100644 index cc5bfd6a8..000000000 --- a/packages/tests-e2e/src/connect/utils/Constants.ts +++ /dev/null @@ -1,36 +0,0 @@ -export enum ScreenNames { - InitSignup, - InitLogin, - InitLoginFallback, - InitLoginOneTap, - PasskeyAppend, - PasskeyAppended, - Home, - PasskeyList, - PasskeyError1, - PasskeyError2, - MFA, -} - -export enum ErrorTexts { - EmptyEmail = 'Enter your email address.', - UnknownEmail = 'There is no account registered to that email address.', - CancelledPasskey = 'You have cancelled setting up your passkey. Please try again.', - PasskeyFetchFail = 'Unable to access passkeys. Check your connection and try again.', - PasskeyCreateFail = 'Passkey creation failed. Please try again later.', - PasskeyDeleteFail = 'Passkey deletion failed. Please try again later.', - DeletedPasskeyUsed = 'You previously deleted this passkey. Use your password to log in instead.', - PasskeySignatureValidationFail = "We couldn't log you in with your passkey due to a system error. Use your password to log in instead.", -} - -export enum WebhookTypes { - Login = 'passkey-login.completed', - Create = 'passkey.created', - Delete = 'passkey.deleted', -} - -export const phone = '+4915121609839'; -export const password = 'asdfasdf'; - -export const totalTimeout = 45000; -export const operationTimeout = 10000; diff --git a/packages/tests-e2e/src/connect/utils/ExpectScreen.ts b/packages/tests-e2e/src/connect/utils/ExpectScreen.ts deleted file mode 100644 index 0d629c216..000000000 --- a/packages/tests-e2e/src/connect/utils/ExpectScreen.ts +++ /dev/null @@ -1,72 +0,0 @@ -import type { Page } from '@playwright/test'; -import { expect } from '@playwright/test'; - -import { ErrorTexts } from './Constants'; -import { ScreenNames } from './Constants'; - -export const expectScreen = async (page: Page, screenName: ScreenNames): Promise => { - switch (screenName) { - case ScreenNames.InitSignup: - await expect(page.locator('div.font-bold.text-xl')).toHaveText('Signup'); - return; - - case ScreenNames.InitLogin: - await expect(page.locator('div.cb-connect-login').getByRole('textbox', { name: 'Email address' })).toBeVisible(); - return; - - case ScreenNames.InitLoginFallback: - await expect(page.locator('div.font-bold.text-xl')).toHaveText('Login'); - return; - - case ScreenNames.InitLoginOneTap: - await expect(page.locator('div.cb-connect-login')).toContainText('Welcome back'); - return; - - case ScreenNames.PasskeyAppend: - await expect(page.locator('.cb-connect-container').locator('.cb-append-header')).toContainText( - 'Simplify Your Login', - ); - return; - - case ScreenNames.PasskeyAppended: - await expect(page.locator('.cb-connect-container').locator('.cb-append-success-header')).toContainText( - 'Passkey Created Successfully', - ); - return; - - case ScreenNames.Home: - await expect(page.locator('div.font-bold.text-xl')).toHaveText('Home'); - return; - - case ScreenNames.PasskeyList: - await expect(page.locator('.cb-connect-passkey-list')).toBeVisible(); - return; - - case ScreenNames.PasskeyError1: - await expect(page.locator('.cb-connect-container').locator('.cb-login-header')).toContainText( - 'Use your passkey to confirm it’s really you', - ); - return; - - case ScreenNames.PasskeyError2: - await expect(page.locator('.cb-connect-container').locator('.cb-login-header')).toContainText( - 'Something went wrong!', - ); - return; - - case ScreenNames.MFA: - await expect(page.locator('div.font-bold.text-xl')).toHaveText('MFA'); - return; - - default: - throw new Error('Invalid screen'); - } -}; - -export const expectError = (page: Page, message: ErrorTexts): Promise => { - // This error message isn't a part of cb-container, so it doesn't come as cb-notification-text. - if (message === ErrorTexts.DeletedPasskeyUsed || message === ErrorTexts.PasskeySignatureValidationFail) { - return expect(page.getByText(message)).toBeVisible(); - } - return expect(page.locator('.cb-notification-text')).toHaveText(message); -}; diff --git a/packages/tests-e2e/src/connect/utils/NetworkRequestBlocker.ts b/packages/tests-e2e/src/connect/utils/NetworkRequestBlocker.ts index c780a351f..da5864826 100644 --- a/packages/tests-e2e/src/connect/utils/NetworkRequestBlocker.ts +++ b/packages/tests-e2e/src/connect/utils/NetworkRequestBlocker.ts @@ -1,34 +1,64 @@ -import type { CDPSession } from '@playwright/test'; - -import type { CDPSessionManager } from './CDPSessionManager'; - export class NetworkRequestBlocker { #cdpClient: CDPSession; - constructor(cdpManager: CDPSessionManager) { - this.#cdpClient = cdpManager.getClient(); + static async init(page: Page): Promise { + const blocker = new NetworkRequestBlocker(); + blocker.#cdpClient = await page.context().newCDPSession(page); + await blocker.#cdpClient.send('Network.enable'); + + return blocker; } - enableBlocking() { - return this.#cdpClient.send('Network.enable'); + loginInit() { + return this.#setBlockedURLs(['*/v2/connect/login/init']); } - blockCorbadoFAPI() { - return this.#cdpClient.send('Network.setBlockedURLs', { - urls: ['*.frontendapi.cloud.corbado-staging.io/v2/connect'], - }); + loginStart() { + return this.#setBlockedURLs(['*/v2/connect/login/start']); } - blockCorbadoFAPIFinishEndpoint() { - return this.#cdpClient.send('Network.setBlockedURLs', { - urls: ['*.frontendapi.cloud.corbado-staging.io/v2/connect/*/finish'], - }); + loginFinish() { + return this.#setBlockedURLs(['*/v2/connect/login/finish']); + } + + appendInit() { + return this.#setBlockedURLs(['*/v2/connect/append/init']); + } + + appendStart() { + return this.#setBlockedURLs(['*/v2/connect/append/start']); + } + + appendFinish() { + return this.#setBlockedURLs(['*/v2/connect/append/finish']); + } + + manageInit() { + return this.#setBlockedURLs(['*/v2/connect/manage/init']); + } + + manageList() { + return this.#setBlockedURLs(['*/v2/connect/manage/list']); + } + + manageDelete() { + return this.#setBlockedURLs(['*/v2/connect/manage/delete']); } - blockCorbadoConnectTokenEndpoint() { + blockCorbadoConnectTokenEndpoint(port: number) { // This is sufficient, as the connectTokens endpoint is called from /passkey-list handler return this.#cdpClient.send('Network.setBlockedURLs', { - urls: ['*.playground.corbado.io/passkey-list'], + urls: [`localhost:${port.toString()}/passkey-list`], }); } + + unblockAll() { + return this.#setBlockedURLs([]); + } + + #setBlockedURLs(urls: string[]) { + return this.#cdpClient.send('Network.setBlockedURLs', { urls }); + } } + +import type { CDPSession, Page } from '@playwright/test'; diff --git a/packages/tests-e2e/src/connect/utils/Playground.ts b/packages/tests-e2e/src/connect/utils/Playground.ts new file mode 100644 index 000000000..a2d526421 --- /dev/null +++ b/packages/tests-e2e/src/connect/utils/Playground.ts @@ -0,0 +1,100 @@ +import type { ChildProcess } from 'node:child_process'; +import { spawn } from 'node:child_process'; + +import getPort from 'get-port'; +import path from 'path'; +import waitPort from 'wait-port'; + +type PlaygroundType = 'connect-next' | 'connect-web-js'; +const PLAYGROUND_TYPE: PlaygroundType = (process.env.PLAYGROUND_TYPE as PlaygroundType) || 'connect-next'; + +export type PlaygroundInfo = { + server: ChildProcess; + port: number; +}; + +function getPlaygroundDir(): string { + switch (PLAYGROUND_TYPE) { + case 'connect-next': + return path.resolve(__dirname, '../../../../../playground/connect-next'); + case 'connect-web-js': + return path.resolve(__dirname, '../../../../../playground/connect-web-js'); + default: + throw new Error(`Unknown PLAYGROUND_TYPE: ${PLAYGROUND_TYPE}`); + } +} + +function getPlaygroundArgs(port: number): string[] { + switch (PLAYGROUND_TYPE) { + case 'connect-next': + return ['run', 'start', '--', '--port', port.toString()]; + case 'connect-web-js': + throw new Error(`Unimplemented: ${PLAYGROUND_TYPE}`); + default: + throw new Error(`Unknown PLAYGROUND_TYPE: ${PLAYGROUND_TYPE}`); + } +} + +export async function spawnPlaygroundNew(): Promise { + const port = await getPort(); + + const playgroundDir = getPlaygroundDir(); + const server = spawn('npm', getPlaygroundArgs(port), { + cwd: playgroundDir, + env: { + ...process.env, + }, + stdio: 'ignore', + shell: true, + }); + const ok = await waitPort({ host: 'localhost', port, timeout: 15_000, output: 'silent' }); + if (!ok) { + server.kill(); + throw new Error(`Server never came up on port ${port}`); + } + + return { server, port }; +} + +export function killPlaygroundNew(server: ChildProcess) { + server.kill(); +} + +export default async function installPlaygroundDeps() { + const playgroundDir = getPlaygroundDir(); + + const installProcess = spawn('npm', ['install'], { + cwd: playgroundDir, + stdio: 'inherit', + shell: true, + }); + + await new Promise((resolve, reject) => { + installProcess.on('close', (code: number) => { + if (code === 0) { + console.log(`[Global Setup] Dependencies installed successfully in ${playgroundDir}.`); + const buildProcess = spawn('npm', ['run', 'build'], { + cwd: playgroundDir, + stdio: 'inherit', + shell: true, + }); + buildProcess.on('close', (buildCode: number) => { + if (buildCode === 0) { + console.log(`[Global Setup] Playground built successfully in ${playgroundDir}.`); + resolve(); + } else { + reject(new Error(`[Global Setup] npm run build failed in ${playgroundDir} with code ${buildCode}`)); + } + }); + buildProcess.on('error', (err: Error) => { + reject(new Error(`[Global Setup] Failed to start build process: ${err.message}`)); + }); + } else { + reject(new Error(`[Global Setup] npm install failed in ${playgroundDir} with code ${code}`)); + } + }); + installProcess.on('error', (err: Error) => { + reject(new Error(`[Global Setup] Failed to start npm install process: ${err.message}`)); + }); + }); +} diff --git a/packages/tests-e2e/src/connect/utils/TestDataFactory.ts b/packages/tests-e2e/src/connect/utils/TestDataFactory.ts new file mode 100644 index 000000000..8a2668ab6 --- /dev/null +++ b/packages/tests-e2e/src/connect/utils/TestDataFactory.ts @@ -0,0 +1,10 @@ +export class TestDataFactory { + static phoneNumber = '+1234567890'; + static password = 'TestPassword123!'; + + static generateEmail(): string { + const currentMilliseconds = Date.now(); + + return `integration-test+${currentMilliseconds}@corbado.com`; + } +} diff --git a/packages/tests-e2e/src/connect/utils/VirtualAuthenticator.ts b/packages/tests-e2e/src/connect/utils/VirtualAuthenticator.ts index dea81b8a4..b874990cc 100644 --- a/packages/tests-e2e/src/connect/utils/VirtualAuthenticator.ts +++ b/packages/tests-e2e/src/connect/utils/VirtualAuthenticator.ts @@ -1,14 +1,15 @@ -import type { CDPSession } from '@playwright/test'; - -import type { CDPSessionManager } from './CDPSessionManager'; -import { operationTimeout } from './Constants'; +import type { CDPSession, Page } from '@playwright/test'; export class VirtualAuthenticator { #cdpClient: CDPSession; #authenticatorId = ''; - constructor(cdpManager: CDPSessionManager) { - this.#cdpClient = cdpManager.getClient(); + static async init(page: Page, passkeysSupported = true): Promise { + const authenticator = new VirtualAuthenticator(); + authenticator.#cdpClient = await page.context().newCDPSession(page); + await authenticator.addWebAuthn(passkeysSupported); + + return authenticator; } async addWebAuthn(passkeySupported = true) { @@ -31,43 +32,38 @@ export class VirtualAuthenticator { this.#authenticatorId = result.authenticatorId; } - removeWebAuthn() { - return this.#cdpClient.send('WebAuthn.removeVirtualAuthenticator', { - authenticatorId: this.#authenticatorId, + async runWithComplete(cb: () => Promise) { + const postOperationPromise = new Promise(resolve => { + this.#cdpClient?.on('WebAuthn.credentialAdded', () => resolve()); + this.#cdpClient?.on('WebAuthn.credentialAsserted', () => resolve()); }); - } + const wait = new Promise(resolve => setTimeout(resolve, 5000)); - async startAndCompletePasskeyOperation( - operationTrigger: () => Promise, - postOperationCheck: (() => Promise) | null = null, - ) { - let postOperationPromise: Promise; - if (postOperationCheck === null) { - postOperationPromise = new Promise(resolve => { - this.#cdpClient?.on('WebAuthn.credentialAdded', () => resolve()); - this.#cdpClient?.on('WebAuthn.credentialAsserted', () => resolve()); - }); - } else { - postOperationPromise = postOperationCheck(); - } - - const wait = new Promise(resolve => setTimeout(resolve, operationTimeout)); await this.#setWebAuthnUserVerified(this.#authenticatorId, true); await this.#setWebAuthnAutomaticPresenceSimulation(this.#authenticatorId, true); - await operationTrigger(); + await cb(); await Promise.race([postOperationPromise, wait.then(() => Promise.reject('Passkey input timeout'))]); await this.#setWebAuthnAutomaticPresenceSimulation(this.#authenticatorId, false); } - async startAndCancelPasskeyOperation(operationTrigger: () => Promise, postOperationCheck: () => Promise) { + async modeCancel() { + await this.#setWebAuthnUserVerified(this.#authenticatorId, false); + await this.#setWebAuthnAutomaticPresenceSimulation(this.#authenticatorId, true); + } + + async modeComplete() { + await this.#setWebAuthnUserVerified(this.#authenticatorId, true); + await this.#setWebAuthnAutomaticPresenceSimulation(this.#authenticatorId, true); + } + + async runWithCancel(cb: () => Promise) { await this.#setWebAuthnUserVerified(this.#authenticatorId, false); await this.#setWebAuthnAutomaticPresenceSimulation(this.#authenticatorId, true); - await operationTrigger(); + await cb(); - await postOperationCheck(); await this.#setWebAuthnAutomaticPresenceSimulation(this.#authenticatorId, false); } @@ -84,7 +80,7 @@ export class VirtualAuthenticator { credential: { credentialId: '', // 'WZuSfPDeCfXUMqO3vcVZ6ZYY0w2W4NpLcLzTjMl4qns=', isResidentCredential: true, - rpId: 'connect-next.playground.corbado.io', + rpId: 'localhost', privateKey: 'MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgz/eSahk8R0fk3Jjpcbd1LPc2gGKyzEG23UFIbFTqSbyhRANCAAQ4a8dJ559cf0cZcg0U7k5oCofmtOzuqXDSwzP8LLhv0InronrySiaWAGuWFpVsbNyOnWSd6VZJU8wiFKSMiDWN', userHandle: '', // 'TDBlaFVpNnRNQg==', diff --git a/playground/connect-next/app/(api)/connectToken/route.ts b/playground/connect-next/app/(api)/connectToken/route.ts new file mode 100644 index 000000000..891a0b6d4 --- /dev/null +++ b/playground/connect-next/app/(api)/connectToken/route.ts @@ -0,0 +1,25 @@ +import { NextRequest } from 'next/server'; +import { getCorbadoConnectToken, verifyAmplifyToken } from '@/lib/utils'; + +type Payload = { + idToken: string; + connectTokenType: string; +}; + +export async function POST(req: NextRequest) { + const body = (await req.json()) as Payload; + + const { idToken, connectTokenType } = body; + + const { displayName, identifier } = await verifyAmplifyToken(idToken); + + const connectToken = await getCorbadoConnectToken(connectTokenType, { + displayName: displayName, + identifier: identifier, + }); + + return new Response(JSON.stringify({ token: connectToken }), { + status: 201, + headers: { 'Content-Type': 'application/json' }, + }); +} diff --git a/playground/connect-next/app/(auth-required)/layout.tsx b/playground/connect-next/app/(auth-required)/layout.tsx new file mode 100644 index 000000000..0228d012a --- /dev/null +++ b/playground/connect-next/app/(auth-required)/layout.tsx @@ -0,0 +1,7 @@ +'use client'; + +import { ProtectedRoute } from '@/components/ProtectedRoute'; + +export default function AuthenticatedLayout({ children }: { children: React.ReactNode }) { + return {children}; +} diff --git a/playground/connect-next/app/(auth-required)/passkey-list/actions.ts b/playground/connect-next/app/(auth-required)/passkey-list/actions.ts new file mode 100644 index 000000000..ae9546d3e --- /dev/null +++ b/playground/connect-next/app/(auth-required)/passkey-list/actions.ts @@ -0,0 +1,17 @@ +'use server'; + +import { ConnectTokenType } from '@corbado/types'; +import { getCorbadoConnectToken, verifyAmplifyToken } from '@/lib/utils'; + +export const getCorbadoToken = async (tokenType: ConnectTokenType, idToken?: string) => { + if (!idToken) { + throw new Error('idToken is required'); + } + + const { displayName, identifier } = await verifyAmplifyToken(idToken); + + return getCorbadoConnectToken(tokenType, { + displayName: displayName, + identifier: identifier, + }); +}; diff --git a/playground/connect-next/app/passkey-list/page.tsx b/playground/connect-next/app/(auth-required)/passkey-list/page.tsx similarity index 57% rename from playground/connect-next/app/passkey-list/page.tsx rename to playground/connect-next/app/(auth-required)/passkey-list/page.tsx index 93a731dbb..03e85d21a 100644 --- a/playground/connect-next/app/passkey-list/page.tsx +++ b/playground/connect-next/app/(auth-required)/passkey-list/page.tsx @@ -1,22 +1,21 @@ 'use client'; -export const runtime = 'edge'; +import { fetchAuthSession } from 'aws-amplify/auth'; import { CorbadoConnectPasskeyList } from '@corbado/connect-react'; -import { useRouter } from 'next/navigation'; import { getCorbadoToken } from './actions'; -import { getAppendToken } from '../actions'; export default function PasskeyListPage() { - const router = useRouter(); - return (
- tokenType === 'passkey-append' ? await getAppendToken() : await getCorbadoToken(tokenType) - } + connectTokenProvider={async tokenType => { + const session = await fetchAuthSession(); + const idToken = session.tokens?.idToken?.toString(); + + return getCorbadoToken(tokenType, idToken); + }} />
diff --git a/playground/connect-next/app/(auth-required)/post-login/actions.ts b/playground/connect-next/app/(auth-required)/post-login/actions.ts new file mode 100644 index 000000000..fc26a4b99 --- /dev/null +++ b/playground/connect-next/app/(auth-required)/post-login/actions.ts @@ -0,0 +1,32 @@ +'use server'; + +import { AppendStatus, ConnectTokenType } from '@corbado/types'; +import { cookies } from 'next/headers'; +import { getCorbadoConnectToken, verifyAmplifyToken } from '@/lib/utils'; + +export const getCorbadoToken = async (idToken?: string) => { + if (!idToken) { + throw new Error('idToken is required'); + } + + const { displayName, identifier } = await verifyAmplifyToken(idToken); + + return getCorbadoConnectToken('passkey-append' as ConnectTokenType, { + displayName: displayName, + identifier: identifier, + }); +}; + +export async function postPasskeyAppend(appendStatus: AppendStatus, clientState: string) { + // update client side state + console.log(appendStatus); + if (appendStatus === 'complete' || appendStatus === 'complete-noop') { + const cookieStore = await cookies(); + cookieStore.set({ + name: 'cbo_client_state', + value: clientState, + httpOnly: true, + expires: new Date(Date.now() + 1000 * 60 * 60 * 24 * 365), + }); + } +} diff --git a/playground/connect-next/app/(auth-required)/post-login/page.tsx b/playground/connect-next/app/(auth-required)/post-login/page.tsx new file mode 100644 index 000000000..c86a4cf8d --- /dev/null +++ b/playground/connect-next/app/(auth-required)/post-login/page.tsx @@ -0,0 +1,41 @@ +'use client'; + +import { CorbadoConnectAppend } from '@corbado/connect-react'; +import { useRouter, useSearchParams } from 'next/navigation'; +import { getCorbadoToken, postPasskeyAppend } from '@/app/(auth-required)/post-login/actions'; +import { fetchAuthSession } from 'aws-amplify/auth'; +import { AppendStatus } from '@corbado/types'; + +export default function Page() { + const router = useRouter(); + const searchParams = useSearchParams(); + + return ( +
+
+
+ { + const postSignup = searchParams.get('post-signup'); + if (postSignup) { + router.push('/setup-mfa?post-signup=true'); + } else { + router.push('/profile'); + } + }} + appendTokenProvider={async () => { + const session = await fetchAuthSession(); + const idToken = session.tokens?.idToken?.toString(); + + return await getCorbadoToken(idToken); + }} + onComplete={async (appendStatus: AppendStatus, clientState: string) => { + await postPasskeyAppend(appendStatus, clientState); + router.push('/profile'); + }} + /> +
+
+
+ ); +} diff --git a/playground/connect-next/app/(auth-required)/profile/AccountSection.tsx b/playground/connect-next/app/(auth-required)/profile/AccountSection.tsx new file mode 100644 index 000000000..12d5cb347 --- /dev/null +++ b/playground/connect-next/app/(auth-required)/profile/AccountSection.tsx @@ -0,0 +1,164 @@ +import { useEffect, useState } from 'react'; +import { Skeleton } from '@/components/ui/skeleton'; +import { CognitoUserInfo, getCognitoUserInfo } from '@/lib/utils'; +import { Button } from '@/components/ui/button'; + +import { updateUserAttribute, confirmUserAttribute } from 'aws-amplify/auth'; +import { ConfirmOTP } from '@/components/ConfirmOTP'; + +export const AccountSection = () => { + const [userInfo, setUserInfo] = useState(); + const [editMode, setEditMode] = useState(false); + const [phone, setPhone] = useState(''); + const [saving, setSaving] = useState(false); + const [verificationRequired, setVerificationRequired] = useState(false); + const [message, setMessage] = useState(null); + const [loading, setLoading] = useState(true); + + useEffect(() => { + async function loadUser() { + try { + const userInfo = await getCognitoUserInfo(); + setUserInfo(userInfo); + setPhone(userInfo.phoneNumber || ''); + } catch { + setMessage('Failed to load user info'); + } finally { + setLoading(false); + } + } + loadUser(); + }, []); + + const handleEdit = () => { + setEditMode(true); + setMessage(null); + setPhone(userInfo?.phoneNumber || ''); + }; + + const handleCancel = () => { + setEditMode(false); + setVerificationRequired(false); + setMessage(null); + setPhone(userInfo?.phoneNumber || ''); + }; + + const handleSave = async (e: React.FormEvent) => { + e.preventDefault(); + setSaving(true); + setMessage(null); + try { + const output = await updateUserAttribute({ + userAttribute: { attributeKey: 'phone_number', value: phone }, + }); + if (output.nextStep && output.nextStep.updateAttributeStep === 'CONFIRM_ATTRIBUTE_WITH_CODE') { + setVerificationRequired(true); + setMessage(`A verification code was sent to your new phone number. Please enter it below.`); + } else { + setMessage('Phone number updated successfully.'); + setEditMode(false); + setUserInfo(prev => prev && { ...prev, phoneNumber: phone }); + } + } catch { + setMessage('Failed to update phone number.'); + } finally { + setSaving(false); + } + }; + + const handleVerifyOTP = async (code: string): Promise => { + setMessage(null); + try { + await confirmUserAttribute({ + userAttributeKey: 'phone_number', + confirmationCode: code, + }); + setMessage('Phone number verified and updated successfully.'); + setEditMode(false); + setVerificationRequired(false); + setUserInfo(prev => prev && { ...prev, phoneNumber: phone }); + return undefined; + } catch { + return 'Failed to verify phone number. Please check the code and try again.'; + } + }; + + if (loading) { + return ; + } + + const profileData = { + Username: userInfo?.username, + Email: userInfo?.email, + 'Phone Number': userInfo?.phoneNumber, + 'Email Verified': userInfo?.emailVerified?.toString(), + }; + + return ( +
+ {Object.entries(profileData).map(([label, value]) => ( +
+
{label}
+
+ {label === 'Phone Number' && editMode ? ( + setPhone(e.target.value)} + className='border border-gray-300 rounded px-3 py-2' + required + /> + ) : ( + value || '-' + )} +
+
+ ))} + {editMode ? ( + verificationRequired ? ( +
+ + {message &&
{message}
} +
+ ) : ( +
+
+ + +
+ {message &&
{message}
} +
+ ) + ) : ( +
+ +
+ )} + {!editMode && message &&
{message}
} +
+ ); +}; diff --git a/playground/connect-next/app/(auth-required)/profile/DangerSection.tsx b/playground/connect-next/app/(auth-required)/profile/DangerSection.tsx new file mode 100644 index 000000000..5fa3546c0 --- /dev/null +++ b/playground/connect-next/app/(auth-required)/profile/DangerSection.tsx @@ -0,0 +1,43 @@ +import { deleteUser, signOut } from 'aws-amplify/auth'; +import { Button } from '@/components/ui/button'; +import { useRouter } from 'next/navigation'; + +export const DangerSection = () => { + const router = useRouter(); + + const logout = async () => { + await signOut(); + router.push('/login'); + }; + + const deleteAccount = async () => { + await deleteUser(); + router.push('/'); + }; + + return ( +
+
+
Log the user out on this device.
+ +
+
+
Delete this user.
+ +
+
+ ); +}; + +export default DangerSection; diff --git a/playground/connect-next/app/(auth-required)/profile/MFASection.tsx b/playground/connect-next/app/(auth-required)/profile/MFASection.tsx new file mode 100644 index 000000000..9fe4decc0 --- /dev/null +++ b/playground/connect-next/app/(auth-required)/profile/MFASection.tsx @@ -0,0 +1,72 @@ +import { useEffect, useState } from 'react'; +import { fetchMFAPreference } from 'aws-amplify/auth'; +import { Button } from '@/components/ui/button'; +import { useRouter } from 'next/navigation'; +import { Skeleton } from '@/components/ui/skeleton'; + +type MfaInfo = { + preferred?: string; + enabledSMS: boolean; + enabledTOTP: boolean; +}; + +export const MFASection = () => { + const [mfaInfo, setMfaInfo] = useState(); + const router = useRouter(); + + useEffect(() => { + async function loadUser() { + try { + const mfaPrefs = await fetchMFAPreference(); + let enabledSMS = false, + enabledTOTP = false; + (mfaPrefs.enabled ?? []).forEach((mfaType: string) => { + if (mfaType === 'SMS') { + enabledSMS = true; + } else if (mfaType === 'TOTP') { + enabledTOTP = true; + } + }); + + setMfaInfo({ + preferred: mfaPrefs.preferred?.toString(), + enabledSMS, + enabledTOTP, + }); + } catch (err) { + console.error('Failed to load user info:', err); + } + } + + void loadUser(); + }, []); + + if (!mfaInfo) { + return ; + } + + const mfaData = mfaInfo && { + 'Preferred MFA': mfaInfo.preferred || 'Not Set', + 'SMS Enabled': mfaInfo.enabledSMS ? 'Yes' : 'No', + 'TOTP Enabled': mfaInfo.enabledTOTP ? 'Yes' : 'No', + }; + + return ( +
+
+ {mfaData && + Object.entries(mfaData).map(([label, value]) => ( +
+
{label}
+
{value}
+
+ ))} +
+
+ +
+
+ ); +}; + +export default MFASection; diff --git a/playground/connect-next/app/(auth-required)/profile/PasskeySection.tsx b/playground/connect-next/app/(auth-required)/profile/PasskeySection.tsx new file mode 100644 index 000000000..175535eb8 --- /dev/null +++ b/playground/connect-next/app/(auth-required)/profile/PasskeySection.tsx @@ -0,0 +1,20 @@ +import { fetchAuthSession } from 'aws-amplify/auth'; +import { getConnectToken } from './actions'; +import { CorbadoConnectPasskeyList } from '@corbado/connect-react'; + +export const PasskeySection = () => { + return ( +
+ { + const session = await fetchAuthSession(); + const idToken = session.tokens?.idToken?.toString(); + + return await getConnectToken(connectTokenType, idToken); + }} + /> +
+ ); +}; + +export default PasskeySection; diff --git a/playground/connect-next/app/(auth-required)/profile/Section.tsx b/playground/connect-next/app/(auth-required)/profile/Section.tsx new file mode 100644 index 000000000..3e28e2c13 --- /dev/null +++ b/playground/connect-next/app/(auth-required)/profile/Section.tsx @@ -0,0 +1,14 @@ +import { Separator } from '@/components/ui/separator'; +import React from 'react'; + +const Section = ({ children, headline }: { children: React.ReactNode; headline: string }) => { + return ( +
+
{headline}
+ +
{children}
+
+ ); +}; + +export default Section; diff --git a/playground/connect-next/app/(auth-required)/profile/actions.tsx b/playground/connect-next/app/(auth-required)/profile/actions.tsx new file mode 100644 index 000000000..3d438a84c --- /dev/null +++ b/playground/connect-next/app/(auth-required)/profile/actions.tsx @@ -0,0 +1,16 @@ +'use server'; + +import { getCorbadoConnectToken, verifyAmplifyToken } from '@/lib/utils'; + +export const getConnectToken = async (connectTokenType: string, idToken?: string) => { + if (!idToken) { + throw new Error('idToken is required'); + } + + const { displayName, identifier } = await verifyAmplifyToken(idToken); + + return getCorbadoConnectToken(connectTokenType, { + displayName: displayName, + identifier: identifier, + }); +}; diff --git a/playground/connect-next/app/(auth-required)/profile/page.tsx b/playground/connect-next/app/(auth-required)/profile/page.tsx new file mode 100644 index 000000000..256e2f5d1 --- /dev/null +++ b/playground/connect-next/app/(auth-required)/profile/page.tsx @@ -0,0 +1,29 @@ +'use client'; + +import PasskeySection from './PasskeySection'; +import { AccountSection } from './AccountSection'; +import DangerSection from './DangerSection'; +import MFASection from './MFASection'; +import Section from './Section'; + +export default function Page() { + return ( +
+
+

Your profile

+
+ +
+
+ +
+
+ +
+
+ +
+
+
+ ); +} diff --git a/playground/connect-next/app/(auth-required)/setup-mfa/page.tsx b/playground/connect-next/app/(auth-required)/setup-mfa/page.tsx new file mode 100644 index 000000000..c7381c68f --- /dev/null +++ b/playground/connect-next/app/(auth-required)/setup-mfa/page.tsx @@ -0,0 +1,291 @@ +'use client'; + +import { useRouter, useSearchParams } from 'next/navigation'; +import { + confirmUserAttribute, + sendUserAttributeVerificationCode, + setUpTOTP, + updateMFAPreference, + verifyTOTPSetup, + updateUserAttribute, +} from 'aws-amplify/auth'; +import { Button } from '@/components/ui/button'; +import { Separator } from '@/components/ui/separator'; +import React, { useEffect, useState } from 'react'; +import ConfirmOTP from '@/components/ConfirmOTP'; +import { QRCodeSVG } from 'qrcode.react'; +import { CognitoUserInfo, getCognitoUserInfo } from '@/lib/utils'; + +enum State { + Select, + ConfirmSMS, + SetupTOTP, + ConfirmTOTP, + EditPhone, +} + +export default function Page() { + const router = useRouter(); + const searchParams = useSearchParams(); + const [userInfo, setUserInfo] = useState(); + const [state, setState] = useState(State.Select); + const [otpAuthUri, setOtpAuthUri] = useState(''); + const [sharedKey, setSharedKey] = useState(''); + const [editPhone, setEditPhone] = useState(''); + const [editPhoneError, setEditPhoneError] = useState(); + + const isPostSignup = !!searchParams.get('post-signup'); + const showGoBack = !isPostSignup; + + useEffect(() => { + void loadUser(); + }, []); + + async function loadUser() { + try { + const userInfo = await getCognitoUserInfo(); + setUserInfo(userInfo); + setEditPhone(''); + } catch (err) { + console.error('Failed to load user info:', err); + } + } + + const startSMS = async () => { + const res = await sendUserAttributeVerificationCode({ + userAttributeKey: 'phone_number', + }); + + console.log(res); + + setState(State.ConfirmSMS); + }; + + const startTOTP = async () => { + const setupRes = await setUpTOTP(); + const setupUri = setupRes.getSetupUri('Corbado Connect', userInfo?.email); + + setSharedKey(setupRes.sharedSecret); + setOtpAuthUri(setupUri.href); + setState(State.SetupTOTP); + }; + + const confirmTOTP = async (code: string): Promise => { + try { + await verifyTOTPSetup({ code }); + await updateMFAPreference({ + totp: 'PREFERRED', + }); + + navigateForward(); + } catch (error) { + if (error instanceof Error) { + return error.message; + } + + return 'Failed to confirm TOTP'; + } + }; + + const cancelConfirm = () => { + setEditPhone(''); + setState(State.Select); + }; + + const confirmSMS = async (code: string): Promise => { + try { + await confirmUserAttribute({ + userAttributeKey: 'phone_number', + confirmationCode: code, + }); + + const res = await updateMFAPreference({ + sms: 'PREFERRED', + }); + + console.log(res); + + navigateForward(); + } catch (error) { + if (error instanceof Error) { + return error.message; + } + + return 'Failed to confirm phone number'; + } + }; + + const navigateForward = () => { + const searchParams = new URLSearchParams(window.location.search); + router.push('/profile'); + }; + + const updatePhoneNumber = async () => { + setEditPhoneError(undefined); + if (!editPhone) { + setEditPhoneError('Phone number cannot be empty'); + return; + } + try { + await updateUserAttribute({ + userAttribute: { attributeKey: 'phone_number', value: editPhone }, + }); + + setState(State.ConfirmSMS); + } catch (error) { + if (error instanceof Error) { + setEditPhoneError(error.message); + } else { + setEditPhoneError('Failed to update phone number'); + } + } + }; + + if (!userInfo) { + return
; + } + + let headline, sub: string; + let content: React.ReactNode; + switch (state) { + case State.Select: + headline = 'Protect your account'; + sub = 'To better protect your account you can either use SMS or TOTP.'; + content = ( +
+ + + + +
+ ); + break; + case State.ConfirmSMS: + headline = 'Confirm your phone number'; + sub = `We have sent a 6 digit code to ${editPhone || userInfo.phoneNumber}`; + content = ( +
+ +
+ ); + break; + + case State.SetupTOTP: + headline = 'Scan the QR code'; + sub = 'Use your favourite authenticator app (e.g. Google authenticator)'; + content = ( +
+ + + +
+ ); + break; + + case State.ConfirmTOTP: + headline = 'Enter your TOTP'; + sub = 'Enter the code from the authenticator you have just set up.'; + content = ( +
+ +
+ ); + + break; + + case State.EditPhone: + headline = 'Edit your phone number'; + sub = 'Update your phone number for SMS verification.'; + content = ( +
{ + e.preventDefault(); + updatePhoneNumber(); + }} + > + setEditPhone(e.target.value)} + placeholder='Enter new phone number' + /> + {editPhoneError &&
{editPhoneError}
} +
+ + +
+
+ ); + break; + } + + return ( +
+
+
+

{headline}

+

{sub}

+
+ {content} + {showGoBack && ( +
+ +
+ )} +
+
+ ); +} diff --git a/playground/connect-next/app/(no-auth)/actions.ts b/playground/connect-next/app/(no-auth)/actions.ts new file mode 100644 index 000000000..e683bedae --- /dev/null +++ b/playground/connect-next/app/(no-auth)/actions.ts @@ -0,0 +1,8 @@ +'use server'; + +import { cookies } from 'next/headers'; + +export const setTOTPSecretCode = async (secretCode: string) => { + const cookieStore = await cookies(); + cookieStore.set('secretCode', secretCode); +}; diff --git a/playground/connect-next/app/(no-auth)/login/ConventionalLogin.tsx b/playground/connect-next/app/(no-auth)/login/ConventionalLogin.tsx new file mode 100644 index 000000000..3e3afed92 --- /dev/null +++ b/playground/connect-next/app/(no-auth)/login/ConventionalLogin.tsx @@ -0,0 +1,120 @@ +import React, { useState } from 'react'; +import { confirmSignIn, signIn } from 'aws-amplify/auth'; +import { useRouter } from 'next/navigation'; +import ConfirmOTP from '@/components/ConfirmOTP'; +import PasswordForm from './PasswordForm'; + +type Props = { + initialUserProvidedIdentifier: string; + initialError: string; +}; + +enum State { + ProvidePassword, + ProvideSMSCode, + ProvideTOTPCode, +} + +export const ConventionalLogin = ({ initialUserProvidedIdentifier, initialError }: Props) => { + const [state, setState] = useState(State.ProvidePassword); + const router = useRouter(); + + const handleConventionalLogin = async (username: string, password: string): Promise => { + try { + const result = await signIn({ + username, + password, + }); + + switch (result.nextStep.signInStep) { + case 'CONFIRM_SIGN_IN_WITH_SMS_CODE': + setState(State.ProvideSMSCode); + break; + + case 'CONFIRM_SIGN_IN_WITH_TOTP_CODE': + setState(State.ProvideTOTPCode); + break; + + case 'DONE': + await navigatePostLogin(); + + break; + + default: + console.error('Unexpected next step', result.nextStep); + break; + } + } catch (e) { + if (e instanceof Error) { + return e.message; + } + + return 'An error occurred'; + } + }; + + const navigatePostLogin = async () => { + await router.push('/post-login'); + }; + + const handleConfirmCode = async (code: string): Promise => { + try { + const res = await confirmSignIn({ + challengeResponse: code, + }); + + if (res.isSignedIn) { + await navigatePostLogin(); + } + } catch (e) { + if (e instanceof Error) { + return e.message; + } + + return 'An error occurred'; + } + }; + + let headline, sub: string; + let content: React.ReactNode; + switch (state) { + case State.ProvidePassword: + headline = 'Login'; + sub = 'Use your email to log into you Example Corp account.'; + content = ( + + ); + + break; + case State.ProvideSMSCode: + headline = 'Check your phone'; + sub = 'We have sent an SMS to your phone.'; + content = ; + + break; + case State.ProvideTOTPCode: + headline = 'Check your authenticator'; + sub = 'Please enter the code from your authenticator app.'; + content = ; + + break; + default: + throw new Error(`Invalid state: ${state}`); + } + + return ( + <> +
+

{headline}

+

{sub}

+
+
{content}
+ + ); +}; + +export default ConventionalLogin; diff --git a/playground/connect-next/app/(no-auth)/login/PasswordForm.tsx b/playground/connect-next/app/(no-auth)/login/PasswordForm.tsx new file mode 100644 index 000000000..854583130 --- /dev/null +++ b/playground/connect-next/app/(no-auth)/login/PasswordForm.tsx @@ -0,0 +1,74 @@ +import { FormEvent, useState } from 'react'; +import { Button } from '@/components/ui/button'; + +type Props = { + initialUserProvidedIdentifier: string; + initialError: string; + onClick: (username: string, password: string) => Promise; +}; + +export const PasswordForm = ({ onClick, initialUserProvidedIdentifier, initialError }: Props) => { + const [username, setUsername] = useState(initialUserProvidedIdentifier); + const [password, setPassword] = useState(''); + const [message, setMessage] = useState(initialError); + + const handleLogin = async (e: FormEvent) => { + e.preventDefault(); + setMessage('Loading...'); + const maybeError = await onClick(username, password); + if (maybeError) { + setMessage(maybeError); + } + }; + + return ( +
+
+ + setUsername(e.target.value)} + /> +
+
+ + setPassword(e.target.value)} + /> +
+
{message}
+ +
+ ); +}; + +export default PasswordForm; diff --git a/playground/connect-next/app/(no-auth)/login/WrappedLogin.tsx b/playground/connect-next/app/(no-auth)/login/WrappedLogin.tsx new file mode 100644 index 000000000..0ae125564 --- /dev/null +++ b/playground/connect-next/app/(no-auth)/login/WrappedLogin.tsx @@ -0,0 +1,109 @@ +'use client'; + +import { useRouter } from 'next/navigation'; +import React, { useState } from 'react'; +import { confirmSignIn, signIn } from 'aws-amplify/auth'; +import ConventionalLogin from './ConventionalLogin'; +import { CorbadoConnectLogin } from '@corbado/connect-react'; +import Link from 'next/link'; +import { postPasskeyLogin } from './actions'; + +export type Props = { + clientState: string | undefined; +}; + +const decodeJwt = (token: string) => { + const [, payload] = token.split('.'); + return JSON.parse(atob(payload)); +}; + +type WithWebauthnId = { + webauthnId: string; +}; + +const WrappedLogin = ({ clientState }: Props) => { + const router = useRouter(); + + const [conventionalLoginVisible, setConventionalLoginVisible] = useState(false); + const [email, setEmail] = useState(''); + const [fallbackErrorMessage, setFallbackErrorMessage] = useState(''); + + console.log('fallbackErrorMessage', fallbackErrorMessage); + + const postPasskeyLoginNew = async (signedPasskeyData: string, clientState: string) => { + // decode JWT + const decoded = decodeJwt(signedPasskeyData) as WithWebauthnId; + + try { + await signIn({ + username: decoded.webauthnId, + options: { authFlowType: 'CUSTOM_WITHOUT_SRP' }, + }); + + const resultConfirm = await confirmSignIn({ + challengeResponse: signedPasskeyData, + }); + console.log('resultConfirm', resultConfirm); + + await postPasskeyLogin(clientState); + + await router.push('/post-login'); + } catch (e) { + console.error(e); + } + }; + + return ( +
+
+ {conventionalLoginVisible ? ( + + ) : null} + {!conventionalLoginVisible ? ( + <> +
+

Login with passkeys

+

A simple and secure way to log in.

+
+
+ { + setEmail(identifier); + setConventionalLoginVisible(true); + setFallbackErrorMessage(message); + }} + onFallbackCustom={(identifier: string, code: string) => { + setEmail(identifier); + setConventionalLoginVisible(true); + setFallbackErrorMessage(code); + }} + onError={(error: string) => console.log('error', error)} + onLoaded={(msg: string) => console.log('component has loaded: ' + msg)} + onComplete={async (signedPasskeyData: string, newClientState: string) => { + await postPasskeyLoginNew(signedPasskeyData, newClientState); + }} + onSignupClick={() => router.push('/')} + clientState={clientState} + /> +
+ + ) : null} +

+ {"Don't have an account? "} + + Sign up + + {' for free.'} +

+
+
+ ); +}; + +export default WrappedLogin; diff --git a/playground/connect-next/app/(no-auth)/login/actions.ts b/playground/connect-next/app/(no-auth)/login/actions.ts new file mode 100644 index 000000000..fbe989559 --- /dev/null +++ b/playground/connect-next/app/(no-auth)/login/actions.ts @@ -0,0 +1,13 @@ +'use server'; + +import { cookies } from 'next/headers'; + +export async function postPasskeyLogin(clientState: string) { + const cookieStore = await cookies(); + cookieStore.set({ + name: 'cbo_client_state', + value: clientState, + httpOnly: true, + expires: new Date(Date.now() + 1000 * 60 * 60 * 24 * 365), + }); +} diff --git a/playground/connect-next/app/(no-auth)/login/page.tsx b/playground/connect-next/app/(no-auth)/login/page.tsx new file mode 100644 index 000000000..fa09670c5 --- /dev/null +++ b/playground/connect-next/app/(no-auth)/login/page.tsx @@ -0,0 +1,11 @@ +import React from 'react'; +import { cookies } from 'next/headers'; +import WrappedLogin from './WrappedLogin'; + +export default async function Page() { + const cookieStore = await cookies(); + const clientState = cookieStore.get('cbo_client_state'); + console.log('clientState', clientState); + + return ; +} diff --git a/playground/connect-next/app/(no-auth)/page.tsx b/playground/connect-next/app/(no-auth)/page.tsx new file mode 100644 index 000000000..990058112 --- /dev/null +++ b/playground/connect-next/app/(no-auth)/page.tsx @@ -0,0 +1,148 @@ +'use client'; + +import { FormEvent, useState } from 'react'; +import { useRouter } from 'next/navigation'; +import { generateRandomString } from '@/lib/random'; +import { signIn, signUp } from 'aws-amplify/auth'; +import { Button } from '@/components/ui/button'; +import Link from 'next/link'; + +export default function SignupPage() { + const router = useRouter(); + const [email, setEmail] = useState(''); + const [phone, setPhone] = useState(''); + const [password, setPassword] = useState(''); + const [message, setMessage] = useState(''); + + const handleSignup = async (e: FormEvent) => { + e.preventDefault(); + const username = generateRandomString(10); + + try { + setMessage('Loading...'); + const resSignUp = await signUp({ + username: username, + password, + options: { + userAttributes: { + email: email, + phone_number: phone, + }, + }, + }); + + console.log(resSignUp); + + const resLogin = await signIn({ username, password }); + console.log(resLogin); + router.push('/post-login?post-signup=true'); + } catch (err) { + console.error('Error during signup:', err); + } + }; + + const handleAutofill = (e: FormEvent) => { + e.preventDefault(); + + const random = generateRandomString(6); + const email = `integration-test+${random}@corbado.com`; + setEmail(email); + setPassword('asdfasdf'); + setPhone('+4915121609839'); + }; + + return ( +
+
+
+

Sign Up

+

Create an account with your email, phone and password

+
+
+
+ + setEmail(e.target.value)} + /> +
+
+ + setPassword(e.target.value)} + /> +
+
+ + setPhone(e.target.value)} + /> +
+ {message &&
{message}
} + + +

+ {'Already have an account? '} + + Log in + + {' instead.'} +

+
+
+
+ ); +} diff --git a/playground/connect-next/app/actions.ts b/playground/connect-next/app/actions.ts deleted file mode 100644 index 7e81bf958..000000000 --- a/playground/connect-next/app/actions.ts +++ /dev/null @@ -1,52 +0,0 @@ -'use server'; - -import { cookies } from 'next/headers'; - -export async function getAppendToken() { - const cookieStore = await cookies(); - const displayName = cookieStore.get('displayName'); - if (!displayName) { - return null; - } - - const identifier = cookieStore.get('identifier'); - if (!identifier) { - return null; - } - - console.log(displayName, identifier); - - // call backend API to get token - const payload = { - type: 'passkey-append', - data: { - displayName: displayName.value, - identifier: identifier.value, - }, - }; - - const body = JSON.stringify(payload); - - const url = `${process.env.CORBADO_BACKEND_API_URL}/v2/connectTokens`; - const response = await fetch(url, { - method: 'POST', - headers: { - Authorization: `Basic ${process.env.CORBADO_BACKEND_API_BASIC_AUTH}`, - 'Content-Type': 'application/json', - }, - cache: 'no-cache', - body: body, - }); - - const out = await response.json(); - - return out.secret; -} - -export async function hello() { - return 'Hello, World!'; -} - -export async function hello2() { - return 'Hello, World2!'; -} diff --git a/playground/connect-next/app/globals.css b/playground/connect-next/app/globals.css index 51f319668..581cc23c8 100644 --- a/playground/connect-next/app/globals.css +++ b/playground/connect-next/app/globals.css @@ -11,3 +11,153 @@ html { font-family: Verdana, Helvetica, sans-serif; font-size: 14px; } + +@layer base { + :root { + --background: 0 0% 100%; + --foreground: 0 0% 3.9%; + --card: 0 0% 100%; + --card-foreground: 0 0% 3.9%; + --popover: 0 0% 100%; + --popover-foreground: 0 0% 3.9%; + --primary: 0 0% 9%; + --primary-foreground: 0 0% 98%; + --secondary: 0 0% 96.1%; + --secondary-foreground: 0 0% 9%; + --muted: 0 0% 96.1%; + --muted-foreground: 0 0% 45.1%; + --accent: 0 0% 96.1%; + --accent-foreground: 0 0% 9%; + --destructive: 0 84.2% 60.2%; + --destructive-foreground: 0 0% 98%; + --border: 0 0% 89.8%; + --input: 0 0% 89.8%; + --ring: 0 0% 3.9%; + --chart-1: 12 76% 61%; + --chart-2: 173 58% 39%; + --chart-3: 197 37% 24%; + --chart-4: 43 74% 66%; + --chart-5: 27 87% 67%; + --radius: 0.5rem; + } + .dark { + --background: 0 0% 3.9%; + --foreground: 0 0% 98%; + --card: 0 0% 3.9%; + --card-foreground: 0 0% 98%; + --popover: 0 0% 3.9%; + --popover-foreground: 0 0% 98%; + --primary: 0 0% 98%; + --primary-foreground: 0 0% 9%; + --secondary: 0 0% 14.9%; + --secondary-foreground: 0 0% 98%; + --muted: 0 0% 14.9%; + --muted-foreground: 0 0% 63.9%; + --accent: 0 0% 14.9%; + --accent-foreground: 0 0% 98%; + --destructive: 0 62.8% 30.6%; + --destructive-foreground: 0 0% 98%; + --border: 0 0% 14.9%; + --input: 0 0% 14.9%; + --ring: 0 0% 83.1%; + --chart-1: 220 70% 50%; + --chart-2: 160 60% 45%; + --chart-3: 30 80% 55%; + --chart-4: 280 65% 60%; + --chart-5: 340 75% 55%; + } +} + +@layer base { + * { + @apply border-border; + } + body { + @apply bg-background text-foreground; + } +} + +.cb-connect-custom-style { + --cb-color-outline: #dcdcdc; + --cb-color-primary: #253544; + --cb-color-secondary: #929aa1; + --cb-color-tertiary: #666; + --cb-color-on-primary: #fff; + --cb-border-radius: 5px; + --cb-color-surface: var(--color-gray-50); + --cb-color-primary-container: #eef2f3; + --cb-color-on-primary-container: #253544; + --cb-color-secondary-container: #ecf4e7; + --cb-color-on-secondary-container: #80b816; + --cb-font-family-primary: var( + --default-font-family, + ui-sans-serif, + system-ui, + sans-serif, + 'Apple Color Emoji', + 'Segoe UI Emoji', + 'Segoe UI Symbol', + 'Noto Color Emoji' + ); + --cb-font-family-secondary: var( + --default-font-family, + ui-sans-serif, + system-ui, + sans-serif, + 'Apple Color Emoji', + 'Segoe UI Emoji', + 'Segoe UI Symbol', + 'Noto Color Emoji' + ); + + --cb-color-error-container: #ffd6da; + --cb-color-on-error-container: #cf0000; + + .cb-tag { + border-radius: 20px; + } + + .cb-primary-button, + .cb-outline-button { + border-radius: 0.5rem; + padding: 0.5rem 1.5rem; + } + + .cb-input { + font-size: 12px; + border-radius: 0.5rem; + padding: 0.5rem 0.5rem; + max-width: none; + } + + .cb-passkey-list-item { + border: none; + border-bottom: 1px solid var(--cb-color-outline); + border-radius: 0; + } + + .cb-passkey-list-empty, + .cb-passkey-list-loader-container { + border-bottom: 1px solid var(--cb-color-outline); + } + + .cb-modal-cta { + justify-content: start; + } + + .cb-modal-cta > button { + width: fit-content; + } + + .cb-passkey-button-subtitle { + font-size: 0.7rem; + } + + .cb-connect-append-border { + padding: 0; + } + + .cb-connect-append-icon svg { + margin: auto; + } +} diff --git a/playground/connect-next/app/home/client.tsx b/playground/connect-next/app/home/client.tsx deleted file mode 100644 index 991fa5117..000000000 --- a/playground/connect-next/app/home/client.tsx +++ /dev/null @@ -1,46 +0,0 @@ -'use client'; - -import { useRouter } from 'next/navigation'; - -type Props = { - maybeSecretCode?: string; -}; - -export default function Home({ maybeSecretCode }: Props) { - const router = useRouter(); - - return ( - <> -
-
-
-
Home
-
-

Great, you are logged in.

- - - - {maybeSecretCode ? ( -
{maybeSecretCode}
- ) : null} -
-
-
-
- - ); -} diff --git a/playground/connect-next/app/home/page.tsx b/playground/connect-next/app/home/page.tsx deleted file mode 100644 index 9a28dbb27..000000000 --- a/playground/connect-next/app/home/page.tsx +++ /dev/null @@ -1,9 +0,0 @@ -import { cookies } from 'next/headers'; -import Home from '@/app/home/client'; - -export default async function Page() { - const cookieStore = await cookies(); - const maybeSecretCode = cookieStore.get('secretCode'); - - return ; -} diff --git a/playground/connect-next/app/layout.tsx b/playground/connect-next/app/layout.tsx index 96e27fc1e..52aaa8c10 100644 --- a/playground/connect-next/app/layout.tsx +++ b/playground/connect-next/app/layout.tsx @@ -2,7 +2,7 @@ import { Inter } from 'next/font/google'; import './globals.css'; -import { CorbadoConnectProvider } from '@corbado/connect-react'; +import WrappedCorbadoConnectProvider from '@/components/ClientWrapper'; const inter = Inter({ subsets: ['latin'] }); @@ -14,13 +14,7 @@ export default function RootLayout({ return ( - - {children} - + {children} ); diff --git a/playground/connect-next/app/login/ConventionalLogin.tsx b/playground/connect-next/app/login/ConventionalLogin.tsx deleted file mode 100644 index 69b01c4fa..000000000 --- a/playground/connect-next/app/login/ConventionalLogin.tsx +++ /dev/null @@ -1,76 +0,0 @@ -import { useState } from 'react'; -import { useRouter } from 'next/navigation'; -import Link from 'next/link'; -import { startConventionalLogin } from './actions'; - -export type Props = { - initialEmail: string; - initialError: string; -}; - -export default function ConventionalLogin({ initialEmail, initialError }: Props) { - const [password, setPassword] = useState(''); - const [error, setError] = useState(initialError); - const [email, setEmail] = useState(initialEmail); - const router = useRouter(); - - const onSubmit = async () => { - setError(''); - const res = await startConventionalLogin(email, password); - console.log(res); - - if (!res.success) { - setError(res.message ?? 'An unknown error occurred. Please try again later.'); - - return; - } - - if (res.screen === 'MFA_SOFTWARE_TOKEN') { - router.push('/mfa-software-token'); - } else { - router.push('/post-login'); - } - }; - - return ( -
-
Login
- {error &&
{error}
} - setEmail(e.target.value)} - /> - setPassword(e.target.value)} - /> -
- -
-
- - Signup for an account - -
-
- ); -} diff --git a/playground/connect-next/app/login/LoginComponent.tsx b/playground/connect-next/app/login/LoginComponent.tsx deleted file mode 100644 index ea2b4d336..000000000 --- a/playground/connect-next/app/login/LoginComponent.tsx +++ /dev/null @@ -1,60 +0,0 @@ -'use client'; - -import { useRouter } from 'next/navigation'; -import { CorbadoConnectLogin } from '@corbado/connect-react'; -import { useState } from 'react'; -import ConventionalLogin from '@/app/login/ConventionalLogin'; -import { postPasskeyLoginNew } from '@/app/login/actions'; - -export type Props = { - clientState: string | undefined; -}; - -export default function LoginComponent({ clientState }: Props) { - const router = useRouter(); - const [conventionalLoginVisible, setConventionalLoginVisible] = useState(false); - const [email, setEmail] = useState(''); - const [fallbackErrorMessage, setFallbackErrorMessage] = useState(''); - - console.log('conventionalLoginVisible', conventionalLoginVisible); - - return ( -
-
-
- {conventionalLoginVisible ? ( - - ) : null} -
- { - setEmail(identifier); - setConventionalLoginVisible(true); - setFallbackErrorMessage(message); - console.log('onFallback', identifier); - }} - onFallbackCustom={(identifier: string, code: string, _: string) => { - setEmail(identifier); - setConventionalLoginVisible(true); - setFallbackErrorMessage(code); - console.log('onFallbackCustom', identifier, code); - }} - onError={(error: string) => console.log('error', error)} - onLoaded={(msg: string) => console.log('component has loaded: ' + msg)} - onComplete={async (signedPasskeyData: string, clientState: string) => { - await postPasskeyLoginNew(signedPasskeyData, clientState); - router.push('/post-login'); - }} - onSignupClick={() => router.push('/signup')} - onHelpClick={() => alert('help requested')} - clientState={clientState} - /> -
-
-
-
- ); -} diff --git a/playground/connect-next/app/login/actions.ts b/playground/connect-next/app/login/actions.ts deleted file mode 100644 index 9ccb62476..000000000 --- a/playground/connect-next/app/login/actions.ts +++ /dev/null @@ -1,141 +0,0 @@ -'use server'; - -import { cookies } from 'next/headers'; -import { - AdminGetUserCommand, - CognitoIdentityProviderClient, - InitiateAuthCommand, -} from '@aws-sdk/client-cognito-identity-provider'; -import crypto from 'crypto'; -import { TokenWrapper, verifyToken } from '@/app/utils'; - -// Here we validate the JWT token (validation is too simple, don't use this in production) -// Then we extract the cognitoID and retrieve the user's email from the user pool -// Both values will then be set as a cookie -export async function postPasskeyLogin(session: string) { - console.log('postPasskeyLogin', session); - const tokenWrapper = JSON.parse(session) as TokenWrapper; - const decoded = await verifyToken(tokenWrapper.AccessToken); - const username = decoded.username; - - // create client that loads profile from ~/.aws/credentials or environment variables - const client = new CognitoIdentityProviderClient({ - region: process.env.AWS_REGION!, - credentials: { - accessKeyId: process.env.AWS_ACCESS_KEY_ID!, - secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY!, - }, - }); - - const command = new AdminGetUserCommand({ - UserPoolId: process.env.AWS_COGNITO_USER_POOL_ID!, - Username: username, - }); - - const response = await client.send(command); - - const email = response.UserAttributes?.find(attr => attr.Name === 'email')?.Value; - if (email) { - const cookieStore = await cookies(); - cookieStore.set('displayName', email); - cookieStore.set('identifier', username); - } - - return; -} - -export async function postPasskeyLoginNew(signedPasskeyData: string, clientState: string) { - const url = `${process.env.CORBADO_BACKEND_API_URL}/v2/passkey/postLogin`; - const body = JSON.stringify({ - signedPasskeyData: signedPasskeyData, - }); - - const response = await fetch(url, { - method: 'POST', - headers: { - Authorization: `Basic ${process.env.CORBADO_BACKEND_API_BASIC_AUTH}`, - 'Content-Type': 'application/json', - }, - cache: 'no-cache', - body: body, - }); - - const out = await response.json(); - - await postPasskeyLogin(out.session); - - // update client side state - const cookieStore = await cookies(); - cookieStore.set({ name: 'cbo_client_state', value: clientState, httpOnly: true }); -} - -function createSecretHash(username: string, clientId: string, clientSecret: string) { - return crypto - .createHmac('sha256', clientSecret) - .update(username + clientId) - .digest('base64'); -} - -export async function startConventionalLogin(email: string, password: string) { - try { - if (!email || !password) { - throw new Error('Email and password are required.'); - } - - const cookieStore = await cookies(); - cookieStore.set('displayName', email); - - const client = new CognitoIdentityProviderClient({ - region: process.env.AWS_REGION!, - credentials: { - accessKeyId: process.env.AWS_ACCESS_KEY_ID!, - secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY!, - }, - }); - - const command = new InitiateAuthCommand({ - AuthFlow: 'USER_PASSWORD_AUTH', - ClientId: process.env.AWS_COGNITO_CLIENT_ID!, - AuthParameters: { - USERNAME: email, - PASSWORD: password, - SECRET_HASH: createSecretHash( - email, - process.env.AWS_COGNITO_CLIENT_ID!, - process.env.AWS_COGNITO_CLIENT_SECRET!, - ), - }, - }); - - const response = await client.send(command); - console.log(response); - - if (response.AuthenticationResult?.AccessToken) { - // no MFA has been set up yet - - const decoded = await verifyToken(response.AuthenticationResult.AccessToken); - const username = decoded.username; - if (email) { - cookieStore.set('identifier', username); - } - - return { success: true }; - } - - if (response.Session && response.ChallengeName === 'SOFTWARE_TOKEN_MFA') { - cookieStore.set('mfa_session', response.Session); - - return { success: true, screen: 'MFA_SOFTWARE_TOKEN' }; - } - - return { success: false, message: 'An error occurred. Please try again later.' }; - } catch (err) { - if (err instanceof Error) { - if (err.name === 'NotAuthorizedException') return { success: false, message: 'Incorrect username or password.' }; - - return { success: false, message: err.message }; - } - - return { success: false, message: 'An error occurred. Please try again later.' }; - } -} diff --git a/playground/connect-next/app/login/page.tsx b/playground/connect-next/app/login/page.tsx deleted file mode 100644 index 374c4a880..000000000 --- a/playground/connect-next/app/login/page.tsx +++ /dev/null @@ -1,14 +0,0 @@ -import LoginComponent from '@/app/login/LoginComponent'; -import { cookies } from 'next/headers'; - -export type Props = { - clientState: string | undefined; -}; - -export default async function LoginPage() { - const cookieStore = await cookies(); - const clientState = cookieStore.get('cbo_client_state'); - console.log('clientState', clientState); - - return ; -} diff --git a/playground/connect-next/app/mfa-software-token/actions.ts b/playground/connect-next/app/mfa-software-token/actions.ts deleted file mode 100644 index 743663b5c..000000000 --- a/playground/connect-next/app/mfa-software-token/actions.ts +++ /dev/null @@ -1,91 +0,0 @@ -'use server'; - -import { cookies } from 'next/headers'; -import { - CognitoIdentityProviderClient, - RespondToAuthChallengeCommand, -} from '@aws-sdk/client-cognito-identity-provider'; -import crypto from 'crypto'; -import { verifyToken } from '@/app/utils'; -import { TOTP } from 'totp-generator'; - -function createSecretHash(username: string, clientId: string, clientSecret: string) { - return crypto - .createHmac('sha256', clientSecret) - .update(username + clientId) - .digest('base64'); -} - -export async function startMFASoftwareToken(totp: string) { - try { - const cookieStore = await cookies(); - const session = cookieStore.get('mfa_session'); - const displayName = cookieStore.get('displayName'); - - if (!totp || !session || !displayName) { - throw new Error('Missing required fields.'); - } - - const client = new CognitoIdentityProviderClient({ - region: process.env.AWS_REGION!, - credentials: { - accessKeyId: process.env.AWS_ACCESS_KEY_ID!, - secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY!, - }, - }); - - const challengeResponseCommand = new RespondToAuthChallengeCommand({ - ClientId: process.env.AWS_COGNITO_CLIENT_ID!, - ChallengeName: 'SOFTWARE_TOKEN_MFA', - Session: session.value, - ChallengeResponses: { - USERNAME: displayName.value, - SOFTWARE_TOKEN_MFA_CODE: totp, - SECRET_HASH: createSecretHash( - displayName.value, - process.env.AWS_COGNITO_CLIENT_ID!, - process.env.AWS_COGNITO_CLIENT_SECRET!, - ), - }, - }); - - const mfaResult = await client.send(challengeResponseCommand); - console.log('MFA login complete', mfaResult); - - if (mfaResult.AuthenticationResult?.AccessToken) { - // no MFA has been set up yet - - const decoded = await verifyToken(mfaResult.AuthenticationResult.AccessToken); - if (decoded.username) { - return { success: true }; - } - - return { success: false, message: 'An error occurred. Please try again later.' }; - } - - return { success: true, screen: 'MFA_SOFTWARE_TOKEN' }; - } catch (err) { - if (err instanceof Error) { - if (err.name === 'NotAuthorizedException') return { success: false, message: 'Incorrect username or password.' }; - - return { success: false, message: err.message }; - } - - return { success: false, message: 'An error occurred. Please try again later.' }; - } -} - -export async function generateTOTP() { - const cookieStore = await cookies(); - const secretCode = cookieStore.get('secretCode'); - if (!secretCode) { - return { - success: false, - message: 'Secret code not found. Autofill only works as long as the cookie set during signup is still there.', - }; - } - - const { otp } = TOTP.generate(secretCode.value!); - - return { success: true, otp }; -} diff --git a/playground/connect-next/app/mfa-software-token/page.tsx b/playground/connect-next/app/mfa-software-token/page.tsx deleted file mode 100644 index f244a2029..000000000 --- a/playground/connect-next/app/mfa-software-token/page.tsx +++ /dev/null @@ -1,80 +0,0 @@ -'use client'; - -import { useRouter } from 'next/navigation'; -import { useState } from 'react'; -import { generateTOTP, startMFASoftwareToken } from '@/app/mfa-software-token/actions'; - -export default function LoginPage() { - const router = useRouter(); - const [conventionalLoginVisible, setConventionalLoginVisible] = useState(false); - const [totp, setTotp] = useState(''); - const [error, setError] = useState(''); - - const onSubmit = async () => { - setError(''); - const res = await startMFASoftwareToken(totp); - - if (!res.success) { - setError(res.message ?? 'An unknown error occurred. Please try again later.'); - - return; - } - - if (res.screen === 'MFA_SOFTWARE_TOKEN') { - router.push('/mfa-software-token'); - } else { - router.push('/post-login'); - } - }; - - const onAutofillTOTP = async () => { - setError(''); - const res = await generateTOTP(); - - if (!res.success) { - setError(res.message ?? 'An unknown error occurred. Please try again later.'); - - return; - } - - setTotp(res.otp ?? ''); - }; - - return ( -
-
-
-
MFA
- {error &&
{error}
} - setTotp(e.target.value)} - /> -
- -
-
- -
-
-
-
- ); -} diff --git a/playground/connect-next/app/page.tsx b/playground/connect-next/app/page.tsx deleted file mode 100644 index 9b0bb393e..000000000 --- a/playground/connect-next/app/page.tsx +++ /dev/null @@ -1,22 +0,0 @@ -'use client'; -export const runtime = 'edge'; - -import Link from 'next/link'; -import { hello, hello2 } from '@/app/actions'; - -export default function Home() { - return ( -
-

Home

-

- Login -

-

- Signup -

-

- Demo -

-
- ); -} diff --git a/playground/connect-next/app/passkey-list/actions.ts b/playground/connect-next/app/passkey-list/actions.ts deleted file mode 100644 index 6f333ba94..000000000 --- a/playground/connect-next/app/passkey-list/actions.ts +++ /dev/null @@ -1,38 +0,0 @@ -'use server'; - -import { cookies } from 'next/headers'; -import { ConnectTokenType } from '@corbado/types'; - -export async function getCorbadoToken(tokenType: ConnectTokenType) { - const cookieStore = await cookies(); - const identifier = cookieStore.get('identifier'); - if (!identifier) { - return null; - } - - // call backend API to get token - const payload = { - type: tokenType, - data: { - identifier: identifier.value, - }, - }; - - const body = JSON.stringify(payload); - - const url = `${process.env.CORBADO_BACKEND_API_URL}/v2/connectTokens`; - const response = await fetch(url, { - method: 'POST', - headers: { - Authorization: `Basic ${process.env.CORBADO_BACKEND_API_BASIC_AUTH}`, - 'Content-Type': 'application/json', - }, - cache: 'no-cache', - body: body, - }); - - const out = await response.json(); - console.log(out); - - return out.secret; -} diff --git a/playground/connect-next/app/post-login/actions.ts b/playground/connect-next/app/post-login/actions.ts deleted file mode 100644 index 9a86aef84..000000000 --- a/playground/connect-next/app/post-login/actions.ts +++ /dev/null @@ -1,8 +0,0 @@ -'use server'; - -import { cookies } from 'next/headers'; - -export async function postPasskeyAppend(_: string, clientState: string) { - const cookieStore = await cookies(); - cookieStore.set({ name: 'cbo_client_state', value: clientState, httpOnly: true }); -} diff --git a/playground/connect-next/app/post-login/page.tsx b/playground/connect-next/app/post-login/page.tsx deleted file mode 100644 index 6d7e1d35a..000000000 --- a/playground/connect-next/app/post-login/page.tsx +++ /dev/null @@ -1,35 +0,0 @@ -'use client'; -import { postPasskeyAppend } from '@/app/post-login/actions'; - -export const runtime = 'edge'; - -import { CorbadoConnectAppend } from '@corbado/connect-react'; -import { useRouter } from 'next/navigation'; -import { getAppendToken } from '../actions'; - -export default function PostLoginPage() { - const router = useRouter(); - - return ( -
-
-
- router.push('/home')} - appendTokenProvider={async () => { - const t = await getAppendToken(); - console.log(t); - - return t; - }} - onComplete={async (_, clientSideState: string) => { - console.log('onComplete', clientSideState); - await postPasskeyAppend('', clientSideState); - router.push('/home'); - }} - /> -
-
-
- ); -} diff --git a/playground/connect-next/app/signup/actions.ts b/playground/connect-next/app/signup/actions.ts deleted file mode 100644 index 8e9338feb..000000000 --- a/playground/connect-next/app/signup/actions.ts +++ /dev/null @@ -1,125 +0,0 @@ -'use server'; - -import { cookies } from 'next/headers'; -import { generateRandomString } from '@/utils/random'; -import { - AdminCreateUserCommand, - AdminInitiateAuthCommand, - AdminSetUserMFAPreferenceCommand, - AdminSetUserPasswordCommand, - AssociateSoftwareTokenCommand, - CognitoIdentityProviderClient, - VerifySoftwareTokenCommand, -} from '@aws-sdk/client-cognito-identity-provider'; -import { TOTP } from 'totp-generator'; -import CryptoJS from 'crypto-js'; - -const cognitoUserPoolId = process.env.AWS_COGNITO_USER_POOL_ID!; -const cognitoClientId = process.env.AWS_COGNITO_CLIENT_ID!; -const cognitoClientSecret = process.env.AWS_COGNITO_CLIENT_SECRET!; -const awsRegion = process.env.AWS_REGION!; -const awsAccessKeyId = process.env.AWS_ACCESS_KEY_ID!; -const awsSecretAccessKey = process.env.AWS_SECRET_ACCESS_KEY!; - -export const createAccount = async (email: string, phone: string, password: string) => { - // of course this is not secure, but it's just a demo ;) - - const randomUsername = generateRandomString(10); - const cookieStore = await cookies(); - - cookieStore.set('displayName', email); - cookieStore.set('identifier', randomUsername); - - // create client that loads profile from ~/.aws/credentials or environment variables - const client = new CognitoIdentityProviderClient({ - region: awsRegion, - credentials: { - accessKeyId: awsAccessKeyId, - secretAccessKey: awsSecretAccessKey, - }, - }); - - const command = new AdminCreateUserCommand({ - UserPoolId: cognitoUserPoolId, - Username: randomUsername, - ForceAliasCreation: true, - MessageAction: 'SUPPRESS', - UserAttributes: [ - { - Name: 'email', - Value: email, - }, - { - Name: 'email_verified', - Value: 'true', - }, - { - Name: 'phone_number', - Value: phone, - }, - ], - }); - - await client.send(command); - - const passwordCommand = new AdminSetUserPasswordCommand({ - UserPoolId: cognitoUserPoolId, - Username: randomUsername, - Password: password, - Permanent: true, - }); - - await client.send(passwordCommand); - - const initiateAuthCommand = new AdminInitiateAuthCommand({ - AuthFlow: 'ADMIN_USER_PASSWORD_AUTH', - ClientId: cognitoClientId, - UserPoolId: cognitoUserPoolId, - AuthParameters: { - USERNAME: randomUsername, - PASSWORD: password, - SECRET_HASH: await createSecretHash(randomUsername, cognitoClientId, cognitoClientSecret), - }, - }); - - const initiateAuthRes = await client.send(initiateAuthCommand); - - const associateSoftwareTokenCommand = new AssociateSoftwareTokenCommand({ - Session: initiateAuthRes.Session, - AccessToken: initiateAuthRes.AuthenticationResult?.AccessToken, - }); - - const associateSoftwareTokenRes = await client.send(associateSoftwareTokenCommand); - console.log('associateSoftwareTokenRes', associateSoftwareTokenRes); - - cookieStore.set('secretCode', associateSoftwareTokenRes.SecretCode!); - - const { otp } = TOTP.generate(associateSoftwareTokenRes.SecretCode!); - console.log('otp', otp); - const verifySoftwareTokenCommand = new VerifySoftwareTokenCommand({ - Session: initiateAuthRes.Session, - AccessToken: initiateAuthRes.AuthenticationResult?.AccessToken, - UserCode: otp, - }); - - const verifySoftwareTokenRes = await client.send(verifySoftwareTokenCommand); - console.log('verifySoftwareTokenRes', verifySoftwareTokenRes); - - const setMfaPreferenceCommand = new AdminSetUserMFAPreferenceCommand({ - UserPoolId: cognitoUserPoolId, - Username: randomUsername, - SoftwareTokenMfaSettings: { - Enabled: true, - PreferredMfa: true, - }, - }); - const setMfaPreferenceCommandRes = await client.send(setMfaPreferenceCommand); - console.log('setMfaPreferenceCommandRes', setMfaPreferenceCommandRes); - - return; -}; - -const createSecretHash = async (username: string, clientId: string, clientSecret: string) => { - const hmac = CryptoJS.HmacSHA256(username + clientId, clientSecret); - return hmac.toString(CryptoJS.enc.Base64); -}; diff --git a/playground/connect-next/app/signup/page.tsx b/playground/connect-next/app/signup/page.tsx deleted file mode 100644 index 0a74d50bd..000000000 --- a/playground/connect-next/app/signup/page.tsx +++ /dev/null @@ -1,78 +0,0 @@ -'use client'; - -export const runtime = 'edge'; - -import { useState } from 'react'; -import { useRouter } from 'next/navigation'; -import { createAccount } from './actions'; -import { generateRandomString } from '@/utils/random'; - -export default function SignupPage() { - const router = useRouter(); - const [email, setEmail] = useState(''); - const [phone, setPhone] = useState(''); - const [password, setPassword] = useState(''); - - const signUp = async (email: string, phone: string, password: string) => { - await createAccount(email, phone, password); - }; - - return ( -
-
-
-
Signup
- -
-
- setEmail(e.target.value)} - /> - setPhone(e.target.value)} - /> - setPassword(e.target.value)} - /> -
- -
-
-
-
- ); -} diff --git a/playground/connect-next/app/utils.ts b/playground/connect-next/app/utils.ts deleted file mode 100644 index e67c5f8f0..000000000 --- a/playground/connect-next/app/utils.ts +++ /dev/null @@ -1,34 +0,0 @@ -import jwt from 'jsonwebtoken'; -import jwksClient from 'jwks-rsa'; - -const jwksUrl = `https://cognito-idp.${process.env.AWS_REGION}.amazonaws.com/${process.env.AWS_COGNITO_USER_POOL_ID}/.well-known/jwks.json`; -const client = jwksClient({ jwksUri: jwksUrl }); - -export type DecodedToken = { - username: string; -}; - -export type TokenWrapper = { - AccessToken: string; -}; - -const getKey = (header: jwt.JwtHeader, callback: jwt.SigningKeyCallback) => { - client.getSigningKey(header.kid, (err, key) => { - const signingKey = key?.getPublicKey(); - callback(err, signingKey); - }); -}; - -export const verifyToken = async (token: string): Promise => { - return new Promise((resolve, reject) => { - jwt.verify(token, getKey, { algorithms: ['RS256'] }, (err, decoded) => { - if (err) { - return reject(err); - } - - const typed = decoded as DecodedToken; - - resolve(typed); - }); - }); -}; diff --git a/playground/connect-next/components.json b/playground/connect-next/components.json new file mode 100644 index 000000000..639cbe5ea --- /dev/null +++ b/playground/connect-next/components.json @@ -0,0 +1,21 @@ +{ + "$schema": "https://ui.shadcn.com/schema.json", + "style": "new-york", + "rsc": true, + "tsx": true, + "tailwind": { + "config": "tailwind.config.ts", + "css": "app/globals.css", + "baseColor": "neutral", + "cssVariables": true, + "prefix": "" + }, + "aliases": { + "components": "@/components", + "utils": "@/lib/utils", + "ui": "@/components/ui", + "lib": "@/lib", + "hooks": "@/hooks" + }, + "iconLibrary": "lucide" +} diff --git a/playground/connect-next/components/ClientWrapper.tsx b/playground/connect-next/components/ClientWrapper.tsx new file mode 100644 index 000000000..f8a865b40 --- /dev/null +++ b/playground/connect-next/components/ClientWrapper.tsx @@ -0,0 +1,21 @@ +'use client'; + +import React from 'react'; +import { CorbadoConnectProvider } from '@corbado/connect-react'; +import { configureAmplify } from '@/lib/amplify-config'; + +configureAmplify(); + +const WrappedCorbadoConnectProvider = ({ children }: { children: React.ReactNode }) => { + return ( + + {children} + + ); +}; + +export default WrappedCorbadoConnectProvider; diff --git a/playground/connect-next/components/ConfirmOTP.tsx b/playground/connect-next/components/ConfirmOTP.tsx new file mode 100644 index 000000000..c43df1761 --- /dev/null +++ b/playground/connect-next/components/ConfirmOTP.tsx @@ -0,0 +1,84 @@ +'use client'; + +import React, { useState } from 'react'; +import { InputOTP, InputOTPGroup, InputOTPSlot } from '@/components/ui/input-otp'; +import { Button } from '@/components/ui/button'; + +type Props = { + onSubmit: (value: string) => Promise; + onCancel?: () => void; + onAutoFill?: () => Promise; +}; + +export const ConfirmOTP = ({ onSubmit, onCancel, onAutoFill }: Props) => { + const [value, setValue] = useState(''); + const [message, setMessage] = useState('Enter your code'); + + const onChange = async (value: string) => { + if (value.length === 6) { + setValue(value); + setMessage('Loading...'); + const maybeError = await onSubmit(value); + if (maybeError) { + setMessage(maybeError); + } + } else { + setValue(value); + } + }; + + return ( + // center the OTP input +
+ +
+ + + + + + + + +
+
+
{message}
+ {onAutoFill && ( +
+ +
+ )} + {onCancel && ( +
+ +
+ )} +
+ ); +}; + +export default ConfirmOTP; diff --git a/playground/connect-next/components/ProtectedRoute.tsx b/playground/connect-next/components/ProtectedRoute.tsx new file mode 100644 index 000000000..60ce1ca08 --- /dev/null +++ b/playground/connect-next/components/ProtectedRoute.tsx @@ -0,0 +1,35 @@ +'use client'; + +import { useEffect, useState } from 'react'; +import { useRouter } from 'next/navigation'; +import { fetchAuthSession } from 'aws-amplify/auth'; + +const isUserSignedIn = async (): Promise => { + try { + const session = await fetchAuthSession(); + return session?.tokens?.idToken != null; + } catch { + return false; + } +}; + +export const ProtectedRoute = ({ children }: { children: React.ReactNode }) => { + const router = useRouter(); + const [loading, setLoading] = useState(true); + + useEffect(() => { + isUserSignedIn().then(isSignedIn => { + if (!isSignedIn) { + router.replace('/login'); + } else { + setLoading(false); + } + }); + }, [router]); + + if (loading) return null; // or loading spinner + + return <>{children}; +}; + +export default ProtectedRoute; diff --git a/playground/connect-next/components/ui/button.tsx b/playground/connect-next/components/ui/button.tsx new file mode 100644 index 000000000..6c51b8b01 --- /dev/null +++ b/playground/connect-next/components/ui/button.tsx @@ -0,0 +1,53 @@ +import * as React from 'react'; +import { Slot } from '@radix-ui/react-slot'; +import { cva, type VariantProps } from 'class-variance-authority'; + +import { cn } from '@/lib/utils'; + +const buttonVariants = cva( + 'inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0', + { + variants: { + variant: { + default: 'bg-primary text-primary-foreground shadow hover:bg-primary/90', + destructive: 'bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90', + outline: 'border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground', + secondary: 'bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80', + ghost: 'hover:bg-accent hover:text-accent-foreground', + link: 'text-primary underline-offset-4 hover:underline', + }, + size: { + default: 'h-9 px-4 py-2', + sm: 'h-8 rounded-md px-3 text-xs', + lg: 'h-10 rounded-md px-8', + icon: 'h-9 w-9', + }, + }, + defaultVariants: { + variant: 'default', + size: 'default', + }, + }, +); + +export interface ButtonProps + extends React.ButtonHTMLAttributes, + VariantProps { + asChild?: boolean; +} + +const Button = React.forwardRef( + ({ className, variant, size, asChild = false, ...props }, ref) => { + const Comp = asChild ? Slot : 'button'; + return ( + + ); + }, +); +Button.displayName = 'Button'; + +export { Button, buttonVariants }; diff --git a/playground/connect-next/components/ui/input-otp.tsx b/playground/connect-next/components/ui/input-otp.tsx new file mode 100644 index 000000000..18c8fa106 --- /dev/null +++ b/playground/connect-next/components/ui/input-otp.tsx @@ -0,0 +1,73 @@ +'use client'; + +import * as React from 'react'; +import { OTPInput, OTPInputContext } from 'input-otp'; +import { Minus } from 'lucide-react'; + +import { cn } from '@/lib/utils'; + +const InputOTP = React.forwardRef, React.ComponentPropsWithoutRef>( + ({ className, containerClassName, ...props }, ref) => ( + + ), +); +InputOTP.displayName = 'InputOTP'; + +const InputOTPGroup = React.forwardRef, React.ComponentPropsWithoutRef<'div'>>( + ({ className, ...props }, ref) => ( +
+ ), +); +InputOTPGroup.displayName = 'InputOTPGroup'; + +const InputOTPSlot = React.forwardRef< + React.ElementRef<'div'>, + React.ComponentPropsWithoutRef<'div'> & { index: number } +>(({ index, className, ...props }, ref) => { + const inputOTPContext = React.useContext(OTPInputContext); + const { char, hasFakeCaret, isActive } = inputOTPContext.slots[index]; + + return ( +
+ {char} + {hasFakeCaret && ( +
+
+
+ )} +
+ ); +}); +InputOTPSlot.displayName = 'InputOTPSlot'; + +const InputOTPSeparator = React.forwardRef, React.ComponentPropsWithoutRef<'div'>>( + ({ ...props }, ref) => ( +
+ +
+ ), +); +InputOTPSeparator.displayName = 'InputOTPSeparator'; + +export { InputOTP, InputOTPGroup, InputOTPSlot, InputOTPSeparator }; diff --git a/playground/connect-next/components/ui/separator.tsx b/playground/connect-next/components/ui/separator.tsx new file mode 100644 index 000000000..32d6c72b4 --- /dev/null +++ b/playground/connect-next/components/ui/separator.tsx @@ -0,0 +1,22 @@ +'use client'; + +import * as React from 'react'; +import * as SeparatorPrimitive from '@radix-ui/react-separator'; + +import { cn } from '@/lib/utils'; + +const Separator = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, orientation = 'horizontal', decorative = true, ...props }, ref) => ( + +)); +Separator.displayName = SeparatorPrimitive.Root.displayName; + +export { Separator }; diff --git a/playground/connect-next/components/ui/skeleton.tsx b/playground/connect-next/components/ui/skeleton.tsx new file mode 100644 index 000000000..bf495da75 --- /dev/null +++ b/playground/connect-next/components/ui/skeleton.tsx @@ -0,0 +1,12 @@ +import { cn } from '@/lib/utils'; + +function Skeleton({ className, ...props }: React.HTMLAttributes) { + return ( +
+ ); +} + +export { Skeleton }; diff --git a/playground/connect-next/lib/amplify-config.ts b/playground/connect-next/lib/amplify-config.ts new file mode 100644 index 000000000..e21887b9e --- /dev/null +++ b/playground/connect-next/lib/amplify-config.ts @@ -0,0 +1,15 @@ +import { Amplify } from 'aws-amplify'; + +export const configureAmplify = () => { + Amplify.configure( + { + Auth: { + Cognito: { + userPoolId: process.env.NEXT_PUBLIC_AWS_COGNITO_USER_POOL_ID!, + userPoolClientId: process.env.NEXT_PUBLIC_AWS_COGNITO_CLIENT_ID!, + }, + }, + }, + { ssr: true }, + ); +}; diff --git a/playground/connect-next/utils/random.ts b/playground/connect-next/lib/random.ts similarity index 100% rename from playground/connect-next/utils/random.ts rename to playground/connect-next/lib/random.ts diff --git a/playground/connect-next/lib/utils.ts b/playground/connect-next/lib/utils.ts new file mode 100644 index 000000000..98e6b4264 --- /dev/null +++ b/playground/connect-next/lib/utils.ts @@ -0,0 +1,118 @@ +import { type ClassValue, clsx } from 'clsx'; +import { twMerge } from 'tailwind-merge'; +import { CognitoJwtVerifier } from 'aws-jwt-verify'; +import { fetchUserAttributes, getCurrentUser } from 'aws-amplify/auth'; + +type TokenData = { + displayName: string; + identifier: string; +}; + +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)); +} + +const verifier = CognitoJwtVerifier.create({ + userPoolId: process.env.NEXT_PUBLIC_AWS_COGNITO_USER_POOL_ID!, + tokenUse: 'id', + clientId: process.env.NEXT_PUBLIC_AWS_COGNITO_CLIENT_ID!, +}); + +export const verifyAmplifyToken = async (idToken: string): Promise => { + const verifiedToken = await verifier.verify(idToken); + const displayName: string = verifiedToken.email as string; + const identifier = verifiedToken['cognito:username']; + + return { displayName, identifier }; +}; + +export const verifyAmplifyTokenExternal = async (idToken: string): Promise => { + const verifier = CognitoJwtVerifier.create({ + userPoolId: process.env.AWS_COGNITO_USER_POOL_ID_EXTERNAL!, + tokenUse: 'id', + clientId: process.env.AWS_COGNITO_CLIENT_ID_EXTERNAL!, + }); + + console.log( + 'verifying token with external verifier', + idToken, + process.env.AWS_COGNITO_USER_POOL_ID_EXTERNAL, + process.env.AWS_COGNITO_CLIENT_ID_EXTERNAL, + ); + + const verifiedToken = await verifier.verify(idToken); + const displayName: string = verifiedToken.email as string; + const identifier = verifiedToken['cognito:username']; + + return { displayName, identifier }; +}; + +export type CognitoUserInfo = { + username: string; + email: string; + phoneNumber: string; + emailVerified: boolean; +}; + +export const getCognitoUserInfo = async (): Promise => { + const user = await getCurrentUser(); + const attributes = await fetchUserAttributes(); + + return { + username: user.username, + email: attributes.email, + phoneNumber: attributes.phone_number, + emailVerified: attributes.email_verified === 'true', + } as CognitoUserInfo; +}; + +export const getCorbadoConnectToken = async (connectTokenType: string, connectTokenData: any): Promise => { + const payload = { + type: connectTokenType, + data: connectTokenData, + }; + + const body = JSON.stringify(payload); + + const url = `${process.env.CORBADO_BACKEND_API_URL}/v2/connectTokens`; + const response = await fetch(url, { + method: 'POST', + headers: { + Authorization: `Basic ${process.env.CORBADO_BACKEND_API_BASIC_AUTH}`, + 'Content-Type': 'application/json', + }, + cache: 'no-cache', + body: body, + }); + + const out = await response.json(); + + return out.secret; +}; + +export const getCorbadoConnectTokenExternal = async ( + connectTokenType: string, + connectTokenData: any, +): Promise => { + const payload = { + type: connectTokenType, + data: connectTokenData, + }; + + const body = JSON.stringify(payload); + + const url = `${process.env.CORBADO_BACKEND_API_URL_EXTERNAL}/v2/connectTokens`; + const response = await fetch(url, { + method: 'POST', + headers: { + Authorization: `Basic ${process.env.CORBADO_BACKEND_API_BASIC_AUTH_EXTERNAL}`, + 'Content-Type': 'application/json', + }, + cache: 'no-cache', + body: body, + }); + + const out = await response.json(); + + return out.secret; +}; diff --git a/playground/connect-next/package.json b/playground/connect-next/package.json index 50c01549b..8cd72ee17 100644 --- a/playground/connect-next/package.json +++ b/playground/connect-next/package.json @@ -9,25 +9,37 @@ "lint": "next lint" }, "dependencies": { - "@aws-sdk/client-cognito-identity-provider": "^3.423.0", + "@aws-sdk/client-cognito-identity-provider": "^3.799.0", "@aws-sdk/credential-providers": "^3.624.0", "@corbado/connect-react": "*", + "@radix-ui/react-separator": "^1.1.7", + "@radix-ui/react-slot": "^1.2.0", + "aws-amplify": "^6.14.4", + "aws-jwt-verify": "^5.0.0", "aws-sdk": "^2.1646.0", "axios": "^1.7.3", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", "crypto-js": "^4.2.0", + "input-otp": "^1.4.2", + "jose": "^6.0.10", "jsonwebtoken": "^9.0.2", "jwks-rsa": "^3.1.0", + "lucide-react": "^0.507.0", "next": "15.2.4", + "qrcode.react": "^4.2.0", "react": "^18", "react-dom": "^18", + "tailwind-merge": "^3.2.0", + "tailwindcss-animate": "^1.0.7", "totp-generator": "^1.0.0" }, "devDependencies": { "@tailwindcss/forms": "^0.5.7", + "@types/crypto-js": "^4.2.2", "@types/node": "^20", "@types/react": "^18", "@types/react-dom": "^18", - "@types/crypto-js": "^4.2.2", "postcss": "^8", "tailwindcss": "^3.4.1", "typescript": "^5" diff --git a/playground/connect-next/public/.well-known/apple-app-site-association b/playground/connect-next/public/.well-known/apple-app-site-association new file mode 100644 index 000000000..d1561dfdd --- /dev/null +++ b/playground/connect-next/public/.well-known/apple-app-site-association @@ -0,0 +1 @@ +{"appclips":{"apps":[]},"applinks":{"details":[{"appID":"T9A667JL6T.com.corbado.ios.ConnectExample","paths":["*"]}]},"webcredentials":{"apps":["T9A667JL6T.com.corbado.ios.ConnectExample"]}} diff --git a/playground/connect-next/public/.well-known/assetlinks.json b/playground/connect-next/public/.well-known/assetlinks.json new file mode 100644 index 000000000..a4ff05d3c --- /dev/null +++ b/playground/connect-next/public/.well-known/assetlinks.json @@ -0,0 +1,12 @@ +[ + { + "relation": ["delegate_permission/common.handle_all_urls", "delegate_permission/common.get_login_creds"], + "target": { + "namespace": "android_app", + "package_name": "com.corbado.connect.example", + "sha256_cert_fingerprints": [ + "F8:90:4E:9A:99:01:71:75:25:38:D5:36:16:2D:B3:65:EB:41:51:D4:53:9A:72:BC:4B:56:C5:16:43:62:E2:C0" + ] + } + } +] diff --git a/playground/connect-next/tailwind.config.ts b/playground/connect-next/tailwind.config.ts index 4459e6386..5d8b8db3c 100644 --- a/playground/connect-next/tailwind.config.ts +++ b/playground/connect-next/tailwind.config.ts @@ -1,6 +1,7 @@ import type { Config } from 'tailwindcss'; const config: Config = { + darkMode: ['class'], content: [ './pages/**/*.{js,ts,jsx,tsx,mdx}', './components/**/*.{js,ts,jsx,tsx,mdx}', @@ -12,8 +13,55 @@ const config: Config = { 'gradient-radial': 'radial-gradient(var(--tw-gradient-stops))', 'gradient-conic': 'conic-gradient(from 180deg at 50% 50%, var(--tw-gradient-stops))', }, + borderRadius: { + lg: 'var(--radius)', + md: 'calc(var(--radius) - 2px)', + sm: 'calc(var(--radius) - 4px)', + }, + colors: { + background: 'hsl(var(--background))', + foreground: 'hsl(var(--foreground))', + card: { + DEFAULT: 'hsl(var(--card))', + foreground: 'hsl(var(--card-foreground))', + }, + popover: { + DEFAULT: 'hsl(var(--popover))', + foreground: 'hsl(var(--popover-foreground))', + }, + primary: { + DEFAULT: 'hsl(var(--primary))', + foreground: 'hsl(var(--primary-foreground))', + }, + secondary: { + DEFAULT: 'hsl(var(--secondary))', + foreground: 'hsl(var(--secondary-foreground))', + }, + muted: { + DEFAULT: 'hsl(var(--muted))', + foreground: 'hsl(var(--muted-foreground))', + }, + accent: { + DEFAULT: 'hsl(var(--accent))', + foreground: 'hsl(var(--accent-foreground))', + }, + destructive: { + DEFAULT: 'hsl(var(--destructive))', + foreground: 'hsl(var(--destructive-foreground))', + }, + border: 'hsl(var(--border))', + input: 'hsl(var(--input))', + ring: 'hsl(var(--ring))', + chart: { + '1': 'hsl(var(--chart-1))', + '2': 'hsl(var(--chart-2))', + '3': 'hsl(var(--chart-3))', + '4': 'hsl(var(--chart-4))', + '5': 'hsl(var(--chart-5))', + }, + }, }, }, - plugins: [require('@tailwindcss/forms')], + plugins: [require('@tailwindcss/forms'), require('tailwindcss-animate')], }; export default config; diff --git a/playground/web-js-script/package.json b/playground/web-js-script/package.json new file mode 100644 index 000000000..9a5bce3b8 --- /dev/null +++ b/playground/web-js-script/package.json @@ -0,0 +1,16 @@ +{ + "name": "web-js-script", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "serve": "npx serve --single" + }, + "keywords": [], + "author": "", + "license": "ISC", + "type": "commonjs", + "devDependencies": { + "serve": "^14.2.4" + } +} diff --git a/playground/web-js/package.json b/playground/web-js/package.json index 2984265d2..0b0c42464 100644 --- a/playground/web-js/package.json +++ b/playground/web-js/package.json @@ -5,7 +5,8 @@ "main": "index.js", "scripts": { "start": "cross-env NODE_ENV=local webpack-dev-server --open --mode development", - "build": "cross-env NODE_ENV=vercel webpack --mode production" + "build": "cross-env NODE_ENV=vercel webpack --mode production", + "serve": "npx serve dist --single" }, "keywords": [], "author": "", @@ -15,6 +16,7 @@ }, "devDependencies": { "dotenv-webpack": "^8.0.1", - "html-webpack-plugin": "^5.6.3" + "html-webpack-plugin": "^5.6.3", + "serve": "^14.2.4" } }