diff --git a/.changeset/giant-kiwis-attend.md b/.changeset/giant-kiwis-attend.md new file mode 100644 index 0000000000..963ceebcda --- /dev/null +++ b/.changeset/giant-kiwis-attend.md @@ -0,0 +1,5 @@ +--- +"learn-card-app": patch +--- + +feat: LC-1463 - AI Pathways MVP diff --git a/.dockerignore b/.dockerignore index 8952b7629a..f6c2a4023a 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,37 +1,2 @@ -# Exclude Rust build artifacts to save massive amounts of space -lib/didkit/target -lib/ssi/target - -# Dependencies (copied selectively in Dockerfiles) -node_modules -**/node_modules - -# Build outputs -**/dist -**/build -**/.next -**/.turbo -**/.nx - -# Common exclusions -*.log -.git -.github -docs -examples -*.md -.vscode -.idea -.changeset - -# Test artifacts -**/*.test.ts -**/*.spec.ts -**/coverage -**/__tests__ -**/playwright-report -**/test-results - -# Native build artifacts -**/*.node -**/native/target +**/*/dist +**/*/node_modules diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 231697d978..e9dc31d249 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -1,325 +1,217 @@ name: Deploy on: - push: - branches: - - main - workflow_dispatch: - inputs: - # Environment selection - target-environment: - description: "Target Environment" - required: true - default: "staging" - type: choice - options: - - staging - - production - - scouts - # Component selection - which things to deploy - deploy-brain-service: - description: "Deploy Brain Service (Network API)" - required: false - default: false - type: boolean - deploy-learn-cloud: - description: "Deploy LearnCloud (Storage API)" - required: false - default: false - type: boolean - deploy-lca-api: - description: "Deploy LCA API Service" - required: false - default: false - type: boolean - deploy-frontend: - description: "Deploy Frontend (Netlify + CapGo)" - required: false - default: false - type: boolean - publish-npm: - description: "Publish NPM Packages" - required: false - default: false - type: boolean - push-docker: - description: "Push Docker Images" - required: false - default: false - type: boolean + push: + branches: + - main + workflow_dispatch: + inputs: + # Environment selection + target-environment: + description: "Target Environment" + required: true + default: "staging" + type: choice + options: + - staging + - production + # Component selection - which things to deploy + deploy-brain-service: + description: "Deploy Brain Service (Network API)" + required: false + default: false + type: boolean + deploy-learn-cloud: + description: "Deploy LearnCloud (Storage API)" + required: false + default: false + type: boolean + deploy-lca-api: + description: "Deploy LCA API Service" + required: false + default: false + type: boolean + deploy-lca-frontend: + description: "Deploy LearnCard App Frontend (Netlify + CapGo)" + required: false + default: false + type: boolean + publish-npm: + description: "Publish NPM Packages" + required: false + default: false + type: boolean + push-docker: + description: "Push Docker Images" + required: false + default: false + type: boolean concurrency: ${{ github.workflow }}-${{ github.ref }} env: - CI: true - AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} - AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - AWS_DEFAULT_REGION: us-east-1 + CI: true + AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + AWS_DEFAULT_REGION: us-east-1 jobs: - # ============================================================================ - # DETERMINE WHAT'S AFFECTED - # ============================================================================ - determine-affected: - name: Determine Affected Projects - runs-on: ubuntu-latest - outputs: - affected: ${{ steps.affected.outputs.affected }} - is_release: ${{ steps.check_release.outputs.is_release }} - is_manual: ${{ steps.check_manual.outputs.is_manual }} - # For production releases, check which services have version changes - brain_service_changed: ${{ steps.check_versions.outputs.brain_service_changed }} - learn_cloud_changed: ${{ steps.check_versions.outputs.learn_cloud_changed }} - lca_api_changed: ${{ steps.check_versions.outputs.lca_api_changed }} - lca_app_changed: ${{ steps.check_versions.outputs.lca_app_changed }} - native_plugin_changed: ${{ steps.check_versions.outputs.native_plugin_changed }} - # Dynamic environment names - target_frontend_env: ${{ steps.set-env.outputs.frontend_env }} - target_brain_service_env: ${{ steps.set-env.outputs.brain_env }} - target_learn_cloud_env: ${{ steps.set-env.outputs.cloud_env }} - target_lca_api_env: ${{ steps.set-env.outputs.lca_api_env }} - steps: - # Check these first - no dependencies needed - - name: Check if this is a manual dispatch - id: check_manual - run: | - if [[ "${{ github.event_name }}" == 'workflow_dispatch' ]]; then - echo "is_manual=true" >> $GITHUB_OUTPUT - echo "This is a manual dispatch - skipping affected detection" - else - echo "is_manual=false" >> $GITHUB_OUTPUT - fi - - - name: Check if this is a release commit - id: check_release - if: github.event_name != 'workflow_dispatch' - run: | - if [[ "${{ github.event.head_commit.message }}" == *"chore(release):"* ]]; then - echo "is_release=true" >> $GITHUB_OUTPUT - echo "This is a release commit" - else - echo "is_release=false" >> $GITHUB_OUTPUT - fi - - - name: Determine Deployment Environments - id: set-env - run: | - if [[ "${{ github.event_name }}" == 'workflow_dispatch' && "${{ github.event.inputs.target-environment }}" == 'scouts' ]]; then - echo "frontend_env=scout-app-production" >> "$GITHUB_OUTPUT" - echo "brain_env=scout-network-api-production" >> "$GITHUB_OUTPUT" - echo "cloud_env=scout-storage-api-production" >> "$GITHUB_OUTPUT" - echo "lca_api_env=scout-app-api-production" >> "$GITHUB_OUTPUT" - elif [[ "${{ github.event_name }}" == 'workflow_dispatch' && "${{ github.event.inputs.target-environment }}" == 'production' ]]; then - echo "frontend_env=learn-card-app-production" >> "$GITHUB_OUTPUT" - echo "brain_env=learn-cloud-network-api-production" >> "$GITHUB_OUTPUT" - echo "cloud_env=learn-cloud-storage-api-production" >> "$GITHUB_OUTPUT" - echo "lca_api_env=learn-card-app-api-production" >> "$GITHUB_OUTPUT" - elif [[ "${{ steps.check_release.outputs.is_release }}" == 'true' ]]; then - echo "frontend_env=learn-card-app-production" >> "$GITHUB_OUTPUT" - echo "brain_env=learn-cloud-network-api-production" >> "$GITHUB_OUTPUT" - echo "cloud_env=learn-cloud-storage-api-production" >> "$GITHUB_OUTPUT" - echo "lca_api_env=learn-card-app-api-production" >> "$GITHUB_OUTPUT" - else - echo "frontend_env=learn-card-app-staging" >> "$GITHUB_OUTPUT" - echo "brain_env=learn-cloud-network-api-staging" >> "$GITHUB_OUTPUT" - echo "cloud_env=learn-cloud-storage-api-staging" >> "$GITHUB_OUTPUT" - echo "lca_api_env=learn-card-app-api-staging" >> "$GITHUB_OUTPUT" - fi - - # Skip heavy steps for manual dispatch - we already know what to deploy - - name: Checkout Repo - if: github.event_name != 'workflow_dispatch' - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - name: Fetch main for NX comparison - if: github.event_name != 'workflow_dispatch' - run: git fetch --no-tags --prune origin main - - - name: Use Composite Setup Action - if: github.event_name != 'workflow_dispatch' - uses: ./.github/actions/setup - - - name: Get Affected List - if: github.event_name != 'workflow_dispatch' - id: affected - run: | - affected=$(pnpm exec nx print-affected --base=HEAD~1 --head=HEAD --select=projects) - echo "affected=$affected" >> $GITHUB_OUTPUT - echo "Affected projects: $affected" - - - name: Check version changes for release - if: github.event_name != 'workflow_dispatch' - id: check_versions - run: | - # Check which packages had version changes in this commit - CHANGED_FILES=$(git diff --name-only HEAD~1 HEAD) - - if echo "$CHANGED_FILES" | grep -q "services/learn-card-network/brain-service/package.json"; then - echo "brain_service_changed=true" >> $GITHUB_OUTPUT - echo "Brain service version changed" - else - echo "brain_service_changed=false" >> $GITHUB_OUTPUT - fi - - if echo "$CHANGED_FILES" | grep -q "services/learn-card-network/learn-cloud-service/package.json"; then - echo "learn_cloud_changed=true" >> $GITHUB_OUTPUT - echo "LearnCloud version changed" - else - echo "learn_cloud_changed=false" >> $GITHUB_OUTPUT - fi - - if echo "$CHANGED_FILES" | grep -q "services/learn-card-network/lca-api/package.json"; then - echo "lca_api_changed=true" >> $GITHUB_OUTPUT - echo "LCA API version changed" - else - echo "lca_api_changed=false" >> $GITHUB_OUTPUT - fi - - if echo "$CHANGED_FILES" | grep -q "apps/learn-card-app/package.json"; then - echo "lca_app_changed=true" >> $GITHUB_OUTPUT - echo "LearnCard App version changed" - else - echo "lca_app_changed=false" >> $GITHUB_OUTPUT - fi - - if echo "$CHANGED_FILES" | grep -qE "packages/plugins/didkit-plugin-node/(native|src)/"; then - echo "native_plugin_changed=true" >> $GITHUB_OUTPUT - echo "Native DIDKit plugin changed - will wait for prebuilds" - else - echo "native_plugin_changed=false" >> $GITHUB_OUTPUT - fi - - # ============================================================================ - # BUILD NATIVE PLUGIN (for Lambda deploys - Linux x64) - # ============================================================================ - build-native-plugin: - name: Build Native DIDKit Plugin - runs-on: ubuntu-latest - steps: - - name: Checkout Repo - uses: actions/checkout@v4 - with: - submodules: true - - - name: Setup Node.js - uses: actions/setup-node@v4 - with: - node-version: 24.12.0 - - - name: Install pnpm - uses: pnpm/action-setup@v2 - with: - version: 9 - - - name: Setup Rust - uses: dtolnay/rust-toolchain@stable - with: - toolchain: stable - targets: x86_64-unknown-linux-gnu - - - name: Cache cargo - uses: actions/cache@v4 - with: - path: | - ~/.cargo/registry/index/ - ~/.cargo/registry/cache/ - ~/.cargo/git/db/ - packages/plugins/didkit-plugin-node/native/target/ - key: linux-x64-cargo-${{ hashFiles('**/Cargo.lock') }} - - - name: Install dependencies - run: pnpm install --no-frozen-lockfile - - - name: Build native plugin - working-directory: packages/plugins/didkit-plugin-node - run: | - pnpm exec nx build didkit-plugin-node - strip -x *.node - - - name: Upload native binary - uses: actions/upload-artifact@v4 - with: - name: didkit-native-linux-x64 - path: | - packages/plugins/didkit-plugin-node/*.node - packages/plugins/didkit-plugin-node/dist/** - if-no-files-found: error - retention-days: 1 - - # ============================================================================ - # TESTING (skip on production releases and manual deploys) - # ============================================================================ - test-affected: - name: Test Affected Projects - needs: [determine-affected, build-native-plugin] - if: | - needs.determine-affected.outputs.affected != '' && - needs.determine-affected.outputs.is_release != 'true' && - needs.determine-affected.outputs.is_manual != 'true' - runs-on: ubuntu-latest - environment: ci-tests - steps: - - name: Checkout Repo - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - name: Download native plugin binary - uses: actions/download-artifact@v4 - with: - name: didkit-native-linux-x64 - path: packages/plugins/didkit-plugin-node - - - name: Use Composite Setup Action - uses: ./.github/actions/setup - - - name: Run tests - uses: nick-fields/retry@v2 - with: - timeout_minutes: 10 - max_attempts: 3 - command: pnpm exec nx affected --target=test --base=HEAD~1 --head=HEAD - env: - SEED: ${{ secrets.SEED }} - LEARN_CLOUD_SEED: ${{ secrets.LEARN_CLOUD_SEED }} - - # ============================================================================ - # SERVICE DEPLOYMENTS - # Triggers: - # - Push: Deploy to staging if affected - # - Release: Deploy to production if version changed - # - Manual: Deploy to selected environment if selected - # ============================================================================ - deploy-brain-service: - name: Deploy Brain Service (Network API) - needs: [determine-affected, test-affected, build-native-plugin] - if: | - always() && - !cancelled() && - ( - (needs.determine-affected.outputs.is_manual == 'true' && github.event.inputs.deploy-brain-service == 'true') || - (needs.determine-affected.outputs.is_release == 'true' && needs.determine-affected.outputs.brain_service_changed == 'true') || - (needs.determine-affected.outputs.is_manual != 'true' && needs.determine-affected.outputs.is_release != 'true' && needs.test-affected.result == 'success' && contains(needs.determine-affected.outputs.affected, 'network-brain-service')) - ) - runs-on: ubuntu-latest - environment: ${{ needs.determine-affected.outputs.target_brain_service_env }} - steps: - - name: Checkout Repo - uses: actions/checkout@v4 - - - name: Download native plugin binary - uses: actions/download-artifact@v4 - with: - name: didkit-native-linux-x64 - path: packages/plugins/didkit-plugin-node - - - name: Use Composite Setup Action - uses: ./.github/actions/setup - - - name: Deploy Brain Service Lambda - run: pnpm exec nx serverless-deploy network-brain-service --stage ${{ vars.SERVERLESS_STAGE }} --region ${{ vars.SERVERLESS_REGION }} + # ============================================================================ + # DETERMINE WHAT'S AFFECTED + # ============================================================================ + determine-affected: + name: Determine Affected Projects + runs-on: ubuntu-latest + outputs: + affected: ${{ steps.affected.outputs.affected }} + is_release: ${{ steps.check_release.outputs.is_release }} + is_manual: ${{ steps.check_manual.outputs.is_manual }} + # For production releases, check which services have version changes + brain_service_changed: ${{ steps.check_versions.outputs.brain_service_changed }} + learn_cloud_changed: ${{ steps.check_versions.outputs.learn_cloud_changed }} + lca_api_changed: ${{ steps.check_versions.outputs.lca_api_changed }} + lca_app_changed: ${{ steps.check_versions.outputs.lca_app_changed }} + steps: + # Check these first - no dependencies needed + - name: Check if this is a manual dispatch + id: check_manual + run: | + if [[ "${{ github.event_name }}" == "workflow_dispatch" ]]; then + echo "is_manual=true" >> $GITHUB_OUTPUT + echo "This is a manual dispatch - skipping affected detection" + else + echo "is_manual=false" >> $GITHUB_OUTPUT + fi + + - name: Check if this is a release commit + id: check_release + if: github.event_name != 'workflow_dispatch' + run: | + if [[ "${{ github.event.head_commit.message }}" == *"chore(release):"* ]]; then + echo "is_release=true" >> $GITHUB_OUTPUT + echo "This is a release commit" + else + echo "is_release=false" >> $GITHUB_OUTPUT + fi + + # Skip heavy steps for manual dispatch - we already know what to deploy + - name: Checkout Repo + if: github.event_name != 'workflow_dispatch' + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Fetch main for NX comparison + if: github.event_name != 'workflow_dispatch' + run: git fetch --no-tags --prune origin main + + - name: Use Composite Setup Action + if: github.event_name != 'workflow_dispatch' + uses: ./.github/actions/setup + + - name: Get Affected List + if: github.event_name != 'workflow_dispatch' + id: affected + run: | + affected=$(pnpm exec nx print-affected --base=HEAD~1 --head=HEAD --select=projects) + echo "affected=$affected" >> $GITHUB_OUTPUT + echo "Affected projects: $affected" + + - name: Check version changes for release + if: github.event_name != 'workflow_dispatch' + id: check_versions + run: | + # Check which packages had version changes in this commit + CHANGED_FILES=$(git diff --name-only HEAD~1 HEAD) + + if echo "$CHANGED_FILES" | grep -q "services/learn-card-network/brain-service/package.json"; then + echo "brain_service_changed=true" >> $GITHUB_OUTPUT + echo "Brain service version changed" + else + echo "brain_service_changed=false" >> $GITHUB_OUTPUT + fi + + if echo "$CHANGED_FILES" | grep -q "services/learn-card-network/learn-cloud-service/package.json"; then + echo "learn_cloud_changed=true" >> $GITHUB_OUTPUT + echo "LearnCloud version changed" + else + echo "learn_cloud_changed=false" >> $GITHUB_OUTPUT + fi + + if echo "$CHANGED_FILES" | grep -q "services/learn-card-network/lca-api/package.json"; then + echo "lca_api_changed=true" >> $GITHUB_OUTPUT + echo "LCA API version changed" + else + echo "lca_api_changed=false" >> $GITHUB_OUTPUT + fi + + if echo "$CHANGED_FILES" | grep -q "apps/learn-card-app/package.json"; then + echo "lca_app_changed=true" >> $GITHUB_OUTPUT + echo "LearnCard App version changed" + else + echo "lca_app_changed=false" >> $GITHUB_OUTPUT + fi + + # ============================================================================ + # TESTING (skip on production releases and manual deploys) + # ============================================================================ + test-affected: + name: Test Affected Projects + needs: determine-affected + if: | + needs.determine-affected.outputs.affected != '' && + needs.determine-affected.outputs.is_release != 'true' && + needs.determine-affected.outputs.is_manual != 'true' + runs-on: ubuntu-latest + environment: ci-tests + steps: + - name: Checkout Repo + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Use Composite Setup Action + uses: ./.github/actions/setup + + - name: Run tests + uses: nick-fields/retry@v2 + with: + timeout_minutes: 10 + max_attempts: 3 + command: pnpm exec nx affected --target=test --base=HEAD~1 --head=HEAD + env: + SEED: ${{ secrets.SEED }} + LEARN_CLOUD_SEED: ${{ secrets.LEARN_CLOUD_SEED }} + + # ============================================================================ + # SERVICE DEPLOYMENTS + # Triggers: + # - Push: Deploy to staging if affected + # - Release: Deploy to production if version changed + # - Manual: Deploy to selected environment if selected + # ============================================================================ + deploy-brain-service: + name: Deploy Brain Service (Network API) + needs: [determine-affected, test-affected] + if: | + always() && + !cancelled() && + ( + (needs.determine-affected.outputs.is_manual == 'true' && github.event.inputs.deploy-brain-service == 'true') || + (needs.determine-affected.outputs.is_release == 'true' && needs.determine-affected.outputs.brain_service_changed == 'true') || + (needs.determine-affected.outputs.is_manual != 'true' && needs.determine-affected.outputs.is_release != 'true' && needs.test-affected.result == 'success' && contains(needs.determine-affected.outputs.affected, 'network-brain-service')) + ) + runs-on: ubuntu-latest + environment: ${{ (github.event_name == 'workflow_dispatch' && github.event.inputs.target-environment == 'production' && 'learn-cloud-network-api-production') || (needs.determine-affected.outputs.is_release == 'true' && 'learn-cloud-network-api-production') || 'learn-cloud-network-api-staging' }} + steps: + - name: Checkout Repo + uses: actions/checkout@v4 + + - name: Use Composite Setup Action + uses: ./.github/actions/setup + + - name: Deploy Brain Service Lambda + run: pnpm exec nx serverless-deploy network-brain-service --stage ${{ vars.SERVERLESS_STAGE }} --region ${{ vars.SERVERLESS_REGION }} env: CLIENT_APP_DOMAIN_NAME: ${{ vars.CLIENT_APP_DOMAIN_NAME }} POSTMARK_FROM_EMAIL: ${{ vars.POSTMARK_FROM_EMAIL }} @@ -348,361 +240,345 @@ jobs: SMART_RESUME_CONTRACT_URI: ${{ secrets.SMART_RESUME_CONTRACT_URI }} LOGIN_PROVIDER_DID: ${{ secrets.LOGIN_PROVIDER_DID }} - deploy-learn-cloud: - name: Deploy LearnCloud (Storage API) - needs: [determine-affected, test-affected, build-native-plugin] - if: | - always() && - !cancelled() && - ( - (needs.determine-affected.outputs.is_manual == 'true' && github.event.inputs.deploy-learn-cloud == 'true') || - (needs.determine-affected.outputs.is_release == 'true' && needs.determine-affected.outputs.learn_cloud_changed == 'true') || - (needs.determine-affected.outputs.is_manual != 'true' && needs.determine-affected.outputs.is_release != 'true' && needs.test-affected.result == 'success' && contains(needs.determine-affected.outputs.affected, 'learn-cloud-service')) - ) - runs-on: ubuntu-latest - environment: ${{ needs.determine-affected.outputs.target_learn_cloud_env }} - steps: - - name: Checkout Repo - uses: actions/checkout@v4 - - - name: Download native plugin binary - uses: actions/download-artifact@v4 - with: - name: didkit-native-linux-x64 - path: packages/plugins/didkit-plugin-node - - - name: Use Composite Setup Action - uses: ./.github/actions/setup - - - name: Deploy LearnCloud Lambda - run: pnpm exec nx serverless-deploy learn-cloud-service --stage ${{ vars.SERVERLESS_STAGE }} --region ${{ vars.SERVERLESS_REGION }} - env: - SERVER_URL: ${{ vars.SERVER_URL }} - SERVERLESS_CACHE_INSTANCE_SIZE: ${{ vars.SERVERLESS_CACHE_INSTANCE_SIZE }} - SERVERLESS_HOSTED_ZONE_NAMES: ${{ vars.SERVERLESS_HOSTED_ZONE_NAMES }} - SERVERLESS_DOMAIN_NAME: ${{ vars.SERVERLESS_DOMAIN_NAME }} - SERVERLESS_REGION: ${{ vars.SERVERLESS_REGION }} - SERVERLESS_SERVICE_NAME: ${{ vars.SERVERLESS_SERVICE_NAME }} - LEARN_CLOUD_SEED: ${{ secrets.LEARN_CLOUD_SEED }} - LEARN_CLOUD_MONGO_URI: ${{ secrets.LEARN_CLOUD_MONGO_URI }} - LEARN_CLOUD_MONGO_DB_NAME: ${{ secrets.LEARN_CLOUD_MONGO_DB_NAME }} - XAPI_ENDPOINT: ${{ secrets.XAPI_ENDPOINT }} - XAPI_USERNAME: ${{ secrets.XAPI_USERNAME }} - XAPI_PASSWORD: ${{ secrets.XAPI_PASSWORD }} - RSA_PRIVATE_KEY: ${{ secrets.RSA_PRIVATE_KEY }} - RSA_PUBLIC_KEY: ${{ secrets.RSA_PUBLIC_KEY }} - JWT_SIGNING_KEY: ${{ secrets.JWT_SIGNING_KEY }} - SENTRY_DSN: ${{ secrets.SENTRY_DSN }} - SENTRY_ENV: ${{ secrets.SENTRY_ENV }} - SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} - SENTRY_ORG: ${{ secrets.SENTRY_ORG }} - SENTRY_PROJECT: ${{ secrets.SENTRY_PROJECT }} - - deploy-lca-api: - name: Deploy LCA API Service - needs: [determine-affected, test-affected, build-native-plugin] - if: | - always() && - !cancelled() && - ( - (needs.determine-affected.outputs.is_manual == 'true' && github.event.inputs.deploy-lca-api == 'true') || - (needs.determine-affected.outputs.is_release == 'true' && needs.determine-affected.outputs.lca_api_changed == 'true') || - (needs.determine-affected.outputs.is_manual != 'true' && needs.determine-affected.outputs.is_release != 'true' && needs.test-affected.result == 'success' && contains(needs.determine-affected.outputs.affected, 'lca-api-service')) - ) - runs-on: ubuntu-latest - environment: ${{ needs.determine-affected.outputs.target_lca_api_env }} - steps: - - name: Checkout Repo - uses: actions/checkout@v4 - - - name: Download native plugin binary - uses: actions/download-artifact@v4 - with: - name: didkit-native-linux-x64 - path: packages/plugins/didkit-plugin-node - - - name: Use Composite Setup Action - uses: ./.github/actions/setup - - - name: Deploy LCA API Service Lambda - run: pnpm exec nx serverless-deploy lca-api-service --stage ${{ vars.SERVERLESS_STAGE }} - env: - DOMAIN_NAME: ${{ vars.DOMAIN_NAME }} - SEED: ${{ secrets.SEED }} - METABASE_SECRET_KEY: ${{ secrets.METABASE_SECRET_KEY }} - POSTMARK_SERVER_TOKEN: ${{ secrets.POSTMARK_SERVER_TOKEN }} - POSTMARK_LOGIN_CODE_TEMPLATE_ID: ${{ secrets.POSTMARK_LOGIN_CODE_TEMPLATE_ID }} - POSTMARK_ENDORSEMENT_REQUEST_TEMPLATE_ID: ${{ secrets.POSTMARK_ENDORSEMENT_REQUEST_TEMPLATE_ID }} - POSTMARK_FROM_EMAIL: ${{ secrets.POSTMARK_FROM_EMAIL }} - POSTMARK_BRAND_NAME: ${{ secrets.POSTMARK_BRAND_NAME }} - OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} - AUTHORIZED_DIDS: ${{ secrets.AUTHORIZED_DIDS }} - GOOGLE_APPLICATION_CREDENTIAL: ${{ secrets.GOOGLE_APPLICATION_CREDENTIAL }} - MONGO_URI: ${{ secrets.MONGO_URI }} - MONGO_DB_NAME: ${{ secrets.MONGO_DB_NAME }} - SENTRY_DSN: ${{ secrets.SENTRY_DSN }} - SENTRY_ENV: ${{ secrets.SENTRY_ENV }} - SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} - SENTRY_ORG: ${{ secrets.SENTRY_ORG }} - SENTRY_PROJECT: ${{ secrets.SENTRY_PROJECT }} - GOOGLE_MAPS_API_KEY: ${{ secrets.GOOGLE_MAPS_API_KEY }} - - # ============================================================================ - # SDK GENERATION (after brain-service deploy, only on staging) - # ============================================================================ - generate-sdk: - name: Generate SDK Clients - needs: [determine-affected, deploy-brain-service] - if: | - always() && - needs.deploy-brain-service.result == 'success' && - needs.determine-affected.outputs.is_release != 'true' && - contains(needs.determine-affected.outputs.affected, 'network-brain-service') - uses: ./.github/workflows/open-api-generator.yml + deploy-learn-cloud: + name: Deploy LearnCloud (Storage API) + needs: [determine-affected, test-affected] + if: | + always() && + !cancelled() && + ( + (needs.determine-affected.outputs.is_manual == 'true' && github.event.inputs.deploy-learn-cloud == 'true') || + (needs.determine-affected.outputs.is_release == 'true' && needs.determine-affected.outputs.learn_cloud_changed == 'true') || + (needs.determine-affected.outputs.is_manual != 'true' && needs.determine-affected.outputs.is_release != 'true' && needs.test-affected.result == 'success' && contains(needs.determine-affected.outputs.affected, 'learn-cloud-service')) + ) + runs-on: ubuntu-latest + environment: ${{ (github.event_name == 'workflow_dispatch' && github.event.inputs.target-environment == 'production' && 'learn-cloud-storage-api-production') || (needs.determine-affected.outputs.is_release == 'true' && 'learn-cloud-storage-api-production') || 'learn-cloud-storage-api-staging' }} + steps: + - name: Checkout Repo + uses: actions/checkout@v4 + + - name: Use Composite Setup Action + uses: ./.github/actions/setup + + - name: Deploy LearnCloud Lambda + run: pnpm exec nx serverless-deploy learn-cloud-service --stage ${{ vars.SERVERLESS_STAGE }} --region ${{ vars.SERVERLESS_REGION }} + env: + SERVER_URL: ${{ vars.SERVER_URL }} + SERVERLESS_CACHE_INSTANCE_SIZE: ${{ vars.SERVERLESS_CACHE_INSTANCE_SIZE }} + SERVERLESS_HOSTED_ZONE_NAMES: ${{ vars.SERVERLESS_HOSTED_ZONE_NAMES }} + SERVERLESS_DOMAIN_NAME: ${{ vars.SERVERLESS_DOMAIN_NAME }} + SERVERLESS_REGION: ${{ vars.SERVERLESS_REGION }} + SERVERLESS_SERVICE_NAME: ${{ vars.SERVERLESS_SERVICE_NAME }} + LEARN_CLOUD_SEED: ${{ secrets.LEARN_CLOUD_SEED }} + LEARN_CLOUD_MONGO_URI: ${{ secrets.LEARN_CLOUD_MONGO_URI }} + LEARN_CLOUD_MONGO_DB_NAME: ${{ secrets.LEARN_CLOUD_MONGO_DB_NAME }} + XAPI_ENDPOINT: ${{ secrets.XAPI_ENDPOINT }} + XAPI_USERNAME: ${{ secrets.XAPI_USERNAME }} + XAPI_PASSWORD: ${{ secrets.XAPI_PASSWORD }} + RSA_PRIVATE_KEY: ${{ secrets.RSA_PRIVATE_KEY }} + RSA_PUBLIC_KEY: ${{ secrets.RSA_PUBLIC_KEY }} + JWT_SIGNING_KEY: ${{ secrets.JWT_SIGNING_KEY }} + SENTRY_DSN: ${{ secrets.SENTRY_DSN }} + SENTRY_ENV: ${{ secrets.SENTRY_ENV }} + SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} + SENTRY_ORG: ${{ secrets.SENTRY_ORG }} + SENTRY_PROJECT: ${{ secrets.SENTRY_PROJECT }} + + deploy-lca-api: + name: Deploy LCA API Service + needs: [determine-affected, test-affected] + if: | + always() && + !cancelled() && + ( + (needs.determine-affected.outputs.is_manual == 'true' && github.event.inputs.deploy-lca-api == 'true') || + (needs.determine-affected.outputs.is_release == 'true' && needs.determine-affected.outputs.lca_api_changed == 'true') || + (needs.determine-affected.outputs.is_manual != 'true' && needs.determine-affected.outputs.is_release != 'true' && needs.test-affected.result == 'success' && contains(needs.determine-affected.outputs.affected, 'lca-api-service')) + ) + runs-on: ubuntu-latest + environment: ${{ (github.event_name == 'workflow_dispatch' && github.event.inputs.target-environment == 'production' && 'learn-card-app-api-production') || (needs.determine-affected.outputs.is_release == 'true' && 'learn-card-app-api-production') || 'learn-card-app-api-staging' }} + steps: + - name: Checkout Repo + uses: actions/checkout@v4 + + - name: Use Composite Setup Action + uses: ./.github/actions/setup + + - name: Deploy LCA API Service Lambda + run: pnpm exec nx serverless-deploy lca-api-service --stage ${{ vars.SERVERLESS_STAGE }} + env: + DOMAIN_NAME: ${{ vars.DOMAIN_NAME }} + SEED: ${{ secrets.SEED }} + METABASE_SECRET_KEY: ${{ secrets.METABASE_SECRET_KEY }} + POSTMARK_SERVER_TOKEN: ${{ secrets.POSTMARK_SERVER_TOKEN }} + POSTMARK_LOGIN_CODE_TEMPLATE_ID: ${{ secrets.POSTMARK_LOGIN_CODE_TEMPLATE_ID }} + POSTMARK_ENDORSEMENT_REQUEST_TEMPLATE_ID: ${{ secrets.POSTMARK_ENDORSEMENT_REQUEST_TEMPLATE_ID }} + POSTMARK_FROM_EMAIL: ${{ secrets.POSTMARK_FROM_EMAIL }} + POSTMARK_BRAND_NAME: ${{ secrets.POSTMARK_BRAND_NAME }} + OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} + AUTHORIZED_DIDS: ${{ secrets.AUTHORIZED_DIDS }} + GOOGLE_APPLICATION_CREDENTIAL: ${{ secrets.GOOGLE_APPLICATION_CREDENTIAL }} + MONGO_URI: ${{ secrets.MONGO_URI }} + MONGO_DB_NAME: ${{ secrets.MONGO_DB_NAME }} + SENTRY_DSN: ${{ secrets.SENTRY_DSN }} + SENTRY_ENV: ${{ secrets.SENTRY_ENV }} + SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} + SENTRY_ORG: ${{ secrets.SENTRY_ORG }} + SENTRY_PROJECT: ${{ secrets.SENTRY_PROJECT }} + GOOGLE_MAPS_API_KEY: ${{ secrets.GOOGLE_MAPS_API_KEY }} + + # ============================================================================ + # SDK GENERATION (after brain-service deploy, only on staging) + # ============================================================================ + generate-sdk: + name: Generate SDK Clients + needs: [determine-affected, deploy-brain-service] + if: | + always() && + needs.deploy-brain-service.result == 'success' && + needs.determine-affected.outputs.is_release != 'true' && + contains(needs.determine-affected.outputs.affected, 'network-brain-service') + uses: ./.github/workflows/open-api-generator.yml + with: + affected: ${{ needs.determine-affected.outputs.affected }} + + # ============================================================================ + # FRONTEND DEPLOYMENTS + # For production: Wait for any services that are deploying to complete first + # ============================================================================ + deploy-lca-frontend: + name: Deploy LearnCard App Frontend + needs: + [ + determine-affected, + deploy-brain-service, + deploy-learn-cloud, + deploy-lca-api, + ] + if: | + always() && + !cancelled() && + ( + (needs.determine-affected.outputs.is_manual == 'true' && github.event.inputs.deploy-lca-frontend == 'true') || + (needs.determine-affected.outputs.is_release == 'true' && needs.determine-affected.outputs.lca_app_changed == 'true') + ) && + !contains(needs.deploy-brain-service.result, 'failure') && + !contains(needs.deploy-learn-cloud.result, 'failure') && + !contains(needs.deploy-lca-api.result, 'failure') + runs-on: ubuntu-latest + permissions: + contents: write + environment: ${{ (github.event_name == 'workflow_dispatch' && github.event.inputs.target-environment == 'production' && 'learn-card-app-production') || (needs.determine-affected.outputs.is_release == 'true' && 'learn-card-app-production') || 'learn-card-app-staging' }} + steps: + - name: Checkout Repo + uses: actions/checkout@v4 with: - affected: ${{ needs.determine-affected.outputs.affected }} - - # ============================================================================ - # FRONTEND DEPLOYMENTS - # For production: Wait for any services that are deploying to complete first - # ============================================================================ - deploy-frontend: - name: Deploy Frontend - needs: [determine-affected, deploy-brain-service, deploy-learn-cloud, deploy-lca-api] - if: | - always() && - !cancelled() && - ( - (needs.determine-affected.outputs.is_manual == 'true' && github.event.inputs.deploy-frontend == 'true') || - (needs.determine-affected.outputs.is_release == 'true' && needs.determine-affected.outputs.lca_app_changed == 'true') || - (needs.determine-affected.outputs.is_manual == 'true' && github.event.inputs.target-environment == 'scouts') - ) && - !contains(needs.deploy-brain-service.result, 'failure') && - !contains(needs.deploy-learn-cloud.result, 'failure') && - !contains(needs.deploy-lca-api.result, 'failure') - runs-on: ubuntu-latest - permissions: - contents: write - environment: ${{ needs.determine-affected.outputs.target_frontend_env }} - steps: - - name: Set Deployment Variables - id: vars - run: | - echo "app_id=${{ vars.DEPLOY_APP_ID }}" >> "$GITHUB_OUTPUT" - echo "project_name=${{ vars.DEPLOY_PROJECT_NAME }}" >> "$GITHUB_OUTPUT" - echo "netlify_branch=${{ vars.NETLIFY_BRANCH }}" >> "$GITHUB_OUTPUT" - echo "capgo_id=${{ vars.APP_ID }}" >> "$GITHUB_OUTPUT" - echo "build_path=${{ vars.DEPLOY_BUILD_PATH }}" >> "$GITHUB_OUTPUT" - echo "force_push=${{ vars.DEPLOY_FORCE_PUSH }}" >> "$GITHUB_OUTPUT" - - - name: Checkout Repo - uses: actions/checkout@v4 - with: - fetch-depth: 0 - token: ${{ secrets.GITHUB_TOKEN }} - - - name: Use Composite Setup Action - uses: ./.github/actions/setup - - # Deploy to Netlify by pushing to production branch (Netlify auto-deploys from it) - - name: Push to production branch - if: | - needs.determine-affected.outputs.is_release == 'true' || - (github.event_name == 'workflow_dispatch' && (github.event.inputs.target-environment == 'production' || github.event.inputs.target-environment == 'scouts')) - run: | - if [[ "${{ steps.vars.outputs.force_push }}" == 'true' ]]; then - git push --force origin HEAD:${{ steps.vars.outputs.netlify_branch }} - else - git push origin HEAD:${{ steps.vars.outputs.netlify_branch }} - fi - - - name: Get App Version - id: app-version - run: | - VERSION=$(node -p "require('./apps/${{ steps.vars.outputs.project_name }}/package.json').version") - echo "version=$VERSION" >> "$GITHUB_OUTPUT" - - - name: Get CapGo Channel - id: capgo-channel - run: | - CHANNEL=$(node tools/capgo/getCapgoChannel.js --app ${{ steps.vars.outputs.app_id }}) - echo "channel=$CHANNEL" >> "$GITHUB_OUTPUT" - - - name: Build App - run: pnpm exec nx build ${{ steps.vars.outputs.project_name }} - env: - NODE_ENV: ${{ vars.NODE_ENV }} - VITE_NODE_ENV: ${{ vars.VITE_NODE_ENV }} - SENTRY_ENV: ${{ vars.SENTRY_ENV }} - SENTRY_DSN: ${{ vars.SENTRY_DSN }} - GOOGLE_MAPS_API_KEY: ${{ secrets.GOOGLE_MAPS_API_KEY }} - WEB3AUTH_MAINNET_CLIENT_ID: ${{ secrets.WEB3AUTH_MAINNET_CLIENT_ID }} - WEB3AUTH_TESTNET_CLIENT_ID: ${{ secrets.WEB3AUTH_TESTNET_CLIENT_ID }} - SKIP_DIDKIT_NAPI: "1" - - # Deploy OTA update to CapGo - - name: Upload to CapGo - run: | - npx @capgo/cli@latest bundle upload \ - ${{ steps.vars.outputs.capgo_id }} \ - --delta \ - --apikey ${{ secrets.CAPGO_TOKEN }} \ - --path ${{ steps.vars.outputs.build_path }} \ - --channel ${{ steps.capgo-channel.outputs.channel }} \ - --bundle ${{ steps.app-version.outputs.version }} \ - --package-json apps/${{ steps.vars.outputs.project_name }}/package.json \ - --node-modules apps/${{ steps.vars.outputs.project_name }}/node_modules - - - name: Set CapGo Channel - run: | - npx @capgo/cli@latest channel set ${{ steps.capgo-channel.outputs.channel }} \ - -s default \ - -a ${{ secrets.CAPGO_TOKEN }} \ - -b ${{ steps.app-version.outputs.version }} \ - ${{ steps.vars.outputs.capgo_id }} - - # ============================================================================ - # DOCKER IMAGES - # ============================================================================ - push-docker-images: - name: Push Docker Images - needs: [determine-affected, deploy-brain-service, deploy-learn-cloud] - if: | - always() && - !cancelled() && - ( - (needs.determine-affected.outputs.is_manual == 'true' && github.event.inputs.push-docker == 'true') || - (needs.determine-affected.outputs.is_release == 'true' && (needs.determine-affected.outputs.brain_service_changed == 'true' || needs.determine-affected.outputs.learn_cloud_changed == 'true')) - ) && - !contains(needs.deploy-brain-service.result, 'failure') && - !contains(needs.deploy-learn-cloud.result, 'failure') - runs-on: ubuntu-latest - permissions: - packages: write - contents: read - attestations: write - id-token: write - steps: - - name: Checkout Repo - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - name: Use Composite Setup Action - uses: ./.github/actions/setup - - - name: Login to Docker Hub - uses: docker/login-action@v3 - with: - username: ${{ secrets.DOCKERHUB_USERNAME }} - password: ${{ secrets.DOCKERHUB_TOKEN }} - - - name: Get Brain Service package version - id: brain-service-version - working-directory: './services/learn-card-network/brain-service' - run: | - VERSION=$(node -p "require('./package.json').version") - echo "version=$VERSION" >> "$GITHUB_OUTPUT" - - - name: Extract metadata for Brain Service - id: brain-service-meta - uses: docker/metadata-action@v5 - with: - images: welibrary/lcn-brain-service - tags: | - type=semver,pattern={{version}},value=v${{ steps.brain-service-version.outputs.version }} - - - name: Build and push Brain Service image - uses: docker/build-push-action@v6 - with: - context: . - file: ./services/learn-card-network/brain-service/Dockerfile - push: true - tags: ${{ steps.brain-service-meta.outputs.tags }} - labels: ${{ steps.brain-service-meta.outputs.labels }} - - - name: Get LearnCloud Service package version - id: cloud-service-version - working-directory: './services/learn-card-network/learn-cloud-service' - run: | - VERSION=$(node -p "require('./package.json').version") - echo "version=$VERSION" >> "$GITHUB_OUTPUT" - - - name: Extract metadata for Cloud Service - id: cloud-service-meta - uses: docker/metadata-action@v5 - with: - images: welibrary/lcn-cloud-service - tags: | - type=semver,pattern={{version}},value=v${{ steps.cloud-service-version.outputs.version }} - - - name: Build and push Cloud Service image - uses: docker/build-push-action@v6 - with: - context: . - file: ./services/learn-card-network/learn-cloud-service/Dockerfile - push: true - tags: ${{ steps.cloud-service-meta.outputs.tags }} - labels: ${{ steps.cloud-service-meta.outputs.labels }} - - # ============================================================================ - # NPM PUBLISHING - # ============================================================================ - publish-npm: - name: Publish NPM Packages - needs: [determine-affected, deploy-brain-service, deploy-learn-cloud, deploy-lca-api] - if: | - always() && - !cancelled() && - ( - (needs.determine-affected.outputs.is_manual == 'true' && github.event.inputs.publish-npm == 'true') || - needs.determine-affected.outputs.is_release == 'true' - ) && - !contains(needs.deploy-brain-service.result, 'failure') && - !contains(needs.deploy-learn-cloud.result, 'failure') && - !contains(needs.deploy-lca-api.result, 'failure') - runs-on: ubuntu-latest - permissions: - id-token: write - contents: read - steps: - - name: Checkout Repo - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - name: Use Composite Setup Action - uses: ./.github/actions/setup - - - name: Build packages - run: pnpm exec nx run-many --target=build --exclude docs - - - name: Publish to NPM - run: pnpm publish -r --no-git-checks - - # ============================================================================ - # CHANGESET PR MANAGEMENT (only on non-release, non-manual pushes) - # ============================================================================ - manage-releases: - name: Manage Release PR - needs: determine-affected + fetch-depth: 0 + token: ${{ secrets.GITHUB_TOKEN }} + + - name: Use Composite Setup Action + uses: ./.github/actions/setup + + # Deploy to Netlify by pushing to production branch (Netlify auto-deploys from it) + # Only for production deploys (release commits or manual production deploy) + - name: Push to production branch if: | - needs.determine-affected.outputs.is_release != 'true' && - needs.determine-affected.outputs.is_manual != 'true' - runs-on: ubuntu-latest - steps: - - name: Checkout Repo - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - name: Use Composite Setup Action - uses: ./.github/actions/setup - - - name: Create Release Pull Request - uses: changesets/action@v1 - with: - commit: "chore(release): version packages" - title: "chore(release): version packages" - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + needs.determine-affected.outputs.is_release == 'true' || + (github.event_name == 'workflow_dispatch' && github.event.inputs.target-environment == 'production') + run: git push origin HEAD:production + + - name: Get LearnCard App Version + id: lca-version + run: | + VERSION=$(node -p "require('./apps/learn-card-app/package.json').version") + echo "version=$VERSION" >> "$GITHUB_OUTPUT" + + - name: Get CapGo Channel + id: capgo-channel + run: | + CHANNEL=$(node tools/capgo/getCapgoChannel.js --app lca) + echo "channel=$CHANNEL" >> "$GITHUB_OUTPUT" + + - name: Build LearnCard App + run: pnpm exec nx build learn-card-app + env: + NODE_ENV: ${{ vars.NODE_ENV }} + VITE_NODE_ENV: ${{ vars.VITE_NODE_ENV }} + SENTRY_ENV: ${{ vars.SENTRY_ENV }} + SENTRY_DSN: ${{ vars.SENTRY_DSN }} + GOOGLE_MAPS_API_KEY: ${{ secrets.GOOGLE_MAPS_API_KEY }} + WEB3AUTH_MAINNET_CLIENT_ID: ${{ secrets.WEB3AUTH_MAINNET_CLIENT_ID }} + WEB3AUTH_TESTNET_CLIENT_ID: ${{ secrets.WEB3AUTH_TESTNET_CLIENT_ID }} + + # Deploy OTA update to CapGo + - name: Upload to CapGo + run: | + npx @capgo/cli@latest bundle upload \ + com.learncard.app \ + --delta \ + --apikey ${{ secrets.CAPGO_TOKEN }} \ + --path apps/learn-card-app/build \ + --channel ${{ steps.capgo-channel.outputs.channel }} \ + --bundle ${{ steps.lca-version.outputs.version }} \ + --package-json apps/learn-card-app/package.json \ + --node-modules apps/learn-card-app/node_modules + + - name: Set CapGo Channel + run: | + npx @capgo/cli@latest channel set ${{ steps.capgo-channel.outputs.channel }} \ + -s default \ + -a ${{ secrets.CAPGO_TOKEN }} \ + -b ${{ steps.lca-version.outputs.version }} \ + com.learncard.app + + # ============================================================================ + # DOCKER IMAGES + # ============================================================================ + push-docker-images: + name: Push Docker Images + needs: [determine-affected, deploy-brain-service, deploy-learn-cloud] + if: | + always() && + !cancelled() && + ( + (needs.determine-affected.outputs.is_manual == 'true' && github.event.inputs.push-docker == 'true') || + (needs.determine-affected.outputs.is_release == 'true' && (needs.determine-affected.outputs.brain_service_changed == 'true' || needs.determine-affected.outputs.learn_cloud_changed == 'true')) + ) && + !contains(needs.deploy-brain-service.result, 'failure') && + !contains(needs.deploy-learn-cloud.result, 'failure') + runs-on: ubuntu-latest + permissions: + packages: write + contents: read + attestations: write + id-token: write + steps: + - name: Checkout Repo + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Use Composite Setup Action + uses: ./.github/actions/setup + + - name: Login to Docker Hub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + - name: Get Brain Service package version + id: brain-service-version + working-directory: "./services/learn-card-network/brain-service" + run: | + VERSION=$(node -p "require('./package.json').version") + echo "version=$VERSION" >> "$GITHUB_OUTPUT" + + - name: Extract metadata for Brain Service + id: brain-service-meta + uses: docker/metadata-action@v5 + with: + images: welibrary/lcn-brain-service + tags: | + type=semver,pattern={{version}},value=v${{ steps.brain-service-version.outputs.version }} + + - name: Build and push Brain Service image + uses: docker/build-push-action@v6 + with: + context: . + file: ./services/learn-card-network/brain-service/Dockerfile + push: true + tags: ${{ steps.brain-service-meta.outputs.tags }} + labels: ${{ steps.brain-service-meta.outputs.labels }} + + - name: Get LearnCloud Service package version + id: cloud-service-version + working-directory: "./services/learn-card-network/learn-cloud-service" + run: | + VERSION=$(node -p "require('./package.json').version") + echo "version=$VERSION" >> "$GITHUB_OUTPUT" + + - name: Extract metadata for Cloud Service + id: cloud-service-meta + uses: docker/metadata-action@v5 + with: + images: welibrary/lcn-cloud-service + tags: | + type=semver,pattern={{version}},value=v${{ steps.cloud-service-version.outputs.version }} + + - name: Build and push Cloud Service image + uses: docker/build-push-action@v6 + with: + context: . + file: ./services/learn-card-network/learn-cloud-service/Dockerfile + push: true + tags: ${{ steps.cloud-service-meta.outputs.tags }} + labels: ${{ steps.cloud-service-meta.outputs.labels }} + + # ============================================================================ + # NPM PUBLISHING + # ============================================================================ + publish-npm: + name: Publish NPM Packages + needs: + [ + determine-affected, + deploy-brain-service, + deploy-learn-cloud, + deploy-lca-api, + ] + if: | + always() && + !cancelled() && + ( + (needs.determine-affected.outputs.is_manual == 'true' && github.event.inputs.publish-npm == 'true') || + needs.determine-affected.outputs.is_release == 'true' + ) && + !contains(needs.deploy-brain-service.result, 'failure') && + !contains(needs.deploy-learn-cloud.result, 'failure') && + !contains(needs.deploy-lca-api.result, 'failure') + runs-on: ubuntu-latest + permissions: + id-token: write + contents: read + steps: + - name: Checkout Repo + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Use Composite Setup Action + uses: ./.github/actions/setup + + - name: Build packages + run: pnpm exec nx run-many --target=build --exclude docs + + - name: Publish to NPM + run: pnpm publish -r --no-git-checks + + # ============================================================================ + # CHANGESET PR MANAGEMENT (only on non-release, non-manual pushes) + # ============================================================================ + manage-releases: + name: Manage Release PR + needs: determine-affected + if: | + needs.determine-affected.outputs.is_release != 'true' && + needs.determine-affected.outputs.is_manual != 'true' + runs-on: ubuntu-latest + steps: + - name: Checkout Repo + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Use Composite Setup Action + uses: ./.github/actions/setup + + - name: Create Release Pull Request + uses: changesets/action@v1 + with: + commit: "chore(release): version packages" + title: "chore(release): version packages" + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/didkit-plugin-node-prebuilds.yml b/.github/workflows/didkit-plugin-node-prebuilds.yml deleted file mode 100644 index 810c7cf923..0000000000 --- a/.github/workflows/didkit-plugin-node-prebuilds.yml +++ /dev/null @@ -1,223 +0,0 @@ -name: DIDKit Plugin Node Prebuilds - -on: - push: - branches: - - main - paths: - - 'packages/plugins/didkit-plugin-node/**' - - '.github/workflows/didkit-plugin-node-prebuilds.yml' - pull_request: - paths: - - 'packages/plugins/didkit-plugin-node/**' - - '.github/workflows/didkit-plugin-node-prebuilds.yml' - workflow_dispatch: - -jobs: - build: - strategy: - fail-fast: false - matrix: - settings: - - host: ubuntu-latest - target: x86_64-unknown-linux-gnu - strip: strip -x - node_file: index.linux-x64-gnu.node - - host: ubuntu-latest - target: aarch64-unknown-linux-gnu - strip: aarch64-linux-gnu-strip - node_file: index.linux-arm64-gnu.node - - host: ubuntu-latest - target: x86_64-unknown-linux-musl - docker: ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-alpine - strip: strip - node_file: index.linux-x64-musl.node - - host: ubuntu-latest - target: aarch64-unknown-linux-musl - docker: ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-alpine - strip: /aarch64-linux-musl-cross/bin/aarch64-linux-musl-strip - node_file: index.linux-arm64-musl.node - - host: macos-latest - target: x86_64-apple-darwin - strip: strip -x - node_file: index.darwin-x64.node - - host: macos-latest - target: aarch64-apple-darwin - strip: strip -x - node_file: index.darwin-arm64.node - - name: Build ${{ matrix.settings.target }} - runs-on: ${{ matrix.settings.host }} - - steps: - - uses: actions/checkout@v4 - with: - submodules: true - - - name: Setup Node.js - uses: actions/setup-node@v4 - with: - node-version: 20 - - - name: Install pnpm - uses: pnpm/action-setup@v2 - with: - version: 9 - - - name: Setup Rust - uses: dtolnay/rust-toolchain@stable - with: - toolchain: stable - targets: ${{ matrix.settings.target }} - - - name: Cache cargo - uses: actions/cache@v4 - with: - path: | - ~/.cargo/registry/index/ - ~/.cargo/registry/cache/ - ~/.cargo/git/db/ - .cargo-cache - target/ - key: ${{ matrix.settings.target }}-cargo-${{ hashFiles('**/Cargo.lock') }} - - - name: Install cross-compilation tools (aarch64-linux-gnu) - if: matrix.settings.target == 'aarch64-unknown-linux-gnu' - run: | - sudo apt-get update - sudo apt-get install -y gcc-aarch64-linux-gnu g++-aarch64-linux-gnu - - - name: Install dependencies - run: pnpm install --no-frozen-lockfile - - - name: Build in Docker (x86_64-musl) - if: matrix.settings.target == 'x86_64-unknown-linux-musl' - uses: addnab/docker-run-action@v3 - env: - TARGET: ${{ matrix.settings.target }} - STRIP_CMD: ${{ matrix.settings.strip }} - NODE_FILE: ${{ matrix.settings.node_file }} - with: - image: ${{ matrix.settings.docker }} - options: -v ${{ github.workspace }}:/build -w /build -e TARGET -e STRIP_CMD -e NODE_FILE - run: | - rustup update stable - rustup default stable - rustup target add $TARGET - npm install -g corepack@latest - corepack enable - corepack prepare pnpm@9 --activate - pnpm install --no-frozen-lockfile - pnpm exec nx run didkit-plugin-node:build -- --target $TARGET - $STRIP_CMD packages/plugins/didkit-plugin-node/$NODE_FILE - - - name: Build in Docker (aarch64-musl) - if: matrix.settings.target == 'aarch64-unknown-linux-musl' - uses: addnab/docker-run-action@v3 - env: - TARGET: ${{ matrix.settings.target }} - STRIP_CMD: ${{ matrix.settings.strip }} - NODE_FILE: ${{ matrix.settings.node_file }} - CARGO_TARGET_AARCH64_UNKNOWN_LINUX_MUSL_LINKER: /aarch64-linux-musl-cross/bin/aarch64-linux-musl-gcc - CC_aarch64_unknown_linux_musl: /aarch64-linux-musl-cross/bin/aarch64-linux-musl-gcc - CXX_aarch64_unknown_linux_musl: /aarch64-linux-musl-cross/bin/aarch64-linux-musl-g++ - AR_aarch64_unknown_linux_musl: /aarch64-linux-musl-cross/bin/aarch64-linux-musl-ar - with: - image: ${{ matrix.settings.docker }} - options: -v ${{ github.workspace }}:/build -w /build -e TARGET -e STRIP_CMD -e NODE_FILE -e CARGO_TARGET_AARCH64_UNKNOWN_LINUX_MUSL_LINKER -e CC_aarch64_unknown_linux_musl -e CXX_aarch64_unknown_linux_musl -e AR_aarch64_unknown_linux_musl - run: | - rustup update stable - rustup default stable - rustup target add $TARGET - npm install -g corepack@latest - corepack enable - corepack prepare pnpm@9 --activate - pnpm install --no-frozen-lockfile - pnpm exec nx run didkit-plugin-node:build -- --target $TARGET - $STRIP_CMD packages/plugins/didkit-plugin-node/$NODE_FILE - - - name: Build (aarch64-unknown-linux-gnu) - if: matrix.settings.target == 'aarch64-unknown-linux-gnu' - env: - CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER: aarch64-linux-gnu-gcc - CC_aarch64_unknown_linux_gnu: aarch64-linux-gnu-gcc - CXX_aarch64_unknown_linux_gnu: aarch64-linux-gnu-g++ - AR_aarch64_unknown_linux_gnu: aarch64-linux-gnu-ar - run: | - pnpm exec nx run didkit-plugin-node:build -- --target aarch64-unknown-linux-gnu - ${{ matrix.settings.strip }} packages/plugins/didkit-plugin-node/${{ matrix.settings.node_file }} - shell: bash - - - name: Build - if: ${{ !matrix.settings.docker && matrix.settings.target != 'aarch64-unknown-linux-gnu' }} - run: | - pnpm exec nx run didkit-plugin-node:build ${{ matrix.settings.target != 'x86_64-unknown-linux-gnu' && format('-- --target {0}', matrix.settings.target) || '' }} - ${{ matrix.settings.strip }} packages/plugins/didkit-plugin-node/${{ matrix.settings.node_file }} - shell: bash - - - name: Upload artifacts - uses: actions/upload-artifact@v4 - with: - name: bindings-${{ matrix.settings.target }} - path: packages/plugins/didkit-plugin-node/${{ matrix.settings.node_file }} - if-no-files-found: error - - publish: - name: Publish to npm - needs: build - if: github.ref == 'refs/heads/main' - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - - name: Setup Node.js - uses: actions/setup-node@v4 - with: - node-version: 20 - registry-url: 'https://registry.npmjs.org' - - - name: Install pnpm - uses: pnpm/action-setup@v2 - with: - version: 9 - - - name: Install dependencies - run: pnpm install --no-frozen-lockfile - - - name: Download all artifacts - uses: actions/download-artifact@v4 - with: - path: packages/plugins/didkit-plugin-node - pattern: bindings-* - merge-multiple: true - - - name: List downloaded binaries - run: ls -la packages/plugins/didkit-plugin-node/*.node - - - name: Move artifacts to platform packages - working-directory: packages/plugins/didkit-plugin-node - run: pnpm artifacts - - - name: Build TypeScript - run: pnpm exec nx run didkit-plugin-node:build - - - name: Publish platform packages - working-directory: packages/plugins/didkit-plugin-node - run: pnpm exec napi prepublish -t npm - env: - NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} - - - name: Publish to npm - run: | - cd packages/plugins/didkit-plugin-node - for dir in npm/*; do - if [ -d "$dir" ]; then - echo "Publishing $dir..." - cd "$dir" - npm publish --access public || true - cd ../.. - fi - done - npm publish --access public || true - env: - NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} diff --git a/.github/workflows/fastlane-deploy-native-apps.yml b/.github/workflows/fastlane-deploy-native-apps.yml index 74f9c35f3f..c3c34d8505 100644 --- a/.github/workflows/fastlane-deploy-native-apps.yml +++ b/.github/workflows/fastlane-deploy-native-apps.yml @@ -77,10 +77,10 @@ jobs: steps: - uses: actions/checkout@v3 - - name: Setup Node.js 22.x + - name: Setup Node.js 20.x uses: actions/setup-node@v4 with: - node-version: 22.x + node-version: 20.x - name: Install pnpm uses: pnpm/action-setup@v3 @@ -192,10 +192,10 @@ jobs: steps: - uses: actions/checkout@v3 - - name: Setup Node.js 22.x + - name: Setup Node.js 20.x uses: actions/setup-node@v4 with: - node-version: 22.x + node-version: 20.x - name: Install pnpm uses: pnpm/action-setup@v3 diff --git a/.github/workflows/maids.yml b/.github/workflows/maids.yml index a2f9dc9df8..66569f69eb 100644 --- a/.github/workflows/maids.yml +++ b/.github/workflows/maids.yml @@ -13,61 +13,8 @@ env: CI: true jobs: - build-native-plugin: - name: Build Native DIDKit Plugin - runs-on: ubuntu-latest - steps: - - name: Checkout Repo - uses: actions/checkout@v4 - with: - submodules: true - - - name: Setup Node.js - uses: actions/setup-node@v4 - with: - node-version: 24.12.0 - - - name: Install pnpm - uses: pnpm/action-setup@v2 - with: - version: 9 - - - name: Setup Rust - uses: dtolnay/rust-toolchain@stable - with: - toolchain: stable - targets: x86_64-unknown-linux-gnu - - - name: Cache cargo - uses: actions/cache@v4 - with: - path: | - ~/.cargo/registry/index/ - ~/.cargo/registry/cache/ - ~/.cargo/git/db/ - packages/plugins/didkit-plugin-node/native/target/ - key: linux-x64-cargo-${{ hashFiles('**/Cargo.lock') }} - - - name: Install dependencies - run: pnpm install --no-frozen-lockfile - - - name: Build native plugin - working-directory: packages/plugins/didkit-plugin-node - run: | - pnpm exec nx build didkit-plugin-node - strip -x *.node - - - name: Upload native binary - uses: actions/upload-artifact@v4 - with: - name: didkit-native-linux-x64 - path: packages/plugins/didkit-plugin-node/*.node - if-no-files-found: error - retention-days: 1 - maid-service: name: Maid-Service - needs: [build-native-plugin] runs-on: ubuntu-latest environment: ci-tests steps: @@ -81,12 +28,6 @@ jobs: run: | git fetch --no-tags --prune --depth=5 origin main - - name: Download native plugin binary - uses: actions/download-artifact@v4 - with: - name: didkit-native-linux-x64 - path: packages/plugins/didkit-plugin-node - - name: Setup Node.js 20.x uses: actions/setup-node@v4 with: diff --git a/.github/workflows/publish-to-app-stores.yml b/.github/workflows/publish-to-app-stores.yml index e6ac7f533d..edeebbd4d8 100644 --- a/.github/workflows/publish-to-app-stores.yml +++ b/.github/workflows/publish-to-app-stores.yml @@ -11,7 +11,7 @@ jobs: uses: ./.github/workflows/fastlane-deploy-native-apps.yml with: environment: "learn-card-app-production" - googlePlayReleaseTrack: "production" + googlePlayReleaseTrack: "internal" submitToAppStore: true releaseNotes: "- Critical Bug Fixes and Security Patches" secrets: inherit diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index e4e3cf942d..3f30a13349 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -31,107 +31,3 @@ jobs: env: SEED: ${{ secrets.SEED }} LEARN_CLOUD_SEED: ${{ secrets.LEARN_CLOUD_SEED }} - - # Run E2E tests on changeset release PRs (or test branch for testing) - # SSHs into EC2 to run Playwright tests against the branch - # TODO: Change condition to only 'changeset-release/main' when going live - e2e-tests: - if: github.head_ref == 'lc-1516-e2e-tests' || github.head_ref == 'changeset-release/main' - runs-on: ubuntu-latest - timeout-minutes: 60 - steps: - - name: Start EC2 instance - run: | - echo "Starting EC2 instance..." - curl -s "${{ secrets.E2E_EC2_LAMBDA_URL }}/start" - - - name: Wait for EC2 to be ready - run: | - echo "Waiting for EC2 instance to be ready..." - for i in {1..30}; do - STATUS=$(curl -s "${{ secrets.E2E_EC2_LAMBDA_URL }}/status") - STATE=$(echo "$STATUS" | grep -i "^State:" | awk '{print $2}') - IP=$(echo "$STATUS" | grep -i "^Public IP:" | awk '{print $3}') - - echo "Attempt $i: state=$STATE, ip=$IP" - - if [ "$STATE" = "running" ] && [ -n "$IP" ]; then - echo "EC2 is running, waiting for SSH to be ready..." - for j in {1..30}; do - if nc -z -w5 "$IP" 22 2>/dev/null; then - echo "SSH is ready at $IP" - echo "E2E_EC2_IP=$IP" >> $GITHUB_ENV - exit 0 - fi - echo " SSH not ready yet (attempt $j)..." - sleep 5 - done - echo "Timeout waiting for SSH" - exit 1 - fi - - sleep 10 - done - echo "Timeout waiting for EC2 to be ready" - exit 1 - - - name: Run E2E tests on EC2 - uses: appleboy/ssh-action@v1.0.3 - with: - host: ${{ env.E2E_EC2_IP }} - username: ${{ secrets.E2E_EC2_USERNAME }} - key: ${{ secrets.E2E_EC2_SSH_KEY }} - script_stop: true - command_timeout: 50m - script: | - cd ~/learncard-e2e-runner - git pull origin main - ./scripts/sync-repo.sh ${{ github.head_ref }} - ./scripts/run-tests.sh - - - name: Download Playwright report from EC2 - if: always() - continue-on-error: true - run: | - mkdir -p playwright-report test-results - echo "${{ secrets.E2E_EC2_SSH_KEY }}" > /tmp/ec2_key - chmod 600 /tmp/ec2_key - # Download HTML report - scp -o StrictHostKeyChecking=no -i /tmp/ec2_key -r \ - ${{ secrets.E2E_EC2_USERNAME }}@${{ env.E2E_EC2_IP }}:~/learncard-e2e-runner/workspace/LearnCard/apps/learn-card-app/playwright-report/* \ - playwright-report/ || echo "Failed to download HTML report" - # Download JSON results (for job summary parsing) - scp -o StrictHostKeyChecking=no -i /tmp/ec2_key -r \ - ${{ secrets.E2E_EC2_USERNAME }}@${{ env.E2E_EC2_IP }}:~/learncard-e2e-runner/workspace/LearnCard/apps/learn-card-app/test-results/* \ - test-results/ || echo "Failed to download test results" - rm /tmp/ec2_key - - - name: Upload Playwright report - if: always() - uses: actions/upload-artifact@v4 - with: - name: playwright-report - path: | - playwright-report/ - test-results/ - retention-days: 30 - - - name: Cleanup EC2 (docker down, prune) - if: always() - continue-on-error: true - uses: appleboy/ssh-action@v1.0.3 - with: - host: ${{ env.E2E_EC2_IP }} - username: ${{ secrets.E2E_EC2_USERNAME }} - key: ${{ secrets.E2E_EC2_SSH_KEY }} - script_stop: false - command_timeout: 10m - script: | - cd ~/learncard-e2e-runner - ./scripts/cleanup.sh - - - name: Stop EC2 instance - if: always() - run: | - echo "Stopping EC2 instance..." - curl -s "${{ secrets.E2E_EC2_LAMBDA_URL }}/stop" diff --git a/Dockerfile.monorepo b/Dockerfile.monorepo deleted file mode 100644 index 31f63e2bde..0000000000 --- a/Dockerfile.monorepo +++ /dev/null @@ -1,103 +0,0 @@ -# syntax=docker/dockerfile:1.7 -FROM node:20.10.0-slim - -ENV SKIP_DIDKIT_NAPI=1 - -WORKDIR /app - -RUN --mount=type=cache,target=/var/cache/apt \ - --mount=type=cache,target=/var/lib/apt \ - apt-get update && apt-get install -y --no-install-recommends \ - python3 \ - build-essential \ - && npm install -g pnpm@9.12.3 \ - && pnpm config set store-dir /pnpm/store - -COPY package.json pnpm-lock.yaml pnpm-workspace.yaml nx.json tsconfig.json .npmrc .gitignore .nxignore ./ -COPY tools/executors/workspace/run-command tools/executors/workspace/run-command -COPY tools/scripts tools/scripts -RUN chmod +x /app/tools/scripts/nx-watch-build.sh - -COPY services/learn-card-network/lca-api/package.json services/learn-card-network/lca-api/ -COPY packages/lca-api-client/package.json packages/lca-api-client/ -COPY packages/plugins/lca-api-plugin/package.json packages/plugins/lca-api-plugin/ -COPY packages/learn-card-helpers/package.json packages/learn-card-helpers/ -COPY packages/react-learn-card/package.json packages/react-learn-card/ -COPY packages/learn-card-base/package.json packages/learn-card-base/ -COPY packages/learn-card-types/package.json packages/learn-card-types/ -COPY packages/learn-card-init/package.json packages/learn-card-init/ -COPY packages/learn-card-core/package.json packages/learn-card-core/ -COPY packages/learn-card-network/brain-client/package.json packages/learn-card-network/brain-client/ -COPY packages/learn-card-network/cloud-client/package.json packages/learn-card-network/cloud-client/ -COPY packages/learn-card-network/simple-signing-client/package.json packages/learn-card-network/simple-signing-client/ -COPY services/learn-card-network/brain-service/package.json services/learn-card-network/brain-service/ -COPY services/learn-card-network/learn-cloud-service/package.json services/learn-card-network/learn-cloud-service/ -COPY services/learn-card-network/simple-signing-service/package.json services/learn-card-network/simple-signing-service/ -COPY packages/plugins/chapi/package.json packages/plugins/chapi/ -COPY packages/plugins/crypto/package.json packages/plugins/crypto/ -COPY packages/plugins/ceramic/package.json packages/plugins/ceramic/ -COPY packages/plugins/idx/package.json packages/plugins/idx/ -COPY packages/plugins/didkey/package.json packages/plugins/didkey/ -COPY packages/plugins/didkit/package.json packages/plugins/didkit/ -COPY packages/plugins/didkit-plugin-node/package.json packages/plugins/didkit-plugin-node/ -COPY packages/plugins/did-web-plugin/package.json packages/plugins/did-web-plugin/ -COPY packages/plugins/dynamic-loader/package.json packages/plugins/dynamic-loader/ -COPY packages/plugins/encryption/package.json packages/plugins/encryption/ -COPY packages/plugins/ethereum/package.json packages/plugins/ethereum/ -COPY packages/plugins/expiration/package.json packages/plugins/expiration/ -COPY packages/plugins/learn-card/package.json packages/plugins/learn-card/ -COPY packages/plugins/learn-card-network/package.json packages/plugins/learn-card-network/ -COPY packages/plugins/linked-claims/package.json packages/plugins/linked-claims/ -COPY packages/plugins/learn-cloud/package.json packages/plugins/learn-cloud/ -COPY packages/plugins/open-badge-v2/package.json packages/plugins/open-badge-v2/ -COPY packages/plugins/vc/package.json packages/plugins/vc/ -COPY packages/plugins/vc-api/package.json packages/plugins/vc-api/ -COPY packages/plugins/vc-templates/package.json packages/plugins/vc-templates/ -COPY packages/plugins/vpqr/package.json packages/plugins/vpqr/ -COPY packages/plugins/simple-signing-plugin/package.json packages/plugins/simple-signing-plugin/ -COPY apps/learn-card-app/package.json apps/learn-card-app/ - -RUN --mount=type=cache,id=pnpm-store,target=/pnpm/store \ - pnpm install - -COPY services/learn-card-network/lca-api services/learn-card-network/lca-api -COPY packages/lca-api-client packages/lca-api-client -COPY packages/plugins/lca-api-plugin packages/plugins/lca-api-plugin -COPY packages/learn-card-helpers packages/learn-card-helpers -COPY packages/react-learn-card packages/react-learn-card -COPY packages/learn-card-base packages/learn-card-base -COPY packages/learn-card-types packages/learn-card-types -COPY packages/learn-card-init packages/learn-card-init -COPY packages/learn-card-core packages/learn-card-core -COPY packages/learn-card-network/brain-client packages/learn-card-network/brain-client -COPY packages/learn-card-network/cloud-client packages/learn-card-network/cloud-client -COPY packages/learn-card-network/simple-signing-client packages/learn-card-network/simple-signing-client -COPY services/learn-card-network/brain-service services/learn-card-network/brain-service -COPY services/learn-card-network/learn-cloud-service services/learn-card-network/learn-cloud-service -COPY services/learn-card-network/simple-signing-service services/learn-card-network/simple-signing-service -COPY packages/plugins/chapi packages/plugins/chapi -COPY packages/plugins/crypto packages/plugins/crypto -COPY packages/plugins/ceramic packages/plugins/ceramic -COPY packages/plugins/idx packages/plugins/idx -COPY packages/plugins/didkey packages/plugins/didkey -COPY packages/plugins/didkit packages/plugins/didkit -COPY packages/plugins/didkit-plugin-node packages/plugins/didkit-plugin-node -COPY packages/plugins/did-web-plugin packages/plugins/did-web-plugin -COPY packages/plugins/dynamic-loader packages/plugins/dynamic-loader -COPY packages/plugins/encryption packages/plugins/encryption -COPY packages/plugins/ethereum packages/plugins/ethereum -COPY packages/plugins/expiration packages/plugins/expiration -COPY packages/plugins/learn-card packages/plugins/learn-card -COPY packages/plugins/learn-card-network packages/plugins/learn-card-network -COPY packages/plugins/linked-claims packages/plugins/linked-claims -COPY packages/plugins/learn-cloud packages/plugins/learn-cloud -COPY packages/plugins/open-badge-v2 packages/plugins/open-badge-v2 -COPY packages/plugins/vc packages/plugins/vc -COPY packages/plugins/vc-api packages/plugins/vc-api -COPY packages/plugins/vc-templates packages/plugins/vc-templates -COPY packages/plugins/vpqr packages/plugins/vpqr -COPY packages/plugins/simple-signing-plugin packages/plugins/simple-signing-plugin -COPY apps/learn-card-app apps/learn-card-app - -RUN --mount=type=cache,id=nx-cache,target=/app/.nx \ - pnpm exec nx run-many --target=build:docker --projects=learn-card-app,network-brain-service,learn-cloud-service,lca-api-service diff --git a/apps/learn-card-app/CHANGELOG.md b/apps/learn-card-app/CHANGELOG.md index 8876701b2f..147280751a 100644 --- a/apps/learn-card-app/CHANGELOG.md +++ b/apps/learn-card-app/CHANGELOG.md @@ -1,55 +1,5 @@ # Changelog -## 1.94.19 - -### Patch Changes - -- [#953](https://github.com/learningeconomy/LearnCard/pull/953) [`819bd73226ee1da96109c720543a2fe605381fdd`](https://github.com/learningeconomy/LearnCard/commit/819bd73226ee1da96109c720543a2fe605381fdd) Thanks [@rhen92](https://github.com/rhen92)! - chore: [LC-1476] Open trusted issuer links in in-app browser on native - -- Updated dependencies []: - - @learncard/lca-api-plugin@1.1.9 - -## 1.94.18 - -### Patch Changes - -- Updated dependencies []: - - @learncard/lca-api-plugin@1.1.8 - -## 1.94.17 - -### Patch Changes - -- Updated dependencies []: - - @learncard/lca-api-plugin@1.1.7 - - @learncard/react@2.9.8 - - @learncard/open-badge-v2-plugin@1.1.5 - -## 1.94.16 - -### Patch Changes - -- [#955](https://github.com/learningeconomy/LearnCard/pull/955) [`20868790b68a41fbe001e29ecd98719a988b9e22`](https://github.com/learningeconomy/LearnCard/commit/20868790b68a41fbe001e29ecd98719a988b9e22) Thanks [@Custard7](https://github.com/Custard7)! - fix: Embed Full Screen missing credential acceptance - -## 1.94.15 - -### Patch Changes - -- [#950](https://github.com/learningeconomy/LearnCard/pull/950) [`268ef541499f53b4809f7e4ef4c8da5551aae09e`](https://github.com/learningeconomy/LearnCard/commit/268ef541499f53b4809f7e4ef4c8da5551aae09e) Thanks [@Custard7](https://github.com/Custard7)! - Add app id - -## 1.94.14 - -### Patch Changes - -- [#949](https://github.com/learningeconomy/LearnCard/pull/949) [`f797ad95a9324dd56bc3d22e4e2b07caa0c53d94`](https://github.com/learningeconomy/LearnCard/commit/f797ad95a9324dd56bc3d22e4e2b07caa0c53d94) Thanks [@Custard7](https://github.com/Custard7)! - feat: Enhance Partner Connect - -- [#938](https://github.com/learningeconomy/LearnCard/pull/938) [`20c48c727aade41921e226e3f26922d3798c7b5e`](https://github.com/learningeconomy/LearnCard/commit/20c48c727aade41921e226e3f26922d3798c7b5e) Thanks [@gerardopar](https://github.com/gerardopar)! - chore: [LC-1498] - šŸš€ Migrate Capacitor & Plugins from v7 → v8 + šŸ”„ Firebase v12 - -- [#938](https://github.com/learningeconomy/LearnCard/pull/938) [`20c48c727aade41921e226e3f26922d3798c7b5e`](https://github.com/learningeconomy/LearnCard/commit/20c48c727aade41921e226e3f26922d3798c7b5e) Thanks [@gerardopar](https://github.com/gerardopar)! - chore: [LC-1498] - šŸš€ Migrate Capacitor & Plugins from v7 → v8 + šŸ”„ Firebase v12 - -- Updated dependencies [[`1247b3b2b372626b06d6193b5c9227504c23a3be`](https://github.com/learningeconomy/LearnCard/commit/1247b3b2b372626b06d6193b5c9227504c23a3be), [`1247b3b2b372626b06d6193b5c9227504c23a3be`](https://github.com/learningeconomy/LearnCard/commit/1247b3b2b372626b06d6193b5c9227504c23a3be)]: - - @learncard/react@2.9.7 - ## 1.94.13 ### Patch Changes diff --git a/apps/learn-card-app/Dockerfile b/apps/learn-card-app/Dockerfile index fc24a8f4fd..f7cdfae412 100644 --- a/apps/learn-card-app/Dockerfile +++ b/apps/learn-card-app/Dockerfile @@ -1,19 +1,16 @@ # Use an official Node runtime as the base image -# Using bullseye (Debian 11) to avoid native module build issues on Debian 12 -FROM node:20.10.0-bullseye-slim - -# Skip native DIDKit build (not needed for browser apps, uses WASM fallback) -ENV SKIP_DIDKIT_NAPI=1 +FROM node:20.10.0-slim # Set the working directory in the container WORKDIR /app -# Install build dependencies and pnpm in one layer -RUN apt-get update && apt-get install -y --no-install-recommends \ +# Sometimes we need python to build packages +RUN apt-get update || : && apt-get install -y \ python3 \ - build-essential \ - && rm -rf /var/lib/apt/lists/* \ - && npm install -g pnpm + build-essential + +# Install PNPM package manager +RUN npm install -g pnpm # Copy root workspace files COPY package.json pnpm-lock.yaml pnpm-workspace.yaml nx.json tsconfig.json .npmrc ./ @@ -39,7 +36,6 @@ COPY packages/plugins/ceramic/package.json packages/plugins/ceramic/ COPY packages/plugins/idx/package.json packages/plugins/idx/ COPY packages/plugins/didkey/package.json packages/plugins/didkey/ COPY packages/plugins/didkit/package.json packages/plugins/didkit/ -COPY packages/plugins/didkit-plugin-node/package.json packages/plugins/didkit-plugin-node/ COPY packages/plugins/did-web-plugin/package.json packages/plugins/did-web-plugin/ COPY packages/plugins/dynamic-loader/package.json packages/plugins/dynamic-loader/ COPY packages/plugins/encryption/package.json packages/plugins/encryption/ @@ -79,7 +75,6 @@ COPY packages/plugins/ceramic packages/plugins/ceramic COPY packages/plugins/idx packages/plugins/idx COPY packages/plugins/didkey packages/plugins/didkey COPY packages/plugins/didkit packages/plugins/didkit -COPY packages/plugins/didkit-plugin-node packages/plugins/didkit-plugin-node COPY packages/plugins/did-web-plugin packages/plugins/did-web-plugin COPY packages/plugins/dynamic-loader packages/plugins/dynamic-loader COPY packages/plugins/encryption packages/plugins/encryption diff --git a/apps/learn-card-app/Dockerfile.local b/apps/learn-card-app/Dockerfile.local index e32eab548b..25c7a8c57f 100644 --- a/apps/learn-card-app/Dockerfile.local +++ b/apps/learn-card-app/Dockerfile.local @@ -1,14 +1,100 @@ # Use an official Node runtime as the base image -ARG BASE_IMAGE=learncard-monorepo-local - -FROM ${BASE_IMAGE} - -# Skip native DIDKit build (not needed for browser apps, uses WASM fallback) -ENV SKIP_DIDKIT_NAPI=1 +FROM node:20.10.0-slim # Set the working directory in the container WORKDIR /app +# Sometimes we need python to build packages +RUN apt-get update || : && apt-get install -y \ + python3 \ + build-essential + +# Install PNPM package manager +RUN npm install -g pnpm + +# Copy root workspace files +COPY package.json pnpm-lock.yaml pnpm-workspace.yaml nx.json tsconfig.json .npmrc .gitignore .nxignore ./ +COPY tools/executors/workspace/run-command tools/executors/workspace/run-command + +# Copy dependency manifests for better Docker caching +COPY services/learn-card-network/lca-api/package.json services/learn-card-network/lca-api/ +COPY packages/lca-api-client/package.json packages/lca-api-client/ +COPY packages/plugins/lca-api-plugin/package.json packages/plugins/lca-api-plugin/ +COPY packages/learn-card-helpers/package.json packages/learn-card-helpers/ +COPY packages/react-learn-card/package.json packages/react-learn-card/ +COPY packages/learn-card-base/package.json packages/learn-card-base/ +COPY packages/learn-card-types/package.json packages/learn-card-types/ +COPY packages/learn-card-init/package.json packages/learn-card-init/ +COPY packages/learn-card-core/package.json packages/learn-card-core/ +COPY packages/learn-card-network/brain-client/package.json packages/learn-card-network/brain-client/ +COPY packages/learn-card-network/cloud-client/package.json packages/learn-card-network/cloud-client/ +COPY services/learn-card-network/brain-service/package.json services/learn-card-network/brain-service/ +COPY services/learn-card-network/learn-cloud-service/package.json services/learn-card-network/learn-cloud-service/ +COPY packages/plugins/chapi/package.json packages/plugins/chapi/ +COPY packages/plugins/crypto/package.json packages/plugins/crypto/ +COPY packages/plugins/ceramic/package.json packages/plugins/ceramic/ +COPY packages/plugins/idx/package.json packages/plugins/idx/ +COPY packages/plugins/didkey/package.json packages/plugins/didkey/ +COPY packages/plugins/didkit/package.json packages/plugins/didkit/ +COPY packages/plugins/did-web-plugin/package.json packages/plugins/did-web-plugin/ +COPY packages/plugins/dynamic-loader/package.json packages/plugins/dynamic-loader/ +COPY packages/plugins/encryption/package.json packages/plugins/encryption/ +COPY packages/plugins/ethereum/package.json packages/plugins/ethereum/ +COPY packages/plugins/expiration/package.json packages/plugins/expiration/ +COPY packages/plugins/learn-card/package.json packages/plugins/learn-card/ +COPY packages/plugins/learn-card-network/package.json packages/plugins/learn-card-network/ +COPY packages/plugins/linked-claims/package.json packages/plugins/linked-claims/ +COPY packages/plugins/learn-cloud/package.json packages/plugins/learn-cloud/ +COPY packages/plugins/open-badge-v2/package.json packages/plugins/open-badge-v2/ +COPY packages/plugins/vc/package.json packages/plugins/vc/ +COPY packages/plugins/vc-api/package.json packages/plugins/vc-api/ +COPY packages/plugins/vc-templates/package.json packages/plugins/vc-templates/ +COPY packages/plugins/vpqr/package.json packages/plugins/vpqr/ +COPY apps/learn-card-app/package.json apps/learn-card-app/ + +# Install dependencies - done before copying source for caching +RUN pnpm install --no-frozen-lockfile + +# Copy sources +COPY services/learn-card-network/lca-api services/learn-card-network/lca-api +COPY packages/lca-api-client packages/lca-api-client +COPY packages/plugins/lca-api-plugin packages/plugins/lca-api-plugin +COPY packages/learn-card-helpers packages/learn-card-helpers +COPY packages/react-learn-card packages/react-learn-card +COPY packages/learn-card-base packages/learn-card-base +COPY packages/learn-card-types packages/learn-card-types +COPY packages/learn-card-init packages/learn-card-init +COPY packages/learn-card-core packages/learn-card-core +COPY packages/learn-card-network/brain-client packages/learn-card-network/brain-client +COPY packages/learn-card-network/cloud-client packages/learn-card-network/cloud-client +COPY services/learn-card-network/brain-service services/learn-card-network/brain-service +COPY services/learn-card-network/learn-cloud-service services/learn-card-network/learn-cloud-service +COPY packages/plugins/chapi packages/plugins/chapi +COPY packages/plugins/crypto packages/plugins/crypto +COPY packages/plugins/ceramic packages/plugins/ceramic +COPY packages/plugins/idx packages/plugins/idx +COPY packages/plugins/didkey packages/plugins/didkey +COPY packages/plugins/didkit packages/plugins/didkit +COPY packages/plugins/did-web-plugin packages/plugins/did-web-plugin +COPY packages/plugins/dynamic-loader packages/plugins/dynamic-loader +COPY packages/plugins/encryption packages/plugins/encryption +COPY packages/plugins/ethereum packages/plugins/ethereum +COPY packages/plugins/expiration packages/plugins/expiration +COPY packages/plugins/learn-card packages/plugins/learn-card +COPY packages/plugins/learn-card-network packages/plugins/learn-card-network +COPY packages/plugins/linked-claims packages/plugins/linked-claims +COPY packages/plugins/learn-cloud packages/plugins/learn-cloud +COPY packages/plugins/open-badge-v2 packages/plugins/open-badge-v2 +COPY packages/plugins/vc packages/plugins/vc +COPY packages/plugins/vc-api packages/plugins/vc-api +COPY packages/plugins/vc-templates packages/plugins/vc-templates +COPY packages/plugins/vpqr packages/plugins/vpqr +COPY apps/learn-card-app apps/learn-card-app + +RUN rm -rf node_modules/.cache/nx + +RUN pnpm exec nx docker-build learn-card-app + # Expose the port the app runs on EXPOSE 3000 EXPOSE 4200 diff --git a/apps/learn-card-app/__mocks__/fileMock.ts b/apps/learn-card-app/__mocks__/fileMock.ts deleted file mode 100644 index 602eb23ee2..0000000000 --- a/apps/learn-card-app/__mocks__/fileMock.ts +++ /dev/null @@ -1 +0,0 @@ -export default 'test-file-stub'; diff --git a/apps/learn-card-app/__mocks__/styleMock.ts b/apps/learn-card-app/__mocks__/styleMock.ts deleted file mode 100644 index ff8b4c5632..0000000000 --- a/apps/learn-card-app/__mocks__/styleMock.ts +++ /dev/null @@ -1 +0,0 @@ -export default {}; diff --git a/apps/learn-card-app/android/app/build.gradle b/apps/learn-card-app/android/app/build.gradle index 9e938ea92a..d1c9332de9 100644 --- a/apps/learn-card-app/android/app/build.gradle +++ b/apps/learn-card-app/android/app/build.gradle @@ -1,12 +1,12 @@ apply plugin: 'com.android.application' android { - namespace = 'com.learncard.app' - compileSdk = rootProject.ext.compileSdkVersion + namespace 'com.learncard.app' + compileSdk rootProject.ext.compileSdkVersion defaultConfig { applicationId "com.learncard.app" - minSdkVersion = rootProject.ext.minSdkVersion - targetSdkVersion = rootProject.ext.targetSdkVersion + minSdkVersion rootProject.ext.minSdkVersion + targetSdkVersion rootProject.ext.targetSdkVersion versionCode project.hasProperty('versionCode') ? Integer.parseInt(project.versionCode) : 1 versionName project.hasProperty('versionName') ? project.versionName : "1.0.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" diff --git a/apps/learn-card-app/android/app/src/main/AndroidManifest.xml b/apps/learn-card-app/android/app/src/main/AndroidManifest.xml index d6b02f95dd..186bd1b6da 100644 --- a/apps/learn-card-app/android/app/src/main/AndroidManifest.xml +++ b/apps/learn-card-app/android/app/src/main/AndroidManifest.xml @@ -40,7 +40,7 @@ https://github.com/learningeconomy/LearnCard/pull/938 + defaultChannel: '1.0.2', }, }, }; diff --git a/apps/learn-card-app/compose-local.yaml b/apps/learn-card-app/compose-local.yaml index 89160bad9f..221704afad 100644 --- a/apps/learn-card-app/compose-local.yaml +++ b/apps/learn-card-app/compose-local.yaml @@ -1,311 +1,247 @@ services: - app: - image: learncard-monorepo-local - build: - context: ../../ - dockerfile: Dockerfile.monorepo - container_name: 'lcn-app' - expose: - - 3000 - ports: - - '3000:3000' - command: ['sh', '-c', 'pnpm exec nx docker-start learn-card-app'] - depends_on: - - brain - - cloud - - api - - delete-service - networks: - - learn-card - extra_hosts: - - 'localhost:host-gateway' - environment: - LCN_URL: http://localhost:4000/trpc - LCN_API_URL: http://localhost:4000/api - CLOUD_URL: http://localhost:4100/trpc - API_URL: http://localhost:5100/trpc - SKIP_DIDKIT_NAPI: '1' - # Enable polling for Vite file watching in Docker - CHOKIDAR_USEPOLLING: 'true' - CHOKIDAR_INTERVAL: '1000' - volumes: - - ./src:/app/apps/learn-card-app/src - - ./vite.config.ts:/app/apps/learn-card-app/vite.config.ts - - ../../packages:/app/packages + app: + build: + context: ../../ + dockerfile: apps/learn-card-app/Dockerfile.local + container_name: "lcn-app" + expose: + - 3000 + ports: + - "3000:3000" + depends_on: + - brain + - cloud + - api + - delete-service + networks: + - learn-card + extra_hosts: + - "localhost:host-gateway" + environment: + LCN_URL: http://localhost:4000/trpc + LCN_API_URL: http://localhost:4000/api + CLOUD_URL: http://localhost:4100/trpc + API_URL: http://localhost:5100/trpc + volumes: + - ./src:/app/apps/learn-card-app/src + - ../../packages/learn-card-base/src:/app/packages/learn-card-base/src - watcher: - image: learncard-monorepo-local - container_name: 'lcn-watcher' - user: '${UID:-1000}:${GID:-1000}' - command: - [ - 'pnpm', - 'exec', - 'nx', - 'watch', - '--all', - '--verbose', - '--', - 'sh', - '/app/tools/scripts/nx-watch-build.sh', - ] - networks: - - learn-card - environment: - SKIP_DIDKIT_NAPI: '1' - # Enable polling for file watching in Docker - CHOKIDAR_USEPOLLING: 'true' - CHOKIDAR_INTERVAL: '1000' - volumes: - - ../../packages:/app/packages + delete-service: + build: ../../services/playwright-delete-service + ports: + - "3100:3100" + depends_on: + - neo4j + - mongodb + - redis + - redis2 + - redis3 + extra_hosts: + - "localhost:host-gateway" + networks: + - learn-card + volumes: + - ../../services/playwright-delete-service/index.js:/app/index.js + environment: + PORT: 3100 + __DELETE_SERVICE__NEO4J_URI: bolt://neo4j:7687 + __DELETE_SERVICE__NEO4J_USERNAME: neo4j + __DELETE_SERVICE__NEO4J_PASSWORD: this-is-the-password + __DELETE_SERVICE__MONGO_URI: mongodb://mongodb:27017?ssl=false&replicaSet=rs0 + __DELETE_SERVICE__MONGO_DB_NAME1: learn-cloud + __DELETE_SERVICE__MONGO_DB_NAME2: lca-api + __DELETE_SERVICE__REDIS1_HOST: redis + __DELETE_SERVICE__REDIS1_PORT: 6379 + __DELETE_SERVICE__REDIS2_HOST: redis2 + __DELETE_SERVICE__REDIS2_PORT: 6379 + __DELETE_SERVICE__REDIS3_HOST: redis3 + __DELETE_SERVICE__REDIS3_PORT: 6379 - delete-service: - build: ../../services/playwright-delete-service - ports: - - '3100:3100' - depends_on: - - neo4j - - mongodb - - redis - - redis2 - - redis3 - extra_hosts: - - 'localhost:host-gateway' - networks: - - learn-card - volumes: - - ../../services/playwright-delete-service/index.js:/app/index.js - environment: - PORT: 3100 - __DELETE_SERVICE__NEO4J_URI: bolt://neo4j:7687 - __DELETE_SERVICE__NEO4J_USERNAME: neo4j - __DELETE_SERVICE__NEO4J_PASSWORD: this-is-the-password - __DELETE_SERVICE__MONGO_URI: mongodb://mongodb:27017?ssl=false&replicaSet=rs0 - __DELETE_SERVICE__MONGO_DB_NAME1: learn-cloud - __DELETE_SERVICE__MONGO_DB_NAME2: lca-api - __DELETE_SERVICE__REDIS1_HOST: redis - __DELETE_SERVICE__REDIS1_PORT: 6379 - __DELETE_SERVICE__REDIS2_HOST: redis2 - __DELETE_SERVICE__REDIS2_PORT: 6379 - __DELETE_SERVICE__REDIS3_HOST: redis3 - __DELETE_SERVICE__REDIS3_PORT: 6379 + brain: + image: welibrary/lcn-brain-service + build: + context: ../../ + dockerfile: services/learn-card-network/brain-service/Dockerfile.local + container_name: "lcn-brain-service" + expose: + - 4000 + ports: + - "4000:4000" + depends_on: + neo4j: + condition: service_healthy + redis: + condition: service_started + elasticmq: + condition: service_started + networks: + - learn-card + extra_hosts: + - "localhost:host-gateway" + volumes: + - ../../services/learn-card-network/brain-service/src:/app/services/learn-card-network/brain-service/src + environment: + IS_OFFLINE: true + PORT: 4000 + SEED: a + DOMAIN_NAME: "localhost%3A4000" + NEO4J_URI: ${NEO4J_URI:-bolt://neo4j:7687} + NEO4J_USERNAME: ${NEO4J_USERNAME:-neo4j} + NEO4J_PASSWORD: ${NEO4J_PASSWORD:-this-is-the-password} + REDIS_HOST: ${REDIS_URL:-redis} + REDIS_PORT: ${REDIS_PORT:-6379} + AWS_REGION: ${AWS_REGION:-us-east-1} + AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID:-notARealKey} + AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY:-notARealSecretKey} + NOTIFICATIONS_QUEUE_POLL_URL: ${NOTIFICATIONS_QUEUE_POLL_URL:-http://elasticmq:9324/notifications} + NOTIFICATIONS_QUEUE_URL: ${NOTIFICATIONS_QUEUE_URL:-http://elasticmq:9324/notifications} + SMART_RESUME_CLIENT_ID: ${SMART_RESUME_CLIENT_ID:-5B5AE2CE} + SMART_RESUME_ACCESS_KEY: ${SMART_RESUME_ACCESS_KEY:-BACF7EF16263} + SMART_RESUME_CONTRACT_URI: ${SMART_RESUME_CONTRACT_URI:-lc:network:localhost%3A4000/trpc:contract:a1087887-88ac-4eea-9a70-71b88b728719} - brain: - image: learncard-monorepo-local - build: - context: ../../ - dockerfile: Dockerfile.monorepo - container_name: 'lcn-brain-service' - expose: - - 4000 - ports: - - '4000:4000' - command: ['sh', '-c', 'cd services/learn-card-network/brain-service && pnpm dev'] - depends_on: - neo4j: - condition: service_healthy - redis: - condition: service_started - elasticmq: - condition: service_started - networks: - - learn-card - extra_hosts: - - 'localhost:host-gateway' - volumes: - - ../../services/learn-card-network/brain-service/src:/app/services/learn-card-network/brain-service/src - - ../../services/learn-card-network/brain-service/nodemon.docker.json:/app/services/learn-card-network/brain-service/nodemon.docker.json - - ../../packages:/app/packages - environment: - IS_OFFLINE: true - PORT: 4000 - SEED: a - DOMAIN_NAME: 'localhost%3A4000' - SKIP_DIDKIT_NAPI: '1' - # Enable polling for file watching in Docker - CHOKIDAR_USEPOLLING: 'true' - CHOKIDAR_INTERVAL: '1000' - NEO4J_URI: ${NEO4J_URI:-bolt://neo4j:7687} - NEO4J_USERNAME: ${NEO4J_USERNAME:-neo4j} - NEO4J_PASSWORD: ${NEO4J_PASSWORD:-this-is-the-password} - REDIS_HOST: ${REDIS_URL:-redis} - REDIS_PORT: ${REDIS_PORT:-6379} - AWS_REGION: ${AWS_REGION:-us-east-1} - AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID:-notARealKey} - AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY:-notARealSecretKey} - NOTIFICATIONS_QUEUE_POLL_URL: ${NOTIFICATIONS_QUEUE_POLL_URL:-http://elasticmq:9324/notifications} - NOTIFICATIONS_QUEUE_URL: ${NOTIFICATIONS_QUEUE_URL:-http://elasticmq:9324/notifications} - SMART_RESUME_CLIENT_ID: ${SMART_RESUME_CLIENT_ID:-5B5AE2CE} - SMART_RESUME_ACCESS_KEY: ${SMART_RESUME_ACCESS_KEY:-BACF7EF16263} - SMART_RESUME_CONTRACT_URI: ${SMART_RESUME_CONTRACT_URI:-lc:network:localhost%3A4000/trpc:contract:a1087887-88ac-4eea-9a70-71b88b728719} + cloud: + image: welibrary/lcn-cloud-service + build: + context: ../../ + dockerfile: services/learn-card-network/learn-cloud-service/Dockerfile.local + container_name: "lcn-cloud-service" + expose: + - 4100 + ports: + - "4100:4100" + depends_on: + - mongodb + - redis2 + networks: + - learn-card + extra_hosts: + - "localhost:host-gateway" + volumes: + - ../../services/learn-card-network/learn-cloud-service/src:/app/services/learn-card-network/learn-cloud-service/src + environment: + IS_OFFLINE: true + PORT: 4100 + LEARN_CLOUD_SEED: b + LEARN_CLOUD_MONGO_URI: ${LEARN_CLOUD_MONGO_URI:-mongodb://mongodb:27017?ssl=false&replicaSet=rs0} + LEARN_CLOUD_MONGO_DB_NAME: ${LEARN_CLOUD_MONGO_DB_NAME:-learn-cloud} + REDIS_HOST: redis2 + REDIS_PORT: 6379 - cloud: - image: learncard-monorepo-local - build: - context: ../../ - dockerfile: Dockerfile.monorepo - container_name: 'lcn-cloud-service' - expose: - - 4100 - ports: - - '4100:4100' - command: ['sh', '-c', 'cd services/learn-card-network/learn-cloud-service && pnpm dev'] - depends_on: - - mongodb - - redis2 - networks: - - learn-card - extra_hosts: - - 'localhost:host-gateway' - volumes: - - ../../services/learn-card-network/learn-cloud-service/src:/app/services/learn-card-network/learn-cloud-service/src - - ../../services/learn-card-network/learn-cloud-service/nodemon.docker.json:/app/services/learn-card-network/learn-cloud-service/nodemon.docker.json - - ../../packages:/app/packages - environment: - IS_OFFLINE: true - PORT: 4100 - LEARN_CLOUD_SEED: b - SKIP_DIDKIT_NAPI: '1' - CHOKIDAR_USEPOLLING: 'true' - CHOKIDAR_INTERVAL: '1000' - LEARN_CLOUD_MONGO_URI: ${LEARN_CLOUD_MONGO_URI:-mongodb://mongodb:27017?ssl=false&replicaSet=rs0} - LEARN_CLOUD_MONGO_DB_NAME: ${LEARN_CLOUD_MONGO_DB_NAME:-learn-cloud} - REDIS_HOST: redis2 - REDIS_PORT: 6379 + api: + image: lca-api-service + build: + context: ../../ + dockerfile: services/learn-card-network/lca-api/Dockerfile.local + container_name: "lcn-api-service" + expose: + - 5100 + ports: + - "5100:5100" + depends_on: + - mongodb + - redis3 + networks: + - learn-card + extra_hosts: + - "localhost:host-gateway" + volumes: + - ../../services/learn-card-network/lca-api/src:/app/services/learn-card-network/lca-api/src + environment: + IS_OFFLINE: true + PORT: 5100 + SEED: c + AUTHORIZED_DIDS: did:web:localhost%3A4000 + MONGO_URI: ${MONGO_URI:-mongodb://mongodb:27017?ssl=false&replicaSet=rs0} + MONGO_DB_NAME: ${MONGO_DB_NAME:-lca-api} + REDIS_HOST: redis3 + REDIS_PORT: 6379 + METABASE_SECRET_KEY: ${METABASE_SECRET_KEY:-notARealSecretKey} - api: - image: learncard-monorepo-local - build: - context: ../../ - dockerfile: Dockerfile.monorepo - container_name: 'lcn-api-service' - expose: - - 5100 - ports: - - '5100:5100' - command: ['sh', '-c', 'cd services/learn-card-network/lca-api && pnpm dev'] - depends_on: - - mongodb - - redis3 - networks: - - learn-card - extra_hosts: - - 'localhost:host-gateway' - volumes: - - ../../services/learn-card-network/lca-api/src:/app/services/learn-card-network/lca-api/src - - ../../services/learn-card-network/lca-api/nodemon.docker.json:/app/services/learn-card-network/lca-api/nodemon.docker.json - - ../../packages:/app/packages - environment: - IS_OFFLINE: true - CHOKIDAR_USEPOLLING: 'true' - CHOKIDAR_INTERVAL: '1000' - PORT: 5100 - SEED: c - AUTHORIZED_DIDS: did:web:localhost%3A4000 - SKIP_DIDKIT_NAPI: '1' - MONGO_URI: ${MONGO_URI:-mongodb://mongodb:27017?ssl=false&replicaSet=rs0} - MONGO_DB_NAME: ${MONGO_DB_NAME:-lca-api} - REDIS_HOST: redis3 - REDIS_PORT: 6379 - METABASE_SECRET_KEY: ${METABASE_SECRET_KEY:-notARealSecretKey} + neo4j: + image: neo4j:latest + container_name: "lcn-neo4j" + ports: + - "7687:7687" + - "7474:7474" + healthcheck: + test: ["CMD-SHELL", "wget --no-verbose --tries=1 --spider http://localhost:7474 || exit 1"] + interval: 10s + timeout: 5s + retries: 5 + start_period: 30s + environment: + NEO4J_AUTH: none + networks: + - learn-card - neo4j: - image: neo4j:latest - container_name: 'lcn-neo4j' - ports: - - '7687:7687' - - '7474:7474' - healthcheck: - test: - [ - 'CMD-SHELL', - 'wget --no-verbose --tries=1 --spider http://localhost:7474 || exit 1', - ] - interval: 10s - timeout: 5s - retries: 5 - start_period: 30s - environment: - NEO4J_AUTH: none - networks: - - learn-card + redis: + image: redis:alpine + container_name: "lcn-redis" + environment: + - ALLOW_EMPTY_PASSWORD=${ALLOW_EMPTY_PASSWORD:-yes} + - REDIS_DISABLE_COMMANDS=FLUSHDB,FLUSHALL + ports: + - "6379:${REDIS_PORT:-6379}" + networks: + - learn-card - redis: - image: redis:alpine - container_name: 'lcn-redis' - environment: - - ALLOW_EMPTY_PASSWORD=${ALLOW_EMPTY_PASSWORD:-yes} - - REDIS_DISABLE_COMMANDS=FLUSHDB,FLUSHALL - ports: - - '6379:${REDIS_PORT:-6379}' - networks: - - learn-card + redis2: + image: redis:alpine + container_name: "lcn-redis2" + environment: + - ALLOW_EMPTY_PASSWORD=${ALLOW_EMPTY_PASSWORD:-yes} + - REDIS_DISABLE_COMMANDS=FLUSHDB,FLUSHALL + ports: + - "6380:6379" + networks: + - learn-card - redis2: - image: redis:alpine - container_name: 'lcn-redis2' - environment: - - ALLOW_EMPTY_PASSWORD=${ALLOW_EMPTY_PASSWORD:-yes} - - REDIS_DISABLE_COMMANDS=FLUSHDB,FLUSHALL - ports: - - '6380:6379' - networks: - - learn-card + redis3: + image: redis:alpine + container_name: "lcn-redis3" + environment: + - ALLOW_EMPTY_PASSWORD=${ALLOW_EMPTY_PASSWORD:-yes} + - REDIS_DISABLE_COMMANDS=FLUSHDB,FLUSHALL + ports: + - "6381:6379" + networks: + - learn-card - redis3: - image: redis:alpine - container_name: 'lcn-redis3' - environment: - - ALLOW_EMPTY_PASSWORD=${ALLOW_EMPTY_PASSWORD:-yes} - - REDIS_DISABLE_COMMANDS=FLUSHDB,FLUSHALL - ports: - - '6381:6379' - networks: - - learn-card + mongodb: + command: ["--replSet", "rs0", "--bind_ip_all", "--port", "27017", "--quiet", "--logpath", "/var/log/mongodb/mongod.log"] + container_name: "lcn-mongodb" + image: mongo:latest + expose: + - 27017 + ports: + - 27017:27017 + extra_hosts: + - "localhost:host-gateway" + healthcheck: + test: > + mongosh --host localhost --port 27017 --quiet --eval "try { rs.status().ok } catch (err) { rs.initiate({_id:'rs0',members:[{_id:0,host:'localhost:27017'}]}) }" + interval: 5s + timeout: 30s + start_period: 0s + start_interval: 1s + retries: 30 + networks: + - learn-card - mongodb: - command: - [ - '--replSet', - 'rs0', - '--bind_ip_all', - '--port', - '27017', - '--quiet', - '--logpath', - '/var/log/mongodb/mongod.log', - ] - container_name: 'lcn-mongodb' - image: mongo:latest - expose: - - 27017 - ports: - - 27017:27017 - extra_hosts: - - 'localhost:host-gateway' - healthcheck: - test: > - mongosh --host localhost --port 27017 --quiet --eval "try { rs.status().ok } catch (err) { rs.initiate({_id:'rs0',members:[{_id:0,host:'localhost:27017'}]}) }" - interval: 5s - timeout: 30s - start_period: 0s - start_interval: 1s - retries: 30 - networks: - - learn-card - elasticmq: - image: softwaremill/elasticmq-native - container_name: 'lcn-elasticmq' - depends_on: - - api - expose: - - 9324 - ports: - - '9324:9324' - networks: - - learn-card + elasticmq: + image: softwaremill/elasticmq-native + container_name: "lcn-elasticmq" + depends_on: + - api + expose: + - 9324 + ports: + - "9324:9324" + networks: + - learn-card + networks: - learn-card: - driver: bridge + learn-card: + driver: bridge diff --git a/apps/learn-card-app/compose.yaml b/apps/learn-card-app/compose.yaml index 65fcd9ce93..ff1bdb17ff 100644 --- a/apps/learn-card-app/compose.yaml +++ b/apps/learn-card-app/compose.yaml @@ -143,7 +143,6 @@ services: MONGO_DB_NAME: ${MONGO_DB_NAME:-lca-api} REDIS_URL: redis3 REDIS_PORT: 6379 - METABASE_SECRET_KEY: ${METABASE_SECRET_KEY:-notARealSecretKey} neo4j: image: neo4j:latest diff --git a/apps/learn-card-app/ios/App/App.xcodeproj/project.pbxproj b/apps/learn-card-app/ios/App/App.xcodeproj/project.pbxproj index f1d7219785..fbd66930af 100644 --- a/apps/learn-card-app/ios/App/App.xcodeproj/project.pbxproj +++ b/apps/learn-card-app/ios/App/App.xcodeproj/project.pbxproj @@ -288,7 +288,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 15.6; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -342,7 +342,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 15.6; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; @@ -362,7 +362,7 @@ DEVELOPMENT_TEAM = AW9L6U5B2L; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = AW9L6U5B2L; INFOPLIST_FILE = App/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 15.6; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; OTHER_SWIFT_FLAGS = "$(inherited) \"-D\" \"COCOAPODS\" \"-DDEBUG\""; PRODUCT_BUNDLE_IDENTIFIER = com.learncard.app; @@ -386,7 +386,7 @@ CODE_SIGN_STYLE = Manual; DEVELOPMENT_TEAM = AW9L6U5B2L; INFOPLIST_FILE = App/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 15.6; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.learncard.app; PRODUCT_NAME = "$(TARGET_NAME)"; diff --git a/apps/learn-card-app/ios/App/App/capacitor.config.json b/apps/learn-card-app/ios/App/App/capacitor.config.json index 8c356e0778..637fe8dcee 100644 --- a/apps/learn-card-app/ios/App/App/capacitor.config.json +++ b/apps/learn-card-app/ios/App/App/capacitor.config.json @@ -42,7 +42,7 @@ "CapacitorUpdater": { "appId": "com.learncard.app", "autoUpdate": true, - "defaultChannel": "1.0.3" + "defaultChannel": "1.0.2" } }, "packageClassList": [ diff --git a/apps/learn-card-app/ios/App/Podfile b/apps/learn-card-app/ios/App/Podfile index ed231d85c0..df480feb60 100644 --- a/apps/learn-card-app/ios/App/Podfile +++ b/apps/learn-card-app/ios/App/Podfile @@ -11,7 +11,7 @@ install! 'cocoapods', :disable_input_output_paths => true, :deterministic_uuids def capacitor_pods pod 'Capacitor', :path => '../../../../node_modules/.pnpm/@capacitor+ios@8.0.1_@capacitor+core@8.0.1/node_modules/@capacitor/ios' pod 'CapacitorCordova', :path => '../../../../node_modules/.pnpm/@capacitor+ios@8.0.1_@capacitor+core@8.0.1/node_modules/@capacitor/ios' - pod 'CapacitorCommunityMedia', :path => '../../../../node_modules/.pnpm/@capacitor-community+media@9.0.0_@capacitor+core@8.0.1/node_modules/@capacitor-community/media' + pod 'CapacitorCommunityMedia', :path => '../../../../node_modules/.pnpm/@capacitor-community+media@9.0.1_@capacitor+core@8.0.1/node_modules/@capacitor-community/media' pod 'CapacitorCommunitySqlite', :path => '../../../../node_modules/.pnpm/@capacitor-community+sqlite@7.0.2_@capacitor+core@8.0.1/node_modules/@capacitor-community/sqlite' pod 'CapacitorFirebaseAnalytics', :path => '../../../../node_modules/.pnpm/@capacitor-firebase+analytics@8.0.1_@capacitor+core@8.0.1_firebase@12.8.0/node_modules/@capacitor-firebase/analytics' pod 'CapacitorFirebaseAuthentication', :path => '../../../../node_modules/.pnpm/@capacitor-firebase+authentication@8.0.1_@capacitor+core@8.0.1_firebase@12.8.0/node_modules/@capacitor-firebase/authentication' @@ -21,7 +21,7 @@ def capacitor_pods pod 'CapacitorCamera', :path => '../../../../node_modules/.pnpm/@capacitor+camera@8.0.0_@capacitor+core@8.0.1/node_modules/@capacitor/camera' pod 'CapacitorClipboard', :path => '../../../../node_modules/.pnpm/@capacitor+clipboard@8.0.0_@capacitor+core@8.0.1/node_modules/@capacitor/clipboard' pod 'CapacitorFileTransfer', :path => '../../../../node_modules/.pnpm/@capacitor+file-transfer@2.0.3_@capacitor+core@8.0.1/node_modules/@capacitor/file-transfer' - pod 'CapacitorFilesystem', :path => '../../../../node_modules/.pnpm/@capacitor+filesystem@8.0.0_@capacitor+core@8.0.1/node_modules/@capacitor/filesystem' + pod 'CapacitorFilesystem', :path => '../../../../node_modules/.pnpm/@capacitor+filesystem@8.1.0_@capacitor+core@8.0.1/node_modules/@capacitor/filesystem' pod 'CapacitorHaptics', :path => '../../../../node_modules/.pnpm/@capacitor+haptics@8.0.0_@capacitor+core@8.0.1/node_modules/@capacitor/haptics' pod 'CapacitorKeyboard', :path => '../../../../node_modules/.pnpm/@capacitor+keyboard@8.0.0_@capacitor+core@8.0.1/node_modules/@capacitor/keyboard' pod 'CapacitorLocalNotifications', :path => '../../../../node_modules/.pnpm/@capacitor+local-notifications@8.0.0_@capacitor+core@8.0.1/node_modules/@capacitor/local-notifications' diff --git a/apps/learn-card-app/ios/App/Podfile.lock b/apps/learn-card-app/ios/App/Podfile.lock index 83faf6b244..75dfde8d42 100644 --- a/apps/learn-card-app/ios/App/Podfile.lock +++ b/apps/learn-card-app/ios/App/Podfile.lock @@ -21,7 +21,7 @@ PODS: - Capacitor - CapacitorClipboard (8.0.0): - Capacitor - - CapacitorCommunityMedia (9.0.0): + - CapacitorCommunityMedia (9.0.1): - Capacitor - SDWebImage - CapacitorCommunitySqlite (7.0.2): @@ -29,9 +29,9 @@ PODS: - SQLCipher - ZIPFoundation - CapacitorCordova (8.0.1) - - CapacitorFilesystem (8.0.0): + - CapacitorFilesystem (8.1.0): - Capacitor - - IONFilesystemLib (~> 1.0.1) + - IONFilesystemLib (~> 1.1.0) - CapacitorFileTransfer (2.0.3): - Capacitor - IONFileTransferLib (~> 1.0.1) @@ -187,7 +187,7 @@ PODS: - AppAuth/Core (~> 2.0) - GTMSessionFetcher/Core (< 4.0, >= 3.3) - GTMSessionFetcher/Core (3.5.0) - - IONFilesystemLib (1.0.1) + - IONFilesystemLib (1.1.0) - IONFileTransferLib (1.0.1) - MLImage (1.0.0-beta7) - MLKitBarcodeScanning (7.0.0): @@ -230,10 +230,10 @@ DEPENDENCIES: - "CapacitorBrowser (from `../../../../node_modules/.pnpm/@capacitor+browser@8.0.0_@capacitor+core@8.0.1/node_modules/@capacitor/browser`)" - "CapacitorCamera (from `../../../../node_modules/.pnpm/@capacitor+camera@8.0.0_@capacitor+core@8.0.1/node_modules/@capacitor/camera`)" - "CapacitorClipboard (from `../../../../node_modules/.pnpm/@capacitor+clipboard@8.0.0_@capacitor+core@8.0.1/node_modules/@capacitor/clipboard`)" - - "CapacitorCommunityMedia (from `../../../../node_modules/.pnpm/@capacitor-community+media@9.0.0_@capacitor+core@8.0.1/node_modules/@capacitor-community/media`)" + - "CapacitorCommunityMedia (from `../../../../node_modules/.pnpm/@capacitor-community+media@9.0.1_@capacitor+core@8.0.1/node_modules/@capacitor-community/media`)" - "CapacitorCommunitySqlite (from `../../../../node_modules/.pnpm/@capacitor-community+sqlite@7.0.2_@capacitor+core@8.0.1/node_modules/@capacitor-community/sqlite`)" - "CapacitorCordova (from `../../../../node_modules/.pnpm/@capacitor+ios@8.0.1_@capacitor+core@8.0.1/node_modules/@capacitor/ios`)" - - "CapacitorFilesystem (from `../../../../node_modules/.pnpm/@capacitor+filesystem@8.0.0_@capacitor+core@8.0.1/node_modules/@capacitor/filesystem`)" + - "CapacitorFilesystem (from `../../../../node_modules/.pnpm/@capacitor+filesystem@8.1.0_@capacitor+core@8.0.1/node_modules/@capacitor/filesystem`)" - "CapacitorFileTransfer (from `../../../../node_modules/.pnpm/@capacitor+file-transfer@2.0.3_@capacitor+core@8.0.1/node_modules/@capacitor/file-transfer`)" - "CapacitorFirebaseAnalytics (from `../../../../node_modules/.pnpm/@capacitor-firebase+analytics@8.0.1_@capacitor+core@8.0.1_firebase@12.8.0/node_modules/@capacitor-firebase/analytics`)" - "CapacitorFirebaseAnalytics/AnalyticsWithoutAdIdSupport (from `../../../../node_modules/.pnpm/@capacitor-firebase+analytics@8.0.1_@capacitor+core@8.0.1_firebase@12.8.0/node_modules/@capacitor-firebase/analytics`)" @@ -304,13 +304,13 @@ EXTERNAL SOURCES: CapacitorClipboard: :path: "../../../../node_modules/.pnpm/@capacitor+clipboard@8.0.0_@capacitor+core@8.0.1/node_modules/@capacitor/clipboard" CapacitorCommunityMedia: - :path: "../../../../node_modules/.pnpm/@capacitor-community+media@9.0.0_@capacitor+core@8.0.1/node_modules/@capacitor-community/media" + :path: "../../../../node_modules/.pnpm/@capacitor-community+media@9.0.1_@capacitor+core@8.0.1/node_modules/@capacitor-community/media" CapacitorCommunitySqlite: :path: "../../../../node_modules/.pnpm/@capacitor-community+sqlite@7.0.2_@capacitor+core@8.0.1/node_modules/@capacitor-community/sqlite" CapacitorCordova: :path: "../../../../node_modules/.pnpm/@capacitor+ios@8.0.1_@capacitor+core@8.0.1/node_modules/@capacitor/ios" CapacitorFilesystem: - :path: "../../../../node_modules/.pnpm/@capacitor+filesystem@8.0.0_@capacitor+core@8.0.1/node_modules/@capacitor/filesystem" + :path: "../../../../node_modules/.pnpm/@capacitor+filesystem@8.1.0_@capacitor+core@8.0.1/node_modules/@capacitor/filesystem" CapacitorFileTransfer: :path: "../../../../node_modules/.pnpm/@capacitor+file-transfer@2.0.3_@capacitor+core@8.0.1/node_modules/@capacitor/file-transfer" CapacitorFirebaseAnalytics: @@ -354,10 +354,10 @@ SPEC CHECKSUMS: CapacitorBrowser: b7d7f05f840fe042e46f6528bb8db853e3058fb2 CapacitorCamera: 592acb7ab9fb748e2d8571eb03af30ec4e1ace12 CapacitorClipboard: 61832a3722adc61afed6e0191c8a0e11ba11674d - CapacitorCommunityMedia: de0b02527717081ab4753cd513a0f24f06d95656 + CapacitorCommunityMedia: 8055639f4d2c6314b77e2a6e2515a16cd47100d7 CapacitorCommunitySqlite: a57c58e1c37f4bc250ef01e66b0055cb6ddd775e CapacitorCordova: 0d65b9bb74e995dcecb9463f34f1af2aba6f955c - CapacitorFilesystem: 2cb7c29536024668f333266a2177f8c10bbd9c98 + CapacitorFilesystem: a957d4a4b6860844c4eba5bf441607a5166f92a7 CapacitorFileTransfer: d4c1787491128c91d0e96e3abe1bc45cc1c080da CapacitorFirebaseAnalytics: 19a1c90af1b9eb4c290fd026418f961f3fd0e548 CapacitorFirebaseAuthentication: cb5ddfd40d28ae8522b9af25741ba62eaa939501 @@ -392,7 +392,7 @@ SPEC CHECKSUMS: GoogleUtilities: 00c88b9a86066ef77f0da2fab05f65d7768ed8e1 GTMAppAuth: 217a876b249c3c585a54fd6f73e6b58c4f5c4238 GTMSessionFetcher: 5aea5ba6bd522a239e236100971f10cb71b96ab6 - IONFilesystemLib: 89258b8e3e85465da93127d25d7ce37f977e8a6f + IONFilesystemLib: 50b9a0f3052a9b40b9bedb43f328a8fe222f9f87 IONFileTransferLib: b268561ab0ba7f386eea228c4986b55ba0146ca9 MLImage: 2ab9c968e75f57911c16f4c9d9e8a8e9604a86a1 MLKitBarcodeScanning: 72c6437f13a900833b400136be53a8a5d86f42fa @@ -406,6 +406,6 @@ SPEC CHECKSUMS: Version: de5907f2c5d0f3cf21708db7801d1d5401139486 ZIPFoundation: dfd3d681c4053ff7e2f7350bc4e53b5dba3f5351 -PODFILE CHECKSUM: 7688699c5f947c78ea6bc2fdb5a60ffe87eba642 +PODFILE CHECKSUM: b29ca656c012bb8afc58e42093360261f022998a COCOAPODS: 1.16.2 diff --git a/apps/learn-card-app/netlify.toml b/apps/learn-card-app/netlify.toml index 9f116fb2ee..9a196eb33f 100644 --- a/apps/learn-card-app/netlify.toml +++ b/apps/learn-card-app/netlify.toml @@ -4,7 +4,6 @@ [build.environment] PNPM_FLAGS = "-P false" -SKIP_DIDKIT_NAPI = "1" # Global Context Default [build] command = "pnpm exec nx build learn-card-app --skip-nx-cache" diff --git a/apps/learn-card-app/package.json b/apps/learn-card-app/package.json index fb23cee4df..2516f50438 100644 --- a/apps/learn-card-app/package.json +++ b/apps/learn-card-app/package.json @@ -1,32 +1,32 @@ { "name": "learn-card-app", - "version": "1.94.19", + "version": "1.94.13", "private": true, "dependencies": { - "@capacitor-community/media": "^9.0.0", + "@capacitor-community/media": "^8.0.1", "@capacitor-community/sqlite": "^7.0.1", - "@capacitor-firebase/analytics": "8.0.1", - "@capacitor-firebase/authentication": "^8.0.1", - "@capacitor-mlkit/barcode-scanning": "^8.0.0", - "@capacitor/android": "^8.0.1", - "@capacitor/app": "^8.0.0", - "@capacitor/browser": "^8.0.0", - "@capacitor/camera": "^8.0.0", - "@capacitor/clipboard": "^8.0.0", - "@capacitor/core": "8.0.1", - "@capacitor/file-transfer": "^2.0.3", - "@capacitor/filesystem": "^8.0.0", - "@capacitor/haptics": "^8.0.0", - "@capacitor/ios": "^8.0.1", - "@capacitor/keyboard": "^8.0.0", - "@capacitor/local-notifications": "^8.0.0", - "@capacitor/network": "^8.0.0", - "@capacitor/push-notifications": "^8.0.0", - "@capacitor/share": "^8.0.0", - "@capacitor/splash-screen": "^8.0.0", - "@capacitor/status-bar": "^8.0.0", - "@capawesome/capacitor-badge": "8.0.0", - "@capgo/capacitor-updater": "8.41.12", + "@capacitor-firebase/analytics": "7.3.0", + "@capacitor-firebase/authentication": "^7.3.0", + "@capacitor-mlkit/barcode-scanning": "^7.3.0", + "@capacitor/android": "^7.4.2", + "@capacitor/app": "^7.0.2", + "@capacitor/browser": "^7.0.2", + "@capacitor/camera": "^7.0.2", + "@capacitor/clipboard": "^7.0.2", + "@capacitor/core": "7.4.2", + "@capacitor/file-transfer": "^1.0.6", + "@capacitor/filesystem": "^7.1.4", + "@capacitor/haptics": "^7.0.2", + "@capacitor/ios": "^7.4.2", + "@capacitor/keyboard": "^7.0.2", + "@capacitor/local-notifications": "^7.0.2", + "@capacitor/network": "^7.0.2", + "@capacitor/push-notifications": "^7.0.2", + "@capacitor/share": "^7.0.2", + "@capacitor/splash-screen": "^7.0.2", + "@capacitor/status-bar": "^7.0.2", + "@capawesome/capacitor-badge": "7.0.1", + "@capgo/capacitor-updater": "7.8.7", "@emoji-mart/data": "^1.2.1", "@emoji-mart/react": "^1.1.1", "@headlessui/react": "^2.2.4", @@ -42,6 +42,7 @@ "@sentry/react": "8.34.0", "@tanstack/react-query": "^5.80.3", "@testing-library/jest-dom": "^5.17.0", + "@testing-library/react": "^11.2.7", "@testing-library/user-event": "^12.8.3", "@types/jest": "^26.0.24", "@types/node": "^12.20.55", @@ -59,11 +60,11 @@ "async": "^3.2.6", "base64url": "^3.0.1", "buffer": "^6.0.3", - "capacitor-native-settings": "^7.0.2", - "capacitor-plugin-safe-area": "^5.0.0", + "capacitor-native-settings": "^7.0.1", + "capacitor-plugin-safe-area": "^4.0.0", "crypto-js": "^4.2.0", "emoji-picker-react": "^4.12.0", - "firebase": "12.8.0", + "firebase": "11.10.0", "history": "^5.3.0", "html2canvas": "^1.4.1", "immer": "^10.1.1", @@ -99,6 +100,7 @@ "react-router": "5.3.3", "react-router-dom": "5.3.3", "react-shiki": "^0.5.3", + "recharts": "^3.6.0", "rehype-katex": "^7.0.1", "remark-gfm": "^4.0.1", "remark-math": "^6.0.0", @@ -122,7 +124,6 @@ "serve": "vite", "build": "NODE_OPTIONS=\"--max-old-space-size=16608\" vite build", "docker-build": "LCN_URL=http://localhost:4000/trpc CLOUD_URL=http://localhost:4100/trpc API_URL=http://localhost:5100/trpc NODE_OPTIONS=\"--max-old-space-size=4608\" vite build -d", - "test:unit": "vitest run", "test-playwright": "playwright test", "test-ui": "playwright test --ui", "test": "echo \"Actually we don't want to run playwright tests in CI... Use test-playwright or test-ui if you're not CI\"", @@ -152,14 +153,13 @@ }, "devDependencies": { "@capacitor/assets": "^3.0.5", - "@capacitor/cli": "^8.0.1", + "@capacitor/cli": "^7.0.1", "@capgo/cli": "^7.2.10", "@esbuild-plugins/node-globals-polyfill": "^0.2.3", "@ionic/cli": "^6.20.9", "@netlify/edge-functions": "^2.15.1", "@tailwindcss/line-clamp": "^0.4.4", "@tailwindcss/typography": "^0.5.16", - "@testing-library/react": "^14.3.1", "@types/async": "^3.2.24", "@types/lodash": "^4.17.15", "@types/uuid": "^9.0.8", @@ -174,7 +174,6 @@ "tailwindcss": "^3.4.17", "vite": "4.3.8", "vite-plugin-svgr": "^3.3.0", - "vitest": "^3.0.0", "vite-tsconfig-paths": "4.2.3" }, "description": "An Ionic project" diff --git a/apps/learn-card-app/playwright-global-setup.ts b/apps/learn-card-app/playwright-global-setup.ts index 4b7851e557..3ae34fa563 100644 --- a/apps/learn-card-app/playwright-global-setup.ts +++ b/apps/learn-card-app/playwright-global-setup.ts @@ -1,66 +1,26 @@ -import { chromium, firefox, FullConfig } from '@playwright/test'; +import { chromium, FullConfig } from '@playwright/test'; import { locatorExists } from './tests/test.helpers'; export const globalSetup = async (config: FullConfig) => { - // Run headed if DEBUG_SETUP=true OR if tests are run with --headed flag - const projectHeadless = config.projects?.[0]?.use?.headless; - const isHeaded = process.env.DEBUG_SETUP === 'true' || projectHeadless === false; - - // Use the same browser type as the test project (firefox by default) - const projectName = config.projects?.[0]?.name; - const browserType = projectName === 'firefox' ? firefox : chromium; - console.log(`[GlobalSetup] Using browser: ${projectName || 'chromium'}`); - - const browser = await browserType.launch({ headless: !isHeaded, slowMo: isHeaded ? 500 : 0 }); + const browser = await chromium.launch(); const context = await browser.newContext({ ignoreHTTPSErrors: true }); const page = await context.newPage(); - - console.log('[GlobalSetup] Navigating to:', config.webServer?.url); await page.goto(config.webServer?.url!); - console.log('[GlobalSetup] Page loaded, current URL:', page.url()); - - // Wait for the email textbox to be visible (don't use networkidle - app polls constantly) - const emailInput = page.getByRole('textbox'); - await emailInput.waitFor({ state: 'visible', timeout: 30000 }); - console.log('[GlobalSetup] Email input visible, filling email'); - - await emailInput.fill('demo@learningeconomy.io'); - console.log('[GlobalSetup] Email filled, clicking sign in button'); + await page.getByRole('textbox').fill('demo@learningeconomy.io'); await page.getByRole('button', { name: /sign in with email/i }).click(); - console.log('[GlobalSetup] Sign in clicked, waiting for /wallet/ URL...'); + await page.waitForURL(/wallet/); try { - await page.waitForURL(/wallet/, { timeout: 60000 }); - console.log('[GlobalSetup] Successfully navigated to wallet'); + await page.getByRole('button', { name: /boost/i }).click(); + await locatorExists(page.getByText('Set up your profile to get started!')); + // await page.locator('#ion-input-1').fill('test'); + await page.getByRole('textbox', { name: 'User ID' }).fill('test'); + await page.getByRole('button', { name: /let's go/i }).click(); } catch (error) { - console.error('[GlobalSetup] FAILED waiting for /wallet/ URL'); - console.error('[GlobalSetup] Current URL:', page.url()); - console.error('[GlobalSetup] Page title:', await page.title()); - await page.screenshot({ path: 'test-results/global-setup-failure.png', fullPage: true }); - console.error('[GlobalSetup] Screenshot saved to test-results/global-setup-failure.png'); - throw error; - } - - try { - // Handle role selection screen if it appears - const learnerButton = page.getByText('Learner').first(); - if (await locatorExists(learnerButton, 3000)) { - console.log('[GlobalSetup] Role selection screen detected, clicking Learner'); - await learnerButton.click(); - await page.getByRole('button', { name: /continue/i }).click(); - console.log('[GlobalSetup] Clicked Continue on role selection'); - } - - // Skip profile setup if it appears - const skipButton = page.getByText('Skip For Now'); - if (await locatorExists(skipButton, 3000)) { - console.log('[GlobalSetup] Profile setup screen detected, clicking Skip For Now'); - await skipButton.click(); - } - } catch (error) { - // This is expected and okay - user may already have an account - console.log('[GlobalSetup] Onboarding skipped or already complete'); + // This is expected and okay! + /* console.error('Error making account. Already have one?'); + console.error(error); */ } const state = await page.context().storageState(); @@ -76,13 +36,6 @@ export const globalSetup = async (config: FullConfig) => { // Save signed-in state to 'demoState.json'. await page.context().storageState({ path: 'tests/states/demoState.json' }); - console.log('[GlobalSetup] Saved demoState.json with currentUser:', { - uid: userState.state.currentUser.uid, - email: userState.state.currentUser.email, - name: userState.state.currentUser.name, - }); - } else { - console.error('[GlobalSetup] WARNING: currentUser is null, storage state may be invalid!'); } const context2 = await browser.newContext({ ignoreHTTPSErrors: true }); @@ -94,24 +47,15 @@ export const globalSetup = async (config: FullConfig) => { await page2.waitForURL(/wallet/); try { - // Handle role selection screen if it appears - const learnerButton2 = page2.getByText('Learner').first(); - if (await locatorExists(learnerButton2, 3000)) { - console.log('[GlobalSetup] Role selection screen detected for test2, clicking Learner'); - await learnerButton2.click(); - await page2.getByRole('button', { name: /continue/i }).click(); - console.log('[GlobalSetup] Clicked Continue on role selection for test2'); - } - - // Skip profile setup if it appears - const skipButton2 = page2.getByText('Skip For Now'); - if (await locatorExists(skipButton2, 3000)) { - console.log('[GlobalSetup] Profile setup screen detected for test2, clicking Skip For Now'); - await skipButton2.click(); - } + await page2.getByRole('button', { name: /boost/i }).first().click(); + await locatorExists(page.getByText('Set up your profile to get started!')); + // await page2.locator('#ion-input-1').fill('test2'); + await page2.getByRole('textbox', { name: 'User ID' }).fill('test2'); + await page2.getByRole('button', { name: /let's go/i }).click(); } catch (error) { - // This is expected and okay - user may already have an account - console.log('[GlobalSetup] Onboarding skipped or already complete for test2'); + // This is expected and okay! + /* console.error('Error making account. Already have one?'); + console.error(error); */ } const state2 = await page2.context().storageState(); @@ -127,19 +71,10 @@ export const globalSetup = async (config: FullConfig) => { // We have this check because sometimes it saves null as the current user and // it breaks tests until you revert the change - // Save signed-in state to 'test2State.json'. + // Save signed-in state to 'demoState.json'. await page2.context().storageState({ path: 'tests/states/test2State.json' }); - console.log('[GlobalSetup] Saved test2State.json with currentUser:', { - uid: userState2.state.currentUser.uid, - email: userState2.state.currentUser.email, - name: userState2.state.currentUser.name, - }); - } else { - console.error('[GlobalSetup] WARNING: currentUser2 is null, storage state may be invalid!'); } - console.log('[GlobalSetup] Setup complete, closing browser'); - await browser.close(); }; diff --git a/apps/learn-card-app/playwright.config.ts b/apps/learn-card-app/playwright.config.ts index 4cf6cd219c..0359380297 100644 --- a/apps/learn-card-app/playwright.config.ts +++ b/apps/learn-card-app/playwright.config.ts @@ -34,8 +34,6 @@ const config: PlaywrightTestConfig = { [process.env.CI ? 'dot' : 'list'], ['html', { open: 'never' }], ['json', { outputFile: 'test-results/results.json' }], - // GitHub Actions reporter - shows results in job summary - ...(process.env.CI ? [['github'] as const] : []), ], /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */ use: { diff --git a/apps/learn-card-app/project.json b/apps/learn-card-app/project.json index d3608f272f..053d67a34c 100644 --- a/apps/learn-card-app/project.json +++ b/apps/learn-card-app/project.json @@ -5,51 +5,70 @@ "projectType": "application", "root": "apps/learn-card-app", "tags": [], - "implicitDependencies": ["learn-card-base", "linked-claims-plugin"], + "implicitDependencies": [ + "learn-card-base", + "linked-claims-plugin" + ], "namedInputs": { - "source": ["{projectRoot}/src/**/*"], - "tests": ["{projectRoot}/tests/**/*"], - "report": ["{projectRoot}/coverage/playwright-report/**/*"], - "dist": ["{projectRoot}/build/**/*"] + "source": [ + "{projectRoot}/src/**/*" + ], + "tests": [ + "{projectRoot}/tests/**/*" + ], + "report": [ + "{projectRoot}/coverage/playwright-report/**/*" + ], + "dist": [ + "{projectRoot}/build/**/*" + ] }, "targets": { "build": { "executor": "nx:run-script", - "inputs": ["source"], - "outputs": ["dist"], + "inputs": [ + "source" + ], + "outputs": [ + "dist" + ], "options": { "script": "build" } }, "docker-build": { "executor": "nx:run-script", - "inputs": ["source"], - "outputs": ["dist"], - "dependsOn": ["^build"], - "options": { - "script": "docker-build" - } - }, - "build:docker": { - "executor": "nx:run-script", - "inputs": ["source"], - "outputs": ["dist"], - "dependsOn": ["^build"], + "inputs": [ + "source" + ], + "outputs": [ + "dist" + ], + "dependsOn": [ + "^build" + ], "options": { "script": "docker-build" } }, "docker-start": { "executor": "nx:run-script", - "inputs": ["source"], - "dependsOn": ["^build"], + "inputs": [ + "source" + ], + "dependsOn": [ + "^build" + ], "options": { "script": "docker-start" } }, "test": { "executor": "nx:run-script", - "inputs": ["source", "tests"], + "inputs": [ + "source", + "tests" + ], "options": { "script": "test" } diff --git a/apps/learn-card-app/src/App.test.tsx b/apps/learn-card-app/src/App.test.tsx index 250660be66..8c927a8d7a 100644 --- a/apps/learn-card-app/src/App.test.tsx +++ b/apps/learn-card-app/src/App.test.tsx @@ -1,11 +1,8 @@ import React from 'react'; -import { describe, it, expect } from 'vitest'; import { render } from '@testing-library/react'; import App from './App'; -describe('App', () => { - it('renders without crashing', () => { - const { baseElement } = render(); - expect(baseElement).toBeDefined(); - }); +test('renders without crashing', () => { + const { baseElement } = render(); + expect(baseElement).toBeDefined(); }); diff --git a/apps/learn-card-app/src/AppRouter.tsx b/apps/learn-card-app/src/AppRouter.tsx index d73f6b470d..9255710269 100644 --- a/apps/learn-card-app/src/AppRouter.tsx +++ b/apps/learn-card-app/src/AppRouter.tsx @@ -96,8 +96,7 @@ const AppRouter: React.FC<{ initLoading: boolean }> = ({ initLoading }) => { ['/consent-flow', '/consent-flow-login', '/claim/from-dashboard/', '/chats', '/cli'].includes( location.pathname ) || - (collapsed && aiRoutes.includes(location.pathname) && !isMobile) || - location.pathname.includes('/app-store'); + (collapsed && aiRoutes.includes(location.pathname) && !isMobile) || location.pathname.includes('/app-store'); const { newModal } = useModal(); diff --git a/apps/learn-card-app/src/FullApp.tsx b/apps/learn-card-app/src/FullApp.tsx index ec07bae82c..9a8cd509db 100644 --- a/apps/learn-card-app/src/FullApp.tsx +++ b/apps/learn-card-app/src/FullApp.tsx @@ -27,7 +27,6 @@ import NetworkListener from './components/network-listener/NetworkListener'; import { QRCodeScannerStore } from 'learn-card-base'; import Toast from 'learn-card-base/components/toast/Toast'; -import SdkActivityIndicator from './components/sdk-activity/SdkActivityIndicator'; import ExternalAuthServiceProvider from './pages/sync-my-school/ExternalAuthServiceProvider'; import localforage from 'localforage'; @@ -165,7 +164,6 @@ const FullApp: React.FC = () => { - diff --git a/apps/learn-card-app/src/Routes.tsx b/apps/learn-card-app/src/Routes.tsx index 7714d3a344..6b75a9bc73 100644 --- a/apps/learn-card-app/src/Routes.tsx +++ b/apps/learn-card-app/src/Routes.tsx @@ -14,12 +14,8 @@ import GenericErrorBoundary from './components/generic/GenericErrorBoundary'; const WalletPage = lazyWithRetry(() => import('./pages/wallet/WalletPage')); import LaunchPad from './pages/launchPad/LaunchPad'; -const EmbedAppFullScreen = lazyWithRetry( - () => import('./pages/launchPad/EmbedAppFullScreen') -); -const AppListingPage = lazyWithRetry( - () => import('./pages/launchPad/AppListingPage') -); +const EmbedAppFullScreen = lazyWithRetry(() => import('./pages/launchPad/EmbedAppFullScreen')); +const AppListingPage = lazyWithRetry(() => import('./pages/launchPad/AppListingPage')); const NotificationsPage = lazyWithRetry( () => import('./pages/notificationsPage/NotificationsPage') ); @@ -44,6 +40,7 @@ const BoostCMS = lazyWithRetry(() => import('./components/boost/boostCMS/BoostCM const UpdateBoostCMS = lazyWithRetry(() => import('./components/boost/boostCMS/UpdateBoostCMS')); const SkillsPage = lazyWithRetry(() => import('./pages/skills/SkillsPage')); const AiInsights = lazyWithRetry(() => import('./pages/ai-insights/AiInsights')); +const AiPathways = lazyWithRetry(() => import('./pages/ai-pathways/AiPathways')); const ViewCredsBundle = lazyWithRetry(() => import('./components/creds-bundle/ViewCredsBundle')); const ViewSharedBoost = lazyWithRetry(() => import('./components/creds-bundle/ViewSharedBoost')); const MembershipPage = lazyWithRetry(() => import('./pages/membership/MembershipPage')); @@ -68,9 +65,7 @@ const WalletServiceWorker = lazyWithRetry( () => import('./pages/walletServiceWorker/WalletServiceWorker') ); const ClaimBoost = lazyWithRetry(() => import('./pages/claimBoost/ClaimBoost')); -const ApproveAccount = lazyWithRetry( - () => import('./pages/approveAccount/ApproveAccount') -); +const ApproveAccount = lazyWithRetry(() => import('./pages/approveAccount/ApproveAccount')); import SocialBadgesPage from './pages/socialBadgesPage/SocialBadgesPage'; @@ -95,11 +90,11 @@ const AuthHandoff = lazyWithRetry(() => import('./pages/auth/AuthHandoff')); const DeveloperPortalRoutes = lazyWithRetry( () => import('./pages/appStoreDeveloper/DeveloperPortalRoutes') ); -const AppStoreAdminDashboard = lazyWithRetry( - () => import('./pages/appStoreAdmin/AdminDashboard') -); -const DeveloperPortalProvider = lazyWithRetry( - () => import('./pages/appStoreDeveloper/DeveloperPortalContext').then(m => ({ default: m.DeveloperPortalProvider })) +const AppStoreAdminDashboard = lazyWithRetry(() => import('./pages/appStoreAdmin/AdminDashboard')); +const DeveloperPortalProvider = lazyWithRetry(() => + import('./pages/appStoreDeveloper/DeveloperPortalContext').then(m => ({ + default: m.DeveloperPortalProvider, + })) ); // Wrapper to provide DeveloperPortalContext for admin dashboard @@ -128,6 +123,7 @@ const DevCli = lazyWithRetry(() => import('./pages/devCli/DevCli')); import AiSessionTopicsContainer from './components/ai-sessions/AiSessionTopicsContainer'; import AiSessionsContainer from './components/ai-sessions/AiSessionsContainer'; import UserVerifyEmail from './components/user-profile/UserContact/UserVerifyEmail'; +import AiPathwaysDiscovery from './pages/ai-pathways/ai-pathways-discovery/AiPathwaysDiscovery'; const LearnCardAiChatBot = lazyWithRetry( () => import('./components/new-ai-session/LearnCardAiChatBot/LearnCardAiChatBot') ); @@ -182,9 +178,16 @@ export const Routes: React.FC = () => { {/* App Store Developer Portal - all routes wrapped in context provider */} - - - + + + @@ -207,6 +210,12 @@ export const Routes: React.FC = () => { + + { - + >; -}> = ({ endorsement, setEndorsement }) => { + showDeleteButton?: boolean; +}> = ({ endorsement, setEndorsement, showDeleteButton = false }) => { const getAttachments = ( attachmentType: EndorsementMediaOptionsEnum ): EndorsementMediaAttachment[] => { @@ -38,7 +39,7 @@ export const EndorsementAttachmentsList: React.FC<{ media={attachment} endorsement={endorsement} setEndorsement={setEndorsement} - showDeleteButton + showDeleteButton={showDeleteButton} /> ))} diff --git a/apps/learn-card-app/src/components/boost/boostCMS/BoostPreview/CredentialIssuerInformation.tsx b/apps/learn-card-app/src/components/boost/boostCMS/BoostPreview/CredentialIssuerInformation.tsx index f388aa09ad..ebb566fc67 100644 --- a/apps/learn-card-app/src/components/boost/boostCMS/BoostPreview/CredentialIssuerInformation.tsx +++ b/apps/learn-card-app/src/components/boost/boostCMS/BoostPreview/CredentialIssuerInformation.tsx @@ -4,7 +4,6 @@ import { useKnownDIDRegistry } from 'learn-card-base/hooks/useRegistry'; import CredentialVerificationDisplay from 'learn-card-base/components/CredentialBadge/CredentialVerificationDisplay'; import { useGetVCInfo } from 'learn-card-base'; -import { openExternalLink } from '../../../../helpers/externalLinkHelpers'; import { VC } from '@learncard/types'; @@ -46,16 +45,14 @@ const CredentialIssuerInformation: React.FC = A trusted verifier is an organization that has been officially vetted by a community of peers to reliably confirm that a person's skills, experiences, and credentials are authentic.{' '} - +

@@ -71,12 +68,14 @@ const CredentialIssuerInformation: React.FC = )} {url && ( - + )} @@ -95,12 +94,14 @@ const CredentialIssuerInformation: React.FC =

Credential Engine URL

- + )} diff --git a/apps/learn-card-app/src/components/main-subheader/MainSubHeader.types.ts b/apps/learn-card-app/src/components/main-subheader/MainSubHeader.types.ts index 3c3c3d3cf1..938944c334 100644 --- a/apps/learn-card-app/src/components/main-subheader/MainSubHeader.types.ts +++ b/apps/learn-card-app/src/components/main-subheader/MainSubHeader.types.ts @@ -30,6 +30,7 @@ export enum SubheaderTypeEnum { Achievement = 'achievement', Accomplishment = 'accomplishment', Skill = 'skill', + AiPathways = 'aiPathways', AiInsights = 'aiInsights', Experience = 'experience', Accommodation = 'accommodation', @@ -123,6 +124,15 @@ export const SubheaderContentType: Record< helperText: 'Explore', helperTextClickable: 'your progress', }, + [SubheaderTypeEnum.AiPathways]: { + title: 'AI Pathways', + IconComponent: AiPathwaysIcon, + iconColor: 'text-lime-700', + textColor: 'text-white', + bgColor: 'bg-white', + helperText: 'Your', + helperTextClickable: 'Lessons and careers.', + }, [SubheaderTypeEnum.Job]: { title: 'Experiences', IconComponent: ExperiencesIcon, diff --git a/apps/learn-card-app/src/components/sdk-activity/SdkActivityIndicator.tsx b/apps/learn-card-app/src/components/sdk-activity/SdkActivityIndicator.tsx deleted file mode 100644 index 2ebd13837f..0000000000 --- a/apps/learn-card-app/src/components/sdk-activity/SdkActivityIndicator.tsx +++ /dev/null @@ -1,61 +0,0 @@ -import React, { useState, useEffect } from 'react'; - -import sdkActivityStore from '../../stores/sdkActivityStore'; - -const FRIENDLY_MESSAGES = [ - 'One moment...', - 'Preparing...', - 'Opening...', - 'Almost ready...', - 'Getting things ready...', -]; - -/** - * A subtle fixed-position loading indicator that appears at the top-center - * when SDK/partner-connect operations are in progress. - */ -const SdkActivityIndicator: React.FC = () => { - const isActive = sdkActivityStore.use.isActive(); - const [messageIndex, setMessageIndex] = useState(0); - - // Rotate through friendly messages - useEffect(() => { - if (!isActive) { - setMessageIndex(0); - return; - } - - const interval = setInterval(() => { - setMessageIndex(prev => (prev + 1) % FRIENDLY_MESSAGES.length); - }, 2000); - - return () => clearInterval(interval); - }, [isActive]); - - if (!isActive) return null; - - return ( -
-
- {/* Outer glow ring */} -
- - {/* Main pill */} -
- {/* Animated spinner */} -
-
-
-
- - {/* Rotating friendly text */} - - {FRIENDLY_MESSAGES[messageIndex]} - -
-
-
- ); -}; - -export default SdkActivityIndicator; diff --git a/apps/learn-card-app/src/components/sidemenu/SideMenuSecondaryLinks.tsx b/apps/learn-card-app/src/components/sidemenu/SideMenuSecondaryLinks.tsx index 9f0f7bfc75..ab16c7981c 100644 --- a/apps/learn-card-app/src/components/sidemenu/SideMenuSecondaryLinks.tsx +++ b/apps/learn-card-app/src/components/sidemenu/SideMenuSecondaryLinks.tsx @@ -34,6 +34,7 @@ const SideMenuSecondaryLinks: React.FC<{ const canCreateFamilies = hasFamilyID || flags?.canCreateFamilies; const showAiInsights = flags?.showAiInsights; + const hideAiPathways = flags?.hideAiPathways; const activeTextStyles = colors.linkActiveColor; // text colors const inactiveTextStyles = colors.linkInactiveColor; @@ -96,6 +97,10 @@ const SideMenuSecondaryLinks: React.FC<{ if (link?.path === '/ai/insights' && !showAiInsights) return ; + if (link?.path === '/ai/pathways' && hideAiPathways) { + return ; + } + const IconComponent = iconSet[link.id as keyof typeof iconSet]; const linkPath = link.path; diff --git a/apps/learn-card-app/src/hooks/post-message/useLearnCardMessageHandlers.ts b/apps/learn-card-app/src/hooks/post-message/useLearnCardMessageHandlers.ts index 5d679936ed..379b52f008 100644 --- a/apps/learn-card-app/src/hooks/post-message/useLearnCardMessageHandlers.ts +++ b/apps/learn-card-app/src/hooks/post-message/useLearnCardMessageHandlers.ts @@ -7,7 +7,6 @@ import { useConsentedContracts } from 'learn-card-base/hooks/useConsentedContrac import { ActionHandlers, AppEvent } from './useLearnCardPostMessage'; import { createActionHandlers } from './useLearnCardPostMessage.handlers'; import FullScreenConsentFlow from '../../pages/consentFlow/FullScreenConsentFlow'; -import sdkActivityStore from '../../stores/sdkActivityStore'; interface LaunchConfig { url?: string; @@ -59,85 +58,25 @@ export function useLearnCardMessageHandlers({ [debug] ); - /** - * Generate a consent VP and redirect to the contract's redirect URL in a new tab. - * Returns true if redirect was successful, false otherwise. - */ - const generateVpAndRedirect = useCallback( - async ( - wallet: Awaited>, - contract: { redirectUrl?: string; owner?: { did?: string }; uri?: string } - ): Promise => { - if (!wallet || !contract.redirectUrl) { - return false; - } - - try { - const urlObj = new URL(contract.redirectUrl); - urlObj.searchParams.set('did', wallet.id.did()); - - if (contract.owner?.did) { - const unsignedDelegateCredential = wallet.invoke.newCredential({ - type: 'delegate', - subject: contract.owner.did, - access: ['read', 'write'], - }); - - const delegateCredential = await wallet.invoke.issueCredential( - unsignedDelegateCredential - ); - - const unsignedDidAuthVp: UnsignedVP & { contractUri?: string } = - await wallet.invoke.newPresentation(delegateCredential); - - if (contract.uri) { - unsignedDidAuthVp.contractUri = contract.uri; - } - - const vp = (await wallet.invoke.issuePresentation(unsignedDidAuthVp, { - proofPurpose: 'authentication', - proofFormat: 'jwt', - })) as unknown as string; - - urlObj.searchParams.set('vp', vp); - } - - log('Opening redirect in new tab:', urlObj.toString()); - window.open(urlObj.toString(), '_blank', 'noopener,noreferrer'); - return true; - } catch (error) { - logError('Failed to generate VP for redirect:', error); - return false; - } - }, - [log, logError] - ); - /** * Imperative function to show consent flow and return result */ const showConsentFlow = useCallback( - async ( - contractUri: string, - options?: { redirect?: boolean } - ): Promise<{ granted: boolean }> => { - const { redirect = false } = options ?? {}; - + async (contractUri: string): Promise => { return new Promise(async resolve => { try { + // Fetch the contract using LearnCard wallet const wallet = await initWallet(); if (!wallet) { logError('Wallet not initialized'); - sdkActivityStore.set.endActivity(); - resolve({ granted: false }); + resolve(false); return; } const contract = await wallet.invoke.getContract(contractUri); if (!contract) { logError('Contract not found:', contractUri); - sdkActivityStore.set.endActivity(); - resolve({ granted: false }); + resolve(false); return; } @@ -146,46 +85,31 @@ export function useLearnCardMessageHandlers({ c => c?.contract?.uri === contractUri && c?.status !== 'withdrawn' ); - const isPostConsent = !!consentedContract; - - // If already consented, handle redirect if requested - if (isPostConsent) { - log('User already consented to contract'); - sdkActivityStore.set.endActivity(); - - if (redirect && contract.redirectUrl) { - const success = await generateVpAndRedirect(wallet, contract); - resolve({ granted: success }); - return; - } - - resolve({ granted: true }); - return; - } - - // Not yet consented - show modal const successCallback = () => { log('Consent flow completed'); - resolve({ granted: true }); + resolve(true); closeModal(); }; const handleCancel = () => { log('Consent flow cancelled'); - resolve({ granted: false }); + resolve(false); }; + const isPostConsent = !!consentedContract; + if (isPostConsent) { + resolve(true); + return; + } + + // Open the consent flow modal const consentFlowElement = React.createElement(FullScreenConsentFlow, { contractDetails: contract, - isPostConsent: false, + isPostConsent, hideProfileButton: true, - disableRedirect: !redirect, - successCallback, + successCallback: successCallback, }); - // Hide activity indicator before showing modal - sdkActivityStore.set.endActivity(); - newModal( consentFlowElement, { onClose: handleCancel }, @@ -193,12 +117,11 @@ export function useLearnCardMessageHandlers({ ); } catch (error) { logError('Failed to fetch consent contract:', error); - sdkActivityStore.set.endActivity(); - resolve({ granted: false }); + resolve(false); } }); }, - [initWallet, newModal, closeModal, consentedContracts, log, logError, generateVpAndRedirect] + [initWallet, newModal, closeModal, consentedContracts, log, logError] ); const handlers = useMemo( @@ -210,14 +133,12 @@ export function useLearnCardMessageHandlers({ const learnCard = await initWallet(); if (!learnCard) { - sdkActivityStore.set.endActivity(); throw new Error('LearnCard wallet not initialized. Cannot login.'); } const did = await learnCard.id.did(); const profile = await learnCard.invoke.getProfile(); - sdkActivityStore.set.endActivity(); return { did, profile, @@ -246,7 +167,6 @@ export function useLearnCardMessageHandlers({ 'Skipping consent for installed app with request_identity permission' ); // addTrustedOrigin(origin, appName); - sdkActivityStore.set.endActivity(); resolve(true); return; } @@ -274,9 +194,6 @@ export function useLearnCardMessageHandlers({ // Extract app name from origin if not provided const displayAppName = appName || new URL(origin).hostname; - // Hide activity indicator before showing modal - sdkActivityStore.set.endActivity(); - // Open the login consent modal newModal( React.createElement(LoginConsentModal, { @@ -294,7 +211,6 @@ export function useLearnCardMessageHandlers({ ); } catch (error) { logError('Failed to show login consent modal:', error); - sdkActivityStore.set.endActivity(); resolve(false); } }); @@ -303,7 +219,6 @@ export function useLearnCardMessageHandlers({ const learnCard = await initWallet(); if (!learnCard) { - sdkActivityStore.set.endActivity(); throw new Error('LearnCard wallet not initialized. Cannot login.'); } @@ -314,7 +229,6 @@ export function useLearnCardMessageHandlers({ }); log('Minted delegated token'); - sdkActivityStore.set.endActivity(); if (typeof jwt === 'string') return jwt; @@ -322,12 +236,9 @@ export function useLearnCardMessageHandlers({ }, // Consent handlers - showConsentModal: async ( - contractUri: string, - options?: { redirect?: boolean } - ) => { - log('Consent requested for contract:', contractUri, options); - return showConsentFlow(contractUri, options); + showConsentModal: async (contractUri: string) => { + log('Consent requested for contract:', contractUri); + return showConsentFlow(contractUri); }, // Credential handlers @@ -374,9 +285,6 @@ export function useLearnCardMessageHandlers({ resolve(false); }; - // Hide activity indicator before showing modal - sdkActivityStore.set.endActivity(); - // Open the credential acceptance modal newModal( React.createElement(CredentialAcceptanceModal, { @@ -394,7 +302,6 @@ export function useLearnCardMessageHandlers({ ); } catch (error) { logError('Failed to show credential acceptance modal:', error); - sdkActivityStore.set.endActivity(); resolve(false); } }); @@ -408,7 +315,6 @@ export function useLearnCardMessageHandlers({ 'LearnCloud', true ); - sdkActivityStore.set.endActivity(); return stored.credentialUri; }, getCredentialById: async (id: string) => { @@ -416,7 +322,6 @@ export function useLearnCardMessageHandlers({ const learnCard = await initWallet(); if (!learnCard) { - sdkActivityStore.set.endActivity(); throw new Error( 'LearnCard wallet not initialized. Cannot fetch credential.' ); @@ -425,21 +330,18 @@ export function useLearnCardMessageHandlers({ const credential = await learnCard.read.get(id); log('Fetched credential:', credential); - sdkActivityStore.set.endActivity(); return credential; }, searchCredentials: async (query: any) => { const learnCard = await initWallet(); if (!learnCard) { - sdkActivityStore.set.endActivity(); throw new Error( 'LearnCard wallet not initialized. Cannot search credentials.' ); } if (!learnCard.index.LearnCloud.getPage) { - sdkActivityStore.set.endActivity(); throw new Error( 'LearnCard wallet index not initialized. Cannot search credentials.' ); @@ -456,7 +358,6 @@ export function useLearnCardMessageHandlers({ ); log('Resolved credentials:', resolvedCredentials); - sdkActivityStore.set.endActivity(); return resolvedCredentials; }, showShareCredentialModal: async (credential: any) => { @@ -486,9 +387,6 @@ export function useLearnCardMessageHandlers({ resolve(false); }; - // Hide activity indicator before showing modal - sdkActivityStore.set.endActivity(); - // Open the share credential modal newModal( React.createElement(ShareCredentialModal, { @@ -506,7 +404,6 @@ export function useLearnCardMessageHandlers({ ); } catch (error) { logError('Failed to show share credential modal:', error); - sdkActivityStore.set.endActivity(); resolve(false); } }); @@ -580,9 +477,6 @@ export function useLearnCardMessageHandlers({ resolve(null); }; - // Hide activity indicator before showing modal - sdkActivityStore.set.endActivity(); - // Open the VPR share modal newModal( React.createElement(VprShareModal, { @@ -600,7 +494,6 @@ export function useLearnCardMessageHandlers({ ); } catch (error) { logError('Failed to show VPR modal:', error); - sdkActivityStore.set.endActivity(); resolve(null); } }); @@ -653,9 +546,6 @@ export function useLearnCardMessageHandlers({ resolve(null); }; - // Hide activity indicator before showing modal - sdkActivityStore.set.endActivity(); - // Open the sign credential modal newModal( React.createElement(SignCredentialModal, { @@ -673,7 +563,6 @@ export function useLearnCardMessageHandlers({ ); } catch (error) { logError('Failed to show sign credential modal:', error); - sdkActivityStore.set.endActivity(); resolve(null); } }); @@ -685,7 +574,6 @@ export function useLearnCardMessageHandlers({ const learnCard = await initWallet(); if (!learnCard) { - sdkActivityStore.set.endActivity(); throw new Error( 'LearnCard wallet not initialized. Cannot sign presentation.' ); @@ -704,11 +592,9 @@ export function useLearnCardMessageHandlers({ }); log('Signed presentation:', signedPresentation); - sdkActivityStore.set.endActivity(); return signedPresentation; } catch (error) { logError('Error signing presentation:', error); - sdkActivityStore.set.endActivity(); return null; } }, @@ -723,7 +609,6 @@ export function useLearnCardMessageHandlers({ if (onNavigate) { onNavigate(); } - sdkActivityStore.set.endActivity(); }, // Boost template issue handler @@ -733,7 +618,6 @@ export function useLearnCardMessageHandlers({ const learnCard = await initWallet(); if (!learnCard) { logError('Wallet not initialized'); - sdkActivityStore.set.endActivity(); resolve(false); return; } @@ -741,7 +625,6 @@ export function useLearnCardMessageHandlers({ const profileId = (await learnCard.invoke.getProfile())?.profileId; if (!profileId) { logError('Profile ID not found'); - sdkActivityStore.set.endActivity(); resolve(false); return; } @@ -750,7 +633,6 @@ export function useLearnCardMessageHandlers({ const boost = await learnCard.invoke.getBoost(templateId); if (!boost) { logError('Boost template not found:', templateId); - sdkActivityStore.set.endActivity(); resolve(false); return; } @@ -784,9 +666,6 @@ export function useLearnCardMessageHandlers({ did: recipient, })) || []; - // Hide activity indicator before showing modal - sdkActivityStore.set.endActivity(); - // Open the short boost modal newModal( React.createElement(ShortBoostUserOptions, { @@ -815,7 +694,6 @@ export function useLearnCardMessageHandlers({ ); } catch (error) { logError('Failed to show boost issue modal:', error); - sdkActivityStore.set.endActivity(); resolve(false); } }); @@ -825,7 +703,6 @@ export function useLearnCardMessageHandlers({ const learnCard = await initWallet(); if (!learnCard) { logError('Wallet not initialized'); - sdkActivityStore.set.endActivity(); return false; } @@ -834,7 +711,6 @@ export function useLearnCardMessageHandlers({ if (!boost) { logError('Boost template not found:', templateId); - sdkActivityStore.set.endActivity(); return false; } @@ -842,11 +718,9 @@ export function useLearnCardMessageHandlers({ // This covers: admin status, explicit canIssue permission, or defaultPermissions.canIssue const permissions = await learnCard.invoke.getBoostPermissions(templateId); - sdkActivityStore.set.endActivity(); return Boolean(permissions?.canIssue); } catch (error) { logError('Failed to check issue permission:', error); - sdkActivityStore.set.endActivity(); return false; } }, @@ -856,13 +730,9 @@ export function useLearnCardMessageHandlers({ ? async (listingId: string, event: AppEvent) => { const learnCard = await initWallet(); - if (!learnCard) { - sdkActivityStore.set.endActivity(); - throw new Error('Wallet not initialized'); - } + if (!learnCard) throw new Error('Wallet not initialized'); if (!learnCard.invoke.sendAppEvent) { - sdkActivityStore.set.endActivity(); throw new Error('sendAppEvent not available - rebuild types'); } @@ -876,7 +746,6 @@ export function useLearnCardMessageHandlers({ ); } - sdkActivityStore.set.endActivity(); return result; } : undefined, diff --git a/apps/learn-card-app/src/hooks/post-message/useLearnCardPostMessage.handlers.ts b/apps/learn-card-app/src/hooks/post-message/useLearnCardPostMessage.handlers.ts index dbfa6d6c88..47cbe94540 100644 --- a/apps/learn-card-app/src/hooks/post-message/useLearnCardPostMessage.handlers.ts +++ b/apps/learn-card-app/src/hooks/post-message/useLearnCardPostMessage.handlers.ts @@ -82,22 +82,12 @@ export const createRequestIdentityHandler = (dependencies: { }; }; -/** - * Response from showConsentModal - */ -export interface ConsentModalResult { - granted: boolean; -} - /** * REQUEST_CONSENT Handler * Partner needs general user permission via a consent contract. */ export const createRequestConsentHandler = (dependencies: { - showConsentModal: ( - contractUri: string, - options?: { redirect?: boolean } - ) => Promise; + showConsentModal: (contractUri: string) => Promise; }): ActionHandler<'REQUEST_CONSENT'> => { return async ({ payload }) => { const { showConsentModal } = dependencies; @@ -113,13 +103,13 @@ export const createRequestConsentHandler = (dependencies: { } try { - const result = await showConsentModal(payload.contractUri, { - redirect: payload.redirect, - }); + const granted = await showConsentModal(payload.contractUri); return { success: true, - data: result, + data: { + granted, + }, }; } catch (error) { return { @@ -469,10 +459,7 @@ export function createActionHandlers(dependencies: { showLoginConsentModal: (origin: string, appName?: string) => Promise; // Consent - showConsentModal: ( - contractUri: string, - options?: { redirect?: boolean } - ) => Promise; + showConsentModal: (contractUri: string) => Promise; // Credentials showCredentialAcceptanceModal: (credential: any) => Promise; diff --git a/apps/learn-card-app/src/hooks/post-message/useLearnCardPostMessage.ts b/apps/learn-card-app/src/hooks/post-message/useLearnCardPostMessage.ts index c685386bd1..18617674c8 100644 --- a/apps/learn-card-app/src/hooks/post-message/useLearnCardPostMessage.ts +++ b/apps/learn-card-app/src/hooks/post-message/useLearnCardPostMessage.ts @@ -1,8 +1,6 @@ import { useEffect, useCallback, useRef } from 'react'; import type { AppEvent, SendCredentialEvent } from '@learncard/types'; -import sdkActivityStore from '../../stores/sdkActivityStore'; - // Re-export for convenience export type { AppEvent, SendCredentialEvent }; @@ -63,7 +61,6 @@ export interface RequestIdentityPayload { export interface RequestConsentPayload { contractUri: string; - redirect?: boolean; } export interface SendCredentialPayload { @@ -285,9 +282,6 @@ export function useLearnCardPostMessage(config: UseLearnCardPostMessageConfig) { // Step 3: Execute Handler & Send Response // ================================================================ - // Show activity indicator while processing - sdkActivityStore.set.startActivity(); - try { const result = await handler({ origin: event.origin, @@ -325,10 +319,7 @@ export function useLearnCardPostMessage(config: UseLearnCardPostMessageConfig) { code: 'UNKNOWN_ERROR', message: error instanceof Error ? error.message : 'Unknown error occurred', }); - // Hide activity indicator on error - sdkActivityStore.set.endActivity(); } - // Note: endActivity() is called by handlers when they show their UI }, [trustedOrigins, debug] ); diff --git a/apps/learn-card-app/src/index.scss b/apps/learn-card-app/src/index.scss index fc074a98ec..e543ae86e1 100644 --- a/apps/learn-card-app/src/index.scss +++ b/apps/learn-card-app/src/index.scss @@ -37,6 +37,7 @@ body.scanner-active > * { @import './assets/sass/family-cms.scss'; @import './assets/sass/launchpad.scss'; @import './assets/sass/ai-sessions.scss'; +@import './assets/sass/ai-pathways.scss'; @import 'react-datepicker/dist/react-datepicker.css'; .disable-scrollbars { @@ -86,20 +87,20 @@ body.scanner-active > * { } /* Fix browser autofill dark background - force light scheme on inputs with gray borders (guide pages) */ -input[class*="border-gray"], -textarea[class*="border-gray"] { +input[class*='border-gray'], +textarea[class*='border-gray'] { color-scheme: light !important; background-color: white !important; } -input[class*="border-gray"]:-webkit-autofill, -input[class*="border-gray"]:-webkit-autofill:hover, -input[class*="border-gray"]:-webkit-autofill:focus, -input[class*="border-gray"]:-webkit-autofill:active, -textarea[class*="border-gray"]:-webkit-autofill, -textarea[class*="border-gray"]:-webkit-autofill:hover, -textarea[class*="border-gray"]:-webkit-autofill:focus, -textarea[class*="border-gray"]:-webkit-autofill:active { +input[class*='border-gray']:-webkit-autofill, +input[class*='border-gray']:-webkit-autofill:hover, +input[class*='border-gray']:-webkit-autofill:focus, +input[class*='border-gray']:-webkit-autofill:active, +textarea[class*='border-gray']:-webkit-autofill, +textarea[class*='border-gray']:-webkit-autofill:hover, +textarea[class*='border-gray']:-webkit-autofill:focus, +textarea[class*='border-gray']:-webkit-autofill:active { -webkit-box-shadow: 0 0 0 30px white inset !important; -webkit-text-fill-color: #374151 !important; caret-color: #374151 !important; diff --git a/apps/learn-card-app/src/pages/ai-insights/AiInsights.tsx b/apps/learn-card-app/src/pages/ai-insights/AiInsights.tsx index 1e4cefa9ec..e06c500d26 100644 --- a/apps/learn-card-app/src/pages/ai-insights/AiInsights.tsx +++ b/apps/learn-card-app/src/pages/ai-insights/AiInsights.tsx @@ -113,27 +113,25 @@ const AiInsights: React.FC = () => { const myInsights = ( <> - {/*
- -
-
- {flags?.showGenerateAiInsightsButton && ( - - )} -
*/} +
+ +
+
+ {/* {flags?.showGenerateAiInsightsButton && ( */} + + {/* )} */} +
{contractRequest} - {!flags?.hideAiPathways && } + {topSkills.length > 0 && } {topSkills.length > 0 && } diff --git a/apps/learn-card-app/src/pages/ai-insights/AiInsightsEmptyPlaceholder.tsx b/apps/learn-card-app/src/pages/ai-insights/AiInsightsEmptyPlaceholder.tsx index 26c6eb7e4f..39ae8aa04a 100644 --- a/apps/learn-card-app/src/pages/ai-insights/AiInsightsEmptyPlaceholder.tsx +++ b/apps/learn-card-app/src/pages/ai-insights/AiInsightsEmptyPlaceholder.tsx @@ -1,13 +1,13 @@ import React from 'react'; -import { AiPathwaysIconWithShape } from 'learn-card-base/svgs/wallet/AiPathwaysIcon'; +import { AiInsightsIconWithShape } from 'learn-card-base/svgs/wallet/AiInsightsIcon'; import CheckListButton from '../../components/learncard/checklist/CheckListButton'; export const AiInsightsEmptyPlaceholder: React.FC = () => { return (
- +

No AI Insights yet. diff --git a/apps/learn-card-app/src/pages/ai-insights/AiInsightsLearningPathwaysCard.tsx b/apps/learn-card-app/src/pages/ai-insights/AiInsightsLearningPathwaysCard.tsx index 8e56a4838a..a46ea23726 100644 --- a/apps/learn-card-app/src/pages/ai-insights/AiInsightsLearningPathwaysCard.tsx +++ b/apps/learn-card-app/src/pages/ai-insights/AiInsightsLearningPathwaysCard.tsx @@ -6,10 +6,7 @@ import PathwaysInsightsIcon from 'learn-card-base/svgs/PathwaysInsightsIcon'; const AiInsightsLearningPathwaysCard: React.FC = () => { const history = useHistory(); - const handleExploreClick = () => { - return; // disable pathway redirect - history.push('/ai/pathways'); - }; + const handleExploreClick = () => history.push('/ai/pathways'); return (
= ({ className }) => { + return ( +
+ +
+ + +
+ + Explore AI Insights + + +
+ ); +}; + +export default ExploreAiInsightsButton; diff --git a/apps/learn-card-app/src/pages/ai-insights/docs/child-directly-shares-insights-existing-contract-flow.md b/apps/learn-card-app/src/pages/ai-insights/docs/child-directly-shares-insights-existing-contract-flow.md new file mode 100644 index 0000000000..07d9cf6bec --- /dev/null +++ b/apps/learn-card-app/src/pages/ai-insights/docs/child-directly-shares-insights-existing-contract-flow.md @@ -0,0 +1,34 @@ +# Child Directly Shares Insights (Existing Contract) + +This flow describes when a child directly shares their AI insights with a teacher with parent approval, and the teacher already has an AI Insights contract. + +```mermaid +sequenceDiagram + participant Child + participant App + participant Parent + participant Teacher + participant LearnCard + + Child->>App: Open Share Insights + App->>App: Confirm role = Child + + Child->>App: Initiate Share Insights + App->>Parent: Request guardian approval + + Parent->>App: Open guardian request + Parent->>App: Approve sharing + + App->>App: Check for teacher AI Insights contract + + App->>Child: Redirect to ConsentFlow + LearnCard->>Child: Display AI Insights contract + Child->>LearnCard: Confirm consent + + LearnCard->>LearnCard: Create Terms record + LearnCard->>App: Redirect with DID + + App->>Teacher: Notify teacher (child shared insights) + App->>LearnCard: Fetch shared AI insights + App->>Teacher: Display child insights +``` diff --git a/apps/learn-card-app/src/pages/ai-insights/docs/child-directly-shares-insights-no-contract-flow.md b/apps/learn-card-app/src/pages/ai-insights/docs/child-directly-shares-insights-no-contract-flow.md new file mode 100644 index 0000000000..402208df45 --- /dev/null +++ b/apps/learn-card-app/src/pages/ai-insights/docs/child-directly-shares-insights-no-contract-flow.md @@ -0,0 +1,40 @@ +# Child Directly Shares Insights (No Contract) + +This flow describes when a child directly shares their AI insights with a teacher with parent approval, but the teacher has not yet created an AI Insights contract. + +```mermaid +sequenceDiagram + participant Child + participant App + participant Parent + participant Teacher + participant LearnCard + + Child->>App: Open Share Insights + App->>App: Confirm role = Child + + Child->>App: Initiate Share Insights + App->>Parent: Request guardian approval + + Parent->>App: Open guardian request + Parent->>App: Approve sharing + + App->>App: Check for teacher AI Insights contract + Note over App: No contract exists + + App->>Teacher: Notify teacher (child wants to share insights) + Teacher->>App: Open share request + Teacher->>App: Approve & request access + + App->>LearnCard: Create AI Insights contract (teacher-owned) + + App->>Child: Redirect to ConsentFlow + LearnCard->>Child: Display newly created contract + Child->>LearnCard: Confirm consent + + LearnCard->>LearnCard: Create Terms record + LearnCard->>App: Redirect with DID + + App->>LearnCard: Fetch shared AI insights + App->>Teacher: Display child insights +``` diff --git a/apps/learn-card-app/src/pages/ai-insights/docs/student-direclty-shares-insights-existing-contract-flow.md b/apps/learn-card-app/src/pages/ai-insights/docs/student-direclty-shares-insights-existing-contract-flow.md new file mode 100644 index 0000000000..029f5c188d --- /dev/null +++ b/apps/learn-card-app/src/pages/ai-insights/docs/student-direclty-shares-insights-existing-contract-flow.md @@ -0,0 +1,30 @@ +# Student Directly Shares Insights (Existing Contract) + +This flow describes when a student wants to share their AI insights directly with a teacher, without the teacher first requesting them (i.e., the teacher has an existing AI Insights contract). + +```mermaid +sequenceDiagram + participant Student + participant App + participant Teacher + participant LearnCard + + Student->>App: Open Share Insights + App->>App: Confirm role = Student + + Student->>App: Share insights (search / QR / link) + App->>App: Check for teacher AI Insights contract + + alt Contract exists + App->>Student: Redirect to ConsentFlow + LearnCard->>Student: Display AI Insights contract + Student->>LearnCard: Confirm consent + + LearnCard->>LearnCard: Create Terms record + LearnCard->>App: Redirect with DID + + App->>Teacher: Notify teacher (student shared insights) + App->>LearnCard: Fetch shared AI insights + App->>Teacher: Display student insights + end +``` diff --git a/apps/learn-card-app/src/pages/ai-insights/docs/student-directly-shares-insights-no-contract-flow.md b/apps/learn-card-app/src/pages/ai-insights/docs/student-directly-shares-insights-no-contract-flow.md new file mode 100644 index 0000000000..8c47f060ba --- /dev/null +++ b/apps/learn-card-app/src/pages/ai-insights/docs/student-directly-shares-insights-no-contract-flow.md @@ -0,0 +1,42 @@ +# Student Directly Shares Insights (No Contract) + +This flow describes when a student wants to share their AI insights directly with a teacher, but the teacher has not yet created an AI Insights contract. + +```mermaid +sequenceDiagram + participant Student + participant App + participant Teacher + participant LearnCard + + Student->>App: Open Share Insights + App->>App: Confirm role = Student + + Student->>App: Share insights (search / QR / link) + App->>App: Check for teacher AI Insights contract + + Note over App: No contract exists + + App->>Teacher: Send share request notification + Teacher->>App: Open share request + + Teacher->>App: Approve share request + App->>App: Check if teacher has AI Insights contract + + alt Contract does not exist + App->>LearnCard: Create AI Insights contract (teacher-owned) + end + + App->>Student: Send consent request notification + Student->>App: Open consent request + + App->>Student: Redirect to ConsentFlow + LearnCard->>Student: Display AI Insights contract + Student->>LearnCard: Confirm consent + + LearnCard->>LearnCard: Create Terms record + LearnCard->>App: Redirect with DID + + App->>LearnCard: Fetch shared AI insights + App->>Teacher: Display student insights +``` diff --git a/apps/learn-card-app/src/pages/ai-insights/docs/teacher-requests-child-insights-flow.md b/apps/learn-card-app/src/pages/ai-insights/docs/teacher-requests-child-insights-flow.md new file mode 100644 index 0000000000..faa6fa079a --- /dev/null +++ b/apps/learn-card-app/src/pages/ai-insights/docs/teacher-requests-child-insights-flow.md @@ -0,0 +1,35 @@ +# Teacher Requests Child Insights + +This flow describes when a teacher requests AI insights from a child, where the parent must provide consent. + +```mermaid +sequenceDiagram + participant Teacher + participant App + participant Child + participant Parent + participant LearnCard + + Teacher->>App: Request insights from child + App->>App: Ensure AI Insights contract exists + App->>Child: Send insights request + + Child->>App: Open request + App->>Child: Show request details + Child->>App: Accept request + + Note over Child,App: Guardian consent required + + App->>Parent: Notify guardian for approval + Parent->>App: Open guardian consent request + + App->>Parent: Redirect to ConsentFlow + LearnCard->>Parent: Display AI Insights contract + Parent->>LearnCard: Confirm consent + + LearnCard->>LearnCard: Create Terms record + LearnCard->>App: Redirect with DID(s) + + App->>LearnCard: Fetch shared AI insights + App->>Teacher: Display child insights +``` diff --git a/apps/learn-card-app/src/pages/ai-insights/docs/teacher-requests-student-insights-flow.md b/apps/learn-card-app/src/pages/ai-insights/docs/teacher-requests-student-insights-flow.md new file mode 100644 index 0000000000..8b4500429a --- /dev/null +++ b/apps/learn-card-app/src/pages/ai-insights/docs/teacher-requests-student-insights-flow.md @@ -0,0 +1,31 @@ +# Teacher Requests Insights Flow + +```mermaid +sequenceDiagram + participant Teacher + participant App + participant Student + participant LearnCard + + Teacher->>App: Opens Learner Insights + App->>App: Ensure AI Insights contract exists + + Teacher->>App: Request Insights + App->>Student: Send request (push / link / QR) + + Student->>App: Open request + App->>Student: Display request details + + Student->>App: Accept request + Note over Student,App: Accepting request = consenting to contract + + App->>LearnCard: Redirect to ConsentFlow + LearnCard->>Student: Display contract details + Student->>LearnCard: Confirm consent + + LearnCard->>LearnCard: Create Terms record + LearnCard->>App: Redirect with DID + + App->>LearnCard: Fetch shared AI insights + App->>Teacher: Display student insights +``` diff --git a/apps/learn-card-app/src/pages/ai-pathways/AiPathways.tsx b/apps/learn-card-app/src/pages/ai-pathways/AiPathways.tsx new file mode 100644 index 0000000000..a1fb325828 --- /dev/null +++ b/apps/learn-card-app/src/pages/ai-pathways/AiPathways.tsx @@ -0,0 +1,147 @@ +import React, { useMemo } from 'react'; + +import { IonContent, IonPage } from '@ionic/react'; +import { ErrorBoundary } from 'react-error-boundary'; +import MainHeader from '../../components/main-header/MainHeader'; +import AiPathwayCareers from './ai-pathway-careers/AiPathwayCareers'; +import AiPathwayCourses from './ai-pathway-courses/AiPathwayCourses'; +import AiPathwaysEmptyPlaceholder from './AiPathwaysEmptyPlaceholder'; +import AiPathwaySessions from './ai-pathway-sessions/AiPathwaySessions'; +import ExploreAiInsightsButton from '../ai-insights/ExploreAiInsightsButton'; +import ExperimentalFeatureBox from '../../components/generic/ExperimentalFeatureBox'; +import ErrorBoundaryFallback from '../../components/boost/boostErrors/BoostErrorsDisplay'; +import AiPathwayExploreContent from './ai-pathway-explore-content/AiPathwayExploreContent'; + +import { SubheaderTypeEnum } from '../../components/main-subheader/MainSubHeader.types'; +import { CredentialCategoryEnum } from 'learn-card-base'; + +import useTheme from '../../theme/hooks/useTheme'; +import { + useOccupationDetailsForKeyword, + useTrainingProgramsByKeyword, +} from 'learn-card-base/react-query/queries/careerOneStop'; +import { useAiInsightCredential, useAiPathways } from 'learn-card-base'; + +import { + getFirstAvailableKeywords, + getAllKeywords, + getFirstAvailableFieldOfStudy, +} from './ai-pathway-careers/ai-pathway-careers.helpers'; +import { + filterCoursesByFieldOfStudy, + normalizeSchoolPrograms, +} from './ai-pathway-courses/ai-pathway-courses.helpers'; + +const AiPathways: React.FC = () => { + const { getThemedCategoryColors } = useTheme(); + + const colors = getThemedCategoryColors(CredentialCategoryEnum.aiPathway); + const { backgroundSecondaryColor } = colors; + + const { data: aiInsightCredential, isLoading: fetchAiInsightCredentialLoading } = + useAiInsightCredential(); + const { data: learningPathwaysData, isLoading: fetchPathwaysLoading } = useAiPathways(); + + const strongestAreaInterest = aiInsightCredential?.insights?.strongestArea; + + let careerKeywords = null; + let fieldOfStudy = strongestAreaInterest?.keywords?.fieldOfStudy; + if (strongestAreaInterest?.keywords?.occupations?.length) { + careerKeywords = strongestAreaInterest.keywords.occupations; + } + + // if no keywords are found from the insights credentials, use the first available keywords from the pathways + if (learningPathwaysData && learningPathwaysData.length > 0) { + careerKeywords = careerKeywords || getFirstAvailableKeywords(learningPathwaysData || []); + fieldOfStudy = fieldOfStudy || getFirstAvailableFieldOfStudy(learningPathwaysData || []); + } + + const allKeywords = + getAllKeywords(learningPathwaysData || []).length > 0 + ? getAllKeywords(learningPathwaysData || []) + : careerKeywords; + + const { data: trainingPrograms, isLoading: fetchTrainingProgramsLoading } = + useTrainingProgramsByKeyword({ + keywords: allKeywords as string[], + fieldOfStudy, + }); + + const schoolPrograms = useMemo(() => { + return trainingPrograms?.length ? normalizeSchoolPrograms(trainingPrograms) : []; + }, [trainingPrograms]); + + const courses = useMemo(() => { + return schoolPrograms?.length + ? filterCoursesByFieldOfStudy(schoolPrograms, fieldOfStudy) + : []; + }, [schoolPrograms]); + + const { data: occupations, isLoading: fetchOccupationsLoading } = + useOccupationDetailsForKeyword(careerKeywords?.[0] || ''); + + const isLoading = + fetchAiInsightCredentialLoading || + fetchPathwaysLoading || + fetchTrainingProgramsLoading || + fetchOccupationsLoading; + + const emptyPathways = + !isLoading && + !occupations && + courses?.length === 0 && + schoolPrograms.length === 0 && + learningPathwaysData?.length === 0; + + return ( + + }> + + +
+
+ +
+ + {emptyPathways ? ( +
+ +
+ ) : ( + <> + + + + + + + )} +
+
+
+
+ ); +}; + +export default AiPathways; diff --git a/apps/learn-card-app/src/pages/ai-pathways/AiPathwaysEmptyPlaceholder.tsx b/apps/learn-card-app/src/pages/ai-pathways/AiPathwaysEmptyPlaceholder.tsx new file mode 100644 index 0000000000..17224d90b7 --- /dev/null +++ b/apps/learn-card-app/src/pages/ai-pathways/AiPathwaysEmptyPlaceholder.tsx @@ -0,0 +1,44 @@ +import React from 'react'; +import { useHistory } from 'react-router-dom'; + +import { AiPathwaysIconWithShape } from 'learn-card-base/svgs/wallet/AiPathwaysIcon'; +import CheckListButton from '../../components/learncard/checklist/CheckListButton'; + +import { useIsLoggedIn } from 'learn-card-base'; + +export const AiPathwaysEmptyPlaceholder: React.FC = () => { + const history = useHistory(); + const isLoggedIn = useIsLoggedIn(); + + let title = isLoggedIn ? 'No AI Pathways yet.' : 'Join LearnCard\nto unlock AI Pathways'; + const text = isLoggedIn + ? `Build your LearnCard to unlock personalized pathways to discover career routes and learning experiences aligned with your skills.` + : 'AI Pathways connect your skills to relevant courses, careers, salaries, and learning content.'; + + return ( +
+
+ +
+

+ {title} +

+

{text}

+
+ {isLoggedIn && } + {!isLoggedIn && ( + + )} +
+
+ ); +}; + +export default AiPathwaysEmptyPlaceholder; diff --git a/apps/learn-card-app/src/pages/ai-pathways/ai-pathway-careers/AiPathwayAvgSalaryDisplay.tsx b/apps/learn-card-app/src/pages/ai-pathways/ai-pathway-careers/AiPathwayAvgSalaryDisplay.tsx new file mode 100644 index 0000000000..6c72924a42 --- /dev/null +++ b/apps/learn-card-app/src/pages/ai-pathways/ai-pathway-careers/AiPathwayAvgSalaryDisplay.tsx @@ -0,0 +1,28 @@ +import React from 'react'; +import numeral from 'numeral'; + +const AiPathwayAvgSalaryDisplay: React.FC<{ + medianSalary: string; + minSalary: string; + maxSalary: string; +}> = ({ medianSalary, minSalary, maxSalary }) => { + return ( +
+
+ + ${numeral(medianSalary).format('0,0')} + + /yr +
+ +
+

+ Avg. Base Salary | Range: ${numeral(minSalary).format('0a')} - $ + {numeral(maxSalary).format('0a')} +

+
+
+ ); +}; + +export default AiPathwayAvgSalaryDisplay; diff --git a/apps/learn-card-app/src/pages/ai-pathways/ai-pathway-careers/AiPathwayCareerGauge.tsx b/apps/learn-card-app/src/pages/ai-pathways/ai-pathway-careers/AiPathwayCareerGauge.tsx new file mode 100644 index 0000000000..877baad79a --- /dev/null +++ b/apps/learn-card-app/src/pages/ai-pathways/ai-pathway-careers/AiPathwayCareerGauge.tsx @@ -0,0 +1,139 @@ +import { PieChart, Pie, Cell, ResponsiveContainer } from 'recharts'; + +type CareerGaugeProps = { + title: string; + score: number; // 0–100 +}; + +const GAUGE_ZONES = [ + { value: 25, color: 'oklch(98% 0.062 18.334)' }, + { value: 25, color: 'oklch(99% 0.032 17.717)' }, + { value: 25, color: 'oklch(99% 0.018 155.826)' }, + { value: 25, color: 'oklch(98% 0.044 156.743)' }, +]; + +const getLabel = (score: number) => { + if (score < 20) return 'Very Poor'; + if (score < 35) return 'Poor'; + if (score < 50) return 'Below Average'; + if (score < 65) return 'Average'; + if (score < 80) return 'Good'; + if (score < 90) return 'Very Good'; + return 'Excellent'; +}; + +export const AiPathwayCareerGauge = ({ title, score }: CareerGaugeProps) => { + const angle = 180 - (score / 100) * 180; + const label = getLabel(score); + + return ( +
+

{title}

+ +
+ {/* Base gauge */} + + + + {GAUGE_ZONES.map((entry, index) => ( + + ))} + + + + + {/* Zone divider lines + bounds */} + + {/* Zone dividers */} + {[30, 60, 90, 120, 150].map(deg => { + const r1 = 68; + const r2 = 100; + return ( + + ); + })} + + {/* 0% boundary */} + + + {/* 100% boundary */} + + + {/* SVG 2: Needle */} + + {/* main needle */} + + + {/* Needle tail (longer, behind pivot) */} + + + {/* Pivot outer ring */} + + + {/* Center pivot */} + + +
+ +

{label}

+
+ ); +}; + +export default AiPathwayCareerGauge; diff --git a/apps/learn-card-app/src/pages/ai-pathways/ai-pathway-careers/AiPathwayCareerHeader.tsx b/apps/learn-card-app/src/pages/ai-pathways/ai-pathway-careers/AiPathwayCareerHeader.tsx new file mode 100644 index 0000000000..e855e09626 --- /dev/null +++ b/apps/learn-card-app/src/pages/ai-pathways/ai-pathway-careers/AiPathwayCareerHeader.tsx @@ -0,0 +1,29 @@ +import React from 'react'; + +import CareerLaptopIcon from '../../../assets/images/career.laptop.icon.png'; + +import { OccupationDetailsResponse } from 'learn-card-base/types/careerOneStop'; + +export const AiPathwayCareerHeader: React.FC<{ occupation: OccupationDetailsResponse }> = ({ + occupation, +}) => { + return ( +
+
+ career icon + +

+ {occupation.OnetTitle} +

+
+ +
+

+ {occupation.OnetDescription} +

+
+
+ ); +}; + +export default AiPathwayCareerHeader; diff --git a/apps/learn-card-app/src/pages/ai-pathways/ai-pathway-careers/AiPathwayCareerItem.tsx b/apps/learn-card-app/src/pages/ai-pathways/ai-pathway-careers/AiPathwayCareerItem.tsx new file mode 100644 index 0000000000..a831333a3f --- /dev/null +++ b/apps/learn-card-app/src/pages/ai-pathways/ai-pathway-careers/AiPathwayCareerItem.tsx @@ -0,0 +1,58 @@ +import React from 'react'; +import numeral from 'numeral'; + +import SlimCaretRight from '../../../components/svgs/SlimCaretRight'; +import AiPathwayCareerDetails from './AiPathwaysCareerDetails'; + +import { ModalTypes, useModal } from 'learn-card-base'; +import { OccupationDetailsResponse } from 'learn-card-base/types/careerOneStop'; +import { getYearlyWages } from './ai-pathway-careers.helpers'; + +export const AiPathwayCareerItem: React.FC<{ + occupation: OccupationDetailsResponse; +}> = ({ occupation }) => { + const { newModal } = useModal(); + + const openCareerDetailsModal = () => { + newModal(, undefined, { + desktop: ModalTypes.Right, + mobile: ModalTypes.Right, + }); + }; + + const yearlyWages = getYearlyWages(occupation?.Wages?.NationalWagesList || []); + const medianSalary = yearlyWages?.Median; + + return ( +
+
+
+

+ {occupation?.OnetTitle} +

+ +
+ +
+
+
+

+ AVG. ANNUAL SALARY +

+

+ ${numeral(medianSalary).format('0,0')} +

+
+

+ {occupation?.OnetDescription} +

+
+
+ ); +}; + +export default AiPathwayCareerItem; diff --git a/apps/learn-card-app/src/pages/ai-pathways/ai-pathway-careers/AiPathwayCareerItemSkeletonLoader.tsx b/apps/learn-card-app/src/pages/ai-pathways/ai-pathway-careers/AiPathwayCareerItemSkeletonLoader.tsx new file mode 100644 index 0000000000..79554ec2fa --- /dev/null +++ b/apps/learn-card-app/src/pages/ai-pathways/ai-pathway-careers/AiPathwayCareerItemSkeletonLoader.tsx @@ -0,0 +1,32 @@ +import React from 'react'; +import { IonSkeletonText } from '@ionic/react'; + +export const AiPathwayCareerItemSkeleton: React.FC = () => { + return ( +
+
+ {/* Title row */} +
+ + +
+ + {/* Salary label */} + + + {/* Salary value */} + + + {/* Description (2 lines) */} + + +
+
+ ); +}; + +export default AiPathwayCareerItemSkeleton; diff --git a/apps/learn-card-app/src/pages/ai-pathways/ai-pathway-careers/AiPathwayCareerPipeChart.tsx b/apps/learn-card-app/src/pages/ai-pathways/ai-pathway-careers/AiPathwayCareerPipeChart.tsx new file mode 100644 index 0000000000..7e58c5cca4 --- /dev/null +++ b/apps/learn-card-app/src/pages/ai-pathways/ai-pathway-careers/AiPathwayCareerPipeChart.tsx @@ -0,0 +1,55 @@ +import React from 'react'; +import numeral from 'numeral'; + +import { BarChart, Bar, XAxis, YAxis, ReferenceLine, ResponsiveContainer } from 'recharts'; +import { buildSalaryPipeData } from './ai-pathway-careers.helpers'; +import { Wages } from 'learn-card-base/types/careerOneStop'; + +const MEDIAN_BUCKET = 4; + +export const AiPathwayCareerPipeChart: React.FC<{ wages: Wages }> = ({ wages }) => { + const { NationalWagesList } = wages; + const [_rate, yearly] = NationalWagesList; + + const data = buildSalaryPipeData(yearly); + + const minSalary = yearly?.Pct10; + const medianSalary = yearly?.Median; + const maxSalary = yearly?.Pct90; + + return ( +
+ {/* Median overlay */} +
+ + Median: ${numeral(medianSalary).format('0,0')} +
+ + {/* Chart */} +
+ + + + + + + + + + +
+ + {/* Min / Max labels */} +
+ ${numeral(minSalary).format('0,0')} + ${numeral(maxSalary).format('0,0')} +
+
+ ); +}; + +export default AiPathwayCareerPipeChart; diff --git a/apps/learn-card-app/src/pages/ai-pathways/ai-pathway-careers/AiPathwayCareerQualifications.tsx b/apps/learn-card-app/src/pages/ai-pathways/ai-pathway-careers/AiPathwayCareerQualifications.tsx new file mode 100644 index 0000000000..4847007f31 --- /dev/null +++ b/apps/learn-card-app/src/pages/ai-pathways/ai-pathway-careers/AiPathwayCareerQualifications.tsx @@ -0,0 +1,53 @@ +import React from 'react'; + +import { OccupationDetailsResponse } from 'learn-card-base/types/careerOneStop'; + +export const AiPathwayCareerQualifications: React.FC<{ occupation: OccupationDetailsResponse }> = ({ + occupation, +}) => { + const edu = occupation.EducationTraining; + + const qualifications = edu + ? { + education: edu.EducationTitle ?? 'No formal education required', + experience: edu.ExperienceTitle ?? 'No prior experience required', + training: edu.TrainingTitle, + } + : { + education: 'Not specified', + experience: 'Not specified', + }; + + const { education, experience } = qualifications; + + if (!education || !experience) return null; + + return ( +
+
+

+ Education & Qualifications +

+
+ +
+

+ Most job listings for this role ask for a minimum of a{' '} + {education},{' '} + {experience} + {qualifications.training && ( + <> + , and{' '} + + {qualifications.training.toLowerCase()} + + + )} + . +

+
+
+ ); +}; + +export default AiPathwayCareerQualifications; diff --git a/apps/learn-card-app/src/pages/ai-pathways/ai-pathway-careers/AiPathwayCareerQualitativeInsights.tsx b/apps/learn-card-app/src/pages/ai-pathways/ai-pathway-careers/AiPathwayCareerQualitativeInsights.tsx new file mode 100644 index 0000000000..eb91124dfe --- /dev/null +++ b/apps/learn-card-app/src/pages/ai-pathways/ai-pathway-careers/AiPathwayCareerQualitativeInsights.tsx @@ -0,0 +1,37 @@ +import React from 'react'; + +import AiPathwayCareerGauge from './AiPathwayCareerGauge'; + +import { type AiPathwayCareer } from './ai-pathway-careers.helpers'; + +export const AiPathwayCareerQualitativeInsights: React.FC<{ career: AiPathwayCareer }> = ({ + career, +}) => { + return ( +
+
+

Qualitative Insights

+
+ +
+ + +
+ +
+

+ *Based on the average score of user polling
conducted for the{' '} + {career?.title} job. +

+
+
+ ); +}; + +export default AiPathwayCareerQualitativeInsights; diff --git a/apps/learn-card-app/src/pages/ai-pathways/ai-pathway-careers/AiPathwayCareerSalaries.tsx b/apps/learn-card-app/src/pages/ai-pathways/ai-pathway-careers/AiPathwayCareerSalaries.tsx new file mode 100644 index 0000000000..f68c52ba5a --- /dev/null +++ b/apps/learn-card-app/src/pages/ai-pathways/ai-pathway-careers/AiPathwayCareerSalaries.tsx @@ -0,0 +1,39 @@ +import React from 'react'; + +import AiPathwayAvgSalaryDisplay from './AiPathwayAvgSalaryDisplay'; +import AiPathwayCareerPipeChart from './AiPathwayCareerPipeChart'; + +import { OccupationDetailsResponse } from 'learn-card-base/types/careerOneStop'; +import { getYearlyWages } from './ai-pathway-careers.helpers'; + +export const AiPathwayCareerSalaries: React.FC<{ occupation: OccupationDetailsResponse }> = ({ + occupation, +}) => { + const wages = occupation?.Wages; + const yearly = getYearlyWages(wages?.NationalWagesList || []); + + const minSalary = yearly?.Pct10; + const medianSalary = yearly?.Median; + const maxSalary = yearly?.Pct90; + + return ( +
+
+

+ {occupation.OnetTitle} Salaries +

+
+ + {/* salary */} + + + +
+ ); +}; + +export default AiPathwayCareerSalaries; diff --git a/apps/learn-card-app/src/pages/ai-pathways/ai-pathway-careers/AiPathwayCareerSkills.tsx b/apps/learn-card-app/src/pages/ai-pathways/ai-pathway-careers/AiPathwayCareerSkills.tsx new file mode 100644 index 0000000000..bb3c500635 --- /dev/null +++ b/apps/learn-card-app/src/pages/ai-pathways/ai-pathway-careers/AiPathwayCareerSkills.tsx @@ -0,0 +1,48 @@ +import React from 'react'; + +import { OccupationDetailsResponse } from 'learn-card-base/types/careerOneStop'; + +export const AiPathwayCareerSkills: React.FC<{ occupation: OccupationDetailsResponse }> = ({ + occupation, +}) => { + const skills = occupation?.SkillsDataList?.map(skill => ({ + id: skill?.ElementId, + name: skill?.ElementName, + description: skill?.ElementDescription, + importance: skill?.Importance, + })) + .sort((a, b) => { + const aImp = Number(a?.importance ?? 0); + const bImp = Number(b?.importance ?? 0); + return bImp - aImp; + }) + .slice(0, 5); + + return ( +
+
+

Top Skills

+
+ +
+ {skills?.map(skill => { + return ( +
+

+ {skill.name} +

+

+ {skill.description} +

+
+ ); + })} +
+
+ ); +}; + +export default AiPathwayCareerSkills; diff --git a/apps/learn-card-app/src/pages/ai-pathways/ai-pathway-careers/AiPathwayCareers.tsx b/apps/learn-card-app/src/pages/ai-pathways/ai-pathway-careers/AiPathwayCareers.tsx new file mode 100644 index 0000000000..5bd7ef4529 --- /dev/null +++ b/apps/learn-card-app/src/pages/ai-pathways/ai-pathway-careers/AiPathwayCareers.tsx @@ -0,0 +1,50 @@ +import React from 'react'; + +import AiPathwayCareerItem from './AiPathwayCareerItem'; +import AiPathwayCareerItemSkeletonLoader from './AiPathwayCareerItemSkeletonLoader'; + +const AiPathwayCareers: React.FC<{ + careerKeywords?: string[]; + occupations?: any[]; + isLoading?: boolean; +}> = ({ careerKeywords = [], occupations = [], isLoading = false }) => { + const titleEl = ( +
+

Explore Careers

+
+ ); + + if (isLoading) { + return ( +
+
+ {titleEl} + +
+ {Array.from({ length: 3 }).map((_, index) => ( + + ))} +
+
+
+ ); + } + + if (!isLoading && (!careerKeywords?.length || !occupations?.length)) return null; + + return ( +
+
+ {titleEl} + +
+ {occupations?.map(occupation => ( + + ))} +
+
+
+ ); +}; + +export default AiPathwayCareers; diff --git a/apps/learn-card-app/src/pages/ai-pathways/ai-pathway-careers/AiPathwayCareersJobGrowthInfo.tsx b/apps/learn-card-app/src/pages/ai-pathways/ai-pathway-careers/AiPathwayCareersJobGrowthInfo.tsx new file mode 100644 index 0000000000..52b9d6cee1 --- /dev/null +++ b/apps/learn-card-app/src/pages/ai-pathways/ai-pathway-careers/AiPathwayCareersJobGrowthInfo.tsx @@ -0,0 +1,48 @@ +import React from 'react'; +import numeral from 'numeral'; + +import ArrowUp from 'learn-card-base/svgs/ArrowUp'; + +import { OccupationDetailsResponse } from 'learn-card-base/types/careerOneStop'; + +export const AiPathwayCareerJobGrowthInfo: React.FC<{ occupation: OccupationDetailsResponse }> = ({ + occupation, +}) => { + const projection = occupation.Projections?.Projections?.[0]; + + const jobGrowth = projection + ? { + annualOpenings: Number(projection.ProjectedAnnualJobOpening), + percentChange: Number(projection.PerCentChange), + estimatedYear: Number(projection.EstimatedYear), + projectedYear: Number(projection.ProjectedYear), + } + : undefined; + + if (!jobGrowth) return null; + + return ( +
+
+

+ Growth in the Job Market +

+
+ +
+ + + +

+ From {jobGrowth.estimatedYear} to {jobGrowth.projectedYear}, demand for{' '} + {occupation.OnetTitle} is projected to grow by{' '} + {jobGrowth.percentChange}%, with approximately{' '} + {numeral(jobGrowth.annualOpenings).format('0,0')} job openings + per year. +

+
+
+ ); +}; + +export default AiPathwayCareerJobGrowthInfo; diff --git a/apps/learn-card-app/src/pages/ai-pathways/ai-pathway-careers/AiPathwayTopPayLocations.tsx b/apps/learn-card-app/src/pages/ai-pathways/ai-pathway-careers/AiPathwayTopPayLocations.tsx new file mode 100644 index 0000000000..fc59785e96 --- /dev/null +++ b/apps/learn-card-app/src/pages/ai-pathways/ai-pathway-careers/AiPathwayTopPayLocations.tsx @@ -0,0 +1,55 @@ +import React from 'react'; +import numeral from 'numeral'; + +import { useSalariesForKeyword } from 'learn-card-base/react-query/queries/careerOneStop'; + +import type { + OccupationDetailsResponse, + CareerOneStopLocationResult, +} from 'learn-card-base/types/careerOneStop'; +import { getYearlyWages } from './ai-pathway-careers.helpers'; + +export const AiPathwayTopPayLocations: React.FC<{ occupation: OccupationDetailsResponse }> = ({ + occupation, +}) => { + const { data } = useSalariesForKeyword({ + keyword: occupation.OnetTitle, + }); + const topPaidLocations: { location: string; salary: number }[] = + data?.LocationsList?.map((l: CareerOneStopLocationResult) => { + const yearly = getYearlyWages(l.OccupationList?.[0]?.WageInfo || []); + + return { + location: l.LocationName, + salary: yearly?.Pct90, + }; + }) || []; + + return ( +
+
+

Top Pay Locations

+
+ +
+ {topPaidLocations.map(l => { + return ( +
+

{l.location}

+

+ {numeral(l.salary).format('$0a')} + /yr +

+
+ ); + })} +
+ + {/*
+ +
*/} +
+ ); +}; + +export default AiPathwayTopPayLocations; diff --git a/apps/learn-card-app/src/pages/ai-pathways/ai-pathway-careers/AiPathwaysCareerDetails.tsx b/apps/learn-card-app/src/pages/ai-pathways/ai-pathway-careers/AiPathwaysCareerDetails.tsx new file mode 100644 index 0000000000..5f1b423a1c --- /dev/null +++ b/apps/learn-card-app/src/pages/ai-pathways/ai-pathway-careers/AiPathwaysCareerDetails.tsx @@ -0,0 +1,58 @@ +import React from 'react'; + +import { IonFooter } from '@ionic/react'; +import AiPathwayCareerHeader from './AiPathwayCareerHeader'; +import AiPathwayCareerSkills from './AiPathwayCareerSkills'; +import AiPathwayCareerSalaries from './AiPathwayCareerSalaries'; +import AiPathwayTopPayLocations from './AiPathwayTopPayLocations'; +import AiPathwayCareerJobGrowthInfo from './AiPathwayCareersJobGrowthInfo'; +import AiPathwayCareerQualifications from './AiPathwayCareerQualifications'; +// import AiPathwayCareerQualitativeInsights from './AiPathwayCareerQualitativeInsights'; + +import { useModal } from 'learn-card-base'; + +import { OccupationDetailsResponse } from 'learn-card-base/types/careerOneStop'; + +const AiPathwayCareerDetails: React.FC<{ occupation: OccupationDetailsResponse }> = ({ + occupation, +}) => { + const { closeModal } = useModal(); + + return ( +
e.stopPropagation()} + className="flex flex-col gap-[10px] bg-transparent mx-auto cursor-auto min-w-[300px] h-full safe-area-top-margin" + > +
+
+ + + + + + {/* */} + + + + + +
+
+ +
+ +
+
+
+ ); +}; + +export default AiPathwayCareerDetails; diff --git a/apps/learn-card-app/src/pages/ai-pathways/ai-pathway-careers/ai-pathway-careers.helpers.ts b/apps/learn-card-app/src/pages/ai-pathways/ai-pathway-careers/ai-pathway-careers.helpers.ts new file mode 100644 index 0000000000..0a496758a4 --- /dev/null +++ b/apps/learn-card-app/src/pages/ai-pathways/ai-pathway-careers/ai-pathway-careers.helpers.ts @@ -0,0 +1,96 @@ +import { WageItem, Wages } from 'learn-card-base/types/careerOneStop'; + +export type AiPathwayCareer = { + id: number; + title: string; + description: string; + salary: number; + salaryData: { bucket: number; value: number }[]; + skills: { id: number; name: string; description: string }[]; + qualitativeInsights: { + jobSecurityScore: number; + workLifeBalanceScore: number; + }; + jobsCount: number; + qualifications: { + education: string; + experience: string; + }; + topPaidLocations: { + location: string; + salary: number; + }[]; +}; + +export const getSalaryStats = (salaries: { bucket: number; value: number }[]) => { + const medianSalary = salaries[Math.floor(salaries.length / 2)].value; + const minSalary = Math.min(...salaries.map(d => d.value)); + const maxSalary = Math.max(...salaries.map(d => d.value)); + + return { medianSalary, minSalary, maxSalary }; +}; + +export const buildSalaryPipeData = (wages: WageItem) => { + return [ + { bucket: 1, value: Number(wages.Pct10) }, + { bucket: 2, value: Number(wages.Pct25) }, + { bucket: 4, value: Number(wages.Median) }, + { bucket: 6, value: Number(wages.Pct75) }, + { bucket: 7, value: Number(wages.Pct90) }, + ]; +}; + +export const getFirstAvailableKeywords = ( + pathways: { keywords?: { occupations?: string[]; jobs?: string[]; careers?: string[] } }[] +): string[] => { + for (const pathway of pathways) { + const keywords = + (pathway.keywords?.occupations?.length && pathway.keywords.occupations) || + (pathway.keywords?.careers?.length && pathway.keywords.careers) || + (pathway.keywords?.jobs?.length && pathway.keywords.jobs) || + []; + + if (keywords && keywords.length > 0) { + return keywords; + } + } + + return []; +}; + +export const getFirstAvailableFieldOfStudy = ( + pathways: { keywords?: { fieldOfStudy?: string } }[] +): string => { + for (const pathway of pathways) { + const fos = pathway.keywords?.fieldOfStudy; + + if (fos) return fos; + } + + return ''; +}; + +export const getAllKeywords = ( + pathways: { keywords?: { occupations?: string[]; jobs?: string[]; careers?: string[] } }[] +): string[] => { + const allKeywords: string[] = []; + + for (const pathway of pathways) { + if (pathway.keywords?.occupations?.length) { + allKeywords.push(...pathway.keywords.occupations); + } + if (pathway.keywords?.careers?.length) { + allKeywords.push(...pathway.keywords.careers); + } + if (pathway.keywords?.jobs?.length) { + allKeywords.push(...pathway.keywords.jobs); + } + } + + // Remove duplicates while preserving order + return [...new Set(allKeywords)]; +}; + +export const getYearlyWages = (wages: WageItem[]) => { + return wages.find(wage => wage.RateType === 'Annual'); +}; diff --git a/apps/learn-card-app/src/pages/ai-pathways/ai-pathway-courses/AiPathwayCourseDetails.tsx b/apps/learn-card-app/src/pages/ai-pathways/ai-pathway-courses/AiPathwayCourseDetails.tsx new file mode 100644 index 0000000000..05a253cacd --- /dev/null +++ b/apps/learn-card-app/src/pages/ai-pathways/ai-pathway-courses/AiPathwayCourseDetails.tsx @@ -0,0 +1,131 @@ +import React from 'react'; +import { Capacitor } from '@capacitor/core'; +import { Browser } from '@capacitor/browser'; + +import { IonFooter } from '@ionic/react'; +// import Star from 'learn-card-base/svgs/shapes/Star'; +// import TimeCircle from 'learn-card-base/svgs/TimeCircle'; +import CareerLaptopIcon from '../../../assets/images/career.laptop.icon.png'; +import openSyllabusLogo from '../../../assets/images/open-syllabus-logo.webp'; + +import { useModal } from 'learn-card-base'; + +const AiPathwayCourseDetails: React.FC<{ course: any }> = ({ course }) => { + const { closeModal } = useModal(); + + const school = course?.institution; + + const schoolUrl = school?.url; + const schoolImage = school?.image_url; + const logo = schoolImage ? schoolImage : openSyllabusLogo; + + const handleExploreSchool = async () => { + if (!schoolUrl) return; + if (Capacitor?.isNativePlatform()) { + await Browser.open({ url: schoolUrl }); + } else { + window.open(schoolUrl, '_blank'); + } + }; + + return ( +
e.stopPropagation()} + className="flex flex-col gap-[10px] bg-transparent mx-auto cursor-auto min-w-[300px] h-full safe-area-top-margin" + > +
+
+
+ {/* header */} +
+ career icon + +

+ {course.title} +

+
+ + {/* details */} +
+
+

+ Provided by +

+ +

+ {school.institution} +

+
+ +
+ Logo +
+
+ {/*
+

+ Rated +

+
+ +

+ {course.rating} + /5 +

+
+
+
+

+ Duration +

+
+ +

+ {course.durationAvg} +

+

+ • {course.durationTotal} +

+
+
*/} + +
+
+
+ + {/* description */} +
+

+ {course.description} +

+
+
+
+
+ +
+ + +
+
+
+ ); +}; + +export default AiPathwayCourseDetails; diff --git a/apps/learn-card-app/src/pages/ai-pathways/ai-pathway-courses/AiPathwayCourseItem.tsx b/apps/learn-card-app/src/pages/ai-pathways/ai-pathway-courses/AiPathwayCourseItem.tsx new file mode 100644 index 0000000000..67996bb867 --- /dev/null +++ b/apps/learn-card-app/src/pages/ai-pathways/ai-pathway-courses/AiPathwayCourseItem.tsx @@ -0,0 +1,53 @@ +import React, { useMemo } from 'react'; + +// import startRatingIcon from '../../../assets/images/star-rating.icon.png'; +import openSyllabusLogo from '../../../assets/images/open-syllabus-logo.webp'; +// import timeMachineIcon from '../../../assets/images/time-machine.icon.png'; +import AiPathwayCourseDetails from './AiPathwayCourseDetails'; + +import { useModal, ModalTypes } from 'learn-card-base'; +import { getOccupationTags } from './ai-pathway-courses.helpers'; + +const AiPathwayCourseItem: React.FC<{ course: any }> = ({ course }) => { + const { newModal } = useModal(); + + const openCourseDetailsModal = () => { + newModal(, undefined, { + desktop: ModalTypes.Right, + mobile: ModalTypes.Right, + }); + }; + + const occupationTags = getOccupationTags(course?.occupationDetails); + + const schoolImage = course?.institution?.image_url; + const logo = schoolImage ? schoolImage : openSyllabusLogo; + + return ( +
+

+ {occupationTags} +

+
+

+ {course?.title} +

+
+ +

+ {course?.institution?.institution} +

+ +
+
+ Edx Logo +
+
+
+ ); +}; + +export default AiPathwayCourseItem; diff --git a/apps/learn-card-app/src/pages/ai-pathways/ai-pathway-courses/AiPathwayCourseItemSkeletonLoader.tsx b/apps/learn-card-app/src/pages/ai-pathways/ai-pathway-courses/AiPathwayCourseItemSkeletonLoader.tsx new file mode 100644 index 0000000000..5123b70ef3 --- /dev/null +++ b/apps/learn-card-app/src/pages/ai-pathways/ai-pathway-courses/AiPathwayCourseItemSkeletonLoader.tsx @@ -0,0 +1,30 @@ +import React from 'react'; + +import { IonSkeletonText } from '@ionic/react'; + +const AiPathwayCourseItemSkeletonLoader: React.FC = () => { + return ( +
+ {/* Occupation tags */} + + + {/* Title */} +
+ +
+ + {/* Institution */} + + + {/* Logo area */} +
+ +
+
+ ); +}; + +export default AiPathwayCourseItemSkeletonLoader; diff --git a/apps/learn-card-app/src/pages/ai-pathways/ai-pathway-courses/AiPathwayCourses.tsx b/apps/learn-card-app/src/pages/ai-pathways/ai-pathway-courses/AiPathwayCourses.tsx new file mode 100644 index 0000000000..5c428ad658 --- /dev/null +++ b/apps/learn-card-app/src/pages/ai-pathways/ai-pathway-courses/AiPathwayCourses.tsx @@ -0,0 +1,73 @@ +import React from 'react'; +import _ from 'lodash'; + +import AiPathwayCourseItem from './AiPathwayCourseItem'; +import AiPathwaySchoolProgramItem from './AiPathwaySchoolProgramItem'; +import AiPathwayCourseItemSkeletonLoader from './AiPathwayCourseItemSkeletonLoader'; + +import { TrainingProgram } from 'learn-card-base/types/careerOneStop'; + +// ! Insufficient data to show the following for careers +// work life balance metrics +// job stability metrics + +// ! Insufficient data to show the following for programs +// rating +// course duration + +const AiPathwayCourses: React.FC<{ + keywords?: string[]; + fieldOfStudy?: string; + courses: any; + schoolPrograms: any; + isLoading: boolean; +}> = ({ keywords = [], courses, schoolPrograms, isLoading }) => { + const showCourses = courses.length >= 3; + const title = showCourses ? 'Explore Courses' : 'Explore Programs'; + const titleEl = ( +
+

{title}

+
+ ); + + if (isLoading) + return ( +
+
+ {titleEl} + +
+ +
+
+
+ ); + + const trainingPrograms = [...(schoolPrograms || []), ...(courses || [])]; + + if (!isLoading && (!keywords?.length || !trainingPrograms?.length)) return null; + + return ( +
+
+ {titleEl} + +
+ {showCourses + ? courses + .slice(0, 3) + .map((course: TrainingProgram, index: number) => ( + + )) + : schoolPrograms + .slice(0, 3) + .map((program: TrainingProgram, index: number) => ( + + ))} +
+
+
+ ); +}; + +export default AiPathwayCourses; diff --git a/apps/learn-card-app/src/pages/ai-pathways/ai-pathway-courses/AiPathwaySchoolProgramDetails.tsx b/apps/learn-card-app/src/pages/ai-pathways/ai-pathway-courses/AiPathwaySchoolProgramDetails.tsx new file mode 100644 index 0000000000..1b04653f76 --- /dev/null +++ b/apps/learn-card-app/src/pages/ai-pathways/ai-pathway-courses/AiPathwaySchoolProgramDetails.tsx @@ -0,0 +1,115 @@ +import React from 'react'; +import { Capacitor } from '@capacitor/core'; +import { Browser } from '@capacitor/browser'; + +import { IonFooter } from '@ionic/react'; +import TimeCircle from 'learn-card-base/svgs/TimeCircle'; +import CareerLaptopIcon from '../../../assets/images/career.laptop.icon.png'; +import careerOneStopLogo from '../../../assets/images/career-one-stop-logo.png'; + +import { useModal } from 'learn-card-base'; + +import { TrainingProgram } from 'learn-card-base/types/careerOneStop'; + +const AiPathwaySchoolProgramDetails: React.FC<{ program: TrainingProgram }> = ({ program }) => { + const { closeModal } = useModal(); + + const schoolUrl = program?.school?.url; + const schoolImage = program?.school?.image_url; + const logo = schoolImage ? schoolImage : careerOneStopLogo; + + const handleExploreSchool = async () => { + if (!schoolUrl) return; + if (Capacitor?.isNativePlatform()) { + await Browser.open({ url: schoolUrl }); + } else { + window.open(schoolUrl, '_blank'); + } + }; + + return ( +
e.stopPropagation()} + className="flex flex-col gap-[10px] bg-transparent mx-auto cursor-auto min-w-[300px] h-full safe-area-top-margin" + > +
+
+
+ {/* header */} +
+ career icon + +

+ {program.ProgramName} +

+
+ + {/* details */} +
+
+

+ Provided by +

+ +

+ {program.SchoolName} +

+
+ +
+ Logo +
+
+
+

+ Duration +

+
+ +

+ Total: {program?.ProgramLength?.[0]?.Value} to complete +

+
+
+ +
+
+
+ + {/* description */} +
+

+ {program?.occupationDetails?.OnetDescription || ''} +

+
+
+
+
+ +
+ + +
+
+
+ ); +}; + +export default AiPathwaySchoolProgramDetails; diff --git a/apps/learn-card-app/src/pages/ai-pathways/ai-pathway-courses/AiPathwaySchoolProgramItem.tsx b/apps/learn-card-app/src/pages/ai-pathways/ai-pathway-courses/AiPathwaySchoolProgramItem.tsx new file mode 100644 index 0000000000..604e79c709 --- /dev/null +++ b/apps/learn-card-app/src/pages/ai-pathways/ai-pathway-courses/AiPathwaySchoolProgramItem.tsx @@ -0,0 +1,67 @@ +import React, { useMemo } from 'react'; + +import careerOneStopLogo from '../../../assets/images/career-one-stop-logo.png'; +import timeMachineIcon from '../../../assets/images/time-machine.icon.png'; +import AiPathwaySchoolProgramDetails from './AiPathwaySchoolProgramDetails'; + +import { useModal } from 'learn-card-base'; + +import { ModalTypes } from 'learn-card-base'; +import { TrainingProgram } from 'learn-card-base/types/careerOneStop'; +import { getOccupationTags } from './ai-pathway-courses.helpers'; + +const AiPathwaySchoolProgramItem: React.FC<{ program: TrainingProgram }> = ({ program }) => { + const { newModal } = useModal(); + + const openCourseDetailsModal = () => { + newModal(, undefined, { + desktop: ModalTypes.Right, + mobile: ModalTypes.Right, + }); + }; + + const occupationTags = getOccupationTags(program?.occupationDetails); + + const schoolImage = program?.school?.image_url; + const logo = schoolImage ? schoolImage : careerOneStopLogo; + + return ( +
+

+ {occupationTags} +

+
+

+ {program?.ProgramName} +

+
+ +

{program?.SchoolName}

+ +
+
+
+ Time Machine +
+
+ + Total: {program?.ProgramLength?.[0]?.Value} to complete + +
+
+
+ Edx Logo +
+
+
+ ); +}; + +export default AiPathwaySchoolProgramItem; diff --git a/apps/learn-card-app/src/pages/ai-pathways/ai-pathway-courses/ai-pathway-courses.helpers.ts b/apps/learn-card-app/src/pages/ai-pathways/ai-pathway-courses/ai-pathway-courses.helpers.ts new file mode 100644 index 0000000000..46e2ced696 --- /dev/null +++ b/apps/learn-card-app/src/pages/ai-pathways/ai-pathway-courses/ai-pathway-courses.helpers.ts @@ -0,0 +1,47 @@ +import _ from 'lodash'; + +import { TrainingProgram } from 'learn-card-base/types/careerOneStop'; + +export const normalizeSchoolPrograms = (trainingPrograms: TrainingProgram[]) => { + const randomSchoolPrograms = _.shuffle([...trainingPrograms]); + + const selectedSchoolPrograms = randomSchoolPrograms; + + const schoolPrograms = selectedSchoolPrograms.map((program: any) => ({ + ...(program?.SchoolPrograms?.[0] || {}), + keyword: program?.keyword, + courses: program?.syllabusCourses, + occupationDetails: program?.occupationDetails, + school: program?.syllabusCourses?.[0]?.institution, + })); + + return schoolPrograms; +}; + +export const filterCoursesByFieldOfStudy = ( + trainingPrograms: TrainingProgram[], + fieldOfStudy: string +) => { + // Extract all courses from all training programs + const allCourses = trainingPrograms?.flatMap((program: any) => { + return (program?.courses || []).map((course: any) => ({ + ...course, + occupationDetails: program?.occupationDetails, + keyword: program?.keyword, + })); + }); + + // Filter courses by field of study + const filteredCourses = allCourses.filter((course: any) => { + return course?.field?.field === fieldOfStudy; + }); + + // Randomize the filtered courses before returning + return _.shuffle(filteredCourses); +}; + +export const getOccupationTags = (occupationDetails: any) => { + const tags = occupationDetails?.AlternateTitles || []; + const occupationTitle = occupationDetails?.OnetTitle || ''; + return tags?.length > 0 ? tags?.slice(0, 3)?.join(', ') : occupationTitle; +}; diff --git a/apps/learn-card-app/src/pages/ai-pathways/ai-pathway-explore-content/AiPathwayContentItemSkeletonLoader.tsx b/apps/learn-card-app/src/pages/ai-pathways/ai-pathway-explore-content/AiPathwayContentItemSkeletonLoader.tsx new file mode 100644 index 0000000000..8ef37df0b9 --- /dev/null +++ b/apps/learn-card-app/src/pages/ai-pathways/ai-pathway-explore-content/AiPathwayContentItemSkeletonLoader.tsx @@ -0,0 +1,35 @@ +import React from 'react'; +import { IonSkeletonText } from '@ionic/react'; + +export const AiPathwayContentListItemSkeleton: React.FC = () => { + const mediaHeight = 'min-h-[80px] max-h-[80px]'; + + return ( +
+ {/* Thumbnail skeleton */} +
+ +
+ + {/* Text content skeleton */} +
+ {/* Title */} + + + {/* Source */} + +
+
+ ); +}; + +export default AiPathwayContentListItemSkeleton; diff --git a/apps/learn-card-app/src/pages/ai-pathways/ai-pathway-explore-content/AiPathwayContentList.tsx b/apps/learn-card-app/src/pages/ai-pathways/ai-pathway-explore-content/AiPathwayContentList.tsx new file mode 100644 index 0000000000..9dd14aff28 --- /dev/null +++ b/apps/learn-card-app/src/pages/ai-pathways/ai-pathway-explore-content/AiPathwayContentList.tsx @@ -0,0 +1,20 @@ +import React from 'react'; + +import { IonRow } from '@ionic/react'; +import AiPathwayContentListItem from './AiPathwayContentListItem'; + +import { AiPathwayContent } from './ai-pathway-content.helpers'; + +export const AiPathwayContentList: React.FC<{ + contentItems?: AiPathwayContent[]; +}> = ({ contentItems }) => { + return ( + + {contentItems?.map((item, index) => ( + + ))} + + ); +}; + +export default AiPathwayContentList; diff --git a/apps/learn-card-app/src/pages/ai-pathways/ai-pathway-explore-content/AiPathwayContentListItem.tsx b/apps/learn-card-app/src/pages/ai-pathways/ai-pathway-explore-content/AiPathwayContentListItem.tsx new file mode 100644 index 0000000000..286aada46c --- /dev/null +++ b/apps/learn-card-app/src/pages/ai-pathways/ai-pathway-explore-content/AiPathwayContentListItem.tsx @@ -0,0 +1,81 @@ +import React, { useEffect, useState } from 'react'; + +import Video from 'learn-card-base/svgs/Video'; +import AiPathwayContentPreview from './AiPathwayContentPreview'; +import EmptyImage from 'learn-card-base/assets/images/empty-image.png'; + +import { + useModal, + ModalTypes, + VideoMetadata, + getVideoSource, + getVideoMetadata, +} from 'learn-card-base'; + +import useTheme from '../../../theme/hooks/useTheme'; + +import { AiPathwayContent } from './ai-pathway-content.helpers'; + +const AiPathwayContentListItem: React.FC<{ + content: AiPathwayContent; +}> = ({ content }) => { + const { colors } = useTheme(); + const primaryColor = colors?.defaults?.primaryColor; + const { newModal } = useModal({ mobile: ModalTypes.Cancel, desktop: ModalTypes.Cancel }); + + const [metaData, setMetaData] = useState(null); + + const handleGetVideoMetadata = async () => { + const metadata = await getVideoMetadata(content.url || ''); + setMetaData(metadata); + }; + + const handleViewCourse = () => { + newModal(, undefined, { + desktop: ModalTypes.Right, + mobile: ModalTypes.Right, + }); + }; + + useEffect(() => { + handleGetVideoMetadata(); + }, [content]); + + const mediaHeight = 'min-h-[80px] max-h-[80px]'; + + return ( +
+ <> +
+
+ {content.title +
+
+
+ +
+

+ {content.title} +

+

+ {getVideoSource(content.url || '')} +

+
+ +
+ ); +}; + +export default AiPathwayContentListItem; diff --git a/apps/learn-card-app/src/pages/ai-pathways/ai-pathway-explore-content/AiPathwayContentPreview.tsx b/apps/learn-card-app/src/pages/ai-pathways/ai-pathway-explore-content/AiPathwayContentPreview.tsx new file mode 100644 index 0000000000..3eb1416758 --- /dev/null +++ b/apps/learn-card-app/src/pages/ai-pathways/ai-pathway-explore-content/AiPathwayContentPreview.tsx @@ -0,0 +1,113 @@ +import React, { useEffect, useState } from 'react'; + +import { Lightbox, LightboxItem } from '@learncard/react'; +import Video from 'learn-card-base/svgs/Video'; +import { IonFooter } from '@ionic/react'; + +import { useModal, VideoMetadata, getVideoMetadata, getVideoSource } from 'learn-card-base'; + +import { AiPathwayContent } from './ai-pathway-content.helpers'; + +const AiPathwayContentPreview: React.FC<{ content: AiPathwayContent }> = ({ content }) => { + const { closeModal } = useModal(); + + const [metaData, setMetaData] = useState(null); + const [currentLightboxUrl, setCurrentLightboxUrl] = useState(undefined); + + const handleGetVideoMetadata = async () => { + const metadata = await getVideoMetadata(content.url || ''); + setMetaData(metadata); + }; + + useEffect(() => { + handleGetVideoMetadata(); + }, [content]); + + return ( +
e.stopPropagation()} + className="flex flex-col gap-[10px] bg-transparent mx-auto cursor-auto min-w-[300px] h-full safe-area-top-margin" + > + +
+
+
+ {/* header */} +
+
+ {content.title} + +
+ +
+ +

+ {content.title} +

+
+ + {/* details */} +
+
+

+ Provided by +

+ +

+ {content.source ?? getVideoSource(content.url || '')} +

+
+
+ +
+
+
+ + {/* description */} +
+

+ {content.description} +

+
+
+
+
+ +
+ + +
+
+
+ ); +}; + +export default AiPathwayContentPreview; diff --git a/apps/learn-card-app/src/pages/ai-pathways/ai-pathway-explore-content/AiPathwayExploreContent.tsx b/apps/learn-card-app/src/pages/ai-pathways/ai-pathway-explore-content/AiPathwayExploreContent.tsx new file mode 100644 index 0000000000..11f89e8ea8 --- /dev/null +++ b/apps/learn-card-app/src/pages/ai-pathways/ai-pathway-explore-content/AiPathwayExploreContent.tsx @@ -0,0 +1,65 @@ +import React from 'react'; + +import AiPathwayContentList from './AiPathwayContentList'; +import AiPathwayContentListItemSkeleton from './AiPathwayContentItemSkeletonLoader'; + +import { CAREER_ONE_STOP_VIDEOS } from 'learn-card-base/helpers/careerOneStop.helpers'; +import { AiPathwayContent } from './ai-pathway-content.helpers'; + +const AiPathwayExploreContent: React.FC<{ + occupations?: any[]; + isLoading?: boolean; +}> = ({ occupations = [], isLoading = false }) => { + if (isLoading) { + return ( +
+
+
+

+ Explore Content +

+
+ +
+
+ {Array.from({ length: 3 }).map((_, index) => ( + + ))} +
+
+
+
+ ); + } + + const contentItems: AiPathwayContent[] = occupations?.map((occupation, index) => { + const videoCode = occupation?.Video?.[0]?.VideoCode?.replace(/[^0-9]/g, ''); + + const { youtubeUrl } = CAREER_ONE_STOP_VIDEOS.find(v => v.VideoCode === videoCode) || {}; + return { + id: occupation?.OnetCode, + title: occupation?.OnetTitle, + description: occupation?.OnetDescription, + source: 'Youtube', + url: youtubeUrl || '', + }; + }); + + if (!isLoading && (!contentItems || contentItems.length === 0)) return null; + + return ( +
+
+
+

Explore Content

+
+ +
+ +
+
+
+ ); +}; + +export default AiPathwayExploreContent; diff --git a/apps/learn-card-app/src/pages/ai-pathways/ai-pathway-explore-content/ai-pathway-content.helpers.ts b/apps/learn-card-app/src/pages/ai-pathways/ai-pathway-explore-content/ai-pathway-content.helpers.ts new file mode 100644 index 0000000000..3dd7d5dd00 --- /dev/null +++ b/apps/learn-card-app/src/pages/ai-pathways/ai-pathway-explore-content/ai-pathway-content.helpers.ts @@ -0,0 +1,24 @@ +export type AiPathwayContent = { + id?: number; + title?: string; + description?: string; + source?: string; + url?: string; +}; + +export const AI_PATHWAY_CONTENT: AiPathwayContent[] = [ + { + id: 1, + title: 'Javascript Beginners Course', + description: 'Learn the fundamentals of Javascript programming', + source: 'YouTube', + url: 'https://www.youtube.com/watch?v=x2RNw4M6cME', + }, + { + id: 2, + title: 'React Native Reanimated Course', + description: 'Learn the fundamentals of React Native Reanimated programming', + source: 'YouTube', + url: 'https://www.youtube.com/watch?v=Wr2fOM_xD2I', + }, +]; diff --git a/apps/learn-card-app/src/pages/ai-pathways/ai-pathway-sessions/AiPathwaySessionItem.tsx b/apps/learn-card-app/src/pages/ai-pathways/ai-pathway-sessions/AiPathwaySessionItem.tsx new file mode 100644 index 0000000000..ac9d9fd63b --- /dev/null +++ b/apps/learn-card-app/src/pages/ai-pathways/ai-pathway-sessions/AiPathwaySessionItem.tsx @@ -0,0 +1,72 @@ +import React from 'react'; +import { useHistory } from 'react-router-dom'; + +import SlimCaretRight from '../../../components/svgs/SlimCaretRight'; +import LockSimple from 'learn-card-base/svgs/LockSimple'; + +import 'swiper/css'; + +export const AiPathwaySessionsItem: React.FC<{ + title: string | undefined; + description: string | undefined; + skills: Array<{ title: string; description?: string }> | undefined; + topicUri: string | undefined; + pathwayUri: string | undefined; +}> = ({ title, description, skills, topicUri, pathwayUri }) => { + const history = useHistory(); + + const handleStart = (item: any) => { + if (!item?.topicUri || !item?.pathwayUri) return; + + history.push( + `/chats?topicUri=${encodeURIComponent(item.topicUri)}&pathwayUri=${encodeURIComponent( + item.pathwayUri + )}` + ); + }; + + return ( +
+ handleStart({ + title, + description, + skills, + topicUri, + pathwayUri, + }) + } + > +
+
+

+ {title} +

+ +
+ +
+
+

+ {description} +

+
+
+ {skills?.map(({ title }, idx) => ( + + + + {title} + + ))} +
+
+ ); +}; + +export default AiPathwaySessionsItem; diff --git a/apps/learn-card-app/src/pages/ai-pathways/ai-pathway-sessions/AiPathwaySessionItemSkeleton.tsx b/apps/learn-card-app/src/pages/ai-pathways/ai-pathway-sessions/AiPathwaySessionItemSkeleton.tsx new file mode 100644 index 0000000000..b8bb8f858c --- /dev/null +++ b/apps/learn-card-app/src/pages/ai-pathways/ai-pathway-sessions/AiPathwaySessionItemSkeleton.tsx @@ -0,0 +1,45 @@ +import React from 'react'; + +import { IonSkeletonText } from '@ionic/react'; + +export const AiPathwaySessionItemSkeleton: React.FC = () => ( +
+
+
+ + +
+
+ + + +
+
+
+ {[1, 2, 3].map(i => ( + + ))} +
+
+); + +export default AiPathwaySessionItemSkeleton; diff --git a/apps/learn-card-app/src/pages/ai-pathways/ai-pathway-sessions/AiPathwaySessions.tsx b/apps/learn-card-app/src/pages/ai-pathways/ai-pathway-sessions/AiPathwaySessions.tsx new file mode 100644 index 0000000000..3a6998cba3 --- /dev/null +++ b/apps/learn-card-app/src/pages/ai-pathways/ai-pathway-sessions/AiPathwaySessions.tsx @@ -0,0 +1,54 @@ +import React from 'react'; + +import AiPathwaySessionsItem from './AiPathwaySessionItem'; +import AiPathwaySessionsSkeletonLoader from './AiPathwaySessionsSkeletonLoader'; + +export const AiPathwaySessions: React.FC<{ + learningPathwaysData?: any[]; + isLoading?: boolean; +}> = ({ learningPathwaysData, isLoading }) => { + const titleEl = ( +
+

Explore AI Sessions

+
+ ); + + if (isLoading) + return ( +
+
+ {titleEl} + +
+ +
+
+
+ ); + + if (!isLoading && (!learningPathwaysData || learningPathwaysData.length === 0)) return null; + + return ( +
+
+ {titleEl} +
+ {learningPathwaysData?.map( + ({ title, description, skills, topicUri, pathwayUri }, index) => ( + + ) + )} +
+
+
+ ); +}; + +export default AiPathwaySessions; diff --git a/apps/learn-card-app/src/pages/ai-pathways/ai-pathway-sessions/AiPathwaySessionsSkeletonLoader.tsx b/apps/learn-card-app/src/pages/ai-pathways/ai-pathway-sessions/AiPathwaySessionsSkeletonLoader.tsx new file mode 100644 index 0000000000..0d81cc01e2 --- /dev/null +++ b/apps/learn-card-app/src/pages/ai-pathways/ai-pathway-sessions/AiPathwaySessionsSkeletonLoader.tsx @@ -0,0 +1,55 @@ +import React from 'react'; + +import { IonSkeletonText } from '@ionic/react'; + +export const AiPathwaySessionsSkeletonLoader: React.FC = () => { + return ( +
+ <> + {[...Array(3)].map((_, i) => ( +
+
+ + + +
+ +
+ + + +
+ +
+ {[...Array(3)].map((_, i) => ( +
+ +
+ ))} +
+
+ ))} + +
+ ); +}; + +export default AiPathwaySessionsSkeletonLoader; diff --git a/apps/learn-card-app/src/pages/ai-pathways/ai-pathways-discovery/AiPathwaysDiscovery.tsx b/apps/learn-card-app/src/pages/ai-pathways/ai-pathways-discovery/AiPathwaysDiscovery.tsx new file mode 100644 index 0000000000..6531e48eb8 --- /dev/null +++ b/apps/learn-card-app/src/pages/ai-pathways/ai-pathways-discovery/AiPathwaysDiscovery.tsx @@ -0,0 +1,116 @@ +import React, { useMemo, useState } from 'react'; + +import { IonContent, IonPage } from '@ionic/react'; +import { ErrorBoundary } from 'react-error-boundary'; +import AiPathwaysDiscoverySearch from './AiPathwaysDiscoverySearch'; +import MainHeader from '../../../components/main-header/MainHeader'; +import AiPathwayCareers from '../ai-pathway-careers/AiPathwayCareers'; +import AiPathwayCourses from '../ai-pathway-courses/AiPathwayCourses'; +import AiPathwaysEmptyPlaceholder from '../AiPathwaysEmptyPlaceholder'; + +import ExploreAiInsightsButton from '../../ai-insights/ExploreAiInsightsButton'; +import ExperimentalFeatureBox from '../../../components/generic/ExperimentalFeatureBox'; +import ErrorBoundaryFallback from '../../../components/boost/boostErrors/BoostErrorsDisplay'; +import AiPathwayExploreContent from '../ai-pathway-explore-content/AiPathwayExploreContent'; + +import { SubheaderTypeEnum } from '../../../components/main-subheader/MainSubHeader.types'; +import { CredentialCategoryEnum } from 'learn-card-base'; + +import useTheme from '../../../theme/hooks/useTheme'; +import { + useOccupationDetailsForKeyword, + useTrainingProgramsByKeyword, +} from 'learn-card-base/react-query/queries/careerOneStop'; +import { normalizeSchoolPrograms } from '../ai-pathway-courses/ai-pathway-courses.helpers'; + +const AiPathwaysDiscovery: React.FC = () => { + const { getThemedCategoryColors } = useTheme(); + const [keywordInput, setKeywordInput] = useState(''); + const [searchKeyword, setSearchKeyword] = useState(''); + + const colors = getThemedCategoryColors(CredentialCategoryEnum.aiPathway); + const { backgroundSecondaryColor } = colors; + + // Use search keyword if provided, otherwise fall back to original logic + const activeKeywords = searchKeyword ? [searchKeyword] : []; + + const { data: trainingPrograms, isLoading: fetchTrainingProgramsLoading } = + useTrainingProgramsByKeyword({ + keywords: activeKeywords as string[], + }); + + const schoolPrograms = useMemo(() => { + return trainingPrograms?.length ? normalizeSchoolPrograms(trainingPrograms) : []; + }, [trainingPrograms]); + + const { data: occupations, isLoading: fetchOccupationsLoading } = + useOccupationDetailsForKeyword(activeKeywords?.[0] || ''); + + const isLoading = fetchTrainingProgramsLoading || fetchOccupationsLoading; + + const emptyPathways = !isLoading && !occupations && schoolPrograms.length === 0; + + return ( + + }> + + +
+
+ +
+ + {/* Search Input Section */} + + + {emptyPathways ? ( +
+ {searchKeyword && ( +
+
+

+ No results found for "{searchKeyword}" +

+
+
+ )} + +
+ ) : ( + <> + + + + + )} +
+
+
+
+ ); +}; + +export default AiPathwaysDiscovery; diff --git a/apps/learn-card-app/src/pages/ai-pathways/ai-pathways-discovery/AiPathwaysDiscoverySearch.tsx b/apps/learn-card-app/src/pages/ai-pathways/ai-pathways-discovery/AiPathwaysDiscoverySearch.tsx new file mode 100644 index 0000000000..1248581434 --- /dev/null +++ b/apps/learn-card-app/src/pages/ai-pathways/ai-pathways-discovery/AiPathwaysDiscoverySearch.tsx @@ -0,0 +1,63 @@ +import React from 'react'; +import { IonLabel, IonInput } from '@ionic/react'; + +const AiPathwaysDiscoverySearch: React.FC<{ + keywordInput: string; + setKeywordInput: (value: string) => void; + setSearchKeyword: (value: string) => void; + searchKeyword: string; +}> = ({ keywordInput, setKeywordInput, searchKeyword, setSearchKeyword }) => { + const handleSearch = () => { + if (keywordInput.trim()) { + setSearchKeyword(keywordInput.trim()); + } + }; + + const clearSearch = () => { + setSearchKeyword(''); + setKeywordInput(''); + }; + + return ( +
+
+
+ + Enter a career keyword + + setKeywordInput(e.detail.value)} + autocapitalize="on" + className={`bg-grayscale-100 text-grayscale-800 rounded-[15px] ion-padding font-medium tracking-widest text-sm`} + placeholder="e.g. Software Engineer" + type="text" + /> +
+
+ + + +
+ {searchKeyword && ( +
+ Searching for: {searchKeyword} +
+ )} +
+
+ ); +}; + +export default AiPathwaysDiscoverySearch; diff --git a/apps/learn-card-app/src/pages/ai-pathways/docs/ai-pathways-flow.md b/apps/learn-card-app/src/pages/ai-pathways/docs/ai-pathways-flow.md new file mode 100644 index 0000000000..dbc6f5c103 --- /dev/null +++ b/apps/learn-card-app/src/pages/ai-pathways/docs/ai-pathways-flow.md @@ -0,0 +1,42 @@ +# AI Pathways - Flow Diagram + +```mermaid +flowchart TD + A[Start] --> B[Query AI Insights] + + B --> C{Learning Pathways Present?} + + C -->|Yes| D[Extract Keywords + FieldOfStudy from Learning Pathways] + C -->|No| E{Strongest Area Identified?} + + E -->|Yes| F[Extract Keywords + FieldOfStudy from Strongest Area] + E -->|No| G[No Keywords Available] + + D --> H[Normalize & Deduplicate Keywords + FieldOfStudy] + F --> H + + H --> I{Any Keywords After Normalization?} + + I -->|No| Z[Skip Careers, Courses, Training, Content] + + I -->|Yes| J[Query CareerOneStop Occupations] + + J --> K[Fetch Training Programs per Occupation] + + K --> L[Extract School Names from Programs] + + L --> M[Query OpenSyllabus by School] + + M --> N[Filter Courses by FieldOfStudy] + + N --> O{Courses Found?} + + O -->|Yes| P[Display OpenSyllabus Courses] + O -->|No| Q[Display CareerOneStop Training Programs] + + P --> R[Build AI Pathway Results] + Q --> R + Z --> R + + R --> S[End] +``` diff --git a/apps/learn-card-app/src/pages/consentFlow/ExternalConsentFlowDoor.test.tsx b/apps/learn-card-app/src/pages/consentFlow/ExternalConsentFlowDoor.test.tsx deleted file mode 100644 index c3b0dedca1..0000000000 --- a/apps/learn-card-app/src/pages/consentFlow/ExternalConsentFlowDoor.test.tsx +++ /dev/null @@ -1,257 +0,0 @@ -/** - * Unit tests for ExternalConsentFlowDoor race condition - * - * BUG: When user clicks "Continue" while consentedContractLoading is true, - * the component navigates to consent-flow-sync-data instead of waiting - * for the consent query to complete. - * - * These tests verify the fix: navigation should be deferred until - * the consent query completes. - */ - -import * as React from 'react'; -import { vi, describe, it, expect, beforeEach, Mock } from 'vitest'; -import { render, screen, fireEvent, waitFor } from '@testing-library/react'; - -// Ensure React is in scope for JSX -global.React = React; - -// Mock query-string before it's imported -vi.mock('query-string', () => ({ - default: { - parse: vi.fn(() => ({ - uri: 'lc:network:localhost:contract:test-123', - returnTo: 'https://example.com/callback', - recipientToken: undefined, - })), - }, - parse: vi.fn(() => ({ - uri: 'lc:network:localhost:contract:test-123', - returnTo: 'https://example.com/callback', - recipientToken: undefined, - })), -})); - -// Mock Capacitor -vi.mock('@capacitor/core', () => ({ - Capacitor: { - getPlatform: () => 'web', - isNativePlatform: () => false, - }, -})); - -vi.mock('@capacitor-firebase/authentication', () => ({ - FirebaseAuthentication: { - signOut: vi.fn(), - }, -})); - -// Mock sub-components that have complex dependencies -vi.mock('./GameFlow/FullScreenGameFlow', () => ({ - __esModule: true, - default: () =>
, -})); - -vi.mock('./ConsentFlowCredFrontDoor', () => ({ - __esModule: true, - default: () =>
, -})); - -vi.mock('./ConsentFlowError', () => ({ - __esModule: true, - default: () =>
, -})); - -// Mock all the heavy dependencies -vi.mock('@ionic/react', () => ({ - IonPage: ({ children, className }: any) =>
{children}
, - IonCol: ({ children }: any) =>
{children}
, - IonRow: ({ children }: any) =>
{children}
, - IonSkeletonText: () =>
, - IonSpinner: () =>
, -})); - -vi.mock('react-router-dom', () => ({ - useHistory: vi.fn(), - useLocation: vi.fn(), -})); - -vi.mock('@tanstack/react-query', () => ({ - useQueryClient: () => ({ resetQueries: vi.fn() }), -})); - -// Mock the entire learn-card-base module to avoid deep crypto dependencies -// Use require for mocks that need to be configurable -const mockFns = { - useContract: vi.fn(), - useConsentedContracts: vi.fn(), - useCurrentUser: vi.fn(), - initWallet: vi.fn(), -}; - -vi.mock('learn-card-base/hooks/useGetCurrentUser', () => ({ - __esModule: true, - default: () => mockFns.useCurrentUser(), -})); - -vi.mock('learn-card-base/hooks/useConsentedContracts', () => ({ - useConsentedContracts: () => mockFns.useConsentedContracts(), -})); - -vi.mock('learn-card-base/hooks/useSocialLogins', () => ({ - SocialLoginTypes: { - apple: 'apple', - sms: 'sms', - passwordless: 'passwordless', - google: 'google', - }, -})); - -vi.mock('learn-card-base', () => ({ - useWallet: () => ({ initWallet: mockFns.initWallet }), - ProfilePicture: () =>
, - pushUtilities: { revokePushToken: vi.fn() }, - useWeb3Auth: () => ({ logout: vi.fn() }), - useSQLiteStorage: () => ({ clearDB: vi.fn(), setCurrentUser: vi.fn() }), - useContract: (...args: any[]) => mockFns.useContract(...args), - redirectStore: { set: { authRedirect: vi.fn() } }, - ModalTypes: { FullScreen: 'fullscreen' }, - useModal: () => ({ newModal: vi.fn() }), -})); - -vi.mock('learn-card-base/stores/authStore', () => ({ - __esModule: true, - default: { get: { typeOfLogin: () => '', deviceToken: () => '' } }, -})); - -vi.mock('../../firebase/firebase', () => ({ - auth: () => ({ signOut: vi.fn() }), -})); - -vi.mock('../../helpers/externalLinkHelpers', () => ({ - openPP: vi.fn(), - openToS: vi.fn(), -})); - -vi.mock('../../theme/hooks/useTheme', () => ({ - __esModule: true, - default: () => ({ colors: { defaults: { primaryColor: 'emerald-700' } } }), -})); - -// Import after mocks -import { useHistory, useLocation } from 'react-router-dom'; -import ExternalConsentFlowDoor from './ExternalConsentFlowDoor'; - -const mockUseHistory = useHistory as Mock; -const mockUseLocation = useLocation as Mock; - -describe('ExternalConsentFlowDoor', () => { - const mockPush = vi.fn(); - const contractUri = 'lc:network:localhost:contract:test-123'; - const returnTo = 'https://example.com/callback'; - - beforeEach(() => { - vi.clearAllMocks(); - - mockUseHistory.mockReturnValue({ push: mockPush }); - mockUseLocation.mockReturnValue({ - search: `?uri=${encodeURIComponent(contractUri)}&returnTo=${encodeURIComponent(returnTo)}`, - pathname: '/consent-flow-login', - }); - - mockFns.useCurrentUser.mockReturnValue({ - name: 'Test User', - uid: 'test-uid', - }); - - mockFns.useContract.mockReturnValue({ - data: { - name: 'Test Contract', - subtitle: 'Test subtitle', - image: 'https://example.com/image.png', - }, - isPending: false, - error: null, - }); - }); - - describe('Race condition: clicking Continue while consent query is loading', () => { - it('should NOT navigate to sync-data when clicked while loading (bug reproduction)', async () => { - // Setup: consent query is still loading, but data exists - mockFns.useConsentedContracts.mockReturnValue({ - data: undefined, // Data not yet loaded - isLoading: true, - }); - - render(); - - // Find and click the Continue button - const continueButton = screen.getByRole('button', { name: /continue as/i }); - fireEvent.click(continueButton); - - // BUG: Without fix, this navigates to consent-flow-sync-data immediately - // EXPECTED: Should NOT navigate while loading - expect(mockPush).not.toHaveBeenCalledWith( - expect.stringContaining('consent-flow-sync-data') - ); - }); - - it('should wait for consent query to complete before navigating', async () => { - // Setup: Start with loading state - const mockConsentData = { - contract: { uri: contractUri, owner: { did: 'did:example:owner' } }, - }; - - // Initially loading - mockFns.useConsentedContracts.mockReturnValue({ - data: undefined, - isLoading: true, - }); - - const { rerender } = render(); - - // Click while loading - const continueButton = screen.getByRole('button', { name: /continue as/i }); - fireEvent.click(continueButton); - - // Should not have navigated yet - expect(mockPush).not.toHaveBeenCalled(); - - // Now simulate loading complete with consent data - mockFns.useConsentedContracts.mockReturnValue({ - data: [mockConsentData], - isLoading: false, - }); - - rerender(); - - // After loading completes, should handle navigation appropriately - // (either redirect to returnTo or show appropriate UI) - await waitFor(() => { - // Should NOT navigate to sync-data for already-consented user - const syncDataCalls = mockPush.mock.calls.filter( - (call: any) => call[0]?.includes('consent-flow-sync-data') - ); - expect(syncDataCalls).toHaveLength(0); - }); - }); - - it('should navigate to sync-data only for users who have NOT consented', async () => { - // Setup: consent query complete, user has NOT consented to this contract - mockFns.useConsentedContracts.mockReturnValue({ - data: [], // Empty - no consented contracts - isLoading: false, - }); - - render(); - - const continueButton = screen.getByRole('button', { name: /continue as/i }); - fireEvent.click(continueButton); - - // For non-consented user, SHOULD navigate to sync-data - expect(mockPush).toHaveBeenCalledWith( - expect.stringContaining('consent-flow-sync-data') - ); - }); - }); -}); diff --git a/apps/learn-card-app/src/pages/consentFlow/ExternalConsentFlowDoor.tsx b/apps/learn-card-app/src/pages/consentFlow/ExternalConsentFlowDoor.tsx index 0c38900ed1..61c21ca45b 100644 --- a/apps/learn-card-app/src/pages/consentFlow/ExternalConsentFlowDoor.tsx +++ b/apps/learn-card-app/src/pages/consentFlow/ExternalConsentFlowDoor.tsx @@ -67,7 +67,6 @@ const ExternalConsentFlowDoor: React.FC<{ login: boolean }> = ({ login = false } const consentedContract = consentedContracts?.find(c => c?.contract?.uri === uri); const [step, setStep] = useState(Step.landing); - const [userClickedContinue, setUserClickedContinue] = useState(false); const { data: contractDetails, @@ -89,74 +88,6 @@ const ExternalConsentFlowDoor: React.FC<{ login: boolean }> = ({ login = false } } }, [error]); - // Handle navigation after user clicks Continue AND consent query completes - useEffect(() => { - if (!userClickedContinue || consentedContractLoading) return; - - const handleNavigation = async () => { - const hasCredentialFrontDoor = contractDetails?.frontDoorBoostUri; - - // User already consented - redirect to returnTo with credentials - if (login && returnTo && typeof returnTo === 'string' && consentedContract) { - if (returnTo.startsWith('http://') || returnTo.startsWith('https://')) { - const wallet = await initWallet(); - - const urlObj = new URL(returnTo); - urlObj.searchParams.set('did', wallet.id.did()); - - if (consentedContract?.contract?.owner?.did) { - const unsignedDelegateCredential = wallet.invoke.newCredential({ - type: 'delegate', - subject: consentedContract?.contract?.owner.did, - access: ['read', 'write'], - }); - - const delegateCredential = await wallet.invoke.issueCredential( - unsignedDelegateCredential - ); - - const unsignedDidAuthVp: any = await wallet.invoke.newPresentation( - delegateCredential - ); - - if (uri && typeof uri === 'string') { - unsignedDidAuthVp.contractUri = uri; - } - - const vp = (await wallet.invoke.issuePresentation(unsignedDidAuthVp, { - proofPurpose: 'authentication', - proofFormat: 'jwt', - })) as any as string; - - urlObj.searchParams.set('vp', vp); - } - - window.location.href = urlObj.toString(); - return; - } - } - - // User has NOT consented - proceed to sync-data flow - if (hasCredentialFrontDoor) { - setStep(Step.credFrontDoor); - } else if (returnTo) { - history.push( - `/consent-flow-sync-data?uri=${uri}&returnTo=${returnTo}${ - recipientToken ? `&recipientToken=${recipientToken}` : '' - }` - ); - } else { - history.push( - `/consent-flow-sync-data?uri=${uri}${ - recipientToken ? `&recipientToken=${recipientToken}` : '' - }` - ); - } - }; - - handleNavigation(); - }, [userClickedContinue, consentedContractLoading, consentedContract, login, returnTo, contractDetails, uri, recipientToken, history]); - // TODO duplicated from QRCodeUserCard, should turn into helper const handleLogout = async () => { const typeOfLogin = authStore?.get?.typeOfLogin(); @@ -264,11 +195,84 @@ const ExternalConsentFlowDoor: React.FC<{ login: boolean }> = ({ login = false } /> diff --git a/apps/learn-card-app/src/pages/hidden/LoginWithSeed.tsx b/apps/learn-card-app/src/pages/hidden/LoginWithSeed.tsx index 4085a29688..f00571b04a 100644 --- a/apps/learn-card-app/src/pages/hidden/LoginWithSeed.tsx +++ b/apps/learn-card-app/src/pages/hidden/LoginWithSeed.tsx @@ -8,7 +8,6 @@ import { walletStore } from 'learn-card-base/stores/walletStore'; import { IonCol, IonInput } from '@ionic/react'; import { setAuthToken } from 'learn-card-base/helpers/authHelpers'; -import { setPlatformPrivateKey } from 'learn-card-base/security/platformPrivateKeyStorage'; const LoginWithSeed: React.FC = () => { const history = useHistory(); @@ -37,9 +36,6 @@ const LoginWithSeed: React.FC = () => { currentUserStore.set.currentUser(dummyUser); - // Store private key in secure web storage (IndexedDB) for persistence across page navigations - await setPlatformPrivateKey(seed); - const wallet = await initWallet(seed); if (wallet) { walletStore.set.wallet(wallet); diff --git a/apps/learn-card-app/src/pages/launchPad/EmbedAppFullScreen.tsx b/apps/learn-card-app/src/pages/launchPad/EmbedAppFullScreen.tsx index 0dba82c061..ccd86a0186 100644 --- a/apps/learn-card-app/src/pages/launchPad/EmbedAppFullScreen.tsx +++ b/apps/learn-card-app/src/pages/launchPad/EmbedAppFullScreen.tsx @@ -1,10 +1,9 @@ -import React, { useState, useCallback } from 'react'; +import React from 'react'; import { useHistory, useParams } from 'react-router-dom'; import { IonPage, IonContent, IonHeader, IonToolbar, IonButtons, IonButton, IonTitle } from '@ionic/react'; import { useLearnCardPostMessage } from '../../hooks/post-message/useLearnCardPostMessage'; import { useLearnCardMessageHandlers } from '../../hooks/post-message/useLearnCardMessageHandlers'; -import { CredentialClaimModal } from './CredentialClaimModal'; interface EmbedAppParams { appId: string; @@ -28,21 +27,7 @@ interface LaunchConfig { export const EmbedAppFullScreen: React.FC = () => { const history = useHistory<{ embedUrl?: string; appName?: string; launchConfig?: LaunchConfig; isInstalled?: boolean }>(); const { appId } = useParams(); - const [isLoading, setIsLoading] = useState(true); - - // Credential claim modal state - const [pendingCredential, setPendingCredential] = useState<{ - credentialUri: string; - boostUri?: string; - } | null>(null); - - const handleCredentialIssued = useCallback((credentialUri: string, boostUri?: string) => { - setPendingCredential({ credentialUri, boostUri }); - }, []); - - const handleDismissClaimModal = useCallback(() => { - setPendingCredential(null); - }, []); + const [isLoading, setIsLoading] = React.useState(true); // Get embedUrl and appName from query params or location state const queryParams = React.useMemo(() => new URLSearchParams(history.location.search), [history.location.search]); @@ -77,15 +62,13 @@ export const EmbedAppFullScreen: React.FC = () => { embedOrigin, launchConfig, isInstalled, - appId, - onCredentialIssued: handleCredentialIssued, }); // Initialize the PostMessage listener with trusted origins useLearnCardPostMessage({ trustedOrigins: embedOrigin ? [embedOrigin] : [], handlers, - debug: true, // Disable detailed logging + debug: false, // Disable detailed logging }); if (!embedUrl) { @@ -148,14 +131,6 @@ export const EmbedAppFullScreen: React.FC = () => { />
- - {pendingCredential && ( - - )} ); }; diff --git a/apps/learn-card-app/src/pages/login/LoginFooter.tsx b/apps/learn-card-app/src/pages/login/LoginFooter.tsx index 534c7080d7..281d21cf1f 100644 --- a/apps/learn-card-app/src/pages/login/LoginFooter.tsx +++ b/apps/learn-card-app/src/pages/login/LoginFooter.tsx @@ -1,4 +1,5 @@ import React from 'react'; +import { useHistory } from 'react-router-dom'; import { IonCol } from '@ionic/react'; import SeedPhraseModal from './SeedPhraseModal'; @@ -17,6 +18,7 @@ import { ModalTypes, useModal } from 'learn-card-base'; const LoginFooter: React.FC<{ hideSelfCustodialLogin?: boolean }> = ({ hideSelfCustodialLogin = false, }) => { + const history = useHistory(); const { newModal } = useModal({ desktop: ModalTypes.Cancel, mobile: ModalTypes.FullScreen, @@ -71,6 +73,15 @@ const LoginFooter: React.FC<{ hideSelfCustodialLogin?: boolean }> = ({ > Learn More + {!hideSelfCustodialLogin && ( = ({}) => { return (
- -
- - -
- - Explore AI Insights - - + {showPlaceholder && } diff --git a/apps/learn-card-app/src/pages/wallet/WalletPage.tsx b/apps/learn-card-app/src/pages/wallet/WalletPage.tsx index 21e54b51ae..8303db414c 100644 --- a/apps/learn-card-app/src/pages/wallet/WalletPage.tsx +++ b/apps/learn-card-app/src/pages/wallet/WalletPage.tsx @@ -97,7 +97,7 @@ const WalletPage: React.FC = () => { const categoryToPath: Partial> = { [CredentialCategoryEnum.aiTopic]: '/ai/topics', - // [CredentialCategoryEnum.aiPathway]: '/ai/pathways', // placeholder + [CredentialCategoryEnum.aiPathway]: '/ai/pathways', // placeholder [CredentialCategoryEnum.aiInsight]: '/ai/insights', // placeholder [CredentialCategoryEnum.skill]: '/skills', [CredentialCategoryEnum.socialBadge]: '/socialBadges', diff --git a/apps/learn-card-app/src/stores/sdkActivityStore.ts b/apps/learn-card-app/src/stores/sdkActivityStore.ts deleted file mode 100644 index ab12257b87..0000000000 --- a/apps/learn-card-app/src/stores/sdkActivityStore.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { createStore } from '@udecode/zustood'; - -/** - * Store for tracking SDK/partner-connect activity. - * Used to show a subtle loading indicator when SDK operations are in progress. - */ -export const sdkActivityStore = createStore('sdkActivityStore')<{ - activeRequests: number; -}>({ activeRequests: 0 }) - .extendSelectors((_set, get) => ({ - isActive: () => get.activeRequests() > 0, - })) - .extendActions((set, get) => ({ - startActivity: () => { - set.activeRequests(get.activeRequests() + 1); - }, - endActivity: () => { - set.activeRequests(Math.max(0, get.activeRequests() - 1)); - }, - })); - -export default sdkActivityStore; diff --git a/apps/learn-card-app/src/theme/icons/index.tsx b/apps/learn-card-app/src/theme/icons/index.tsx index 81ac203129..0a1bfe3874 100644 --- a/apps/learn-card-app/src/theme/icons/index.tsx +++ b/apps/learn-card-app/src/theme/icons/index.tsx @@ -45,6 +45,7 @@ const { const { AiSessionsIconFormal, AiPathwaysIconFormal, + AiPathwaysSideMenuIconFormal, AiInsightsIconFormal, SkillsIconFormal, BoostsIconFormal, @@ -186,6 +187,7 @@ export const icons = { IconWithShape: AiSessionsIconWithShape, }, [CredentialCategoryEnum.aiPathway]: { + Icon: AiPathwaysIconWithShape, IconWithShape: AiPathwaysIconWithShape, }, [CredentialCategoryEnum.aiInsight]: { @@ -303,7 +305,7 @@ export const icons = { adminTools: ThinnerShieldChevron, wallet: WalletFormalIcon, [CredentialCategoryEnum.aiTopic]: AiSessionFormalIcon, - [CredentialCategoryEnum.aiPathway]: AiPathwaysTwoTonedIcon, // need bold icon + [CredentialCategoryEnum.aiPathway]: AiPathwaysSideMenuIconFormal, // need bold icon [CredentialCategoryEnum.aiInsight]: AiInsightsTwoTonedIcon, // need bold icon [CredentialCategoryEnum.skill]: SkillsFormalIcon, [CredentialCategoryEnum.socialBadge]: BoostsFormalIcon, diff --git a/apps/learn-card-app/src/theme/schemas/colorful.ts b/apps/learn-card-app/src/theme/schemas/colorful.ts index b68326a706..e68dac3d45 100644 --- a/apps/learn-card-app/src/theme/schemas/colorful.ts +++ b/apps/learn-card-app/src/theme/schemas/colorful.ts @@ -145,6 +145,11 @@ export const colorfulTheme: Theme = validateThemeData({ label: 'AI Insights Hub', path: '/ai/insights', }, + { + id: SideMenuLinksEnum.aiPathways, + label: 'AI Pathways', + path: '/ai/pathways', + }, { id: SideMenuLinksEnum.skills, label: 'Skills', diff --git a/apps/learn-card-app/src/theme/schemas/formal.ts b/apps/learn-card-app/src/theme/schemas/formal.ts index 4731bdc90d..f803a49b90 100644 --- a/apps/learn-card-app/src/theme/schemas/formal.ts +++ b/apps/learn-card-app/src/theme/schemas/formal.ts @@ -145,6 +145,11 @@ export const formalTheme: Theme = validateThemeData({ label: 'AI Insights Hub', path: '/ai/insights', }, + { + id: SideMenuLinksEnum.aiPathways, + label: 'AI Pathways', + path: '/ai/pathways', + }, { id: SideMenuLinksEnum.skills, label: 'Skills', diff --git a/apps/learn-card-app/tests/consent-flow-race.spec.ts b/apps/learn-card-app/tests/consent-flow-race.spec.ts deleted file mode 100644 index a598cada8d..0000000000 --- a/apps/learn-card-app/tests/consent-flow-race.spec.ts +++ /dev/null @@ -1,72 +0,0 @@ -import { expect } from '@playwright/test'; -import { test } from './fixtures/test'; -import { getBespokeLearnCard } from './wallet.helpers'; -import { testContract } from './consent-flow.helpers'; -import { waitForAuthenticatedState } from './test.helpers'; -import { TEST_USER_SEED, CONTRACT_OWNER_SEED } from './constants'; - -test.describe('ConsentFlow', () => { - // Disable retries - we want to see the race condition failure - test.describe.configure({ retries: 0 }); - - test('auto-redirects already-consented user', async ({ page }) => { - // Set up contract owner and create contract - const owner = await getBespokeLearnCard(CONTRACT_OWNER_SEED); - const existingOwnerProfile = await owner.invoke.getProfile().catch(() => null); - if (!existingOwnerProfile) { - await owner.invoke.createProfile({ profileId: 'contract-owner', displayName: 'Owner' }); - } - const contractUri = await owner.invoke.createContract(testContract); - - // Pre-consent user via SDK (same seed as browser login) - const user = await getBespokeLearnCard(TEST_USER_SEED); - const existingUserProfile = await user.invoke.getProfile().catch(() => null); - if (!existingUserProfile) { - await user.invoke.createProfile({ profileId: 'test-user', displayName: 'Test' }); - } - await user.invoke.consentToContract(contractUri, { - terms: { - read: { - personal: { Name: 'Test User' }, - credentials: { - shareAll: false, - sharing: true, - categories: { - 'Social Badge': { shareAll: false, sharing: true }, - Achievement: { shareAll: true, sharing: true }, - }, - }, - }, - write: { - personal: { SomeCustomID: true }, - credentials: { - categories: { - ID: true, - 'Learning History': false, - }, - }, - }, - }, - }); - - // Login via seed (persists across page navigation) - await waitForAuthenticatedState(page); - - // Navigate to consent flow (user already consented via SDK) - const returnTo = 'https://example.com/callback'; - const consentUrl = `/consent-flow-login?uri=${encodeURIComponent( - contractUri - )}&returnTo=${encodeURIComponent(returnTo)}`; - await page.goto(consentUrl); - - // Wait for page to load - const continueButton = page.getByRole('button', { name: /Continue as/i }); - await continueButton.waitFor({ state: 'visible', timeout: 30000 }); - - // Click Continue - user already consented, should redirect to returnTo - await continueButton.click(); - - // Verify redirect to returnTo URL (not to consent-flow-sync-data error page) - await page.waitForURL(/example\.com\/callback/, { timeout: 15000 }); - }); -}); diff --git a/apps/learn-card-app/tests/consent-flow.helpers.ts b/apps/learn-card-app/tests/consent-flow.helpers.ts index 556f511679..88d0cc2b29 100644 --- a/apps/learn-card-app/tests/consent-flow.helpers.ts +++ b/apps/learn-card-app/tests/consent-flow.helpers.ts @@ -1,23 +1,6 @@ import { ConsentFlowContractDetails } from '@learncard/types'; import { getBespokeLearnCard } from './wallet.helpers'; - -// Duplicated from learn-card-base to avoid importing app source code (breaks Playwright) -export enum BoostCategoryOptionsEnum { - socialBadge = 'Social Badge', - achievement = 'Achievement', - course = 'Course', - job = 'Job', - id = 'ID', - skill = 'Skill', - membership = 'Membership', - currency = 'Currency', - accomplishment = 'Accomplishment', - accommodation = 'Accommodation', - workHistory = 'Work History', - learningHistory = 'Learning History', - family = 'Family', - describe = 'Describe', -} +import { BoostCategoryOptionsEnum } from '../src/components/boost/boost-options/boostOptions'; export const testContract = { name: 'Test Contract', diff --git a/apps/learn-card-app/tests/consent-flow.page.ts b/apps/learn-card-app/tests/consent-flow.page.ts index f05bb517b4..e4cb97e900 100644 --- a/apps/learn-card-app/tests/consent-flow.page.ts +++ b/apps/learn-card-app/tests/consent-flow.page.ts @@ -1,6 +1,5 @@ import { expect, Locator, Page } from '@playwright/test'; import { - BoostCategoryOptionsEnum, categoryToDisplayNameMap, CustomContractOptions, getPermutations, @@ -9,6 +8,7 @@ import { joinWithAnd, testContract, } from './consent-flow.helpers'; +import { BoostCategoryOptionsEnum } from '../src/components/boost/boost-options/boostOptions'; export class ConsentFlowPage { readonly page: Page; diff --git a/apps/learn-card-app/tests/consent-flow.spec.ts b/apps/learn-card-app/tests/consent-flow.spec.ts index c6d7b6773c..3717928fd2 100644 --- a/apps/learn-card-app/tests/consent-flow.spec.ts +++ b/apps/learn-card-app/tests/consent-flow.spec.ts @@ -1,11 +1,12 @@ import { expect } from '@playwright/test'; import { test } from './fixtures/test'; import { loginTestAccount, logoutTestAccount } from './test.helpers'; -import { gameFlowContract, testContract, BoostCategoryOptionsEnum } from './consent-flow.helpers'; +import { gameFlowContract, testContract } from './consent-flow.helpers'; import { FAMILY, FamilyCMSPage, FamilyHandler } from './family.page'; import { LaunchPadPage } from './launchpad.page'; import { GameFlowPage, gameRedirectUrl } from './game-flow.page'; import { ConsentFlowPage } from './consent-flow.page'; +import { BoostCategoryOptionsEnum } from '../src/components/boost/boost-options/boostOptions'; test.describe('ConsentFlow', () => { test('External Door - Logged In - Full Flow', async ({ page }) => { diff --git a/apps/learn-card-app/tests/constants.ts b/apps/learn-card-app/tests/constants.ts deleted file mode 100644 index b42823f2da..0000000000 --- a/apps/learn-card-app/tests/constants.ts +++ /dev/null @@ -1,2 +0,0 @@ -export const TEST_USER_SEED = 'a'.repeat(64); -export const CONTRACT_OWNER_SEED = 'b'.repeat(64); diff --git a/apps/learn-card-app/tests/test.helpers.ts b/apps/learn-card-app/tests/test.helpers.ts index a2d7994306..c238035d49 100644 --- a/apps/learn-card-app/tests/test.helpers.ts +++ b/apps/learn-card-app/tests/test.helpers.ts @@ -1,5 +1,4 @@ import { Locator, Page } from '@playwright/test'; -import { TEST_USER_SEED } from './constants'; // This is basically expect(locator).toBeVisible() except it'll actually wait for the timeout if the element isn't visible yet export const locatorExists = async (locator: Locator, timeout: number = 1000) => @@ -17,43 +16,3 @@ export const loginTestAccount = async (page: Page) => { await page.getByRole('button', { name: /sign in with email/i }).click(); // await page.waitForURL(/wallet/); }; - -/** - * Logs in via seed phrase and navigates to the specified path. - * - * NOTE: Storage state-based authentication doesn't work because the app requires - * a privateKey that is stored separately from localStorage for security. When - * localStorage is restored without the privateKey, the app logs out the user. - * - * This helper uses the /hidden/seed route which creates a proper user with a - * private key derived from the seed. - * - * @param page - Playwright page object - * @param pathOrOptions - Path to navigate to after login (default '/'), or options object - * @param timeout - Maximum time to wait for authenticated state (default 30s) - */ -export const waitForAuthenticatedState = async ( - page: Page, - pathOrOptions: string | { path?: string; seed?: string } = '/', - timeout = 30000 -) => { - // Parse options - const options = typeof pathOrOptions === 'string' - ? { path: pathOrOptions, seed: TEST_USER_SEED } - : { path: pathOrOptions.path ?? '/', seed: pathOrOptions.seed ?? TEST_USER_SEED }; - - // Login via seed - this creates a proper user with privateKey - await page.goto('/hidden/seed'); - - // Fill in the seed and submit - await page.getByRole('textbox').fill(options.seed); - await page.getByRole('button', { name: /sign in with seed/i }).click(); - - // Wait for redirect to wallet (indicates successful login) - await page.waitForURL(/\/wallet/, { timeout }); - - // If a different path was requested, navigate there - if (options.path !== '/' && options.path !== '/wallet') { - await page.goto(options.path); - } -}; diff --git a/apps/learn-card-app/vite.config.ts b/apps/learn-card-app/vite.config.ts index fe3afdabcf..8fb9ed1acd 100644 --- a/apps/learn-card-app/vite.config.ts +++ b/apps/learn-card-app/vite.config.ts @@ -8,20 +8,6 @@ import svgr from 'vite-plugin-svgr'; import stdlibbrowser from 'node-stdlib-browser'; import basicSsl from '@vitejs/plugin-basic-ssl'; -// Workspace packages that should not be pre-bundled for HMR support -const workspacePackages = [ - '@learncard/helpers', - '@learncard/types', - '@learncard/react', - '@learncard/init', - '@learncard/core', - '@learncard/chapi-plugin', - '@learncard/lca-api-plugin', - '@learncard/open-badge-v2-plugin', - '@learncard/network-brain-client', - '@learncard/network-plugin', -]; - export default defineConfig(({ mode }) => { const env = loadEnv(mode, process.cwd(), ''); return { @@ -30,8 +16,6 @@ export default defineConfig(({ mode }) => { optimizeDeps: { // disabled: false, include: ['buffer', 'process', 'react-router', 'react-router-dom', 'crypto-browserify'], - // Exclude workspace packages from pre-bundling to enable HMR when they rebuild - exclude: workspacePackages, esbuildOptions: { target: 'esnext', define: { global: 'globalThis' }, @@ -76,15 +60,6 @@ export default defineConfig(({ mode }) => { '@ionic/react-router', ], }, - server: { - port: 3000, - watch: { - // Enable polling for Docker volume mounts - usePolling: process.env.CHOKIDAR_USEPOLLING === 'true', - interval: parseInt(process.env.CHOKIDAR_INTERVAL || '1000', 10), - // Watch workspace package dist folders for changes (when watcher rebuilds them) - ignored: ['!**/packages/**/dist/**', '!**/packages/plugins/**/dist/**'], - }, - }, + server: { port: 3000 }, }; }); diff --git a/apps/learn-card-app/vitest.config.ts b/apps/learn-card-app/vitest.config.ts deleted file mode 100644 index 30b6425d0b..0000000000 --- a/apps/learn-card-app/vitest.config.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { defineConfig } from 'vitest/config'; -import react from '@vitejs/plugin-react-swc'; -import tsconfigPaths from 'vite-tsconfig-paths'; -import path from 'path'; - -export default defineConfig({ - plugins: [react(), tsconfigPaths({ root: '../../' })], - test: { - environment: 'jsdom', - globals: true, - setupFiles: ['./vitest.setup.ts'], - include: ['src/**/*.test.{ts,tsx}'], - }, - resolve: { - alias: { - 'learn-card-base': path.resolve(__dirname, '../../packages/learn-card-base/src'), - }, - }, -}); diff --git a/apps/learn-card-app/vitest.setup.ts b/apps/learn-card-app/vitest.setup.ts deleted file mode 100644 index 69605bc2b1..0000000000 --- a/apps/learn-card-app/vitest.setup.ts +++ /dev/null @@ -1,29 +0,0 @@ -import '@testing-library/jest-dom'; -import { vi } from 'vitest'; -import { TextEncoder, TextDecoder as NodeTextDecoder } from 'util'; - -// Polyfill for Node.js environment -global.TextEncoder = TextEncoder; -global.TextDecoder = NodeTextDecoder as unknown as typeof TextDecoder; - -// Define global constants that are normally set by webpack DefinePlugin -(global as any).LCN_API_URL = 'http://localhost:4000/api'; -(global as any).LCN_URL = 'http://localhost:4000/trpc'; -(global as any).CLOUD_URL = 'http://localhost:4100/trpc'; -(global as any).API_URL = 'http://localhost:5100/trpc'; -(global as any).IS_PRODUCTION = false; - -// Mock window.matchMedia -Object.defineProperty(window, 'matchMedia', { - writable: true, - value: vi.fn().mockImplementation(query => ({ - matches: false, - media: query, - onchange: null, - addListener: vi.fn(), - removeListener: vi.fn(), - addEventListener: vi.fn(), - removeEventListener: vi.fn(), - dispatchEvent: vi.fn(), - })), -}); diff --git a/apps/scouts/CHANGELOG.md b/apps/scouts/CHANGELOG.md index 024cc29343..4d22568236 100644 --- a/apps/scouts/CHANGELOG.md +++ b/apps/scouts/CHANGELOG.md @@ -1,44 +1,5 @@ # Changelog -## 1.89.15 - -### Patch Changes - -- Updated dependencies []: - - @learncard/lca-api-plugin@1.1.9 - -## 1.89.14 - -### Patch Changes - -- Updated dependencies []: - - @learncard/lca-api-plugin@1.1.8 - -## 1.89.13 - -### Patch Changes - -- Updated dependencies []: - - @learncard/lca-api-plugin@1.1.7 - - @learncard/react@2.9.8 - -## 1.89.12 - -### Patch Changes - -- [#947](https://github.com/learningeconomy/LearnCard/pull/947) [`9183cdf03644bdedea3140913a49332a02417ecf`](https://github.com/learningeconomy/LearnCard/commit/9183cdf03644bdedea3140913a49332a02417ecf) Thanks [@rhen92](https://github.com/rhen92)! - fix: [LC-1388] Save full name once creating an account - -- [#928](https://github.com/learningeconomy/LearnCard/pull/928) [`d9950fd5c1bf6be9ccf4f661f2df85acf747fa83`](https://github.com/learningeconomy/LearnCard/commit/d9950fd5c1bf6be9ccf4f661f2df85acf747fa83) Thanks [@goblincore](https://github.com/goblincore)! - feat:[LC-1512] Add role-based gating in boost CMS for image uploads - -- [#933](https://github.com/learningeconomy/LearnCard/pull/933) [`1247b3b2b372626b06d6193b5c9227504c23a3be`](https://github.com/learningeconomy/LearnCard/commit/1247b3b2b372626b06d6193b5c9227504c23a3be) Thanks [@goblincore](https://github.com/goblincore)! - [LC-1511] Override unknown issuer verifier state text and use roles in Scouts app - -- [#933](https://github.com/learningeconomy/LearnCard/pull/933) [`1247b3b2b372626b06d6193b5c9227504c23a3be`](https://github.com/learningeconomy/LearnCard/commit/1247b3b2b372626b06d6193b5c9227504c23a3be) Thanks [@goblincore](https://github.com/goblincore)! - [LC-1511] Override unknown issuer verifier state text and use roles in Scouts app - -- [#938](https://github.com/learningeconomy/LearnCard/pull/938) [`20c48c727aade41921e226e3f26922d3798c7b5e`](https://github.com/learningeconomy/LearnCard/commit/20c48c727aade41921e226e3f26922d3798c7b5e) Thanks [@gerardopar](https://github.com/gerardopar)! - chore: [LC-1498] - šŸš€ Migrate Capacitor & Plugins from v7 → v8 + šŸ”„ Firebase v12 - -- Updated dependencies [[`1247b3b2b372626b06d6193b5c9227504c23a3be`](https://github.com/learningeconomy/LearnCard/commit/1247b3b2b372626b06d6193b5c9227504c23a3be), [`1247b3b2b372626b06d6193b5c9227504c23a3be`](https://github.com/learningeconomy/LearnCard/commit/1247b3b2b372626b06d6193b5c9227504c23a3be)]: - - @learncard/react@2.9.7 - ## 1.89.11 ### Patch Changes diff --git a/apps/scouts/Dockerfile b/apps/scouts/Dockerfile index cdafbce75e..5e908dc98c 100644 --- a/apps/scouts/Dockerfile +++ b/apps/scouts/Dockerfile @@ -1,18 +1,16 @@ # Use an official Node runtime as the base image FROM node:20.10.0-slim -# Skip native DIDKit build (not needed for browser apps, uses WASM fallback) -ENV SKIP_DIDKIT_NAPI=1 - # Set the working directory in the container WORKDIR /app -# Install build dependencies and pnpm in one layer -RUN apt-get update && apt-get install -y --no-install-recommends \ +# Sometimes we need python to build packages +RUN apt-get update || : && apt-get install -y \ python3 \ - build-essential \ - && rm -rf /var/lib/apt/lists/* \ - && npm install -g pnpm + build-essential + +# Install PNPM package manager +RUN npm install -g pnpm # Copy root workspace files COPY package.json pnpm-lock.yaml pnpm-workspace.yaml nx.json tsconfig.json .npmrc ./ @@ -38,7 +36,6 @@ COPY packages/plugins/ceramic/package.json packages/plugins/ceramic/ COPY packages/plugins/idx/package.json packages/plugins/idx/ COPY packages/plugins/didkey/package.json packages/plugins/didkey/ COPY packages/plugins/didkit/package.json packages/plugins/didkit/ -COPY packages/plugins/didkit-plugin-node/package.json packages/plugins/didkit-plugin-node/ COPY packages/plugins/did-web-plugin/package.json packages/plugins/did-web-plugin/ COPY packages/plugins/dynamic-loader/package.json packages/plugins/dynamic-loader/ COPY packages/plugins/encryption/package.json packages/plugins/encryption/ @@ -78,7 +75,6 @@ COPY packages/plugins/ceramic packages/plugins/ceramic COPY packages/plugins/idx packages/plugins/idx COPY packages/plugins/didkey packages/plugins/didkey COPY packages/plugins/didkit packages/plugins/didkit -COPY packages/plugins/didkit-plugin-node packages/plugins/didkit-plugin-node COPY packages/plugins/did-web-plugin packages/plugins/did-web-plugin COPY packages/plugins/dynamic-loader packages/plugins/dynamic-loader COPY packages/plugins/encryption packages/plugins/encryption diff --git a/apps/scouts/Dockerfile.local b/apps/scouts/Dockerfile.local index b8b913b52f..bfc5ff17a1 100644 --- a/apps/scouts/Dockerfile.local +++ b/apps/scouts/Dockerfile.local @@ -1,18 +1,16 @@ # Use an official Node runtime as the base image FROM node:20.10.0-slim -# Skip native DIDKit build (not needed for browser apps, uses WASM fallback) -ENV SKIP_DIDKIT_NAPI=1 - # Set the working directory in the container WORKDIR /app -# Install build dependencies and pnpm in one layer -RUN apt-get update && apt-get install -y --no-install-recommends \ +# Sometimes we need python to build packages +RUN apt-get update || : && apt-get install -y \ python3 \ - build-essential \ - && rm -rf /var/lib/apt/lists/* \ - && npm install -g pnpm + build-essential + +# Install PNPM package manager +RUN npm install -g pnpm # Copy root workspace files COPY package.json pnpm-lock.yaml pnpm-workspace.yaml nx.json tsconfig.json .npmrc .gitignore .nxignore ./ @@ -38,7 +36,6 @@ COPY packages/plugins/ceramic/package.json packages/plugins/ceramic/ COPY packages/plugins/idx/package.json packages/plugins/idx/ COPY packages/plugins/didkey/package.json packages/plugins/didkey/ COPY packages/plugins/didkit/package.json packages/plugins/didkit/ -COPY packages/plugins/didkit-plugin-node/package.json packages/plugins/didkit-plugin-node/ COPY packages/plugins/did-web-plugin/package.json packages/plugins/did-web-plugin/ COPY packages/plugins/dynamic-loader/package.json packages/plugins/dynamic-loader/ COPY packages/plugins/encryption/package.json packages/plugins/encryption/ @@ -78,7 +75,6 @@ COPY packages/plugins/ceramic packages/plugins/ceramic COPY packages/plugins/idx packages/plugins/idx COPY packages/plugins/didkey packages/plugins/didkey COPY packages/plugins/didkit packages/plugins/didkit -COPY packages/plugins/didkit-plugin-node packages/plugins/didkit-plugin-node COPY packages/plugins/did-web-plugin packages/plugins/did-web-plugin COPY packages/plugins/dynamic-loader packages/plugins/dynamic-loader COPY packages/plugins/encryption packages/plugins/encryption diff --git a/apps/scouts/android/app/build.gradle b/apps/scouts/android/app/build.gradle index 3def0290a2..18db39c43b 100644 --- a/apps/scouts/android/app/build.gradle +++ b/apps/scouts/android/app/build.gradle @@ -1,12 +1,12 @@ apply plugin: 'com.android.application' android { - namespace = 'org.scoutpass.app' - compileSdk = rootProject.ext.compileSdkVersion + namespace 'org.scoutpass.app' + compileSdk rootProject.ext.compileSdkVersion defaultConfig { applicationId "org.scoutpass.app" - minSdkVersion = rootProject.ext.minSdkVersion - targetSdkVersion = rootProject.ext.targetSdkVersion + minSdkVersion rootProject.ext.minSdkVersion + targetSdkVersion rootProject.ext.targetSdkVersion versionCode project.hasProperty('versionCode') ? Integer.parseInt(project.versionCode) : 1 versionName project.hasProperty('versionName') ? project.versionName : "1.0.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" diff --git a/apps/scouts/android/app/src/main/AndroidManifest.xml b/apps/scouts/android/app/src/main/AndroidManifest.xml index fb28561f5e..45da5b3ad3 100644 --- a/apps/scouts/android/app/src/main/AndroidManifest.xml +++ b/apps/scouts/android/app/src/main/AndroidManifest.xml @@ -40,7 +40,7 @@ https://github.com/learningeconomy/LearnCard/pull/938 + defaultChannel: 'migration', }, }, }; diff --git a/apps/scouts/compose-local.yaml b/apps/scouts/compose-local.yaml index 1521a05f38..5fc65d736f 100644 --- a/apps/scouts/compose-local.yaml +++ b/apps/scouts/compose-local.yaml @@ -1,15 +1,13 @@ services: app: - image: learncard-monorepo-local build: context: ../../ - dockerfile: Dockerfile.monorepo + dockerfile: apps/scouts/Dockerfile.local container_name: 'scouts-app' expose: - 3000 ports: - '3000:3000' - command: ['sh', '-c', 'pnpm exec nx docker-start scouts'] depends_on: - brain - cloud @@ -24,38 +22,9 @@ services: LCN_API_URL: http://localhost:4000/api CLOUD_URL: http://localhost:4100/trpc API_URL: http://localhost:5100/trpc - SKIP_DIDKIT_NAPI: '1' - CHOKIDAR_USEPOLLING: 'true' - CHOKIDAR_INTERVAL: '1000' volumes: - ./src:/app/apps/scouts/src - - ./vite.config.ts:/app/apps/scouts/vite.config.ts - - ../../packages:/app/packages - - watcher: - image: learncard-monorepo-local - container_name: 'lcn-watcher' - user: '${UID:-1000}:${GID:-1000}' - command: - [ - 'pnpm', - 'exec', - 'nx', - 'watch', - '--all', - '--verbose', - '--', - 'sh', - '/app/tools/scripts/nx-watch-build.sh', - ] - networks: - - learn-card - environment: - SKIP_DIDKIT_NAPI: '1' - CHOKIDAR_USEPOLLING: 'true' - CHOKIDAR_INTERVAL: '1000' - volumes: - - ../../packages:/app/packages + - ../../packages/learn-card-base/src:/app/packages/learn-card-base/src delete-service: build: ../../services/playwright-delete-service @@ -89,16 +58,15 @@ services: __DELETE_SERVICE__REDIS3_PORT: 6379 brain: - image: learncard-monorepo-local + image: welibrary/lcn-brain-service build: context: ../../ - dockerfile: Dockerfile.monorepo + dockerfile: services/learn-card-network/brain-service/Dockerfile.local container_name: 'lcn-brain-service' expose: - 4000 ports: - '4000:4000' - command: ['sh', '-c', 'cd services/learn-card-network/brain-service && pnpm dev'] depends_on: neo4j: condition: service_healthy @@ -112,16 +80,11 @@ services: - 'localhost:host-gateway' volumes: - ../../services/learn-card-network/brain-service/src:/app/services/learn-card-network/brain-service/src - - ../../services/learn-card-network/brain-service/nodemon.docker.json:/app/services/learn-card-network/brain-service/nodemon.docker.json - - ../../packages:/app/packages environment: IS_OFFLINE: true PORT: 4000 SEED: a DOMAIN_NAME: 'localhost%3A4000' - SKIP_DIDKIT_NAPI: '1' - CHOKIDAR_USEPOLLING: 'true' - CHOKIDAR_INTERVAL: '1000' NEO4J_URI: ${NEO4J_URI:-bolt://neo4j:7687} NEO4J_USERNAME: ${NEO4J_USERNAME:-neo4j} NEO4J_PASSWORD: ${NEO4J_PASSWORD:-this-is-the-password} @@ -134,16 +97,15 @@ services: NOTIFICATIONS_QUEUE_URL: ${NOTIFICATIONS_QUEUE_URL:-http://elasticmq:9324/notifications} cloud: - image: learncard-monorepo-local + image: welibrary/lcn-cloud-service build: context: ../../ - dockerfile: Dockerfile.monorepo + dockerfile: services/learn-card-network/learn-cloud-service/Dockerfile.local container_name: 'lcn-cloud-service' expose: - 4100 ports: - '4100:4100' - command: ['sh', '-c', 'cd services/learn-card-network/learn-cloud-service && pnpm dev'] depends_on: - mongodb - redis2 @@ -153,31 +115,25 @@ services: - 'localhost:host-gateway' volumes: - ../../services/learn-card-network/learn-cloud-service/src:/app/services/learn-card-network/learn-cloud-service/src - - ../../services/learn-card-network/learn-cloud-service/nodemon.docker.json:/app/services/learn-card-network/learn-cloud-service/nodemon.docker.json - - ../../packages:/app/packages environment: IS_OFFLINE: true PORT: 4100 LEARN_CLOUD_SEED: b - SKIP_DIDKIT_NAPI: '1' - CHOKIDAR_USEPOLLING: 'true' - CHOKIDAR_INTERVAL: '1000' LEARN_CLOUD_MONGO_URI: ${LEARN_CLOUD_MONGO_URI:-mongodb://mongodb:27017?ssl=false&replicaSet=rs0} LEARN_CLOUD_MONGO_DB_NAME: ${LEARN_CLOUD_MONGO_DB_NAME:-learn-cloud} REDIS_HOST: redis2 REDIS_PORT: 6379 api: - image: learncard-monorepo-local + image: lca-api-service build: context: ../../ - dockerfile: Dockerfile.monorepo + dockerfile: services/learn-card-network/lca-api/Dockerfile container_name: 'lcn-api-service' expose: - 5100 ports: - '5100:5100' - command: ['sh', '-c', 'cd services/learn-card-network/lca-api && pnpm dev'] depends_on: - mongodb - redis3 @@ -186,17 +142,12 @@ services: extra_hosts: - 'localhost:host-gateway' volumes: - - ../../services/learn-card-network/lca-api/src:/app/services/learn-card-network/lca-api/src - - ../../services/learn-card-network/lca-api/nodemon.docker.json:/app/services/learn-card-network/lca-api/nodemon.docker.json - - ../../packages:/app/packages + - ../../services/lca-api/src:/app/services/lca-api/src environment: IS_OFFLINE: true - CHOKIDAR_USEPOLLING: 'true' - CHOKIDAR_INTERVAL: '1000' PORT: 5100 SEED: c AUTHORIZED_DIDS: did:web:localhost%3A4000 - SKIP_DIDKIT_NAPI: '1' MONGO_URI: ${MONGO_URI:-mongodb://mongodb:27017?ssl=false&replicaSet=rs0} MONGO_DB_NAME: ${MONGO_DB_NAME:-lca-api} REDIS_HOST: redis3 diff --git a/apps/scouts/ios/App/App.xcodeproj/project.pbxproj b/apps/scouts/ios/App/App.xcodeproj/project.pbxproj index 4f4b52d5fc..6975c6bdb8 100644 --- a/apps/scouts/ios/App/App.xcodeproj/project.pbxproj +++ b/apps/scouts/ios/App/App.xcodeproj/project.pbxproj @@ -288,7 +288,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 15.6; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -342,7 +342,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 15.6; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; @@ -360,7 +360,7 @@ CODE_SIGN_STYLE = Manual; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 5JB5D53PRR; INFOPLIST_FILE = App/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 15.6; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; OTHER_SWIFT_FLAGS = "$(inherited) \"-D\" \"COCOAPODS\" \"-DDEBUG\""; PRODUCT_BUNDLE_IDENTIFIER = org.scoutpass.app; @@ -384,7 +384,7 @@ DEVELOPMENT_TEAM = 5JB5D53PRR; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 5JB5D53PRR; INFOPLIST_FILE = App/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 15.6; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = org.scoutpass.app; PRODUCT_NAME = "$(TARGET_NAME)"; diff --git a/apps/scouts/ios/App/Podfile b/apps/scouts/ios/App/Podfile index 20f3e1d402..00f381c9e4 100644 --- a/apps/scouts/ios/App/Podfile +++ b/apps/scouts/ios/App/Podfile @@ -1,47 +1,47 @@ -require_relative '../../../../node_modules/.pnpm/@capacitor+ios@8.0.1_@capacitor+core@8.0.1/node_modules/@capacitor/ios/scripts/pods_helpers' - +require_relative '../../../../node_modules/.pnpm/@capacitor+ios@7.4.4_@capacitor+core@7.4.2/node_modules/@capacitor/ios/scripts/pods_helpers' + platform :ios, '15.5' use_frameworks! - + # workaround to avoid Xcode caching of Pods that requires # Product -> Clean Build Folder after new Cordova plugins installed # Requires CocoaPods 1.6 or newer -install! 'cocoapods', :disable_input_output_paths => true, :deterministic_uuids => false - +install! 'cocoapods', :disable_input_output_paths => true + def capacitor_pods - pod 'Capacitor', :path => '../../../../node_modules/.pnpm/@capacitor+ios@8.0.1_@capacitor+core@8.0.1/node_modules/@capacitor/ios' - pod 'CapacitorCordova', :path => '../../../../node_modules/.pnpm/@capacitor+ios@8.0.1_@capacitor+core@8.0.1/node_modules/@capacitor/ios' - pod 'CapacitorCommunitySqlite', :path => '../../../../node_modules/.pnpm/@capacitor-community+sqlite@7.0.2_@capacitor+core@8.0.1/node_modules/@capacitor-community/sqlite' - pod 'CapacitorFirebaseAnalytics', :path => '../../../../node_modules/.pnpm/@capacitor-firebase+analytics@8.0.1_@capacitor+core@8.0.1_firebase@12.8.0/node_modules/@capacitor-firebase/analytics' - pod 'CapacitorFirebaseAuthentication', :path => '../../../../node_modules/.pnpm/@capacitor-firebase+authentication@8.0.1_@capacitor+core@8.0.1_firebase@12.8.0/node_modules/@capacitor-firebase/authentication' - pod 'CapacitorMlkitBarcodeScanning', :path => '../../../../node_modules/.pnpm/@capacitor-mlkit+barcode-scanning@8.0.0_@capacitor+core@8.0.1/node_modules/@capacitor-mlkit/barcode-scanning' - pod 'CapacitorApp', :path => '../../../../node_modules/.pnpm/@capacitor+app@8.0.0_@capacitor+core@8.0.1/node_modules/@capacitor/app' - pod 'CapacitorBrowser', :path => '../../../../node_modules/.pnpm/@capacitor+browser@8.0.0_@capacitor+core@8.0.1/node_modules/@capacitor/browser' - pod 'CapacitorCamera', :path => '../../../../node_modules/.pnpm/@capacitor+camera@8.0.0_@capacitor+core@8.0.1/node_modules/@capacitor/camera' - pod 'CapacitorClipboard', :path => '../../../../node_modules/.pnpm/@capacitor+clipboard@8.0.0_@capacitor+core@8.0.1/node_modules/@capacitor/clipboard' - pod 'CapacitorHaptics', :path => '../../../../node_modules/.pnpm/@capacitor+haptics@8.0.0_@capacitor+core@8.0.1/node_modules/@capacitor/haptics' - pod 'CapacitorKeyboard', :path => '../../../../node_modules/.pnpm/@capacitor+keyboard@8.0.0_@capacitor+core@8.0.1/node_modules/@capacitor/keyboard' - pod 'CapacitorLocalNotifications', :path => '../../../../node_modules/.pnpm/@capacitor+local-notifications@8.0.0_@capacitor+core@8.0.1/node_modules/@capacitor/local-notifications' - pod 'CapacitorNetwork', :path => '../../../../node_modules/.pnpm/@capacitor+network@8.0.0_@capacitor+core@8.0.1/node_modules/@capacitor/network' - pod 'CapacitorPushNotifications', :path => '../../../../node_modules/.pnpm/@capacitor+push-notifications@8.0.0_@capacitor+core@8.0.1/node_modules/@capacitor/push-notifications' - pod 'CapacitorShare', :path => '../../../../node_modules/.pnpm/@capacitor+share@8.0.0_@capacitor+core@8.0.1/node_modules/@capacitor/share' - pod 'CapacitorSplashScreen', :path => '../../../../node_modules/.pnpm/@capacitor+splash-screen@8.0.0_@capacitor+core@8.0.1/node_modules/@capacitor/splash-screen' - pod 'CapacitorStatusBar', :path => '../../../../node_modules/.pnpm/@capacitor+status-bar@8.0.0_@capacitor+core@8.0.1/node_modules/@capacitor/status-bar' - pod 'CapawesomeCapacitorBadge', :path => '../../../../node_modules/.pnpm/@capawesome+capacitor-badge@8.0.0_@capacitor+core@8.0.1/node_modules/@capawesome/capacitor-badge' - pod 'CapgoCapacitorUpdater', :path => '../../../../node_modules/.pnpm/@capgo+capacitor-updater@8.41.12_@capacitor+core@8.0.1/node_modules/@capgo/capacitor-updater' - pod 'CapacitorNativeSettings', :path => '../../../../node_modules/.pnpm/capacitor-native-settings@7.0.2_@capacitor+core@8.0.1/node_modules/capacitor-native-settings' - pod 'CapacitorPluginSafeArea', :path => '../../../../node_modules/.pnpm/capacitor-plugin-safe-area@5.0.0_@capacitor+core@8.0.1/node_modules/capacitor-plugin-safe-area' + pod 'Capacitor', :path => '../../../../node_modules/.pnpm/@capacitor+ios@7.4.4_@capacitor+core@7.4.2/node_modules/@capacitor/ios' + pod 'CapacitorCordova', :path => '../../../../node_modules/.pnpm/@capacitor+ios@7.4.4_@capacitor+core@7.4.2/node_modules/@capacitor/ios' + pod 'CapacitorCommunitySqlite', :path => '../../../../node_modules/.pnpm/@capacitor-community+sqlite@7.0.2_@capacitor+core@7.4.2/node_modules/@capacitor-community/sqlite' + pod 'CapacitorFirebaseAnalytics', :path => '../../../../node_modules/.pnpm/@capacitor-firebase+analytics@7.3.0_@capacitor+core@7.4.2_firebase@11.10.0/node_modules/@capacitor-firebase/analytics' + pod 'CapacitorFirebaseAuthentication', :path => '../../../../node_modules/.pnpm/@capacitor-firebase+authentication@7.4.0_@capacitor+core@7.4.2_firebase@11.10.0/node_modules/@capacitor-firebase/authentication' + pod 'CapacitorMlkitBarcodeScanning', :path => '../../../../node_modules/.pnpm/@capacitor-mlkit+barcode-scanning@7.3.0_@capacitor+core@7.4.2/node_modules/@capacitor-mlkit/barcode-scanning' + pod 'CapacitorApp', :path => '../../../../node_modules/.pnpm/@capacitor+app@7.1.0_@capacitor+core@7.4.2/node_modules/@capacitor/app' + pod 'CapacitorBrowser', :path => '../../../../node_modules/.pnpm/@capacitor+browser@7.0.2_@capacitor+core@7.4.2/node_modules/@capacitor/browser' + pod 'CapacitorCamera', :path => '../../../../node_modules/.pnpm/@capacitor+camera@7.0.2_@capacitor+core@7.4.2/node_modules/@capacitor/camera' + pod 'CapacitorClipboard', :path => '../../../../node_modules/.pnpm/@capacitor+clipboard@7.0.2_@capacitor+core@7.4.2/node_modules/@capacitor/clipboard' + pod 'CapacitorHaptics', :path => '../../../../node_modules/.pnpm/@capacitor+haptics@7.0.2_@capacitor+core@7.4.2/node_modules/@capacitor/haptics' + pod 'CapacitorKeyboard', :path => '../../../../node_modules/.pnpm/@capacitor+keyboard@7.0.3_@capacitor+core@7.4.2/node_modules/@capacitor/keyboard' + pod 'CapacitorLocalNotifications', :path => '../../../../node_modules/.pnpm/@capacitor+local-notifications@7.0.3_@capacitor+core@7.4.2/node_modules/@capacitor/local-notifications' + pod 'CapacitorNetwork', :path => '../../../../node_modules/.pnpm/@capacitor+network@7.0.2_@capacitor+core@7.4.2/node_modules/@capacitor/network' + pod 'CapacitorPushNotifications', :path => '../../../../node_modules/.pnpm/@capacitor+push-notifications@7.0.3_@capacitor+core@7.4.2/node_modules/@capacitor/push-notifications' + pod 'CapacitorShare', :path => '../../../../node_modules/.pnpm/@capacitor+share@7.0.2_@capacitor+core@7.4.2/node_modules/@capacitor/share' + pod 'CapacitorSplashScreen', :path => '../../../../node_modules/.pnpm/@capacitor+splash-screen@7.0.3_@capacitor+core@7.4.2/node_modules/@capacitor/splash-screen' + pod 'CapacitorStatusBar', :path => '../../../../node_modules/.pnpm/@capacitor+status-bar@7.0.3_@capacitor+core@7.4.2/node_modules/@capacitor/status-bar' + pod 'CapawesomeCapacitorBadge', :path => '../../../../node_modules/.pnpm/@capawesome+capacitor-badge@7.0.1_@capacitor+core@7.4.2/node_modules/@capawesome/capacitor-badge' + pod 'CapgoCapacitorUpdater', :path => '../../../../node_modules/.pnpm/@capgo+capacitor-updater@7.8.7_@capacitor+core@7.4.2/node_modules/@capgo/capacitor-updater' + pod 'CapacitorNativeSettings', :path => '../../../../node_modules/.pnpm/capacitor-native-settings@7.0.2_@capacitor+core@7.4.2/node_modules/capacitor-native-settings' + pod 'CapacitorPluginSafeArea', :path => '../../../../node_modules/.pnpm/capacitor-plugin-safe-area@4.0.3_@capacitor+core@7.4.2/node_modules/capacitor-plugin-safe-area' end - + target 'App' do capacitor_pods # Add your Pods here - pod 'CapacitorFirebaseAuthentication/Google', :path => '../../../../node_modules/.pnpm/@capacitor-firebase+authentication@8.0.1_@capacitor+core@8.0.1_firebase@12.8.0/node_modules/@capacitor-firebase/authentication' - pod 'CapacitorFirebaseAnalytics/AnalyticsWithoutAdIdSupport', :path => '../../../../node_modules/.pnpm/@capacitor-firebase+analytics@8.0.1_@capacitor+core@8.0.1_firebase@12.8.0/node_modules/@capacitor-firebase/analytics' + pod 'CapacitorFirebaseAuthentication/Google', :path => '../../../../node_modules/.pnpm/@capacitor-firebase+authentication@7.3.0_@capacitor+core@7.4.2_firebase@11.10.0/node_modules/@capacitor-firebase/authentication' + pod 'CapacitorFirebaseAnalytics/AnalyticsWithoutAdIdSupport', :path => '../../../../node_modules/.pnpm/@capacitor-firebase+analytics@7.3.0_@capacitor+core@7.4.2_firebase@11.10.0/node_modules/@capacitor-firebase/analytics' pod 'Firebase/Messaging' # FCM push notifications end - - + + post_install do |installer| assertDeploymentTarget(installer) installer.pods_project.targets.each do |target| diff --git a/apps/scouts/ios/App/Podfile.lock b/apps/scouts/ios/App/Podfile.lock index 534546d550..8c2a1c30d8 100644 --- a/apps/scouts/ios/App/Podfile.lock +++ b/apps/scouts/ios/App/Podfile.lock @@ -1,247 +1,242 @@ PODS: - Alamofire (5.10.2) - - AppAuth (2.0.0): - - AppAuth/Core (= 2.0.0) - - AppAuth/ExternalUserAgent (= 2.0.0) - - AppAuth/Core (2.0.0) - - AppAuth/ExternalUserAgent (2.0.0): + - AppAuth (1.7.6): + - AppAuth/Core (= 1.7.6) + - AppAuth/ExternalUserAgent (= 1.7.6) + - AppAuth/Core (1.7.6) + - AppAuth/ExternalUserAgent (1.7.6): - AppAuth/Core - - AppCheckCore (11.2.0): - - GoogleUtilities/Environment (~> 8.0) - - GoogleUtilities/UserDefaults (~> 8.0) - - PromisesObjC (~> 2.4) - BigInt (5.2.0) - - Capacitor (8.0.1): + - Capacitor (7.4.2): - CapacitorCordova - - CapacitorApp (8.0.0): + - CapacitorApp (7.0.2): - Capacitor - - CapacitorBrowser (8.0.0): + - CapacitorBrowser (7.0.2): - Capacitor - - CapacitorCamera (8.0.0): + - CapacitorCamera (7.0.2): - Capacitor - - CapacitorClipboard (8.0.0): + - CapacitorClipboard (7.0.2): - Capacitor - - CapacitorCommunitySqlite (7.0.2): + - CapacitorCommunitySqlite (7.0.1): - Capacitor - SQLCipher - ZIPFoundation - - CapacitorCordova (8.0.1) - - CapacitorFirebaseAnalytics (8.0.1): + - CapacitorCordova (7.4.2) + - CapacitorFirebaseAnalytics (7.3.0): - Capacitor - - CapacitorFirebaseAnalytics/Lite (= 8.0.1) - - CapacitorFirebaseAnalytics/AnalyticsWithoutAdIdSupport (8.0.1): + - CapacitorFirebaseAnalytics/Lite (= 7.3.0) + - CapacitorFirebaseAnalytics/AnalyticsWithoutAdIdSupport (7.3.0): - Capacitor - - FirebaseAnalytics/Core (~> 12.7.0) - - CapacitorFirebaseAnalytics/Lite (8.0.1): + - FirebaseAnalytics/WithoutAdIdSupport (~> 11.7.0) + - CapacitorFirebaseAnalytics/Lite (7.3.0): - Capacitor - - CapacitorFirebaseAuthentication (8.0.1): + - CapacitorFirebaseAuthentication (7.3.0): - Capacitor - - CapacitorFirebaseAuthentication/Lite (= 8.0.1) - - FirebaseAuth (~> 12.7.0) - - CapacitorFirebaseAuthentication/Google (8.0.1): + - CapacitorFirebaseAuthentication/Lite (= 7.3.0) + - FirebaseAuth (~> 11.7.0) + - CapacitorFirebaseAuthentication/Google (7.3.0): - Capacitor - - FirebaseAuth (~> 12.7.0) - - GoogleSignIn (= 9.0.0) - - CapacitorFirebaseAuthentication/Lite (8.0.1): + - FirebaseAuth (~> 11.7.0) + - GoogleSignIn (= 7.1.0) + - CapacitorFirebaseAuthentication/Lite (7.3.0): - Capacitor - - FirebaseAuth (~> 12.7.0) - - CapacitorHaptics (8.0.0): + - FirebaseAuth (~> 11.7.0) + - CapacitorHaptics (7.0.2): - Capacitor - - CapacitorKeyboard (8.0.0): + - CapacitorKeyboard (7.0.2): - Capacitor - - CapacitorLocalNotifications (8.0.0): + - CapacitorLocalNotifications (7.0.2): - Capacitor - - CapacitorMlkitBarcodeScanning (8.0.0): + - CapacitorMlkitBarcodeScanning (7.3.0): - Capacitor - - GoogleMLKit/BarcodeScanning (~> 8.0.0) - - CapacitorNativeSettings (7.0.2): + - GoogleMLKit/BarcodeScanning (= 7.0.0) + - CapacitorNativeSettings (7.0.1): - Capacitor - - CapacitorNetwork (8.0.0): + - CapacitorNetwork (7.0.2): - Capacitor - - CapacitorPluginSafeArea (5.0.0): + - CapacitorPluginSafeArea (4.0.0): - Capacitor - - CapacitorPushNotifications (8.0.0): + - CapacitorPushNotifications (7.0.2): - Capacitor - - CapacitorShare (8.0.0): + - CapacitorShare (7.0.2): - Capacitor - - CapacitorSplashScreen (8.0.0): + - CapacitorSplashScreen (7.0.2): - Capacitor - - CapacitorStatusBar (8.0.0): + - CapacitorStatusBar (7.0.2): - Capacitor - - CapawesomeCapacitorBadge (8.0.0): + - CapawesomeCapacitorBadge (7.0.1): - Capacitor - - CapgoCapacitorUpdater (8.41.12): + - CapgoCapacitorUpdater (7.8.7): - Alamofire (= 5.10.2) - BigInt (= 5.2.0) - Capacitor + - SSZipArchive (= 2.4.3) - Version (= 0.8.0) - - ZIPFoundation (~> 0.9) - - Firebase/CoreOnly (12.7.0): - - FirebaseCore (~> 12.7.0) - - Firebase/Messaging (12.7.0): + - Firebase/CoreOnly (11.7.0): + - FirebaseCore (~> 11.7.0) + - Firebase/Messaging (11.7.0): - Firebase/CoreOnly - - FirebaseMessaging (~> 12.7.0) - - FirebaseAnalytics/Core (12.7.0): - - FirebaseCore (~> 12.7.0) - - FirebaseInstallations (~> 12.7.0) - - GoogleAppMeasurement/Core (= 12.7.0) - - GoogleUtilities/AppDelegateSwizzler (~> 8.1) - - GoogleUtilities/MethodSwizzler (~> 8.1) - - GoogleUtilities/Network (~> 8.1) - - "GoogleUtilities/NSData+zlib (~> 8.1)" + - FirebaseMessaging (~> 11.7.0) + - FirebaseAnalytics/WithoutAdIdSupport (11.7.0): + - FirebaseCore (~> 11.7.0) + - FirebaseInstallations (~> 11.0) + - GoogleAppMeasurement/WithoutAdIdSupport (= 11.7.0) + - GoogleUtilities/AppDelegateSwizzler (~> 8.0) + - GoogleUtilities/MethodSwizzler (~> 8.0) + - GoogleUtilities/Network (~> 8.0) + - "GoogleUtilities/NSData+zlib (~> 8.0)" - nanopb (~> 3.30910.0) - - FirebaseAppCheckInterop (12.7.0) - - FirebaseAuth (12.7.0): - - FirebaseAppCheckInterop (~> 12.7.0) - - FirebaseAuthInterop (~> 12.7.0) - - FirebaseCore (~> 12.7.0) - - FirebaseCoreExtension (~> 12.7.0) - - GoogleUtilities/AppDelegateSwizzler (~> 8.1) - - GoogleUtilities/Environment (~> 8.1) - - GTMSessionFetcher/Core (< 6.0, >= 3.4) - - RecaptchaInterop (~> 101.0) - - FirebaseAuthInterop (12.7.0) - - FirebaseCore (12.7.0): - - FirebaseCoreInternal (~> 12.7.0) - - GoogleUtilities/Environment (~> 8.1) - - GoogleUtilities/Logger (~> 8.1) - - FirebaseCoreExtension (12.7.0): - - FirebaseCore (~> 12.7.0) - - FirebaseCoreInternal (12.7.0): - - "GoogleUtilities/NSData+zlib (~> 8.1)" - - FirebaseInstallations (12.7.0): - - FirebaseCore (~> 12.7.0) - - GoogleUtilities/Environment (~> 8.1) - - GoogleUtilities/UserDefaults (~> 8.1) + - FirebaseAppCheckInterop (11.15.0) + - FirebaseAuth (11.7.0): + - FirebaseAppCheckInterop (~> 11.0) + - FirebaseAuthInterop (~> 11.0) + - FirebaseCore (~> 11.7.0) + - FirebaseCoreExtension (~> 11.7.0) + - GoogleUtilities/AppDelegateSwizzler (~> 8.0) + - GoogleUtilities/Environment (~> 8.0) + - GTMSessionFetcher/Core (< 5.0, >= 3.4) + - RecaptchaInterop (~> 100.0) + - FirebaseAuthInterop (11.15.0) + - FirebaseCore (11.7.0): + - FirebaseCoreInternal (~> 11.7.0) + - GoogleUtilities/Environment (~> 8.0) + - GoogleUtilities/Logger (~> 8.0) + - FirebaseCoreExtension (11.7.0): + - FirebaseCore (~> 11.7.0) + - FirebaseCoreInternal (11.7.0): + - "GoogleUtilities/NSData+zlib (~> 8.0)" + - FirebaseInstallations (11.7.0): + - FirebaseCore (~> 11.7.0) + - GoogleUtilities/Environment (~> 8.0) + - GoogleUtilities/UserDefaults (~> 8.0) - PromisesObjC (~> 2.4) - - FirebaseMessaging (12.7.0): - - FirebaseCore (~> 12.7.0) - - FirebaseInstallations (~> 12.7.0) - - GoogleDataTransport (~> 10.1) - - GoogleUtilities/AppDelegateSwizzler (~> 8.1) - - GoogleUtilities/Environment (~> 8.1) - - GoogleUtilities/Reachability (~> 8.1) - - GoogleUtilities/UserDefaults (~> 8.1) + - FirebaseMessaging (11.7.0): + - FirebaseCore (~> 11.7.0) + - FirebaseInstallations (~> 11.0) + - GoogleDataTransport (~> 10.0) + - GoogleUtilities/AppDelegateSwizzler (~> 8.0) + - GoogleUtilities/Environment (~> 8.0) + - GoogleUtilities/Reachability (~> 8.0) + - GoogleUtilities/UserDefaults (~> 8.0) - nanopb (~> 3.30910.0) - - GoogleAppMeasurement/Core (12.7.0): - - GoogleUtilities/AppDelegateSwizzler (~> 8.1) - - GoogleUtilities/MethodSwizzler (~> 8.1) - - GoogleUtilities/Network (~> 8.1) - - "GoogleUtilities/NSData+zlib (~> 8.1)" + - GoogleAppMeasurement/WithoutAdIdSupport (11.7.0): + - GoogleUtilities/AppDelegateSwizzler (~> 8.0) + - GoogleUtilities/MethodSwizzler (~> 8.0) + - GoogleUtilities/Network (~> 8.0) + - "GoogleUtilities/NSData+zlib (~> 8.0)" - nanopb (~> 3.30910.0) - GoogleDataTransport (10.1.0): - nanopb (~> 3.30910.0) - PromisesObjC (~> 2.4) - - GoogleMLKit/BarcodeScanning (8.0.0): + - GoogleMLKit/BarcodeScanning (7.0.0): - GoogleMLKit/MLKitCore - - MLKitBarcodeScanning (~> 7.0.0) - - GoogleMLKit/MLKitCore (8.0.0): - - MLKitCommon (~> 13.0.0) - - GoogleSignIn (9.0.0): - - AppAuth (~> 2.0) - - AppCheckCore (~> 11.0) - - GTMAppAuth (~> 5.0) + - MLKitBarcodeScanning (~> 6.0.0) + - GoogleMLKit/MLKitCore (7.0.0): + - MLKitCommon (~> 12.0.0) + - GoogleSignIn (7.1.0): + - AppAuth (< 2.0, >= 1.7.3) + - GTMAppAuth (< 5.0, >= 4.1.1) - GTMSessionFetcher/Core (~> 3.3) - GoogleToolboxForMac/Defines (4.2.1) - GoogleToolboxForMac/Logger (4.2.1): - GoogleToolboxForMac/Defines (= 4.2.1) - "GoogleToolboxForMac/NSData+zlib (4.2.1)": - GoogleToolboxForMac/Defines (= 4.2.1) - - GoogleUtilities/AppDelegateSwizzler (8.1.0): + - GoogleUtilities/AppDelegateSwizzler (8.0.2): - GoogleUtilities/Environment - GoogleUtilities/Logger - GoogleUtilities/Network - GoogleUtilities/Privacy - - GoogleUtilities/Environment (8.1.0): + - GoogleUtilities/Environment (8.0.2): - GoogleUtilities/Privacy - - GoogleUtilities/Logger (8.1.0): + - GoogleUtilities/Logger (8.0.2): - GoogleUtilities/Environment - GoogleUtilities/Privacy - - GoogleUtilities/MethodSwizzler (8.1.0): + - GoogleUtilities/MethodSwizzler (8.0.2): - GoogleUtilities/Logger - GoogleUtilities/Privacy - - GoogleUtilities/Network (8.1.0): + - GoogleUtilities/Network (8.0.2): - GoogleUtilities/Logger - "GoogleUtilities/NSData+zlib" - GoogleUtilities/Privacy - GoogleUtilities/Reachability - - "GoogleUtilities/NSData+zlib (8.1.0)": + - "GoogleUtilities/NSData+zlib (8.0.2)": - GoogleUtilities/Privacy - - GoogleUtilities/Privacy (8.1.0) - - GoogleUtilities/Reachability (8.1.0): + - GoogleUtilities/Privacy (8.0.2) + - GoogleUtilities/Reachability (8.0.2): - GoogleUtilities/Logger - GoogleUtilities/Privacy - - GoogleUtilities/UserDefaults (8.1.0): + - GoogleUtilities/UserDefaults (8.0.2): - GoogleUtilities/Logger - GoogleUtilities/Privacy - - GTMAppAuth (5.0.0): - - AppAuth/Core (~> 2.0) + - GTMAppAuth (4.1.1): + - AppAuth/Core (~> 1.7) - GTMSessionFetcher/Core (< 4.0, >= 3.3) - GTMSessionFetcher/Core (3.5.0) - - MLImage (1.0.0-beta7) - - MLKitBarcodeScanning (7.0.0): - - MLKitCommon (~> 13.0) - - MLKitVision (~> 9.0) - - MLKitCommon (13.0.0): + - MLImage (1.0.0-beta6) + - MLKitBarcodeScanning (6.0.0): + - MLKitCommon (~> 12.0) + - MLKitVision (~> 8.0) + - MLKitCommon (12.0.0): - GoogleDataTransport (~> 10.0) - GoogleToolboxForMac/Logger (< 5.0, >= 4.2.1) - "GoogleToolboxForMac/NSData+zlib (< 5.0, >= 4.2.1)" - GoogleUtilities/Logger (~> 8.0) - GoogleUtilities/UserDefaults (~> 8.0) - GTMSessionFetcher/Core (< 4.0, >= 3.3.2) - - MLKitVision (9.0.0): + - MLKitVision (8.0.0): - GoogleToolboxForMac/Logger (< 5.0, >= 4.2.1) - "GoogleToolboxForMac/NSData+zlib (< 5.0, >= 4.2.1)" - GTMSessionFetcher/Core (< 4.0, >= 3.3.2) - - MLImage (= 1.0.0-beta7) - - MLKitCommon (~> 13.0) + - MLImage (= 1.0.0-beta6) + - MLKitCommon (~> 12.0) - nanopb (3.30910.0): - nanopb/decode (= 3.30910.0) - nanopb/encode (= 3.30910.0) - nanopb/decode (3.30910.0) - nanopb/encode (3.30910.0) - PromisesObjC (2.4.0) - - RecaptchaInterop (101.0.0) - - SQLCipher (4.10.0): - - SQLCipher/standard (= 4.10.0) - - SQLCipher/common (4.10.0) - - SQLCipher/standard (4.10.0): + - RecaptchaInterop (100.0.0) + - SQLCipher (4.9.0): + - SQLCipher/standard (= 4.9.0) + - SQLCipher/common (4.9.0) + - SQLCipher/standard (4.9.0): - SQLCipher/common + - SSZipArchive (2.4.3) - Version (0.8.0) - - ZIPFoundation (0.9.20) + - ZIPFoundation (0.9.19) DEPENDENCIES: - - "Capacitor (from `../../../../node_modules/.pnpm/@capacitor+ios@8.0.1_@capacitor+core@8.0.1/node_modules/@capacitor/ios`)" - - "CapacitorApp (from `../../../../node_modules/.pnpm/@capacitor+app@8.0.0_@capacitor+core@8.0.1/node_modules/@capacitor/app`)" - - "CapacitorBrowser (from `../../../../node_modules/.pnpm/@capacitor+browser@8.0.0_@capacitor+core@8.0.1/node_modules/@capacitor/browser`)" - - "CapacitorCamera (from `../../../../node_modules/.pnpm/@capacitor+camera@8.0.0_@capacitor+core@8.0.1/node_modules/@capacitor/camera`)" - - "CapacitorClipboard (from `../../../../node_modules/.pnpm/@capacitor+clipboard@8.0.0_@capacitor+core@8.0.1/node_modules/@capacitor/clipboard`)" - - "CapacitorCommunitySqlite (from `../../../../node_modules/.pnpm/@capacitor-community+sqlite@7.0.2_@capacitor+core@8.0.1/node_modules/@capacitor-community/sqlite`)" - - "CapacitorCordova (from `../../../../node_modules/.pnpm/@capacitor+ios@8.0.1_@capacitor+core@8.0.1/node_modules/@capacitor/ios`)" - - "CapacitorFirebaseAnalytics (from `../../../../node_modules/.pnpm/@capacitor-firebase+analytics@8.0.1_@capacitor+core@8.0.1_firebase@12.8.0/node_modules/@capacitor-firebase/analytics`)" - - "CapacitorFirebaseAnalytics/AnalyticsWithoutAdIdSupport (from `../../../../node_modules/.pnpm/@capacitor-firebase+analytics@8.0.1_@capacitor+core@8.0.1_firebase@12.8.0/node_modules/@capacitor-firebase/analytics`)" - - "CapacitorFirebaseAuthentication (from `../../../../node_modules/.pnpm/@capacitor-firebase+authentication@8.0.1_@capacitor+core@8.0.1_firebase@12.8.0/node_modules/@capacitor-firebase/authentication`)" - - "CapacitorFirebaseAuthentication/Google (from `../../../../node_modules/.pnpm/@capacitor-firebase+authentication@8.0.1_@capacitor+core@8.0.1_firebase@12.8.0/node_modules/@capacitor-firebase/authentication`)" - - "CapacitorHaptics (from `../../../../node_modules/.pnpm/@capacitor+haptics@8.0.0_@capacitor+core@8.0.1/node_modules/@capacitor/haptics`)" - - "CapacitorKeyboard (from `../../../../node_modules/.pnpm/@capacitor+keyboard@8.0.0_@capacitor+core@8.0.1/node_modules/@capacitor/keyboard`)" - - "CapacitorLocalNotifications (from `../../../../node_modules/.pnpm/@capacitor+local-notifications@8.0.0_@capacitor+core@8.0.1/node_modules/@capacitor/local-notifications`)" - - "CapacitorMlkitBarcodeScanning (from `../../../../node_modules/.pnpm/@capacitor-mlkit+barcode-scanning@8.0.0_@capacitor+core@8.0.1/node_modules/@capacitor-mlkit/barcode-scanning`)" - - "CapacitorNativeSettings (from `../../../../node_modules/.pnpm/capacitor-native-settings@7.0.2_@capacitor+core@8.0.1/node_modules/capacitor-native-settings`)" - - "CapacitorNetwork (from `../../../../node_modules/.pnpm/@capacitor+network@8.0.0_@capacitor+core@8.0.1/node_modules/@capacitor/network`)" - - "CapacitorPluginSafeArea (from `../../../../node_modules/.pnpm/capacitor-plugin-safe-area@5.0.0_@capacitor+core@8.0.1/node_modules/capacitor-plugin-safe-area`)" - - "CapacitorPushNotifications (from `../../../../node_modules/.pnpm/@capacitor+push-notifications@8.0.0_@capacitor+core@8.0.1/node_modules/@capacitor/push-notifications`)" - - "CapacitorShare (from `../../../../node_modules/.pnpm/@capacitor+share@8.0.0_@capacitor+core@8.0.1/node_modules/@capacitor/share`)" - - "CapacitorSplashScreen (from `../../../../node_modules/.pnpm/@capacitor+splash-screen@8.0.0_@capacitor+core@8.0.1/node_modules/@capacitor/splash-screen`)" - - "CapacitorStatusBar (from `../../../../node_modules/.pnpm/@capacitor+status-bar@8.0.0_@capacitor+core@8.0.1/node_modules/@capacitor/status-bar`)" - - "CapawesomeCapacitorBadge (from `../../../../node_modules/.pnpm/@capawesome+capacitor-badge@8.0.0_@capacitor+core@8.0.1/node_modules/@capawesome/capacitor-badge`)" - - "CapgoCapacitorUpdater (from `../../../../node_modules/.pnpm/@capgo+capacitor-updater@8.41.12_@capacitor+core@8.0.1/node_modules/@capgo/capacitor-updater`)" + - "Capacitor (from `../../../../node_modules/.pnpm/@capacitor+ios@7.4.2_@capacitor+core@7.4.2/node_modules/@capacitor/ios`)" + - "CapacitorApp (from `../../../../node_modules/.pnpm/@capacitor+app@7.0.2_@capacitor+core@7.4.2/node_modules/@capacitor/app`)" + - "CapacitorBrowser (from `../../../../node_modules/.pnpm/@capacitor+browser@7.0.2_@capacitor+core@7.4.2/node_modules/@capacitor/browser`)" + - "CapacitorCamera (from `../../../../node_modules/.pnpm/@capacitor+camera@7.0.2_@capacitor+core@7.4.2/node_modules/@capacitor/camera`)" + - "CapacitorClipboard (from `../../../../node_modules/.pnpm/@capacitor+clipboard@7.0.2_@capacitor+core@7.4.2/node_modules/@capacitor/clipboard`)" + - "CapacitorCommunitySqlite (from `../../../../node_modules/.pnpm/@capacitor-community+sqlite@7.0.1_@capacitor+core@7.4.2/node_modules/@capacitor-community/sqlite`)" + - "CapacitorCordova (from `../../../../node_modules/.pnpm/@capacitor+ios@7.4.2_@capacitor+core@7.4.2/node_modules/@capacitor/ios`)" + - "CapacitorFirebaseAnalytics (from `../../../../node_modules/.pnpm/@capacitor-firebase+analytics@7.3.0_@capacitor+core@7.4.2_firebase@11.10.0/node_modules/@capacitor-firebase/analytics`)" + - "CapacitorFirebaseAnalytics/AnalyticsWithoutAdIdSupport (from `../../../../node_modules/.pnpm/@capacitor-firebase+analytics@7.3.0_@capacitor+core@7.4.2_firebase@11.10.0/node_modules/@capacitor-firebase/analytics`)" + - "CapacitorFirebaseAuthentication (from `../../../../node_modules/.pnpm/@capacitor-firebase+authentication@7.3.0_@capacitor+core@7.4.2_firebase@11.10.0/node_modules/@capacitor-firebase/authentication`)" + - "CapacitorFirebaseAuthentication/Google (from `../../../../node_modules/.pnpm/@capacitor-firebase+authentication@7.3.0_@capacitor+core@7.4.2_firebase@11.10.0/node_modules/@capacitor-firebase/authentication`)" + - "CapacitorHaptics (from `../../../../node_modules/.pnpm/@capacitor+haptics@7.0.2_@capacitor+core@7.4.2/node_modules/@capacitor/haptics`)" + - "CapacitorKeyboard (from `../../../../node_modules/.pnpm/@capacitor+keyboard@7.0.2_@capacitor+core@7.4.2/node_modules/@capacitor/keyboard`)" + - "CapacitorLocalNotifications (from `../../../../node_modules/.pnpm/@capacitor+local-notifications@7.0.2_@capacitor+core@7.4.2/node_modules/@capacitor/local-notifications`)" + - "CapacitorMlkitBarcodeScanning (from `../../../../node_modules/.pnpm/@capacitor-mlkit+barcode-scanning@7.3.0_@capacitor+core@7.4.2/node_modules/@capacitor-mlkit/barcode-scanning`)" + - "CapacitorNativeSettings (from `../../../../node_modules/.pnpm/capacitor-native-settings@7.0.1_@capacitor+core@7.4.2/node_modules/capacitor-native-settings`)" + - "CapacitorNetwork (from `../../../../node_modules/.pnpm/@capacitor+network@7.0.2_@capacitor+core@7.4.2/node_modules/@capacitor/network`)" + - "CapacitorPluginSafeArea (from `../../../../node_modules/.pnpm/capacitor-plugin-safe-area@4.0.0_@capacitor+core@7.4.2/node_modules/capacitor-plugin-safe-area`)" + - "CapacitorPushNotifications (from `../../../../node_modules/.pnpm/@capacitor+push-notifications@7.0.2_@capacitor+core@7.4.2/node_modules/@capacitor/push-notifications`)" + - "CapacitorShare (from `../../../../node_modules/.pnpm/@capacitor+share@7.0.2_@capacitor+core@7.4.2/node_modules/@capacitor/share`)" + - "CapacitorSplashScreen (from `../../../../node_modules/.pnpm/@capacitor+splash-screen@7.0.2_@capacitor+core@7.4.2/node_modules/@capacitor/splash-screen`)" + - "CapacitorStatusBar (from `../../../../node_modules/.pnpm/@capacitor+status-bar@7.0.2_@capacitor+core@7.4.2/node_modules/@capacitor/status-bar`)" + - "CapawesomeCapacitorBadge (from `../../../../node_modules/.pnpm/@capawesome+capacitor-badge@7.0.1_@capacitor+core@7.4.2/node_modules/@capawesome/capacitor-badge`)" + - "CapgoCapacitorUpdater (from `../../../../node_modules/.pnpm/@capgo+capacitor-updater@7.8.7_@capacitor+core@7.4.2/node_modules/@capgo/capacitor-updater`)" - Firebase/Messaging SPEC REPOS: trunk: - Alamofire - AppAuth - - AppCheckCore - BigInt - Firebase - FirebaseAnalytics @@ -269,111 +264,112 @@ SPEC REPOS: - PromisesObjC - RecaptchaInterop - SQLCipher + - SSZipArchive - Version - ZIPFoundation EXTERNAL SOURCES: Capacitor: - :path: "../../../../node_modules/.pnpm/@capacitor+ios@8.0.1_@capacitor+core@8.0.1/node_modules/@capacitor/ios" + :path: "../../../../node_modules/.pnpm/@capacitor+ios@7.4.2_@capacitor+core@7.4.2/node_modules/@capacitor/ios" CapacitorApp: - :path: "../../../../node_modules/.pnpm/@capacitor+app@8.0.0_@capacitor+core@8.0.1/node_modules/@capacitor/app" + :path: "../../../../node_modules/.pnpm/@capacitor+app@7.0.2_@capacitor+core@7.4.2/node_modules/@capacitor/app" CapacitorBrowser: - :path: "../../../../node_modules/.pnpm/@capacitor+browser@8.0.0_@capacitor+core@8.0.1/node_modules/@capacitor/browser" + :path: "../../../../node_modules/.pnpm/@capacitor+browser@7.0.2_@capacitor+core@7.4.2/node_modules/@capacitor/browser" CapacitorCamera: - :path: "../../../../node_modules/.pnpm/@capacitor+camera@8.0.0_@capacitor+core@8.0.1/node_modules/@capacitor/camera" + :path: "../../../../node_modules/.pnpm/@capacitor+camera@7.0.2_@capacitor+core@7.4.2/node_modules/@capacitor/camera" CapacitorClipboard: - :path: "../../../../node_modules/.pnpm/@capacitor+clipboard@8.0.0_@capacitor+core@8.0.1/node_modules/@capacitor/clipboard" + :path: "../../../../node_modules/.pnpm/@capacitor+clipboard@7.0.2_@capacitor+core@7.4.2/node_modules/@capacitor/clipboard" CapacitorCommunitySqlite: - :path: "../../../../node_modules/.pnpm/@capacitor-community+sqlite@7.0.2_@capacitor+core@8.0.1/node_modules/@capacitor-community/sqlite" + :path: "../../../../node_modules/.pnpm/@capacitor-community+sqlite@7.0.1_@capacitor+core@7.4.2/node_modules/@capacitor-community/sqlite" CapacitorCordova: - :path: "../../../../node_modules/.pnpm/@capacitor+ios@8.0.1_@capacitor+core@8.0.1/node_modules/@capacitor/ios" + :path: "../../../../node_modules/.pnpm/@capacitor+ios@7.4.2_@capacitor+core@7.4.2/node_modules/@capacitor/ios" CapacitorFirebaseAnalytics: - :path: "../../../../node_modules/.pnpm/@capacitor-firebase+analytics@8.0.1_@capacitor+core@8.0.1_firebase@12.8.0/node_modules/@capacitor-firebase/analytics" + :path: "../../../../node_modules/.pnpm/@capacitor-firebase+analytics@7.3.0_@capacitor+core@7.4.2_firebase@11.10.0/node_modules/@capacitor-firebase/analytics" CapacitorFirebaseAuthentication: - :path: "../../../../node_modules/.pnpm/@capacitor-firebase+authentication@8.0.1_@capacitor+core@8.0.1_firebase@12.8.0/node_modules/@capacitor-firebase/authentication" + :path: "../../../../node_modules/.pnpm/@capacitor-firebase+authentication@7.3.0_@capacitor+core@7.4.2_firebase@11.10.0/node_modules/@capacitor-firebase/authentication" CapacitorHaptics: - :path: "../../../../node_modules/.pnpm/@capacitor+haptics@8.0.0_@capacitor+core@8.0.1/node_modules/@capacitor/haptics" + :path: "../../../../node_modules/.pnpm/@capacitor+haptics@7.0.2_@capacitor+core@7.4.2/node_modules/@capacitor/haptics" CapacitorKeyboard: - :path: "../../../../node_modules/.pnpm/@capacitor+keyboard@8.0.0_@capacitor+core@8.0.1/node_modules/@capacitor/keyboard" + :path: "../../../../node_modules/.pnpm/@capacitor+keyboard@7.0.2_@capacitor+core@7.4.2/node_modules/@capacitor/keyboard" CapacitorLocalNotifications: - :path: "../../../../node_modules/.pnpm/@capacitor+local-notifications@8.0.0_@capacitor+core@8.0.1/node_modules/@capacitor/local-notifications" + :path: "../../../../node_modules/.pnpm/@capacitor+local-notifications@7.0.2_@capacitor+core@7.4.2/node_modules/@capacitor/local-notifications" CapacitorMlkitBarcodeScanning: - :path: "../../../../node_modules/.pnpm/@capacitor-mlkit+barcode-scanning@8.0.0_@capacitor+core@8.0.1/node_modules/@capacitor-mlkit/barcode-scanning" + :path: "../../../../node_modules/.pnpm/@capacitor-mlkit+barcode-scanning@7.3.0_@capacitor+core@7.4.2/node_modules/@capacitor-mlkit/barcode-scanning" CapacitorNativeSettings: - :path: "../../../../node_modules/.pnpm/capacitor-native-settings@7.0.2_@capacitor+core@8.0.1/node_modules/capacitor-native-settings" + :path: "../../../../node_modules/.pnpm/capacitor-native-settings@7.0.1_@capacitor+core@7.4.2/node_modules/capacitor-native-settings" CapacitorNetwork: - :path: "../../../../node_modules/.pnpm/@capacitor+network@8.0.0_@capacitor+core@8.0.1/node_modules/@capacitor/network" + :path: "../../../../node_modules/.pnpm/@capacitor+network@7.0.2_@capacitor+core@7.4.2/node_modules/@capacitor/network" CapacitorPluginSafeArea: - :path: "../../../../node_modules/.pnpm/capacitor-plugin-safe-area@5.0.0_@capacitor+core@8.0.1/node_modules/capacitor-plugin-safe-area" + :path: "../../../../node_modules/.pnpm/capacitor-plugin-safe-area@4.0.0_@capacitor+core@7.4.2/node_modules/capacitor-plugin-safe-area" CapacitorPushNotifications: - :path: "../../../../node_modules/.pnpm/@capacitor+push-notifications@8.0.0_@capacitor+core@8.0.1/node_modules/@capacitor/push-notifications" + :path: "../../../../node_modules/.pnpm/@capacitor+push-notifications@7.0.2_@capacitor+core@7.4.2/node_modules/@capacitor/push-notifications" CapacitorShare: - :path: "../../../../node_modules/.pnpm/@capacitor+share@8.0.0_@capacitor+core@8.0.1/node_modules/@capacitor/share" + :path: "../../../../node_modules/.pnpm/@capacitor+share@7.0.2_@capacitor+core@7.4.2/node_modules/@capacitor/share" CapacitorSplashScreen: - :path: "../../../../node_modules/.pnpm/@capacitor+splash-screen@8.0.0_@capacitor+core@8.0.1/node_modules/@capacitor/splash-screen" + :path: "../../../../node_modules/.pnpm/@capacitor+splash-screen@7.0.2_@capacitor+core@7.4.2/node_modules/@capacitor/splash-screen" CapacitorStatusBar: - :path: "../../../../node_modules/.pnpm/@capacitor+status-bar@8.0.0_@capacitor+core@8.0.1/node_modules/@capacitor/status-bar" + :path: "../../../../node_modules/.pnpm/@capacitor+status-bar@7.0.2_@capacitor+core@7.4.2/node_modules/@capacitor/status-bar" CapawesomeCapacitorBadge: - :path: "../../../../node_modules/.pnpm/@capawesome+capacitor-badge@8.0.0_@capacitor+core@8.0.1/node_modules/@capawesome/capacitor-badge" + :path: "../../../../node_modules/.pnpm/@capawesome+capacitor-badge@7.0.1_@capacitor+core@7.4.2/node_modules/@capawesome/capacitor-badge" CapgoCapacitorUpdater: - :path: "../../../../node_modules/.pnpm/@capgo+capacitor-updater@8.41.12_@capacitor+core@8.0.1/node_modules/@capgo/capacitor-updater" + :path: "../../../../node_modules/.pnpm/@capgo+capacitor-updater@7.8.7_@capacitor+core@7.4.2/node_modules/@capgo/capacitor-updater" SPEC CHECKSUMS: Alamofire: 7193b3b92c74a07f85569e1a6c4f4237291e7496 - AppAuth: 1c1a8afa7e12f2ec3a294d9882dfa5ab7d3cb063 - AppCheckCore: cc8fd0a3a230ddd401f326489c99990b013f0c4f + AppAuth: d4f13a8fe0baf391b2108511793e4b479691fb73 BigInt: f668a80089607f521586bbe29513d708491ef2f7 - Capacitor: ff35b0f66370b84aa238251b35b91886a3207c16 - CapacitorApp: 3963a84197280757b84f126afd1520a85ae3b092 - CapacitorBrowser: b7d7f05f840fe042e46f6528bb8db853e3058fb2 - CapacitorCamera: 592acb7ab9fb748e2d8571eb03af30ec4e1ace12 - CapacitorClipboard: 61832a3722adc61afed6e0191c8a0e11ba11674d - CapacitorCommunitySqlite: a57c58e1c37f4bc250ef01e66b0055cb6ddd775e - CapacitorCordova: 0d65b9bb74e995dcecb9463f34f1af2aba6f955c - CapacitorFirebaseAnalytics: 19a1c90af1b9eb4c290fd026418f961f3fd0e548 - CapacitorFirebaseAuthentication: cb5ddfd40d28ae8522b9af25741ba62eaa939501 - CapacitorHaptics: 2079d9fa04c5a71e18663b4722323c304c58245c - CapacitorKeyboard: d7868c079a4d5277a3deca27a10a488fcbbb8b69 - CapacitorLocalNotifications: 177cfbf8228d9bd82a147e094cb7984d7afb9e29 - CapacitorMlkitBarcodeScanning: c990cd038eeede95212af747f0e7fcf9c91e61e7 - CapacitorNativeSettings: 3cd2e2ef431fe471674f381609cfb29154ddfcfa - CapacitorNetwork: 156f8096cbbce5337eb1769fcc0d6adc4b85d3f3 - CapacitorPluginSafeArea: 9d0682951c011bf0b36e513a89103c5fbff7ac49 - CapacitorPushNotifications: 722c1528eabbefd355f47e373a4c6235d01e85e9 - CapacitorShare: 12f1d192170cbcf9f108fd675ac8e343761a4638 - CapacitorSplashScreen: 422880d7117605c30699eb4b21644b62db42e86c - CapacitorStatusBar: 312e2e67928dfe9514c4a8916a1fd610552f5f35 - CapawesomeCapacitorBadge: 8875ba23dfad72cfee5bc3aca27c1a580d33eee7 - CapgoCapacitorUpdater: 02465b7612dc67e7bb945cb0f99fd4056e6395d4 - Firebase: 2d19a10c9a2e48ac532a4303115d3fc9b2798396 - FirebaseAnalytics: e423129866107aeacf6010a280b9c9829f9ea50d - FirebaseAppCheckInterop: d58366471f1dadf2ed998b15f85c658458a10142 - FirebaseAuth: 88beaef7c688a2950541552b6dd195d22137c41a - FirebaseAuthInterop: deb2638881b5d98c88c4371dd0de65b6110f217b - FirebaseCore: c7b57863ce0859281a66d16ca36d665c45d332b5 - FirebaseCoreExtension: 731a5744970bcd73ad95ab2a2b8a1f46353e86dd - FirebaseCoreInternal: 571a2dd8c975410966199623351db3a3265c874d - FirebaseInstallations: 6d05424a046b68ca146b4de4376f05b4e9262fc3 - FirebaseMessaging: b5f7bdc62b91b6102015991fb7bc6fa75f643908 - GoogleAppMeasurement: 8f59e08efecfa1bcd57f0a56fab07d079366268c + Capacitor: 9d9e481b79ffaeacaf7a85d6a11adec32bd33b59 + CapacitorApp: 1f6922c9c5c8b1c538d7fbe92ebe44a81b34bed3 + CapacitorBrowser: 22541e48442de44dc629c214388290d6eecc6ae9 + CapacitorCamera: f9e54db0a18bb218a8dc360907d63aaefe9209ff + CapacitorClipboard: 7e227702976d4435a5a40df54f65e154d0dfc1f3 + CapacitorCommunitySqlite: 8b2c6bab33e3519280811d481f8bd0fa90343e1b + CapacitorCordova: 5e58d04631bc5094894ac106e2bf1da18a9e6151 + CapacitorFirebaseAnalytics: 99fb86679f3a40b148d6e3e7ddeb6115a9c08edf + CapacitorFirebaseAuthentication: b25177f2b09cf7581d3f11d96008cc56dcb5aa36 + CapacitorHaptics: b3fb2869e72c4466e18ce9ccbeb60a3d8723b3d4 + CapacitorKeyboard: a86aa9e4741b6444a802df26440a92ae041b34a6 + CapacitorLocalNotifications: 665188ae8accd40806129073896fb2b39322d858 + CapacitorMlkitBarcodeScanning: 05b2dfc7a70099f6d4594365c521534d79a17b1d + CapacitorNativeSettings: bef37b3c7e2184da7416a3f162c71de19fd27593 + CapacitorNetwork: 695069886b3c5ed514db69aa3d026b8dc3c03a6b + CapacitorPluginSafeArea: 22031c3436269ca80fac90ec2c94bc7c1e59a81d + CapacitorPushNotifications: 7c0659b349b149ee3936a682da31a9d269de9582 + CapacitorShare: be166411fa995ead2d39b104aa0aae56d8615c66 + CapacitorSplashScreen: 157947576b59d913792063a8d442a79e6d283ee5 + CapacitorStatusBar: e04d05e121d5a5979c29eb4249186a4e4a84cacb + CapawesomeCapacitorBadge: 7fc1fa00c920b88eabb8451ddc92bdc75da2cffa + CapgoCapacitorUpdater: 90b09b7c3c23c02f1b0dfe42db51d0abaf1910f3 + Firebase: a64bf6a8546e6eab54f1c715cd6151f39d2329f4 + FirebaseAnalytics: bc9e565af9044ba8d6c6e4157e4edca8e5fdf7ec + FirebaseAppCheckInterop: 06fe5a3799278ae4667e6c432edd86b1030fa3df + FirebaseAuth: 77e25aa24f3e1c626c5babd3338551fc1669ee0e + FirebaseAuthInterop: 7087d7a4ee4bc4de019b2d0c240974ed5d89e2fd + FirebaseCore: 3227e35f4197a924206fbcdc0349325baf4f5de4 + FirebaseCoreExtension: 206c1b399f0d103055207c16f299b28e3dbd1949 + FirebaseCoreInternal: d6c17dafc8dc33614733a8b52df78fcb4394c881 + FirebaseInstallations: 9347e719c3d52d8d7b9074b2c32407dd027305e9 + FirebaseMessaging: 00ece041b71ddb52a2862ffdee73fb6e9824bd0c + GoogleAppMeasurement: 0471a5b5bff51f3a91b1e76df22c952d04c63967 GoogleDataTransport: aae35b7ea0c09004c3797d53c8c41f66f219d6a7 - GoogleMLKit: ddd51d7dff36ff28defa69afedd9cdce684fd857 - GoogleSignIn: c7f09cfbc85a1abf69187be091997c317cc33b77 + GoogleMLKit: eff9e23ec1d90ea4157a1ee2e32a4f610c5b3318 + GoogleSignIn: d4281ab6cf21542b1cfaff85c191f230b399d2db GoogleToolboxForMac: d1a2cbf009c453f4d6ded37c105e2f67a32206d8 - GoogleUtilities: 00c88b9a86066ef77f0da2fab05f65d7768ed8e1 - GTMAppAuth: 217a876b249c3c585a54fd6f73e6b58c4f5c4238 + GoogleUtilities: 26a3abef001b6533cf678d3eb38fd3f614b7872d + GTMAppAuth: f69bd07d68cd3b766125f7e072c45d7340dea0de GTMSessionFetcher: 5aea5ba6bd522a239e236100971f10cb71b96ab6 - MLImage: 2ab9c968e75f57911c16f4c9d9e8a8e9604a86a1 - MLKitBarcodeScanning: 72c6437f13a900833b400136be53a8a5d86f42fa - MLKitCommon: 26b779f072a182c1603d4c88a101c350cac837b1 - MLKitVision: fa8dea9012ac59497c79ddbe9ebf32051047ac4c + MLImage: 0ad1c5f50edd027672d8b26b0fee78a8b4a0fc56 + MLKitBarcodeScanning: 0a3064da0a7f49ac24ceb3cb46a5bc67496facd2 + MLKitCommon: 07c2c33ae5640e5380beaaa6e4b9c249a205542d + MLKitVision: 45e79d68845a2de77e2dd4d7f07947f0ed157b0e nanopb: fad817b59e0457d11a5dfbde799381cd727c1275 PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47 - RecaptchaInterop: 11e0b637842dfb48308d242afc3f448062325aba - SQLCipher: eb79c64049cb002b4e9fcb30edb7979bf4706dfc + RecaptchaInterop: 7d1a4a01a6b2cb1610a47ef3f85f0c411434cb21 + SQLCipher: 31878d8ebd27e5c96db0b7cb695c96e9f8ad77da + SSZipArchive: fe6a26b2a54d5a0890f2567b5cc6de5caa600aef Version: de5907f2c5d0f3cf21708db7801d1d5401139486 - ZIPFoundation: dfd3d681c4053ff7e2f7350bc4e53b5dba3f5351 + ZIPFoundation: b8c29ea7ae353b309bc810586181fd073cb3312c -PODFILE CHECKSUM: 8851f5c16964259383efc684d209782cbe7e4825 +PODFILE CHECKSUM: 8297fcca33931aa204283af43575861d79c33c5d COCOAPODS: 1.16.2 diff --git a/apps/scouts/netlify.toml b/apps/scouts/netlify.toml index 6dc1c0f78c..4395ef5148 100644 --- a/apps/scouts/netlify.toml +++ b/apps/scouts/netlify.toml @@ -4,10 +4,9 @@ [build.environment] PNPM_FLAGS = "-P false" -SKIP_DIDKIT_NAPI = "1" # Global Context Default [build] -command = "pnpm exec nx build scouts --skip-nx-cache" +command = "pnpm exec nx build scouts" publish = "build/" # Netlify Deploy Preview diff --git a/apps/scouts/package.json b/apps/scouts/package.json index 0ddb8d384e..fef7b724b7 100644 --- a/apps/scouts/package.json +++ b/apps/scouts/package.json @@ -1,29 +1,29 @@ { "name": "scoutpass-app", - "version": "1.89.15", + "version": "1.89.11", "private": true, "dependencies": { "@capacitor-community/sqlite": "^7.0.1", - "@capacitor-firebase/analytics": "8.0.1", - "@capacitor-firebase/authentication": "^8.0.1", - "@capacitor-mlkit/barcode-scanning": "^8.0.0", - "@capacitor/android": "^8.0.1", - "@capacitor/app": "^8.0.0", - "@capacitor/browser": "^8.0.0", - "@capacitor/camera": "^8.0.0", - "@capacitor/clipboard": "^8.0.0", - "@capacitor/core": "8.0.1", - "@capacitor/haptics": "^8.0.0", - "@capacitor/ios": "^8.0.1", - "@capacitor/keyboard": "^8.0.0", - "@capacitor/local-notifications": "^8.0.0", - "@capacitor/network": "^8.0.0", - "@capacitor/push-notifications": "^8.0.0", - "@capacitor/share": "^8.0.0", - "@capacitor/splash-screen": "^8.0.0", - "@capacitor/status-bar": "^8.0.0", - "@capawesome/capacitor-badge": "8.0.0", - "@capgo/capacitor-updater": "8.41.12", + "@capacitor-firebase/analytics": "7.3.0", + "@capacitor-firebase/authentication": "^7.3.0", + "@capacitor-mlkit/barcode-scanning": "^7.3.0", + "@capacitor/android": "^7.4.2", + "@capacitor/app": "^7.0.2", + "@capacitor/browser": "^7.0.2", + "@capacitor/camera": "^7.0.2", + "@capacitor/clipboard": "^7.0.2", + "@capacitor/core": "7.4.2", + "@capacitor/haptics": "^7.0.2", + "@capacitor/ios": "^7.4.2", + "@capacitor/keyboard": "^7.0.2", + "@capacitor/local-notifications": "^7.0.2", + "@capacitor/network": "^7.0.2", + "@capacitor/push-notifications": "^7.0.2", + "@capacitor/share": "^7.0.2", + "@capacitor/splash-screen": "^7.0.2", + "@capacitor/status-bar": "^7.0.2", + "@capawesome/capacitor-badge": "7.0.1", + "@capgo/capacitor-updater": "7.8.7", "@datadog/browser-logs": "^4.50.1", "@emoji-mart/data": "^1.2.1", "@emoji-mart/react": "^1.1.1", @@ -52,13 +52,13 @@ "@learncard/lca-api-plugin": "workspace:*", "async": "^3.2.6", "buffer": "^6.0.3", - "capacitor-native-settings": "^7.0.2", - "capacitor-plugin-safe-area": "^5.0.0", + "capacitor-native-settings": "^7.0.1", + "capacitor-plugin-safe-area": "^4.0.0", "capacitor-standard-version": "^1.1.21", "cordova-res": "^0.15.4", "crypto-js": "^4.2.0", "date-fns": "^4.1.0", - "firebase": "12.8.0", + "firebase": "11.10.0", "immer": "^10.1.1", "ionicons": "^5.5.4", "json-stringify-deterministic": "^1.0.12", @@ -138,7 +138,7 @@ ] }, "devDependencies": { - "@capacitor/cli": "^8.0.1", + "@capacitor/cli": "^7.0.1", "@esbuild-plugins/node-globals-polyfill": "^0.2.3", "@ionic/cli": "^6.20.9", "@playwright/test": "^1.51.0", diff --git a/apps/scouts/src/assets/sass/boost-cms.scss b/apps/scouts/src/assets/sass/boost-cms.scss index 9c30789bde..d4a61c5950 100644 --- a/apps/scouts/src/assets/sass/boost-cms.scss +++ b/apps/scouts/src/assets/sass/boost-cms.scss @@ -3,11 +3,6 @@ display: flex; justify-content: center; flex-wrap: wrap; - - @media (min-width: 768px) { - max-width: 768px; - margin: 0 auto; - } } .boost-cms-badge { @@ -82,12 +77,6 @@ } // Media queries - @media (min-width: 768px) { - width: 23%; - padding-bottom: 23%; - margin: 1%; - } - @media (max-width: 991px) { width: 31%; padding-bottom: 31%; diff --git a/apps/scouts/src/components/boost/boost-earned-card/BoostEarnedCard.tsx b/apps/scouts/src/components/boost/boost-earned-card/BoostEarnedCard.tsx index 4f5aca3f19..762edbe166 100644 --- a/apps/scouts/src/components/boost/boost-earned-card/BoostEarnedCard.tsx +++ b/apps/scouts/src/components/boost/boost-earned-card/BoostEarnedCard.tsx @@ -39,8 +39,6 @@ import { import { useLoadingLine } from '../../../stores/loadingStore'; import useBoostMenu, { BoostMenuType } from '../hooks/useBoostMenu'; -import { useHighlightedCredentials } from '../../../hooks/useHighlightedCredentials'; -import { getRoleFromCred, getScoutsNounForRole } from '../../../helpers/troop.helpers'; type BoostEarnedCardProps = { credential?: VC; @@ -98,28 +96,6 @@ export const BoostEarnedCard: React.FC = ({ const credential = resolvedCredential || _credential; const isBoost = credential && isBoostCredential(credential); const cred = credential && unwrapBoostCredential(credential); - - const boostIssuer = (credential as any)?.boostCredential?.issuer; - const boostIssuerDid = - typeof boostIssuer === 'string' ? boostIssuer : boostIssuer?.id; - - // Fallback to VC issuer if boostCredential.issuer is not available - const issuerDid = - boostIssuerDid || - (typeof cred?.issuer === 'string' ? cred.issuer : (cred as any)?.issuer?.id); - - // Extract user ID from DID (e.g., "jpgclub" from "did:web:localhost%3A4000:users:jpgclub") - const profileID = issuerDid?.split(':').pop(); - - const { credentials: highlightedCreds } = useHighlightedCredentials(profileID); - - const unknownVerifierTitle = React.useMemo(() => { - if (!highlightedCreds || highlightedCreds.length === 0) return undefined; - - const role = getRoleFromCred(highlightedCreds[0]); - return getScoutsNounForRole(role); // Just the role, no "Verified" prefix - }, [highlightedCreds]); - const credImg = getUrlFromImage(getCredentialSubject(cred)?.image ?? ''); const cardTitle = isBoost ? cred?.name : getCredentialName(cred); @@ -167,7 +143,7 @@ export const BoostEarnedCard: React.FC = ({ issuerOverride: issuerName, issueeOverride: issueeName, verificationItems: isBoost ? (undefined as any) : [], - handleShareBoost: () => openShareBoostLink(unknownVerifierTitle), + handleShareBoost: () => openShareBoostLink(), handleCloseModal: () => closeModal(), subjectImageComponent: subjectProfileImageElement, issuerImageComponent: issuerProfileImageElement, @@ -191,7 +167,6 @@ export const BoostEarnedCard: React.FC = ({ customBodyCardComponent: undefined as any, customFooterComponent: undefined as any, customIssueHistoryComponent: undefined as any, - unknownVerifierTitle, }; const backgroundImage = isCertificate || isID ? cred?.display?.backgroundImage : undefined; @@ -212,7 +187,7 @@ export const BoostEarnedCard: React.FC = ({ closeModal ); - const openShareBoostLink = (title?: string) => { + const openShareBoostLink = () => { newModal( = ({ boostPageViewMode={boostPageViewMode} credential={cred as any} branding={branding} - unknownVerifierTitle={unknownVerifierTitle} /> ); @@ -335,7 +309,6 @@ export const BoostEarnedCard: React.FC = ({ boostPageViewMode={boostPageViewMode} credential={cred as any} branding={branding} - unknownVerifierTitle={unknownVerifierTitle} /> @@ -466,7 +439,6 @@ export const BoostEarnedCard: React.FC = ({ credential={cred as any} branding={branding} loading={showSkeleton} - unknownVerifierTitle={unknownVerifierTitle} /> diff --git a/apps/scouts/src/components/boost/boost-managed-card/BoostManagedCard.tsx b/apps/scouts/src/components/boost/boost-managed-card/BoostManagedCard.tsx index 2a12b6fab1..4688db7cdb 100644 --- a/apps/scouts/src/components/boost/boost-managed-card/BoostManagedCard.tsx +++ b/apps/scouts/src/components/boost/boost-managed-card/BoostManagedCard.tsx @@ -378,7 +378,6 @@ export const BoostManagedCard: React.FC = ({ categoryType={categoryType} branding={branding} loading={showSkeleton} - managedBoost={true} /> )} diff --git a/apps/scouts/src/components/boost/boost-options-menu/ShareBoostLink.tsx b/apps/scouts/src/components/boost/boost-options-menu/ShareBoostLink.tsx index 1a3f1c080e..d13c991ee8 100644 --- a/apps/scouts/src/components/boost/boost-options-menu/ShareBoostLink.tsx +++ b/apps/scouts/src/components/boost/boost-options-menu/ShareBoostLink.tsx @@ -17,6 +17,7 @@ import { ToastTypeEnum, } from 'learn-card-base'; import IDSleeve from '../../../assets/images/id-sleeve.png'; +import CredentialVerificationDisplay from 'learn-card-base/components/CredentialBadge/CredentialVerificationDisplay'; import { getCredentialName, @@ -45,7 +46,7 @@ const ShareBoostLink: React.FC<{ const { logAnalyticsEvent } = useFirebaseAnalytics(); - const { mutate: shareEarnedBoost, isPending: isLinkLoading } = useShareBoostMutation(); + const { mutate: shareEarnedBoost, loading: isLinkLoading } = useShareBoostMutation(); const categoryConfig = boostCategoryOptions?.[categoryType as string] ?? @@ -78,46 +79,54 @@ const ShareBoostLink: React.FC<{ typeof cred?.credentialSubject?.id === 'string' || cred?.credentialSubject?.id instanceof String; - const issuerDid = isIssuerString ? (cred?.issuer as string) : (cred?.issuer?.id as string); - const issueeDid = isIssueeString - ? (cred?.credentialSubject?.id as string) - : (cred?.credentialSubject?.id as string); - - const issuerProfileId = issuerDid?.includes(':users:') ? issuerDid.split(':').pop() : undefined; - const issueeProfileId = issueeDid?.includes(':users:') ? issueeDid.split(':').pop() : undefined; + const isLCNetworkUrlIssuer = isIssuerString + ? cred?.issuer?.includes(`did:web:scoutnetwork.org`) + : false; + const isLCNetworkUrlIssuee = isIssueeString + ? cred?.credentialSubject?.id?.includes(`did:web:scoutnetwork.org`) + : false; + if (isLCNetworkUrlIssuer) { + const regex = /(users:)(.*)/; + profileId = cred?.issuer?.match(regex)?.[2]; + } - const { data: issuerProfile, isLoading: isIssuerLoading } = useGetProfile(issuerProfileId); - const { data: issueeProfile, isLoading: isIssueeLoading } = useGetProfile(issueeProfileId); - const { data: myProfile, isLoading: myProfileLoading } = useGetProfile(); + const { data: profile, isLoading, isError } = useGetProfile(profileId); + const { + data: myProfile, + isLoading: myProfileLoading, + isError: myProfileError, + } = useGetProfile(); - if (issuerProfileId) { - issuerName = issuerProfile ? issuerProfile?.displayName : isIssuerLoading ? 'Loading...' : 'Unknown'; + if (isLCNetworkUrlIssuer) { + issuerName = profile ? profile?.displayName : isLoading ? 'Loading...' : 'Unknown'; } else { issuerName = getIssuerNameNonBoost(cred); } - if (issueeProfileId) { - issueeName = issueeProfile ? issueeProfile?.displayName : isIssueeLoading ? 'Loading...' : 'Unknown'; - } else { - issueeName = myProfile ? myProfile?.displayName : myProfileLoading ? 'Loading...' : 'Unknown'; - } - - if (issueeProfileId || issueeDid?.includes('did:web:scoutnetwork.org')) { - subjectProfileImageElement = - issueeProfile || myProfile ? ( - - ) : ( -
- {getEmojiFromDidString(issueeDid)} -
- ); + if (isLCNetworkUrlIssuee) { + issueeName = myProfile + ? myProfile?.displayName + : myProfileLoading + ? 'Loading...' + : 'Unknown'; + + issueeName = myProfile + ? myProfile?.displayName + : myProfileLoading + ? 'Loading...' + : 'Unknown'; + subjectProfileImageElement = myProfile ? ( + + ) : ( +
+ {getEmojiFromDidString(cred?.credentialSubject?.id)} +
+ ); } else { - issueeName = issueeDid; + issueeName = cred?.credentialSubject?.id; } const generateShareLink = async () => { @@ -233,7 +242,7 @@ const ShareBoostLink: React.FC<{

- + Verified{' '} {categoryTitle ?? 'Achievement'}

@@ -264,9 +273,6 @@ const ShareBoostLink: React.FC<{ credential={cred} displayType={displayType} branding={BrandingEnum.scoutPass} - showBackgroundImage={false} - backgroundImage={''} - backgroundColor={''} /> )}
@@ -285,9 +291,13 @@ const ShareBoostLink: React.FC<{

-
+
+ +
+ +
diff --git a/apps/scouts/src/components/boost/boostCMS/BoostPreview/BoostPreview.tsx b/apps/scouts/src/components/boost/boostCMS/BoostPreview/BoostPreview.tsx index e5ae2b8a8f..862f338c5f 100644 --- a/apps/scouts/src/components/boost/boostCMS/BoostPreview/BoostPreview.tsx +++ b/apps/scouts/src/components/boost/boostCMS/BoostPreview/BoostPreview.tsx @@ -1,4 +1,4 @@ -import React, { useState, useMemo, useEffect } from 'react'; +import React, { useEffect, useState } from 'react'; import { useKnownDIDRegistry } from 'learn-card-base/hooks/useRegistry'; import BoostFooter from 'learn-card-base/components/boost/boostFooter/BoostFooter'; import { VCDisplayCard2 } from '@learncard/react'; @@ -6,8 +6,6 @@ import { IonContent, IonFooter, IonPage, IonRow } from '@ionic/react'; import { VC, VerificationItem } from '@learncard/types'; import { useWallet, BoostCategoryOptionsEnum } from 'learn-card-base'; -import { useHighlightedCredentials } from '../../../../hooks/useHighlightedCredentials'; -import { getRoleFromCred, getScoutsNounForRole } from '../../../../helpers/troop.helpers'; type IssueHistory = { id?: string | number; @@ -41,7 +39,6 @@ type BoostPreviewProps = { qrCodeOnClick?: () => void; hideQRCode?: boolean; handleShareBoost?: () => void; - unknownVerifierTitle?: string; }; enum BoostPreviewTypeEnum { managed, @@ -59,7 +56,6 @@ const BoostPreview: React.FC = ({ customThumbComponent, customBodyCardComponent, customFooterComponent, - unknownVerifierTitle: unknownVerifierTitleProp, subjectDID, subjectImageComponent, issuerImageComponent, @@ -76,26 +72,12 @@ const BoostPreview: React.FC = ({ handleShareBoost, }) => { const { initWallet } = useWallet(); - const issuerDid = + const profileID = typeof credential?.issuer === 'string' ? credential.issuer : credential?.issuer?.id; - // Extract user ID from DID (e.g., "jpgclub" from "did:web:localhost%3A4000:users:jpgclub") - const profileID = issuerDid?.split(':').pop(); - const { data: knownDIDRegistry } = useKnownDIDRegistry(profileID); - const { credentials: highlightedCreds } = useHighlightedCredentials( - unknownVerifierTitleProp ? undefined : profileID - ); const [vcVerifications, setVCVerifications] = useState([]); const [isFront, setIsFront] = useState(true); - const unknownVerifierTitle = useMemo(() => { - if (unknownVerifierTitleProp) return unknownVerifierTitleProp; - if (!highlightedCreds || highlightedCreds.length === 0) return undefined; - - const role = getRoleFromCred(highlightedCreds[0]); - return getScoutsNounForRole(role); // Just the role, no "Verified" prefix - }, [highlightedCreds, unknownVerifierTitleProp]); - useEffect(() => { const verify = async () => { const wallet = await initWallet(); @@ -156,8 +138,8 @@ const BoostPreview: React.FC = ({ issueeOverride={issueeOverride} issuerOverride={issuerOverride} issueHistory={issueHistory} - categoryType={categoryType as any} - verificationItems={vcVerifications} + categoryType={_categoryType} + verificationItems={verifications} customThumbComponent={customThumbComponent} customBodyCardComponent={customBodyCardComponent} customFooterComponent={customFooterComponent} @@ -178,7 +160,6 @@ const BoostPreview: React.FC = ({ setIsFrontOverride={setIsFront} qrCodeOnClick={qrCodeOnClick} hideQRCode={hideQRCode} - unknownVerifierTitle={unknownVerifierTitle} /> diff --git a/apps/scouts/src/components/boost/boostCMS/BoostPreview/NonBoostPreview.tsx b/apps/scouts/src/components/boost/boostCMS/BoostPreview/NonBoostPreview.tsx index 39e91ba625..0796201c65 100644 --- a/apps/scouts/src/components/boost/boostCMS/BoostPreview/NonBoostPreview.tsx +++ b/apps/scouts/src/components/boost/boostCMS/BoostPreview/NonBoostPreview.tsx @@ -1,13 +1,10 @@ -import React, { useEffect, useState, useMemo } from 'react'; +import React, { useEffect, useState } from 'react'; -import BoostFooter from 'learn-card-base/components/boost/boostFooter/BoostFooter'; import VCDisplayCardWrapper2 from 'learn-card-base/components/vcmodal/VCDisplayCardWrapper2'; import { IonContent, IonFooter, IonPage, IonRow, IonToolbar } from '@ionic/react'; import { VC, VerificationItem } from '@learncard/types'; import { useWallet, BoostCategoryOptionsEnum } from 'learn-card-base'; -import { useHighlightedCredentials } from '../../../../hooks/useHighlightedCredentials'; -import { getRoleFromCred, getScoutsNounForRole } from '../../../../helpers/troop.helpers'; import X from 'learn-card-base/svgs/X'; import FatArrow from 'learn-card-base/svgs/FatArrow'; @@ -40,8 +37,6 @@ type NonBoostPreviewProps = { titleOverride?: string; onDotsClick?: () => void; qrCodeOnClick?: () => void; - hideQRCode?: boolean; - unknownVerifierTitle?: string; }; const NonBoostPreview: React.FC = ({ @@ -55,7 +50,6 @@ const NonBoostPreview: React.FC = ({ customThumbComponent, customBodyCardComponent, customFooterComponent, - unknownVerifierTitle: unknownVerifierTitleProp, subjectDID, subjectImageComponent, issuerImageComponent, @@ -67,27 +61,10 @@ const NonBoostPreview: React.FC = ({ titleOverride, onDotsClick, qrCodeOnClick, - hideQRCode, }) => { const { initWallet } = useWallet(); - const issuerDid = - typeof credential?.issuer === 'string' ? credential.issuer : credential?.issuer?.id; - // Extract user ID from DID (e.g., "jpgclub" from "did:web:localhost%3A4000:users:jpgclub") - const profileID = issuerDid?.split(':').pop(); - const [vcVerifications, setVCVerifications] = useState([]); const [isFront, setIsFront] = useState(true); - const { credentials: highlightedCreds } = useHighlightedCredentials( - unknownVerifierTitleProp ? undefined : profileID - ); - - const unknownVerifierTitle = useMemo(() => { - if (unknownVerifierTitleProp) return unknownVerifierTitleProp; - if (!highlightedCreds || highlightedCreds.length === 0) return undefined; - - const role = getRoleFromCred(highlightedCreds[0]); - return getScoutsNounForRole(role); // Just the role, no "Verified" prefix - }, [highlightedCreds, unknownVerifierTitleProp]); useEffect(() => { const verify = async () => { @@ -143,9 +120,6 @@ const NonBoostPreview: React.FC = ({ hideNavButtons isFrontOverride={isFront} setIsFrontOverride={setIsFront} - qrCodeOnClick={qrCodeOnClick} - hideQRCode={hideQRCode} - unknownVerifierTitle={unknownVerifierTitle} /> diff --git a/apps/scouts/src/components/boost/boostCMS/boostCMSForms/boostCMSAppearance/BoostCMSAchievementTypeSelectorModal.tsx b/apps/scouts/src/components/boost/boostCMS/boostCMSForms/boostCMSAppearance/BoostCMSAchievementTypeSelectorModal.tsx index f03b805e5d..3232775183 100644 --- a/apps/scouts/src/components/boost/boostCMS/boostCMSForms/boostCMSAppearance/BoostCMSAchievementTypeSelectorModal.tsx +++ b/apps/scouts/src/components/boost/boostCMS/boostCMSForms/boostCMSAppearance/BoostCMSAchievementTypeSelectorModal.tsx @@ -47,6 +47,8 @@ const BoostCMSAchievementTypeSelectorModal: React.FC<{ BoostCMSActiveAppearanceForm.achievementTypeForm ); + const [showStylePackCategoryList, setShowStylePackCategoryList] = useState(false); + return ( void; disabled?: boolean; boostUserType: BoostUserTypeEnum; + + showStylePackCategoryList: boolean; + setShowStylePackCategoryList: SetState; setActiveForm: SetState; }> = ({ state, @@ -72,26 +73,15 @@ export const BoostCMSAppearanceBadgeList: React.FC<{ handleCloseModal, disabled = false, boostUserType, + showStylePackCategoryList, + setShowStylePackCategoryList, setActiveForm, }) => { - const { newModal } = useModal(); const flags = useFlags(); - const { credentials } = useHighlightedCredentials(); - - // Check if user is Global Admin or National Admin - const isAdmin = credentials.some(cred => { - const subject = cred?.credentialSubject; - if (!subject || Array.isArray(subject)) return false; - return ['ext:GlobalID', 'ext:NetworkID'].includes( - subject?.achievement?.achievementType - ); - }); - const { data: boostAppearanceBadgeList, isLoading } = useScoutPassStylesPackRegistry(); - const categoryMetadata = + const { CategoryImage } = boostCategoryOptions[state?.basicInfo?.type as BoostCategoryOptionsEnum]; - const { CategoryImage } = categoryMetadata || {}; const isDefaultImage = state?.appearance?.badgeThumbnail === CategoryImage; const type = state?.basicInfo?.type; const targetType = type === 'Social Badge' ? 'Boost' : type; @@ -143,48 +133,185 @@ export const BoostCMSAppearanceBadgeList: React.FC<{ ); } - const handleOpenCategoryModal = () => { - newModal( - , - {}, - { desktop: ModalTypes.Cancel, mobile: ModalTypes.Cancel } - ); - }; + let activeStep = null; + if (showStylePackCategoryList) { + let boostOptions = boostVCTypeOptions[boostUserType]; + if (flags?.disableCmsCustomization) { + boostOptions = boostVCTypeOptions?.[boostUserType].filter( + item => item.title === targetType + ); + } - let categoryButton = null; - if (activeStylePackCategory === StylePackCategories.all) { - categoryButton = ( - + activeStep = ( + + + + + {boostOptions?.map( + ({ + id, + IconComponent, + iconCircleClass, + iconClassName, + title, + type, + }) => { + const isActive = (activeStylePackCategory as string) === type; + + return ( + { + setActiveStylePackCategory(type); + setShowStylePackCategoryList(false); + }} + isActive={isActive} + /> + ); + } + )} + +
+ +
+
+
); } else { - const { IconComponent, title, color } = boostCategoryOptions[activeStylePackCategory]; + let categoryButton = null; + if (activeStylePackCategory === StylePackCategories.all) { + categoryButton = ( + + ); + } else { + const { IconComponent, title, color } = boostCategoryOptions[activeStylePackCategory]; - categoryButton = ( - + ); + } + + activeStep = ( + <> +
+

Style Pack

+ {categoryButton}
- - + {!flags?.disableCmsCustomization && ( + + )} + {photo && !isDefaultImage && ( +
+ badge + transparent grid + {imageUploadLoading && ( +
+ +
+ )} + +
+ )} + {!photo && imageUploadLoading && ( +
+ transparent grid +
+ +
+
+ )} + {_boostAppearanceBadgeList?.map(({ url }, index) => { + return ( + + ); + })} + ); } @@ -204,79 +331,7 @@ export const BoostCMSAppearanceBadgeList: React.FC<{

Loading...

) : ( -
-
-

Style Pack

- {categoryButton} -
- {/* Allow admins to upload custom images even when CMS customization is disabled */} - {(!flags?.disableCmsCustomization || isAdmin) && ( - - )} - {photo && !isDefaultImage && ( -
- badge - transparent grid - {imageUploadLoading && ( -
- -
- )} - -
- )} - {!photo && imageUploadLoading && ( -
- transparent grid -
- -
-
- )} - {_boostAppearanceBadgeList?.map(({ url }, index) => { - return ( - - ); - })} -
+ activeStep )} diff --git a/apps/scouts/src/components/boost/boostCMS/boostCMSForms/boostCMSAppearance/BoostCMSAppearanceBadgeSelector.tsx b/apps/scouts/src/components/boost/boostCMS/boostCMSForms/boostCMSAppearance/BoostCMSAppearanceBadgeSelector.tsx index a0c9afc696..436743e435 100644 --- a/apps/scouts/src/components/boost/boostCMS/boostCMSForms/boostCMSAppearance/BoostCMSAppearanceBadgeSelector.tsx +++ b/apps/scouts/src/components/boost/boostCMS/boostCMSForms/boostCMSAppearance/BoostCMSAppearanceBadgeSelector.tsx @@ -35,7 +35,7 @@ const BoostCMSAppearanceBadgeSelector: React.FC<{ {title && {title}} - + { const flags = useFlags(); - const { credentials } = useHighlightedCredentials(); - - // Check if user is Global Admin or National Admin - const isAdmin = credentials.some(cred => { - const subject = cred?.credentialSubject; - if (!subject || Array.isArray(subject)) return false; - return ['ext:GlobalID', 'ext:NetworkID'].includes( - subject?.achievement?.achievementType - ); - }); - - const categoryMetadata = boostCategoryOptions[activeCategoryType]; - const { CategoryImage } = categoryMetadata || {}; + const { CategoryImage } = boostCategoryOptions[activeCategoryType]; const isDefaultImage = state?.appearance?.badgeThumbnail === CategoryImage; @@ -226,8 +213,7 @@ const BoostCMSAppearanceForm: React.FC<{
)} - {/* Allow admins to upload background images even when CMS customization is disabled */} - {(!flags?.disableCmsCustomization || isAdmin) && ( + {!flags?.disableCmsCustomization && (

{isID || isMembership diff --git a/apps/scouts/src/components/boost/boostCMS/boostCMSForms/boostCMSAppearance/BoostCMSAppearanceFormHeader.tsx b/apps/scouts/src/components/boost/boostCMS/boostCMSForms/boostCMSAppearance/BoostCMSAppearanceFormHeader.tsx index 4a9104e6d3..a2e4f9511a 100644 --- a/apps/scouts/src/components/boost/boostCMS/boostCMSForms/boostCMSAppearance/BoostCMSAppearanceFormHeader.tsx +++ b/apps/scouts/src/components/boost/boostCMS/boostCMSForms/boostCMSAppearance/BoostCMSAppearanceFormHeader.tsx @@ -49,6 +49,9 @@ type BoostCMSAppearanceFormHeaderProps = { activeForm: BoostCMSActiveAppearanceForm; setActiveForm: React.Dispatch>; + showStylePackCategoryList: boolean; + setShowStylePackCategoryList: React.Dispatch>; + handleSaveAppearance?: () => void; }; @@ -69,6 +72,9 @@ const BoostCMSAppearanceFormHeader: React.FC activeForm, setActiveForm, + showStylePackCategoryList, + setShowStylePackCategoryList, + handleSaveAppearance = () => {}, }) => { let formTitle: string = ''; @@ -137,8 +143,13 @@ const BoostCMSAppearanceFormHeader: React.FC headerContainerStyles = 'items-center justify-between'; headerBackButtonStyles = 'w-[86px] h-[44px]'; } else if (activeForm === BoostCMSActiveAppearanceForm.badgeForm) { - formTitle = 'Select Image'; - headerContainerStyles = 'items-center justify-center'; + if (showStylePackCategoryList) { + formTitle = 'Select Style Pack'; + headerContainerStyles = 'items-center justify-center'; + } else { + formTitle = 'Select Image'; + headerContainerStyles = 'items-center justify-center'; + } } else { formTitle = 'Appearance'; titleStyles = 'flex-none'; @@ -146,9 +157,13 @@ const BoostCMSAppearanceFormHeader: React.FC } const handleGoBack = () => { - setActiveForm(BoostCMSActiveAppearanceForm.appearanceForm); - setActiveCategoryType(state?.basicInfo?.type); - setActiveType(state?.basicInfo?.achievementType); + if (showStylePackCategoryList) { + setShowStylePackCategoryList(false); + } else { + setActiveForm(BoostCMSActiveAppearanceForm.appearanceForm); + setActiveCategoryType(state?.basicInfo?.type); + setActiveType(state?.basicInfo?.achievementType); + } }; return ( diff --git a/apps/scouts/src/components/boost/boostCMS/boostCMSForms/boostCMSAppearance/BoostCMSAppearanceFormModal.tsx b/apps/scouts/src/components/boost/boostCMS/boostCMSForms/boostCMSAppearance/BoostCMSAppearanceFormModal.tsx index f78a5e1352..65a1adadbc 100644 --- a/apps/scouts/src/components/boost/boostCMS/boostCMSForms/boostCMSAppearance/BoostCMSAppearanceFormModal.tsx +++ b/apps/scouts/src/components/boost/boostCMS/boostCMSForms/boostCMSAppearance/BoostCMSAppearanceFormModal.tsx @@ -56,6 +56,8 @@ const BoostCMSAppearanceFormModal: React.FC<{ ...state, }); + const [showStylePackCategoryList, setShowStylePackCategoryList] = useState(false); + const handleSaveAppearance = () => { setState({ ...appearanceFormState, @@ -66,7 +68,7 @@ const BoostCMSAppearanceFormModal: React.FC<{ let formBackgroundColor: string = ''; if (activeForm === BoostCMSActiveAppearanceForm.badgeForm) { - formBackgroundColor = '#FFFFFF'; // white + formBackgroundColor = '#ffffff'; activeFormEl = ( @@ -114,6 +118,8 @@ const BoostCMSAppearanceFormModal: React.FC<{ handleCategoryAndTypeChange={handleCategoryAndTypeChange} activeForm={activeForm} setActiveForm={setActiveForm} + showStylePackCategoryList={showStylePackCategoryList} + setShowStylePackCategoryList={setShowStylePackCategoryList} handleSaveAppearance={handleSaveAppearance} /> {activeFormEl} diff --git a/apps/scouts/src/components/boost/boostCMS/boostCMSForms/boostCMSAppearance/StylePackCategoryModal.tsx b/apps/scouts/src/components/boost/boostCMS/boostCMSForms/boostCMSAppearance/StylePackCategoryModal.tsx deleted file mode 100644 index e0706231f2..0000000000 --- a/apps/scouts/src/components/boost/boostCMS/boostCMSForms/boostCMSAppearance/StylePackCategoryModal.tsx +++ /dev/null @@ -1,149 +0,0 @@ -import React, { useMemo } from 'react'; -import { IonCol, IonRow } from '@ionic/react'; -import { useModal } from 'learn-card-base'; -import CaretLeft from 'learn-card-base/svgs/CaretLeft'; -import Checkmark from 'learn-card-base/svgs/Checkmark'; -import { BoostUserTypeEnum, boostVCTypeOptions } from '../../../boost-options/boostOptions'; -import BoostVCTypeOptionButton from '../../../boost-options/boostVCTypeOptions/BoostVCTypeOptionButton'; -import { StylePackCategories } from './BoostCMSAppearanceBadgeList'; -import { SetState } from '@learncard/helpers'; -import useHighlightedCredentials from 'apps/scouts/src/hooks/useHighlightedCredentials'; -import { useFlags } from 'launchdarkly-react-client-sdk'; - -export interface StylePackCategoryModalProps { - activeStylePackCategory: StylePackCategories; - setActiveStylePackCategory: SetState; - boostUserType: BoostUserTypeEnum; - targetType?: string; -} - -export const StylePackCategoryModal: React.FC = ({ - activeStylePackCategory, - setActiveStylePackCategory, - boostUserType, - targetType, -}) => { - const { closeModal } = useModal(); - const flags = useFlags(); - const { credentials } = useHighlightedCredentials(); - - // Check if user is Global Admin or National Admin - const isAdmin = credentials.some(cred => { - const subject = cred?.credentialSubject; - if (!subject || Array.isArray(subject)) return false; - return ['ext:GlobalID', 'ext:NetworkID'].includes( - subject?.achievement?.achievementType - ); - }); - - const handleSelectCategory = (category: StylePackCategories) => { - setActiveStylePackCategory(category); - closeModal(); - }; - - let boostOptions = boostVCTypeOptions[boostUserType]; - // Allow admins to bypass CMS customization restrictions - if (flags?.disableCmsCustomization && !isAdmin) { - boostOptions = boostVCTypeOptions?.[boostUserType].filter( - item => item.title === targetType - ); - } - - - - return ( -
-
- -

- Select a Category -

-
- -
-
- {/* All option */} - - - {/* Category options */} - {boostOptions.map(({ - id, - IconComponent, - iconCircleClass, - iconClassName, - title, - type, - }) => { - const isActive = (activeStylePackCategory as string) === type; - - return ( - - ); - })} -
-
-
- ); -}; - -export default StylePackCategoryModal; diff --git a/apps/scouts/src/components/boost/claim-boost-card/BoostClaimCard.tsx b/apps/scouts/src/components/boost/claim-boost-card/BoostClaimCard.tsx index 38108c6323..3d0749fc62 100644 --- a/apps/scouts/src/components/boost/claim-boost-card/BoostClaimCard.tsx +++ b/apps/scouts/src/components/boost/claim-boost-card/BoostClaimCard.tsx @@ -1,4 +1,4 @@ -import React, { useState, useCallback, useMemo } from 'react'; +import React, { useState, useCallback } from 'react'; import { useIsLoggedIn } from 'learn-card-base/stores/currentUserStore'; import { useClaimCredential, BrandingEnum } from 'learn-card-base'; @@ -16,8 +16,6 @@ import { getAchievementType, getDefaultCategoryForCredential, } from 'learn-card-base/helpers/credentialHelpers'; -import { useHighlightedCredentials } from '../../../hooks/useHighlightedCredentials'; -import { getRoleFromCred, getScoutsNounForRole } from '../../../helpers/troop.helpers'; type BoostClaimCardProps = { credential: VC | VP; @@ -54,22 +52,6 @@ export const BoostClaimCard: React.FC = ({ const [isFront, setIsFront] = useState(true); const [selectedImage, setSelectedImage] = useState(null); - // Extract issuer DID and profileID for scouts role logic - const issuerDid = - typeof credential?.issuer === 'string' ? credential.issuer : credential?.issuer?.id; - const profileID = issuerDid?.split(':').pop(); - - // Fetch highlighted credentials to get the issuer's role - const { credentials: highlightedCreds } = useHighlightedCredentials(profileID); - - // Compute unknownVerifierTitle based on the role (same logic as BoostPreview) - const unknownVerifierTitle = useMemo(() => { - if (!highlightedCreds || highlightedCreds.length === 0) return undefined; - - const role = getRoleFromCred(highlightedCreds[0]); - return getScoutsNounForRole(role); - }, [highlightedCreds]); - const { handleClaimCredential, isClaiming, isClaimed } = useClaimCredential(credentialUri, { successCallback, dismiss, @@ -129,7 +111,6 @@ export const BoostClaimCard: React.FC = ({ setIsFrontOverride={setIsFront} brandingEnum={BrandingEnum.scoutPass} onMediaClick={handleImageClick} - unknownVerifierTitle={unknownVerifierTitle} /> )} {selectedImage && ( diff --git a/apps/scouts/src/components/main-subheader/MainSubHeader.tsx b/apps/scouts/src/components/main-subheader/MainSubHeader.tsx index c0d919703e..6a471f9759 100644 --- a/apps/scouts/src/components/main-subheader/MainSubHeader.tsx +++ b/apps/scouts/src/components/main-subheader/MainSubHeader.tsx @@ -141,8 +141,8 @@ export const MainSubHeader: React.FC = ({ } const { newModal: newDescriptorModal, closeModal: closeDescriptorModal } = useModal({ - desktop: ModalTypes.FullScreen, - mobile: ModalTypes.FullScreen, + desktop: ModalTypes.Center, + mobile: ModalTypes.Center, }); const presentCategoryDescriptorModal = () => { diff --git a/apps/scouts/src/components/network-prompts/NewJoinNetworkPrompt.tsx b/apps/scouts/src/components/network-prompts/NewJoinNetworkPrompt.tsx index 3f86e7829f..ce8573dd5c 100644 --- a/apps/scouts/src/components/network-prompts/NewJoinNetworkPrompt.tsx +++ b/apps/scouts/src/components/network-prompts/NewJoinNetworkPrompt.tsx @@ -265,15 +265,20 @@ const NewJoinNetworkPrompt: React.FC = ({ setIsLoading(false); // handleCloseModal(); } else { - // update firebase profile - try { - await updateProfile(auth()?.currentUser as any, { - displayName: name as any, - photoURL: photo as any, - }); - } catch (e) { - openErrorLogoutModal(); - setError(`There was a firebase error: ${e?.toString?.()}`); + if (typeOfLogin === SocialLoginTypes.scoutsSSO) { + // ! skip updating a user's profile if the user logged + // ! in using scouts single-sign-on + } else { + // update firebase profile + try { + await updateProfile(auth()?.currentUser as any, { + displayName: name as any, + photoURL: photo as any, + }); + } catch (e) { + openErrorLogoutModal(); + setError(`There was a firebase error: ${e?.toString?.()}`); + } } // update LC network profile diff --git a/apps/scouts/src/components/troopsCMS/TroopsCMSWrapper.tsx b/apps/scouts/src/components/troopsCMS/TroopsCMSWrapper.tsx index 9749148056..71cf408838 100644 --- a/apps/scouts/src/components/troopsCMS/TroopsCMSWrapper.tsx +++ b/apps/scouts/src/components/troopsCMS/TroopsCMSWrapper.tsx @@ -81,7 +81,7 @@ export const TroopsCMSWrapper: React.FC = ({ if (grandParentUri && resolvedGrandParent) { mapGrandParentIntoState(state, setState, resolvedGrandParent, viewMode, parentUri); } - }, [viewMode, parentUri, parentBoost, grandParentUri, resolvedGrandParent]); + }, [viewMode]); // Member management const { scoutRecipients, leaderRecipients, currentBoostRecipients } = useTroopMembers( diff --git a/apps/scouts/src/components/troopsCMS/TroopsIDTypeSelector/TroopIDTypeSelectorModal.tsx b/apps/scouts/src/components/troopsCMS/TroopsIDTypeSelector/TroopIDTypeSelectorModal.tsx index 2219d1568e..82cf8f15d1 100644 --- a/apps/scouts/src/components/troopsCMS/TroopsIDTypeSelector/TroopIDTypeSelectorModal.tsx +++ b/apps/scouts/src/components/troopsCMS/TroopsIDTypeSelector/TroopIDTypeSelectorModal.tsx @@ -1,9 +1,9 @@ import React, { useState } from 'react'; -import { IonSpinner } from '@ionic/react'; - +import { IonPage, IonSpinner } from '@ionic/react'; +import ModalLayout from 'learn-card-base/components/modals/ionic-modals/CancelModalLayout'; import TroopIDTypeSelectorListItem from './TroopIDTypeSelectorListItem'; - +import TroopsCMSWrapper from '../TroopsCMSWrapper'; import { useFlags } from 'launchdarkly-react-client-sdk'; @@ -20,7 +20,7 @@ const TroopIDTypeSelectorModal: React.FC<{ }> = ({ handleCloseModal, earnedBoostIDs = [], isLoading, onSuccess }) => { // oxlint-disable-next-line no-unused-vars const flags = useFlags(); - const canCreateGlobalIDs = flags?.canCreateGlobalAdminId ?? false; + const canCreateGlobalIDs = flags?.canCreateGlobalAdminId ?? false; const [_viewMode, _setViewMode] = useState(null); @@ -38,13 +38,31 @@ const TroopIDTypeSelectorModal: React.FC<{ const allowedIDTypesToCreate = []; - if (!globalAdminId && canCreateGlobalIDs) { allowedIDTypesToCreate.push(troopsCMSViewModeDefaults?.global); } if (globalAdminId) allowedIDTypesToCreate.push(troopsCMSViewModeDefaults?.network); if (nationalAdminId) allowedIDTypesToCreate.push(troopsCMSViewModeDefaults?.troop); + if (canCreateGlobalIDs && !globalAdminId && !nationalAdminId) { + // short circuit into creating a global network + return ( + + ); + } else if (globalAdminId && !nationalAdminId) { + // short circuit into creating a national network + return ( + + ); + } + return (
diff --git a/apps/scouts/src/pages/ids/IdDisplayContainer.tsx b/apps/scouts/src/pages/ids/IdDisplayContainer.tsx index 7f5120f3be..a4711977ea 100644 --- a/apps/scouts/src/pages/ids/IdDisplayContainer.tsx +++ b/apps/scouts/src/pages/ids/IdDisplayContainer.tsx @@ -127,7 +127,6 @@ const IdDisplayContainer: React.FC = ({ categoryType={categoryType} branding={BrandingEnum.scoutPass} loading={loading} - managedBoost={viewMode === CredentialListTabEnum.Managed} /> ); } diff --git a/apps/scouts/src/pages/membership/MembershipPage.tsx b/apps/scouts/src/pages/membership/MembershipPage.tsx index 57641c61bc..6324c66b32 100644 --- a/apps/scouts/src/pages/membership/MembershipPage.tsx +++ b/apps/scouts/src/pages/membership/MembershipPage.tsx @@ -10,8 +10,6 @@ import MainHeader from '../../components/main-header/MainHeader'; import BoostEarnedIDListAlternative from '../../components/boost/boost-earned-card/BoostEarnedIDListAlternative'; import EmptyTroopIcon from '../../assets/images/emptyTroop.svg'; import TroopIDTypeSelectorModal from '../../components/troopsCMS/TroopsIDTypeSelector/TroopIDTypeSelectorModal'; -import TroopsCMSWrapper from '../../components/troopsCMS/TroopsCMSWrapper'; -import { TroopsCMSViewModeEnum } from '../../components/troopsCMS/troopCMSState'; import Plus from '../../components/svgs/Plus'; import { useGetCredentialList, @@ -60,7 +58,7 @@ export const SignUpForWaitList: React.FC = () => { const MembershipPage: React.FC = () => { useSyncMembershipHighlights(true); const flags = useFlags(); - const { newModal, closeModal } = useModal({ + const { newModal } = useModal({ desktop: ModalTypes.FullScreen, mobile: ModalTypes.FullScreen, }); @@ -77,7 +75,7 @@ const MembershipPage: React.FC = () => { } = useGetCredentialList(CredentialCategoryEnum.membership); // logic to show the plus button - const canCreateGlobalIDs = flags?.canCreateGlobalAdminId ?? false; + const canCreateGlobalIDs = flags?.canCreateGlobalAdminId ?? false; const { data: earnedBoostIDs, isLoading: earnedBoostIDsLoading } = useGetIDs(); // oxlint-disable-next-line no-unused-vars const { data: troopIds, isLoading: troopIdsLoading } = useGetCurrentUserTroopIds(); @@ -93,33 +91,15 @@ const MembershipPage: React.FC = () => { newModal(); }; - const showTroopIDSelector = () => { - if (canCreateGlobalIDs && !hasGlobalAdminID) { - newModal( - - ); - } else if (hasGlobalAdminID && !hasNationalAdminID) { - newModal( - - ); - } else { - newCancelModal( - boostUri && handleShowTroops(boostUri)} - /> - ); - } - }; + const showTroopIDSelector = () => + newCancelModal( + boostUri && handleShowTroops(boostUri)} + /> + ); const imgSrc = EmptyTroopIcon; const { iconColor, textColor } = SubheaderContentType[SubheaderTypeEnum.Membership]; diff --git a/apps/scouts/src/pages/troop/ScoutConnectModal.tsx b/apps/scouts/src/pages/troop/ScoutConnectModal.tsx index 979472fc82..84d4307d86 100644 --- a/apps/scouts/src/pages/troop/ScoutConnectModal.tsx +++ b/apps/scouts/src/pages/troop/ScoutConnectModal.tsx @@ -156,7 +156,7 @@ const ScoutConnectModal: React.FC = ({ sa?.did ); - if (rsa) { + if (rsa && claimLink) { const boostClaimLink = await wallet?.invoke?.generateClaimLink( _boostUriForClaimLink, { diff --git a/apps/scouts/src/pages/troop/ShareTroopIdModal.tsx b/apps/scouts/src/pages/troop/ShareTroopIdModal.tsx index 858d4db50b..9484ef1409 100644 --- a/apps/scouts/src/pages/troop/ShareTroopIdModal.tsx +++ b/apps/scouts/src/pages/troop/ShareTroopIdModal.tsx @@ -9,24 +9,18 @@ import { useGetCredentialWithEdits, useToast, ToastTypeEnum, - useGetProfile, } from 'learn-card-base'; +import CredentialVerificationDisplay from 'learn-card-base/components/CredentialBadge/CredentialVerificationDisplay'; import { getScoutsNounForCred, useGetNetworkFromTroop } from '../../helpers/troop.helpers'; import { VC } from '@learncard/types'; -import { getCredentialSubject as getSubject } from 'learn-card-base/helpers/credentialHelpers'; type ShareTroopIdModalProps = { credential: VC; uri: string; - unknownVerifierTitle?: string; }; -const ShareTroopIdModal: React.FC = ({ - credential, - uri, - unknownVerifierTitle, -}) => { +const ShareTroopIdModal: React.FC = ({ credential, uri }) => { const { presentToast } = useToast(); const currentUser = useGetCurrentLCNUser(); @@ -35,18 +29,13 @@ const ShareTroopIdModal: React.FC = ({ const { credentialWithEdits } = useGetCredentialWithEdits(credential); const [shareLink, setShareLink] = useState(''); - const subject = getSubject(credential); - const issueeDid = typeof subject?.id === 'string' ? subject?.id : (subject?.id as any)?.id; - const issueeProfileId = issueeDid?.includes(':users:') ? issueeDid.split(':').pop() : undefined; - const { data: issueeProfile } = useGetProfile(issueeProfileId); - - const { mutate: shareEarnedBoost, isPending: isLinkLoading } = useShareBoostMutation(); + const { mutate: shareEarnedBoost, loading: isLinkLoading } = useShareBoostMutation(); const generateShareLink = async () => { shareEarnedBoost( { credential, credentialUri: uri }, { - async onSuccess(data: any) { + async onSuccess(data) { setShareLink(data?.link); }, } @@ -87,9 +76,7 @@ const ShareTroopIdModal: React.FC = ({ />
- {issueeProfile?.displayName ?? - currentUser.currentLCNUser?.displayName ?? - 'Unknown'} + {currentUser.currentLCNUser?.displayName ?? 'Unknown'} {getScoutsNounForCred(credential)} @@ -97,6 +84,10 @@ const ShareTroopIdModal: React.FC = ({
+ {/* */} {credentialWithEdits?.name} diff --git a/docs/apps/learn-card-app/ai-insights/child-directly-shares-insights-existing-contract-flow.md b/docs/apps/learn-card-app/ai-insights/child-directly-shares-insights-existing-contract-flow.md new file mode 100644 index 0000000000..07d9cf6bec --- /dev/null +++ b/docs/apps/learn-card-app/ai-insights/child-directly-shares-insights-existing-contract-flow.md @@ -0,0 +1,34 @@ +# Child Directly Shares Insights (Existing Contract) + +This flow describes when a child directly shares their AI insights with a teacher with parent approval, and the teacher already has an AI Insights contract. + +```mermaid +sequenceDiagram + participant Child + participant App + participant Parent + participant Teacher + participant LearnCard + + Child->>App: Open Share Insights + App->>App: Confirm role = Child + + Child->>App: Initiate Share Insights + App->>Parent: Request guardian approval + + Parent->>App: Open guardian request + Parent->>App: Approve sharing + + App->>App: Check for teacher AI Insights contract + + App->>Child: Redirect to ConsentFlow + LearnCard->>Child: Display AI Insights contract + Child->>LearnCard: Confirm consent + + LearnCard->>LearnCard: Create Terms record + LearnCard->>App: Redirect with DID + + App->>Teacher: Notify teacher (child shared insights) + App->>LearnCard: Fetch shared AI insights + App->>Teacher: Display child insights +``` diff --git a/docs/apps/learn-card-app/ai-insights/child-directly-shares-insights-no-contract-flow.md b/docs/apps/learn-card-app/ai-insights/child-directly-shares-insights-no-contract-flow.md new file mode 100644 index 0000000000..402208df45 --- /dev/null +++ b/docs/apps/learn-card-app/ai-insights/child-directly-shares-insights-no-contract-flow.md @@ -0,0 +1,40 @@ +# Child Directly Shares Insights (No Contract) + +This flow describes when a child directly shares their AI insights with a teacher with parent approval, but the teacher has not yet created an AI Insights contract. + +```mermaid +sequenceDiagram + participant Child + participant App + participant Parent + participant Teacher + participant LearnCard + + Child->>App: Open Share Insights + App->>App: Confirm role = Child + + Child->>App: Initiate Share Insights + App->>Parent: Request guardian approval + + Parent->>App: Open guardian request + Parent->>App: Approve sharing + + App->>App: Check for teacher AI Insights contract + Note over App: No contract exists + + App->>Teacher: Notify teacher (child wants to share insights) + Teacher->>App: Open share request + Teacher->>App: Approve & request access + + App->>LearnCard: Create AI Insights contract (teacher-owned) + + App->>Child: Redirect to ConsentFlow + LearnCard->>Child: Display newly created contract + Child->>LearnCard: Confirm consent + + LearnCard->>LearnCard: Create Terms record + LearnCard->>App: Redirect with DID + + App->>LearnCard: Fetch shared AI insights + App->>Teacher: Display child insights +``` diff --git a/docs/apps/learn-card-app/ai-insights/student-direclty-shares-insights-existing-contract-flow.md b/docs/apps/learn-card-app/ai-insights/student-direclty-shares-insights-existing-contract-flow.md new file mode 100644 index 0000000000..029f5c188d --- /dev/null +++ b/docs/apps/learn-card-app/ai-insights/student-direclty-shares-insights-existing-contract-flow.md @@ -0,0 +1,30 @@ +# Student Directly Shares Insights (Existing Contract) + +This flow describes when a student wants to share their AI insights directly with a teacher, without the teacher first requesting them (i.e., the teacher has an existing AI Insights contract). + +```mermaid +sequenceDiagram + participant Student + participant App + participant Teacher + participant LearnCard + + Student->>App: Open Share Insights + App->>App: Confirm role = Student + + Student->>App: Share insights (search / QR / link) + App->>App: Check for teacher AI Insights contract + + alt Contract exists + App->>Student: Redirect to ConsentFlow + LearnCard->>Student: Display AI Insights contract + Student->>LearnCard: Confirm consent + + LearnCard->>LearnCard: Create Terms record + LearnCard->>App: Redirect with DID + + App->>Teacher: Notify teacher (student shared insights) + App->>LearnCard: Fetch shared AI insights + App->>Teacher: Display student insights + end +``` diff --git a/docs/apps/learn-card-app/ai-insights/student-directly-shares-insights-no-contract-flow.md b/docs/apps/learn-card-app/ai-insights/student-directly-shares-insights-no-contract-flow.md new file mode 100644 index 0000000000..8c47f060ba --- /dev/null +++ b/docs/apps/learn-card-app/ai-insights/student-directly-shares-insights-no-contract-flow.md @@ -0,0 +1,42 @@ +# Student Directly Shares Insights (No Contract) + +This flow describes when a student wants to share their AI insights directly with a teacher, but the teacher has not yet created an AI Insights contract. + +```mermaid +sequenceDiagram + participant Student + participant App + participant Teacher + participant LearnCard + + Student->>App: Open Share Insights + App->>App: Confirm role = Student + + Student->>App: Share insights (search / QR / link) + App->>App: Check for teacher AI Insights contract + + Note over App: No contract exists + + App->>Teacher: Send share request notification + Teacher->>App: Open share request + + Teacher->>App: Approve share request + App->>App: Check if teacher has AI Insights contract + + alt Contract does not exist + App->>LearnCard: Create AI Insights contract (teacher-owned) + end + + App->>Student: Send consent request notification + Student->>App: Open consent request + + App->>Student: Redirect to ConsentFlow + LearnCard->>Student: Display AI Insights contract + Student->>LearnCard: Confirm consent + + LearnCard->>LearnCard: Create Terms record + LearnCard->>App: Redirect with DID + + App->>LearnCard: Fetch shared AI insights + App->>Teacher: Display student insights +``` diff --git a/docs/apps/learn-card-app/ai-insights/teacher-requests-child-insights-flow.md b/docs/apps/learn-card-app/ai-insights/teacher-requests-child-insights-flow.md new file mode 100644 index 0000000000..faa6fa079a --- /dev/null +++ b/docs/apps/learn-card-app/ai-insights/teacher-requests-child-insights-flow.md @@ -0,0 +1,35 @@ +# Teacher Requests Child Insights + +This flow describes when a teacher requests AI insights from a child, where the parent must provide consent. + +```mermaid +sequenceDiagram + participant Teacher + participant App + participant Child + participant Parent + participant LearnCard + + Teacher->>App: Request insights from child + App->>App: Ensure AI Insights contract exists + App->>Child: Send insights request + + Child->>App: Open request + App->>Child: Show request details + Child->>App: Accept request + + Note over Child,App: Guardian consent required + + App->>Parent: Notify guardian for approval + Parent->>App: Open guardian consent request + + App->>Parent: Redirect to ConsentFlow + LearnCard->>Parent: Display AI Insights contract + Parent->>LearnCard: Confirm consent + + LearnCard->>LearnCard: Create Terms record + LearnCard->>App: Redirect with DID(s) + + App->>LearnCard: Fetch shared AI insights + App->>Teacher: Display child insights +``` diff --git a/docs/apps/learn-card-app/ai-insights/teacher-requests-student-insights-flow.md b/docs/apps/learn-card-app/ai-insights/teacher-requests-student-insights-flow.md new file mode 100644 index 0000000000..8b4500429a --- /dev/null +++ b/docs/apps/learn-card-app/ai-insights/teacher-requests-student-insights-flow.md @@ -0,0 +1,31 @@ +# Teacher Requests Insights Flow + +```mermaid +sequenceDiagram + participant Teacher + participant App + participant Student + participant LearnCard + + Teacher->>App: Opens Learner Insights + App->>App: Ensure AI Insights contract exists + + Teacher->>App: Request Insights + App->>Student: Send request (push / link / QR) + + Student->>App: Open request + App->>Student: Display request details + + Student->>App: Accept request + Note over Student,App: Accepting request = consenting to contract + + App->>LearnCard: Redirect to ConsentFlow + LearnCard->>Student: Display contract details + Student->>LearnCard: Confirm consent + + LearnCard->>LearnCard: Create Terms record + LearnCard->>App: Redirect with DID + + App->>LearnCard: Fetch shared AI insights + App->>Teacher: Display student insights +``` diff --git a/docs/apps/learn-card-app/ai-pathways/ai-pathways-flow.md b/docs/apps/learn-card-app/ai-pathways/ai-pathways-flow.md new file mode 100644 index 0000000000..dbc6f5c103 --- /dev/null +++ b/docs/apps/learn-card-app/ai-pathways/ai-pathways-flow.md @@ -0,0 +1,42 @@ +# AI Pathways - Flow Diagram + +```mermaid +flowchart TD + A[Start] --> B[Query AI Insights] + + B --> C{Learning Pathways Present?} + + C -->|Yes| D[Extract Keywords + FieldOfStudy from Learning Pathways] + C -->|No| E{Strongest Area Identified?} + + E -->|Yes| F[Extract Keywords + FieldOfStudy from Strongest Area] + E -->|No| G[No Keywords Available] + + D --> H[Normalize & Deduplicate Keywords + FieldOfStudy] + F --> H + + H --> I{Any Keywords After Normalization?} + + I -->|No| Z[Skip Careers, Courses, Training, Content] + + I -->|Yes| J[Query CareerOneStop Occupations] + + J --> K[Fetch Training Programs per Occupation] + + K --> L[Extract School Names from Programs] + + L --> M[Query OpenSyllabus by School] + + M --> N[Filter Courses by FieldOfStudy] + + N --> O{Courses Found?} + + O -->|Yes| P[Display OpenSyllabus Courses] + O -->|No| Q[Display CareerOneStop Training Programs] + + P --> R[Build AI Pathway Results] + Q --> R + Z --> R + + R --> S[End] +``` diff --git a/docs/how-to-guides/connect-systems/connect-an-embedded-app.md b/docs/how-to-guides/connect-systems/connect-an-embedded-app.md index 9ad5e98cb8..daa073edaa 100644 --- a/docs/how-to-guides/connect-systems/connect-an-embedded-app.md +++ b/docs/how-to-guides/connect-systems/connect-an-embedded-app.md @@ -13,7 +13,6 @@ The LearnCard App Store allows third-party applications to be embedded within th - **Authenticate users** via Single Sign-On (SSO) - **Issue credentials** directly to the user's wallet - **Request credentials** for verification or gating -- **Request consent** for data sharing agreements and terms acceptance This is ideal for: @@ -235,82 +234,6 @@ async function sendThankYouBadge() { Peer badges are sent **from the user** to another person, not from your app. This is ideal for recognition, gratitude, or social features within your app. {% endhint %} -### `requestConsent(contractUri, options?)` - -Request user consent for a ConsentFlow contract. This is useful when your app needs explicit user permission for data sharing, terms acceptance, or other consent-based flows. - -**Parameters:** - -| Parameter | Type | Required | Description | -| ------------- | ------------------------- | -------- | ----------------------------------------------------- | -| `contractUri` | `string` | Yes | The URI of the ConsentFlow contract | -| `options` | `RequestConsentOptions` | No | Additional options for the consent flow | - -**Options:** - -| Option | Type | Default | Description | -| ---------- | --------- | ------- | --------------------------------------------------------------------------- | -| `redirect` | `boolean` | `false` | If `true`, redirects to the contract's configured URL after consent granted | - -**Returns:** `Promise` - -```typescript -interface ConsentResponse { - granted: boolean; // Whether the user granted consent -} -``` - -**Basic Example:** - -```typescript -// Request consent for a data sharing agreement -const result = await learnCard.requestConsent('urn:lc:contract:my-data-agreement'); - -if (result.granted) { - console.log('User granted consent!'); - // Proceed with data access -} else { - console.log('User declined consent'); -} -``` - -**With Redirect:** - -```typescript -// Request consent and redirect to your callback URL after approval -const result = await learnCard.requestConsent('urn:lc:contract:my-agreement', { - redirect: true, -}); - -// If redirect is true and user consents, they will be redirected -// to the contract's configured redirectUrl with a VP (Verifiable Presentation) -// containing proof of consent -``` - -**How Redirect Works:** - -When `redirect: true` is set and the user grants consent: - -1. LearnCard generates a Verifiable Presentation (VP) proving consent -2. User is redirected to the contract's `redirectUrl` -3. The VP and user's DID are appended as URL parameters -4. Your server can verify the VP to confirm consent - -The redirect URL will include: -- `did` - The user's DID -- `vp` - A signed Verifiable Presentation (JWT format) - -**Use Cases:** - -- **Terms of Service** - Require users to accept terms before accessing features -- **Data Sharing Agreements** - Get explicit consent before sharing data with third parties -- **Privacy Policies** - Track user acknowledgment of privacy policies -- **OAuth-like Flows** - Use redirect mode for server-side consent verification - -{% hint style="info" %} -If the user has already consented to a contract, calling `requestConsent` will return `{ granted: true }` immediately without showing the consent modal again. -{% endhint %} - ## User Experience Flow When your app issues a credential: diff --git a/docs/how-to-guides/send-credentials.md b/docs/how-to-guides/send-credentials.md index 396a178752..f3192315b8 100644 --- a/docs/how-to-guides/send-credentials.md +++ b/docs/how-to-guides/send-credentials.md @@ -91,7 +91,6 @@ const result = await learnCard.invoke.send({ "https://purl.imsglobal.org/spec/ob/v3p0/context-3.0.2.json" ], "type": ["VerifiableCredential", "OpenBadgeCredential"], - "issuer": "did:web:example.com", "name": "Course Completion", "credentialSubject": { "type": ["AchievementSubject"], @@ -229,9 +228,7 @@ const templatedBoostUri = await learnCard.invoke.createBoost({ "https://www.w3.org/2018/credentials/v1", "https://purl.imsglobal.org/spec/ob/v3p0/context-3.0.2.json" ], - "type": ["VerifiableCredential", "OpenBadgeCredential"], - "issuer": learnCard.id.did(), - "issuanceDate": new Date().toISOString(), + "type": ["VerifiableCredential", "OpenBadgeCredential", "BoostCredential"], "name": "Certificate for {{courseName}}", "credentialSubject": { "type": ["AchievementSubject"], @@ -252,7 +249,7 @@ Provide `templateData` when sending to substitute the variables: ```typescript const result = await learnCard.invoke.send({ type: 'boost', - recipient: 'recipient-profile-id', + recipient: 'student-profile-id', templateUri: templatedBoostUri, templateData: { courseName: 'Web Development 101', diff --git a/docs/sdks/official-plugins/README.md b/docs/sdks/official-plugins/README.md index ed96ec9f33..5d08cc51fb 100644 --- a/docs/sdks/official-plugins/README.md +++ b/docs/sdks/official-plugins/README.md @@ -20,35 +20,35 @@ const enhancedLearnCard = await learnCard.addPlugin(await getMyPlugin()); ### Core Plugins (included in @learncard/init) -| Plugin | Description | -| ----------------------------------------- | ---------------------------------------------------- | -| [Crypto](crypto.md) | Core cryptographic operations | -| [DIDKit](didkit.md) | DID operations using DIDKit WASM | -| [DIDKit Node](didkit-node.md) | High-performance native Node.js DIDKit (server-side) | -| [DID Key](did-key.md) | Key management for `did:key` method | -| [VC](vc/README.md) | Verifiable Credential signing & verification | -| [VC-Templates](vc-templates.md) | Pre-built credential templates | -| [LearnCloud](learncloud.md) | Encrypted cloud storage | -| [Expiration](vc/expiration-sub-plugin.md) | Credential expiration handling | +| Plugin | Description | +|--------|-------------| +| [Crypto](crypto.md) | Core cryptographic operations | +| [DIDKit](didkit.md) | DID operations using DIDKit WASM | +| [DID Key](did-key.md) | Key management for `did:key` method | +| [VC](vc/README.md) | Verifiable Credential signing & verification | +| [VC-Templates](vc-templates.md) | Pre-built credential templates | +| [LearnCloud](learncloud.md) | Encrypted cloud storage | +| [Expiration](vc/expiration-sub-plugin.md) | Credential expiration handling | ### Network Plugins -| Plugin | Description | -| ----------------------------------------- | ---------------------------------------------------- | +| Plugin | Description | +|--------|-------------| | [LearnCard Network](learncard-network.md) | Profiles, connections, boosts via LearnCloud Network | -| [VC-API](vc-api.md) | VC-API protocol support | +| [VC-API](vc-api.md) | VC-API protocol support | ### Extension Plugins (install separately) -| Plugin | Package | Description | -| --------------------------------------- | ------------------------------------ | ------------------------------------ | -| [Claimable Boosts](claimable-boosts.md) | `@learncard/claimable-boosts-plugin` | Generate claimable credential links | -| [Simple Signing](simple-signing.md) | `@learncard/simple-signing-plugin` | Remote signing authority support | -| [CHAPI](chapi.md) | `@learncard/chapi-plugin` | Credential Handler API integration | -| [Ceramic](ceramic.md) | `@learncard/ceramic-plugin` | Ceramic Network storage | -| [Ethereum](ethereum.md) | `@learncard/ethereum-plugin` | Ethereum blockchain integration | -| [VPQR](vpqr.md) | `@learncard/vpqr-plugin` | QR code generation for presentations | +| Plugin | Package | Description | +|--------|---------|-------------| +| [Claimable Boosts](claimable-boosts.md) | `@learncard/claimable-boosts-plugin` | Generate claimable credential links | +| [Simple Signing](simple-signing.md) | `@learncard/simple-signing-plugin` | Remote signing authority support | +| [CHAPI](chapi.md) | `@learncard/chapi-plugin` | Credential Handler API integration | +| [Ceramic](ceramic.md) | `@learncard/ceramic-plugin` | Ceramic Network storage | +| [Ethereum](ethereum.md) | `@learncard/ethereum-plugin` | Ethereum blockchain integration | +| [VPQR](vpqr.md) | `@learncard/vpqr-plugin` | QR code generation for presentations | ## Building Your Own Plugin Want to extend LearnCard? See [Build a Plugin](../../how-to-guides/deploy-infrastructure/the-simplest-plugin.md) for a step-by-step guide. + diff --git a/docs/sdks/official-plugins/didkit-node.md b/docs/sdks/official-plugins/didkit-node.md deleted file mode 100644 index 58c6702c2d..0000000000 --- a/docs/sdks/official-plugins/didkit-node.md +++ /dev/null @@ -1,299 +0,0 @@ ---- -description: High-performance native Node.js DIDKit plugin using N-API ---- - -# DIDKit Node (Native) - -## Overview - -`@learncard/didkit-plugin-node` is a **high-performance native Node.js plugin** that provides the same DID and Verifiable Credential functionality as the standard WASM-based DIDKit plugin, but compiled directly to native code using Rust and N-API. - -This plugin is ideal for **server-side applications** where performance is critical, such as credential issuance services, verification endpoints, and batch processing workflows. - -{% hint style="info" %} -**When to use this plugin:** - -- āœ… Node.js server applications (Express, Fastify, NestJS, etc.) -- āœ… Serverless functions (AWS Lambda, Vercel, etc.) -- āœ… CLI tools and scripts -- āœ… High-throughput credential processing - -**When to use the WASM plugin instead:** - -- Browser applications -- React Native / mobile apps -- Environments without native compilation support - {% endhint %} - -## Installation - -```bash -pnpm i @learncard/didkit-plugin-node -``` - -{% hint style="warning" %} -This package includes prebuilt binaries for common platforms (Linux x64, macOS x64/ARM64, Windows x64). If your platform isn't supported, you'll need Rust installed to compile from source during installation. -{% endhint %} - -## Usage - -### Basic Setup - -```typescript -import { initLearnCard } from '@learncard/init'; -import { getDidKitPlugin } from '@learncard/didkit-plugin-node'; - -// Replace the default WASM plugin with the native plugin -const learnCard = await initLearnCard({ seed: 'your-seed-phrase', didkit: 'node' }); - -// Or use it directly -const didKitPlugin = await getDidKitPlugin(); -const learnCard = await (await initLearnCard({ custom: true })).addPlugin(await getDidKitPlugin()); -``` - -### Configuration Options - -```typescript -const didKitPlugin = await getDidKitPlugin( - undefined, // InitInput (optional, for WASM compatibility) - false // allowRemoteContexts - whether to fetch unknown JSON-LD contexts -); -``` - -| Parameter | Type | Default | Description | -| --------------------- | ----------- | ----------- | ----------------------------------------------------------------------- | -| `input` | `InitInput` | `undefined` | Optional initialization input (for API compatibility with WASM version) | -| `allowRemoteContexts` | `boolean` | `false` | Whether to allow fetching unknown JSON-LD contexts over HTTP | - -## Features - -### Embedded JSON-LD Contexts - -Like the WASM version, the native plugin uses SSI's **50+ embedded JSON-LD contexts**. Both versions avoid HTTP requests for common contexts: - -- W3C Credentials v1/v2 -- W3C Security contexts -- DID Core contexts -- Open Badges v2/v3 -- CLR v2 -- LearnCard Boosts contexts -- And many more... - -Unknown contexts can optionally be fetched via HTTP if `allowRemoteContexts` is enabled. - -### Async Operations - -All operations that may involve network requests (DID resolution, credential issuance/verification) are **truly async** and won't block Node.js's event loop: - -```typescript -// These operations run on a separate thread pool -const credential = await learnCard.invoke.issueCredential(unsignedVC, options, keypair); -const result = await learnCard.invoke.verifyCredential(credential); -const didDocument = await learnCard.invoke.resolveDid('did:web:example.com'); -``` - -### DID Web Caching - -The plugin includes built-in caching for `did:web` resolution to avoid redundant HTTP requests: - -```typescript -// Clear the DID web cache when needed (e.g., in tests) -await learnCard.invoke.clearDidWebCache(); -``` - -## API Reference - -The native plugin exposes the same API as the WASM DIDKit plugin: - -### Key Generation - -```typescript -// Generate Ed25519 keypair from seed bytes -const ed25519Key = learnCard.invoke.generateEd25519KeyFromBytes(seedBytes); - -// Generate secp256k1 keypair from seed bytes -const secp256k1Key = learnCard.invoke.generateSecp256k1KeyFromBytes(seedBytes); -``` - -### DID Operations - -```typescript -// Convert key to DID -const did = learnCard.invoke.keyToDid('key', keypair); - -// Get verification method for a key -const vm = await learnCard.invoke.keyToVerificationMethod('key', keypair); - -// Resolve a DID to its document -const didDoc = await learnCard.invoke.resolveDid(did); - -// Full DID resolution with metadata -const resolution = await learnCard.invoke.didResolver(did); -``` - -### Credential Operations - -```typescript -// Issue a credential -const signedVC = await learnCard.invoke.issueCredential( - unsignedCredential, - { proofFormat: 'jwt' }, // or 'lds' for JSON-LD signatures - keypair -); - -// Verify a credential -const result = await learnCard.invoke.verifyCredential(signedVC); -// Returns: { checks: [...], warnings: [...], errors: [...] } -``` - -### Presentation Operations - -```typescript -// Issue a presentation -const signedVP = await learnCard.invoke.issuePresentation( - unsignedPresentation, - { proofFormat: 'jwt', challenge: 'abc123' }, - keypair -); - -// Verify a presentation -const result = await learnCard.invoke.verifyPresentation(signedVP); -``` - -### JWE Encryption - -```typescript -// Create encrypted JWE -const jwe = await learnCard.invoke.createJwe(cleartext, recipientDids); - -// Decrypt JWE -const decrypted = await learnCard.invoke.decryptJwe(jwe, privateKeys); - -// DAG-JWE for structured data -const dagJwe = await learnCard.invoke.createDagJwe(jsonValue, recipientDids); -const decryptedValue = await learnCard.invoke.decryptDagJwe(dagJwe, privateKeys); -``` - -## Performance Comparison - -### Cold Start (The Main Benefit!) - -The biggest advantage of native over WASM is **cold start time** - critical for serverless functions, CLI tools, and worker threads: - -| Mode | Cold Start | Speedup | -| ------ | ---------- | ---------------- | -| WASM | ~1109ms | baseline | -| Native | ~62ms | **17.9x faster** | - -WASM requires fetching and compiling the binary on every fresh Node process, while native loads instantly. You save **~1047ms per cold start**. - -### Warm Operations - -Once initialized, native is still faster for most operations: - -| Operation | WASM (ms) | Native (ms) | Speedup | -| ------------------ | --------- | ----------- | ---------------- | -| issueCredential() | 2.97 | 1.77 | **1.67x faster** | -| verifyCredential() | 1.97 | 1.68 | **1.18x faster** | -| createJwe() | 0.34 | 0.10 | **3.29x faster** | -| decryptJwe() | 0.10 | 0.05 | **2.15x faster** | -| createDagJwe() | 0.23 | 0.11 | **2.16x faster** | -| decryptDagJwe() | 0.08 | 0.05 | **1.53x faster** | - -{% hint style="info" %} -**When to use native:** Server environments where cold start matters (serverless, CLI tools, worker threads). - -Run benchmarks yourself: `cd tests/benchmarking && pnpm benchmark` -{% endhint %} - -## Supported Platforms - -Prebuilt binaries are included for: - -| Platform | Architecture | Status | -| -------- | --------------------- | ----------- | -| Linux | x64 (glibc) | āœ… Included | -| Linux | x64 (musl) | āœ… Included | -| Linux | ARM64 | āœ… Included | -| macOS | x64 (Intel) | āœ… Included | -| macOS | ARM64 (Apple Silicon) | āœ… Included | -| Windows | x64 | āœ… Included | - -For other platforms, the package will attempt to compile from source during installation (requires Rust toolchain). - -## Troubleshooting - -### Binary Not Found - -If you see an error like "No .node binary found": - -```bash -# Rebuild the native module -cd node_modules/@learncard/didkit-plugin-node -pnpm build -``` - -### Compilation Errors - -If compilation fails, ensure you have the Rust toolchain installed: - -```bash -# Install Rust -curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh - -# Then reinstall the package -pnpm install -``` - -### Memory Issues in Serverless - -For serverless environments with limited memory, the native plugin is more memory-efficient than WASM. However, if you encounter issues: - -```typescript -// Explicitly clear caches between invocations -await learnCard.invoke.clearDidWebCache(); -``` - -## Migration from WASM Plugin - -The native plugin is a **drop-in replacement** for the WASM plugin. Simply change the import: - -```typescript -// Before (WASM) -import { getDidKitPlugin } from '@learncard/didkit-plugin'; - -// After (Native) -import { getDidKitPlugin } from '@learncard/didkit-plugin-node'; -``` - -All method signatures and return types are identical. - -## Architecture - -```text -ā”Œā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā” -│ Node.js Application │ -ā”œā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”¤ -│ TypeScript Plugin Layer │ -│ (Promise wrappers, JSON serialization) │ -ā”œā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”¤ -│ N-API Bridge │ -│ (napi-rs async/sync bindings) │ -ā”œā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”¤ -│ Rust Native Code │ -│ ā”Œā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā” ā”Œā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā” ā”Œā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”ā”‚ -│ │ DIDKit │ │ SSI │ │ Embedded Contexts ││ -│ │ (signing) │ │ (resolvers) │ │ (50+ JSON-LD) ││ -│ ā””ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”˜ ā””ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”˜ ā””ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”˜ā”‚ -ā”œā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”¤ -│ Tokio Runtime │ -│ (async HTTP, thread pool for CPU work) │ -ā””ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”˜ -``` - -## Related Documentation - -- [DIDKit (WASM)](didkit.md) - The browser-compatible WASM version -- [Plugin System](../../core-concepts/architecture-and-principles/plugins.md) - How plugins work -- [Verifiable Credentials](../../core-concepts/credentials-and-data/verifiable-credentials-vcs.md) - VC concepts -- [DIDs](../../core-concepts/identities-and-keys/decentralized-identifiers-dids.md) - DID concepts diff --git a/docs/sdks/official-plugins/didkit.md b/docs/sdks/official-plugins/didkit.md index eb4139a1b8..61fd2cf3d5 100644 --- a/docs/sdks/official-plugins/didkit.md +++ b/docs/sdks/official-plugins/didkit.md @@ -23,7 +23,3 @@ pnpm i @learncard/didkit-plugin ### Use Cases Anything related to issuing and signing VCs/VPs, as well as generating key material and DIDs! - -{% hint style="info" %} -**For Node.js server applications**, consider using the [DIDKit Node (Native)](didkit-node.md) plugin instead. It provides the same API but with significantly better performance by using native code instead of WASM. -{% endhint %} diff --git a/docs/tutorials/create-a-boost.md b/docs/tutorials/create-a-boost.md index 64ea9388e9..ffc5eefbf5 100644 --- a/docs/tutorials/create-a-boost.md +++ b/docs/tutorials/create-a-boost.md @@ -434,9 +434,10 @@ Use `{{variableName}}` syntax in your credential template: const templatedCredential = { '@context': [ 'https://www.w3.org/2018/credentials/v1', - 'https://purl.imsglobal.org/spec/ob/v3p0/context-3.0.1.json' + 'https://purl.imsglobal.org/spec/ob/v3p0/context-3.0.1.json', + 'https://ctx.learncard.com/boosts/1.0.3.json', ], - type: ['VerifiableCredential', 'OpenBadgeCredential'], + type: ['VerifiableCredential', 'OpenBadgeCredential', 'BoostCredential'], issuer: 'did:web:example.com', name: 'Certificate for {{courseName}}', credentialSubject: { diff --git a/examples/app-store-apps/1-basic-launchpad-app/CHANGELOG.md b/examples/app-store-apps/1-basic-launchpad-app/CHANGELOG.md index 59b46cb6b2..a4fafa4303 100644 --- a/examples/app-store-apps/1-basic-launchpad-app/CHANGELOG.md +++ b/examples/app-store-apps/1-basic-launchpad-app/CHANGELOG.md @@ -1,19 +1,5 @@ # @learncard/app-store-demo-basic-launchpad -## 0.0.5 - -### Patch Changes - -- Updated dependencies [[`7e30fc7116411ba19a4889cfbf9fc71dd725c309`](https://github.com/learningeconomy/LearnCard/commit/7e30fc7116411ba19a4889cfbf9fc71dd725c309)]: - - @learncard/init@2.3.0 - -## 0.0.4 - -### Patch Changes - -- Updated dependencies [[`f797ad95a9324dd56bc3d22e4e2b07caa0c53d94`](https://github.com/learningeconomy/LearnCard/commit/f797ad95a9324dd56bc3d22e4e2b07caa0c53d94)]: - - @learncard/partner-connect@0.2.3 - ## 0.0.3 ### Patch Changes diff --git a/examples/app-store-apps/1-basic-launchpad-app/package.json b/examples/app-store-apps/1-basic-launchpad-app/package.json index 9d8018b2a3..bfc1568a07 100644 --- a/examples/app-store-apps/1-basic-launchpad-app/package.json +++ b/examples/app-store-apps/1-basic-launchpad-app/package.json @@ -1,7 +1,7 @@ { "name": "@learncard/app-store-demo-basic-launchpad", "type": "module", - "version": "0.0.5", + "version": "0.0.3", "private": true, "scripts": { "dev": "astro dev", diff --git a/examples/app-store-apps/2-lore-card-app/CHANGELOG.md b/examples/app-store-apps/2-lore-card-app/CHANGELOG.md index 3f7603ca08..5d882580c0 100644 --- a/examples/app-store-apps/2-lore-card-app/CHANGELOG.md +++ b/examples/app-store-apps/2-lore-card-app/CHANGELOG.md @@ -1,19 +1,5 @@ # @learncard/app-store-demo-lore-card -## 0.0.5 - -### Patch Changes - -- Updated dependencies [[`7e30fc7116411ba19a4889cfbf9fc71dd725c309`](https://github.com/learningeconomy/LearnCard/commit/7e30fc7116411ba19a4889cfbf9fc71dd725c309)]: - - @learncard/init@2.3.0 - -## 0.0.4 - -### Patch Changes - -- Updated dependencies [[`f797ad95a9324dd56bc3d22e4e2b07caa0c53d94`](https://github.com/learningeconomy/LearnCard/commit/f797ad95a9324dd56bc3d22e4e2b07caa0c53d94)]: - - @learncard/partner-connect@0.2.3 - ## 0.0.3 ### Patch Changes diff --git a/examples/app-store-apps/2-lore-card-app/package.json b/examples/app-store-apps/2-lore-card-app/package.json index 06893bc57c..72ecaff072 100644 --- a/examples/app-store-apps/2-lore-card-app/package.json +++ b/examples/app-store-apps/2-lore-card-app/package.json @@ -1,7 +1,7 @@ { "name": "@learncard/app-store-demo-lore-card", "type": "module", - "version": "0.0.5", + "version": "0.0.3", "private": true, "description": "LoreCard - Social-Emotional Learning Badges for Tabletop RPG Players", "scripts": { diff --git a/examples/app-store-apps/3-mozilla-social-badges-app/CHANGELOG.md b/examples/app-store-apps/3-mozilla-social-badges-app/CHANGELOG.md index 048a6b63f3..1a6125ff67 100644 --- a/examples/app-store-apps/3-mozilla-social-badges-app/CHANGELOG.md +++ b/examples/app-store-apps/3-mozilla-social-badges-app/CHANGELOG.md @@ -1,19 +1,5 @@ # @learncard/app-store-demo-mozilla-social-badges -## 0.0.5 - -### Patch Changes - -- Updated dependencies [[`7e30fc7116411ba19a4889cfbf9fc71dd725c309`](https://github.com/learningeconomy/LearnCard/commit/7e30fc7116411ba19a4889cfbf9fc71dd725c309)]: - - @learncard/init@2.3.0 - -## 0.0.4 - -### Patch Changes - -- Updated dependencies [[`f797ad95a9324dd56bc3d22e4e2b07caa0c53d94`](https://github.com/learningeconomy/LearnCard/commit/f797ad95a9324dd56bc3d22e4e2b07caa0c53d94)]: - - @learncard/partner-connect@0.2.3 - ## 0.0.3 ### Patch Changes diff --git a/examples/app-store-apps/3-mozilla-social-badges-app/package.json b/examples/app-store-apps/3-mozilla-social-badges-app/package.json index 3ab0941e1c..3a345c9756 100644 --- a/examples/app-store-apps/3-mozilla-social-badges-app/package.json +++ b/examples/app-store-apps/3-mozilla-social-badges-app/package.json @@ -1,7 +1,7 @@ { "name": "@learncard/app-store-demo-mozilla-social-badges", "type": "module", - "version": "0.0.5", + "version": "0.0.3", "private": true, "description": "Mozilla Social Badges - Recognize and celebrate open web contributions through verifiable badges", "scripts": { diff --git a/examples/chapi-example/CHANGELOG.md b/examples/chapi-example/CHANGELOG.md index 0f7fce451c..8813dd2f3f 100644 --- a/examples/chapi-example/CHANGELOG.md +++ b/examples/chapi-example/CHANGELOG.md @@ -1,20 +1,5 @@ # @learncard/chapi-example -## 1.1.8 - -### Patch Changes - -- Updated dependencies [[`7e30fc7116411ba19a4889cfbf9fc71dd725c309`](https://github.com/learningeconomy/LearnCard/commit/7e30fc7116411ba19a4889cfbf9fc71dd725c309)]: - - @learncard/init@2.3.0 - - @learncard/react@2.9.8 - -## 1.1.7 - -### Patch Changes - -- Updated dependencies [[`1247b3b2b372626b06d6193b5c9227504c23a3be`](https://github.com/learningeconomy/LearnCard/commit/1247b3b2b372626b06d6193b5c9227504c23a3be), [`1247b3b2b372626b06d6193b5c9227504c23a3be`](https://github.com/learningeconomy/LearnCard/commit/1247b3b2b372626b06d6193b5c9227504c23a3be)]: - - @learncard/react@2.9.7 - ## 1.1.6 ### Patch Changes diff --git a/examples/chapi-example/package.json b/examples/chapi-example/package.json index ccbfe8acbe..5ead1bae42 100644 --- a/examples/chapi-example/package.json +++ b/examples/chapi-example/package.json @@ -1,7 +1,7 @@ { "name": "@learncard/chapi-example", "type": "module", - "version": "1.1.8", + "version": "1.1.6", "private": true, "scripts": { "dev": "astro dev", diff --git a/examples/snap-chapi-example/CHANGELOG.md b/examples/snap-chapi-example/CHANGELOG.md index c692c2a373..b499fed037 100644 --- a/examples/snap-chapi-example/CHANGELOG.md +++ b/examples/snap-chapi-example/CHANGELOG.md @@ -1,19 +1,5 @@ # @learncard/snap-chapi-example -## 1.1.8 - -### Patch Changes - -- Updated dependencies []: - - @learncard/react@2.9.8 - -## 1.1.7 - -### Patch Changes - -- Updated dependencies [[`1247b3b2b372626b06d6193b5c9227504c23a3be`](https://github.com/learningeconomy/LearnCard/commit/1247b3b2b372626b06d6193b5c9227504c23a3be), [`1247b3b2b372626b06d6193b5c9227504c23a3be`](https://github.com/learningeconomy/LearnCard/commit/1247b3b2b372626b06d6193b5c9227504c23a3be)]: - - @learncard/react@2.9.7 - ## 1.1.6 ### Patch Changes diff --git a/examples/snap-chapi-example/package.json b/examples/snap-chapi-example/package.json index 7c3586abfe..33a3f41c7c 100644 --- a/examples/snap-chapi-example/package.json +++ b/examples/snap-chapi-example/package.json @@ -1,7 +1,7 @@ { "name": "@learncard/snap-chapi-example", "type": "module", - "version": "1.1.8", + "version": "1.1.6", "private": true, "scripts": { "dev": "astro dev", diff --git a/lib/ssi b/lib/ssi index 2960aaa34e..ad361ab3bc 160000 --- a/lib/ssi +++ b/lib/ssi @@ -1 +1 @@ -Subproject commit 2960aaa34e13c082cd359d58be9b2e6f9a016afb +Subproject commit ad361ab3bc1777f92ea72ed43ef83386c0bd1776 diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000000..47ede23b24 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,18000 @@ +{ + "name": "learncard-monorepo", + "version": "1.0.1", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "learncard-monorepo", + "version": "1.0.1", + "hasInstallScript": true, + "dependencies": { + "@ionic/react": "8.7.2", + "@ionic/react-router": "8.7.2", + "@radix-ui/react-popover": "1.0.7", + "@tanstack/query-async-storage-persister": "^5.54.1", + "@tanstack/query-sync-storage-persister": "^5.54.1", + "@tanstack/react-query": "^5.54.1", + "@tanstack/react-query-devtools": "^5.54.1", + "@tanstack/react-query-persist-client": "^5.54.1", + "@traversable/zod": "^0.0.57", + "core-js": "^3.25.1", + "firebase": "11.10.0", + "history": "4.10.1", + "launchdarkly-react-client-sdk": "^3.0.1", + "react": "18.3.1", + "react-dom": "18.3.1", + "react-router": "5.3.3", + "react-router-dom": "5.3.3", + "regenerator-runtime": "0.13.7", + "tslib": "^2.4.0", + "typescript": "5.9.3", + "zod": "4.1.13", + "zod-openapi": "5.4.5" + }, + "devDependencies": { + "@changesets/changelog-github": "^0.4.8", + "@changesets/cli": "^2.26.0", + "@types/jest": "^29.5.12", + "@types/node": "^18.19.68", + "@types/react": "^18.3.12", + "@types/react-dom": "^18.0.6", + "@types/react-router-dom": "^5.3.3", + "@typescript-eslint/eslint-plugin": "^5.54.0", + "@typescript-eslint/parser": "^5.54.0", + "esbuild-jest": "^0.5.0", + "eslint": "^8.35.0", + "eslint-config-airbnb-typescript": "^17.0.0", + "eslint-import-resolver-typescript": "^2.7.1", + "eslint-plugin-import": "^2.27.5", + "eslint-plugin-prettier": "^4.2.1", + "eslint-plugin-react": "^7.32.2", + "jest": "^29.5.0", + "jest-environment-jsdom": "^29.5.0", + "jest-silent-reporter": "^0.5.0", + "nx": "16.1.4", + "prettier": "^2.8.4", + "prettier-plugin-astro": "^0.5.5", + "ts-jest": "^29.0.5", + "tslib": "^2.5.0", + "vite-tsconfig-paths": "^4.3.2", + "vitest": "^1.4.0" + } + }, + "node_modules/@astrojs/compiler": { + "version": "0.23.5", + "resolved": "https://registry.npmjs.org/@astrojs/compiler/-/compiler-0.23.5.tgz", + "integrity": "sha512-vBMPy9ok4iLapSyCCT1qsZ9dK7LkVFl9mObtLEmWiec9myGHS9h2kQY2xzPeFNJiWXUf9O6tSyQpQTy5As/p3g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz", + "integrity": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", + "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.5", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helpers": "^7.28.4", + "@babel/parser": "^7.28.5", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz", + "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.5", + "@babel/types": "^7.28.5", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", + "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.28.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", + "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", + "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.5" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz", + "integrity": "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz", + "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz", + "integrity": "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.27.1.tgz", + "integrity": "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz", + "integrity": "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz", + "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.5", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.5", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.5", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", + "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@changesets/apply-release-plan": { + "version": "7.0.14", + "resolved": "https://registry.npmjs.org/@changesets/apply-release-plan/-/apply-release-plan-7.0.14.tgz", + "integrity": "sha512-ddBvf9PHdy2YY0OUiEl3TV78mH9sckndJR14QAt87KLEbIov81XO0q0QAmvooBxXlqRRP8I9B7XOzZwQG7JkWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@changesets/config": "^3.1.2", + "@changesets/get-version-range-type": "^0.4.0", + "@changesets/git": "^3.0.4", + "@changesets/should-skip-package": "^0.1.2", + "@changesets/types": "^6.1.0", + "@manypkg/get-packages": "^1.1.3", + "detect-indent": "^6.0.0", + "fs-extra": "^7.0.1", + "lodash.startcase": "^4.4.0", + "outdent": "^0.5.0", + "prettier": "^2.7.1", + "resolve-from": "^5.0.0", + "semver": "^7.5.3" + } + }, + "node_modules/@changesets/apply-release-plan/node_modules/@changesets/types": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@changesets/types/-/types-6.1.0.tgz", + "integrity": "sha512-rKQcJ+o1nKNgeoYRHKOS07tAMNd3YSN0uHaJOZYjBAgxfV7TUE7JE+z4BzZdQwb5hKaYbayKN5KrYV7ODb2rAA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@changesets/assemble-release-plan": { + "version": "6.0.9", + "resolved": "https://registry.npmjs.org/@changesets/assemble-release-plan/-/assemble-release-plan-6.0.9.tgz", + "integrity": "sha512-tPgeeqCHIwNo8sypKlS3gOPmsS3wP0zHt67JDuL20P4QcXiw/O4Hl7oXiuLnP9yg+rXLQ2sScdV1Kkzde61iSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@changesets/errors": "^0.2.0", + "@changesets/get-dependents-graph": "^2.1.3", + "@changesets/should-skip-package": "^0.1.2", + "@changesets/types": "^6.1.0", + "@manypkg/get-packages": "^1.1.3", + "semver": "^7.5.3" + } + }, + "node_modules/@changesets/assemble-release-plan/node_modules/@changesets/types": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@changesets/types/-/types-6.1.0.tgz", + "integrity": "sha512-rKQcJ+o1nKNgeoYRHKOS07tAMNd3YSN0uHaJOZYjBAgxfV7TUE7JE+z4BzZdQwb5hKaYbayKN5KrYV7ODb2rAA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@changesets/changelog-git": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@changesets/changelog-git/-/changelog-git-0.2.1.tgz", + "integrity": "sha512-x/xEleCFLH28c3bQeQIyeZf8lFXyDFVn1SgcBiR2Tw/r4IAWlk1fzxCEZ6NxQAjF2Nwtczoen3OA2qR+UawQ8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@changesets/types": "^6.1.0" + } + }, + "node_modules/@changesets/changelog-git/node_modules/@changesets/types": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@changesets/types/-/types-6.1.0.tgz", + "integrity": "sha512-rKQcJ+o1nKNgeoYRHKOS07tAMNd3YSN0uHaJOZYjBAgxfV7TUE7JE+z4BzZdQwb5hKaYbayKN5KrYV7ODb2rAA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@changesets/changelog-github": { + "version": "0.4.8", + "resolved": "https://registry.npmjs.org/@changesets/changelog-github/-/changelog-github-0.4.8.tgz", + "integrity": "sha512-jR1DHibkMAb5v/8ym77E4AMNWZKB5NPzw5a5Wtqm1JepAuIF+hrKp2u04NKM14oBZhHglkCfrla9uq8ORnK/dw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@changesets/get-github-info": "^0.5.2", + "@changesets/types": "^5.2.1", + "dotenv": "^8.1.0" + } + }, + "node_modules/@changesets/cli": { + "version": "2.29.8", + "resolved": "https://registry.npmjs.org/@changesets/cli/-/cli-2.29.8.tgz", + "integrity": "sha512-1weuGZpP63YWUYjay/E84qqwcnt5yJMM0tep10Up7Q5cS/DGe2IZ0Uj3HNMxGhCINZuR7aO9WBMdKnPit5ZDPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@changesets/apply-release-plan": "^7.0.14", + "@changesets/assemble-release-plan": "^6.0.9", + "@changesets/changelog-git": "^0.2.1", + "@changesets/config": "^3.1.2", + "@changesets/errors": "^0.2.0", + "@changesets/get-dependents-graph": "^2.1.3", + "@changesets/get-release-plan": "^4.0.14", + "@changesets/git": "^3.0.4", + "@changesets/logger": "^0.1.1", + "@changesets/pre": "^2.0.2", + "@changesets/read": "^0.6.6", + "@changesets/should-skip-package": "^0.1.2", + "@changesets/types": "^6.1.0", + "@changesets/write": "^0.4.0", + "@inquirer/external-editor": "^1.0.2", + "@manypkg/get-packages": "^1.1.3", + "ansi-colors": "^4.1.3", + "ci-info": "^3.7.0", + "enquirer": "^2.4.1", + "fs-extra": "^7.0.1", + "mri": "^1.2.0", + "p-limit": "^2.2.0", + "package-manager-detector": "^0.2.0", + "picocolors": "^1.1.0", + "resolve-from": "^5.0.0", + "semver": "^7.5.3", + "spawndamnit": "^3.0.1", + "term-size": "^2.1.0" + }, + "bin": { + "changeset": "bin.js" + } + }, + "node_modules/@changesets/cli/node_modules/@changesets/types": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@changesets/types/-/types-6.1.0.tgz", + "integrity": "sha512-rKQcJ+o1nKNgeoYRHKOS07tAMNd3YSN0uHaJOZYjBAgxfV7TUE7JE+z4BzZdQwb5hKaYbayKN5KrYV7ODb2rAA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@changesets/config": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@changesets/config/-/config-3.1.2.tgz", + "integrity": "sha512-CYiRhA4bWKemdYi/uwImjPxqWNpqGPNbEBdX1BdONALFIDK7MCUj6FPkzD+z9gJcvDFUQJn9aDVf4UG7OT6Kog==", + "dev": true, + "license": "MIT", + "dependencies": { + "@changesets/errors": "^0.2.0", + "@changesets/get-dependents-graph": "^2.1.3", + "@changesets/logger": "^0.1.1", + "@changesets/types": "^6.1.0", + "@manypkg/get-packages": "^1.1.3", + "fs-extra": "^7.0.1", + "micromatch": "^4.0.8" + } + }, + "node_modules/@changesets/config/node_modules/@changesets/types": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@changesets/types/-/types-6.1.0.tgz", + "integrity": "sha512-rKQcJ+o1nKNgeoYRHKOS07tAMNd3YSN0uHaJOZYjBAgxfV7TUE7JE+z4BzZdQwb5hKaYbayKN5KrYV7ODb2rAA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@changesets/errors": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@changesets/errors/-/errors-0.2.0.tgz", + "integrity": "sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==", + "dev": true, + "license": "MIT", + "dependencies": { + "extendable-error": "^0.1.5" + } + }, + "node_modules/@changesets/get-dependents-graph": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@changesets/get-dependents-graph/-/get-dependents-graph-2.1.3.tgz", + "integrity": "sha512-gphr+v0mv2I3Oxt19VdWRRUxq3sseyUpX9DaHpTUmLj92Y10AGy+XOtV+kbM6L/fDcpx7/ISDFK6T8A/P3lOdQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@changesets/types": "^6.1.0", + "@manypkg/get-packages": "^1.1.3", + "picocolors": "^1.1.0", + "semver": "^7.5.3" + } + }, + "node_modules/@changesets/get-dependents-graph/node_modules/@changesets/types": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@changesets/types/-/types-6.1.0.tgz", + "integrity": "sha512-rKQcJ+o1nKNgeoYRHKOS07tAMNd3YSN0uHaJOZYjBAgxfV7TUE7JE+z4BzZdQwb5hKaYbayKN5KrYV7ODb2rAA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@changesets/get-github-info": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@changesets/get-github-info/-/get-github-info-0.5.2.tgz", + "integrity": "sha512-JppheLu7S114aEs157fOZDjFqUDpm7eHdq5E8SSR0gUBTEK0cNSHsrSR5a66xs0z3RWuo46QvA3vawp8BxDHvg==", + "dev": true, + "license": "MIT", + "dependencies": { + "dataloader": "^1.4.0", + "node-fetch": "^2.5.0" + } + }, + "node_modules/@changesets/get-release-plan": { + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/@changesets/get-release-plan/-/get-release-plan-4.0.14.tgz", + "integrity": "sha512-yjZMHpUHgl4Xl5gRlolVuxDkm4HgSJqT93Ri1Uz8kGrQb+5iJ8dkXJ20M2j/Y4iV5QzS2c5SeTxVSKX+2eMI0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@changesets/assemble-release-plan": "^6.0.9", + "@changesets/config": "^3.1.2", + "@changesets/pre": "^2.0.2", + "@changesets/read": "^0.6.6", + "@changesets/types": "^6.1.0", + "@manypkg/get-packages": "^1.1.3" + } + }, + "node_modules/@changesets/get-release-plan/node_modules/@changesets/types": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@changesets/types/-/types-6.1.0.tgz", + "integrity": "sha512-rKQcJ+o1nKNgeoYRHKOS07tAMNd3YSN0uHaJOZYjBAgxfV7TUE7JE+z4BzZdQwb5hKaYbayKN5KrYV7ODb2rAA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@changesets/get-version-range-type": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@changesets/get-version-range-type/-/get-version-range-type-0.4.0.tgz", + "integrity": "sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@changesets/git": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@changesets/git/-/git-3.0.4.tgz", + "integrity": "sha512-BXANzRFkX+XcC1q/d27NKvlJ1yf7PSAgi8JG6dt8EfbHFHi4neau7mufcSca5zRhwOL8j9s6EqsxmT+s+/E6Sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@changesets/errors": "^0.2.0", + "@manypkg/get-packages": "^1.1.3", + "is-subdir": "^1.1.1", + "micromatch": "^4.0.8", + "spawndamnit": "^3.0.1" + } + }, + "node_modules/@changesets/logger": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@changesets/logger/-/logger-0.1.1.tgz", + "integrity": "sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "picocolors": "^1.1.0" + } + }, + "node_modules/@changesets/parse": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@changesets/parse/-/parse-0.4.2.tgz", + "integrity": "sha512-Uo5MC5mfg4OM0jU3up66fmSn6/NE9INK+8/Vn/7sMVcdWg46zfbvvUSjD9EMonVqPi9fbrJH9SXHn48Tr1f2yA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@changesets/types": "^6.1.0", + "js-yaml": "^4.1.1" + } + }, + "node_modules/@changesets/parse/node_modules/@changesets/types": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@changesets/types/-/types-6.1.0.tgz", + "integrity": "sha512-rKQcJ+o1nKNgeoYRHKOS07tAMNd3YSN0uHaJOZYjBAgxfV7TUE7JE+z4BzZdQwb5hKaYbayKN5KrYV7ODb2rAA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@changesets/pre": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@changesets/pre/-/pre-2.0.2.tgz", + "integrity": "sha512-HaL/gEyFVvkf9KFg6484wR9s0qjAXlZ8qWPDkTyKF6+zqjBe/I2mygg3MbpZ++hdi0ToqNUF8cjj7fBy0dg8Ug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@changesets/errors": "^0.2.0", + "@changesets/types": "^6.1.0", + "@manypkg/get-packages": "^1.1.3", + "fs-extra": "^7.0.1" + } + }, + "node_modules/@changesets/pre/node_modules/@changesets/types": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@changesets/types/-/types-6.1.0.tgz", + "integrity": "sha512-rKQcJ+o1nKNgeoYRHKOS07tAMNd3YSN0uHaJOZYjBAgxfV7TUE7JE+z4BzZdQwb5hKaYbayKN5KrYV7ODb2rAA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@changesets/read": { + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/@changesets/read/-/read-0.6.6.tgz", + "integrity": "sha512-P5QaN9hJSQQKJShzzpBT13FzOSPyHbqdoIBUd2DJdgvnECCyO6LmAOWSV+O8se2TaZJVwSXjL+v9yhb+a9JeJg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@changesets/git": "^3.0.4", + "@changesets/logger": "^0.1.1", + "@changesets/parse": "^0.4.2", + "@changesets/types": "^6.1.0", + "fs-extra": "^7.0.1", + "p-filter": "^2.1.0", + "picocolors": "^1.1.0" + } + }, + "node_modules/@changesets/read/node_modules/@changesets/types": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@changesets/types/-/types-6.1.0.tgz", + "integrity": "sha512-rKQcJ+o1nKNgeoYRHKOS07tAMNd3YSN0uHaJOZYjBAgxfV7TUE7JE+z4BzZdQwb5hKaYbayKN5KrYV7ODb2rAA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@changesets/should-skip-package": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@changesets/should-skip-package/-/should-skip-package-0.1.2.tgz", + "integrity": "sha512-qAK/WrqWLNCP22UDdBTMPH5f41elVDlsNyat180A33dWxuUDyNpg6fPi/FyTZwRriVjg0L8gnjJn2F9XAoF0qw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@changesets/types": "^6.1.0", + "@manypkg/get-packages": "^1.1.3" + } + }, + "node_modules/@changesets/should-skip-package/node_modules/@changesets/types": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@changesets/types/-/types-6.1.0.tgz", + "integrity": "sha512-rKQcJ+o1nKNgeoYRHKOS07tAMNd3YSN0uHaJOZYjBAgxfV7TUE7JE+z4BzZdQwb5hKaYbayKN5KrYV7ODb2rAA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@changesets/types": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/@changesets/types/-/types-5.2.1.tgz", + "integrity": "sha512-myLfHbVOqaq9UtUKqR/nZA/OY7xFjQMdfgfqeZIBK4d0hA6pgxArvdv8M+6NUzzBsjWLOtvApv8YHr4qM+Kpfg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@changesets/write": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@changesets/write/-/write-0.4.0.tgz", + "integrity": "sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@changesets/types": "^6.1.0", + "fs-extra": "^7.0.1", + "human-id": "^4.1.1", + "prettier": "^2.7.1" + } + }, + "node_modules/@changesets/write/node_modules/@changesets/types": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@changesets/types/-/types-6.1.0.tgz", + "integrity": "sha512-rKQcJ+o1nKNgeoYRHKOS07tAMNd3YSN0uHaJOZYjBAgxfV7TUE7JE+z4BzZdQwb5hKaYbayKN5KrYV7ODb2rAA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@cnakazawa/watch": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", + "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "exec-sh": "^0.3.2", + "minimist": "^1.2.0" + }, + "bin": { + "watch": "cli.js" + }, + "engines": { + "node": ">=0.1.95" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.2.tgz", + "integrity": "sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.2.tgz", + "integrity": "sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.2.tgz", + "integrity": "sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.2.tgz", + "integrity": "sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.2.tgz", + "integrity": "sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.2.tgz", + "integrity": "sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.2.tgz", + "integrity": "sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.2.tgz", + "integrity": "sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.2.tgz", + "integrity": "sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.2.tgz", + "integrity": "sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.2.tgz", + "integrity": "sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.2.tgz", + "integrity": "sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.2.tgz", + "integrity": "sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.2.tgz", + "integrity": "sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.2.tgz", + "integrity": "sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.2.tgz", + "integrity": "sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.2.tgz", + "integrity": "sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.2.tgz", + "integrity": "sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.2.tgz", + "integrity": "sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.2.tgz", + "integrity": "sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.2.tgz", + "integrity": "sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.2.tgz", + "integrity": "sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.2.tgz", + "integrity": "sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.2.tgz", + "integrity": "sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.2.tgz", + "integrity": "sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.2.tgz", + "integrity": "sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@firebase/ai": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@firebase/ai/-/ai-1.4.1.tgz", + "integrity": "sha512-bcusQfA/tHjUjBTnMx6jdoPMpDl3r8K15Z+snHz9wq0Foox0F/V+kNLXucEOHoTL2hTc9l+onZCyBJs2QoIC3g==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/app-check-interop-types": "0.3.3", + "@firebase/component": "0.6.18", + "@firebase/logger": "0.4.4", + "@firebase/util": "1.12.1", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "@firebase/app": "0.x", + "@firebase/app-types": "0.x" + } + }, + "node_modules/@firebase/analytics": { + "version": "0.10.17", + "resolved": "https://registry.npmjs.org/@firebase/analytics/-/analytics-0.10.17.tgz", + "integrity": "sha512-n5vfBbvzduMou/2cqsnKrIes4auaBjdhg8QNA2ZQZ59QgtO2QiwBaXQZQE4O4sgB0Ds1tvLgUUkY+pwzu6/xEg==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.6.18", + "@firebase/installations": "0.6.18", + "@firebase/logger": "0.4.4", + "@firebase/util": "1.12.1", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/analytics-compat": { + "version": "0.2.23", + "resolved": "https://registry.npmjs.org/@firebase/analytics-compat/-/analytics-compat-0.2.23.tgz", + "integrity": "sha512-3AdO10RN18G5AzREPoFgYhW6vWXr3u+OYQv6pl3CX6Fky8QRk0AHurZlY3Q1xkXO0TDxIsdhO3y65HF7PBOJDw==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/analytics": "0.10.17", + "@firebase/analytics-types": "0.8.3", + "@firebase/component": "0.6.18", + "@firebase/util": "1.12.1", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/analytics-types": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/@firebase/analytics-types/-/analytics-types-0.8.3.tgz", + "integrity": "sha512-VrIp/d8iq2g501qO46uGz3hjbDb8xzYMrbu8Tp0ovzIzrvJZ2fvmj649gTjge/b7cCCcjT0H37g1gVtlNhnkbg==", + "license": "Apache-2.0" + }, + "node_modules/@firebase/app": { + "version": "0.13.2", + "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.13.2.tgz", + "integrity": "sha512-jwtMmJa1BXXDCiDx1vC6SFN/+HfYG53UkfJa6qeN5ogvOunzbFDO3wISZy5n9xgYFUrEP6M7e8EG++riHNTv9w==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@firebase/component": "0.6.18", + "@firebase/logger": "0.4.4", + "@firebase/util": "1.12.1", + "idb": "7.1.1", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@firebase/app-check": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@firebase/app-check/-/app-check-0.10.1.tgz", + "integrity": "sha512-MgNdlms9Qb0oSny87pwpjKush9qUwCJhfmTJHDfrcKo4neLGiSeVE4qJkzP7EQTIUFKp84pbTxobSAXkiuQVYQ==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.6.18", + "@firebase/logger": "0.4.4", + "@firebase/util": "1.12.1", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/app-check-compat": { + "version": "0.3.26", + "resolved": "https://registry.npmjs.org/@firebase/app-check-compat/-/app-check-compat-0.3.26.tgz", + "integrity": "sha512-PkX+XJMLDea6nmnopzFKlr+s2LMQGqdyT2DHdbx1v1dPSqOol2YzgpgymmhC67vitXVpNvS3m/AiWQWWhhRRPQ==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/app-check": "0.10.1", + "@firebase/app-check-types": "0.5.3", + "@firebase/component": "0.6.18", + "@firebase/logger": "0.4.4", + "@firebase/util": "1.12.1", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/app-check-interop-types": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@firebase/app-check-interop-types/-/app-check-interop-types-0.3.3.tgz", + "integrity": "sha512-gAlxfPLT2j8bTI/qfe3ahl2I2YcBQ8cFIBdhAQA4I2f3TndcO+22YizyGYuttLHPQEpWkhmpFW60VCFEPg4g5A==", + "license": "Apache-2.0" + }, + "node_modules/@firebase/app-check-types": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/@firebase/app-check-types/-/app-check-types-0.5.3.tgz", + "integrity": "sha512-hyl5rKSj0QmwPdsAxrI5x1otDlByQ7bvNvVt8G/XPO2CSwE++rmSVf3VEhaeOR4J8ZFaF0Z0NDSmLejPweZ3ng==", + "license": "Apache-2.0" + }, + "node_modules/@firebase/app-compat": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@firebase/app-compat/-/app-compat-0.4.2.tgz", + "integrity": "sha512-LssbyKHlwLeiV8GBATyOyjmHcMpX/tFjzRUCS1jnwGAew1VsBB4fJowyS5Ud5LdFbYpJeS+IQoC+RQxpK7eH3Q==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@firebase/app": "0.13.2", + "@firebase/component": "0.6.18", + "@firebase/logger": "0.4.4", + "@firebase/util": "1.12.1", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@firebase/app-types": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.9.3.tgz", + "integrity": "sha512-kRVpIl4vVGJ4baogMDINbyrIOtOxqhkZQg4jTq3l8Lw6WSk0xfpEYzezFu+Kl4ve4fbPl79dvwRtaFqAC/ucCw==", + "license": "Apache-2.0", + "peer": true + }, + "node_modules/@firebase/auth-compat": { + "version": "0.5.28", + "resolved": "https://registry.npmjs.org/@firebase/auth-compat/-/auth-compat-0.5.28.tgz", + "integrity": "sha512-HpMSo/cc6Y8IX7bkRIaPPqT//Jt83iWy5rmDWeThXQCAImstkdNo3giFLORJwrZw2ptiGkOij64EH1ztNJzc7Q==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/auth": "1.10.8", + "@firebase/auth-types": "0.13.0", + "@firebase/component": "0.6.18", + "@firebase/util": "1.12.1", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/auth-compat/node_modules/@firebase/auth": { + "version": "1.10.8", + "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-1.10.8.tgz", + "integrity": "sha512-GpuTz5ap8zumr/ocnPY57ZanX02COsXloY6Y/2LYPAuXYiaJRf6BAGDEdRq1BMjP93kqQnKNuKZUTMZbQ8MNYA==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.6.18", + "@firebase/logger": "0.4.4", + "@firebase/util": "1.12.1", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "@firebase/app": "0.x", + "@react-native-async-storage/async-storage": "^1.18.1" + }, + "peerDependenciesMeta": { + "@react-native-async-storage/async-storage": { + "optional": true + } + } + }, + "node_modules/@firebase/auth-interop-types": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@firebase/auth-interop-types/-/auth-interop-types-0.2.4.tgz", + "integrity": "sha512-JPgcXKCuO+CWqGDnigBtvo09HeBs5u/Ktc2GaFj2m01hLarbxthLNm7Fk8iOP1aqAtXV+fnnGj7U28xmk7IwVA==", + "license": "Apache-2.0" + }, + "node_modules/@firebase/auth-types": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@firebase/auth-types/-/auth-types-0.13.0.tgz", + "integrity": "sha512-S/PuIjni0AQRLF+l9ck0YpsMOdE8GO2KU6ubmBB7P+7TJUCQDa3R1dlgYm9UzGbbePMZsp0xzB93f2b/CgxMOg==", + "license": "Apache-2.0", + "peerDependencies": { + "@firebase/app-types": "0.x", + "@firebase/util": "1.x" + } + }, + "node_modules/@firebase/component": { + "version": "0.6.18", + "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.18.tgz", + "integrity": "sha512-n28kPCkE2dL2U28fSxZJjzPPVpKsQminJ6NrzcKXAI0E/lYC8YhfwpyllScqVEvAI3J2QgJZWYgrX+1qGI+SQQ==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/util": "1.12.1", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@firebase/data-connect": { + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/@firebase/data-connect/-/data-connect-0.3.10.tgz", + "integrity": "sha512-VMVk7zxIkgwlVQIWHOKFahmleIjiVFwFOjmakXPd/LDgaB/5vzwsB5DWIYo+3KhGxWpidQlR8geCIn39YflJIQ==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/auth-interop-types": "0.2.4", + "@firebase/component": "0.6.18", + "@firebase/logger": "0.4.4", + "@firebase/util": "1.12.1", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/database": { + "version": "1.0.20", + "resolved": "https://registry.npmjs.org/@firebase/database/-/database-1.0.20.tgz", + "integrity": "sha512-H9Rpj1pQ1yc9+4HQOotFGLxqAXwOzCHsRSRjcQFNOr8lhUt6LeYjf0NSRL04sc4X0dWe8DsCvYKxMYvFG/iOJw==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/app-check-interop-types": "0.3.3", + "@firebase/auth-interop-types": "0.2.4", + "@firebase/component": "0.6.18", + "@firebase/logger": "0.4.4", + "@firebase/util": "1.12.1", + "faye-websocket": "0.11.4", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@firebase/database-compat": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@firebase/database-compat/-/database-compat-2.0.11.tgz", + "integrity": "sha512-itEsHARSsYS95+udF/TtIzNeQ0Uhx4uIna0sk4E0wQJBUnLc/G1X6D7oRljoOuwwCezRLGvWBRyNrugv/esOEw==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.6.18", + "@firebase/database": "1.0.20", + "@firebase/database-types": "1.0.15", + "@firebase/logger": "0.4.4", + "@firebase/util": "1.12.1", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@firebase/database-types": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-1.0.15.tgz", + "integrity": "sha512-XWHJ0VUJ0k2E9HDMlKxlgy/ZuTa9EvHCGLjaKSUvrQnwhgZuRU5N3yX6SZ+ftf2hTzZmfRkv+b3QRvGg40bKNw==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/app-types": "0.9.3", + "@firebase/util": "1.12.1" + } + }, + "node_modules/@firebase/firestore": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/@firebase/firestore/-/firestore-4.8.0.tgz", + "integrity": "sha512-QSRk+Q1/CaabKyqn3C32KSFiOdZpSqI9rpLK5BHPcooElumOBooPFa6YkDdiT+/KhJtel36LdAacha9BptMj2A==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.6.18", + "@firebase/logger": "0.4.4", + "@firebase/util": "1.12.1", + "@firebase/webchannel-wrapper": "1.0.3", + "@grpc/grpc-js": "~1.9.0", + "@grpc/proto-loader": "^0.7.8", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/firestore-compat": { + "version": "0.3.53", + "resolved": "https://registry.npmjs.org/@firebase/firestore-compat/-/firestore-compat-0.3.53.tgz", + "integrity": "sha512-qI3yZL8ljwAYWrTousWYbemay2YZa+udLWugjdjju2KODWtLG94DfO4NALJgPLv8CVGcDHNFXoyQexdRA0Cz8Q==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.6.18", + "@firebase/firestore": "4.8.0", + "@firebase/firestore-types": "3.0.3", + "@firebase/util": "1.12.1", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/firestore-types": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@firebase/firestore-types/-/firestore-types-3.0.3.tgz", + "integrity": "sha512-hD2jGdiWRxB/eZWF89xcK9gF8wvENDJkzpVFb4aGkzfEaKxVRD1kjz1t1Wj8VZEp2LCB53Yx1zD8mrhQu87R6Q==", + "license": "Apache-2.0", + "peerDependencies": { + "@firebase/app-types": "0.x", + "@firebase/util": "1.x" + } + }, + "node_modules/@firebase/functions": { + "version": "0.12.9", + "resolved": "https://registry.npmjs.org/@firebase/functions/-/functions-0.12.9.tgz", + "integrity": "sha512-FG95w6vjbUXN84Ehezc2SDjGmGq225UYbHrb/ptkRT7OTuCiQRErOQuyt1jI1tvcDekdNog+anIObihNFz79Lg==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/app-check-interop-types": "0.3.3", + "@firebase/auth-interop-types": "0.2.4", + "@firebase/component": "0.6.18", + "@firebase/messaging-interop-types": "0.2.3", + "@firebase/util": "1.12.1", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/functions-compat": { + "version": "0.3.26", + "resolved": "https://registry.npmjs.org/@firebase/functions-compat/-/functions-compat-0.3.26.tgz", + "integrity": "sha512-A798/6ff5LcG2LTWqaGazbFYnjBW8zc65YfID/en83ALmkhu2b0G8ykvQnLtakbV9ajrMYPn7Yc/XcYsZIUsjA==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.6.18", + "@firebase/functions": "0.12.9", + "@firebase/functions-types": "0.6.3", + "@firebase/util": "1.12.1", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/functions-types": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/@firebase/functions-types/-/functions-types-0.6.3.tgz", + "integrity": "sha512-EZoDKQLUHFKNx6VLipQwrSMh01A1SaL3Wg6Hpi//x6/fJ6Ee4hrAeswK99I5Ht8roiniKHw4iO0B1Oxj5I4plg==", + "license": "Apache-2.0" + }, + "node_modules/@firebase/installations": { + "version": "0.6.18", + "resolved": "https://registry.npmjs.org/@firebase/installations/-/installations-0.6.18.tgz", + "integrity": "sha512-NQ86uGAcvO8nBRwVltRL9QQ4Reidc/3whdAasgeWCPIcrhOKDuNpAALa6eCVryLnK14ua2DqekCOX5uC9XbU/A==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.6.18", + "@firebase/util": "1.12.1", + "idb": "7.1.1", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/installations-compat": { + "version": "0.2.18", + "resolved": "https://registry.npmjs.org/@firebase/installations-compat/-/installations-compat-0.2.18.tgz", + "integrity": "sha512-aLFohRpJO5kKBL/XYL4tN+GdwEB/Q6Vo9eZOM/6Kic7asSUgmSfGPpGUZO1OAaSRGwF4Lqnvi1f/f9VZnKzChw==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.6.18", + "@firebase/installations": "0.6.18", + "@firebase/installations-types": "0.5.3", + "@firebase/util": "1.12.1", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/installations-types": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/@firebase/installations-types/-/installations-types-0.5.3.tgz", + "integrity": "sha512-2FJI7gkLqIE0iYsNQ1P751lO3hER+Umykel+TkLwHj6plzWVxqvfclPUZhcKFVQObqloEBTmpi2Ozn7EkCABAA==", + "license": "Apache-2.0", + "peerDependencies": { + "@firebase/app-types": "0.x" + } + }, + "node_modules/@firebase/logger": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.4.4.tgz", + "integrity": "sha512-mH0PEh1zoXGnaR8gD1DeGeNZtWFKbnz9hDO91dIml3iou1gpOnLqXQ2dJfB71dj6dpmUjcQ6phY3ZZJbjErr9g==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@firebase/messaging": { + "version": "0.12.22", + "resolved": "https://registry.npmjs.org/@firebase/messaging/-/messaging-0.12.22.tgz", + "integrity": "sha512-GJcrPLc+Hu7nk+XQ70Okt3M1u1eRr2ZvpMbzbc54oTPJZySHcX9ccZGVFcsZbSZ6o1uqumm8Oc7OFkD3Rn1/og==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.6.18", + "@firebase/installations": "0.6.18", + "@firebase/messaging-interop-types": "0.2.3", + "@firebase/util": "1.12.1", + "idb": "7.1.1", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/messaging-compat": { + "version": "0.2.22", + "resolved": "https://registry.npmjs.org/@firebase/messaging-compat/-/messaging-compat-0.2.22.tgz", + "integrity": "sha512-5ZHtRnj6YO6f/QPa/KU6gryjmX4Kg33Kn4gRpNU6M1K47Gm8kcQwPkX7erRUYEH1mIWptfvjvXMHWoZaWjkU7A==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.6.18", + "@firebase/messaging": "0.12.22", + "@firebase/util": "1.12.1", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/messaging-interop-types": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@firebase/messaging-interop-types/-/messaging-interop-types-0.2.3.tgz", + "integrity": "sha512-xfzFaJpzcmtDjycpDeCUj0Ge10ATFi/VHVIvEEjDNc3hodVBQADZ7BWQU7CuFpjSHE+eLuBI13z5F/9xOoGX8Q==", + "license": "Apache-2.0" + }, + "node_modules/@firebase/performance": { + "version": "0.7.7", + "resolved": "https://registry.npmjs.org/@firebase/performance/-/performance-0.7.7.tgz", + "integrity": "sha512-JTlTQNZKAd4+Q5sodpw6CN+6NmwbY72av3Lb6wUKTsL7rb3cuBIhQSrslWbVz0SwK3x0ZNcqX24qtRbwKiv+6w==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.6.18", + "@firebase/installations": "0.6.18", + "@firebase/logger": "0.4.4", + "@firebase/util": "1.12.1", + "tslib": "^2.1.0", + "web-vitals": "^4.2.4" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/performance-compat": { + "version": "0.2.20", + "resolved": "https://registry.npmjs.org/@firebase/performance-compat/-/performance-compat-0.2.20.tgz", + "integrity": "sha512-XkFK5NmOKCBuqOKWeRgBUFZZGz9SzdTZp4OqeUg+5nyjapTiZ4XoiiUL8z7mB2q+63rPmBl7msv682J3rcDXIQ==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.6.18", + "@firebase/logger": "0.4.4", + "@firebase/performance": "0.7.7", + "@firebase/performance-types": "0.2.3", + "@firebase/util": "1.12.1", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/performance-types": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@firebase/performance-types/-/performance-types-0.2.3.tgz", + "integrity": "sha512-IgkyTz6QZVPAq8GSkLYJvwSLr3LS9+V6vNPQr0x4YozZJiLF5jYixj0amDtATf1X0EtYHqoPO48a9ija8GocxQ==", + "license": "Apache-2.0" + }, + "node_modules/@firebase/remote-config": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/@firebase/remote-config/-/remote-config-0.6.5.tgz", + "integrity": "sha512-fU0c8HY0vrVHwC+zQ/fpXSqHyDMuuuglV94VF6Yonhz8Fg2J+KOowPGANM0SZkLvVOYpTeWp3ZmM+F6NjwWLnw==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.6.18", + "@firebase/installations": "0.6.18", + "@firebase/logger": "0.4.4", + "@firebase/util": "1.12.1", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/remote-config-compat": { + "version": "0.2.18", + "resolved": "https://registry.npmjs.org/@firebase/remote-config-compat/-/remote-config-compat-0.2.18.tgz", + "integrity": "sha512-YiETpldhDy7zUrnS8e+3l7cNs0sL7+tVAxvVYU0lu7O+qLHbmdtAxmgY+wJqWdW2c9nDvBFec7QiF58pEUu0qQ==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.6.18", + "@firebase/logger": "0.4.4", + "@firebase/remote-config": "0.6.5", + "@firebase/remote-config-types": "0.4.0", + "@firebase/util": "1.12.1", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/remote-config-types": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@firebase/remote-config-types/-/remote-config-types-0.4.0.tgz", + "integrity": "sha512-7p3mRE/ldCNYt8fmWMQ/MSGRmXYlJ15Rvs9Rk17t8p0WwZDbeK7eRmoI1tvCPaDzn9Oqh+yD6Lw+sGLsLg4kKg==", + "license": "Apache-2.0" + }, + "node_modules/@firebase/storage": { + "version": "0.13.14", + "resolved": "https://registry.npmjs.org/@firebase/storage/-/storage-0.13.14.tgz", + "integrity": "sha512-xTq5ixxORzx+bfqCpsh+o3fxOsGoDjC1nO0Mq2+KsOcny3l7beyBhP/y1u5T6mgsFQwI1j6oAkbT5cWdDBx87g==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.6.18", + "@firebase/util": "1.12.1", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/storage-compat": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/@firebase/storage-compat/-/storage-compat-0.3.24.tgz", + "integrity": "sha512-XHn2tLniiP7BFKJaPZ0P8YQXKiVJX+bMyE2j2YWjYfaddqiJnROJYqSomwW6L3Y+gZAga35ONXUJQju6MB6SOQ==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.6.18", + "@firebase/storage": "0.13.14", + "@firebase/storage-types": "0.8.3", + "@firebase/util": "1.12.1", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/storage-types": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/@firebase/storage-types/-/storage-types-0.8.3.tgz", + "integrity": "sha512-+Muk7g9uwngTpd8xn9OdF/D48uiQ7I1Fae7ULsWPuKoCH3HU7bfFPhxtJYzyhjdniowhuDpQcfPmuNRAqZEfvg==", + "license": "Apache-2.0", + "peerDependencies": { + "@firebase/app-types": "0.x", + "@firebase/util": "1.x" + } + }, + "node_modules/@firebase/util": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.12.1.tgz", + "integrity": "sha512-zGlBn/9Dnya5ta9bX/fgEoNC3Cp8s6h+uYPYaDieZsFOAdHP/ExzQ/eaDgxD3GOROdPkLKpvKY0iIzr9adle0w==", + "hasInstallScript": true, + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@firebase/webchannel-wrapper": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@firebase/webchannel-wrapper/-/webchannel-wrapper-1.0.3.tgz", + "integrity": "sha512-2xCRM9q9FlzGZCdgDMJwc0gyUkWFtkosy7Xxr6sFgQwn+wMNIWd7xIvYNauU1r64B5L5rsGKy/n9TKJ0aAFeqQ==", + "license": "Apache-2.0" + }, + "node_modules/@floating-ui/core": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.3.tgz", + "integrity": "sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==", + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.10" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.4.tgz", + "integrity": "sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==", + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.7.3", + "@floating-ui/utils": "^0.2.10" + } + }, + "node_modules/@floating-ui/react-dom": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.6.tgz", + "integrity": "sha512-4JX6rEatQEvlmgU80wZyq9RT96HZJa88q8hp0pBd+LrczeDI4o6uA2M+uvxngVHo4Ihr8uibXxH6+70zhAFrVw==", + "license": "MIT", + "dependencies": { + "@floating-ui/dom": "^1.7.4" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.10.tgz", + "integrity": "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==", + "license": "MIT" + }, + "node_modules/@grpc/grpc-js": { + "version": "1.9.15", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.9.15.tgz", + "integrity": "sha512-nqE7Hc0AzI+euzUwDAy0aY5hCp10r734gMGRdU+qOPX0XSceI2ULrcXB5U2xSc5VkWwalCj4M7GzCAygZl2KoQ==", + "license": "Apache-2.0", + "dependencies": { + "@grpc/proto-loader": "^0.7.8", + "@types/node": ">=12.12.47" + }, + "engines": { + "node": "^8.13.0 || >=10.10.0" + } + }, + "node_modules/@grpc/proto-loader": { + "version": "0.7.15", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.15.tgz", + "integrity": "sha512-tMXdRCfYVixjuFK+Hk0Q1s38gV9zDiDJfWL3h1rv4Qc39oILCu1TRTDt7+fGUI8K4G1Fj125Hx/ru3azECWTyQ==", + "license": "Apache-2.0", + "dependencies": { + "lodash.camelcase": "^4.3.0", + "long": "^5.0.0", + "protobufjs": "^7.2.5", + "yargs": "^17.7.2" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "deprecated": "Use @eslint/config-array instead", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.3", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@inquirer/external-editor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.3.tgz", + "integrity": "sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==", + "dev": true, + "license": "MIT", + "dependencies": { + "chardet": "^2.1.1", + "iconv-lite": "^0.7.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@ionic/core": { + "version": "8.7.2", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.7.2.tgz", + "integrity": "sha512-u1xTJHltvcwiHkwGowQ/uywiUmvszNeR4mXT5JSp1RH6npe8e9doIY9KSzKRrzpWu1T+H0bUwGbhaYg/I/poRA==", + "license": "MIT", + "dependencies": { + "@stencil/core": "4.36.2", + "ionicons": "^8.0.13", + "tslib": "^2.1.0" + } + }, + "node_modules/@ionic/react": { + "version": "8.7.2", + "resolved": "https://registry.npmjs.org/@ionic/react/-/react-8.7.2.tgz", + "integrity": "sha512-HEKZvbrM7O9pjPtrWH48uarm+O84pVbjfc8aSU/PTG4cE+TbYhSW9xMqIAUEpIUxb56bB1B189uDfPI5zBc7Bg==", + "license": "MIT", + "dependencies": { + "@ionic/core": "8.7.2", + "ionicons": "^8.0.13", + "tslib": "*" + }, + "peerDependencies": { + "react": ">=16.8.6", + "react-dom": ">=16.8.6" + } + }, + "node_modules/@ionic/react-router": { + "version": "8.7.2", + "resolved": "https://registry.npmjs.org/@ionic/react-router/-/react-router-8.7.2.tgz", + "integrity": "sha512-URQBIYPWyB1t8s1xQjZn19NCOVFgmFAVwSlAZmemiTDzvU7JGa+rqtjufhUrq7DYbJV7SlgE+YbYwdC34NFJEg==", + "license": "MIT", + "dependencies": { + "@ionic/react": "8.7.2", + "tslib": "*" + }, + "peerDependencies": { + "react": ">=16.8.6", + "react-dom": ">=16.8.6", + "react-router": "^5.0.1", + "react-router-dom": "^5.0.1" + } + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", + "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/console/node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/console/node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/core": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/core/node_modules/@jest/transform": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/core/node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/core/node_modules/jest-haste-map": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/@jest/core/node_modules/jest-regex-util": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/core/node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/core/node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@jest/environment": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/environment/node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-get-type": "^29.6.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers/node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers/node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/globals/node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/pattern": { + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/@jest/pattern/-/pattern-30.0.1.tgz", + "integrity": "sha512-gWp7NfQW27LaBQz3TITS8L7ZCQ0TLvtmI//4OwlQRx4rnWxcPNIYjxZpDcN4+UlGxgm3jS5QPz8IPTCkb59wZA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@types/node": "*", + "jest-regex-util": "30.0.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/reporters/node_modules/@jest/transform": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/reporters/node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/reporters/node_modules/istanbul-lib-instrument": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@jest/reporters/node_modules/jest-haste-map": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/@jest/reporters/node_modules/jest-regex-util": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/reporters/node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/reporters/node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-result/node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer/node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer/node_modules/jest-haste-map": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/@jest/test-sequencer/node_modules/jest-regex-util": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer/node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-30.2.0.tgz", + "integrity": "sha512-XsauDV82o5qXbhalKxD7p4TZYYdwcaEXC77PPD2HixEFF+6YGppjrAAQurTl2ECWcEomHBMMNS9AH3kcCFx8jA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@babel/core": "^7.27.4", + "@jest/types": "30.2.0", + "@jridgewell/trace-mapping": "^0.3.25", + "babel-plugin-istanbul": "^7.0.1", + "chalk": "^4.1.2", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.2.0", + "jest-regex-util": "30.0.1", + "jest-util": "30.2.0", + "micromatch": "^4.0.8", + "pirates": "^4.0.7", + "slash": "^3.0.0", + "write-file-atomic": "^5.0.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/transform/node_modules/babel-plugin-istanbul": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-7.0.1.tgz", + "integrity": "sha512-D8Z6Qm8jCvVXtIRkBnqNHX0zJ37rQcFJ9u8WOS6tkYOsRdHBzypCstaxWiu5ZIlqQtviRYbgnRLSoCEvjqcqbA==", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "workspaces": [ + "test/babel-8" + ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-instrument": "^6.0.2", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@jest/transform/node_modules/istanbul-lib-instrument": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "dependencies": { + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@jest/types": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.2.0.tgz", + "integrity": "sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@jest/pattern": "30.0.1", + "@jest/schemas": "30.0.5", + "@types/istanbul-lib-coverage": "^2.0.6", + "@types/istanbul-reports": "^3.0.4", + "@types/node": "*", + "@types/yargs": "^17.0.33", + "chalk": "^4.1.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/types/node_modules/@jest/schemas": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.0.5.tgz", + "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@sinclair/typebox": "^0.34.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/types/node_modules/@sinclair/typebox": { + "version": "0.34.47", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.47.tgz", + "integrity": "sha512-ZGIBQ+XDvO5JQku9wmwtabcVTHJsgSWAHYtVuM9pBNNR5E88v6Jcj/llpmsjivig5X8A8HHOb4/mbEKPS5EvAw==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@manypkg/find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@manypkg/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.5.5", + "@types/node": "^12.7.1", + "find-up": "^4.1.0", + "fs-extra": "^8.1.0" + } + }, + "node_modules/@manypkg/find-root/node_modules/@types/node": { + "version": "12.20.55", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", + "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@manypkg/find-root/node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/@manypkg/get-packages": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@manypkg/get-packages/-/get-packages-1.1.3.tgz", + "integrity": "sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.5.5", + "@changesets/types": "^4.0.1", + "@manypkg/find-root": "^1.1.0", + "fs-extra": "^8.1.0", + "globby": "^11.0.0", + "read-yaml-file": "^1.1.0" + } + }, + "node_modules/@manypkg/get-packages/node_modules/@changesets/types": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@changesets/types/-/types-4.1.0.tgz", + "integrity": "sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@manypkg/get-packages/node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nrwl/tao": { + "version": "16.1.4", + "resolved": "https://registry.npmjs.org/@nrwl/tao/-/tao-16.1.4.tgz", + "integrity": "sha512-aArX3E7j+foUUzutsrgOc1lh9Rj5LDCAncHlszu0XGgHRO2EHE4qxZHvmgogGEpRf1ojTNAfN72xhVCSjtca/Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "nx": "16.1.4" + }, + "bin": { + "tao": "index.js" + } + }, + "node_modules/@nx/nx-darwin-arm64": { + "version": "16.1.4", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-16.1.4.tgz", + "integrity": "sha512-0eITl+18xLtdiAVlv+LRukCHBLSLk8L8OkMnfLoK286sIblK31p2pzr1jL68ILUWPGGbdgo+nDEaaDTwh4tYRA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-darwin-x64": { + "version": "16.1.4", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-16.1.4.tgz", + "integrity": "sha512-owgIq/KsCU/QBK6Y7FsblnPPI0oSccJXaISKbPcCWnkD38rtUkaR99Eh2LvoUpcnvvpL0yldkkdMBzVvDwOSZg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-linux-arm-gnueabihf": { + "version": "16.1.4", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-16.1.4.tgz", + "integrity": "sha512-TqphSqAvQcgu83hE/XvJfGALq6EFqfRROct92whj+K5sz/AH67jnFPW+cHnXDwqIlgRB3lj/DFVqlNED8pBHfg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-linux-arm64-gnu": { + "version": "16.1.4", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-16.1.4.tgz", + "integrity": "sha512-0AmO57zf5+ZrIa9XIkmRSbPF/gMqDNlMtMj8q1S+uYRU+WOAW+k1RbcFKdN0voH5eBDVQ03sqkgj9wTNS/m/vQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-linux-arm64-musl": { + "version": "16.1.4", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-16.1.4.tgz", + "integrity": "sha512-10zAgZP+xh7HwyfDJyiyjAQD2gjvb4ZfCDAOE2Boe5yYcD27SqwAIzgrCc4DjRbUWSdufA4rclyXXp2tSb3uyA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-linux-x64-gnu": { + "version": "16.1.4", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-16.1.4.tgz", + "integrity": "sha512-vVea3E6uHvrVieaOHIXKziN/vMbn9g2caiE4N7WiuAPrp2t4jbhtYqcQoNeNVjl92trQu/l2Ma3knmbn75J7jA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-linux-x64-musl": { + "version": "16.1.4", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-16.1.4.tgz", + "integrity": "sha512-HhJPPU0rBzGeqTrylEjOu190rnMvA0HK7nghyEtTGhdCcTRs1ulfgl6swjAjXtXtGA/rXXkk0IKI7luGBcH6zg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-win32-arm64-msvc": { + "version": "16.1.4", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-16.1.4.tgz", + "integrity": "sha512-+iaU0yXkgF0Y5fvWFPP2cziDvd+QjQDnhk7/+i9Nk1C8vOaNHkMjx6qL2dNO2qoT49qMhjnI/hzL7+FBVPh11w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-win32-x64-msvc": { + "version": "16.1.4", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-16.1.4.tgz", + "integrity": "sha512-s+H59UBB/dtdvZ+KWCe2PrVWZyoxsl6Vx+hzdUvCwI8f+cZmLRblTThLhUaBgdWLVqzFPemTkWIUasiRx/+3PQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@parcel/watcher": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.0.4.tgz", + "integrity": "sha512-cTDi+FUDBIUOBKEtj+nhiJ71AZVlkAsQFuGQTun5tV9mwQBQgZvhCzG+URPQc8myeN32yRVZEfVAPCs1RW+Jvg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "node-addon-api": "^3.2.1", + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@pkgr/utils": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.4.2.tgz", + "integrity": "sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "fast-glob": "^3.3.0", + "is-glob": "^4.0.3", + "open": "^9.1.0", + "picocolors": "^1.0.0", + "tslib": "^2.6.0" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/@pkgr/utils/node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@pkgr/utils/node_modules/open": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/open/-/open-9.1.0.tgz", + "integrity": "sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==", + "dev": true, + "license": "MIT", + "dependencies": { + "default-browser": "^4.0.0", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", + "license": "BSD-3-Clause" + }, + "node_modules/@radix-ui/primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.0.1.tgz", + "integrity": "sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10" + } + }, + "node_modules/@radix-ui/react-arrow": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.0.3.tgz", + "integrity": "sha512-wSP+pHsB/jQRaL6voubsQ/ZlrGBHHrOjmBnr19hxYgtS0WvAFwZhK2WP/YY5yF9uKECCEEDGxuLxq1NBK51wFA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-primitive": "1.0.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-compose-refs": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.0.1.tgz", + "integrity": "sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-context": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.0.1.tgz", + "integrity": "sha512-ebbrdFoYTcuZ0v4wG5tedGnp9tzcV8awzsxYph7gXUyvnNLuTIcCk1q17JEbnVhXAKG9oX3KtchwiMIAYp9NLg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dismissable-layer": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.0.5.tgz", + "integrity": "sha512-aJeDjQhywg9LBu2t/At58hCvr7pEm0o2Ke1x33B+MhjNmmZ17sy4KImo0KPLgsnc/zN7GPdce8Cnn0SWvwZO7g==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.1", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-use-callback-ref": "1.0.1", + "@radix-ui/react-use-escape-keydown": "1.0.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-guards": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.0.1.tgz", + "integrity": "sha512-Rect2dWbQ8waGzhMavsIbmSVCgYxkXLxxR3ZvCX79JOglzdEy4JXMb98lq4hPxUbLr77nP0UOGf4rcMU+s1pUA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-scope": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.0.4.tgz", + "integrity": "sha512-sL04Mgvf+FmyvZeYfNu1EPAaaxD+aw7cYeIB9L9Fvq8+urhltTRaEo5ysKOpHuKPclsZcSUMKlN05x4u+CINpA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-use-callback-ref": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-id": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.0.1.tgz", + "integrity": "sha512-tI7sT/kqYp8p96yGWY1OAnLHrqDgzHefRBKQ2YAkBS5ja7QLcZ9Z/uY7bEjPUatf8RomoXM8/1sMj1IJaE5UzQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-use-layout-effect": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popover": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.0.7.tgz", + "integrity": "sha512-shtvVnlsxT6faMnK/a7n0wptwBD23xc1Z5mdrtKLwVEfsEMXodS0r5s0/g5P0hX//EKYZS2sxUjqfzlg52ZSnQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.1", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-context": "1.0.1", + "@radix-ui/react-dismissable-layer": "1.0.5", + "@radix-ui/react-focus-guards": "1.0.1", + "@radix-ui/react-focus-scope": "1.0.4", + "@radix-ui/react-id": "1.0.1", + "@radix-ui/react-popper": "1.1.3", + "@radix-ui/react-portal": "1.0.4", + "@radix-ui/react-presence": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-slot": "1.0.2", + "@radix-ui/react-use-controllable-state": "1.0.1", + "aria-hidden": "^1.1.1", + "react-remove-scroll": "2.5.5" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popper": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.1.3.tgz", + "integrity": "sha512-cKpopj/5RHZWjrbF2846jBNacjQVwkP068DfmgrNJXpvVWrOvlAmE9xSiy5OqeE+Gi8D9fP+oDhUnPqNMY8/5w==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@floating-ui/react-dom": "^2.0.0", + "@radix-ui/react-arrow": "1.0.3", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-context": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-use-callback-ref": "1.0.1", + "@radix-ui/react-use-layout-effect": "1.0.1", + "@radix-ui/react-use-rect": "1.0.1", + "@radix-ui/react-use-size": "1.0.1", + "@radix-ui/rect": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-portal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.0.4.tgz", + "integrity": "sha512-Qki+C/EuGUVCQTOTD5vzJzJuMUlewbzuKyUy+/iHM2uwGiru9gZeBJtHAPKAEkB5KWGi9mP/CHKcY0wt1aW45Q==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-primitive": "1.0.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-presence": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.0.1.tgz", + "integrity": "sha512-UXLW4UAbIY5ZjcvzjfRFo5gxva8QirC9hF7wRE4U5gz+TP0DbRk+//qyuAQ1McDxBt1xNMBTaciFGvEmJvAZCg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-use-layout-effect": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-primitive": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-1.0.3.tgz", + "integrity": "sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-slot": "1.0.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-slot": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.0.2.tgz", + "integrity": "sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.0.1.tgz", + "integrity": "sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.0.1.tgz", + "integrity": "sha512-Svl5GY5FQeN758fWKrjM6Qb7asvXeiZltlT4U2gVfl8Gx5UAv2sMR0LWo8yhsIZh2oQ0eFdZ59aoOOMV7b47VA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-use-callback-ref": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-escape-keydown": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.0.3.tgz", + "integrity": "sha512-vyL82j40hcFicA+M4Ex7hVkB9vHgSse1ZWomAqV2Je3RleKGO5iM8KMOEtfoSB0PnIelMd2lATjTGMYqN5ylTg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-use-callback-ref": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.0.1.tgz", + "integrity": "sha512-v/5RegiJWYdoCvMnITBkNNx6bCj20fiaJnWtRkU18yITptraXjffz5Qbn05uOiQnOvi+dbkznkoaMltz1GnszQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-rect": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.0.1.tgz", + "integrity": "sha512-Cq5DLuSiuYVKNU8orzJMbl15TXilTnJKUCltMVQg53BQOF1/C5toAaGrowkgksdBQ9H+SRL23g0HDmg9tvmxXw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/rect": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-size": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.0.1.tgz", + "integrity": "sha512-ibay+VqrgcaI6veAojjofPATwledXiSmX+C0KrBk/xgpX9rBzPV3OsfwlhQdUOFbh+LKQorLYT+xTXW9V8yd0g==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-use-layout-effect": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/rect": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.0.1.tgz", + "integrity": "sha512-fyrgCaedtvMg9NK3en0pnOYJdtfwxUcNolezkNPUsoX57X8oQk+NkqcvzHXD2uKNij6GXmWU9NDru2IWjrO4BQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.55.1.tgz", + "integrity": "sha512-9R0DM/ykwfGIlNu6+2U09ga0WXeZ9MRC2Ter8jnz8415VbuIykVuc6bhdrbORFZANDmTDvq26mJrEVTl8TdnDg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.55.1.tgz", + "integrity": "sha512-eFZCb1YUqhTysgW3sj/55du5cG57S7UTNtdMjCW7LwVcj3dTTcowCsC8p7uBdzKsZYa8J7IDE8lhMI+HX1vQvg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.34.9", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.34.9.tgz", + "integrity": "sha512-0CY3/K54slrzLDjOA7TOjN1NuLKERBgk9nY5V34mhmuu673YNb+7ghaDUs6N0ujXR7fz5XaS5Aa6d2TNxZd0OQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.34.9", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.34.9.tgz", + "integrity": "sha512-eOojSEAi/acnsJVYRxnMkPFqcxSMFfrw7r2iD9Q32SGkb/Q9FpUY1UlAu1DH9T7j++gZ0lHjnm4OyH2vCI7l7Q==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.55.1.tgz", + "integrity": "sha512-+JiU7Jbp5cdxekIgdte0jfcu5oqw4GCKr6i3PJTlXTCU5H5Fvtkpbs4XJHRmWNXF+hKmn4v7ogI5OQPaupJgOg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.55.1.tgz", + "integrity": "sha512-V5xC1tOVWtLLmr3YUk2f6EJK4qksksOYiz/TCsFHu/R+woubcLWdC9nZQmwjOAbmExBIVKsm1/wKmEy4z4u4Bw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.55.1.tgz", + "integrity": "sha512-Rn3n+FUk2J5VWx+ywrG/HGPTD9jXNbicRtTM11e/uorplArnXZYsVifnPPqNNP5BsO3roI4n8332ukpY/zN7rQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.55.1.tgz", + "integrity": "sha512-grPNWydeKtc1aEdrJDWk4opD7nFtQbMmV7769hiAaYyUKCT1faPRm2av8CX1YJsZ4TLAZcg9gTR1KvEzoLjXkg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.34.9", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.34.9.tgz", + "integrity": "sha512-6TZjPHjKZUQKmVKMUowF3ewHxctrRR09eYyvT5eFv8w/fXarEra83A2mHTVJLA5xU91aCNOUnM+DWFMSbQ0Nxw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.34.9", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.34.9.tgz", + "integrity": "sha512-LD2fytxZJZ6xzOKnMbIpgzFOuIKlxVOpiMAXawsAZ2mHBPEYOnLRK5TTEsID6z4eM23DuO88X0Tq1mErHMVq0A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.55.1.tgz", + "integrity": "sha512-r3Wv40in+lTsULSb6nnoudVbARdOwb2u5fpeoOAZjFLznp6tDU8kd+GTHmJoqZ9lt6/Sys33KdIHUaQihFcu7g==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.55.1.tgz", + "integrity": "sha512-MR8c0+UxAlB22Fq4R+aQSPBayvYa3+9DrwG/i1TKQXFYEaoW3B5b/rkSRIypcZDdWjWnpcvxbNaAJDcSbJU3Lw==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.55.1.tgz", + "integrity": "sha512-3KhoECe1BRlSYpMTeVrD4sh2Pw2xgt4jzNSZIIPLFEsnQn9gAnZagW9+VqDqAHgm1Xc77LzJOo2LdigS5qZ+gw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.55.1.tgz", + "integrity": "sha512-ziR1OuZx0vdYZZ30vueNZTg73alF59DicYrPViG0NEgDVN8/Jl87zkAPu4u6VjZST2llgEUjaiNl9JM6HH1Vdw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.55.1.tgz", + "integrity": "sha512-uW0Y12ih2XJRERZ4jAfKamTyIHVMPQnTZcQjme2HMVDAHY4amf5u414OqNYC+x+LzRdRcnIG1YodLrrtA8xsxw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.55.1.tgz", + "integrity": "sha512-u9yZ0jUkOED1BFrqu3BwMQoixvGHGZ+JhJNkNKY/hyoEgOwlqKb62qu+7UjbPSHYjiVy8kKJHvXKv5coH4wDeg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.55.1.tgz", + "integrity": "sha512-/0PenBCmqM4ZUd0190j7J0UsQ/1nsi735iPRakO8iPciE7BQ495Y6msPzaOmvx0/pn+eJVVlZrNrSh4WSYLxNg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.34.9", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.34.9.tgz", + "integrity": "sha512-FwBHNSOjUTQLP4MG7y6rR6qbGw4MFeQnIBrMe161QGaQoBQLqSUEKlHIiVgF3g/mb3lxlxzJOpIBhaP+C+KP2A==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.34.9", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.34.9.tgz", + "integrity": "sha512-cYRpV4650z2I3/s6+5/LONkjIz8MBeqrk+vPXV10ORBnshpn8S32bPqQ2Utv39jCiDcO2eJTuSlPXpnvmaIgRA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.55.1.tgz", + "integrity": "sha512-eLXw0dOiqE4QmvikfQ6yjgkg/xDM+MdU9YJuP4ySTibXU0oAvnEWXt7UDJmD4UkYialMfOGFPJnIHSe/kdzPxg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.55.1.tgz", + "integrity": "sha512-xzm44KgEP11te3S2HCSyYf5zIzWmx3n8HDCc7EE59+lTcswEWNpvMLfd9uJvVX8LCg9QWG67Xt75AuHn4vgsXw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.34.9", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.34.9.tgz", + "integrity": "sha512-z4mQK9dAN6byRA/vsSgQiPeuO63wdiDxZ9yg9iyX2QTzKuQM7T4xlBoeUP/J8uiFkqxkcWndWi+W7bXdPbt27Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.55.1.tgz", + "integrity": "sha512-3fZBidchE0eY0oFZBnekYCfg+5wAB0mbpCBuofh5mZuzIU/4jIVkbESmd2dOsFNS78b53CYv3OAtwqkZZmU5nA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.55.1.tgz", + "integrity": "sha512-xGGY5pXj69IxKb4yv/POoocPy/qmEGhimy/FoTpTSVju3FYXUQQMFCaZZXJVidsmGxRioZAwpThl/4zX41gRKg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.34.9", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.34.9.tgz", + "integrity": "sha512-AyleYRPU7+rgkMWbEh71fQlrzRfeP6SyMnRf9XX4fCdDPAJumdSBqYEcWPMzVQ4ScAl7E4oFfK0GUVn77xSwbw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/@stencil/core": { + "version": "4.36.2", + "resolved": "https://registry.npmjs.org/@stencil/core/-/core-4.36.2.tgz", + "integrity": "sha512-PRFSpxNzX9Oi0Wfh02asztN9Sgev/MacfZwmd+VVyE6ZxW+a/kEpAYZhzGAmE+/aKVOGYuug7R9SulanYGxiDQ==", + "license": "MIT", + "bin": { + "stencil": "bin/stencil" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.10.0" + }, + "optionalDependencies": { + "@rollup/rollup-darwin-arm64": "4.34.9", + "@rollup/rollup-darwin-x64": "4.34.9", + "@rollup/rollup-linux-arm64-gnu": "4.34.9", + "@rollup/rollup-linux-arm64-musl": "4.34.9", + "@rollup/rollup-linux-x64-gnu": "4.34.9", + "@rollup/rollup-linux-x64-musl": "4.34.9", + "@rollup/rollup-win32-arm64-msvc": "4.34.9", + "@rollup/rollup-win32-x64-msvc": "4.34.9" + } + }, + "node_modules/@tanstack/query-async-storage-persister": { + "version": "5.90.18", + "resolved": "https://registry.npmjs.org/@tanstack/query-async-storage-persister/-/query-async-storage-persister-5.90.18.tgz", + "integrity": "sha512-vCZHpodK3N7MQuRGi79YB/+steiAJnCWD78VbVl79+ysoFHsbD85UX+x40uTicXxml5E2kmxn7Yb4Kbwh6TpLQ==", + "license": "MIT", + "dependencies": { + "@tanstack/query-core": "5.90.16", + "@tanstack/query-persist-client-core": "5.91.15" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tanstack/query-core": { + "version": "5.90.16", + "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.90.16.tgz", + "integrity": "sha512-MvtWckSVufs/ja463/K4PyJeqT+HMlJWtw6PrCpywznd2NSgO3m4KwO9RqbFqGg6iDE8vVMFWMeQI4Io3eEYww==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tanstack/query-devtools": { + "version": "5.92.0", + "resolved": "https://registry.npmjs.org/@tanstack/query-devtools/-/query-devtools-5.92.0.tgz", + "integrity": "sha512-N8D27KH1vEpVacvZgJL27xC6yPFUy0Zkezn5gnB3L3gRCxlDeSuiya7fKge8Y91uMTnC8aSxBQhcK6ocY7alpQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tanstack/query-persist-client-core": { + "version": "5.91.15", + "resolved": "https://registry.npmjs.org/@tanstack/query-persist-client-core/-/query-persist-client-core-5.91.15.tgz", + "integrity": "sha512-vnPSfQVo41EKJN8v20nkhWNZPyB1dMJIy5icOvCGzcCJzsmRefYY1owtr63ICOcjOiPPTuNEfPsdjdBhkzYnmA==", + "license": "MIT", + "dependencies": { + "@tanstack/query-core": "5.90.16" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tanstack/query-sync-storage-persister": { + "version": "5.90.18", + "resolved": "https://registry.npmjs.org/@tanstack/query-sync-storage-persister/-/query-sync-storage-persister-5.90.18.tgz", + "integrity": "sha512-tKngFopz/TuAe7LBDg7IOhWPh9blxdQ6QG/vVL2dFzRmlPNcSo4WdCSONqSDioJkcyTwh1YCSlcikmJ1WnSb3Q==", + "license": "MIT", + "dependencies": { + "@tanstack/query-core": "5.90.16", + "@tanstack/query-persist-client-core": "5.91.15" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tanstack/react-query": { + "version": "5.90.16", + "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.90.16.tgz", + "integrity": "sha512-bpMGOmV4OPmif7TNMteU/Ehf/hoC0Kf98PDc0F4BZkFrEapRMEqI/V6YS0lyzwSV6PQpY1y4xxArUIfBW5LVxQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "@tanstack/query-core": "5.90.16" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": "^18 || ^19" + } + }, + "node_modules/@tanstack/react-query-devtools": { + "version": "5.91.2", + "resolved": "https://registry.npmjs.org/@tanstack/react-query-devtools/-/react-query-devtools-5.91.2.tgz", + "integrity": "sha512-ZJ1503ay5fFeEYFUdo7LMNFzZryi6B0Cacrgr2h1JRkvikK1khgIq6Nq2EcblqEdIlgB/r7XDW8f8DQ89RuUgg==", + "license": "MIT", + "dependencies": { + "@tanstack/query-devtools": "5.92.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "@tanstack/react-query": "^5.90.14", + "react": "^18 || ^19" + } + }, + "node_modules/@tanstack/react-query-persist-client": { + "version": "5.90.18", + "resolved": "https://registry.npmjs.org/@tanstack/react-query-persist-client/-/react-query-persist-client-5.90.18.tgz", + "integrity": "sha512-ToVRTVpjzTrd9S/p7JIvGdLs+Xtz9aDMM/7+TQGSV9notY8Jt64irfAAAkZ05syftLKS+3KPgyKAnHcVeKVbWQ==", + "license": "MIT", + "dependencies": { + "@tanstack/query-persist-client-core": "5.91.15" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "@tanstack/react-query": "^5.90.16", + "react": "^18 || ^19" + } + }, + "node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/@traversable/json": { + "version": "0.0.52", + "resolved": "https://registry.npmjs.org/@traversable/json/-/json-0.0.52.tgz", + "integrity": "sha512-QddhvjiJULZw6z/OhHE0YchZfKr1LRvRvs5dZqGpYb0UB3GpWSn/2fIJjYTOCT0pG95QhuxexPpKky6eihFBLA==", + "license": "MIT", + "peer": true, + "peerDependencies": { + "@traversable/registry": "^0.0.49", + "fast-check": "3 - 4" + }, + "peerDependenciesMeta": { + "@traversable/registry": { + "optional": false + }, + "fast-check": { + "optional": true + } + } + }, + "node_modules/@traversable/registry": { + "version": "0.0.49", + "resolved": "https://registry.npmjs.org/@traversable/registry/-/registry-0.0.49.tgz", + "integrity": "sha512-uof62gHhyf5MebDkjQMeJj1yIAQkCbCcJYl848b4A+jFnUXxo2NUuHi0NIZOeG3r+XgNSF4MapDED89tFM6iLA==", + "license": "MIT", + "peer": true + }, + "node_modules/@traversable/zod": { + "version": "0.0.57", + "resolved": "https://registry.npmjs.org/@traversable/zod/-/zod-0.0.57.tgz", + "integrity": "sha512-oOSaBQitiav6QrwPZFF8GY1J2VDKDeA/GQTgsi2E6D8dn6V+5jcji+Qp2zRz6XDGUzfJy+Xda+2LqzwDT2G8nA==", + "license": "MIT", + "dependencies": { + "@traversable/json": "^0.0.52", + "@traversable/registry": "^0.0.49", + "@traversable/zod-types": "^0.0.30" + }, + "peerDependencies": { + "zod": "4" + }, + "peerDependenciesMeta": { + "zod": { + "optional": false + } + } + }, + "node_modules/@traversable/zod-types": { + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/@traversable/zod-types/-/zod-types-0.0.30.tgz", + "integrity": "sha512-BbVyKLvxNpuVouwkLGf7NRNUuMauJBZFr3z4Qy1KZgiAFEryXTLZfJV1Sf98k+naDDj6zaHQD66NsTUTQ7upqw==", + "license": "MIT", + "peerDependencies": { + "@traversable/json": "^0.0.52", + "@traversable/registry": "^0.0.49", + "zod": "4" + }, + "peerDependenciesMeta": { + "@traversable/json": { + "optional": false + }, + "@traversable/registry": { + "optional": false + }, + "zod": { + "optional": false + } + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/history": { + "version": "4.7.11", + "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz", + "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jest": { + "version": "29.5.14", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.14.tgz", + "integrity": "sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + } + }, + "node_modules/@types/jsdom": { + "version": "20.0.1", + "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-20.0.1.tgz", + "integrity": "sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/tough-cookie": "*", + "parse5": "^7.0.0" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "18.19.130", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.130.tgz", + "integrity": "sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==", + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/prop-types": { + "version": "15.7.15", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", + "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "18.3.27", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.27.tgz", + "integrity": "sha512-cisd7gxkzjBKU2GgdYrTdtQx1SORymWyaAFhaxQPK9bYO9ot3Y5OikQRvY0VYQtvwjeQnizCINJAenh/V7MK2w==", + "devOptional": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.3.7", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz", + "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", + "devOptional": true, + "license": "MIT", + "peer": true, + "peerDependencies": { + "@types/react": "^18.0.0" + } + }, + "node_modules/@types/react-router": { + "version": "5.1.20", + "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.20.tgz", + "integrity": "sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*" + } + }, + "node_modules/@types/react-router-dom": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.3.tgz", + "integrity": "sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router": "*" + } + }, + "node_modules/@types/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/tough-cookie": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", + "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/yargs": { + "version": "17.0.35", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz", + "integrity": "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", + "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/type-utils": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", + "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "dependencies": { + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", + "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/typescript-estree": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "dev": true, + "license": "ISC" + }, + "node_modules/@vitest/expect": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.6.1.tgz", + "integrity": "sha512-jXL+9+ZNIJKruofqXuuTClf44eSpcHlgj3CiuNihUF3Ioujtmc0zIa3UJOW5RjDK1YLBJZnWBlPuqhYycLioog==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "1.6.1", + "@vitest/utils": "1.6.1", + "chai": "^4.3.10" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-1.6.1.tgz", + "integrity": "sha512-3nSnYXkVkf3mXFfE7vVyPmi3Sazhb/2cfZGGs0JRzFsPFvAMBEcrweV1V1GsrstdXeKCTXlJbvnQwGWgEIHmOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "1.6.1", + "p-limit": "^5.0.0", + "pathe": "^1.1.1" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner/node_modules/p-limit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-5.0.0.tgz", + "integrity": "sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@vitest/snapshot": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.6.1.tgz", + "integrity": "sha512-WvidQuWAzU2p95u8GAKlRMqMyN1yOJkGHnx3M1PL9Raf7AQ1kwLKg04ADlCa3+OXUZE7BceOhVZiuWAbzCKcUQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "magic-string": "^0.30.5", + "pathe": "^1.1.1", + "pretty-format": "^29.7.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.6.1.tgz", + "integrity": "sha512-MGcMmpGkZebsMZhbQKkAf9CX5zGvjkBTqf8Zx3ApYWXr3wG+QvEu2eXWfnIIWYSJExIp4V9FCKDEeygzkYrXMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyspy": "^2.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.6.1.tgz", + "integrity": "sha512-jOrrUvXM4Av9ZWiG1EajNto0u96kWAhJ1LmPmJhXXQx/32MecEKd10pOLYgS2BQx1TgkGhloPU1ArDW2vvaY6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "diff-sequences": "^29.6.3", + "estree-walker": "^3.0.3", + "loupe": "^2.3.7", + "pretty-format": "^29.7.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@yarnpkg/lockfile": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/@yarnpkg/parsers": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@yarnpkg/parsers/-/parsers-3.0.3.tgz", + "integrity": "sha512-mQZgUSgFurUtA07ceMjxrWkYz8QtDuYkvPlu0ZqncgjopQ0t6CNEo/OSealkmnagSUx8ZD5ewvezUwUuMqutQg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "js-yaml": "^3.10.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=18.12.0" + } + }, + "node_modules/@yarnpkg/parsers/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@yarnpkg/parsers/node_modules/js-yaml": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", + "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@zkochan/js-yaml": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@zkochan/js-yaml/-/js-yaml-0.0.6.tgz", + "integrity": "sha512-nzvgl3VfhcELQ8LyVrYOru+UtAy1nrygk2+AGbTm8a5YcO6o8lSjAT+pfg3vJWxIoZKOUhrK6UU7xW/+00kQrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "deprecated": "Use your platform's native atob() and btoa() methods instead", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "dev": true, + "license": "MIT", + "peer": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-globals": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-7.0.1.tgz", + "integrity": "sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.1.0", + "acorn-walk": "^8.0.2" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/aria-hidden": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz", + "integrity": "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", + "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.0", + "es-object-atoms": "^1.1.1", + "get-intrinsic": "^1.3.0", + "is-string": "^1.1.1", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", + "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-shim-unscopables": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true, + "license": "(MIT OR Apache-2.0)", + "bin": { + "atob": "bin/atob.js" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axios": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.2.tgz", + "integrity": "sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==", + "dev": true, + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.4", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/babel-jest": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-30.2.0.tgz", + "integrity": "sha512-0YiBEOxWqKkSQWL9nNGGEgndoeL0ZpWrbLMNL5u/Kaxrli3Eaxlt3ZtIDktEvXt4L/R9r3ODr2zKwGM/2BjxVw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@jest/transform": "30.2.0", + "@types/babel__core": "^7.20.5", + "babel-plugin-istanbul": "^7.0.1", + "babel-preset-jest": "30.2.0", + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "slash": "^3.0.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.11.0 || ^8.0.0-0" + } + }, + "node_modules/babel-jest/node_modules/babel-plugin-istanbul": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-7.0.1.tgz", + "integrity": "sha512-D8Z6Qm8jCvVXtIRkBnqNHX0zJ37rQcFJ9u8WOS6tkYOsRdHBzypCstaxWiu5ZIlqQtviRYbgnRLSoCEvjqcqbA==", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "workspaces": [ + "test/babel-8" + ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-instrument": "^6.0.2", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/babel-jest/node_modules/istanbul-lib-instrument": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "dependencies": { + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-30.2.0.tgz", + "integrity": "sha512-ftzhzSGMUnOzcCXd6WHdBGMyuwy15Wnn0iyyWGKgBDLxf9/s5ABuraCSpBX2uG0jUg4rqJnxsLc5+oYBqoxVaA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@types/babel__core": "^7.20.5" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz", + "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-import-attributes": "^7.24.7", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5" + }, + "peerDependencies": { + "@babel/core": "^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/babel-preset-jest": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-30.2.0.tgz", + "integrity": "sha512-US4Z3NOieAQumwFnYdUWKvUKh8+YSnS/gB3t6YBiz0bskpu7Pine8pPCheNxlPEW4wnUkma2a94YuW2q3guvCQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "babel-plugin-jest-hoist": "30.2.0", + "babel-preset-current-node-syntax": "^1.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.11.0 || ^8.0.0-beta.1" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "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/baseline-browser-mapping": { + "version": "2.9.14", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.14.tgz", + "integrity": "sha512-B0xUquLkiGLgHhpPBqvl7GWegWBUNuujQ6kXd/r1U38ElPT6Ok8KZ8e+FpUGEc2ZoRQUzq/aUnaKFc/svWUGSg==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, + "node_modules/better-path-resolve": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/better-path-resolve/-/better-path-resolve-1.0.0.tgz", + "integrity": "sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-windows": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/big-integer": { + "version": "1.6.52", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", + "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", + "dev": true, + "license": "Unlicense", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bplist-parser": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz", + "integrity": "sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "big-integer": "^1.6.44" + }, + "engines": { + "node": ">= 5.10.0" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "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" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-json-stable-stringify": "2.x" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "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", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/bundle-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-3.0.0.tgz", + "integrity": "sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "run-applescript": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001763", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001763.tgz", + "integrity": "sha512-mh/dGtq56uN98LlNX9qdbKnzINhX0QzhiWBFEkFfsFO4QyCvL8YegrJAazCwXIeqkIob8BlZPGM3xdnY+sgmvQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/capture-exit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", + "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", + "dev": true, + "license": "ISC", + "dependencies": { + "rsvp": "^4.8.4" + }, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/chai": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.5.0.tgz", + "integrity": "sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.3", + "deep-eql": "^4.1.3", + "get-func-name": "^2.0.2", + "loupe": "^2.3.6", + "pathval": "^1.1.1", + "type-detect": "^4.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chai/node_modules/type-detect": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz", + "integrity": "sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/chardet": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.1.1.tgz", + "integrity": "sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/check-error": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", + "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-func-name": "^2.0.2" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", + "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-descriptor": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz", + "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-spinners": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz", + "integrity": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.3.tgz", + "integrity": "sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==", + "dev": true, + "license": "MIT" + }, + "node_modules/collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/component-emitter": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz", + "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/confbox": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", + "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/confusing-browser-globals": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", + "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", + "dev": true, + "license": "MIT" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/core-js": { + "version": "3.47.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.47.0.tgz", + "integrity": "sha512-c3Q2VVkGAUyupsjRnaNX6u8Dq2vAdzm9iuPj5FW0fRxzlxgq9Q39MDq10IvmQSpLgHQNyQzQmOo6bgGHmH3NNg==", + "hasInstallScript": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-jest/node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-jest/node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/cross-spawn": { + "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", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cssom": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", + "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==", + "dev": true, + "license": "MIT" + }, + "node_modules/cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssom": "~0.3.6" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cssstyle/node_modules/cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true, + "license": "MIT" + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/data-urls": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", + "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "abab": "^2.0.6", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/data-view-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/dataloader": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/dataloader/-/dataloader-1.4.0.tgz", + "integrity": "sha512-68s5jYdlvasItOJnCuI2Q9s4q98g0pCyL3HrcKJu8KNugUl8ahgmZYg38ysLTgQjjXX3H8CJLkAvWrclWfcalw==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decimal.js": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", + "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", + "dev": true, + "license": "MIT" + }, + "node_modules/decode-uri-component": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/dedent": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.1.tgz", + "integrity": "sha512-9JmrhGZpOlEgOLdQgSm0zxFaYoQon408V1v49aqTWuXENVlnCuY9JBZcXZiCsZQWDjTm5Qf/nIvAy77mXDAjEg==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/deep-eql": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.4.tgz", + "integrity": "sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-browser": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-4.0.0.tgz", + "integrity": "sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "bundle-name": "^3.0.0", + "default-browser-id": "^3.0.0", + "execa": "^7.1.1", + "titleize": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-3.0.0.tgz", + "integrity": "sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==", + "dev": true, + "license": "MIT", + "dependencies": { + "bplist-parser": "^0.2.0", + "untildify": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser/node_modules/execa": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz", + "integrity": "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^4.3.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": "^14.18.0 || ^16.14.0 || >=18.0.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/default-browser/node_modules/human-signals": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", + "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/default-browser/node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser/node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser/node_modules/npm-run-path": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser/node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser/node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/detect-indent": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", + "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-node-es": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", + "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==", + "license": "MIT" + }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/domexception": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", + "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", + "deprecated": "Use your platform's native DOMException instead", + "dev": true, + "license": "MIT", + "dependencies": { + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/dotenv": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz", + "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=10" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "dev": true, + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.267", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.267.tgz", + "integrity": "sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==", + "dev": true, + "license": "ISC" + }, + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/end-of-stream": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enquirer": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", + "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-colors": "^4.1.1", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.1.tgz", + "integrity": "sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.2.tgz", + "integrity": "sha512-BrUQ0cPTB/IwXj23HtwHjS9n7O4h9FX94b4xc5zlTHxeLgTAdzYUDyy6KdExAl9lbN5rtfe44xpjpmj9grxs5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.1", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.1.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.3.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "iterator.prototype": "^1.1.5", + "safe-array-concat": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", + "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/esbuild": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.2.tgz", + "integrity": "sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "peer": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.2", + "@esbuild/android-arm": "0.27.2", + "@esbuild/android-arm64": "0.27.2", + "@esbuild/android-x64": "0.27.2", + "@esbuild/darwin-arm64": "0.27.2", + "@esbuild/darwin-x64": "0.27.2", + "@esbuild/freebsd-arm64": "0.27.2", + "@esbuild/freebsd-x64": "0.27.2", + "@esbuild/linux-arm": "0.27.2", + "@esbuild/linux-arm64": "0.27.2", + "@esbuild/linux-ia32": "0.27.2", + "@esbuild/linux-loong64": "0.27.2", + "@esbuild/linux-mips64el": "0.27.2", + "@esbuild/linux-ppc64": "0.27.2", + "@esbuild/linux-riscv64": "0.27.2", + "@esbuild/linux-s390x": "0.27.2", + "@esbuild/linux-x64": "0.27.2", + "@esbuild/netbsd-arm64": "0.27.2", + "@esbuild/netbsd-x64": "0.27.2", + "@esbuild/openbsd-arm64": "0.27.2", + "@esbuild/openbsd-x64": "0.27.2", + "@esbuild/openharmony-arm64": "0.27.2", + "@esbuild/sunos-x64": "0.27.2", + "@esbuild/win32-arm64": "0.27.2", + "@esbuild/win32-ia32": "0.27.2", + "@esbuild/win32-x64": "0.27.2" + } + }, + "node_modules/esbuild-jest": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/esbuild-jest/-/esbuild-jest-0.5.0.tgz", + "integrity": "sha512-AMZZCdEpXfNVOIDvURlqYyHwC8qC1/BFjgsrOiSL1eyiIArVtHL8YAC83Shhn16cYYoAWEW17yZn0W/RJKJKHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.12.17", + "@babel/plugin-transform-modules-commonjs": "^7.12.13", + "babel-jest": "^26.6.3" + }, + "peerDependencies": { + "esbuild": ">=0.8.50" + } + }, + "node_modules/esbuild-jest/node_modules/@jest/transform": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-26.6.2.tgz", + "integrity": "sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.1.0", + "@jest/types": "^26.6.2", + "babel-plugin-istanbul": "^6.0.0", + "chalk": "^4.0.0", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-util": "^26.6.2", + "micromatch": "^4.0.2", + "pirates": "^4.0.1", + "slash": "^3.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "^3.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/esbuild-jest/node_modules/@jest/types": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/esbuild-jest/node_modules/@types/yargs": { + "version": "15.0.20", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.20.tgz", + "integrity": "sha512-KIkX+/GgfFitlASYCGoSF+T4XRXhOubJLhkLVtSfsRTe9jWMmuM2g28zQ41BtPTG7TRBb2xHW+LCNVE9QR/vsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/esbuild-jest/node_modules/babel-jest": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-26.6.3.tgz", + "integrity": "sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/babel__core": "^7.1.7", + "babel-plugin-istanbul": "^6.0.0", + "babel-preset-jest": "^26.6.2", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "slash": "^3.0.0" + }, + "engines": { + "node": ">= 10.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/esbuild-jest/node_modules/babel-plugin-jest-hoist": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.6.2.tgz", + "integrity": "sha512-PO9t0697lNTmcEHH69mdtYiOIkkOlj9fySqfO3K1eCcdISevLAE0xY59VLLUj0SoiPiTX/JU2CYFpILydUa5Lw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.0.0", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/esbuild-jest/node_modules/babel-preset-jest": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-26.6.2.tgz", + "integrity": "sha512-YvdtlVm9t3k777c5NPQIv6cxFFFapys25HiUmuSgHwIZhfifweR5c5Sf5nwE3MAbfu327CYSvps8Yx6ANLyleQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "babel-plugin-jest-hoist": "^26.6.2", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": ">= 10.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/esbuild-jest/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true, + "license": "MIT" + }, + "node_modules/esbuild-jest/node_modules/jest-haste-map": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.6.2.tgz", + "integrity": "sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^26.6.2", + "@types/graceful-fs": "^4.1.2", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.4", + "jest-regex-util": "^26.0.0", + "jest-serializer": "^26.6.2", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", + "micromatch": "^4.0.2", + "sane": "^4.0.3", + "walker": "^1.0.7" + }, + "engines": { + "node": ">= 10.14.2" + }, + "optionalDependencies": { + "fsevents": "^2.1.2" + } + }, + "node_modules/esbuild-jest/node_modules/jest-regex-util": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-26.0.0.tgz", + "integrity": "sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/esbuild-jest/node_modules/jest-util": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz", + "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "is-ci": "^2.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/esbuild-jest/node_modules/jest-worker": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/esbuild-jest/node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/eslint": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-airbnb-base": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz", + "integrity": "sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==", + "dev": true, + "license": "MIT", + "dependencies": { + "confusing-browser-globals": "^1.0.10", + "object.assign": "^4.1.2", + "object.entries": "^1.1.5", + "semver": "^6.3.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "peerDependencies": { + "eslint": "^7.32.0 || ^8.2.0", + "eslint-plugin-import": "^2.25.2" + } + }, + "node_modules/eslint-config-airbnb-base/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-config-airbnb-typescript": { + "version": "17.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-typescript/-/eslint-config-airbnb-typescript-17.1.0.tgz", + "integrity": "sha512-GPxI5URre6dDpJ0CtcthSZVBAfI+Uw7un5OYNVxP2EYi3H81Jw701yFP7AU+/vCE7xBtFmjge7kfhhk4+RAiig==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-config-airbnb-base": "^15.0.0" + }, + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^5.13.0 || ^6.0.0", + "@typescript-eslint/parser": "^5.0.0 || ^6.0.0", + "eslint": "^7.32.0 || ^8.2.0", + "eslint-plugin-import": "^2.25.3" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-import-resolver-typescript": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-2.7.1.tgz", + "integrity": "sha512-00UbgGwV8bSgUv34igBDbTOtKhqoRMy9bFjNehT40bXg6585PNIct8HhXZ0SybqB9rWtXj9crcku8ndDn/gIqQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "debug": "^4.3.4", + "glob": "^7.2.0", + "is-glob": "^4.0.3", + "resolve": "^1.22.0", + "tsconfig-paths": "^3.14.1" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "*", + "eslint-plugin-import": "*" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz", + "integrity": "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.32.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", + "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.9", + "array.prototype.findlastindex": "^1.2.6", + "array.prototype.flat": "^1.3.3", + "array.prototype.flatmap": "^1.3.3", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.12.1", + "hasown": "^2.0.2", + "is-core-module": "^2.16.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.1", + "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.9", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-prettier": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.5.tgz", + "integrity": "sha512-9Ni+xgemM2IWLq6aXEpP2+V/V30GeA/46Ar629vcMqVPodFFWC9skHu/D1phvuqtS8bJCFnNf01/qcmqYEwNfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "prettier-linter-helpers": "^1.0.0" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "eslint": ">=7.28.0", + "prettier": ">=2.0.0" + }, + "peerDependenciesMeta": { + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.37.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", + "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.3", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.2.1", + "estraverse": "^5.3.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.9", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.1", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.12", + "string.prototype.repeat": "^1.0.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" + } + }, + "node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-plugin-react/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-scope/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/exec-sh": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.6.tgz", + "integrity": "sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w==", + "dev": true, + "license": "MIT" + }, + "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/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/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/expand-brackets/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-descriptor": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz", + "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/expand-brackets/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/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/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/expect/node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/expect/node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extendable-error": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/extendable-error/-/extendable-error-0.1.7.tgz", + "integrity": "sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-diff": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "license": "Apache-2.0", + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/figures/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "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" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/firebase": { + "version": "11.10.0", + "resolved": "https://registry.npmjs.org/firebase/-/firebase-11.10.0.tgz", + "integrity": "sha512-nKBXoDzF0DrXTBQJlZa+sbC5By99ysYU1D6PkMRYknm0nCW7rJly47q492Ht7Ndz5MeYSBuboKuhS1e6mFC03w==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/ai": "1.4.1", + "@firebase/analytics": "0.10.17", + "@firebase/analytics-compat": "0.2.23", + "@firebase/app": "0.13.2", + "@firebase/app-check": "0.10.1", + "@firebase/app-check-compat": "0.3.26", + "@firebase/app-compat": "0.4.2", + "@firebase/app-types": "0.9.3", + "@firebase/auth": "1.10.8", + "@firebase/auth-compat": "0.5.28", + "@firebase/data-connect": "0.3.10", + "@firebase/database": "1.0.20", + "@firebase/database-compat": "2.0.11", + "@firebase/firestore": "4.8.0", + "@firebase/firestore-compat": "0.3.53", + "@firebase/functions": "0.12.9", + "@firebase/functions-compat": "0.3.26", + "@firebase/installations": "0.6.18", + "@firebase/installations-compat": "0.2.18", + "@firebase/messaging": "0.12.22", + "@firebase/messaging-compat": "0.2.22", + "@firebase/performance": "0.7.7", + "@firebase/performance-compat": "0.2.20", + "@firebase/remote-config": "0.6.5", + "@firebase/remote-config-compat": "0.2.18", + "@firebase/storage": "0.13.14", + "@firebase/storage-compat": "0.3.24", + "@firebase/util": "1.12.1" + } + }, + "node_modules/firebase/node_modules/@firebase/auth": { + "version": "1.10.8", + "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-1.10.8.tgz", + "integrity": "sha512-GpuTz5ap8zumr/ocnPY57ZanX02COsXloY6Y/2LYPAuXYiaJRf6BAGDEdRq1BMjP93kqQnKNuKZUTMZbQ8MNYA==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.6.18", + "@firebase/logger": "0.4.4", + "@firebase/util": "1.12.1", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "@firebase/app": "0.x", + "@react-native-async-storage/async-storage": "^1.18.1" + }, + "peerDependenciesMeta": { + "@react-native-async-storage/async-storage": { + "optional": true + } + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "license": "BSD-3-Clause", + "bin": { + "flat": "cli.js" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" + }, + "node_modules/follow-redirects": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/form-data": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "dev": true, + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==", + "dev": true, + "license": "MIT", + "dependencies": { + "map-cache": "^0.2.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true, + "license": "MIT" + }, + "node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/generator-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", + "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-func-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", + "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-nonce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", + "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-symbol-description": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globrex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", + "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", + "dev": true, + "license": "MIT" + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT" + }, + "node_modules/handlebars": { + "version": "4.7.8", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", + "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/has-bigints": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/history": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", + "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.1.2", + "loose-envify": "^1.2.0", + "resolve-pathname": "^3.0.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0", + "value-equal": "^1.0.1" + } + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "license": "BSD-3-Clause", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/html-encoding-sniffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", + "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-encoding": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true, + "license": "MIT" + }, + "node_modules/http-parser-js": { + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.10.tgz", + "integrity": "sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==", + "license": "MIT" + }, + "node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/human-id": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/human-id/-/human-id-4.1.3.tgz", + "integrity": "sha512-tsYlhAYpjCKa//8rXZ9DqKEawhPoSytweBC2eNvcaDK+57RZLHGqNs3PZTQO6yekLFSuvA6AlnAfrw1uBvtb+Q==", + "dev": true, + "license": "MIT", + "bin": { + "human-id": "dist/cli.js" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", + "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/idb": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz", + "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==", + "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", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/import-local": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/internal-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ionicons": { + "version": "8.0.13", + "resolved": "https://registry.npmjs.org/ionicons/-/ionicons-8.0.13.tgz", + "integrity": "sha512-2QQVyG2P4wszne79jemMjWYLp0DBbDhr4/yFroPCxvPP1wtMxgdIV3l5n+XZ5E9mgoXU79w7yTWpm2XzJsISxQ==", + "license": "MIT", + "dependencies": { + "@stencil/core": "^4.35.3" + } + }, + "node_modules/is-accessor-descriptor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.1.tgz", + "integrity": "sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-async-function": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ci-info": "^2.0.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-ci/node_modules/ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-core-module": { + "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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-descriptor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.1.tgz", + "integrity": "sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-data-view": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-descriptor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz", + "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.4", + "generator-function": "^2.0.0", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-inside-container/node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "dev": true, + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "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" + } + }, + "node_modules/is-number-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-string": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-subdir": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-subdir/-/is-subdir-1.2.0.tgz", + "integrity": "sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==", + "dev": true, + "license": "MIT", + "dependencies": { + "better-path-resolve": "1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/is-symbol": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", + "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/iterator.prototype": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", + "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "get-proto": "^1.0.0", + "has-symbols": "^1.1.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", + "import-local": "^3.0.2", + "jest-cli": "^29.7.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "execa": "^5.0.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-changed-files/node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-changed-files/node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-changed-files/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-changed-files/node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-circus": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^1.0.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0", + "pretty-format": "^29.7.0", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus/node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus/node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-circus/node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-cli": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "create-jest": "^29.7.0", + "exit": "^0.1.2", + "import-local": "^3.0.2", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-cli/node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-cli/node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-config": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-jest": "^29.7.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-config/node_modules/@jest/transform": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-config/node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-config/node_modules/babel-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/transform": "^29.7.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.6.3", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/jest-config/node_modules/babel-plugin-jest-hoist": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", + "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-config/node_modules/babel-preset-jest": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", + "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", + "dev": true, + "license": "MIT", + "dependencies": { + "babel-plugin-jest-hoist": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/jest-config/node_modules/jest-haste-map": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-config/node_modules/jest-regex-util": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-config/node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-config/node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/jest-diff": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-docblock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each/node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each/node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-environment-jsdom": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-29.7.0.tgz", + "integrity": "sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/jsdom": "^20.0.0", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0", + "jsdom": "^20.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jest-environment-jsdom/node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-environment-jsdom/node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-environment-node": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-environment-node/node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-environment-node/node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-30.2.0.tgz", + "integrity": "sha512-sQA/jCb9kNt+neM0anSj6eZhLZUIhQgwDt7cPGjumgLM4rXsfb9kpnlacmvZz3Q5tb80nS+oG/if+NBKrHC+Xw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@jest/types": "30.2.0", + "@types/node": "*", + "anymatch": "^3.1.3", + "fb-watchman": "^2.0.2", + "graceful-fs": "^4.2.11", + "jest-regex-util": "30.0.1", + "jest-util": "30.2.0", + "jest-worker": "30.2.0", + "micromatch": "^4.0.8", + "walker": "^1.0.8" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.3" + } + }, + "node_modules/jest-haste-map/node_modules/jest-worker": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-30.2.0.tgz", + "integrity": "sha512-0Q4Uk8WF7BUwqXHuAjc23vmopWJw5WH7w2tqBoUOZpOjW/ZnR44GXXd1r82RvnmI2GZge3ivrYXk/BE2+VtW2g==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@types/node": "*", + "@ungap/structured-clone": "^1.3.0", + "jest-util": "30.2.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.1.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-haste-map/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/jest-leak-detector": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util/node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-mock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-mock/node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-mock/node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-30.0.1.tgz", + "integrity": "sha512-jHEQgBXAgc+Gh4g0p3bCevgRCVRkB4VB70zhoAE48gxeSr1hfUOsM/C2WoJgVL7Eyg//hudYENbm3Ne+/dRVVA==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve-dependencies/node_modules/jest-regex-util": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve/node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve/node_modules/jest-haste-map": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-resolve/node_modules/jest-regex-util": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve/node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner/node_modules/@jest/transform": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner/node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner/node_modules/jest-haste-map": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-runner/node_modules/jest-regex-util": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner/node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-runner/node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/jest-runner/node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-runtime": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime/node_modules/@jest/transform": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime/node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime/node_modules/jest-haste-map": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-runtime/node_modules/jest-regex-util": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime/node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime/node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/jest-serializer": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.6.2.tgz", + "integrity": "sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "graceful-fs": "^4.2.4" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-silent-reporter": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jest-silent-reporter/-/jest-silent-reporter-0.5.0.tgz", + "integrity": "sha512-epdLt8Oj0a1AyRiR6F8zx/1SVT1Mi7VU3y4wB2uOBHs/ohIquC7v2eeja7UN54uRPyHInIKWdL+RdG228n5pJQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "jest-util": "^26.0.0" + } + }, + "node_modules/jest-silent-reporter/node_modules/@jest/types": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-silent-reporter/node_modules/@types/yargs": { + "version": "15.0.20", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.20.tgz", + "integrity": "sha512-KIkX+/GgfFitlASYCGoSF+T4XRXhOubJLhkLVtSfsRTe9jWMmuM2g28zQ41BtPTG7TRBb2xHW+LCNVE9QR/vsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-silent-reporter/node_modules/jest-util": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz", + "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "is-ci": "^2.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-snapshot": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "natural-compare": "^1.4.0", + "pretty-format": "^29.7.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/@jest/transform": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/jest-haste-map": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-snapshot/node_modules/jest-regex-util": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/jest-util": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.2.0.tgz", + "integrity": "sha512-QKNsM0o3Xe6ISQU869e+DhG+4CK/48aHYdJZGlFQVTjnbvgpcKyxpzk29fGiO7i/J8VENZ+d2iGnSsvmuHywlA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@jest/types": "30.2.0", + "@types/node": "*", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "graceful-fs": "^4.2.11", + "picomatch": "^4.0.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-util/node_modules/ci-info": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.3.1.tgz", + "integrity": "sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-util/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/jest-validate": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "leven": "^3.1.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate/node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watcher": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.7.0", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-watcher/node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-watcher/node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/jest/node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsdom": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-20.0.3.tgz", + "integrity": "sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "abab": "^2.0.6", + "acorn": "^8.8.1", + "acorn-globals": "^7.0.0", + "cssom": "^0.5.0", + "cssstyle": "^2.3.0", + "data-urls": "^3.0.2", + "decimal.js": "^10.4.2", + "domexception": "^4.0.0", + "escodegen": "^2.0.0", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.1", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.2", + "parse5": "^7.1.1", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.1.2", + "w3c-xmlserializer": "^4.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^2.0.0", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0", + "ws": "^8.11.0", + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "dev": true, + "license": "MIT" + }, + "node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "license": "MIT", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/launchdarkly-js-client-sdk": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/launchdarkly-js-client-sdk/-/launchdarkly-js-client-sdk-3.9.0.tgz", + "integrity": "sha512-uPL9il6dOZrVQqEcpjDYc2c7HtBTlKpLJb1Q0187i4UokBVZwBXWKjTnNk9hkwaDD5PGD4puoe7POikrR8ACwQ==", + "license": "Apache-2.0", + "dependencies": { + "escape-string-regexp": "^4.0.0", + "launchdarkly-js-sdk-common": "5.8.0" + } + }, + "node_modules/launchdarkly-js-sdk-common": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/launchdarkly-js-sdk-common/-/launchdarkly-js-sdk-common-5.8.0.tgz", + "integrity": "sha512-9X70K3kN1fuR6ZnRudkH7etMgFhi3sEU0mnJ+y2nhID+DpfkNDVnYUGnUs8/s4tsSDs7Q7Gpm4qnr3oqOqT9+A==", + "license": "Apache-2.0", + "dependencies": { + "base64-js": "^1.3.0", + "fast-deep-equal": "^2.0.1", + "uuid": "^8.0.0" + } + }, + "node_modules/launchdarkly-js-sdk-common/node_modules/fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w==", + "license": "MIT" + }, + "node_modules/launchdarkly-react-client-sdk": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/launchdarkly-react-client-sdk/-/launchdarkly-react-client-sdk-3.9.0.tgz", + "integrity": "sha512-Ayw6v5nfT0YoshUI89YH7lkOu+qAEtp9t743+dS6xnFq1IVOnckFlz4AoHa6smVjC3nPzj5n0dCLsRVfVIVEOg==", + "license": "Apache-2.0", + "dependencies": { + "hoist-non-react-statics": "^3.3.2", + "launchdarkly-js-client-sdk": "^3.9.0", + "lodash.camelcase": "^4.3.0" + }, + "peerDependencies": { + "react": "^16.6.3 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.8.4 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lines-and-columns": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.4.tgz", + "integrity": "sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/local-pkg": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.1.tgz", + "integrity": "sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mlly": "^1.7.3", + "pkg-types": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", + "license": "MIT" + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.startcase": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.startcase/-/lodash.startcase-4.4.0.tgz", + "integrity": "sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==", + "dev": true, + "license": "MIT" + }, + "node_modules/long": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", + "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", + "license": "Apache-2.0" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/loupe": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", + "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-func-name": "^2.0.1" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true, + "license": "ISC" + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==", + "dev": true, + "license": "MIT", + "dependencies": { + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true, + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "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", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mlly": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.0.tgz", + "integrity": "sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.15.0", + "pathe": "^2.0.3", + "pkg-types": "^1.3.1", + "ufo": "^1.6.1" + } + }, + "node_modules/mlly/node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "node_modules/mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "dev": true, + "license": "MIT" + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true, + "license": "MIT" + }, + "node_modules/nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-addon-api": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", + "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-fetch/node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-fetch/node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/node-fetch/node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/node-gyp-build": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", + "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", + "dev": true, + "license": "MIT", + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nwsapi": { + "version": "2.2.23", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.23.tgz", + "integrity": "sha512-7wfH4sLbt4M0gCDzGE6vzQBo0bfTKjU7Sfpqy/7gs1qBfYz2vEJH6vXcBKpO3+6Yu1telwd0t9HpyOoLEQQbIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/nx": { + "version": "16.1.4", + "resolved": "https://registry.npmjs.org/nx/-/nx-16.1.4.tgz", + "integrity": "sha512-fSkgC8wXLdW6QMaBHDXeEUJINgxBa0Vsut6Hq2SxEhtxmnx+lx++7NlhYVNZixTMRmI4a5vK0jdfPpe9hknsRA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@nrwl/tao": "16.1.4", + "@parcel/watcher": "2.0.4", + "@yarnpkg/lockfile": "^1.1.0", + "@yarnpkg/parsers": "^3.0.0-rc.18", + "@zkochan/js-yaml": "0.0.6", + "axios": "^1.0.0", + "chalk": "^4.1.0", + "cli-cursor": "3.1.0", + "cli-spinners": "2.6.1", + "cliui": "^7.0.2", + "dotenv": "~10.0.0", + "enquirer": "~2.3.6", + "fast-glob": "3.2.7", + "figures": "3.2.0", + "flat": "^5.0.2", + "fs-extra": "^11.1.0", + "glob": "7.1.4", + "ignore": "^5.0.4", + "js-yaml": "4.1.0", + "jsonc-parser": "3.2.0", + "lines-and-columns": "~2.0.3", + "minimatch": "3.0.5", + "npm-run-path": "^4.0.1", + "open": "^8.4.0", + "semver": "7.3.4", + "string-width": "^4.2.3", + "strong-log-transformer": "^2.1.0", + "tar-stream": "~2.2.0", + "tmp": "~0.2.1", + "tsconfig-paths": "^4.1.2", + "tslib": "^2.3.0", + "v8-compile-cache": "2.3.0", + "yargs": "^17.6.2", + "yargs-parser": "21.1.1" + }, + "bin": { + "nx": "bin/nx.js" + }, + "optionalDependencies": { + "@nx/nx-darwin-arm64": "16.1.4", + "@nx/nx-darwin-x64": "16.1.4", + "@nx/nx-linux-arm-gnueabihf": "16.1.4", + "@nx/nx-linux-arm64-gnu": "16.1.4", + "@nx/nx-linux-arm64-musl": "16.1.4", + "@nx/nx-linux-x64-gnu": "16.1.4", + "@nx/nx-linux-x64-musl": "16.1.4", + "@nx/nx-win32-arm64-msvc": "16.1.4", + "@nx/nx-win32-x64-msvc": "16.1.4" + }, + "peerDependencies": { + "@swc-node/register": "^1.4.2", + "@swc/core": "^1.2.173" + }, + "peerDependenciesMeta": { + "@swc-node/register": { + "optional": true + }, + "@swc/core": { + "optional": true + } + } + }, + "node_modules/nx/node_modules/dotenv": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", + "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=10" + } + }, + "node_modules/nx/node_modules/enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-colors": "^4.1.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/nx/node_modules/fast-glob": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", + "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nx/node_modules/fs-extra": { + "version": "11.3.3", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.3.tgz", + "integrity": "sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/nx/node_modules/glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/nx/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/nx/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/nx/node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/nx/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/nx/node_modules/minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/nx/node_modules/semver": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/nx/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/nx/node_modules/tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/nx/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/nx/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-descriptor": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz", + "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object-copy/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", + "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.values": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/outdent": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/outdent/-/outdent-0.5.0.tgz", + "integrity": "sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/p-filter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-2.1.0.tgz", + "integrity": "sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-map": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/package-manager-detector": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-0.2.11.tgz", + "integrity": "sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "quansync": "^0.2.7" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-json/node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, + "node_modules/parse5": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-to-regexp": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.9.0.tgz", + "integrity": "sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g==", + "license": "MIT", + "dependencies": { + "isarray": "0.0.1" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/pathe": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/pirates": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-types": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", + "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "confbox": "^0.1.8", + "mlly": "^1.7.4", + "pathe": "^2.0.1" + } + }, + "node_modules/pkg-types/node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "node_modules/posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "dev": true, + "license": "MIT", + "peer": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.1.tgz", + "integrity": "sha512-SxToR7P8Y2lWmv/kTzVLC1t/GDI2WGjMwNhLLE9qtH8Q13C+aEmuRlzDst4Up4s0Wc8sF2M+J57iB3cMLqftfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/prettier-plugin-astro": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/prettier-plugin-astro/-/prettier-plugin-astro-0.5.5.tgz", + "integrity": "sha512-tEJiPjTB1eVT5Czcbkj9GoRG/oMewOnG9x737p/hJUD5QXJmn7LiYFM2dKkX0i4A1fhhsGfXT+uqsAXcw2r8JQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@astrojs/compiler": "^0.23.4", + "prettier": "^2.7.1", + "sass-formatter": "^0.7.5", + "synckit": "^0.7.0" + }, + "engines": { + "node": "^14.15.0 || >=16.0.0", + "npm": ">=6.14.0" + } + }, + "node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/pretty-format/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true, + "license": "MIT" + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "license": "MIT", + "peer": true, + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/protobufjs": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.4.tgz", + "integrity": "sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==", + "hasInstallScript": true, + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true, + "license": "MIT" + }, + "node_modules/psl": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz", + "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "funding": { + "url": "https://github.com/sponsors/lupomontero" + } + }, + "node_modules/pump": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", + "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/pure-rand": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", + "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "license": "MIT" + }, + "node_modules/quansync": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/quansync/-/quansync-0.2.11.tgz", + "integrity": "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/antfu" + }, + { + "type": "individual", + "url": "https://github.com/sponsors/sxzz" + } + ], + "license": "MIT" + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "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/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "license": "MIT", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, + "node_modules/react-remove-scroll": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.5.tgz", + "integrity": "sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==", + "license": "MIT", + "dependencies": { + "react-remove-scroll-bar": "^2.3.3", + "react-style-singleton": "^2.2.1", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.0", + "use-sidecar": "^1.1.2" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-remove-scroll-bar": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz", + "integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==", + "license": "MIT", + "dependencies": { + "react-style-singleton": "^2.2.2", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-router": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.3.tgz", + "integrity": "sha512-mzQGUvS3bM84TnbtMYR8ZjKnuPJ71IjSzR+DE6UkUqvN4czWIqEs17yLL8xkAycv4ev0AiN+IGrWu88vJs/p2w==", + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.12.13", + "history": "^4.9.0", + "hoist-non-react-statics": "^3.1.0", + "loose-envify": "^1.3.1", + "mini-create-react-context": "^0.4.0", + "path-to-regexp": "^1.7.0", + "prop-types": "^15.6.2", + "react-is": "^16.6.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + }, + "peerDependencies": { + "react": ">=15" + } + }, + "node_modules/react-router-dom": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.3.tgz", + "integrity": "sha512-Ov0tGPMBgqmbu5CDmN++tv2HQ9HlWDuWIIqn4b88gjlAN5IHI+4ZUZRcpz9Hl0azFIwihbLDYw1OiHGRo7ZIng==", + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.12.13", + "history": "^4.9.0", + "loose-envify": "^1.3.1", + "prop-types": "^15.6.2", + "react-router": "5.3.3", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + }, + "peerDependencies": { + "react": ">=15" + } + }, + "node_modules/react-router/node_modules/mini-create-react-context": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/mini-create-react-context/-/mini-create-react-context-0.4.1.tgz", + "integrity": "sha512-YWCYEmd5CQeHGSAKrYvXgmzzkrvssZcuuQDDeqkT+PziKGMgE+0MCCtcKbROzocGBG1meBLl2FotlRwf4gAzbQ==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.1", + "tiny-warning": "^1.0.3" + }, + "peerDependencies": { + "prop-types": "^15.0.0", + "react": "^0.14.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/react-style-singleton": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz", + "integrity": "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==", + "license": "MIT", + "dependencies": { + "get-nonce": "^1.0.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/read-yaml-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-yaml-file/-/read-yaml-file-1.1.0.tgz", + "integrity": "sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.5", + "js-yaml": "^3.6.1", + "pify": "^4.0.1", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/read-yaml-file/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/read-yaml-file/node_modules/js-yaml": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", + "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/read-yaml-file/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==", + "license": "MIT" + }, + "node_modules/regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "license": "MIT", + "dependencies": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==", + "dev": true, + "license": "ISC" + }, + "node_modules/repeat-element": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/resolve": { + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-pathname": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", + "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==", + "license": "MIT" + }, + "node_modules/resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==", + "deprecated": "https://github.com/lydell/resolve-url#deprecated", + "dev": true, + "license": "MIT" + }, + "node_modules/resolve.exports": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz", + "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.55.1.tgz", + "integrity": "sha512-wDv/Ht1BNHB4upNbK74s9usvl7hObDnvVzknxqY/E/O3X6rW1U1rV1aENEfJ54eFZDTNo7zv1f5N4edCluH7+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.55.1", + "@rollup/rollup-android-arm64": "4.55.1", + "@rollup/rollup-darwin-arm64": "4.55.1", + "@rollup/rollup-darwin-x64": "4.55.1", + "@rollup/rollup-freebsd-arm64": "4.55.1", + "@rollup/rollup-freebsd-x64": "4.55.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.55.1", + "@rollup/rollup-linux-arm-musleabihf": "4.55.1", + "@rollup/rollup-linux-arm64-gnu": "4.55.1", + "@rollup/rollup-linux-arm64-musl": "4.55.1", + "@rollup/rollup-linux-loong64-gnu": "4.55.1", + "@rollup/rollup-linux-loong64-musl": "4.55.1", + "@rollup/rollup-linux-ppc64-gnu": "4.55.1", + "@rollup/rollup-linux-ppc64-musl": "4.55.1", + "@rollup/rollup-linux-riscv64-gnu": "4.55.1", + "@rollup/rollup-linux-riscv64-musl": "4.55.1", + "@rollup/rollup-linux-s390x-gnu": "4.55.1", + "@rollup/rollup-linux-x64-gnu": "4.55.1", + "@rollup/rollup-linux-x64-musl": "4.55.1", + "@rollup/rollup-openbsd-x64": "4.55.1", + "@rollup/rollup-openharmony-arm64": "4.55.1", + "@rollup/rollup-win32-arm64-msvc": "4.55.1", + "@rollup/rollup-win32-ia32-msvc": "4.55.1", + "@rollup/rollup-win32-x64-gnu": "4.55.1", + "@rollup/rollup-win32-x64-msvc": "4.55.1", + "fsevents": "~2.3.2" + } + }, + "node_modules/rollup/node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.55.1.tgz", + "integrity": "sha512-p3grE2PHcQm2e8PSGZdzIhCKbMCw/xi9XvMPErPhwO17vxtvCN5FEA2mSLgmKlCjHGMQTP6phuQTYWUnKewwGg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/rollup/node_modules/@rollup/rollup-darwin-x64": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.55.1.tgz", + "integrity": "sha512-rDUjG25C9qoTm+e02Esi+aqTKSBYwVTaoS1wxcN47/Luqef57Vgp96xNANwt5npq9GDxsH7kXxNkJVEsWEOEaQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/rollup/node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.55.1.tgz", + "integrity": "sha512-a59mwd1k6x8tXKcUxSyISiquLwB5pX+fJW9TkWU46lCqD/GRDe9uDN31jrMmVP3feI3mhAdvcCClhV8V5MhJFQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/rollup/node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.55.1.tgz", + "integrity": "sha512-puS1MEgWX5GsHSoiAsF0TYrpomdvkaXm0CofIMG5uVkP6IBV+ZO9xhC5YEN49nsgYo1DuuMquF9+7EDBVYu4uA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/rollup/node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.55.1.tgz", + "integrity": "sha512-a8G4wiQxQG2BAvo+gU6XrReRRqj+pLS2NGXKm8io19goR+K8lw269eTrPkSdDTALwMmJp4th2Uh0D8J9bEV1vg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/rollup/node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.55.1.tgz", + "integrity": "sha512-bD+zjpFrMpP/hqkfEcnjXWHMw5BIghGisOKPj+2NaNDuVT+8Ds4mPf3XcPHuat1tz89WRL+1wbcxKY3WSbiT7w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/rollup/node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.55.1.tgz", + "integrity": "sha512-yR6Bl3tMC/gBok5cz/Qi0xYnVbIxGx5Fcf/ca0eB6/6JwOY+SRUcJfI0OpeTpPls7f194as62thCt/2BjxYN8g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/rollup/node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.55.1.tgz", + "integrity": "sha512-SPEpaL6DX4rmcXtnhdrQYgzQ5W2uW3SCJch88lB2zImhJRhIIK44fkUrgIV/Q8yUNfw5oyZ5vkeQsZLhCb06lw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/rsvp": { + "version": "4.8.5", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", + "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "6.* || >= 7.*" + } + }, + "node_modules/run-applescript": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-5.0.0.tgz", + "integrity": "sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "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", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/s.color": { + "version": "0.0.15", + "resolved": "https://registry.npmjs.org/s.color/-/s.color-0.0.15.tgz", + "integrity": "sha512-AUNrbEUHeKY8XsYr/DYpl+qk5+aM+DChopnWOPEzn8YKzOhv4l2zH6LzZms3tOZP3wwdOyc0RmTciyi46HLIuA==", + "dev": true, + "license": "MIT" + }, + "node_modules/safe-array-concat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-array-concat/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "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/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-push-apply/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, + "node_modules/safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ret": "~0.1.10" + } + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/sane": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", + "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", + "deprecated": "some dependency vulnerabilities fixed, support for node < 10 dropped, and newer ECMAScript syntax/features added", + "dev": true, + "license": "MIT", + "dependencies": { + "@cnakazawa/watch": "^1.0.3", + "anymatch": "^2.0.0", + "capture-exit": "^2.0.0", + "exec-sh": "^0.3.2", + "execa": "^1.0.0", + "fb-watchman": "^2.0.0", + "micromatch": "^3.1.4", + "minimist": "^1.1.1", + "walker": "~1.0.5" + }, + "bin": { + "sane": "src/cli.js" + }, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/sane/node_modules/anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "license": "ISC", + "dependencies": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "node_modules/sane/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/cross-spawn": { + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz", + "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/sane/node_modules/execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/sane/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/sane/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "license": "MIT", + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/sane/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/sane/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/sane/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/sass-formatter": { + "version": "0.7.9", + "resolved": "https://registry.npmjs.org/sass-formatter/-/sass-formatter-0.7.9.tgz", + "integrity": "sha512-CWZ8XiSim+fJVG0cFLStwDvft1VI7uvXdCNJYXhDvowiv+DsbD1nXLiQ4zrE5UBvj5DWZJ93cwN0NX5PMsr1Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "suf-log": "^2.5.3" + } + }, + "node_modules/saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "dev": true, + "license": "ISC", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" + } + }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/set-value/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/set-value/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true, + "license": "ISC" + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true, + "license": "MIT" + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "license": "MIT", + "dependencies": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^3.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/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/snapdragon/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-descriptor": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz", + "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/snapdragon/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/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/snapdragon/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", + "dev": true, + "license": "MIT", + "dependencies": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-url": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", + "deprecated": "See https://github.com/lydell/source-map-url#deprecated", + "dev": true, + "license": "MIT" + }, + "node_modules/spawndamnit": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spawndamnit/-/spawndamnit-3.0.1.tgz", + "integrity": "sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==", + "dev": true, + "license": "SEE LICENSE IN LICENSE", + "dependencies": { + "cross-spawn": "^7.0.5", + "signal-exit": "^4.0.1" + } + }, + "node_modules/spawndamnit/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "extend-shallow": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true, + "license": "MIT" + }, + "node_modules/static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-descriptor": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz", + "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/std-env": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", + "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", + "dev": true, + "license": "MIT" + }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", + "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "regexp.prototype.flags": "^1.5.3", + "set-function-name": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-literal": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-2.1.1.tgz", + "integrity": "sha512-631UJ6O00eNGfMiWG78ck80dfBab8X6IVFB51jZK5Icd7XAs60Z5y7QdSd/wGIklnWvRbUNloVzhOKKmutxQ6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-tokens": "^9.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/strip-literal/node_modules/js-tokens": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", + "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/strong-log-transformer": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/strong-log-transformer/-/strong-log-transformer-2.1.0.tgz", + "integrity": "sha512-B3Hgul+z0L9a236FAUC9iZsL+nVHgoCJnqCbN588DjYxvGXaXaaFbfmQ/JhvKjZwsOukuR72XbHv71Qkug0HxA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "duplexer": "^0.1.1", + "minimist": "^1.2.0", + "through": "^2.3.4" + }, + "bin": { + "sl-log-transformer": "bin/sl-log-transformer.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/suf-log": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/suf-log/-/suf-log-2.5.3.tgz", + "integrity": "sha512-KvC8OPjzdNOe+xQ4XWJV2whQA0aM1kGVczMQ8+dStAO6KfEB140JEVQ9dE76ONZ0/Ylf67ni4tILPJB41U0eow==", + "dev": true, + "license": "MIT", + "dependencies": { + "s.color": "0.0.15" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true, + "license": "MIT" + }, + "node_modules/synckit": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.7.3.tgz", + "integrity": "sha512-jNroMv7Juy+mJ/CHW5H6TzsLWpa1qck6sCHbkv8YTur+irSq2PjbvmGnm2gy14BUQ6jF33vyR4DPssHqmqsDQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@pkgr/utils": "^2.3.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/term-size": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz", + "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true, + "license": "MIT" + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tiny-invariant": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", + "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", + "license": "MIT" + }, + "node_modules/tiny-warning": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", + "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==", + "license": "MIT" + }, + "node_modules/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinypool": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.8.4.tgz", + "integrity": "sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tinyspy": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.2.1.tgz", + "integrity": "sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/titleize": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/titleize/-/titleize-3.0.0.tgz", + "integrity": "sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tmp": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.5.tgz", + "integrity": "sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.14" + } + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-object-path/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex-range": { + "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" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tough-cookie": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", + "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tough-cookie/node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/tr46": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", + "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/ts-jest": { + "version": "29.4.6", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.4.6.tgz", + "integrity": "sha512-fSpWtOO/1AjSNQguk43hb/JCo16oJDnMJf3CdEGNkqsEX3t0KX96xvyX1D7PfLCpVoKu4MfVrqUkFyblYoY4lA==", + "dev": true, + "license": "MIT", + "dependencies": { + "bs-logger": "^0.2.6", + "fast-json-stable-stringify": "^2.1.0", + "handlebars": "^4.7.8", + "json5": "^2.2.3", + "lodash.memoize": "^4.1.2", + "make-error": "^1.3.6", + "semver": "^7.7.3", + "type-fest": "^4.41.0", + "yargs-parser": "^21.1.1" + }, + "bin": { + "ts-jest": "cli.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "@babel/core": ">=7.0.0-beta.0 <8", + "@jest/transform": "^29.0.0 || ^30.0.0", + "@jest/types": "^29.0.0 || ^30.0.0", + "babel-jest": "^29.0.0 || ^30.0.0", + "jest": "^29.0.0 || ^30.0.0", + "jest-util": "^29.0.0 || ^30.0.0", + "typescript": ">=4.3 <6" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@jest/transform": { + "optional": true + }, + "@jest/types": { + "optional": true + }, + "babel-jest": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jest-util": { + "optional": true + } + } + }, + "node_modules/ts-jest/node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tsconfck": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-3.1.6.tgz", + "integrity": "sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==", + "dev": true, + "license": "MIT", + "bin": { + "tsconfck": "bin/tsconfck.js" + }, + "engines": { + "node": "^18 || >=20" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tsconfig-paths/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true, + "license": "0BSD" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "license": "Apache-2.0", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/ufo": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.2.tgz", + "integrity": "sha512-heMioaxBcG9+Znsda5Q8sQbWnLJSl98AFDXTO80wELWEzX3hordXsTdxrIfMQoO9IY1MEnoGoPjpoKpMj+Yx0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/uglify-js": { + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", + "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/unbox-primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "license": "MIT" + }, + "node_modules/union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "license": "MIT", + "dependencies": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/union-value/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", + "dev": true, + "license": "MIT", + "dependencies": { + "isarray": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==", + "deprecated": "Please see https://github.com/lydell/urix#deprecated", + "dev": true, + "license": "MIT" + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/use-callback-ref": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz", + "integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sidecar": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz", + "integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==", + "license": "MIT", + "dependencies": { + "detect-node-es": "^1.1.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true, + "license": "MIT" + }, + "node_modules/v8-to-istanbul": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", + "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", + "dev": true, + "license": "ISC", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/value-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz", + "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==", + "license": "MIT" + }, + "node_modules/vite": { + "version": "5.4.21", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz", + "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite-node": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.6.1.tgz", + "integrity": "sha512-YAXkfvGtuTzwWbDSACdJSg4A4DZiAqckWe90Zapc/sEX3XvHcw1NdurM/6od8J207tSDqNbSsgdCacBgvJKFuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.3.4", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "vite": "^5.0.0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vite-tsconfig-paths": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-4.3.2.tgz", + "integrity": "sha512-0Vd/a6po6Q+86rPlntHye7F31zA2URZMbH8M3saAZ/xR9QoGN/L21bxEGfXdWmFdNkqPpRdxFT7nmNe12e9/uA==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "globrex": "^0.1.2", + "tsconfck": "^3.0.3" + }, + "peerDependencies": { + "vite": "*" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/vitest": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-1.6.1.tgz", + "integrity": "sha512-Ljb1cnSJSivGN0LqXd/zmDbWEM0RNNg2t1QW/XUhYl/qPqyu7CsqeWtqQXHVaJsecLPuDoak2oJcZN2QoRIOag==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "1.6.1", + "@vitest/runner": "1.6.1", + "@vitest/snapshot": "1.6.1", + "@vitest/spy": "1.6.1", + "@vitest/utils": "1.6.1", + "acorn-walk": "^8.3.2", + "chai": "^4.3.10", + "debug": "^4.3.4", + "execa": "^8.0.1", + "local-pkg": "^0.5.0", + "magic-string": "^0.30.5", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "std-env": "^3.5.0", + "strip-literal": "^2.0.0", + "tinybench": "^2.5.1", + "tinypool": "^0.8.3", + "vite": "^5.0.0", + "vite-node": "1.6.1", + "why-is-node-running": "^2.2.2" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@types/node": "^18.0.0 || >=20.0.0", + "@vitest/browser": "1.6.1", + "@vitest/ui": "1.6.1", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "node_modules/vitest/node_modules/execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/vitest/node_modules/get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/vitest/node_modules/human-signals": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=16.17.0" + } + }, + "node_modules/vitest/node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/vitest/node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/vitest/node_modules/npm-run-path": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/vitest/node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/vitest/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/vitest/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/vitest/node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/w3c-xmlserializer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", + "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/web-vitals": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-4.2.4.tgz", + "integrity": "sha512-r4DIlprAGwJ7YM11VZp4R884m0Vmgr6EAKe3P+kO0PPj3Unqyvv59rczf6UiGcb9Z8QxZVcqKNwv/g0WNdWwsw==", + "license": "Apache-2.0" + }, + "node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "license": "Apache-2.0", + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/whatwg-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", + "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", + "deprecated": "Use @exodus/bytes instead for a more spec-conformant and faster implementation", + "dev": true, + "license": "MIT", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-encoding/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/whatwg-mimetype": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", + "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-url": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", + "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", + "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/write-file-atomic": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", + "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", + "dev": true, + "license": "ISC", + "optional": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/write-file-atomic/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "optional": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/ws": { + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", + "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xml-name-validator": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true, + "license": "MIT" + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yocto-queue": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz", + "integrity": "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.13.tgz", + "integrity": "sha512-AvvthqfqrAhNH9dnfmrfKzX5upOdjUVJYFqNSlkmGf64gRaTzlPwz99IHYnVs28qYAybvAlBV+H7pn0saFY4Ig==", + "license": "MIT", + "peer": true, + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-openapi": { + "version": "5.4.5", + "resolved": "https://registry.npmjs.org/zod-openapi/-/zod-openapi-5.4.5.tgz", + "integrity": "sha512-DVLBNsnggh8k/Yq7qp+NeQCH6JuLIyGzUQWA1wN5+7DpQJSwC7WYR/2lE6uQDmGcS/X6l4tUyYFpeG4nk3nOpA==", + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/samchungy/zod-openapi?sponsor=1" + }, + "peerDependencies": { + "zod": "^3.25.74 || ^4.0.0" + } + } + } +} diff --git a/package.json b/package.json index da58618313..45e6abbe47 100644 --- a/package.json +++ b/package.json @@ -51,7 +51,7 @@ "@tanstack/react-query-persist-client": "^5.54.1", "@traversable/zod": "^0.0.57", "core-js": "^3.25.1", - "firebase": "12.8.0", + "firebase": "11.10.0", "history": "4.10.1", "launchdarkly-react-client-sdk": "^3.0.1", "react": "18.3.1", @@ -66,7 +66,6 @@ }, "pnpm": { "overrides": { - "fastify": "5.7.2", "pvutils": "1.0.17", "did-jwt": "5.9.0", "typescript": "5.6.2", diff --git a/packages/lca-api-client/CHANGELOG.md b/packages/lca-api-client/CHANGELOG.md index ca05c95a19..dca6a8f593 100644 --- a/packages/lca-api-client/CHANGELOG.md +++ b/packages/lca-api-client/CHANGELOG.md @@ -1,26 +1,5 @@ # @welibraryos/lca-api-client -## 1.1.9 - -### Patch Changes - -- Updated dependencies [[`175a828f712da5b44eeb3c242e8fd604736df073`](https://github.com/learningeconomy/LearnCard/commit/175a828f712da5b44eeb3c242e8fd604736df073)]: - - @learncard/lca-api-service@1.1.9 - -## 1.1.8 - -### Patch Changes - -- Updated dependencies [[`c04ff8e86677b7f88fb2858be2b9b3f8bb28f427`](https://github.com/learningeconomy/LearnCard/commit/c04ff8e86677b7f88fb2858be2b9b3f8bb28f427)]: - - @learncard/lca-api-service@1.1.8 - -## 1.1.7 - -### Patch Changes - -- Updated dependencies []: - - @learncard/lca-api-service@1.1.7 - ## 1.1.6 ### Patch Changes diff --git a/packages/lca-api-client/package.json b/packages/lca-api-client/package.json index b89cabd9df..3481d8b3df 100644 --- a/packages/lca-api-client/package.json +++ b/packages/lca-api-client/package.json @@ -1,6 +1,6 @@ { "name": "@learncard/lca-api-client", - "version": "1.1.9", + "version": "1.1.6", "description": "", "main": "dist/index.js", "module": "./dist/lca-api-client.esm.js", diff --git a/packages/learn-card-base/CHANGELOG.md b/packages/learn-card-base/CHANGELOG.md index bad77c73c8..a2112d0fe8 100644 --- a/packages/learn-card-base/CHANGELOG.md +++ b/packages/learn-card-base/CHANGELOG.md @@ -1,46 +1,5 @@ # learn-card-base -## 0.1.12 - -### Patch Changes - -- Updated dependencies []: - - @learncard/lca-api-plugin@1.1.9 - -## 0.1.11 - -### Patch Changes - -- Updated dependencies []: - - @learncard/lca-api-plugin@1.1.8 - -## 0.1.10 - -### Patch Changes - -- Updated dependencies []: - - @learncard/lca-api-plugin@1.1.7 - -## 0.1.9 - -### Patch Changes - -- [#952](https://github.com/learningeconomy/LearnCard/pull/952) [`e41a15b2b2850fc3c562b254b3aef707d34e5437`](https://github.com/learningeconomy/LearnCard/commit/e41a15b2b2850fc3c562b254b3aef707d34e5437) Thanks [@Custard7](https://github.com/Custard7)! - fix: Encrypt for Recipient with SA - -## 0.1.8 - -### Patch Changes - -- [#933](https://github.com/learningeconomy/LearnCard/pull/933) [`1247b3b2b372626b06d6193b5c9227504c23a3be`](https://github.com/learningeconomy/LearnCard/commit/1247b3b2b372626b06d6193b5c9227504c23a3be) Thanks [@goblincore](https://github.com/goblincore)! - [LC-1511] Override unknown issuer verifier state text and use roles in Scouts app - -- [#934](https://github.com/learningeconomy/LearnCard/pull/934) [`6319f43e11a231396f08b41a0bafb4198b4622a0`](https://github.com/learningeconomy/LearnCard/commit/6319f43e11a231396f08b41a0bafb4198b4622a0) Thanks [@goblincore](https://github.com/goblincore)! - [LC-1524] fix: Suppress toast displaying "Registration: no valid private key error" on login screen - -- [#933](https://github.com/learningeconomy/LearnCard/pull/933) [`1247b3b2b372626b06d6193b5c9227504c23a3be`](https://github.com/learningeconomy/LearnCard/commit/1247b3b2b372626b06d6193b5c9227504c23a3be) Thanks [@goblincore](https://github.com/goblincore)! - [LC-1511] Override unknown issuer verifier state text and use roles in Scouts app - -- [#938](https://github.com/learningeconomy/LearnCard/pull/938) [`20c48c727aade41921e226e3f26922d3798c7b5e`](https://github.com/learningeconomy/LearnCard/commit/20c48c727aade41921e226e3f26922d3798c7b5e) Thanks [@gerardopar](https://github.com/gerardopar)! - chore: [LC-1498] - šŸš€ Migrate Capacitor & Plugins from v7 → v8 + šŸ”„ Firebase v12 - -- [#938](https://github.com/learningeconomy/LearnCard/pull/938) [`20c48c727aade41921e226e3f26922d3798c7b5e`](https://github.com/learningeconomy/LearnCard/commit/20c48c727aade41921e226e3f26922d3798c7b5e) Thanks [@gerardopar](https://github.com/gerardopar)! - chore: [LC-1498] - šŸš€ Migrate Capacitor & Plugins from v7 → v8 + šŸ”„ Firebase v12 - ## 0.1.7 ### Patch Changes diff --git a/packages/learn-card-base/package.json b/packages/learn-card-base/package.json index 5355a03426..a252fdfed6 100644 --- a/packages/learn-card-base/package.json +++ b/packages/learn-card-base/package.json @@ -1,6 +1,6 @@ { "name": "learn-card-base", - "version": "0.1.12", + "version": "0.1.7", "private": true, "description": "LearnCard Apps shared components", "main": "src/index.ts", @@ -10,13 +10,13 @@ }, "dependencies": { "@capacitor-community/sqlite": "^7.0.1", - "@capacitor/app": "^8.0.0", - "@capacitor/browser": "^8.0.0", - "@capacitor/clipboard": "^8.0.0", - "@capacitor/core": "8.0.1", - "@capacitor/keyboard": "^8.0.0", - "@capacitor/camera": "^8.0.0", - "@capacitor/push-notifications": "^8.0.0", + "@capacitor/app": "^7.0.2", + "@capacitor/browser": "^7.0.2", + "@capacitor/clipboard": "^7.0.2", + "@capacitor/core": "7.4.2", + "@capacitor/keyboard": "^7.0.2", + "@capacitor/camera": "^7.0.2", + "@capacitor/push-notifications": "^7.0.2", "@koale/useworker": "^4.0.2", "@radix-ui/react-popover": "1.0.7", "@radix-ui/react-slot": "1.0.2", @@ -30,7 +30,7 @@ "@learncard/lca-api-plugin": "workspace:*", "async": "^3.2.6", "axios": "^0.27.2", - "capacitor-plugin-safe-area": "^5.0.0", + "capacitor-plugin-safe-area": "^4.0.0", "class-variance-authority": "0.7.0", "clsx": "2.0.0", "emoji-picker-react": "^4.12.0", diff --git a/packages/learn-card-base/src/components/CredentialBadge/CredentialVerificationDisplay.tsx b/packages/learn-card-base/src/components/CredentialBadge/CredentialVerificationDisplay.tsx index 296a1167e3..3ff219b9a5 100644 --- a/packages/learn-card-base/src/components/CredentialBadge/CredentialVerificationDisplay.tsx +++ b/packages/learn-card-base/src/components/CredentialBadge/CredentialVerificationDisplay.tsx @@ -44,7 +44,6 @@ type CredentialVerificationDisplayProps = { iconClassName?: string; showText?: boolean; managedBoost?: boolean; - unknownVerifierTitle?: string; }; export const CredentialVerificationDisplay: React.FC = ({ @@ -53,7 +52,6 @@ export const CredentialVerificationDisplay: React.FC { const profileID = typeof credential?.issuer === 'string' ? credential.issuer : credential?.issuer?.id; @@ -69,17 +67,6 @@ export const CredentialVerificationDisplay: React.FC - - Self Issued -
+ {' '} + Self Issued +

); } return ; @@ -115,14 +105,13 @@ export const CredentialVerificationDisplay: React.FC - - {displayText} -
+ {' '} + Trusted Issuer +

); } return ; @@ -138,12 +127,12 @@ export const CredentialVerificationDisplay: React.FC - - {unknownVerifierTitle ?? VERIFIER_STATES.unknownVerifier} -
+ {' '} + Unknown Issuer +

); } @@ -152,12 +141,12 @@ export const CredentialVerificationDisplay: React.FC - - Untrusted Issuer -

+ {' '} + Untrusted Issuer +

); } return ; diff --git a/packages/learn-card-base/src/components/boost/BoostListItem.tsx b/packages/learn-card-base/src/components/boost/BoostListItem.tsx index 07f514681d..22b6289f30 100644 --- a/packages/learn-card-base/src/components/boost/BoostListItem.tsx +++ b/packages/learn-card-base/src/components/boost/BoostListItem.tsx @@ -39,7 +39,6 @@ type BoostListItemProps = { managedBoost?: boolean; uri?: string; indicatorColor?: string; - unknownVerifierTitle?: string; }; const DEFAULT_BG_COLOR = 'bg-white'; @@ -61,7 +60,6 @@ const BoostListItem: React.FC = ({ managedBoost, uri, indicatorColor, - unknownVerifierTitle, }) => { const newCreds = newCredsStore.use.newCreds(); const newCredsForCategory = newCreds?.[categoryType as CredentialCategory] ?? []; @@ -239,12 +237,11 @@ const BoostListItem: React.FC = ({ )} - {(isMediaDisplay || displayType !== DisplayTypeEnum.Media) && !managedBoost && ( + {(isMediaDisplay || displayType !== DisplayTypeEnum.Media) && ( )} {issuerAndDateText} diff --git a/packages/learn-card-base/src/components/push-notifications/PushNotificationListener.tsx b/packages/learn-card-base/src/components/push-notifications/PushNotificationListener.tsx index 174efd2193..de7305b9ad 100644 --- a/packages/learn-card-base/src/components/push-notifications/PushNotificationListener.tsx +++ b/packages/learn-card-base/src/components/push-notifications/PushNotificationListener.tsx @@ -1,14 +1,14 @@ import { useEffect } from 'react'; -import { useHistory } from 'react-router-dom'; +import { useHistory, useLocation } from 'react-router-dom'; import { Capacitor } from '@capacitor/core'; -import { useWallet, useToast, ToastTypeEnum, useIsLoggedIn } from 'learn-card-base'; +import { useWallet, useToast, ToastTypeEnum } from 'learn-card-base'; import { pushUtilities } from '../../utils/pushUtilities'; export const PushNotificationListener = () => { const { initWallet } = useWallet(); - const isLoggedIn = useIsLoggedIn(); + const location = useLocation(); const history = useHistory(); const { presentToast } = useToast(); @@ -24,10 +24,10 @@ export const PushNotificationListener = () => { pushUtilities.addBackgroundPushNotificationListeners( initWallet, history, - isLoggedIn, + true, handleNotificationRegistrationError ); - }, [history, isLoggedIn]); + }, [history, location.pathname]); return null; }; diff --git a/packages/learn-card-base/src/components/sidemenu/sidemenuHelpers.ts b/packages/learn-card-base/src/components/sidemenu/sidemenuHelpers.ts index def70bbff4..42715d5c6e 100644 --- a/packages/learn-card-base/src/components/sidemenu/sidemenuHelpers.ts +++ b/packages/learn-card-base/src/components/sidemenu/sidemenuHelpers.ts @@ -51,6 +51,7 @@ export enum SideMenuLinksEnum { wallet = 'wallet', aiTopics = CredentialCategoryEnum.aiTopic, aiInsights = CredentialCategoryEnum.aiInsight, + aiPathways = CredentialCategoryEnum.aiPathway, skills = CredentialCategoryEnum.skill, socialBadges = CredentialCategoryEnum.socialBadge, achievements = CredentialCategoryEnum.achievement, diff --git a/packages/learn-card-base/src/components/vcmodal/VCDisplayCardWrapper2.tsx b/packages/learn-card-base/src/components/vcmodal/VCDisplayCardWrapper2.tsx index 4d8f759950..15ec10972e 100644 --- a/packages/learn-card-base/src/components/vcmodal/VCDisplayCardWrapper2.tsx +++ b/packages/learn-card-base/src/components/vcmodal/VCDisplayCardWrapper2.tsx @@ -55,22 +55,6 @@ type VCDisplayCardWrapper2Props = { customLinkedCredentialsComponent?: React.ReactNode; useCurrentUserName?: boolean; customBodyContentSlot?: React.ReactNode; - unknownVerifierTitle?: string; - issueeOverride?: string; - issuerOverride?: string; - issueHistory?: any[]; - verificationItems?: VerificationItem[]; - customThumbComponent?: React.ReactNode; - subjectDID?: string; - subjectImageComponent?: React.ReactNode; - issuerImageComponent?: React.ReactNode; - customDescription?: React.ReactNode; - customCriteria?: React.ReactNode; - customIssueHistoryComponent?: React.ReactNode; - enableLightbox?: boolean; - titleOverride?: string; - qrCodeOnClick?: () => void; - onDotsClick?: () => void; }; export const VCDisplayCardWrapper2: React.FC = ({ @@ -100,22 +84,6 @@ export const VCDisplayCardWrapper2: React.FC = ({ customLinkedCredentialsComponent, useCurrentUserName, customBodyContentSlot, - unknownVerifierTitle, - issueeOverride, - issuerOverride, - issueHistory, - verificationItems, - customThumbComponent, - subjectDID, - subjectImageComponent, - issuerImageComponent, - customDescription: customDescriptionProp, - customCriteria, - customIssueHistoryComponent, - enableLightbox, - titleOverride, - qrCodeOnClick, - onDotsClick, }) => { const currentUser = useCurrentUser(); @@ -192,7 +160,7 @@ export const VCDisplayCardWrapper2: React.FC = ({ ].includes(category); let customRibbonCategoryComponent = undefined; - let customDescription = customDescriptionProp; + let customDescription; if (idSubjectDID && idDisplayType === ID_CARD_DISPLAY_TYPES.PermanentResidentCard) { customDescription = ; @@ -335,8 +303,6 @@ export const VCDisplayCardWrapper2: React.FC = ({ bottomButton={bottomButton} customLinkedCredentialsComponent={customLinkedCredentialsComponent} customBodyContentSlot={customBodyContentSlot} - onDotsClick={onDotsClick} - unknownVerifierTitle={unknownVerifierTitle} /> ); }; diff --git a/packages/learn-card-base/src/components/wrappers/BoostGenericCardWrapper.tsx b/packages/learn-card-base/src/components/wrappers/BoostGenericCardWrapper.tsx index bd1a000aa4..e0f9ec0a55 100644 --- a/packages/learn-card-base/src/components/wrappers/BoostGenericCardWrapper.tsx +++ b/packages/learn-card-base/src/components/wrappers/BoostGenericCardWrapper.tsx @@ -44,7 +44,6 @@ type BoostGenericCardWrapperProps = { displayType?: string; uri?: string; indicatorColor?: string; - unknownVerifierTitle?: string; }; export const BoostGenericCardWrapper: React.FC = ({ @@ -77,7 +76,6 @@ export const BoostGenericCardWrapper: React.FC = ( displayType, uri, indicatorColor, - unknownVerifierTitle, }) => { if (boostPageViewMode === BoostPageViewMode.List) { return ( @@ -95,7 +93,6 @@ export const BoostGenericCardWrapper: React.FC = ( thumbImgSrc={thumbImgSrc} indicatorColor={indicatorColor} uri={uri} - unknownVerifierTitle={unknownVerifierTitle} /> ); } @@ -126,8 +123,6 @@ export const BoostGenericCardWrapper: React.FC = ( ) } diff --git a/packages/learn-card-base/src/helpers/careerOneStop.helpers.ts b/packages/learn-card-base/src/helpers/careerOneStop.helpers.ts new file mode 100644 index 0000000000..4187a606b3 --- /dev/null +++ b/packages/learn-card-base/src/helpers/careerOneStop.helpers.ts @@ -0,0 +1,3118 @@ +export type CareerOneStopVideo = { + youtubeUrl: string; + OnetCode: string; + OnetTitle: string; + VideoCode: string; +}; + +export const CAREER_ONE_STOP_VIDEOS: CareerOneStopVideo[] = [ + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=2rSN2E1_aPQ', + 'OnetCode': '11-1011.00', + 'OnetTitle': 'Chief Executives', + 'VideoCode': '11101100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=KHi_Vns5gc4', + 'OnetCode': '11-1011.03', + 'OnetTitle': 'Chief Sustainability Officers', + 'VideoCode': '11101103', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=H50czhsoeys', + 'OnetCode': '11-1031.00', + 'OnetTitle': 'Legislators', + 'VideoCode': '11103100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=eHpCwZMQjxk', + 'OnetCode': '11-2011.00', + 'OnetTitle': 'Advertising and Promotions Managers', + 'VideoCode': '11201100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=8r-nFPlKELc', + 'OnetCode': '11-2021.00', + 'OnetTitle': 'Marketing Managers', + 'VideoCode': '11202100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=A7Rdneots0M', + 'OnetCode': '11-2022.00', + 'OnetTitle': 'Sales Managers', + 'VideoCode': '11202200', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=Hik6s9nEA2w', + 'OnetCode': '11-2032.00', + 'OnetTitle': 'Public Relations Managers', + 'VideoCode': '11203200', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=vd_bjToRF3Y', + 'OnetCode': '11-3012.00', + 'OnetTitle': 'Administrative Services Managers', + 'VideoCode': '11301200', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=IsNnfY_vbLU', + 'OnetCode': '11-3013.01', + 'OnetTitle': 'Security Managers', + 'VideoCode': '11301301', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=WQmsKH7mIqo', + 'OnetCode': '11-3021.00', + 'OnetTitle': 'Computer and Information Systems Managers', + 'VideoCode': '11302100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=v60RVdv_FiI', + 'OnetCode': '11-3031.00', + 'OnetTitle': 'Financial Managers', + 'VideoCode': '11303100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=e0zNNl2ZhYI', + 'OnetCode': '11-3031.01', + 'OnetTitle': 'Treasurers and Controllers', + 'VideoCode': '11303101', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=2-4iYM5ElWI', + 'OnetCode': '11-3031.03', + 'OnetTitle': 'Investment Fund Managers', + 'VideoCode': '11303103', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=DiPbRluXk1o', + 'OnetCode': '11-3051.00', + 'OnetTitle': 'Industrial Production Managers', + 'VideoCode': '11305100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=kaykvW_oKc4', + 'OnetCode': '11-3051.01', + 'OnetTitle': 'Quality Control Systems Managers', + 'VideoCode': '11305101', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=tPfZHPZDhrc', + 'OnetCode': '11-3051.02', + 'OnetTitle': 'Geothermal Production Managers', + 'VideoCode': '11305102', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=TcOVIuaWjOU', + 'OnetCode': '11-3051.04', + 'OnetTitle': 'Biomass Power Plant Managers', + 'VideoCode': '11305104', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=M2dXriu30nA', + 'OnetCode': '11-3061.00', + 'OnetTitle': 'Purchasing Managers', + 'VideoCode': '11306100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=YC3poJtG4Ng', + 'OnetCode': '11-3071.04', + 'OnetTitle': 'Supply Chain Managers', + 'VideoCode': '11307104', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=x6NTfg_3Wh0', + 'OnetCode': '11-3121.00', + 'OnetTitle': 'Human Resources Managers', + 'VideoCode': '11312100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=5ds5MUyF6Lw', + 'OnetCode': '11-3131.00', + 'OnetTitle': 'Training and Development Managers', + 'VideoCode': '11313100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=b7ULrhxJwPs', + 'OnetCode': '11-9013.00', + 'OnetTitle': 'Farmers, Ranchers, and Other Agricultural Managers', + 'VideoCode': '11901300', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=SiamJadljrw', + 'OnetCode': '11-9021.00', + 'OnetTitle': 'Construction Managers', + 'VideoCode': '11902100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=_YWom1RxVgI', + 'OnetCode': '11-9031.00', + 'OnetTitle': 'Education and Childcare Administrators, Preschool and Daycare', + 'VideoCode': '11903100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=SIrzeKtuGbI', + 'OnetCode': '11-9032.00', + 'OnetTitle': 'Education Administrators, Kindergarten through Secondary', + 'VideoCode': '11903200', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=W44AXajj8ik', + 'OnetCode': '11-9033.00', + 'OnetTitle': 'Education Administrators, Postsecondary', + 'VideoCode': '11903300', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=iI2gYXu8ffQ', + 'OnetCode': '11-9041.00', + 'OnetTitle': 'Architectural and Engineering Managers', + 'VideoCode': '11904100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=ye4BhQYj7JA', + 'OnetCode': '11-9041.01', + 'OnetTitle': 'Biofuels/Biodiesel Technology and Product Development Managers', + 'VideoCode': '11904101', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=OzTbTaVPM2w', + 'OnetCode': '11-9051.00', + 'OnetTitle': 'Food Service Managers', + 'VideoCode': '11905100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=PK-CdIrJuOw', + 'OnetCode': '11-9071.00', + 'OnetTitle': 'Gambling Managers', + 'VideoCode': '11907100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=N6wsqmVAvnQ', + 'OnetCode': '11-9081.00', + 'OnetTitle': 'Lodging Managers', + 'VideoCode': '11908100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=jmh01pXYn5I', + 'OnetCode': '11-9111.00', + 'OnetTitle': 'Medical and Health Services Managers', + 'VideoCode': '11911100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=faXbaiNn2HM', + 'OnetCode': '11-9121.00', + 'OnetTitle': 'Natural Sciences Managers', + 'VideoCode': '11912100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=tiKsOVsUrD4', + 'OnetCode': '11-9121.01', + 'OnetTitle': 'Clinical Research Coordinators', + 'VideoCode': '11912101', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=-8r6ajEIiQE', + 'OnetCode': '11-9121.02', + 'OnetTitle': 'Water Resource Specialists', + 'VideoCode': '11912102', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=ixlvQmz-KtU', + 'OnetCode': '11-9141.00', + 'OnetTitle': 'Property, Real Estate, and Community Association Managers', + 'VideoCode': '11914100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=E24m0WUJ-1M', + 'OnetCode': '11-9151.00', + 'OnetTitle': 'Social and Community Service Managers', + 'VideoCode': '11915100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=uRmE4z1sGbA', + 'OnetCode': '11-9161.00', + 'OnetTitle': 'Emergency Management Directors', + 'VideoCode': '11916100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=k1BeENuyC3o', + 'OnetCode': '11-9171.00', + 'OnetTitle': 'Funeral Home Managers', + 'VideoCode': '11917100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=vkse9J2lSdU', + 'OnetCode': '11-9179.01', + 'OnetTitle': 'Fitness and Wellness Coordinators', + 'VideoCode': '11917901', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=59kzntpMJTQ', + 'OnetCode': '11-9199.01', + 'OnetTitle': 'Regulatory Affairs Managers', + 'VideoCode': '11919901', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=2cfptolQ3iI', + 'OnetCode': '11-9199.02', + 'OnetTitle': 'Compliance Managers', + 'VideoCode': '11919902', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=XfXZeNy3GI0', + 'OnetCode': '11-9199.08', + 'OnetTitle': 'Loss Prevention Managers', + 'VideoCode': '11919908', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=DaxB2MUlmc4', + 'OnetCode': '11-9199.09', + 'OnetTitle': 'Wind Energy Operations Managers', + 'VideoCode': '11919909', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=6PCc8jWpSII', + 'OnetCode': '11-9199.11', + 'OnetTitle': 'Brownfield Redevelopment Specialists and Site Managers', + 'VideoCode': '11919911', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=NzIMLlvSIZ4', + 'OnetCode': '13-1011.00', + 'OnetTitle': 'Agents and Business Managers of Artists, Performers, and Athletes', + 'VideoCode': '13101100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=7AHKc4cGJm0', + 'OnetCode': '13-1021.00', + 'OnetTitle': 'Buyers and Purchasing Agents, Farm Products', + 'VideoCode': '13102100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=BPw4pUuJlYM', + 'OnetCode': '13-1031.00', + 'OnetTitle': 'Claims Adjusters, Examiners, and Investigators', + 'VideoCode': '13103100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=XJA8pUMju60', + 'OnetCode': '13-1041.03', + 'OnetTitle': 'Equal Opportunity Representatives and Officers', + 'VideoCode': '13104103', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=Fak_zl7EfTk', + 'OnetCode': '13-1041.04', + 'OnetTitle': 'Government Property Inspectors and Investigators', + 'VideoCode': '13104104', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=6Ung-58rxWk', + 'OnetCode': '13-1041.06', + 'OnetTitle': 'Coroners', + 'VideoCode': '13104106', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=H0AMfxRWb3U', + 'OnetCode': '13-1051.00', + 'OnetTitle': 'Cost Estimators', + 'VideoCode': '13105100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=3jTLYwteH2Q', + 'OnetCode': '13-1071.00', + 'OnetTitle': 'Human Resources Specialists', + 'VideoCode': '13107100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=X76934606a4', + 'OnetCode': '13-1074.00', + 'OnetTitle': 'Farm Labor Contractors', + 'VideoCode': '13107400', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=Yjm5oPforTE', + 'OnetCode': '13-1075.00', + 'OnetTitle': 'Labor Relations Specialists', + 'VideoCode': '13107500', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=42uJcWOD1ts', + 'OnetCode': '13-1081.00', + 'OnetTitle': 'Logisticians', + 'VideoCode': '13108100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=19vtHHKOXFQ', + 'OnetCode': '13-1082.00', + 'OnetTitle': 'Project Management Specialists', + 'VideoCode': '13108200', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=TWXBadjTgz0', + 'OnetCode': '13-1111.00', + 'OnetTitle': 'Management Analysts', + 'VideoCode': '13111100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=JjVva0cJI-k', + 'OnetCode': '13-1121.00', + 'OnetTitle': 'Meeting, Convention, and Event Planners', + 'VideoCode': '13112100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=s8Y4luvlupw', + 'OnetCode': '13-1141.00', + 'OnetTitle': 'Compensation, Benefits, and Job Analysis Specialists', + 'VideoCode': '13114100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=-0eCYWbjbyU', + 'OnetCode': '13-1151.00', + 'OnetTitle': 'Training and Development Specialists', + 'VideoCode': '13115100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=ijEovAUjj-8', + 'OnetCode': '13-1161.00', + 'OnetTitle': 'Market Research Analysts and Marketing Specialists', + 'VideoCode': '13116100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=jl-EZZOa3OI', + 'OnetCode': '13-1161.01', + 'OnetTitle': 'Search Marketing Strategists', + 'VideoCode': '13116101', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=wULJrt8TERU', + 'OnetCode': '13-1199.06', + 'OnetTitle': 'Online Merchants', + 'VideoCode': '13119906', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=u9pgua9hT6k', + 'OnetCode': '13-2011.00', + 'OnetTitle': 'Accountants and Auditors', + 'VideoCode': '13201100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=EopcFicaG1k', + 'OnetCode': '13-2023.00', + 'OnetTitle': 'Appraisers and Assessors of Real Estate', + 'VideoCode': '13202300', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=b7VZ_myj3s8', + 'OnetCode': '13-2031.00', + 'OnetTitle': 'Budget Analysts', + 'VideoCode': '13203100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=L6XEA6LQMT8', + 'OnetCode': '13-2041.00', + 'OnetTitle': 'Credit Analysts', + 'VideoCode': '13204100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=MeFAGixP6NE', + 'OnetCode': '13-2051.00', + 'OnetTitle': 'Financial and Investment Analysts', + 'VideoCode': '13205100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=fHqgZBsjWJs', + 'OnetCode': '13-2052.00', + 'OnetTitle': 'Personal Financial Advisors', + 'VideoCode': '13205200', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=4PG3pK1Xv9o', + 'OnetCode': '13-2053.00', + 'OnetTitle': 'Insurance Underwriters', + 'VideoCode': '13205300', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=pxrRR1mcth4', + 'OnetCode': '13-2061.00', + 'OnetTitle': 'Financial Examiners', + 'VideoCode': '13206100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=Dm_6sQ_YTRU', + 'OnetCode': '13-2072.00', + 'OnetTitle': 'Loan Officers', + 'VideoCode': '13207200', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=pu2Ecmmt5K4', + 'OnetCode': '13-2081.00', + 'OnetTitle': 'Tax Examiners and Collectors, and Revenue Agents', + 'VideoCode': '13208100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=H4-NLeBZ0Wg', + 'OnetCode': '13-2082.00', + 'OnetTitle': 'Tax Preparers', + 'VideoCode': '13208200', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=OPOBeEdBYGE', + 'OnetCode': '13-2099.01', + 'OnetTitle': 'Financial Quantitative Analysts', + 'VideoCode': '13209901', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=T0JdNufvn-o', + 'OnetCode': '15-1211.00', + 'OnetTitle': 'Computer Systems Analysts', + 'VideoCode': '15121100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=XNNvsWdMyr0', + 'OnetCode': '15-1211.01', + 'OnetTitle': 'Health Informatics Specialists', + 'VideoCode': '15121101', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=cVZktAEtWE4', + 'OnetCode': '15-1212.00', + 'OnetTitle': 'Information Security Analysts', + 'VideoCode': '15121200', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=jlZucw7_qWU', + 'OnetCode': '15-1221.00', + 'OnetTitle': 'Computer and Information Research Scientists', + 'VideoCode': '15122100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=xe6GS8kSN1g', + 'OnetCode': '15-1232.00', + 'OnetTitle': 'Computer User Support Specialists', + 'VideoCode': '15123200', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=LGbI0lJT-Ds', + 'OnetCode': '15-1241.00', + 'OnetTitle': 'Computer Network Architects', + 'VideoCode': '15124100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=0lab8NZGqKY', + 'OnetCode': '15-1241.01', + 'OnetTitle': 'Telecommunications Engineering Specialists', + 'VideoCode': '15124101', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=ghEzOJUHrO8', + 'OnetCode': '15-1243.00', + 'OnetTitle': 'Database Architects', + 'VideoCode': '15124300', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=s_sY1XeqB8I', + 'OnetCode': '15-1243.01', + 'OnetTitle': 'Data Warehousing Specialists', + 'VideoCode': '15124301', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=H3kIfqDCY14', + 'OnetCode': '15-1244.00', + 'OnetTitle': 'Network and Computer Systems Administrators', + 'VideoCode': '15124400', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=4FT15GxJQrE', + 'OnetCode': '15-1251.00', + 'OnetTitle': 'Computer Programmers', + 'VideoCode': '15125100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=_WQ_VV4pXPc', + 'OnetCode': '15-1252.00', + 'OnetTitle': 'Software Developers', + 'VideoCode': '15125200', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=Xr-EoC9DHyc', + 'OnetCode': '15-1253.00', + 'OnetTitle': 'Software Quality Assurance Analysts and Testers', + 'VideoCode': '15125300', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=FfxTkIsaTYk', + 'OnetCode': '15-1254.00', + 'OnetTitle': 'Web Developers', + 'VideoCode': '15125400', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=C_AWAsULbRU', + 'OnetCode': '15-1255.01', + 'OnetTitle': 'Video Game Designers', + 'VideoCode': '15125501', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=e0q1x0-XSZc', + 'OnetCode': '15-1299.01', + 'OnetTitle': 'Web Administrators', + 'VideoCode': '15129901', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=Zgsi2bTKEV8', + 'OnetCode': '15-1299.02', + 'OnetTitle': 'Geographic Information Systems Technologists and Technicians', + 'VideoCode': '15129902', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=SkgTtDDt_0E', + 'OnetCode': '15-1299.06', + 'OnetTitle': 'Digital Forensics Analysts', + 'VideoCode': '15129906', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=N0D8Zqgu-3E', + 'OnetCode': '15-1299.07', + 'OnetTitle': 'Blockchain Engineers', + 'VideoCode': '15129907', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=LVkXobqdvbk', + 'OnetCode': '15-1299.09', + 'OnetTitle': 'Information Technology Project Managers', + 'VideoCode': '15129909', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=oy6_S6EzOHw', + 'OnetCode': '15-2011.00', + 'OnetTitle': 'Actuaries', + 'VideoCode': '15201100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=SWZy_WSiMKo', + 'OnetCode': '15-2021.00', + 'OnetTitle': 'Mathematicians', + 'VideoCode': '15202100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=IBWYsytaCbw', + 'OnetCode': '15-2031.00', + 'OnetTitle': 'Operations Research Analysts', + 'VideoCode': '15203100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=hBgseqeDmJE', + 'OnetCode': '15-2041.00', + 'OnetTitle': 'Statisticians', + 'VideoCode': '15204100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=uD8DfbJrqRI', + 'OnetCode': '15-2051.00', + 'OnetTitle': 'Data Scientists', + 'VideoCode': '15205100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=w0Un_0Dqbu8', + 'OnetCode': '15-2051.01', + 'OnetTitle': 'Business Intelligence Analysts', + 'VideoCode': '15205101', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=nymZ3dD-VWE', + 'OnetCode': '17-1011.00', + 'OnetTitle': 'Architects, Except Landscape and Naval', + 'VideoCode': '17101100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=bRsp6BF1NIc', + 'OnetCode': '17-1012.00', + 'OnetTitle': 'Landscape Architects', + 'VideoCode': '17101200', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=5Oj7a2LmVtU', + 'OnetCode': '17-1021.00', + 'OnetTitle': 'Cartographers and Photogrammetrists', + 'VideoCode': '17102100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=xHYyQka2Z7Y', + 'OnetCode': '17-1022.00', + 'OnetTitle': 'Surveyors', + 'VideoCode': '17102200', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=bnxcib-8S4s', + 'OnetCode': '17-2011.00', + 'OnetTitle': 'Aerospace Engineers', + 'VideoCode': '17201100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=ozIUJsnBDLY', + 'OnetCode': '17-2021.00', + 'OnetTitle': 'Agricultural Engineers', + 'VideoCode': '17202100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=hBKj9Uh1PgI', + 'OnetCode': '17-2031.00', + 'OnetTitle': 'Bioengineers and Biomedical Engineers', + 'VideoCode': '17203100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=cFQ4BjDeTME', + 'OnetCode': '17-2041.00', + 'OnetTitle': 'Chemical Engineers', + 'VideoCode': '17204100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=-XIQSrYi0O0', + 'OnetCode': '17-2051.00', + 'OnetTitle': 'Civil Engineers', + 'VideoCode': '17205100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=l09D6OycD4o', + 'OnetCode': '17-2061.00', + 'OnetTitle': 'Computer Hardware Engineers', + 'VideoCode': '17206100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=fhAZ2tZj84A', + 'OnetCode': '17-2071.00', + 'OnetTitle': 'Electrical Engineers', + 'VideoCode': '17207100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=JSxcetMCZZ0', + 'OnetCode': '17-2081.00', + 'OnetTitle': 'Environmental Engineers', + 'VideoCode': '17208100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=Z9gbU7KPAOg', + 'OnetCode': '17-2111.00', + 'OnetTitle': 'Health and Safety Engineers, Except Mining Safety Engineers and Inspectors', + 'VideoCode': '17211100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=kNXMJBQ6oL4', + 'OnetCode': '17-2112.00', + 'OnetTitle': 'Industrial Engineers', + 'VideoCode': '17211200', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=445nfaA6gdI', + 'OnetCode': '17-2121.00', + 'OnetTitle': 'Marine Engineers and Naval Architects', + 'VideoCode': '17212100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=61wd30JO7fk', + 'OnetCode': '17-2131.00', + 'OnetTitle': 'Materials Engineers', + 'VideoCode': '17213100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=bDg2UcaZzcg', + 'OnetCode': '17-2141.00', + 'OnetTitle': 'Mechanical Engineers', + 'VideoCode': '17214100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=6GukCvwaEnM', + 'OnetCode': '17-2151.00', + 'OnetTitle': 'Mining and Geological Engineers, Including Mining Safety Engineers', + 'VideoCode': '17215100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=RX_V2Tt0c4w', + 'OnetCode': '17-2161.00', + 'OnetTitle': 'Nuclear Engineers', + 'VideoCode': '17216100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=U0gVbw2Ynwo', + 'OnetCode': '17-2171.00', + 'OnetTitle': 'Petroleum Engineers', + 'VideoCode': '17217100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=pE1WfAPlPEs', + 'OnetCode': '17-2199.03', + 'OnetTitle': 'Energy Engineers, Except Wind and Solar', + 'VideoCode': '17219903', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=FDIbdmMmbsA', + 'OnetCode': '17-2199.05', + 'OnetTitle': 'Mechatronics Engineers', + 'VideoCode': '17219905', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=y8WjCE-YfeE', + 'OnetCode': '17-3011.00', + 'OnetTitle': 'Architectural and Civil Drafters', + 'VideoCode': '17301100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=1eOnm-61cDE', + 'OnetCode': '17-3021.00', + 'OnetTitle': 'Aerospace Engineering and Operations Technologists and Technicians', + 'VideoCode': '17302100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=a4vYNrfZ6Wo', + 'OnetCode': '17-3022.00', + 'OnetTitle': 'Civil Engineering Technologists and Technicians', + 'VideoCode': '17302200', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=E_Iy34hFITE', + 'OnetCode': '17-3023.00', + 'OnetTitle': 'Electrical and Electronic Engineering Technologists and Technicians', + 'VideoCode': '17302300', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=-3GjrJG6Ds8', + 'OnetCode': '17-3024.00', + 'OnetTitle': 'Electro-Mechanical and Mechatronics Technologists and Technicians', + 'VideoCode': '17302400', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=gBIUUlrJKjU', + 'OnetCode': '17-3025.00', + 'OnetTitle': 'Environmental Engineering Technologists and Technicians', + 'VideoCode': '17302500', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=GhVZTN1pZys', + 'OnetCode': '17-3026.00', + 'OnetTitle': 'Industrial Engineering Technologists and Technicians', + 'VideoCode': '17302600', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=xd0Judgrkzk', + 'OnetCode': '17-3027.00', + 'OnetTitle': 'Mechanical Engineering Technologists and Technicians', + 'VideoCode': '17302700', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=4Pv4KDgx95U', + 'OnetCode': '17-3031.00', + 'OnetTitle': 'Surveying and Mapping Technicians', + 'VideoCode': '17303100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=cWbaZEIe7GQ', + 'OnetCode': '19-1012.00', + 'OnetTitle': 'Food Scientists and Technologists', + 'VideoCode': '19101200', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=c2b7a89VSw8', + 'OnetCode': '19-1021.00', + 'OnetTitle': 'Biochemists and Biophysicists', + 'VideoCode': '19102100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=uoyuggwziWA', + 'OnetCode': '19-1023.00', + 'OnetTitle': 'Zoologists and Wildlife Biologists', + 'VideoCode': '19102300', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=KQLNbjF9kD8', + 'OnetCode': '19-1029.03', + 'OnetTitle': 'Geneticists', + 'VideoCode': '19102903', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=JcAUqJoUgBI', + 'OnetCode': '19-1029.04', + 'OnetTitle': 'Biologists', + 'VideoCode': '19102904', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=PCAudFo7Eo4', + 'OnetCode': '19-1031.00', + 'OnetTitle': 'Conservation Scientists', + 'VideoCode': '19103100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=zBGnuQurqOU', + 'OnetCode': '19-1031.03', + 'OnetTitle': 'Park Naturalists', + 'VideoCode': '19103103', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=8aOy6HpXuLk', + 'OnetCode': '19-1032.00', + 'OnetTitle': 'Foresters', + 'VideoCode': '19103200', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=vGXPzV9e-jw', + 'OnetCode': '19-1041.00', + 'OnetTitle': 'Epidemiologists', + 'VideoCode': '19104100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=pgzYw77KRsU', + 'OnetCode': '19-1042.00', + 'OnetTitle': 'Medical Scientists, Except Epidemiologists', + 'VideoCode': '19104200', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=9lVTE_bq3lw', + 'OnetCode': '19-2012.00', + 'OnetTitle': 'Physicists', + 'VideoCode': '19201200', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=2Hof_Cs5d0Y', + 'OnetCode': '19-2021.00', + 'OnetTitle': 'Atmospheric and Space Scientists', + 'VideoCode': '19202100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=F1Dd4TxyuFI', + 'OnetCode': '19-2031.00', + 'OnetTitle': 'Chemists', + 'VideoCode': '19203100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=447oFgVvKno', + 'OnetCode': '19-2041.00', + 'OnetTitle': 'Environmental Scientists and Specialists, Including Health', + 'VideoCode': '19204100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=tNCUbLoD5Io', + 'OnetCode': '19-2042.00', + 'OnetTitle': 'Geoscientists, Except Hydrologists and Geographers', + 'VideoCode': '19204200', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=yd3MvZEdQi4', + 'OnetCode': '19-2043.00', + 'OnetTitle': 'Hydrologists', + 'VideoCode': '19204300', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=93j6ogDWhfY', + 'OnetCode': '19-2099.01', + 'OnetTitle': 'Remote Sensing Scientists and Technologists', + 'VideoCode': '19209901', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=JjXC3QyTHNA', + 'OnetCode': '19-3011.00', + 'OnetTitle': 'Economists', + 'VideoCode': '19301100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=Dk4vhw0ia0s', + 'OnetCode': '19-3022.00', + 'OnetTitle': 'Survey Researchers', + 'VideoCode': '19302200', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=2Ie6AbQOpBM', + 'OnetCode': '19-3032.00', + 'OnetTitle': 'Industrial-Organizational Psychologists', + 'VideoCode': '19303200', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=AarAP2ur7gQ', + 'OnetCode': '19-3033.00', + 'OnetTitle': 'Clinical and Counseling Psychologists', + 'VideoCode': '19303300', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=wZw9ZPv6lts', + 'OnetCode': '19-3034.00', + 'OnetTitle': 'School Psychologists', + 'VideoCode': '19303400', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=hhfmwmdoqBU', + 'OnetCode': '19-3039.02', + 'OnetTitle': 'Neuropsychologists', + 'VideoCode': '19303902', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=NFvy_Jll8eY', + 'OnetCode': '19-3041.00', + 'OnetTitle': 'Sociologists', + 'VideoCode': '19304100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=sdrsY1vz1SU', + 'OnetCode': '19-3051.00', + 'OnetTitle': 'Urban and Regional Planners', + 'VideoCode': '19305100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=ypxwqsWshJ0', + 'OnetCode': '19-3091.00', + 'OnetTitle': 'Anthropologists and Archeologists', + 'VideoCode': '19309100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=RWZxnXzhet0', + 'OnetCode': '19-3092.00', + 'OnetTitle': 'Geographers', + 'VideoCode': '19309200', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=FQ2WMg6rs2s', + 'OnetCode': '19-4012.00', + 'OnetTitle': 'Agricultural Technicians', + 'VideoCode': '19401200', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=QEr_X2rDM-0', + 'OnetCode': '19-4021.00', + 'OnetTitle': 'Biological Technicians', + 'VideoCode': '19402100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=tLwKn5W7Bjo', + 'OnetCode': '19-4031.00', + 'OnetTitle': 'Chemical Technicians', + 'VideoCode': '19403100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=lxmbHQnxnZg', + 'OnetCode': '19-4042.00', + 'OnetTitle': 'Environmental Science and Protection Technicians, Including Health', + 'VideoCode': '19404200', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=wB2nC36pIG4', + 'OnetCode': '19-4043.00', + 'OnetTitle': 'Geological Technicians, Except Hydrologic Technicians', + 'VideoCode': '19404300', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=9hMw7sWG1Ys', + 'OnetCode': '19-4061.00', + 'OnetTitle': 'Social Science Research Assistants', + 'VideoCode': '19406100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=N0avxorvSOM', + 'OnetCode': '19-4092.00', + 'OnetTitle': 'Forensic Science Technicians', + 'VideoCode': '19409200', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=8qj18Q4EhUQ', + 'OnetCode': '19-5011.00', + 'OnetTitle': 'Occupational Health and Safety Specialists', + 'VideoCode': '19501100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=pM_Xfm1Zdvk', + 'OnetCode': '21-1011.00', + 'OnetTitle': 'Substance Abuse and Behavioral Disorder Counselors', + 'VideoCode': '21101100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=aPtHL33Velc', + 'OnetCode': '21-1012.00', + 'OnetTitle': 'Educational, Guidance, and Career Counselors and Advisors', + 'VideoCode': '21101200', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=Yq2ylfyP9VY', + 'OnetCode': '21-1013.00', + 'OnetTitle': 'Marriage and Family Therapists', + 'VideoCode': '21101300', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=LXu7dv-Suo8', + 'OnetCode': '21-1015.00', + 'OnetTitle': 'Rehabilitation Counselors', + 'VideoCode': '21101500', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=HvzxznYOhQM', + 'OnetCode': '21-1021.00', + 'OnetTitle': 'Child, Family, and School Social Workers', + 'VideoCode': '21102100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=S3iiYP_ZJSI', + 'OnetCode': '21-1022.00', + 'OnetTitle': 'Healthcare Social Workers', + 'VideoCode': '21102200', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=njDjnXStDO4', + 'OnetCode': '21-1023.00', + 'OnetTitle': 'Mental Health and Substance Abuse Social Workers', + 'VideoCode': '21102300', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=ntfDZQCq2hc', + 'OnetCode': '21-1091.00', + 'OnetTitle': 'Health Education Specialists', + 'VideoCode': '21109100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=rB8Zh8_1J9A', + 'OnetCode': '21-1092.00', + 'OnetTitle': 'Probation Officers and Correctional Treatment Specialists', + 'VideoCode': '21109200', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=l95aYB7OhwI', + 'OnetCode': '21-1093.00', + 'OnetTitle': 'Social and Human Service Assistants', + 'VideoCode': '21109300', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=j1t-b6hMAz8', + 'OnetCode': '21-2011.00', + 'OnetTitle': 'Clergy', + 'VideoCode': '21201100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=aK2PVtgWLp8', + 'OnetCode': '23-1011.00', + 'OnetTitle': 'Lawyers', + 'VideoCode': '23101100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=eWQfecbwCB0', + 'OnetCode': '23-1012.00', + 'OnetTitle': 'Judicial Law Clerks', + 'VideoCode': '23101200', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=je1rWe2TpvY', + 'OnetCode': '23-1021.00', + 'OnetTitle': 'Administrative Law Judges, Adjudicators, and Hearing Officers', + 'VideoCode': '23102100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=CCWSjaHA6lM', + 'OnetCode': '23-1022.00', + 'OnetTitle': 'Arbitrators, Mediators, and Conciliators', + 'VideoCode': '23102200', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=zFykfBc-oIA', + 'OnetCode': '23-2011.00', + 'OnetTitle': 'Paralegals and Legal Assistants', + 'VideoCode': '23201100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=5sxEoT1LgnY', + 'OnetCode': '23-2093.00', + 'OnetTitle': 'Title Examiners, Abstractors, and Searchers', + 'VideoCode': '23209300', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=ISmxPVS5O2c', + 'OnetCode': '25-1011.00', + 'OnetTitle': 'Business Teachers, Postsecondary', + 'VideoCode': '25101100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=SyaadOdVyAE', + 'OnetCode': '25-2011.00', + 'OnetTitle': 'Preschool Teachers, Except Special Education', + 'VideoCode': '25201100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=VRB818Z8Xhs', + 'OnetCode': '25-2021.00', + 'OnetTitle': 'Elementary School Teachers, Except Special Education', + 'VideoCode': '25202100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=EQcg5di-Nz4', + 'OnetCode': '25-2023.00', + 'OnetTitle': 'Career/Technical Education Teachers, Middle School', + 'VideoCode': '25202300', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=tSeStFsCZrQ', + 'OnetCode': '25-2031.00', + 'OnetTitle': 'Secondary School Teachers, Except Special and Career/Technical Education', + 'VideoCode': '25203100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=OkpBupS1SSY', + 'OnetCode': '25-2056.00', + 'OnetTitle': 'Special Education Teachers, Elementary School', + 'VideoCode': '25205600', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=fxgWjQrwBls', + 'OnetCode': '25-3011.00', + 'OnetTitle': + 'Adult Basic Education, Adult Secondary Education, and English as a Second Language Instructors', + 'VideoCode': '25301100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=O0lPaCJtSkg', + 'OnetCode': '25-3021.00', + 'OnetTitle': 'Self-Enrichment Teachers', + 'VideoCode': '25302100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=CfL199nD-Ow', + 'OnetCode': '25-3041.00', + 'OnetTitle': 'Tutors', + 'VideoCode': '25304100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=vPSxEEphI98', + 'OnetCode': '25-4011.00', + 'OnetTitle': 'Archivists', + 'VideoCode': '25401100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=zLYjrT_jvY0', + 'OnetCode': '25-4012.00', + 'OnetTitle': 'Curators', + 'VideoCode': '25401200', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=MyOpL1Q8N-Y', + 'OnetCode': '25-4022.00', + 'OnetTitle': 'Librarians and Media Collections Specialists', + 'VideoCode': '25402200', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=C6SVLIBmfkc', + 'OnetCode': '25-4031.00', + 'OnetTitle': 'Library Technicians', + 'VideoCode': '25403100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=7XjEi-jgJWs', + 'OnetCode': '25-9021.00', + 'OnetTitle': 'Farm and Home Management Educators', + 'VideoCode': '25902100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=nzjceSQgpCo', + 'OnetCode': '25-9031.00', + 'OnetTitle': 'Instructional Coordinators', + 'VideoCode': '25903100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=rDuhh_0d5XI', + 'OnetCode': '25-9042.00', + 'OnetTitle': + 'Teaching Assistants, Preschool, Elementary, Middle, and Secondary School, Except Special Education', + 'VideoCode': '25904200', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=IbD3EVuJbj4', + 'OnetCode': '25-9044.00', + 'OnetTitle': 'Teaching Assistants, Postsecondary', + 'VideoCode': '25904400', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=0xZz2t-Ex1I', + 'OnetCode': '27-1011.00', + 'OnetTitle': 'Art Directors', + 'VideoCode': '27101100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=T_X9ZdUq-2Q', + 'OnetCode': '27-1012.00', + 'OnetTitle': 'Craft Artists', + 'VideoCode': '27101200', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=3ysMK6yrtpY', + 'OnetCode': '27-1013.00', + 'OnetTitle': 'Fine Artists, Including Painters, Sculptors, and Illustrators', + 'VideoCode': '27101300', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=B-rvPATE0vs', + 'OnetCode': '27-1014.00', + 'OnetTitle': 'Special Effects Artists and Animators', + 'VideoCode': '27101400', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=1wS2I0dCdc4', + 'OnetCode': '27-1021.00', + 'OnetTitle': 'Commercial and Industrial Designers', + 'VideoCode': '27102100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=JPohQlpzTxY', + 'OnetCode': '27-1022.00', + 'OnetTitle': 'Fashion Designers', + 'VideoCode': '27102200', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=OF4-CWR2XE8', + 'OnetCode': '27-1023.00', + 'OnetTitle': 'Floral Designers', + 'VideoCode': '27102300', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=dt6td67yF9E', + 'OnetCode': '27-1024.00', + 'OnetTitle': 'Graphic Designers', + 'VideoCode': '27102400', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=dKbMFDf1ftk', + 'OnetCode': '27-1025.00', + 'OnetTitle': 'Interior Designers', + 'VideoCode': '27102500', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=w961haPAZR8', + 'OnetCode': '27-1026.00', + 'OnetTitle': 'Merchandise Displayers and Window Trimmers', + 'VideoCode': '27102600', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=gDCC1oLsbW8', + 'OnetCode': '27-1027.00', + 'OnetTitle': 'Set and Exhibit Designers', + 'VideoCode': '27102700', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=RrrnUDgW-gU', + 'OnetCode': '27-2011.00', + 'OnetTitle': 'Actors', + 'VideoCode': '27201100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=lFyGWnWtXdw', + 'OnetCode': '27-2012.00', + 'OnetTitle': 'Producers and Directors', + 'VideoCode': '27201200', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=RODqcfjGEyY', + 'OnetCode': '27-2021.00', + 'OnetTitle': 'Athletes and Sports Competitors', + 'VideoCode': '27202100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=ZHALrtdG9CI', + 'OnetCode': '27-2022.00', + 'OnetTitle': 'Coaches and Scouts', + 'VideoCode': '27202200', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=8PPxWjMK9vk', + 'OnetCode': '27-2023.00', + 'OnetTitle': 'Umpires, Referees, and Other Sports Officials', + 'VideoCode': '27202300', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=FtSPtJmzXH4', + 'OnetCode': '27-2031.00', + 'OnetTitle': 'Dancers', + 'VideoCode': '27203100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=7MauqpLTixg', + 'OnetCode': '27-2032.00', + 'OnetTitle': 'Choreographers', + 'VideoCode': '27203200', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=TflQCpu4vos', + 'OnetCode': '27-2041.00', + 'OnetTitle': 'Music Directors and Composers', + 'VideoCode': '27204100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=6QiYFsdYKbY', + 'OnetCode': '27-2042.00', + 'OnetTitle': 'Musicians and Singers', + 'VideoCode': '27204200', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=ftGPn35lNhw', + 'OnetCode': '27-3011.00', + 'OnetTitle': 'Broadcast Announcers and Radio Disc Jockeys', + 'VideoCode': '27301100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=4CCXawD3Z1M', + 'OnetCode': '27-3023.00', + 'OnetTitle': 'News Analysts, Reporters, and Journalists', + 'VideoCode': '27302300', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=_C_YAnEwLFI', + 'OnetCode': '27-3031.00', + 'OnetTitle': 'Public Relations Specialists', + 'VideoCode': '27303100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=GHRV97JDJbw', + 'OnetCode': '27-3041.00', + 'OnetTitle': 'Editors', + 'VideoCode': '27304100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=y-5cvUiXW7I', + 'OnetCode': '27-3042.00', + 'OnetTitle': 'Technical Writers', + 'VideoCode': '27304200', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=QQ7xfQqRhKk', + 'OnetCode': '27-3091.00', + 'OnetTitle': 'Interpreters and Translators', + 'VideoCode': '27309100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=SDoTIgKwLZM', + 'OnetCode': '27-4011.00', + 'OnetTitle': 'Audio and Video Technicians', + 'VideoCode': '27401100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=CatO5oh7Sws', + 'OnetCode': '27-4015.00', + 'OnetTitle': 'Lighting Technicians', + 'VideoCode': '27401500', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=dmS_aX8obCo', + 'OnetCode': '27-4021.00', + 'OnetTitle': 'Photographers', + 'VideoCode': '27402100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=2rteMoNNixs', + 'OnetCode': '27-4031.00', + 'OnetTitle': 'Camera Operators, Television, Video, and Film', + 'VideoCode': '27403100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=a3TG2BhntlY', + 'OnetCode': '27-4032.00', + 'OnetTitle': 'Film and Video Editors', + 'VideoCode': '27403200', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=1zfzbKIfBBA', + 'OnetCode': '29-1011.00', + 'OnetTitle': 'Chiropractors', + 'VideoCode': '29101100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=xjSg0OIigI0', + 'OnetCode': '29-1021.00', + 'OnetTitle': 'Dentists, General', + 'VideoCode': '29102100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=BfKDx0iuuSY', + 'OnetCode': '29-1022.00', + 'OnetTitle': 'Oral and Maxillofacial Surgeons', + 'VideoCode': '29102200', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=Wr5kYH994Xw', + 'OnetCode': '29-1023.00', + 'OnetTitle': 'Orthodontists', + 'VideoCode': '29102300', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=svjsSPKOknw', + 'OnetCode': '29-1024.00', + 'OnetTitle': 'Prosthodontists', + 'VideoCode': '29102400', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=lIiOEkC8n1A', + 'OnetCode': '29-1031.00', + 'OnetTitle': 'Dietitians and Nutritionists', + 'VideoCode': '29103100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=W3i9XXhA7cM', + 'OnetCode': '29-1041.00', + 'OnetTitle': 'Optometrists', + 'VideoCode': '29104100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=ploFnvE1770', + 'OnetCode': '29-1051.00', + 'OnetTitle': 'Pharmacists', + 'VideoCode': '29105100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=PyLvqjTeMXM', + 'OnetCode': '29-1071.00', + 'OnetTitle': 'Physician Assistants', + 'VideoCode': '29107100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=1lVwCvSXCws', + 'OnetCode': '29-1081.00', + 'OnetTitle': 'Podiatrists', + 'VideoCode': '29108100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=b6ZZlvsYc3k', + 'OnetCode': '29-1122.00', + 'OnetTitle': 'Occupational Therapists', + 'VideoCode': '29112200', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=FOF71Lb5SkA', + 'OnetCode': '29-1123.00', + 'OnetTitle': 'Physical Therapists', + 'VideoCode': '29112300', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=3EeitoVlKs8', + 'OnetCode': '29-1124.00', + 'OnetTitle': 'Radiation Therapists', + 'VideoCode': '29112400', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=UhgnfQG_IP4', + 'OnetCode': '29-1125.00', + 'OnetTitle': 'Recreational Therapists', + 'VideoCode': '29112500', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=1uC9I02SslA', + 'OnetCode': '29-1126.00', + 'OnetTitle': 'Respiratory Therapists', + 'VideoCode': '29112600', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=TGeXedoJ764', + 'OnetCode': '29-1127.00', + 'OnetTitle': 'Speech-Language Pathologists', + 'VideoCode': '29112700', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=pWnrk93KdqU', + 'OnetCode': '29-1128.00', + 'OnetTitle': 'Exercise Physiologists', + 'VideoCode': '29112800', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=qcJPBYQzClM', + 'OnetCode': '29-1129.01', + 'OnetTitle': 'Art Therapists', + 'VideoCode': '29112901', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=T_SvD-fPdZM', + 'OnetCode': '29-1129.02', + 'OnetTitle': 'Music Therapists', + 'VideoCode': '29112902', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=oVADsUt6474', + 'OnetCode': '29-1131.00', + 'OnetTitle': 'Veterinarians', + 'VideoCode': '29113100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=x4Y_2fpET0U', + 'OnetCode': '29-1141.00', + 'OnetTitle': 'Registered Nurses', + 'VideoCode': '29114100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=E634wyvUtnU', + 'OnetCode': '29-1151.00', + 'OnetTitle': 'Nurse Anesthetists', + 'VideoCode': '29115100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=jRFfwIwFf38', + 'OnetCode': '29-1161.00', + 'OnetTitle': 'Nurse Midwives', + 'VideoCode': '29116100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=smiXChYIRUU', + 'OnetCode': '29-1171.00', + 'OnetTitle': 'Nurse Practitioners', + 'VideoCode': '29117100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=B7Jm90Zen20', + 'OnetCode': '29-1181.00', + 'OnetTitle': 'Audiologists', + 'VideoCode': '29118100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=6Ixvw0PpE6s', + 'OnetCode': '29-1211.00', + 'OnetTitle': 'Anesthesiologists', + 'VideoCode': '29121100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=sFylCoZCT4s', + 'OnetCode': '29-1215.00', + 'OnetTitle': 'Family Medicine Physicians', + 'VideoCode': '29121500', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=qdVM5aDfbjU', + 'OnetCode': '29-1216.00', + 'OnetTitle': 'General Internal Medicine Physicians', + 'VideoCode': '29121600', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=d5gliPZ-ZNo', + 'OnetCode': '29-1218.00', + 'OnetTitle': 'Obstetricians and Gynecologists', + 'VideoCode': '29121800', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=sBpe7x2rJmo', + 'OnetCode': '29-1221.00', + 'OnetTitle': 'Pediatricians, General', + 'VideoCode': '29122100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=vREihxXcR8g', + 'OnetCode': '29-1242.00', + 'OnetTitle': 'Orthopedic Surgeons, Except Pediatric', + 'VideoCode': '29124200', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=wyd4WsilzJE', + 'OnetCode': '29-1291.00', + 'OnetTitle': 'Acupuncturists', + 'VideoCode': '29129100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=TeAtDfCQ0J4', + 'OnetCode': '29-1292.00', + 'OnetTitle': 'Dental Hygienists', + 'VideoCode': '29129200', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=KG436Ffs1B4', + 'OnetCode': '29-1299.01', + 'OnetTitle': 'Naturopathic Physicians', + 'VideoCode': '29129901', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=TYKaZhDUfs4', + 'OnetCode': '29-1299.02', + 'OnetTitle': 'Orthoptists', + 'VideoCode': '29129902', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=tm2KBoKns78', + 'OnetCode': '29-2011.00', + 'OnetTitle': 'Medical and Clinical Laboratory Technologists', + 'VideoCode': '29201100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=dOAVE3gupq8', + 'OnetCode': '29-2031.00', + 'OnetTitle': 'Cardiovascular Technologists and Technicians', + 'VideoCode': '29203100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=GYLfPP0UQWw', + 'OnetCode': '29-2032.00', + 'OnetTitle': 'Diagnostic Medical Sonographers', + 'VideoCode': '29203200', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=dI4kdhlAlKU', + 'OnetCode': '29-2033.00', + 'OnetTitle': 'Nuclear Medicine Technologists', + 'VideoCode': '29203300', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=yGieTgpDy0Y', + 'OnetCode': '29-2034.00', + 'OnetTitle': 'Radiologic Technologists and Technicians', + 'VideoCode': '29203400', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=NKvTpqVAJSI', + 'OnetCode': '29-2035.00', + 'OnetTitle': 'Magnetic Resonance Imaging Technologists', + 'VideoCode': '29203500', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=C8zIHk9KKqI', + 'OnetCode': '29-2042.00', + 'OnetTitle': 'Emergency Medical Technicians', + 'VideoCode': '29204200', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=sa9cUE2hWZ8', + 'OnetCode': '29-2051.00', + 'OnetTitle': 'Dietetic Technicians', + 'VideoCode': '29205100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=xmQM3R-Ijj4', + 'OnetCode': '29-2052.00', + 'OnetTitle': 'Pharmacy Technicians', + 'VideoCode': '29205200', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=21e2Kv9qzGU', + 'OnetCode': '29-2053.00', + 'OnetTitle': 'Psychiatric Technicians', + 'VideoCode': '29205300', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=i3n0UqojVA0', + 'OnetCode': '29-2055.00', + 'OnetTitle': 'Surgical Technologists', + 'VideoCode': '29205500', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=CHuStDPc2pM', + 'OnetCode': '29-2056.00', + 'OnetTitle': 'Veterinary Technologists and Technicians', + 'VideoCode': '29205600', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=I4Vu9MAmWek', + 'OnetCode': '29-2057.00', + 'OnetTitle': 'Ophthalmic Medical Technicians', + 'VideoCode': '29205700', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=yTBPYOnNjVU', + 'OnetCode': '29-2061.00', + 'OnetTitle': 'Licensed Practical and Licensed Vocational Nurses', + 'VideoCode': '29206100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=s7hcDF8XiDA', + 'OnetCode': '29-2072.00', + 'OnetTitle': 'Medical Records Specialists', + 'VideoCode': '29207200', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=lP3pmq9p814', + 'OnetCode': '29-2081.00', + 'OnetTitle': 'Opticians, Dispensing', + 'VideoCode': '29208100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=wncQLXXiM00', + 'OnetCode': '29-2091.00', + 'OnetTitle': 'Orthotists and Prosthetists', + 'VideoCode': '29209100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=Xe0JM5NHJy4', + 'OnetCode': '29-2092.00', + 'OnetTitle': 'Hearing Aid Specialists', + 'VideoCode': '29209200', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=MVrDMDUjRN0', + 'OnetCode': '29-2099.08', + 'OnetTitle': 'Patient Representatives', + 'VideoCode': '29209908', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=UNnZ3HhoEEA', + 'OnetCode': '29-9021.00', + 'OnetTitle': 'Health Information Technologists and Medical Registrars', + 'VideoCode': '29902100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=fgW9YauJbQI', + 'OnetCode': '29-9091.00', + 'OnetTitle': 'Athletic Trainers', + 'VideoCode': '29909100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=dUsxWtP5GgE', + 'OnetCode': '29-9092.00', + 'OnetTitle': 'Genetic Counselors', + 'VideoCode': '29909200', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=3sqGOq8_3k0', + 'OnetCode': '29-9099.01', + 'OnetTitle': 'Midwives', + 'VideoCode': '29909901', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=7llPqIH-DdQ', + 'OnetCode': '31-1122.00', + 'OnetTitle': 'Personal Care Aides', + 'VideoCode': '31112200', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=wlSsdECNaiU', + 'OnetCode': '31-1131.00', + 'OnetTitle': 'Nursing Assistants', + 'VideoCode': '31113100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=YqG5tRleeow', + 'OnetCode': '31-2011.00', + 'OnetTitle': 'Occupational Therapy Assistants', + 'VideoCode': '31201100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=fbpS0uBh7b0', + 'OnetCode': '31-2022.00', + 'OnetTitle': 'Physical Therapist Aides', + 'VideoCode': '31202200', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=kgg5Mw0TJJk', + 'OnetCode': '31-9011.00', + 'OnetTitle': 'Massage Therapists', + 'VideoCode': '31901100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=9a4UKMs15WI', + 'OnetCode': '31-9091.00', + 'OnetTitle': 'Dental Assistants', + 'VideoCode': '31909100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=ZsgeduDiK_w', + 'OnetCode': '31-9092.00', + 'OnetTitle': 'Medical Assistants', + 'VideoCode': '31909200', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=bP_emrO746w', + 'OnetCode': '31-9093.00', + 'OnetTitle': 'Medical Equipment Preparers', + 'VideoCode': '31909300', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=PO3cnRsMDuI', + 'OnetCode': '31-9094.00', + 'OnetTitle': 'Medical Transcriptionists', + 'VideoCode': '31909400', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=M7H9heVK-l4', + 'OnetCode': '31-9096.00', + 'OnetTitle': 'Veterinary Assistants and Laboratory Animal Caretakers', + 'VideoCode': '31909600', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=A3c4BlLri_U', + 'OnetCode': '31-9097.00', + 'OnetTitle': 'Phlebotomists', + 'VideoCode': '31909700', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=pBehJNIU_2E', + 'OnetCode': '33-1011.00', + 'OnetTitle': 'First-Line Supervisors of Correctional Officers', + 'VideoCode': '33101100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=DNK5dYGn3Fg', + 'OnetCode': '33-2011.00', + 'OnetTitle': 'Firefighters', + 'VideoCode': '33201100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=GkHwfZIHClg', + 'OnetCode': '33-2021.00', + 'OnetTitle': 'Fire Inspectors and Investigators', + 'VideoCode': '33202100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=Vcnk_bSJsAc', + 'OnetCode': '33-3012.00', + 'OnetTitle': 'Correctional Officers and Jailers', + 'VideoCode': '33301200', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=jk1aQofPQII', + 'OnetCode': '33-3021.00', + 'OnetTitle': 'Detectives and Criminal Investigators', + 'VideoCode': '33302100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=DSL1S_y6D-M', + 'OnetCode': '33-3031.00', + 'OnetTitle': 'Fish and Game Wardens', + 'VideoCode': '33303100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=kMY9hTNi4gQ', + 'OnetCode': '33-3051.04', + 'OnetTitle': 'Customs and Border Protection Officers', + 'VideoCode': '33305104', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=Q9sfzAgTTh4', + 'OnetCode': '33-9011.00', + 'OnetTitle': 'Animal Control Workers', + 'VideoCode': '33901100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=PNOImo84oHI', + 'OnetCode': '33-9021.00', + 'OnetTitle': 'Private Detectives and Investigators', + 'VideoCode': '33902100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=SfdJ2Eh4bHw', + 'OnetCode': '33-9032.00', + 'OnetTitle': 'Security Guards', + 'VideoCode': '33903200', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=rvwnvEnSiWQ', + 'OnetCode': '33-9091.00', + 'OnetTitle': 'Crossing Guards and Flaggers', + 'VideoCode': '33909100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=-J22HUZ4siY', + 'OnetCode': '33-9092.00', + 'OnetTitle': 'Lifeguards, Ski Patrol, and Other Recreational Protective Service Workers', + 'VideoCode': '33909200', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=Ni44QClL3Qw', + 'OnetCode': '33-9093.00', + 'OnetTitle': 'Transportation Security Screeners', + 'VideoCode': '33909300', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=BtAevVMysC0', + 'OnetCode': '35-1011.00', + 'OnetTitle': 'Chefs and Head Cooks', + 'VideoCode': '35101100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=F3mKvjI62ik', + 'OnetCode': '35-1012.00', + 'OnetTitle': 'First-Line Supervisors of Food Preparation and Serving Workers', + 'VideoCode': '35101200', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=kkDvSm1jgjw', + 'OnetCode': '35-2011.00', + 'OnetTitle': 'Cooks, Fast Food', + 'VideoCode': '35201100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=cJG3_7R5NLw', + 'OnetCode': '35-2012.00', + 'OnetTitle': 'Cooks, Institution and Cafeteria', + 'VideoCode': '35201200', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=EqdhFUZqS54', + 'OnetCode': '35-2015.00', + 'OnetTitle': 'Cooks, Short Order', + 'VideoCode': '35201500', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=DvUC7xCL6Pc', + 'OnetCode': '35-2021.00', + 'OnetTitle': 'Food Preparation Workers', + 'VideoCode': '35202100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=Y69KZcKLfh0', + 'OnetCode': '35-3011.00', + 'OnetTitle': 'Bartenders', + 'VideoCode': '35301100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=9pFjWggdixM', + 'OnetCode': '35-3023.00', + 'OnetTitle': 'Fast Food and Counter Workers', + 'VideoCode': '35302300', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=OLhPfGa1ZWs', + 'OnetCode': '35-3031.00', + 'OnetTitle': 'Waiters and Waitresses', + 'VideoCode': '35303100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=ECf_jr76hKk', + 'OnetCode': '35-9021.00', + 'OnetTitle': 'Dishwashers', + 'VideoCode': '35902100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=dm55UTRom0Y', + 'OnetCode': '35-9031.00', + 'OnetTitle': 'Hosts and Hostesses, Restaurant, Lounge, and Coffee Shop ', + 'VideoCode': '35903100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=3pZIBcPzE8M', + 'OnetCode': '37-2011.00', + 'OnetTitle': 'Janitors and Cleaners, Except Maids and Housekeeping Cleaners', + 'VideoCode': '37201100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=IZQ9QFrD3Jc', + 'OnetCode': '37-2012.00', + 'OnetTitle': 'Maids and Housekeeping Cleaners', + 'VideoCode': '37201200', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=FApd9FCZ3RQ', + 'OnetCode': '37-2021.00', + 'OnetTitle': 'Pest Control Workers', + 'VideoCode': '37202100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=iggxNwURWLY', + 'OnetCode': '37-3011.00', + 'OnetTitle': 'Landscaping and Groundskeeping Workers', + 'VideoCode': '37301100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=ovQaS2GBxUk', + 'OnetCode': '37-3012.00', + 'OnetTitle': 'Pesticide Handlers, Sprayers, and Applicators, Vegetation', + 'VideoCode': '37301200', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=j-qd6bSnhqQ', + 'OnetCode': '39-1022.00', + 'OnetTitle': 'First-Line Supervisors of Personal Service Workers', + 'VideoCode': '39102200', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=NikLNYdWlys', + 'OnetCode': '39-2011.00', + 'OnetTitle': 'Animal Trainers', + 'VideoCode': '39201100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=REIGWH6Tedw', + 'OnetCode': '39-2021.00', + 'OnetTitle': 'Animal Caretakers', + 'VideoCode': '39202100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=IcCG9JDSJQ8', + 'OnetCode': '39-3031.00', + 'OnetTitle': 'Ushers, Lobby Attendants, and Ticket Takers', + 'VideoCode': '39303100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=kdcu2z8pZAM', + 'OnetCode': '39-3091.00', + 'OnetTitle': 'Amusement and Recreation Attendants', + 'VideoCode': '39309100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=3pMIS8PSrvs', + 'OnetCode': '39-3093.00', + 'OnetTitle': 'Locker Room, Coatroom, and Dressing Room Attendants', + 'VideoCode': '39309300', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=c-IcbRa6Bqc', + 'OnetCode': '39-4031.00', + 'OnetTitle': 'Morticians, Undertakers, and Funeral Arrangers', + 'VideoCode': '39403100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=wqgol3sEFvI', + 'OnetCode': '39-5012.00', + 'OnetTitle': 'Hairdressers, Hairstylists, and Cosmetologists', + 'VideoCode': '39501200', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=GZb4UI2-l9M', + 'OnetCode': '39-5091.00', + 'OnetTitle': 'Makeup Artists, Theatrical and Performance', + 'VideoCode': '39509100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=3hBz4pu6Mwc', + 'OnetCode': '39-5092.00', + 'OnetTitle': 'Manicurists and Pedicurists', + 'VideoCode': '39509200', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=mFQ5Q7slO1M', + 'OnetCode': '39-5094.00', + 'OnetTitle': 'Skincare Specialists', + 'VideoCode': '39509400', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=cgIhM4QzBrY', + 'OnetCode': '39-6011.00', + 'OnetTitle': 'Baggage Porters and Bellhops', + 'VideoCode': '39601100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=GWAhIPKK4wQ', + 'OnetCode': '39-6012.00', + 'OnetTitle': 'Concierges', + 'VideoCode': '39601200', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=dMG4RnJZBwM', + 'OnetCode': '39-7011.00', + 'OnetTitle': 'Tour Guides and Escorts', + 'VideoCode': '39701100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=xjYk0w_MMmw', + 'OnetCode': '39-9011.00', + 'OnetTitle': 'Childcare Workers', + 'VideoCode': '39901100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=QmB0OvKpwR8', + 'OnetCode': '39-9031.00', + 'OnetTitle': 'Exercise Trainers and Group Fitness Instructors', + 'VideoCode': '39903100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=PGHkZcUmptk', + 'OnetCode': '39-9032.00', + 'OnetTitle': 'Recreation Workers', + 'VideoCode': '39903200', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=OviGKeqQ3Ic', + 'OnetCode': '39-9041.00', + 'OnetTitle': 'Residential Advisors', + 'VideoCode': '39904100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=7yuWpixj8jo', + 'OnetCode': '41-1011.00', + 'OnetTitle': 'First-Line Supervisors of Retail Sales Workers', + 'VideoCode': '41101100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=-i93y3g5r-E', + 'OnetCode': '41-2021.00', + 'OnetTitle': 'Counter and Rental Clerks', + 'VideoCode': '41202100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=EK9_RipD4w8', + 'OnetCode': '41-2031.00', + 'OnetTitle': 'Retail Salespersons', + 'VideoCode': '41203100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=Ussc3-AfbWI', + 'OnetCode': '41-3011.00', + 'OnetTitle': 'Advertising Sales Agents', + 'VideoCode': '41301100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=MNCpob3fZHk', + 'OnetCode': '41-3021.00', + 'OnetTitle': 'Insurance Sales Agents', + 'VideoCode': '41302100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=HtCKxDEvR4w', + 'OnetCode': '41-3031.00', + 'OnetTitle': 'Securities, Commodities, and Financial Services Sales Agents', + 'VideoCode': '41303100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=2GEPp0P4Yto', + 'OnetCode': '41-3041.00', + 'OnetTitle': 'Travel Agents', + 'VideoCode': '41304100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=F08mVO5NCzc', + 'OnetCode': '41-3091.00', + 'OnetTitle': + 'Sales Representatives of Services, Except Advertising, Insurance, Financial Services, and Travel', + 'VideoCode': '41309100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=To04x9Um1VM', + 'OnetCode': '41-4011.00', + 'OnetTitle': + 'Sales Representatives, Wholesale and Manufacturing, Technical and Scientific Products', + 'VideoCode': '41401100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=ZNMZ2hFcMgs', + 'OnetCode': '41-9011.00', + 'OnetTitle': 'Demonstrators and Product Promoters', + 'VideoCode': '41901100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=tJTS57dKpTU', + 'OnetCode': '41-9012.00', + 'OnetTitle': 'Models', + 'VideoCode': '41901200', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=Fh03puSzv7g', + 'OnetCode': '41-9022.00', + 'OnetTitle': 'Real Estate Sales Agents', + 'VideoCode': '41902200', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=VoNkYHBgfHo', + 'OnetCode': '41-9031.00', + 'OnetTitle': 'Sales Engineers', + 'VideoCode': '41903100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=_z1KdxvnpMg', + 'OnetCode': '41-9041.00', + 'OnetTitle': 'Telemarketers', + 'VideoCode': '41904100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=H0T3URGur9c', + 'OnetCode': '43-1011.00', + 'OnetTitle': 'First-Line Supervisors of Office and Administrative Support Workers', + 'VideoCode': '43101100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=yo-DfLj5N9I', + 'OnetCode': '43-2021.00', + 'OnetTitle': 'Telephone Operators', + 'VideoCode': '43202100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=1h4A1I2H1Ps', + 'OnetCode': '43-3011.00', + 'OnetTitle': 'Bill and Account Collectors', + 'VideoCode': '43301100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=O7vln6ZTeDY', + 'OnetCode': '43-3021.00', + 'OnetTitle': 'Billing and Posting Clerks', + 'VideoCode': '43302100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=EsOkxSjUEI0', + 'OnetCode': '43-3031.00', + 'OnetTitle': 'Bookkeeping, Accounting, and Auditing Clerks', + 'VideoCode': '43303100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=aSow6zRi58I', + 'OnetCode': '43-3051.00', + 'OnetTitle': 'Payroll and Timekeeping Clerks', + 'VideoCode': '43305100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=pRj54JuKvxk', + 'OnetCode': '43-3071.00', + 'OnetTitle': 'Tellers', + 'VideoCode': '43307100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=dIR9H9SHwVo', + 'OnetCode': '43-4011.00', + 'OnetTitle': 'Brokerage Clerks', + 'VideoCode': '43401100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=vyElcw_5nyo', + 'OnetCode': '43-4041.00', + 'OnetTitle': 'Credit Authorizers, Checkers, and Clerks', + 'VideoCode': '43404100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=0-ERXRCB6Nc', + 'OnetCode': '43-4051.00', + 'OnetTitle': 'Customer Service Representatives', + 'VideoCode': '43405100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=jrJPzRAEtHE', + 'OnetCode': '43-4071.00', + 'OnetTitle': 'File Clerks', + 'VideoCode': '43407100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=0WbyQoehJKE', + 'OnetCode': '43-4111.00', + 'OnetTitle': 'Interviewers, Except Eligibility and Loan', + 'VideoCode': '43411100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=ka8SAQ72yV0', + 'OnetCode': '43-4181.00', + 'OnetTitle': 'Reservation and Transportation Ticket Agents and Travel Clerks', + 'VideoCode': '43418100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=V1mFGglgbBE', + 'OnetCode': '43-5011.00', + 'OnetTitle': 'Cargo and Freight Agents', + 'VideoCode': '43501100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=vcg6vsbJops', + 'OnetCode': '43-5021.00', + 'OnetTitle': 'Couriers and Messengers', + 'VideoCode': '43502100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=mFB5YEzQUfI', + 'OnetCode': '43-5031.00', + 'OnetTitle': 'Public Safety Telecommunicators', + 'VideoCode': '43503100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=oq_BL4rJIDs', + 'OnetCode': '43-5032.00', + 'OnetTitle': 'Dispatchers, Except Police, Fire, and Ambulance', + 'VideoCode': '43503200', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=Gr6zixzV-XU', + 'OnetCode': '43-5041.00', + 'OnetTitle': 'Meter Readers, Utilities', + 'VideoCode': '43504100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=ddvVveMJ2mw', + 'OnetCode': '43-5052.00', + 'OnetTitle': 'Postal Service Mail Carriers', + 'VideoCode': '43505200', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=EvqriUvNeiY', + 'OnetCode': '43-5071.00', + 'OnetTitle': 'Shipping, Receiving, and Inventory Clerks', + 'VideoCode': '43507100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=zDqK9DaCDg4', + 'OnetCode': '43-6014.00', + 'OnetTitle': + 'Secretaries and Administrative Assistants, Except Legal, Medical, and Executive', + 'VideoCode': '43601400', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=A34Xj8K7FiQ', + 'OnetCode': '43-9021.00', + 'OnetTitle': 'Data Entry Keyers', + 'VideoCode': '43902100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=53QEev14w2E', + 'OnetCode': '43-9022.00', + 'OnetTitle': 'Word Processors and Typists', + 'VideoCode': '43902200', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=tuP-G9wJxmY', + 'OnetCode': '43-9031.00', + 'OnetTitle': 'Desktop Publishers', + 'VideoCode': '43903100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=9etwFCCQUNA', + 'OnetCode': '43-9041.00', + 'OnetTitle': 'Insurance Claims and Policy Processing Clerks', + 'VideoCode': '43904100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=918owLdYnts', + 'OnetCode': '43-9061.00', + 'OnetTitle': 'Office Clerks, General', + 'VideoCode': '43906100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=mcDnbqsVA2o', + 'OnetCode': '45-2011.00', + 'OnetTitle': 'Agricultural Inspectors', + 'VideoCode': '45201100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=6M-_S_37Nns', + 'OnetCode': '45-2041.00', + 'OnetTitle': 'Graders and Sorters, Agricultural Products', + 'VideoCode': '45204100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=uSZVN7JaJmQ', + 'OnetCode': '45-2091.00', + 'OnetTitle': 'Agricultural Equipment Operators', + 'VideoCode': '45209100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=44mOZstwmW0', + 'OnetCode': '45-3031.00', + 'OnetTitle': 'Fishing and Hunting Workers', + 'VideoCode': '45303100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=C-2DxR47ot8', + 'OnetCode': '45-4021.00', + 'OnetTitle': 'Fallers', + 'VideoCode': '45402100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=KDz8OfjXc5s', + 'OnetCode': '47-1011.00', + 'OnetTitle': 'First-Line Supervisors of Construction Trades and Extraction Workers', + 'VideoCode': '47101100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=DhIzzMQth2c', + 'OnetCode': '47-2011.00', + 'OnetTitle': 'Boilermakers', + 'VideoCode': '47201100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=Un7U4gej3j0', + 'OnetCode': '47-2021.00', + 'OnetTitle': 'Brickmasons and Blockmasons', + 'VideoCode': '47202100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=i-tiC2Y-038', + 'OnetCode': '47-2031.00', + 'OnetTitle': 'Carpenters', + 'VideoCode': '47203100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=VDsz_vhHPGg', + 'OnetCode': '47-2041.00', + 'OnetTitle': 'Carpet Installers', + 'VideoCode': '47204100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=s1n6nBhVzdo', + 'OnetCode': '47-2061.00', + 'OnetTitle': 'Construction Laborers', + 'VideoCode': '47206100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=_zm6Wud8hp4', + 'OnetCode': '47-2071.00', + 'OnetTitle': 'Paving, Surfacing, and Tamping Equipment Operators', + 'VideoCode': '47207100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=_zm6Wud8hp4', + 'OnetCode': '47-2073.00', + 'OnetTitle': 'Operating Engineers and Other Construction Equipment Operators', + 'VideoCode': '47207300', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=rMlngKnDA6c', + 'OnetCode': '47-2081.00', + 'OnetTitle': 'Drywall and Ceiling Tile Installers', + 'VideoCode': '47208100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=Rw8gAGYZ6qs', + 'OnetCode': '47-2111.00', + 'OnetTitle': 'Electricians', + 'VideoCode': '47211100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=qbvw1Y5dMQA', + 'OnetCode': '47-2121.00', + 'OnetTitle': 'Glaziers', + 'VideoCode': '47212100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=yPTjBhZ0Zuk', + 'OnetCode': '47-2131.00', + 'OnetTitle': 'Insulation Workers, Floor, Ceiling, and Wall', + 'VideoCode': '47213100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=MhpyAMBkwIQ', + 'OnetCode': '47-2141.00', + 'OnetTitle': 'Painters, Construction and Maintenance', + 'VideoCode': '47214100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=zj179Qux2oE', + 'OnetCode': '47-2151.00', + 'OnetTitle': 'Pipelayers', + 'VideoCode': '47215100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=uF3-2wFnf0E', + 'OnetCode': '47-2152.00', + 'OnetTitle': 'Plumbers, Pipefitters, and Steamfitters', + 'VideoCode': '47215200', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=_dWhEn6DFXM', + 'OnetCode': '47-2152.04', + 'OnetTitle': 'Solar Thermal Installers and Technicians', + 'VideoCode': '47215204', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=PklYLvoSRNQ', + 'OnetCode': '47-2161.00', + 'OnetTitle': 'Plasterers and Stucco Masons', + 'VideoCode': '47216100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=t_127YEnNZw', + 'OnetCode': '47-2171.00', + 'OnetTitle': 'Reinforcing Iron and Rebar Workers', + 'VideoCode': '47217100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=VMCdHzpmy1I', + 'OnetCode': '47-2181.00', + 'OnetTitle': 'Roofers', + 'VideoCode': '47218100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=t3cAgVHqHlw', + 'OnetCode': '47-2211.00', + 'OnetTitle': 'Sheet Metal Workers', + 'VideoCode': '47221100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=k46_I9_vCOU', + 'OnetCode': '47-2231.00', + 'OnetTitle': 'Solar Photovoltaic Installers', + 'VideoCode': '47223100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=LYmv7ncobIE', + 'OnetCode': '47-3011.00', + 'OnetTitle': 'Helpers--Brickmasons, Blockmasons, Stonemasons, and Tile and Marble Setters', + 'VideoCode': '47301100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=PgnWqyol0Pk', + 'OnetCode': '47-4011.00', + 'OnetTitle': 'Construction and Building Inspectors', + 'VideoCode': '47401100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=eiKCeLiRZeE', + 'OnetCode': '47-4021.00', + 'OnetTitle': 'Elevator and Escalator Installers and Repairers', + 'VideoCode': '47402100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=xMwQWCK5CRs', + 'OnetCode': '47-4031.00', + 'OnetTitle': 'Fence Erectors', + 'VideoCode': '47403100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=7eY0gkkIPi4', + 'OnetCode': '47-4041.00', + 'OnetTitle': 'Hazardous Materials Removal Workers', + 'VideoCode': '47404100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=HJ2naWZeg-s', + 'OnetCode': '47-4051.00', + 'OnetTitle': 'Highway Maintenance Workers', + 'VideoCode': '47405100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=H3ezcJr3DUc', + 'OnetCode': '47-4071.00', + 'OnetTitle': 'Septic Tank Servicers and Sewer Pipe Cleaners', + 'VideoCode': '47407100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=vN2n14LuEsc', + 'OnetCode': '47-4099.03', + 'OnetTitle': 'Weatherization Installers and Technicians', + 'VideoCode': '47409903', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=TcAIyaFdHzU', + 'OnetCode': '47-5011.00', + 'OnetTitle': 'Derrick Operators, Oil and Gas', + 'VideoCode': '47501100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=WNb5Idn3iP8', + 'OnetCode': '47-5022.00', + 'OnetTitle': 'Excavating and Loading Machine and Dragline Operators, Surface Mining', + 'VideoCode': '47502200', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=oOq9dx9mAYw', + 'OnetCode': '47-5023.00', + 'OnetTitle': 'Earth Drillers, Except Oil and Gas', + 'VideoCode': '47502300', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=Q_K73TofeUA', + 'OnetCode': '47-5032.00', + 'OnetTitle': 'Explosives Workers, Ordnance Handling Experts, and Blasters', + 'VideoCode': '47503200', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=Xy5Gl4e66jE', + 'OnetCode': '47-5071.00', + 'OnetTitle': 'Roustabouts, Oil and Gas', + 'VideoCode': '47507100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=8D6tWZDT2m8', + 'OnetCode': '49-1011.00', + 'OnetTitle': 'First-Line Supervisors of Mechanics, Installers, and Repairers', + 'VideoCode': '49101100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=cZYWnRp_84A', + 'OnetCode': '49-2011.00', + 'OnetTitle': 'Computer, Automated Teller, and Office Machine Repairers', + 'VideoCode': '49201100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=ons09RpGbb4', + 'OnetCode': '49-2021.00', + 'OnetTitle': 'Radio, Cellular, and Tower Equipment Installers and Repairers', + 'VideoCode': '49202100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=11bCD2L-Gus', + 'OnetCode': '49-2022.00', + 'OnetTitle': + 'Telecommunications Equipment Installers and Repairers, Except Line Installers', + 'VideoCode': '49202200', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=oByvKU2CwHs', + 'OnetCode': '49-2091.00', + 'OnetTitle': 'Avionics Technicians', + 'VideoCode': '49209100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=LkbntRI3ihw', + 'OnetCode': '49-2092.00', + 'OnetTitle': 'Electric Motor, Power Tool, and Related Repairers', + 'VideoCode': '49209200', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=Appx4uFqv_M', + 'OnetCode': '49-2097.00', + 'OnetTitle': 'Audiovisual Equipment Installers and Repairers', + 'VideoCode': '49209700', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=KXuRTDpxkrY', + 'OnetCode': '49-2098.00', + 'OnetTitle': 'Security and Fire Alarm Systems Installers', + 'VideoCode': '49209800', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=UrdVq0hQm2Q', + 'OnetCode': '49-3021.00', + 'OnetTitle': 'Automotive Body and Related Repairers', + 'VideoCode': '49302100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=2sI5_44r0Wc', + 'OnetCode': '49-3022.00', + 'OnetTitle': 'Automotive Glass Installers and Repairers', + 'VideoCode': '49302200', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=ARAUXc6Cbxw', + 'OnetCode': '49-3023.00', + 'OnetTitle': 'Automotive Service Technicians and Mechanics', + 'VideoCode': '49302300', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=-PcpkHT8xaU', + 'OnetCode': '49-3031.00', + 'OnetTitle': 'Bus and Truck Mechanics and Diesel Engine Specialists', + 'VideoCode': '49303100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=DdeLgPQuR2w', + 'OnetCode': '49-3053.00', + 'OnetTitle': 'Outdoor Power Equipment and Other Small Engine Mechanics', + 'VideoCode': '49305300', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=G6PQgXwhSgg', + 'OnetCode': '49-3091.00', + 'OnetTitle': 'Bicycle Repairers', + 'VideoCode': '49309100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=euk9ShxaaFo', + 'OnetCode': '49-3093.00', + 'OnetTitle': 'Tire Repairers and Changers', + 'VideoCode': '49309300', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=vCUW9kkUYFQ', + 'OnetCode': '49-9011.00', + 'OnetTitle': 'Mechanical Door Repairers', + 'VideoCode': '49901100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=PNcQwekI2KQ', + 'OnetCode': '49-9021.00', + 'OnetTitle': 'Heating, Air Conditioning, and Refrigeration Mechanics and Installers', + 'VideoCode': '49902100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=ROJQXBuEnEY', + 'OnetCode': '49-9044.00', + 'OnetTitle': 'Millwrights', + 'VideoCode': '49904400', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=vggk5l7taBs', + 'OnetCode': '49-9052.00', + 'OnetTitle': 'Telecommunications Line Installers and Repairers', + 'VideoCode': '49905200', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=JOXooel-J7E', + 'OnetCode': '49-9062.00', + 'OnetTitle': 'Medical Equipment Repairers', + 'VideoCode': '49906200', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=jRgW_zMV0q4', + 'OnetCode': '49-9063.00', + 'OnetTitle': 'Musical Instrument Repairers and Tuners', + 'VideoCode': '49906300', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=vEw4NRqDNhE', + 'OnetCode': '49-9064.00', + 'OnetTitle': 'Watch and Clock Repairers', + 'VideoCode': '49906400', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=I_mhZjRcH5s', + 'OnetCode': '49-9071.00', + 'OnetTitle': 'Maintenance and Repair Workers, General', + 'VideoCode': '49907100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=L6JIAk-U0JM', + 'OnetCode': '49-9081.00', + 'OnetTitle': 'Wind Turbine Service Technicians', + 'VideoCode': '49908100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=unSbXz7U1WA', + 'OnetCode': '49-9092.00', + 'OnetTitle': 'Commercial Divers', + 'VideoCode': '49909200', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=YXmvCigVEek', + 'OnetCode': '49-9094.00', + 'OnetTitle': 'Locksmiths and Safe Repairers', + 'VideoCode': '49909400', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=7xZ-HTUErM8', + 'OnetCode': '49-9096.00', + 'OnetTitle': 'Riggers', + 'VideoCode': '49909600', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=m4IUUFtb7lU', + 'OnetCode': '49-9099.01', + 'OnetTitle': 'Geothermal Technicians', + 'VideoCode': '49909901', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=dflNKhApmBE', + 'OnetCode': '51-1011.00', + 'OnetTitle': 'First-Line Supervisors of Production and Operating Workers', + 'VideoCode': '51101100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=TSn6ghApPKM', + 'OnetCode': '51-2011.00', + 'OnetTitle': 'Aircraft Structure, Surfaces, Rigging, and Systems Assemblers', + 'VideoCode': '51201100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=Pe3n9-r8TP0', + 'OnetCode': '51-2041.00', + 'OnetTitle': 'Structural Metal Fabricators and Fitters', + 'VideoCode': '51204100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=62-onA1gzjQ', + 'OnetCode': '51-3011.00', + 'OnetTitle': 'Bakers', + 'VideoCode': '51301100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=EL-g0Lvw3g8', + 'OnetCode': '51-3021.00', + 'OnetTitle': 'Butchers and Meat Cutters', + 'VideoCode': '51302100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=jhVjcgg8684', + 'OnetCode': '51-3023.00', + 'OnetTitle': 'Slaughterers and Meat Packers', + 'VideoCode': '51302300', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=f4-XVwJkHBg', + 'OnetCode': '51-3092.00', + 'OnetTitle': 'Food Batchmakers', + 'VideoCode': '51309200', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=OWNXI09WI14', + 'OnetCode': '51-4041.00', + 'OnetTitle': 'Machinists', + 'VideoCode': '51404100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=rzTzmkoSLg4', + 'OnetCode': '51-4121.00', + 'OnetTitle': 'Welders, Cutters, Solderers, and Brazers', + 'VideoCode': '51412100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=hOArtAsYeP8', + 'OnetCode': '51-5112.00', + 'OnetTitle': 'Printing Press Operators', + 'VideoCode': '51511200', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=tCCcNczkB6A', + 'OnetCode': '51-5113.00', + 'OnetTitle': 'Print Binding and Finishing Workers', + 'VideoCode': '51511300', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=7utEz_T_81k', + 'OnetCode': '51-6011.00', + 'OnetTitle': 'Laundry and Dry-Cleaning Workers', + 'VideoCode': '51601100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=OosJnsGEEQQ', + 'OnetCode': '51-6041.00', + 'OnetTitle': 'Shoe and Leather Workers and Repairers', + 'VideoCode': '51604100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=8RZ-QD-rIz8', + 'OnetCode': '51-6052.00', + 'OnetTitle': 'Tailors, Dressmakers, and Custom Sewers', + 'VideoCode': '51605200', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=B7Vo3yPSXl0', + 'OnetCode': '51-6061.00', + 'OnetTitle': 'Textile Bleaching and Dyeing Machine Operators and Tenders', + 'VideoCode': '51606100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=KP_EF4OMpGQ', + 'OnetCode': '51-6092.00', + 'OnetTitle': 'Fabric and Apparel Patternmakers', + 'VideoCode': '51609200', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=ZOjGY_rkWTY', + 'OnetCode': '51-6093.00', + 'OnetTitle': 'Upholsterers', + 'VideoCode': '51609300', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=Avn11IVTieY', + 'OnetCode': '51-7011.00', + 'OnetTitle': 'Cabinetmakers and Bench Carpenters', + 'VideoCode': '51701100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=Ug9QtgaRplo', + 'OnetCode': '51-8011.00', + 'OnetTitle': 'Nuclear Power Reactor Operators', + 'VideoCode': '51801100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=y_1bmqR1D-4', + 'OnetCode': '51-8021.00', + 'OnetTitle': 'Stationary Engineers and Boiler Operators', + 'VideoCode': '51802100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=pABK8Di1Y5Q', + 'OnetCode': '51-8031.00', + 'OnetTitle': 'Water and Wastewater Treatment Plant and System Operators', + 'VideoCode': '51803100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=wKCFFwuItmE', + 'OnetCode': '51-8092.00', + 'OnetTitle': 'Gas Plant Operators', + 'VideoCode': '51809200', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=kTFarAN2EAM', + 'OnetCode': '51-8099.01', + 'OnetTitle': 'Biofuels Processing Technicians', + 'VideoCode': '51809901', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=CN0N14XRJhM', + 'OnetCode': '51-9011.00', + 'OnetTitle': 'Chemical Equipment Operators and Tenders', + 'VideoCode': '51901100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=jap99HFlm08', + 'OnetCode': '51-9012.00', + 'OnetTitle': + 'Separating, Filtering, Clarifying, Precipitating, and Still Machine Setters, Operators, and Tenders', + 'VideoCode': '51901200', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=I3oTbWnvH6M', + 'OnetCode': '51-9021.00', + 'OnetTitle': 'Crushing, Grinding, and Polishing Machine Setters, Operators, and Tenders', + 'VideoCode': '51902100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=aqhWo9bSK2Q', + 'OnetCode': '51-9023.00', + 'OnetTitle': 'Mixing and Blending Machine Setters, Operators, and Tenders', + 'VideoCode': '51902300', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=RCTxteXoiAA', + 'OnetCode': '51-9061.00', + 'OnetTitle': 'Inspectors, Testers, Sorters, Samplers, and Weighers', + 'VideoCode': '51906100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=j7f70i9ooFE', + 'OnetCode': '51-9071.00', + 'OnetTitle': 'Jewelers and Precious Stone and Metal Workers', + 'VideoCode': '51907100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=9El6cags1O4', + 'OnetCode': '51-9081.00', + 'OnetTitle': 'Dental Laboratory Technicians', + 'VideoCode': '51908100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=UGAJm9Zj4b8', + 'OnetCode': '51-9082.00', + 'OnetTitle': 'Medical Appliance Technicians', + 'VideoCode': '51908200', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=wGITtQuRcaE', + 'OnetCode': '51-9111.00', + 'OnetTitle': 'Packaging and Filling Machine Operators and Tenders', + 'VideoCode': '51911100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=G1t5wTv4rtc', + 'OnetCode': '51-9124.00', + 'OnetTitle': 'Coating, Painting, and Spraying Machine Setters, Operators, and Tenders', + 'VideoCode': '51912400', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=VWY3Cu3qw2k', + 'OnetCode': '51-9141.00', + 'OnetTitle': 'Semiconductor Processing Technicians', + 'VideoCode': '51914100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=176-HGCTLqE', + 'OnetCode': '51-9161.00', + 'OnetTitle': 'Computer Numerically Controlled Tool Operators', + 'VideoCode': '51916100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=sTbT9E3cA84', + 'OnetCode': '51-9193.00', + 'OnetTitle': 'Cooling and Freezing Equipment Operators and Tenders', + 'VideoCode': '51919300', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=lT-d9eLRygk', + 'OnetCode': '51-9194.00', + 'OnetTitle': 'Etchers and Engravers', + 'VideoCode': '51919400', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=MBQx7TOL1iM', + 'OnetCode': '51-9195.00', + 'OnetTitle': 'Molders, Shapers, and Casters, Except Metal and Plastic', + 'VideoCode': '51919500', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=cznEUK9d5uM', + 'OnetCode': '51-9198.00', + 'OnetTitle': 'Helpers--Production Workers', + 'VideoCode': '51919800', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=1KyVS0PrQZM', + 'OnetCode': '53-1042.00', + 'OnetTitle': 'First-Line Supervisors of Helpers, Laborers, and Material Movers, Hand', + 'VideoCode': '53104200', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=oey4mi_QV48', + 'OnetCode': '53-2011.00', + 'OnetTitle': 'Airline Pilots, Copilots, and Flight Engineers', + 'VideoCode': '53201100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=1ejKHvDr-vI', + 'OnetCode': '53-2021.00', + 'OnetTitle': 'Air Traffic Controllers', + 'VideoCode': '53202100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=S6a3XVIMnHE', + 'OnetCode': '53-2031.00', + 'OnetTitle': 'Flight Attendants', + 'VideoCode': '53203100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=4C4i3vGpWfI', + 'OnetCode': '53-3011.00', + 'OnetTitle': 'Ambulance Drivers and Attendants, Except Emergency Medical Technicians', + 'VideoCode': '53301100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=yz8Oku9fQfQ', + 'OnetCode': '53-3032.00', + 'OnetTitle': 'Heavy and Tractor-Trailer Truck Drivers', + 'VideoCode': '53303200', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=nhDMoNCrniA', + 'OnetCode': '53-3033.00', + 'OnetTitle': 'Light Truck Drivers', + 'VideoCode': '53303300', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=52b8l3plMBE', + 'OnetCode': '53-3051.00', + 'OnetTitle': 'Bus Drivers, School', + 'VideoCode': '53305100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=oo0oskReDzI', + 'OnetCode': '53-3052.00', + 'OnetTitle': 'Bus Drivers, Transit and Intercity', + 'VideoCode': '53305200', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=CcpvU_pzR-s', + 'OnetCode': '53-3053.00', + 'OnetTitle': 'Shuttle Drivers and Chauffeurs', + 'VideoCode': '53305300', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=oQBg-MVjxkU', + 'OnetCode': '53-4011.00', + 'OnetTitle': 'Locomotive Engineers', + 'VideoCode': '53401100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=MfiUoy8D-JU', + 'OnetCode': '53-4022.00', + 'OnetTitle': 'Railroad Brake, Signal, and Switch Operators and Locomotive Firers', + 'VideoCode': '53402200', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=GaAw1VPGQfg', + 'OnetCode': '53-5011.00', + 'OnetTitle': 'Sailors and Marine Oilers', + 'VideoCode': '53501100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=V2zvpJucsK4', + 'OnetCode': '53-5021.00', + 'OnetTitle': 'Captains, Mates, and Pilots of Water Vessels', + 'VideoCode': '53502100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=pLrz5yktsaM', + 'OnetCode': '53-5022.00', + 'OnetTitle': 'Motorboat Operators', + 'VideoCode': '53502200', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=5qBtTtpHbtc', + 'OnetCode': '53-6021.00', + 'OnetTitle': 'Parking Attendants', + 'VideoCode': '53602100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=vb7yUIn9GVw', + 'OnetCode': '53-6031.00', + 'OnetTitle': 'Automotive and Watercraft Service Attendants', + 'VideoCode': '53603100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=-RK1MvfADJU', + 'OnetCode': '53-6051.00', + 'OnetTitle': 'Transportation Inspectors', + 'VideoCode': '53605100', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=wQr_uQMpmEM', + 'OnetCode': '53-7062.00', + 'OnetTitle': 'Laborers and Freight, Stock, and Material Movers, Hand', + 'VideoCode': '53706200', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=XR6wkDG4Gzg', + 'OnetCode': '53-7062.04', + 'OnetTitle': 'Recycling and Reclamation Workers', + 'VideoCode': '53706204', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=sgCea-gpmCo', + 'OnetCode': '53-7065.00', + 'OnetTitle': 'Stockers and Order Fillers', + 'VideoCode': '53706500', + }, + { + 'youtubeUrl': 'https://www.youtube.com/watch?v=rCcIhtph-ag', + 'OnetCode': '53-7072.00', + 'OnetTitle': 'Pump Operators, Except Wellhead Pumpers', + 'VideoCode': '53707200', + }, +]; diff --git a/packages/learn-card-base/src/helpers/walletHelpers.ts b/packages/learn-card-base/src/helpers/walletHelpers.ts index bd4f66038e..ec23d00679 100644 --- a/packages/learn-card-base/src/helpers/walletHelpers.ts +++ b/packages/learn-card-base/src/helpers/walletHelpers.ts @@ -98,11 +98,11 @@ export const getEmojiFromDidString = (did: string) => { // get user ID / handle from user did export const getUserHandleFromDid = (userDid: string) => { // ie: did:web:network.learncard.com:users:kent - const regex = /(users:)(.*)/; + const regex = /users:(.*)/; const match = userDid.match(regex); - return match?.[2]; // returns kent + return match?.[1]; // returns kent }; // checks if a users did -> is an LCnetwork did diff --git a/packages/learn-card-base/src/hooks/useAiInsightCredential.ts b/packages/learn-card-base/src/hooks/useAiInsightCredential.ts index e8afd2cff3..49740c28ac 100644 --- a/packages/learn-card-base/src/hooks/useAiInsightCredential.ts +++ b/packages/learn-card-base/src/hooks/useAiInsightCredential.ts @@ -1,8 +1,27 @@ import { VCValidator, VC } from '@learncard/types'; -import { useQuery, useQueryClient, useMutation, QueryClient } from '@tanstack/react-query'; -import { BespokeLearnCard } from 'learn-card-base/types/learn-card'; +import { useQuery, useMutation, useQueryClient, QueryClient } from '@tanstack/react-query'; import { useWallet } from 'learn-card-base'; -import { LCR } from 'learn-card-base/types/credential-records'; +import { BespokeLearnCard } from 'learn-card-base/types/learn-card'; +import { CredentialCategoryEnum, categoryMetadata } from 'learn-card-base'; + +import { unwrapBoostCredential } from 'learn-card-base/helpers/credentialHelpers'; + +// Types for pathway data +interface PathwayStep { + title?: string; + description?: string; + skills?: string[]; + keywords?: Record; +} + +interface PathwayItem { + title?: string; + description?: string; + skills?: string[]; + pathwayUri?: string; + topicUri?: string; + keywords?: Record; +} const queryKey = ['useAiInsightCredential']; @@ -83,6 +102,74 @@ export const useAiInsightCredential = () => { }); }; +export const useAiPathways = () => { + const { data: aiInsightCredential } = useAiInsightCredential(); + const { initWallet, resolveCredential } = useWallet(); + + return useQuery({ + queryKey: ['useAiPathways', aiInsightCredential?.insights?.suggestedPathways], + queryFn: async () => { + if (!aiInsightCredential?.insights?.suggestedPathways?.length) return []; + + const wallet = await initWallet(); + const creds = await Promise.all( + aiInsightCredential.insights.suggestedPathways.map(async (uri: string) => { + try { + return await resolveCredential(uri); + } catch (e) { + console.warn('Failed to resolve pathway credential:', uri, e); + return undefined; + } + }) + ); + + const items = await Promise.all( + creds.filter(Boolean).map(async cred => { + const vc: any = unwrapBoostCredential(cred as any); + const pathwayBoostUri: string | undefined = (cred as any)?.boostId; + + // Try to find the parent topic via familial lookup + let topicUri: string | undefined; + if (pathwayBoostUri) { + try { + const family = await wallet.invoke.getFamilialBoosts(pathwayBoostUri, { + parentGenerations: 3, + childGenerations: 0, + limit: 100, + }); + const topic = family?.records?.find( + (r: any) => + r?.category === + categoryMetadata[CredentialCategoryEnum.aiTopic] + .contractCredentialTypeOverride + ); + topicUri = topic?.uri; + } catch (e) { + console.warn('Failed to fetch familial boosts for pathway', e); + } + } + + const lp = vc?.learningPathway; + const step: PathwayStep = lp?.step ?? lp ?? {}; + const item: PathwayItem = { + title: step?.title, + description: step?.description, + skills: step?.skills ?? [], + pathwayUri: pathwayBoostUri, + topicUri, + keywords: step?.keywords ?? {}, + }; + + return item; + }) + ); + + return items.filter(item => !!(item.title || item.description)); + }, + staleTime: 1000 * 60 * 60 * 24, // 1 day + }); +}; + export const useAiInsightCredentialMutation = () => { const queryClient = useQueryClient(); const { initWallet } = useWallet(); diff --git a/packages/learn-card-base/src/hooks/useGetVCInfo.tsx b/packages/learn-card-base/src/hooks/useGetVCInfo.tsx index 286443a45e..555f9ce95d 100644 --- a/packages/learn-card-base/src/hooks/useGetVCInfo.tsx +++ b/packages/learn-card-base/src/hooks/useGetVCInfo.tsx @@ -75,7 +75,7 @@ export const useGetVCInfo = ( Boolean(issuerProfileId) ); - const issueeProfileId = getProfileIdFromLCNDidWeb(issueeDid); + const issueeProfileId = getProfileIdFromLCNDidWeb(issueeName); const { data: issueeProfile, isLoading: issueeProfileLoading } = useGetProfile( issueeProfileId!, Boolean(issueeProfileId) @@ -168,13 +168,8 @@ export const useGetVCInfo = ( } } - // If subject is not current user, fallback again for image if not already resolved - if ( - currentUser && - issueeDid !== currentUserDidKey && - issueeDid !== currentLCNUser?.did && - !issueeProfile - ) { + // If subject is not current user, fallback again for image + if (currentUser && issueeDid !== currentUserDidKey && issueeDid !== currentLCNUser?.did) { issueeName = getCredentialSubjectName(vc)!; const subjectImage = getSubjectImage(vc); diff --git a/packages/learn-card-base/src/hooks/useSwitchAccount.ts b/packages/learn-card-base/src/hooks/useSwitchAccount.ts index 9c9c77ba2c..2fadf04e04 100644 --- a/packages/learn-card-base/src/hooks/useSwitchAccount.ts +++ b/packages/learn-card-base/src/hooks/useSwitchAccount.ts @@ -1,5 +1,4 @@ import { useState } from 'react'; -import { useQueryClient } from '@tanstack/react-query'; import { useFlags } from 'launchdarkly-react-client-sdk'; import useCurrentUser from './useGetCurrentUser'; import useGetCurrentLCNUser from './useGetCurrentLCNUser'; @@ -13,7 +12,6 @@ import { switchedProfileStore } from 'learn-card-base/stores/walletStore'; export const useSwitchProfile = (options?: { onSwitch?: () => void }) => { const { onSwitch } = options ?? {}; - const queryClient = useQueryClient(); const flags = useFlags(); const currentUser = useCurrentUser(); const { currentLCNUser, refetch: refetchCurrentLCNUser } = useGetCurrentLCNUser(); @@ -40,9 +38,6 @@ export const useSwitchProfile = (options?: { onSwitch?: () => void }) => { currentUserStore.set.parentLDFlags(undefined); switchedProfileStore.set.profileType('parent'); refetchCurrentLCNUser(); - - // Invalidate profile-specific queries - queryClient.invalidateQueries({ queryKey: ['developer', 'isAdmin'] }); } finally { setIsSwitching(false); } @@ -72,9 +67,6 @@ export const useSwitchProfile = (options?: { onSwitch?: () => void }) => { account?.image ); await refetchCurrentLCNUser(); - - // Invalidate profile-specific queries - queryClient.invalidateQueries({ queryKey: ['developer', 'isAdmin'] }); } finally { setIsSwitching(false); } diff --git a/packages/learn-card-base/src/react-query/queries/careerOneStop.ts b/packages/learn-card-base/src/react-query/queries/careerOneStop.ts new file mode 100644 index 0000000000..5efb7d82fd --- /dev/null +++ b/packages/learn-card-base/src/react-query/queries/careerOneStop.ts @@ -0,0 +1,204 @@ +import { useQuery } from '@tanstack/react-query'; +import _ from 'lodash'; + +import type { OccupationDetailsResponse } from '../../types/careerOneStop'; +import { useWallet } from 'learn-card-base'; + +const fetchOccupationDetailsForKeyword = async ( + keyword: string +): Promise => { + const res = await fetch(`http://localhost:3001/insights/occupations`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ keyword }), + }); + + if (!res.ok) { + const text = await res.text(); + throw new Error(text || 'Failed to fetch occupation details'); + } + + return res.json(); +}; + +export const useOccupationDetailsForKeyword = (keyword: string) => { + return useQuery({ + queryKey: ['occupation-details', keyword], + queryFn: async () => { + return fetchOccupationDetailsForKeyword(keyword); + }, + enabled: Boolean(keyword), + }); +}; + +const fetchSalariesForKeyword = async ({ + keyword, + locations, +}: { + keyword: string; + locations: string[]; +}) => { + const res = await fetch(`http://localhost:3001/insights/salaries`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + keyword, + locations, + }), + }); + + if (!res.ok) { + const text = await res.text(); + throw new Error(text || 'Failed to fetch salary data'); + } + + const data = await res.json(); + + return data; +}; + +export const useSalariesForKeyword = ({ keyword }: { keyword: string | null }) => { + const { initWallet } = useWallet(); + + return useQuery({ + queryKey: ['occupation-salaries', keyword], + queryFn: async () => { + if (!keyword) { + throw new Error('Keyword is required'); + } + + const locations = ['CA', 'NY', 'WA', 'MA', 'NJ', 'FL', 'TX']; + + const wallet = await initWallet(); + + return fetchSalariesForKeyword({ + keyword, + locations, + }); + }, + enabled: Boolean(keyword), + }); +}; + +const fetchTrainingProgramsByKeyword = async (keyword: string): Promise => { + const res = await fetch(`http://localhost:3001/insights/training-programs`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ keyword }), + }); + + if (!res.ok) { + const text = await res.text(); + throw new Error(text || 'Failed to fetch training programs'); + } + + return res.json(); +}; + +const fetchOpenSyllabusCoursesBySchool = async (schoolName: string): Promise => { + const res = await fetch(`http://localhost:3001/insights/courses`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ schoolName, limit: 100 }), + }); + + if (!res.ok) { + const text = await res.text(); + throw new Error(text || 'Failed to fetch training programs'); + } + + return res.json(); +}; + +/** + * Hook for fetching and enriching training programs data + * + * Data Flow: + * 1. Takes an array of keywords and optional fieldOfStudy + * 2. Fetches occupation details for each keyword (Career One Stop API) + * 3. Extracts ONET titles from occupation results + * 4. Fetches training programs for first 3 ONET titles (Career One Stop API) + * 5. Extracts unique school names from training programs + * 6. Fetches syllabus courses for each unique school (Open Syllabus API) + * 7. Filters syllabus courses by fieldOfStudy + * 8. Combines training programs with filtered syllabus courses + * + * @param keywords - Array of keywords to search for + * @param fieldOfStudy - Optional field of study to filter syllabus courses + * @returns Enriched training programs with syllabus courses + */ +export const useTrainingProgramsByKeyword = ({ keywords }: { keywords: string[] | null }) => { + return useQuery({ + queryKey: ['training-programs', keywords], + queryFn: async () => { + if (!keywords || keywords.length === 0) { + throw new Error('Keywords are required'); + } + + // Step 1-2: Fetch occupation details for each keyword + const occupationPromises = keywords + .slice(0, 3) + .map(keyword => fetchOccupationDetailsForKeyword(keyword)); + + const occupationResults = await Promise.all(occupationPromises); + + // Step 3: Extract ONET titles from the results + const allOnetTitles = occupationResults.flatMap(occupations => + occupations.map(occupation => occupation.OnetTitle) + ); + + // Step 4: Fetch training programs for first 3 ONET titles + const onetTitlesToFetch = allOnetTitles.slice(0, 3); + const trainingPromises = onetTitlesToFetch.map(onetTitle => + fetchTrainingProgramsByKeyword(onetTitle) + ); + + const trainingResults = await Promise.all(trainingPromises); + + // Step 5: Combine training program results with occupation details and keyword used + const combinedResults = trainingResults.map((result: any, index: number) => ({ + ...result, + keyword: onetTitlesToFetch[index], + occupationDetails: occupationResults?.[0]?.[index] || null, // Keep occupation details for keyword context + })); + + // Step 6: Extract unique school names from combined results + const uniqueSchoolNames = [ + ...new Set( + combinedResults.map( + // shuffle to get different schools each time + (result: any) => _.shuffle(result?.SchoolPrograms)?.[0]?.SchoolName + ) + ), + ].filter(Boolean); + + // Step 7: Fetch syllabus courses for each unique school + const syllabusPromises = uniqueSchoolNames.map(schoolName => + fetchOpenSyllabusCoursesBySchool(schoolName) + ); + + // Add error handling for syllabus fetch + const syllabusResults = await Promise.allSettled(syllabusPromises); + + // Step 8: Combine training programs with syllabus courses filtered by fieldOfStudy + return combinedResults + .map((result: any, index: number) => ({ + ...result, + syllabusCourses: + syllabusResults[index]?.status === 'fulfilled' + ? syllabusResults[index]?.value?.syllabi + : [], // Fallback to empty array if syllabus fetch failed + })) + .flat(); + }, + enabled: Boolean(keywords && keywords.length > 0), + }); +}; diff --git a/packages/learn-card-base/src/svgs/ArrowUp.tsx b/packages/learn-card-base/src/svgs/ArrowUp.tsx new file mode 100644 index 0000000000..0ec101d36c --- /dev/null +++ b/packages/learn-card-base/src/svgs/ArrowUp.tsx @@ -0,0 +1,21 @@ +import React from 'react'; + +export const ArrowUp: React.FC<{ className?: string }> = ({ className }) => { + return ( + + + + ); +}; + +export default ArrowUp; diff --git a/packages/learn-card-base/src/svgs/TimeCircle.tsx b/packages/learn-card-base/src/svgs/TimeCircle.tsx new file mode 100644 index 0000000000..9b0f0f141b --- /dev/null +++ b/packages/learn-card-base/src/svgs/TimeCircle.tsx @@ -0,0 +1,20 @@ +import React from 'react'; + +export const TimeCircle: React.FC<{ className?: string }> = ({ className }) => { + return ( + + + + ); +}; + +export default TimeCircle; diff --git a/packages/learn-card-base/src/svgs/shapes/Star.tsx b/packages/learn-card-base/src/svgs/shapes/Star.tsx new file mode 100644 index 0000000000..63298a1618 --- /dev/null +++ b/packages/learn-card-base/src/svgs/shapes/Star.tsx @@ -0,0 +1,21 @@ +import React from 'react'; + +export const Star: React.FC<{ className?: string }> = ({ className }) => { + return ( + + + + ); +}; + +export default Star; diff --git a/packages/learn-card-base/src/svgs/walletsIconsFormal/AiPathwaysIconFormal.tsx b/packages/learn-card-base/src/svgs/walletsIconsFormal/AiPathwaysIconFormal.tsx index 25a1e3b90f..c5ad831b37 100644 --- a/packages/learn-card-base/src/svgs/walletsIconsFormal/AiPathwaysIconFormal.tsx +++ b/packages/learn-card-base/src/svgs/walletsIconsFormal/AiPathwaysIconFormal.tsx @@ -20,11 +20,32 @@ export const AiPathwaysIconFormal: React.FC<{ className?: string }> = ({ classNa d="M24.1577 22.1671L24.9738 20.1849C25.0199 20.073 25.129 20 25.25 20C25.371 20 25.4801 20.073 25.5262 20.1849L26.3423 22.1671C26.6673 22.9562 27.2938 23.5828 28.083 23.9077L30.065 24.7239C30.177 24.7699 30.25 24.879 30.25 25C30.25 25.121 30.177 25.2301 30.065 25.2761L28.083 26.0923C27.2938 26.4172 26.6673 27.0438 26.3423 27.8329L25.5262 29.8151C25.4801 29.927 25.371 30 25.25 30C25.129 30 25.0199 29.927 24.9738 29.8151L24.1577 27.8329C23.8328 27.0438 23.2062 26.4172 22.4171 26.0923L20.4349 25.2761C20.323 25.2301 20.25 25.121 20.25 25C20.25 24.879 20.323 24.7699 20.4349 24.7239L22.4171 23.9077C23.2062 23.5828 23.8328 22.9562 24.1577 22.1671Z" fill="#14B8A6" /> - - - - - + + ); +}; + +export const AiPathwaysSideMenuIconFormal: React.FC<{ className?: string }> = ({ + className = '', +}) => { + return ( + + + + + ); }; diff --git a/packages/learn-card-base/src/svgs/walletsIconsFormal/WalletIconsFormal.tsx b/packages/learn-card-base/src/svgs/walletsIconsFormal/WalletIconsFormal.tsx index e9954f9eeb..7988abe920 100644 --- a/packages/learn-card-base/src/svgs/walletsIconsFormal/WalletIconsFormal.tsx +++ b/packages/learn-card-base/src/svgs/walletsIconsFormal/WalletIconsFormal.tsx @@ -1,5 +1,5 @@ import AiSessionsIconFormal from './AiSessionsIconFormal'; -import AiPathwaysIconFormal from './AiPathwaysIconFormal'; +import AiPathwaysIconFormal, { AiPathwaysSideMenuIconFormal } from './AiPathwaysIconFormal'; import AiInsightsIconFormal from './AiInsightsIconFormal'; import SkillsIconFormal from './SkillsIconFormal'; import BoostsIconFormal from './BoostsIconFormal'; @@ -14,6 +14,7 @@ import IDsIconFormal from './IDsIconFormal'; export const FormalWalletIcons = { AiSessionsIconFormal, AiPathwaysIconFormal, + AiPathwaysSideMenuIconFormal, AiInsightsIconFormal, SkillsIconFormal, BoostsIconFormal, diff --git a/packages/learn-card-base/src/types/careerOneStop.ts b/packages/learn-card-base/src/types/careerOneStop.ts new file mode 100644 index 0000000000..f7e8a87610 --- /dev/null +++ b/packages/learn-card-base/src/types/careerOneStop.ts @@ -0,0 +1,299 @@ +export type CareerOneStopOccupation = { + occupationDescription: string; + OnetCode: string; + OnetTitle: string; +}; + +export type OccupationDetailsOptions = { + occupationDescription: string; + OnetCode: string; + OnetTitle: string; + training?: boolean; + interest?: boolean; + videos?: boolean; + tasks?: boolean; + dwas?: boolean; + wages?: boolean; + alternateOnetTitles?: boolean; + projectedEmployment?: boolean; + ooh?: boolean; + stateLMILinks?: boolean; + relatedOnetTitles?: boolean; + skills?: boolean; + knowledge?: boolean; + ability?: boolean; + trainingPrograms?: boolean; + industryEmpPattern?: boolean; + toolsAndTechnology?: boolean; + workValues?: boolean; + enableMetaData?: boolean; +}; + +/* --------------------------------------------- + * Root Response + * --------------------------------------------- */ + +export interface OccupationDetailsResponse { + OnetTitle: string; + OnetCode: string; + OnetDescription: string; + + Wages: Wages; + + BrightOutlook: 'Bright' | 'Average' | 'Below Average' | string; + BrightOutlookCategory: string | null; + Green: 'Yes' | 'No'; + + COSVideoURL: string | null; + + EducationTraining: EducationTraining; + + Tasks: TaskItem[]; + Dwas: DwaItem[]; + + AlternateTitles: string[] | null; + RelatedOnetTitles: Record | null; + + StFips: string; + Location: string; + + Video: VideoItem[] | null; + + InterestDataList: ElementScore[] | null; + SkillsDataList: ElementScore[] | null; + KnowledgeDataList: ElementScore[] | null; + AbilityDataList: ElementScore[] | null; + + SocInfo: SocInfo; + Projections: Projections; + + TrainingPrograms: string[] | null; + + ToolsAndTechOccupationDetails: ToolsAndTechnologyDetails | null; + + WorkValuesOccupationDetails?: WorkValuesOccupationDetails; +} + +export interface Wages { + NationalWagesList: WageItem[]; + StateWagesList: WageItem[]; + BLSAreaWagesList: WageItem[]; + + WageYear: string; + SocData: 'Yes' | 'No'; + + SocWageInfo: { + SocCode: string; + SocTitle: string; + SocDescription: string | null; + }; +} + +export interface WageItem { + RateType: 'Hourly' | 'Annual'; + Pct10: string; + Pct25: string; + Median: string; + Pct75: string; + Pct90: string; + StFips: string; + Area: string; + AreaName: string; +} + +export interface EducationTraining { + EducationType: { + EducationLevel: string; + Value: string; + }[]; + + EducationCode: string; + EducationTitle: string; + + ExperienceCode: string; + ExperienceTitle: string; + + TrainingCode: string; + TrainingTitle: string; + + OccupationTitle: string; + + MatOccupation: { + MatOccCode: string; + MatOccTitle: string; + }; +} + +export interface TaskItem { + TaskDescription: string; + TaskId: string; + DataValue: string; +} + +export interface DwaItem { + DwaTitle: string; + DwaId: string; + DataValue: string; + TaskId: string; +} + +export interface ElementScore { + ElementId: string; + ElementName: string; + ElementDescription: string; + DataValue: string; + Importance: string | null; +} + +export interface SocInfo { + SocCode: string; + SocTitle: string; + SocDescription: string; +} + +export interface Projections { + EstimatedYear: string; + ProjectedYear: string; + OccupationTitle: string; + + Projections: EmploymentProjection[]; + IndustryOccEmplt: IndustryEmployment[]; +} + +export interface EmploymentProjection { + StateName: string; + Stfips: string; + EstimatedEmployment: string; + ProjectedEmployment: string; + PerCentChange: string; + ProjectedAnnualJobOpening: string; + EstimatedYear: string; + ProjectedYear: string; +} + +export interface IndustryEmployment { + Industry: string; + Pctestocc: number; + MatInCode: string; + PercentChange: number; + EstimatedEmployment: number; + NumberChanged: number; + ProjectEmployment: number; + IagCode: string; +} +export interface ToolsAndTechnologyDetails { + OnetCode: string | null; + OnetTitle: string | null; + + Tools: { + Categories: ToolCategory[]; + }; + + Technology: { + CategoryList: TechnologyCategory[]; + }; +} + +export interface ToolCategory { + Title: string; + Examples: ToolExample[]; +} + +export interface ToolExample { + Name: string; + Hot_Technology?: 'Y' | 'N' | ''; + In_Demand?: 'Y' | 'N' | ''; +} + +export interface TechnologyCategory { + Title: string; + Examples: TechnologyExample[]; +} + +export interface TechnologyExample { + Name: string; + Hot_Technology: 'Y' | 'N'; + In_Demand: 'Y' | 'N'; +} + +export interface VideoItem { + VideoCode: string; + VideoTitle: string; + VideoType: string; +} + +export interface WorkValuesOccupationDetails { + WorkValue: string; + Characteristics: string[]; +} + +// salaries +export type CareerOneStopLocationSalary = { + RateType: 'Hourly' | 'Annual'; + Pct10: string; + Pct25: string; + Median: string; + Pct75: string; + Pct90: string; + StFips: string; + Area: string; + AreaName: string; +}; + +export type CareerOneStopSocInfo = { + SocCode: string; + SocTitle: string; + SocDescription: string; +}; + +export type CareerOneStopOccupationRequest = { + InputOccupation: string; + InputOccupationCode: string; + InputOccupationTitle: string; +}; + +export type CareerOneStopSalariesOccupation = { + Code: string; + Title: string; + Request: CareerOneStopOccupationRequest; + WageInfo: CareerOneStopLocationSalary[]; + SocInfo: CareerOneStopSocInfo; +}; + +export type CareerOneStopLocationResult = { + LocationName: string; + InputLocation: string; + OccupationList: CareerOneStopSalariesOccupation[]; +}; + +// training programs +export type ProgramLength = { + Name: string; // e.g. "4 years" + Value: string; // e.g. "4 years" +}; + +export type TrainingOccupation = { + Name: string; // e.g. "Software Developers" + Value: string; // e.g. "Software Developers" +}; + +export type TrainingProgram = { + ID: string; + SchoolName: string; + SchoolUrl: string; + Address: string; + City: string; + StateAbbr: string; + StateName: string; + Zip: string; + Phone: string; + Distance: number | null; + Region: string; + RegionCode: string; + TotalEnrollment: number | null; + ProgramName: string; + StudentGraduated: string; + ElementID: string; + ProgramLength: ProgramLength[]; + Occupationslist: TrainingOccupation[]; +}; diff --git a/packages/learn-card-base/src/utils/pushUtilities.ts b/packages/learn-card-base/src/utils/pushUtilities.ts index b65568ad50..1092542ad1 100644 --- a/packages/learn-card-base/src/utils/pushUtilities.ts +++ b/packages/learn-card-base/src/utils/pushUtilities.ts @@ -125,9 +125,7 @@ export const pushUtilities = { : typeof error === 'string' ? error : 'Unknown error'; - if (!errMsg.includes('Error, no valid private key found')) { - handleNotificationRegistrationError?.(`Registration failed: ${errMsg}`); - } + handleNotificationRegistrationError?.(`Registration failed: ${errMsg}`); } }); diff --git a/packages/learn-card-bridge-http/CHANGELOG.md b/packages/learn-card-bridge-http/CHANGELOG.md index 6f647f3338..7099bc84aa 100644 --- a/packages/learn-card-bridge-http/CHANGELOG.md +++ b/packages/learn-card-bridge-http/CHANGELOG.md @@ -1,12 +1,5 @@ # @learncard/create-http-bridge -## 1.1.218 - -### Patch Changes - -- Updated dependencies [[`7e30fc7116411ba19a4889cfbf9fc71dd725c309`](https://github.com/learningeconomy/LearnCard/commit/7e30fc7116411ba19a4889cfbf9fc71dd725c309)]: - - @learncard/init@2.3.0 - ## 1.1.217 ### Patch Changes diff --git a/packages/learn-card-bridge-http/package.json b/packages/learn-card-bridge-http/package.json index 9610d841f6..3cb9a16721 100644 --- a/packages/learn-card-bridge-http/package.json +++ b/packages/learn-card-bridge-http/package.json @@ -1,6 +1,6 @@ { "name": "@learncard/create-http-bridge", - "version": "1.1.218", + "version": "1.1.217", "description": "Instantly create and deploy a Learn Card Bridge HTTP API via AWS Lambda!", "main": "dist/index.js", "bin": "dist/index.js", diff --git a/packages/learn-card-cli/CHANGELOG.md b/packages/learn-card-cli/CHANGELOG.md index 19b827c6dc..54446b406d 100644 --- a/packages/learn-card-cli/CHANGELOG.md +++ b/packages/learn-card-cli/CHANGELOG.md @@ -1,16 +1,5 @@ # @learncard/cli -## 3.3.157 - -### Patch Changes - -- Updated dependencies [[`7e30fc7116411ba19a4889cfbf9fc71dd725c309`](https://github.com/learningeconomy/LearnCard/commit/7e30fc7116411ba19a4889cfbf9fc71dd725c309)]: - - @learncard/init@2.3.0 - - @learncard/didkit-plugin@1.7.0 - - @learncard/learn-cloud-plugin@2.3.7 - - @learncard/open-badge-v2-plugin@1.1.5 - - @learncard/simple-signing-plugin@1.1.5 - ## 3.3.156 ### Patch Changes diff --git a/packages/learn-card-cli/package.json b/packages/learn-card-cli/package.json index 3677e66312..519fbbbca8 100644 --- a/packages/learn-card-cli/package.json +++ b/packages/learn-card-cli/package.json @@ -1,6 +1,6 @@ { "name": "@learncard/cli", - "version": "3.3.157", + "version": "3.3.156", "description": "Test out learn card!", "main": "dist/index.js", "bin": "dist/index.js", diff --git a/packages/learn-card-init/CHANGELOG.md b/packages/learn-card-init/CHANGELOG.md index 9b2067dedb..c37b61cf65 100644 --- a/packages/learn-card-init/CHANGELOG.md +++ b/packages/learn-card-init/CHANGELOG.md @@ -1,53 +1,5 @@ # learn-card-core -## 2.3.0 - -### Minor Changes - -- [#936](https://github.com/learningeconomy/LearnCard/pull/936) [`7e30fc7116411ba19a4889cfbf9fc71dd725c309`](https://github.com/learningeconomy/LearnCard/commit/7e30fc7116411ba19a4889cfbf9fc71dd725c309) Thanks [@TaylorBeeston](https://github.com/TaylorBeeston)! - ## New Native DIDKit Plugin (`@learncard/didkit-plugin-node`) - - Adds a high-performance native Node.js DIDKit plugin using Rust and N-API, providing **~18x faster cold starts** compared to the WASM version. - - ### Key Features - - - **Native Performance**: Eliminates WASM compilation overhead on cold starts (~1100ms → ~60ms) - - **Cross-Platform Binaries**: Prebuilt for Linux (x64/arm64, glibc/musl), macOS (x64/arm64), and Windows (x64) - - **Drop-in Replacement**: API-compatible with `@learncard/didkit-plugin` - - **JWE Support**: Full JWE and DAG-JWE encryption/decryption - - **Async Operations**: All crypto operations run on separate thread pool, non-blocking - - ### Usage - - ```typescript - import { initLearnCard } from '@learncard/init'; - - // Use native plugin instead of WASM - const learnCard = await initLearnCard({ - seed: 'your-seed', - didkit: 'node', // <-- new option - }); - ``` - - ### When to Use - - - āœ… Serverless functions (AWS Lambda, Vercel) - - āœ… Node.js servers (Express, Fastify, NestJS) - - āœ… CLI tools and scripts - - āœ… High-throughput credential processing - - ### Service Updates - - All LearnCard Network services (brain-service, learn-cloud-service, simple-signing-service) now use the native plugin in Docker/Lambda environments for improved cold start performance. - -### Patch Changes - -- Updated dependencies [[`7e30fc7116411ba19a4889cfbf9fc71dd725c309`](https://github.com/learningeconomy/LearnCard/commit/7e30fc7116411ba19a4889cfbf9fc71dd725c309)]: - - @learncard/didkit-plugin-node@0.2.0 - - @learncard/didkit-plugin@1.7.0 - - @learncard/vc-plugin@1.4.0 - - @learncard/learn-cloud-plugin@2.3.7 - - @learncard/network-plugin@2.9.7 - ## 2.2.6 ### Patch Changes diff --git a/packages/learn-card-init/package.json b/packages/learn-card-init/package.json index 8fd571e3b1..cb5b79b57c 100644 --- a/packages/learn-card-init/package.json +++ b/packages/learn-card-init/package.json @@ -1,6 +1,6 @@ { "name": "@learncard/init", - "version": "2.3.0", + "version": "2.2.6", "description": "", "type": "module", "main": "./dist/index.cjs", @@ -53,7 +53,6 @@ "@learncard/crypto-plugin": "workspace:*", "@learncard/didkey-plugin": "workspace:*", "@learncard/didkit-plugin": "workspace:*", - "@learncard/didkit-plugin-node": "workspace:*", "@learncard/did-web-plugin": "workspace:*", "@learncard/dynamic-loader-plugin": "workspace:*", "@learncard/encryption-plugin": "workspace:*", diff --git a/packages/learn-card-init/src/initializers/didWebLearnCardFromSeed.ts b/packages/learn-card-init/src/initializers/didWebLearnCardFromSeed.ts index 92c4513ca8..b385abd69e 100644 --- a/packages/learn-card-init/src/initializers/didWebLearnCardFromSeed.ts +++ b/packages/learn-card-init/src/initializers/didWebLearnCardFromSeed.ts @@ -40,17 +40,7 @@ export const didWebLearnCardFromSeed = async ({ const cryptoLc = await dynamicLc.addPlugin(CryptoPlugin); - const getDidkit = async (): Promise => { - if (didkit === 'node') { - const mod = await import('@learncard/didkit-plugin-node'); - return mod.getDidKitPlugin as typeof getDidKitPlugin; - } - return getDidKitPlugin; - }; - - const didkitLc = await cryptoLc.addPlugin( - await (await getDidkit())(didkit === 'node' ? undefined : didkit, allowRemoteContexts) - ); + const didkitLc = await cryptoLc.addPlugin(await getDidKitPlugin(didkit, allowRemoteContexts)); const didkeyLc = await didkitLc.addPlugin( await getDidKeyPlugin(didkitLc, seed, 'key') diff --git a/packages/learn-card-init/src/initializers/didWebNetworkLearnCardFromSeed.ts b/packages/learn-card-init/src/initializers/didWebNetworkLearnCardFromSeed.ts index d83f809a46..d00d64aecb 100644 --- a/packages/learn-card-init/src/initializers/didWebNetworkLearnCardFromSeed.ts +++ b/packages/learn-card-init/src/initializers/didWebNetworkLearnCardFromSeed.ts @@ -48,17 +48,7 @@ export const didWebNetworkLearnCardFromSeed = async ({ const cryptoLc = await dynamicLc.addPlugin(CryptoPlugin); - const getDidkit = async (): Promise => { - if (didkit === 'node') { - const mod = await import('@learncard/didkit-plugin-node'); - return mod.getDidKitPlugin as typeof getDidKitPlugin; - } - return getDidKitPlugin; - }; - - const didkitLc = await cryptoLc.addPlugin( - await (await getDidkit())(didkit === 'node' ? undefined : didkit, allowRemoteContexts) - ); + const didkitLc = await cryptoLc.addPlugin(await getDidKitPlugin(didkit, allowRemoteContexts)); const didkeyLc = await didkitLc.addPlugin( await getDidKeyPlugin(didkitLc, seed, 'key') diff --git a/packages/learn-card-init/src/initializers/emptyLearnCard.ts b/packages/learn-card-init/src/initializers/emptyLearnCard.ts index b21db485ff..7ad1f4f44b 100644 --- a/packages/learn-card-init/src/initializers/emptyLearnCard.ts +++ b/packages/learn-card-init/src/initializers/emptyLearnCard.ts @@ -23,18 +23,7 @@ export const emptyLearnCard = async ({ const cryptoLc = await dynamicLc.addPlugin(CryptoPlugin); - const getDidkit = async (): Promise => { - if (didkit === 'node') { - const mod = await import('@learncard/didkit-plugin-node'); - return mod.getDidKitPlugin as typeof getDidKitPlugin; - } - - return getDidKitPlugin; - }; - - const didkitLc = await cryptoLc.addPlugin( - await (await getDidkit())(didkit === 'node' ? undefined : didkit, allowRemoteContexts) - ); + const didkitLc = await cryptoLc.addPlugin(await getDidKitPlugin(didkit, allowRemoteContexts)); const expirationLc = await didkitLc.addPlugin(expirationPlugin(didkitLc)); diff --git a/packages/learn-card-init/src/initializers/learnCardFromSeed.ts b/packages/learn-card-init/src/initializers/learnCardFromSeed.ts index 53c1de1f51..6aff585904 100644 --- a/packages/learn-card-init/src/initializers/learnCardFromSeed.ts +++ b/packages/learn-card-init/src/initializers/learnCardFromSeed.ts @@ -39,17 +39,7 @@ export const learnCardFromSeed = async ({ const cryptoLc = await dynamicLc.addPlugin(CryptoPlugin); - const getDidkit = async (): Promise => { - if (didkit === 'node') { - const mod = await import('@learncard/didkit-plugin-node'); - return mod.getDidKitPlugin as typeof getDidKitPlugin; - } - return getDidKitPlugin; - }; - - const didkitLc = await cryptoLc.addPlugin( - await (await getDidkit())(didkit === 'node' ? undefined : didkit, allowRemoteContexts) - ); + const didkitLc = await cryptoLc.addPlugin(await getDidKitPlugin(didkit, allowRemoteContexts)); const didkeyLc = await didkitLc.addPlugin( await getDidKeyPlugin(didkitLc, seed, 'key') diff --git a/packages/learn-card-init/src/initializers/networkLearnCardFromApiKey.ts b/packages/learn-card-init/src/initializers/networkLearnCardFromApiKey.ts index e3b820828b..0a73e69b9d 100644 --- a/packages/learn-card-init/src/initializers/networkLearnCardFromApiKey.ts +++ b/packages/learn-card-init/src/initializers/networkLearnCardFromApiKey.ts @@ -31,17 +31,7 @@ export const networkLearnCardFromApiKey = async ({ const cryptoLc = await dynamicLc.addPlugin(CryptoPlugin); - const getDidkit = async (): Promise => { - if (didkit === 'node') { - const mod = await import('@learncard/didkit-plugin-node'); - return mod.getDidKitPlugin as typeof getDidKitPlugin; - } - return getDidKitPlugin; - }; - - const didkitLc = await cryptoLc.addPlugin( - await (await getDidkit())(didkit === 'node' ? undefined : didkit, allowRemoteContexts) - ); + const didkitLc = await cryptoLc.addPlugin(await getDidKitPlugin(didkit, allowRemoteContexts)); const vcLc = await didkitLc.addPlugin(getVCPlugin(didkitLc)); diff --git a/packages/learn-card-init/src/initializers/networkLearnCardFromSeed.ts b/packages/learn-card-init/src/initializers/networkLearnCardFromSeed.ts index bf532c5cdf..d75caae0c3 100644 --- a/packages/learn-card-init/src/initializers/networkLearnCardFromSeed.ts +++ b/packages/learn-card-init/src/initializers/networkLearnCardFromSeed.ts @@ -44,17 +44,7 @@ export const networkLearnCardFromSeed = async ({ const cryptoLc = await dynamicLc.addPlugin(CryptoPlugin); - const getDidkit = async (): Promise => { - if (didkit === 'node') { - const mod = await import('@learncard/didkit-plugin-node'); - return mod.getDidKitPlugin as typeof getDidKitPlugin; - } - return getDidKitPlugin; - }; - - const didkitLc = await cryptoLc.addPlugin( - await (await getDidkit())(didkit === 'node' ? undefined : didkit, allowRemoteContexts) - ); + const didkitLc = await cryptoLc.addPlugin(await getDidKitPlugin(didkit, allowRemoteContexts)); const didkeyLc = await didkitLc.addPlugin( await getDidKeyPlugin(didkitLc, seed, 'key') diff --git a/packages/learn-card-init/src/types/LearnCard.ts b/packages/learn-card-init/src/types/LearnCard.ts index 80bb41ce16..13fd799c9b 100644 --- a/packages/learn-card-init/src/types/LearnCard.ts +++ b/packages/learn-card-init/src/types/LearnCard.ts @@ -28,7 +28,7 @@ export type LearnCardConfig = { unencryptedCustomFields?: string[]; automaticallyAssociateDids?: boolean; }; - didkit: InitInput | Promise | 'node'; + didkit: InitInput | Promise; allowRemoteContexts?: boolean; ethereumConfig: EthereumConfig; debug?: typeof console.log; diff --git a/packages/learn-card-init/src/types/didkit-plugin-node-ambient.d.ts b/packages/learn-card-init/src/types/didkit-plugin-node-ambient.d.ts deleted file mode 100644 index 92daef0722..0000000000 --- a/packages/learn-card-init/src/types/didkit-plugin-node-ambient.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -declare module '@learncard/didkit-plugin-node' { - export const getDidKitPlugin: ( - input?: unknown, - allowRemoteContexts?: boolean - ) => Promise; -} diff --git a/packages/learn-card-network/brain-client/CHANGELOG.md b/packages/learn-card-network/brain-client/CHANGELOG.md index 4e6ce8138b..21f4e58be6 100644 --- a/packages/learn-card-network/brain-client/CHANGELOG.md +++ b/packages/learn-card-network/brain-client/CHANGELOG.md @@ -1,19 +1,5 @@ # @learncard/network-brain-client -## 2.5.9 - -### Patch Changes - -- Updated dependencies [[`7e30fc7116411ba19a4889cfbf9fc71dd725c309`](https://github.com/learningeconomy/LearnCard/commit/7e30fc7116411ba19a4889cfbf9fc71dd725c309)]: - - @learncard/network-brain-service@3.10.0 - -## 2.5.8 - -### Patch Changes - -- Updated dependencies [[`e41a15b2b2850fc3c562b254b3aef707d34e5437`](https://github.com/learningeconomy/LearnCard/commit/e41a15b2b2850fc3c562b254b3aef707d34e5437)]: - - @learncard/network-brain-service@3.9.6 - ## 2.5.7 ### Patch Changes diff --git a/packages/learn-card-network/brain-client/package.json b/packages/learn-card-network/brain-client/package.json index 039c214a4e..d651a88dc1 100644 --- a/packages/learn-card-network/brain-client/package.json +++ b/packages/learn-card-network/brain-client/package.json @@ -1,6 +1,6 @@ { "name": "@learncard/network-brain-client", - "version": "2.5.9", + "version": "2.5.7", "description": "", "main": "dist/index.js", "module": "./dist/brain-client.esm.js", diff --git a/packages/learn-card-network/cloud-client/CHANGELOG.md b/packages/learn-card-network/cloud-client/CHANGELOG.md index 7b304a861c..44a1546487 100644 --- a/packages/learn-card-network/cloud-client/CHANGELOG.md +++ b/packages/learn-card-network/cloud-client/CHANGELOG.md @@ -1,12 +1,5 @@ # @learncard/network-brain-client -## 1.6.7 - -### Patch Changes - -- Updated dependencies [[`7e30fc7116411ba19a4889cfbf9fc71dd725c309`](https://github.com/learningeconomy/LearnCard/commit/7e30fc7116411ba19a4889cfbf9fc71dd725c309)]: - - @learncard/learn-cloud-service@2.5.0 - ## 1.6.6 ### Patch Changes diff --git a/packages/learn-card-network/cloud-client/package.json b/packages/learn-card-network/cloud-client/package.json index fcee69ec23..6b0916f088 100644 --- a/packages/learn-card-network/cloud-client/package.json +++ b/packages/learn-card-network/cloud-client/package.json @@ -1,6 +1,6 @@ { "name": "@learncard/learn-cloud-client", - "version": "1.6.7", + "version": "1.6.6", "description": "", "main": "dist/index.js", "module": "./dist/learn-cloud-client.esm.js", diff --git a/packages/learn-card-network/simple-signing-client/CHANGELOG.md b/packages/learn-card-network/simple-signing-client/CHANGELOG.md index 9ccd3703ed..c27fde3d13 100644 --- a/packages/learn-card-network/simple-signing-client/CHANGELOG.md +++ b/packages/learn-card-network/simple-signing-client/CHANGELOG.md @@ -1,12 +1,5 @@ # @welibraryos/lca-api-client -## 1.1.5 - -### Patch Changes - -- Updated dependencies [[`7e30fc7116411ba19a4889cfbf9fc71dd725c309`](https://github.com/learningeconomy/LearnCard/commit/7e30fc7116411ba19a4889cfbf9fc71dd725c309)]: - - @learncard/simple-signing-service@1.2.0 - ## 1.1.4 ### Patch Changes diff --git a/packages/learn-card-network/simple-signing-client/package.json b/packages/learn-card-network/simple-signing-client/package.json index 1b7731faa6..917c54d366 100644 --- a/packages/learn-card-network/simple-signing-client/package.json +++ b/packages/learn-card-network/simple-signing-client/package.json @@ -1,6 +1,6 @@ { "name": "@learncard/simple-signing-client", - "version": "1.1.5", + "version": "1.1.4", "description": "", "main": "dist/index.js", "module": "./dist/simple-signing-client.esm.js", diff --git a/packages/learn-card-network/simple-signing-client/project.json b/packages/learn-card-network/simple-signing-client/project.json index f3286e8d86..7a069ae961 100644 --- a/packages/learn-card-network/simple-signing-client/project.json +++ b/packages/learn-card-network/simple-signing-client/project.json @@ -6,7 +6,7 @@ "root": "packages/learn-card-network/simple-signing-client", "tags": [], "implicitDependencies": [ - "simple-signing-service-app" + "simple-signing-service" ], "namedInputs": { "source": [ diff --git a/packages/learn-card-partner-connect-sdk/CHANGELOG.md b/packages/learn-card-partner-connect-sdk/CHANGELOG.md index 02b2735d7e..2ee2bd198a 100644 --- a/packages/learn-card-partner-connect-sdk/CHANGELOG.md +++ b/packages/learn-card-partner-connect-sdk/CHANGELOG.md @@ -1,11 +1,5 @@ # @learncard/partner-connect -## 0.2.3 - -### Patch Changes - -- [#949](https://github.com/learningeconomy/LearnCard/pull/949) [`f797ad95a9324dd56bc3d22e4e2b07caa0c53d94`](https://github.com/learningeconomy/LearnCard/commit/f797ad95a9324dd56bc3d22e4e2b07caa0c53d94) Thanks [@Custard7](https://github.com/Custard7)! - feat: Enhance Partner Connect - ## 0.2.2 ### Patch Changes diff --git a/packages/learn-card-partner-connect-sdk/package.json b/packages/learn-card-partner-connect-sdk/package.json index 30f28b356a..fb22a3673c 100644 --- a/packages/learn-card-partner-connect-sdk/package.json +++ b/packages/learn-card-partner-connect-sdk/package.json @@ -1,6 +1,6 @@ { "name": "@learncard/partner-connect", - "version": "0.2.3", + "version": "0.2.2", "repository": { "type": "git", "url": "https://github.com/learningeconomy/LearnCard" diff --git a/packages/learn-card-partner-connect-sdk/src/index.ts b/packages/learn-card-partner-connect-sdk/src/index.ts index 25dcc1c10a..3dcd8ec4bf 100644 --- a/packages/learn-card-partner-connect-sdk/src/index.ts +++ b/packages/learn-card-partner-connect-sdk/src/index.ts @@ -28,7 +28,6 @@ import type { CredentialSearchResponse, CredentialSpecificResponse, ConsentResponse, - RequestConsentOptions, TemplateIssueResponse, AppEvent, AppEventResponse, @@ -394,29 +393,14 @@ export class PartnerConnect { * * @example * ```typescript - * // Without redirect (default) - returns VP in response if app owns the contract * const response = await learnCard.requestConsent('lc:network:network.learncard.com/trpc:contract:abc123'); * if (response.granted) { * console.log('User granted consent'); - * if (response.vp) { - * console.log('VP:', response.vp); - * } * } - * - * // With redirect - redirects to contract's redirectUrl with VP in URL params - * const response = await learnCard.requestConsent('lc:network:network.learncard.com/trpc:contract:abc123', { redirect: true }); * ``` */ - public requestConsent( - contractUri: string, - options: RequestConsentOptions = {} - ): Promise { - const { redirect = false } = options; - - return this.sendMessage('REQUEST_CONSENT', { - contractUri, - redirect, - }); + public requestConsent(contractUri: string): Promise { + return this.sendMessage('REQUEST_CONSENT', { contractUri }); } /** diff --git a/packages/learn-card-partner-connect-sdk/src/types.ts b/packages/learn-card-partner-connect-sdk/src/types.ts index 9c256d74ba..c62777ce4a 100644 --- a/packages/learn-card-partner-connect-sdk/src/types.ts +++ b/packages/learn-card-partner-connect-sdk/src/types.ts @@ -153,17 +153,6 @@ export interface CredentialSpecificResponse { credential?: unknown; } -/** - * Options for REQUEST_CONSENT action - */ -export interface RequestConsentOptions { - /** - * If true, redirect to contract's redirectUrl with VP after consent. - * Default: false - */ - redirect?: boolean; -} - /** * Response from REQUEST_CONSENT action */ diff --git a/packages/learn-card-types/src/lcn.ts b/packages/learn-card-types/src/lcn.ts index 3365284c07..aeb4033bdd 100644 --- a/packages/learn-card-types/src/lcn.ts +++ b/packages/learn-card-types/src/lcn.ts @@ -1,4 +1,4 @@ -import type { } from 'zod-openapi'; +import type {} from 'zod-openapi'; import { z } from 'zod'; import { PaginationResponseValidator } from './mongo'; diff --git a/packages/plugins/didkit-plugin-node/.gitignore b/packages/plugins/didkit-plugin-node/.gitignore deleted file mode 100644 index e6203270ea..0000000000 --- a/packages/plugins/didkit-plugin-node/.gitignore +++ /dev/null @@ -1,7 +0,0 @@ -*.node -*.a -*.so -*.dylib -*.dll -target/ -dist/ diff --git a/packages/plugins/didkit-plugin-node/CHANGELOG.md b/packages/plugins/didkit-plugin-node/CHANGELOG.md deleted file mode 100644 index c4e9a99fbc..0000000000 --- a/packages/plugins/didkit-plugin-node/CHANGELOG.md +++ /dev/null @@ -1,45 +0,0 @@ -# @learncard/didkit-plugin-node - -## 0.2.0 - -### Minor Changes - -- [#936](https://github.com/learningeconomy/LearnCard/pull/936) [`7e30fc7116411ba19a4889cfbf9fc71dd725c309`](https://github.com/learningeconomy/LearnCard/commit/7e30fc7116411ba19a4889cfbf9fc71dd725c309) Thanks [@TaylorBeeston](https://github.com/TaylorBeeston)! - ## New Native DIDKit Plugin (`@learncard/didkit-plugin-node`) - - Adds a high-performance native Node.js DIDKit plugin using Rust and N-API, providing **~18x faster cold starts** compared to the WASM version. - - ### Key Features - - - **Native Performance**: Eliminates WASM compilation overhead on cold starts (~1100ms → ~60ms) - - **Cross-Platform Binaries**: Prebuilt for Linux (x64/arm64, glibc/musl), macOS (x64/arm64), and Windows (x64) - - **Drop-in Replacement**: API-compatible with `@learncard/didkit-plugin` - - **JWE Support**: Full JWE and DAG-JWE encryption/decryption - - **Async Operations**: All crypto operations run on separate thread pool, non-blocking - - ### Usage - - ```typescript - import { initLearnCard } from '@learncard/init'; - - // Use native plugin instead of WASM - const learnCard = await initLearnCard({ - seed: 'your-seed', - didkit: 'node', // <-- new option - }); - ``` - - ### When to Use - - - āœ… Serverless functions (AWS Lambda, Vercel) - - āœ… Node.js servers (Express, Fastify, NestJS) - - āœ… CLI tools and scripts - - āœ… High-throughput credential processing - - ### Service Updates - - All LearnCard Network services (brain-service, learn-cloud-service, simple-signing-service) now use the native plugin in Docker/Lambda environments for improved cold start performance. - -### Patch Changes - -- Updated dependencies [[`7e30fc7116411ba19a4889cfbf9fc71dd725c309`](https://github.com/learningeconomy/LearnCard/commit/7e30fc7116411ba19a4889cfbf9fc71dd725c309)]: - - @learncard/didkit-plugin@1.7.0 diff --git a/packages/plugins/didkit-plugin-node/README.md b/packages/plugins/didkit-plugin-node/README.md deleted file mode 100644 index dea3942cc2..0000000000 --- a/packages/plugins/didkit-plugin-node/README.md +++ /dev/null @@ -1,94 +0,0 @@ -# @learncard/didkit-plugin-node - -Node-native N-API DIDKit plugin for LearnCard. Provides cryptographic operations without WASM overhead, ideal for Lambda and server environments. - -## Features - -- **Native Performance**: Uses N-API to eliminate WASM cold start overhead -- **Cross-Platform**: Prebuilt binaries for Linux (x64/arm64, glibc/musl) and macOS (x64/arm64) -- **Drop-in Replacement**: Compatible with existing `@learncard/didkit-plugin` API -- **Lambda-Optimized**: Designed specifically for serverless environments - -## Installation - -```bash -pnpm add @learncard/didkit-plugin-node -``` - -Prebuilt binaries will be automatically installed for your platform via `optionalDependencies`. - -## Usage - -### With `initLearnCard` - -```typescript -import { initLearnCard } from '@learncard/init'; - -const learnCard = await initLearnCard({ - seed: 'your-seed-here', - didkit: 'node', // Use native plugin instead of WASM -}); -``` - -### Direct Plugin Usage - -```typescript -import { getDidKitPlugin } from '@learncard/didkit-plugin-node'; - -const plugin = await getDidKitPlugin(); -// Use plugin methods... -``` - -## Building from Source - -If prebuilt binaries aren't available for your platform: - -```bash -cd packages/plugins/didkit-plugin-node -pnpm install -pnpm build -``` - -### Requirements - -- Rust toolchain (stable) -- Node.js 16+ -- Platform-specific build tools (gcc, clang, etc.) - -## Supported Platforms - -- `x86_64-unknown-linux-gnu` (glibc-based Linux, x64) -- `aarch64-unknown-linux-gnu` (glibc-based Linux, ARM64) -- `x86_64-unknown-linux-musl` (musl-based Linux, x64, e.g., Alpine) -- `aarch64-unknown-linux-musl` (musl-based Linux, ARM64) -- `x86_64-apple-darwin` (macOS Intel) -- `aarch64-apple-darwin` (macOS Apple Silicon) - -## Implementation Status - -### āœ… Implemented -- `generateEd25519KeyFromBytes` -- `keyToDID` - -### 🚧 Planned -- `generateSecp256k1KeyFromBytes` -- `keyToVerificationMethod` -- `didToVerificationMethod` -- `issueCredential` -- `verifyCredential` -- `issuePresentation` -- `verifyPresentation` -- `contextLoader` -- `resolveDID` -- `didResolver` -- `createJwe` / `decryptJwe` -- `createDagJwe` / `decryptDagJwe` -- `clearDidWebCache` - -## Contributing - -See the main [LearnCard repository](https://github.com/learningeconomy/LearnCard) for contribution guidelines. - -## License - -MIT diff --git a/packages/plugins/didkit-plugin-node/benchmark.ts b/packages/plugins/didkit-plugin-node/benchmark.ts deleted file mode 100644 index 9b6306a7ae..0000000000 --- a/packages/plugins/didkit-plugin-node/benchmark.ts +++ /dev/null @@ -1,296 +0,0 @@ -/** - * Benchmark: WASM vs Native DIDKit Plugin Performance - * - * Run with: npx tsx benchmark.ts - */ - -import { performance } from 'perf_hooks'; - -// Benchmark configuration -const ITERATIONS = 50; -const WARMUP_ITERATIONS = 5; -const INIT_ITERATIONS = 10; // Fewer for init since it's slow - -interface BenchmarkResult { - operation: string; - wasmAvg: number; - nativeAvg: number; - speedup: string; -} - -async function benchmark( - name: string, - fn: () => Promise | T, - iterations: number, - warmupIterations = WARMUP_ITERATIONS -): Promise { - // Warmup - for (let i = 0; i < warmupIterations; i++) { - await fn(); - } - - // Actual benchmark - const times: number[] = []; - - for (let i = 0; i < iterations; i++) { - const start = performance.now(); - await fn(); - const end = performance.now(); - times.push(end - start); - } - - const avg = times.reduce((a, b) => a + b, 0) / times.length; - return avg; -} - -async function runBenchmarks() { - console.log('šŸ”¬ DIDKit Benchmark: WASM vs Native\n'); - console.log(`Iterations: ${ITERATIONS} (+ ${WARMUP_ITERATIONS} warmup)\n`); - - const results: BenchmarkResult[] = []; - - // ======================================== - // 0. Plugin Initialization Time - // ======================================== - console.log('šŸ“Š Benchmarking Plugin Init Time...'); - - const wasmInit = await benchmark( - 'WASM Init', - async () => { - const { getDidKitPlugin } = await import('@learncard/didkit-plugin'); - return await getDidKitPlugin(); - }, - INIT_ITERATIONS, - 2 - ); - - const nativeInit = await benchmark( - 'Native Init', - async () => { - const { getDidKitPlugin } = await import('./src/plugin'); - return await getDidKitPlugin(); - }, - INIT_ITERATIONS, - 2 - ); - - results.push({ - operation: 'Plugin Init', - wasmAvg: wasmInit, - nativeAvg: nativeInit, - speedup: `${(wasmInit / nativeInit).toFixed(2)}x`, - }); - - // Load plugins once for remaining tests - const { getDidKitPlugin: getWasmPlugin } = await import('@learncard/didkit-plugin'); - const wasmPlugin = await getWasmPlugin(); - - const { getDidKitPlugin: getNativePlugin } = await import('./src/plugin'); - const nativePlugin = await getNativePlugin(); - - // Test seed for deterministic keys - const testSeed = new Uint8Array(32).fill(42); - const keypair = nativePlugin.methods.generateEd25519KeyFromBytes({} as any, testSeed); - const did = nativePlugin.methods.keyToDid({} as any, 'key', keypair); - - // ======================================== - // 1. Key Generation (Ed25519) - // ======================================== - console.log('šŸ“Š Benchmarking Ed25519 Key Generation...'); - - const wasmKeyGen = await benchmark( - 'WASM Ed25519 KeyGen', - () => wasmPlugin.methods.generateEd25519KeyFromBytes({} as any, testSeed), - ITERATIONS - ); - - const nativeKeyGen = await benchmark( - 'Native Ed25519 KeyGen', - () => nativePlugin.methods.generateEd25519KeyFromBytes({} as any, testSeed), - ITERATIONS - ); - - results.push({ - operation: 'Ed25519 Key Generation', - wasmAvg: wasmKeyGen, - nativeAvg: nativeKeyGen, - speedup: `${(wasmKeyGen / nativeKeyGen).toFixed(2)}x`, - }); - - // ======================================== - // 2. Key to DID - // ======================================== - console.log('šŸ“Š Benchmarking keyToDid...'); - - const wasmKeyToDid = await benchmark( - 'WASM keyToDid', - () => wasmPlugin.methods.keyToDid({} as any, 'key', keypair), - ITERATIONS - ); - - const nativeKeyToDid = await benchmark( - 'Native keyToDid', - () => nativePlugin.methods.keyToDid({} as any, 'key', keypair), - ITERATIONS - ); - - results.push({ - operation: 'keyToDid', - wasmAvg: wasmKeyToDid, - nativeAvg: nativeKeyToDid, - speedup: `${(wasmKeyToDid / nativeKeyToDid).toFixed(2)}x`, - }); - - // ======================================== - // 3. Context Loading - // ======================================== - console.log('šŸ“Š Benchmarking contextLoader...'); - - const testContextUrl = 'https://www.w3.org/2018/credentials/v1'; - - const wasmContextLoad = await benchmark( - 'WASM contextLoader', - () => wasmPlugin.context!.resolveStaticDocument!({} as any, testContextUrl), - ITERATIONS - ); - - const nativeContextLoad = await benchmark( - 'Native contextLoader', - () => nativePlugin.context!.resolveStaticDocument!({} as any, testContextUrl), - ITERATIONS - ); - - results.push({ - operation: 'Context Loading', - wasmAvg: wasmContextLoad, - nativeAvg: nativeContextLoad, - speedup: `${(wasmContextLoad / nativeContextLoad).toFixed(2)}x`, - }); - - // ======================================== - // 4. keyToVerificationMethod - // ======================================== - console.log('šŸ“Š Benchmarking keyToVerificationMethod...'); - - const wasmKeyToVm = await benchmark( - 'WASM keyToVerificationMethod', - () => wasmPlugin.methods.keyToVerificationMethod({} as any, 'key', keypair), - ITERATIONS - ); - - const nativeKeyToVm = await benchmark( - 'Native keyToVerificationMethod', - () => nativePlugin.methods.keyToVerificationMethod({} as any, 'key', keypair), - ITERATIONS - ); - - results.push({ - operation: 'keyToVerificationMethod', - wasmAvg: wasmKeyToVm, - nativeAvg: nativeKeyToVm, - speedup: `${(wasmKeyToVm / nativeKeyToVm).toFixed(2)}x`, - }); - - // ======================================== - // 5. JWE Encryption (Native only - WASM impl differs) - // ======================================== - console.log('šŸ“Š Benchmarking JWE Encryption (Native only)...'); - - const cleartext = 'Hello, this is a secret message for benchmarking!'; - const recipientDid = did; - - const nativeEncrypt = await benchmark( - 'Native createJwe', - () => nativePlugin.methods.createJwe({} as any, cleartext, [recipientDid]), - ITERATIONS - ); - - console.log(` Native JWE Encrypt: ${nativeEncrypt.toFixed(3)}ms avg`); - - // ======================================== - // 6. JWE Decryption (Native only) - // ======================================== - console.log('šŸ“Š Benchmarking JWE Decryption (Native only)...'); - - const jwe = await nativePlugin.methods.createJwe({} as any, cleartext, [recipientDid]); - - const nativeDecrypt = await benchmark( - 'Native decryptJwe', - () => nativePlugin.methods.decryptJwe({} as any, jwe, [keypair]), - ITERATIONS - ); - - console.log(` Native JWE Decrypt: ${nativeDecrypt.toFixed(3)}ms avg`); - - // ======================================== - // 7. DAG-JWE Encryption (Native only) - // ======================================== - console.log('šŸ“Š Benchmarking DAG-JWE Encryption (Native only)...'); - - const dagCleartext = { message: 'Hello', nested: { data: [1, 2, 3] } }; - - const nativeDagEncrypt = await benchmark( - 'Native createDagJwe', - () => nativePlugin.methods.createDagJwe({} as any, dagCleartext, [recipientDid]), - ITERATIONS - ); - - console.log(` Native DAG-JWE Encrypt: ${nativeDagEncrypt.toFixed(3)}ms avg`); - - // ======================================== - // 8. DAG-JWE Decryption (Native only) - // ======================================== - console.log('šŸ“Š Benchmarking DAG-JWE Decryption (Native only)...'); - - const dagJwe = await nativePlugin.methods.createDagJwe({} as any, dagCleartext, [recipientDid]); - - const nativeDagDecrypt = await benchmark( - 'Native decryptDagJwe', - () => nativePlugin.methods.decryptDagJwe({} as any, dagJwe, [keypair]), - ITERATIONS - ); - - console.log(` Native DAG-JWE Decrypt: ${nativeDagDecrypt.toFixed(3)}ms avg`); - - // Note: JWE operations use different implementations between WASM and Native - // so direct comparison isn't meaningful. The native times above show absolute performance. - - // ======================================== - // Print Results - // ======================================== - console.log('\n' + '='.repeat(80)); - console.log('šŸ“ˆ BENCHMARK RESULTS'); - console.log('='.repeat(80)); - console.log('\n| Operation | WASM (ms) | Native (ms) | Speedup |'); - console.log('|-------------------------------------|-----------|-------------|---------|'); - - for (const result of results) { - const speedupNum = parseFloat(result.speedup); - const speedupStr = speedupNum >= 1 ? result.speedup : `${result.speedup} āŒ`; - - console.log( - `| ${result.operation.padEnd(35)} | ${result.wasmAvg - .toFixed(3) - .padStart(9)} | ${result.nativeAvg.toFixed(3).padStart(11)} | ${speedupStr.padStart( - 7 - )} |` - ); - } - - console.log('\n' + '='.repeat(80)); - - // Summary - const speedups = results.map(r => parseFloat(r.speedup)); - const avgSpeedup = speedups.reduce((a, b) => a + b, 0) / speedups.length; - const fasterCount = speedups.filter(s => s >= 1).length; - const slowerCount = speedups.filter(s => s < 1).length; - - console.log(`\nšŸ“Š Summary:`); - console.log(` Average speedup: ${avgSpeedup.toFixed(2)}x`); - console.log(` Native faster: ${fasterCount}/${results.length} operations`); - console.log(` Native slower: ${slowerCount}/${results.length} operations`); - console.log('\nNote: Results may vary based on system load and hardware.'); - console.log('Speedup > 1 = Native faster, < 1 = WASM faster'); -} - -runBenchmarks().catch(console.error); diff --git a/packages/plugins/didkit-plugin-node/check-exports.cjs b/packages/plugins/didkit-plugin-node/check-exports.cjs deleted file mode 100644 index 29470ed91d..0000000000 --- a/packages/plugins/didkit-plugin-node/check-exports.cjs +++ /dev/null @@ -1,3 +0,0 @@ -const native = require('@learncard/didkit-plugin-node'); -console.log('Native module exports:', Object.keys(native)); -console.log('Full native object:', native); diff --git a/packages/plugins/didkit-plugin-node/check-exports.mjs b/packages/plugins/didkit-plugin-node/check-exports.mjs deleted file mode 100644 index 29470ed91d..0000000000 --- a/packages/plugins/didkit-plugin-node/check-exports.mjs +++ /dev/null @@ -1,3 +0,0 @@ -const native = require('@learncard/didkit-plugin-node'); -console.log('Native module exports:', Object.keys(native)); -console.log('Full native object:', native); diff --git a/packages/plugins/didkit-plugin-node/index.d.ts b/packages/plugins/didkit-plugin-node/index.d.ts deleted file mode 100644 index f22c08b487..0000000000 --- a/packages/plugins/didkit-plugin-node/index.d.ts +++ /dev/null @@ -1,22 +0,0 @@ -/* tslint:disable */ -/* eslint-disable */ - -/* auto-generated by NAPI-RS */ - -export declare function generateEd25519KeyFromBytes(bytes: Buffer): string -export declare function generateSecp256K1KeyFromBytes(bytes: Buffer): string -export declare function keyToDid(methodPattern: string, jwkJson: string): string -export declare function keyToVerificationMethod(methodPattern: string, jwkJson: string): Promise -export declare function didToVerificationMethod(did: string): Promise -export declare function resolveDid(did: string, inputMetadata: string): Promise -export declare function didResolver(did: string, inputMetadata: string): Promise -export declare function issueCredential(credential: string, proofOptions: string, key: string, contextMap: string): Promise -export declare function verifyCredential(credential: string, proofOptions: string, contextMap: string): Promise -export declare function issuePresentation(presentation: string, proofOptions: string, key: string, contextMap: string): Promise -export declare function verifyPresentation(presentation: string, proofOptions: string, contextMap: string): Promise -export declare function contextLoader(url: string): string -export declare function createJwe(cleartext: string, recipients: Array): string -export declare function decryptJwe(jwe: string, jwksJson: Array): string -export declare function createDagJwe(cleartext: string, recipients: Array): string -export declare function decryptDagJwe(jwe: string, jwksJson: Array): string -export declare function clearCache(): Promise diff --git a/packages/plugins/didkit-plugin-node/index.js b/packages/plugins/didkit-plugin-node/index.js deleted file mode 100644 index e7ed527c1a..0000000000 --- a/packages/plugins/didkit-plugin-node/index.js +++ /dev/null @@ -1,331 +0,0 @@ -/* tslint:disable */ -/* eslint-disable */ -/* prettier-ignore */ - -/* auto-generated by NAPI-RS */ - -const { existsSync, readFileSync } = require('fs') -const { join } = require('path') - -const { platform, arch } = process - -let nativeBinding = null -let localFileExisted = false -let loadError = null - -function isMusl() { - // For Node 10 - if (!process.report || typeof process.report.getReport !== 'function') { - try { - const lddPath = require('child_process').execSync('which ldd').toString().trim() - return readFileSync(lddPath, 'utf8').includes('musl') - } catch (e) { - return true - } - } else { - const { glibcVersionRuntime } = process.report.getReport().header - return !glibcVersionRuntime - } -} - -switch (platform) { - case 'android': - switch (arch) { - case 'arm64': - localFileExisted = existsSync(join(__dirname, 'index.android-arm64.node')) - try { - if (localFileExisted) { - nativeBinding = require('./index.android-arm64.node') - } else { - nativeBinding = require('@learncard/didkit-plugin-node-android-arm64') - } - } catch (e) { - loadError = e - } - break - case 'arm': - localFileExisted = existsSync(join(__dirname, 'index.android-arm-eabi.node')) - try { - if (localFileExisted) { - nativeBinding = require('./index.android-arm-eabi.node') - } else { - nativeBinding = require('@learncard/didkit-plugin-node-android-arm-eabi') - } - } catch (e) { - loadError = e - } - break - default: - throw new Error(`Unsupported architecture on Android ${arch}`) - } - break - case 'win32': - switch (arch) { - case 'x64': - localFileExisted = existsSync( - join(__dirname, 'index.win32-x64-msvc.node') - ) - try { - if (localFileExisted) { - nativeBinding = require('./index.win32-x64-msvc.node') - } else { - nativeBinding = require('@learncard/didkit-plugin-node-win32-x64-msvc') - } - } catch (e) { - loadError = e - } - break - case 'ia32': - localFileExisted = existsSync( - join(__dirname, 'index.win32-ia32-msvc.node') - ) - try { - if (localFileExisted) { - nativeBinding = require('./index.win32-ia32-msvc.node') - } else { - nativeBinding = require('@learncard/didkit-plugin-node-win32-ia32-msvc') - } - } catch (e) { - loadError = e - } - break - case 'arm64': - localFileExisted = existsSync( - join(__dirname, 'index.win32-arm64-msvc.node') - ) - try { - if (localFileExisted) { - nativeBinding = require('./index.win32-arm64-msvc.node') - } else { - nativeBinding = require('@learncard/didkit-plugin-node-win32-arm64-msvc') - } - } catch (e) { - loadError = e - } - break - default: - throw new Error(`Unsupported architecture on Windows: ${arch}`) - } - break - case 'darwin': - localFileExisted = existsSync(join(__dirname, 'index.darwin-universal.node')) - try { - if (localFileExisted) { - nativeBinding = require('./index.darwin-universal.node') - } else { - nativeBinding = require('@learncard/didkit-plugin-node-darwin-universal') - } - break - } catch {} - switch (arch) { - case 'x64': - localFileExisted = existsSync(join(__dirname, 'index.darwin-x64.node')) - try { - if (localFileExisted) { - nativeBinding = require('./index.darwin-x64.node') - } else { - nativeBinding = require('@learncard/didkit-plugin-node-darwin-x64') - } - } catch (e) { - loadError = e - } - break - case 'arm64': - localFileExisted = existsSync( - join(__dirname, 'index.darwin-arm64.node') - ) - try { - if (localFileExisted) { - nativeBinding = require('./index.darwin-arm64.node') - } else { - nativeBinding = require('@learncard/didkit-plugin-node-darwin-arm64') - } - } catch (e) { - loadError = e - } - break - default: - throw new Error(`Unsupported architecture on macOS: ${arch}`) - } - break - case 'freebsd': - if (arch !== 'x64') { - throw new Error(`Unsupported architecture on FreeBSD: ${arch}`) - } - localFileExisted = existsSync(join(__dirname, 'index.freebsd-x64.node')) - try { - if (localFileExisted) { - nativeBinding = require('./index.freebsd-x64.node') - } else { - nativeBinding = require('@learncard/didkit-plugin-node-freebsd-x64') - } - } catch (e) { - loadError = e - } - break - case 'linux': - switch (arch) { - case 'x64': - if (isMusl()) { - localFileExisted = existsSync( - join(__dirname, 'index.linux-x64-musl.node') - ) - try { - if (localFileExisted) { - nativeBinding = require('./index.linux-x64-musl.node') - } else { - nativeBinding = require('@learncard/didkit-plugin-node-linux-x64-musl') - } - } catch (e) { - loadError = e - } - } else { - localFileExisted = existsSync( - join(__dirname, 'index.linux-x64-gnu.node') - ) - try { - if (localFileExisted) { - nativeBinding = require('./index.linux-x64-gnu.node') - } else { - nativeBinding = require('@learncard/didkit-plugin-node-linux-x64-gnu') - } - } catch (e) { - loadError = e - } - } - break - case 'arm64': - if (isMusl()) { - localFileExisted = existsSync( - join(__dirname, 'index.linux-arm64-musl.node') - ) - try { - if (localFileExisted) { - nativeBinding = require('./index.linux-arm64-musl.node') - } else { - nativeBinding = require('@learncard/didkit-plugin-node-linux-arm64-musl') - } - } catch (e) { - loadError = e - } - } else { - localFileExisted = existsSync( - join(__dirname, 'index.linux-arm64-gnu.node') - ) - try { - if (localFileExisted) { - nativeBinding = require('./index.linux-arm64-gnu.node') - } else { - nativeBinding = require('@learncard/didkit-plugin-node-linux-arm64-gnu') - } - } catch (e) { - loadError = e - } - } - break - case 'arm': - if (isMusl()) { - localFileExisted = existsSync( - join(__dirname, 'index.linux-arm-musleabihf.node') - ) - try { - if (localFileExisted) { - nativeBinding = require('./index.linux-arm-musleabihf.node') - } else { - nativeBinding = require('@learncard/didkit-plugin-node-linux-arm-musleabihf') - } - } catch (e) { - loadError = e - } - } else { - localFileExisted = existsSync( - join(__dirname, 'index.linux-arm-gnueabihf.node') - ) - try { - if (localFileExisted) { - nativeBinding = require('./index.linux-arm-gnueabihf.node') - } else { - nativeBinding = require('@learncard/didkit-plugin-node-linux-arm-gnueabihf') - } - } catch (e) { - loadError = e - } - } - break - case 'riscv64': - if (isMusl()) { - localFileExisted = existsSync( - join(__dirname, 'index.linux-riscv64-musl.node') - ) - try { - if (localFileExisted) { - nativeBinding = require('./index.linux-riscv64-musl.node') - } else { - nativeBinding = require('@learncard/didkit-plugin-node-linux-riscv64-musl') - } - } catch (e) { - loadError = e - } - } else { - localFileExisted = existsSync( - join(__dirname, 'index.linux-riscv64-gnu.node') - ) - try { - if (localFileExisted) { - nativeBinding = require('./index.linux-riscv64-gnu.node') - } else { - nativeBinding = require('@learncard/didkit-plugin-node-linux-riscv64-gnu') - } - } catch (e) { - loadError = e - } - } - break - case 's390x': - localFileExisted = existsSync( - join(__dirname, 'index.linux-s390x-gnu.node') - ) - try { - if (localFileExisted) { - nativeBinding = require('./index.linux-s390x-gnu.node') - } else { - nativeBinding = require('@learncard/didkit-plugin-node-linux-s390x-gnu') - } - } catch (e) { - loadError = e - } - break - default: - throw new Error(`Unsupported architecture on Linux: ${arch}`) - } - break - default: - throw new Error(`Unsupported OS: ${platform}, architecture: ${arch}`) -} - -if (!nativeBinding) { - if (loadError) { - throw loadError - } - throw new Error(`Failed to load native binding`) -} - -const { generateEd25519KeyFromBytes, generateSecp256K1KeyFromBytes, keyToDid, keyToVerificationMethod, didToVerificationMethod, resolveDid, didResolver, issueCredential, verifyCredential, issuePresentation, verifyPresentation, contextLoader, createJwe, decryptJwe, createDagJwe, decryptDagJwe, clearCache } = nativeBinding - -module.exports.generateEd25519KeyFromBytes = generateEd25519KeyFromBytes -module.exports.generateSecp256K1KeyFromBytes = generateSecp256K1KeyFromBytes -module.exports.keyToDid = keyToDid -module.exports.keyToVerificationMethod = keyToVerificationMethod -module.exports.didToVerificationMethod = didToVerificationMethod -module.exports.resolveDid = resolveDid -module.exports.didResolver = didResolver -module.exports.issueCredential = issueCredential -module.exports.verifyCredential = verifyCredential -module.exports.issuePresentation = issuePresentation -module.exports.verifyPresentation = verifyPresentation -module.exports.contextLoader = contextLoader -module.exports.createJwe = createJwe -module.exports.decryptJwe = decryptJwe -module.exports.createDagJwe = createDagJwe -module.exports.decryptDagJwe = decryptDagJwe -module.exports.clearCache = clearCache diff --git a/packages/plugins/didkit-plugin-node/native/Cargo.lock b/packages/plugins/didkit-plugin-node/native/Cargo.lock deleted file mode 100644 index ec63ebc8a8..0000000000 --- a/packages/plugins/didkit-plugin-node/native/Cargo.lock +++ /dev/null @@ -1,5990 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 4 - -[[package]] -name = "abnf" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "087113bd50d9adce24850eed5d0476c7d199d532fce8fab5173650331e09033a" -dependencies = [ - "abnf-core", - "nom", -] - -[[package]] -name = "abnf-core" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c44e09c43ae1c368fb91a03a566472d0087c26cf7e1b9e8e289c14ede681dd7d" -dependencies = [ - "nom", -] - -[[package]] -name = "addr2line" -version = "0.25.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b5d307320b3181d6d7954e663bd7c774a838b8220fe0593c86d9fb09f498b4b" -dependencies = [ - "gimli", -] - -[[package]] -name = "adler2" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" - -[[package]] -name = "aead" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0" -dependencies = [ - "crypto-common", - "generic-array", -] - -[[package]] -name = "aes" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" -dependencies = [ - "cfg-if", - "cipher", - "cpufeatures", -] - -[[package]] -name = "ahash" -version = "0.7.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" -dependencies = [ - "getrandom 0.2.16", - "once_cell", - "version_check", -] - -[[package]] -name = "ahash" -version = "0.8.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" -dependencies = [ - "cfg-if", - "getrandom 0.3.4", - "once_cell", - "version_check", - "zerocopy", -] - -[[package]] -name = "aho-corasick" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" -dependencies = [ - "memchr", -] - -[[package]] -name = "android_system_properties" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" -dependencies = [ - "libc", -] - -[[package]] -name = "anyhow" -version = "1.0.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" - -[[package]] -name = "arrayref" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" - -[[package]] -name = "arrayvec" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" - -[[package]] -name = "arrayvec" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" - -[[package]] -name = "async-attributes" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3203e79f4dd9bdda415ed03cf14dae5a2bf775c683a00f94e9cd1faf0f596e5" -dependencies = [ - "quote", - "syn 1.0.109", -] - -[[package]] -name = "async-channel" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" -dependencies = [ - "concurrent-queue", - "event-listener 2.5.3", - "futures-core", -] - -[[package]] -name = "async-channel" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2" -dependencies = [ - "concurrent-queue", - "event-listener-strategy", - "futures-core", - "pin-project-lite", -] - -[[package]] -name = "async-executor" -version = "1.13.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "497c00e0fd83a72a79a39fcbd8e3e2f055d6f6c7e025f3b3d91f4f8e76527fb8" -dependencies = [ - "async-task", - "concurrent-queue", - "fastrand", - "futures-lite", - "pin-project-lite", - "slab", -] - -[[package]] -name = "async-global-executor" -version = "2.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05b1b633a2115cd122d73b955eadd9916c18c8f510ec9cd1686404c60ad1c29c" -dependencies = [ - "async-channel 2.5.0", - "async-executor", - "async-io", - "async-lock", - "blocking", - "futures-lite", - "once_cell", -] - -[[package]] -name = "async-io" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "456b8a8feb6f42d237746d4b3e9a178494627745c3c56c6ea55d92ba50d026fc" -dependencies = [ - "autocfg", - "cfg-if", - "concurrent-queue", - "futures-io", - "futures-lite", - "parking", - "polling", - "rustix", - "slab", - "windows-sys 0.61.2", -] - -[[package]] -name = "async-lock" -version = "3.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fd03604047cee9b6ce9de9f70c6cd540a0520c813cbd49bae61f33ab80ed1dc" -dependencies = [ - "event-listener 5.4.1", - "event-listener-strategy", - "pin-project-lite", -] - -[[package]] -name = "async-std" -version = "1.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c8e079a4ab67ae52b7403632e4618815d6db36d2a010cfe41b02c1b1578f93b" -dependencies = [ - "async-attributes", - "async-channel 1.9.0", - "async-global-executor", - "async-io", - "async-lock", - "crossbeam-utils", - "futures-channel", - "futures-core", - "futures-io", - "futures-lite", - "gloo-timers", - "kv-log-macro", - "log", - "memchr", - "once_cell", - "pin-project-lite", - "pin-utils", - "slab", - "wasm-bindgen-futures", -] - -[[package]] -name = "async-task" -version = "4.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" - -[[package]] -name = "async-trait" -version = "0.1.89" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.106", -] - -[[package]] -name = "atomic-waker" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" - -[[package]] -name = "autocfg" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" - -[[package]] -name = "backtrace" -version = "0.3.76" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb531853791a215d7c62a30daf0dde835f381ab5de4589cfe7c649d2cbe92bd6" -dependencies = [ - "addr2line", - "cfg-if", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", - "windows-link", -] - -[[package]] -name = "base-x" -version = "0.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cbbc9d0964165b47557570cce6c952866c2678457aca742aafc9fb771d30270" - -[[package]] -name = "base16ct" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349a06037c7bf932dd7e7d1f653678b2038b9ad46a74102f1fc7bd7872678cce" - -[[package]] -name = "base16ct" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" - -[[package]] -name = "base256emoji" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e9430d9a245a77c92176e649af6e275f20839a48389859d1661e9a128d077c" -dependencies = [ - "const-str", - "match-lookup", -] - -[[package]] -name = "base64" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3441f0f7b02788e948e47f457ca01f1d7e6d92c693bc132c22b087d3141c03ff" - -[[package]] -name = "base64" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" - -[[package]] -name = "base64" -version = "0.21.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" - -[[package]] -name = "base64" -version = "0.22.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" - -[[package]] -name = "base64ct" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55248b47b0caf0546f7988906588779981c43bb1bc9d0c44087278f80cdb44ba" - -[[package]] -name = "bech32" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf9ff0bbfd639f15c74af777d81383cf53efb7c93613f6cab67c6c11e05bbf8b" - -[[package]] -name = "bitfield" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d7e60934ceec538daadb9d8432424ed043a904d8e0243f3c6446bce549a46ac" - -[[package]] -name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "bitflags" -version = "2.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2261d10cca569e4643e526d8dc2e62e433cc8aba21ab764233731f8d369bf394" - -[[package]] -name = "bitvec" -version = "0.20.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7774144344a4faa177370406a7ff5f1da24303817368584c6206c8303eb07848" -dependencies = [ - "funty", - "radium", - "tap", - "wyz", -] - -[[package]] -name = "blake2" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46502ad458c9a52b69d4d4d32775c788b7a1b85e8bc9d482d92250fc0e3f8efe" -dependencies = [ - "digest 0.10.7", -] - -[[package]] -name = "blake2b_simd" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afa748e348ad3be8263be728124b24a24f268266f6f5d58af9d75f6a40b5c587" -dependencies = [ - "arrayref", - "arrayvec 0.5.2", - "constant_time_eq 0.1.5", -] - -[[package]] -name = "blake2b_simd" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06e903a20b159e944f91ec8499fe1e55651480c541ea0a584f5d967c49ad9d99" -dependencies = [ - "arrayref", - "arrayvec 0.7.6", - "constant_time_eq 0.3.1", -] - -[[package]] -name = "blake2s_simd" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e90f7deecfac93095eb874a40febd69427776e24e1bd7f87f33ac62d6f0174df" -dependencies = [ - "arrayref", - "arrayvec 0.7.6", - "constant_time_eq 0.3.1", -] - -[[package]] -name = "blake3" -version = "1.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3888aaa89e4b2a40fca9848e400f6a658a5a3978de7be858e209cafa8be9a4a0" -dependencies = [ - "arrayref", - "arrayvec 0.7.6", - "cc", - "cfg-if", - "constant_time_eq 0.3.1", -] - -[[package]] -name = "block-buffer" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" -dependencies = [ - "generic-array", -] - -[[package]] -name = "block-buffer" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" -dependencies = [ - "generic-array", -] - -[[package]] -name = "block-padding" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8894febbff9f758034a5b8e12d87918f56dfc64a8e1fe757d65e29041538d93" -dependencies = [ - "generic-array", -] - -[[package]] -name = "blocking" -version = "1.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e83f8d02be6967315521be875afa792a316e28d57b5a2d401897e2a7921b7f21" -dependencies = [ - "async-channel 2.5.0", - "async-task", - "futures-io", - "futures-lite", - "piper", -] - -[[package]] -name = "blowfish" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e412e2cd0f2b2d93e02543ceae7917b3c70331573df19ee046bcbc35e45e87d7" -dependencies = [ - "byteorder", - "cipher", -] - -[[package]] -name = "boon" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35b8a1c0fea99bf5301d3851e261168de966419c1d02a705a7ca11da64e54827" -dependencies = [ - "ahash 0.8.12", - "base64 0.21.7", - "fluent-uri", - "idna 0.5.0", - "once_cell", - "percent-encoding", - "regex", - "regex-syntax", - "serde", - "serde_json", - "url", -] - -[[package]] -name = "bs58" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "771fe0050b883fcc3ea2359b1a96bcfbc090b7116eae7c3c512c7a083fdf23d3" -dependencies = [ - "sha2 0.9.9", -] - -[[package]] -name = "bs58" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" -dependencies = [ - "tinyvec", -] - -[[package]] -name = "bstr" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "234113d19d0d7d613b40e86fb654acf958910802bcceab913a4f9e7cda03b1a4" -dependencies = [ - "memchr", - "serde", -] - -[[package]] -name = "btree-range-map" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1be5c9672446d3800bcbcaabaeba121fe22f1fb25700c4562b22faf76d377c33" -dependencies = [ - "btree-slab", - "cc-traits", - "range-traits", - "serde", - "slab", -] - -[[package]] -name = "btree-slab" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a2b56d3029f075c4fa892428a098425b86cef5c89ae54073137ece416aef13c" -dependencies = [ - "cc-traits", - "slab", - "smallvec", -] - -[[package]] -name = "buffer-redux" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e8acf87c5b9f5897cd3ebb9a327f420e0cae9dd4e5c1d2e36f2c84c571a58f1" -dependencies = [ - "memchr", -] - -[[package]] -name = "bumpalo" -version = "3.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" - -[[package]] -name = "byteorder" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" - -[[package]] -name = "bytes" -version = "1.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" - -[[package]] -name = "cacaos" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92680fcbb8e24eaa4640c6deca0042db02da17c8b92fde62a0c517bcb6769d7d" -dependencies = [ - "async-trait", - "hex", - "http", - "iri-string", - "libipld 0.14.0", - "serde", - "serde_with 2.3.3", - "siwe", - "thiserror", - "time", - "url", -] - -[[package]] -name = "cached" -version = "0.30.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af4dfac631a8e77b2f327f7852bb6172771f5279c4512efe79fad6067b37be3d" -dependencies = [ - "hashbrown 0.11.2", - "once_cell", -] - -[[package]] -name = "cached" -version = "0.44.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b195e4fbc4b6862bbd065b991a34750399c119797efff72492f28a5864de8700" -dependencies = [ - "hashbrown 0.13.2", - "instant", - "once_cell", - "thiserror", -] - -[[package]] -name = "camellia" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3264e2574e9ef2b53ce6f536dea83a69ac0bc600b762d1523ff83fe07230ce30" -dependencies = [ - "byteorder", - "cipher", -] - -[[package]] -name = "cast5" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b07d673db1ccf000e90f54b819db9e75a8348d6eb056e9b8ab53231b7a9911" -dependencies = [ - "cipher", -] - -[[package]] -name = "cc" -version = "1.2.41" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac9fe6cdbb24b6ade63616c0a0688e45bb56732262c158df3c0c4bea4ca47cb7" -dependencies = [ - "find-msvc-tools", - "shlex", -] - -[[package]] -name = "cc-traits" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "060303ef31ef4a522737e1b1ab68c67916f2a787bb2f4f54f383279adba962b5" -dependencies = [ - "slab", -] - -[[package]] -name = "cesu8" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" - -[[package]] -name = "cfb-mode" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "738b8d467867f80a71351933f70461f5b56f24d5c93e0cf216e59229c968d330" -dependencies = [ - "cipher", -] - -[[package]] -name = "cfg-if" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" - -[[package]] -name = "chacha20" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3613f74bd2eac03dad61bd53dbe620703d4371614fe0bc3b9f04dd36fe4e818" -dependencies = [ - "cfg-if", - "cipher", - "cpufeatures", -] - -[[package]] -name = "chacha20poly1305" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10cd79432192d1c0f4e1a0fef9527696cc039165d729fb41b3f4f4f354c2dc35" -dependencies = [ - "aead", - "chacha20", - "cipher", - "poly1305", - "zeroize", -] - -[[package]] -name = "chrono" -version = "0.4.42" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2" -dependencies = [ - "iana-time-zone", - "js-sys", - "num-traits", - "serde", - "wasm-bindgen", - "windows-link", -] - -[[package]] -name = "ciborium" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42e69ffd6f0917f5c029256a24d0161db17cea3997d185db0d35926308770f0e" -dependencies = [ - "ciborium-io", - "ciborium-ll", - "serde", -] - -[[package]] -name = "ciborium-io" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05afea1e0a06c9be33d539b876f1ce3692f4afea2cb41f740e7743225ed1c757" - -[[package]] -name = "ciborium-ll" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9" -dependencies = [ - "ciborium-io", - "half", -] - -[[package]] -name = "cid" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6ed9c8b2d17acb8110c46f1da5bf4a696d745e1474a16db0cd2b49cd0249bf2" -dependencies = [ - "core2", - "multibase 0.9.2", - "multihash 0.16.3", - "serde", - "serde_bytes", - "unsigned-varint", -] - -[[package]] -name = "cid" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd94671561e36e4e7de75f753f577edafb0e7c05d6e4547229fdf7938fbcd2c3" -dependencies = [ - "core2", - "multibase 0.9.2", - "multihash 0.18.1", - "serde", - "serde_bytes", - "unsigned-varint", -] - -[[package]] -name = "cipher" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" -dependencies = [ - "crypto-common", - "inout", - "zeroize", -] - -[[package]] -name = "clear_on_drop" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38508a63f4979f0048febc9966fadbd48e5dab31fd0ec6a3f151bbf4a74f7423" -dependencies = [ - "cc", -] - -[[package]] -name = "combination" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "337cdbf3f1a0e643b4a7d1a2ffa39d22342fb6ee25739b5cfb997c28b3586422" - -[[package]] -name = "combine" -version = "4.6.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" -dependencies = [ - "bytes", - "memchr", -] - -[[package]] -name = "concurrent-queue" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "const-oid" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4c78c047431fee22c1a7bb92e00ad095a02a983affe4d8a72e2a2c62c1b94f3" - -[[package]] -name = "const-oid" -version = "0.9.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" - -[[package]] -name = "const-str" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f421161cb492475f1661ddc9815a745a1c894592070661180fdec3d4872e9c3" - -[[package]] -name = "constant_time_eq" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" - -[[package]] -name = "constant_time_eq" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" - -[[package]] -name = "contextual" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05ca71f324d19e85a2e976be04b5ecbb193253794a75adfe2e5044c8bef03f6a" - -[[package]] -name = "convert_case" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec182b0ca2f35d8fc196cf3404988fd8b8c739a4d270ff118a398feb0cbec1ca" -dependencies = [ - "unicode-segmentation", -] - -[[package]] -name = "core-foundation" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "core-foundation-sys" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" - -[[package]] -name = "core2" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b49ba7ef1ad6107f8824dbe97de947cbaac53c44e7f9756a1fba0d37c1eec505" -dependencies = [ - "memchr", -] - -[[package]] -name = "cpufeatures" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" -dependencies = [ - "libc", -] - -[[package]] -name = "crc24" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd121741cf3eb82c08dd3023eb55bf2665e5f60ec20f89760cf836ae4562e6a0" - -[[package]] -name = "crc32fast" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "crossbeam-utils" -version = "0.8.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" - -[[package]] -name = "crunchy" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" - -[[package]] -name = "crypto-bigint" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03c6a1d5fa1de37e071642dfa44ec552ca5b299adb128fab16138e24b548fd21" -dependencies = [ - "generic-array", - "subtle", -] - -[[package]] -name = "crypto-bigint" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef2b4b23cddf68b89b8f8069890e8c270d54e2d5fe1b143820234805e4cb17ef" -dependencies = [ - "generic-array", - "rand_core 0.6.4", - "subtle", - "zeroize", -] - -[[package]] -name = "crypto-bigint" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" -dependencies = [ - "generic-array", - "rand_core 0.6.4", - "subtle", - "zeroize", -] - -[[package]] -name = "crypto-common" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" -dependencies = [ - "generic-array", - "rand_core 0.6.4", - "typenum", -] - -[[package]] -name = "ctor" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a2785755761f3ddc1492979ce1e48d2c00d09311c39e4466429188f3dd6501" -dependencies = [ - "quote", - "syn 2.0.106", -] - -[[package]] -name = "curve25519-dalek" -version = "3.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b9fdf9972b2bd6af2d913799d9ebc165ea4d2e65878e329d9c6b372c4491b61" -dependencies = [ - "byteorder", - "digest 0.9.0", - "rand_core 0.5.1", - "subtle", - "zeroize", -] - -[[package]] -name = "curve25519-dalek" -version = "4.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" -dependencies = [ - "cfg-if", - "cpufeatures", - "curve25519-dalek-derive", - "digest 0.10.7", - "fiat-crypto", - "rustc_version", - "subtle", - "zeroize", -] - -[[package]] -name = "curve25519-dalek-derive" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.106", -] - -[[package]] -name = "darling" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d706e75d87e35569db781a9b5e2416cff1236a47ed380831f959382ccd5f858" -dependencies = [ - "darling_core 0.10.2", - "darling_macro 0.10.2", -] - -[[package]] -name = "darling" -version = "0.13.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a01d95850c592940db9b8194bc39f4bc0e89dee5c4265e4b1807c34a9aba453c" -dependencies = [ - "darling_core 0.13.4", - "darling_macro 0.13.4", -] - -[[package]] -name = "darling" -version = "0.14.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b750cb3417fd1b327431a470f388520309479ab0bf5e323505daf0290cd3850" -dependencies = [ - "darling_core 0.14.4", - "darling_macro 0.14.4", -] - -[[package]] -name = "darling" -version = "0.20.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" -dependencies = [ - "darling_core 0.20.11", - "darling_macro 0.20.11", -] - -[[package]] -name = "darling_core" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0c960ae2da4de88a91b2d920c2a7233b400bc33cb28453a2987822d8392519b" -dependencies = [ - "fnv", - "ident_case", - "proc-macro2", - "quote", - "strsim 0.9.3", - "syn 1.0.109", -] - -[[package]] -name = "darling_core" -version = "0.13.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "859d65a907b6852c9361e3185c862aae7fafd2887876799fa55f5f99dc40d610" -dependencies = [ - "fnv", - "ident_case", - "proc-macro2", - "quote", - "strsim 0.10.0", - "syn 1.0.109", -] - -[[package]] -name = "darling_core" -version = "0.14.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "109c1ca6e6b7f82cc233a97004ea8ed7ca123a9af07a8230878fcfda9b158bf0" -dependencies = [ - "fnv", - "ident_case", - "proc-macro2", - "quote", - "strsim 0.10.0", - "syn 1.0.109", -] - -[[package]] -name = "darling_core" -version = "0.20.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" -dependencies = [ - "fnv", - "ident_case", - "proc-macro2", - "quote", - "strsim 0.11.1", - "syn 2.0.106", -] - -[[package]] -name = "darling_macro" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b5a2f4ac4969822c62224815d069952656cadc7084fdca9751e6d959189b72" -dependencies = [ - "darling_core 0.10.2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "darling_macro" -version = "0.13.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c972679f83bdf9c42bd905396b6c3588a843a17f0f16dfcfa3e2c5d57441835" -dependencies = [ - "darling_core 0.13.4", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "darling_macro" -version = "0.14.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4aab4dbc9f7611d8b55048a3a16d2d010c2c8334e46304b40ac1cc14bf3b48e" -dependencies = [ - "darling_core 0.14.4", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "darling_macro" -version = "0.20.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" -dependencies = [ - "darling_core 0.20.11", - "quote", - "syn 2.0.106", -] - -[[package]] -name = "data-encoding" -version = "2.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" - -[[package]] -name = "data-encoding-macro" -version = "0.1.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47ce6c96ea0102f01122a185683611bd5ac8d99e62bc59dd12e6bda344ee673d" -dependencies = [ - "data-encoding", - "data-encoding-macro-internal", -] - -[[package]] -name = "data-encoding-macro-internal" -version = "0.1.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d162beedaa69905488a8da94f5ac3edb4dd4788b732fadb7bd120b2625c1976" -dependencies = [ - "data-encoding", - "syn 2.0.106", -] - -[[package]] -name = "decoded-char" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5440d1dc8ea7cae44cda3c64568db29bfa2434aba51ae66a50c00488841a65a3" - -[[package]] -name = "der" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6919815d73839e7ad218de758883aae3a257ba6759ce7a9992501efbb53d705c" -dependencies = [ - "const-oid 0.7.1", - "crypto-bigint 0.3.2", - "pem-rfc7468 0.3.1", -] - -[[package]] -name = "der" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1a467a65c5e759bce6e65eaf91cc29f466cdc57cb65777bd646872a8a1fd4de" -dependencies = [ - "const-oid 0.9.6", - "zeroize", -] - -[[package]] -name = "der" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" -dependencies = [ - "const-oid 0.9.6", - "pem-rfc7468 0.7.0", - "zeroize", -] - -[[package]] -name = "deranged" -version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a41953f86f8a05768a6cda24def994fd2f424b04ec5c719cf89989779f199071" -dependencies = [ - "powerfmt", - "serde_core", -] - -[[package]] -name = "derivative" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "derive_builder" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2658621297f2cf68762a6f7dc0bb7e1ff2cfd6583daef8ee0fed6f7ec468ec0" -dependencies = [ - "darling 0.10.2", - "derive_builder_core 0.9.0", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "derive_builder" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d67778784b508018359cbc8696edb3db78160bab2c2a28ba7f56ef6932997f8" -dependencies = [ - "derive_builder_macro", -] - -[[package]] -name = "derive_builder_core" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2791ea3e372c8495c0bc2033991d76b512cd799d07491fbd6890124db9458bef" -dependencies = [ - "darling 0.10.2", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "derive_builder_core" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c11bdc11a0c47bc7d37d582b5285da6849c96681023680b906673c5707af7b0f" -dependencies = [ - "darling 0.14.4", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "derive_builder_macro" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebcda35c7a396850a55ffeac740804b40ffec779b98fffbb1738f4033f0ee79e" -dependencies = [ - "derive_builder_core 0.12.0", - "syn 1.0.109", -] - -[[package]] -name = "des" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffdd80ce8ce993de27e9f063a444a4d53ce8e8db4c1f00cc03af5ad5a9867a1e" -dependencies = [ - "cipher", -] - -[[package]] -name = "did-ethr" -version = "0.2.1" -dependencies = [ - "async-trait", - "chrono", - "hex", - "serde", - "serde_json", - "ssi-caips", - "ssi-crypto", - "ssi-dids", - "ssi-jwk", -] - -[[package]] -name = "did-ion" -version = "0.2.0" -dependencies = [ - "anyhow", - "async-trait", - "base64 0.12.3", - "json-patch", - "reqwest", - "serde", - "serde_jcs", - "serde_json", - "sha2 0.10.9", - "ssi-core", - "ssi-dids", - "ssi-jwk", - "ssi-jws", - "ssi-jwt", - "thiserror", -] - -[[package]] -name = "did-jwk" -version = "0.1.1" -dependencies = [ - "async-trait", - "iref 2.2.3", - "multibase 0.8.0", - "serde_jcs", - "serde_json", - "ssi-dids", - "ssi-jwk", - "static-iref", -] - -[[package]] -name = "did-method-key" -version = "0.2.1" -dependencies = [ - "async-trait", - "bs58 0.5.1", - "curve25519-dalek 4.1.3", - "k256", - "multibase 0.8.0", - "p256 0.11.1", - "serde_json", - "simple_asn1", - "ssi-crypto", - "ssi-dids", - "ssi-jwk", - "thiserror", -] - -[[package]] -name = "did-onion" -version = "0.2.1" -dependencies = [ - "async-trait", - "http", - "reqwest", - "serde_json", - "ssi-dids", - "ssi-jwk", -] - -[[package]] -name = "did-pkh" -version = "0.2.1" -dependencies = [ - "async-trait", - "bech32", - "bs58 0.4.0", - "chrono", - "iref 2.2.3", - "serde", - "serde_json", - "ssi-caips", - "ssi-crypto", - "ssi-dids", - "ssi-jwk", - "static-iref", -] - -[[package]] -name = "did-tz" -version = "0.2.1" -dependencies = [ - "anyhow", - "async-trait", - "bs58 0.4.0", - "chrono", - "json-patch", - "reqwest", - "serde", - "serde_json", - "ssi-core", - "ssi-dids", - "ssi-jwk", - "ssi-jws", - "url", -] - -[[package]] -name = "did-web" -version = "0.2.1" -dependencies = [ - "async-std", - "async-trait", - "cached 0.44.0", - "http", - "lazy_static", - "reqwest", - "serde_json", - "ssi-dids", -] - -[[package]] -name = "did-webkey" -version = "0.2.2" -dependencies = [ - "anyhow", - "async-trait", - "hex", - "http", - "pgp", - "reqwest", - "serde", - "serde_json", - "sshkeys", - "ssi-dids", - "ssi-jwk", - "ssi-ssh", -] - -[[package]] -name = "didkit" -version = "0.6.0" -dependencies = [ - "base64 0.12.3", - "bytes", - "did-ethr", - "did-ion", - "did-jwk", - "did-method-key", - "did-onion", - "did-pkh", - "did-tz", - "did-web", - "did-webkey", - "jni", - "lazy_static", - "serde", - "serde_json", - "sshkeys", - "ssi", - "thiserror", - "tokio", -] - -[[package]] -name = "didkit_plugin_node" -version = "0.1.0" -dependencies = [ - "anyhow", - "base64 0.21.7", - "bs58 0.5.1", - "byteorder", - "chacha20poly1305", - "didkit", - "ed25519-dalek 2.2.0", - "iref 3.2.2", - "json-ld-core", - "libipld 0.16.0", - "multibase 0.9.2", - "napi", - "napi-build", - "napi-derive", - "once_cell", - "rand_chacha 0.3.1", - "reqwest", - "serde", - "serde_json", - "sha2 0.10.9", - "ssi", - "ssi-contexts", - "tokio", - "unsigned-varint", - "x25519-dalek", -] - -[[package]] -name = "digest" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" -dependencies = [ - "generic-array", -] - -[[package]] -name = "digest" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" -dependencies = [ - "block-buffer 0.10.4", - "const-oid 0.9.6", - "crypto-common", - "subtle", -] - -[[package]] -name = "displaydoc" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.106", -] - -[[package]] -name = "ecdsa" -version = "0.14.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "413301934810f597c1d19ca71c8710e99a3f1ba28a0d2ebc01551a2daeea3c5c" -dependencies = [ - "der 0.6.1", - "elliptic-curve 0.12.3", - "rfc6979 0.3.1", - "signature 1.6.4", -] - -[[package]] -name = "ecdsa" -version = "0.16.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" -dependencies = [ - "der 0.7.10", - "digest 0.10.7", - "elliptic-curve 0.13.8", - "rfc6979 0.4.0", - "signature 2.2.0", - "spki 0.7.3", -] - -[[package]] -name = "ed25519" -version = "1.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91cff35c70bba8a626e3185d8cd48cc11b5437e1a5bcd15b9b5fa3c64b6dfee7" -dependencies = [ - "signature 1.6.4", -] - -[[package]] -name = "ed25519" -version = "2.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" -dependencies = [ - "pkcs8 0.10.2", - "signature 2.2.0", -] - -[[package]] -name = "ed25519-dalek" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c762bae6dcaf24c4c84667b8579785430908723d5c889f469d76a41d59cc7a9d" -dependencies = [ - "curve25519-dalek 3.2.0", - "ed25519 1.5.3", - "rand 0.7.3", - "serde", - "sha2 0.9.9", - "zeroize", -] - -[[package]] -name = "ed25519-dalek" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70e796c081cee67dc755e1a36a0a172b897fab85fc3f6bc48307991f64e4eca9" -dependencies = [ - "curve25519-dalek 4.1.3", - "ed25519 2.2.3", - "serde", - "sha2 0.10.9", - "subtle", - "zeroize", -] - -[[package]] -name = "either" -version = "1.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" - -[[package]] -name = "elliptic-curve" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7bb888ab5300a19b8e5bceef25ac745ad065f3c9f7efc6de1b91958110891d3" -dependencies = [ - "base16ct 0.1.1", - "crypto-bigint 0.4.9", - "der 0.6.1", - "digest 0.10.7", - "ff 0.12.1", - "generic-array", - "group 0.12.1", - "pkcs8 0.9.0", - "rand_core 0.6.4", - "sec1 0.3.0", - "subtle", - "zeroize", -] - -[[package]] -name = "elliptic-curve" -version = "0.13.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" -dependencies = [ - "base16ct 0.2.0", - "crypto-bigint 0.5.5", - "digest 0.10.7", - "ff 0.13.1", - "generic-array", - "group 0.13.0", - "hkdf", - "pem-rfc7468 0.7.0", - "pkcs8 0.10.2", - "rand_core 0.6.4", - "sec1 0.7.3", - "subtle", - "zeroize", -] - -[[package]] -name = "encoding_rs" -version = "0.8.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "equivalent" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" - -[[package]] -name = "errno" -version = "0.3.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" -dependencies = [ - "libc", - "windows-sys 0.61.2", -] - -[[package]] -name = "error-chain" -version = "0.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d2f06b9cac1506ece98fe3231e3cc9c4410ec3d5b1f24ae1c8946f0742cdefc" -dependencies = [ - "backtrace", - "version_check", -] - -[[package]] -name = "event-listener" -version = "2.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" - -[[package]] -name = "event-listener" -version = "5.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" -dependencies = [ - "concurrent-queue", - "parking", - "pin-project-lite", -] - -[[package]] -name = "event-listener-strategy" -version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" -dependencies = [ - "event-listener 5.4.1", - "pin-project-lite", -] - -[[package]] -name = "fastrand" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" - -[[package]] -name = "ff" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d013fc25338cc558c5c2cfbad646908fb23591e2404481826742b651c9af7160" -dependencies = [ - "rand_core 0.6.4", - "subtle", -] - -[[package]] -name = "ff" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" -dependencies = [ - "rand_core 0.6.4", - "subtle", -] - -[[package]] -name = "fiat-crypto" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" - -[[package]] -name = "find-msvc-tools" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52051878f80a721bb68ebfbc930e07b65ba72f2da88968ea5c06fd6ca3d3a127" - -[[package]] -name = "fixed-hash" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfcf0ed7fe52a17a03854ec54a9f76d6d84508d1c0e66bc1793301c73fc8493c" -dependencies = [ - "static_assertions", -] - -[[package]] -name = "flate2" -version = "1.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc5a4e564e38c699f2880d3fda590bedc2e69f3f84cd48b457bd892ce61d0aa9" -dependencies = [ - "crc32fast", - "miniz_oxide", -] - -[[package]] -name = "fluent-uri" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17c704e9dbe1ddd863da1e6ff3567795087b1eb201ce80d8fa81162e1516500d" -dependencies = [ - "bitflags 1.3.2", -] - -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "foreign-types" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" -dependencies = [ - "foreign-types-shared", -] - -[[package]] -name = "foreign-types-shared" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" - -[[package]] -name = "form_urlencoded" -version = "1.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" -dependencies = [ - "percent-encoding", -] - -[[package]] -name = "funty" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fed34cd105917e91daa4da6b3728c47b068749d6a62c59811f06ed2ac71d9da7" - -[[package]] -name = "futures" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" -dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-channel" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" -dependencies = [ - "futures-core", - "futures-sink", -] - -[[package]] -name = "futures-core" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" - -[[package]] -name = "futures-executor" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-io" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" - -[[package]] -name = "futures-lite" -version = "2.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad" -dependencies = [ - "fastrand", - "futures-core", - "futures-io", - "parking", - "pin-project-lite", -] - -[[package]] -name = "futures-macro" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.106", -] - -[[package]] -name = "futures-sink" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" - -[[package]] -name = "futures-task" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" - -[[package]] -name = "futures-util" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" -dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-macro", - "futures-sink", - "futures-task", - "memchr", - "pin-project-lite", - "pin-utils", - "slab", -] - -[[package]] -name = "generic-array" -version = "0.14.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bb6743198531e02858aeaea5398fcc883e71851fcbcb5a2f773e2fb6cb1edf2" -dependencies = [ - "typenum", - "version_check", - "zeroize", -] - -[[package]] -name = "getrandom" -version = "0.1.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" -dependencies = [ - "cfg-if", - "libc", - "wasi 0.9.0+wasi-snapshot-preview1", -] - -[[package]] -name = "getrandom" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" -dependencies = [ - "cfg-if", - "js-sys", - "libc", - "wasi 0.11.1+wasi-snapshot-preview1", - "wasm-bindgen", -] - -[[package]] -name = "getrandom" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" -dependencies = [ - "cfg-if", - "libc", - "r-efi", - "wasip2", -] - -[[package]] -name = "gimli" -version = "0.32.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7" - -[[package]] -name = "gloo-timers" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbb143cf96099802033e0d4f4963b19fd2e0b728bcf076cd9cf7f6634f092994" -dependencies = [ - "futures-channel", - "futures-core", - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "grdf" -version = "0.16.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9bbea22c05df8419a2bac76dcf144ef312c06de1db6f5d1304b1ce578890b00" -dependencies = [ - "derivative", - "hashbrown 0.13.2", - "iref 2.2.3", - "rdf-types", -] - -[[package]] -name = "group" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dfbfb3a6cfbd390d5c9564ab283a0349b9b9fcd46a706c1eb10e0db70bfbac7" -dependencies = [ - "ff 0.12.1", - "rand_core 0.6.4", - "subtle", -] - -[[package]] -name = "group" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" -dependencies = [ - "ff 0.13.1", - "rand_core 0.6.4", - "subtle", -] - -[[package]] -name = "h2" -version = "0.3.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0beca50380b1fc32983fc1cb4587bfa4bb9e78fc259aad4a0032d2080309222d" -dependencies = [ - "bytes", - "fnv", - "futures-core", - "futures-sink", - "futures-util", - "http", - "indexmap 2.11.4", - "slab", - "tokio", - "tokio-util", - "tracing", -] - -[[package]] -name = "half" -version = "2.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b" -dependencies = [ - "cfg-if", - "crunchy", - "zerocopy", -] - -[[package]] -name = "hashbrown" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" - -[[package]] -name = "hashbrown" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" -dependencies = [ - "ahash 0.7.8", -] - -[[package]] -name = "hashbrown" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" -dependencies = [ - "ahash 0.8.12", -] - -[[package]] -name = "hashbrown" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" - -[[package]] -name = "hermit-abi" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" - -[[package]] -name = "hex" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" - -[[package]] -name = "hex_fmt" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b07f60793ff0a4d9cef0f18e63b5357e06209987153a64648c972c1e5aff336f" - -[[package]] -name = "hkdf" -version = "0.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" -dependencies = [ - "hmac", -] - -[[package]] -name = "hmac" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" -dependencies = [ - "digest 0.10.7", -] - -[[package]] -name = "http" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - -[[package]] -name = "http-body" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" -dependencies = [ - "bytes", - "http", - "pin-project-lite", -] - -[[package]] -name = "httparse" -version = "1.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" - -[[package]] -name = "httpdate" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" - -[[package]] -name = "hyper" -version = "0.14.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41dfc780fdec9373c01bae43289ea34c972e40ee3c9f6b3c8801a35f35586ce7" -dependencies = [ - "bytes", - "futures-channel", - "futures-core", - "futures-util", - "h2", - "http", - "http-body", - "httparse", - "httpdate", - "itoa", - "pin-project-lite", - "socket2 0.5.10", - "tokio", - "tower-service", - "tracing", - "want", -] - -[[package]] -name = "hyper-rustls" -version = "0.24.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" -dependencies = [ - "futures-util", - "http", - "hyper", - "rustls", - "tokio", - "tokio-rustls", -] - -[[package]] -name = "hyper-tls" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" -dependencies = [ - "bytes", - "hyper", - "native-tls", - "tokio", - "tokio-native-tls", -] - -[[package]] -name = "iana-time-zone" -version = "0.1.64" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb" -dependencies = [ - "android_system_properties", - "core-foundation-sys", - "iana-time-zone-haiku", - "js-sys", - "log", - "wasm-bindgen", - "windows-core", -] - -[[package]] -name = "iana-time-zone-haiku" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" -dependencies = [ - "cc", -] - -[[package]] -name = "icu_collections" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" -dependencies = [ - "displaydoc", - "potential_utf", - "yoke", - "zerofrom", - "zerovec", -] - -[[package]] -name = "icu_locale_core" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" -dependencies = [ - "displaydoc", - "litemap", - "tinystr", - "writeable", - "zerovec", -] - -[[package]] -name = "icu_normalizer" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" -dependencies = [ - "displaydoc", - "icu_collections", - "icu_normalizer_data", - "icu_properties", - "icu_provider", - "smallvec", - "zerovec", -] - -[[package]] -name = "icu_normalizer_data" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" - -[[package]] -name = "icu_properties" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" -dependencies = [ - "displaydoc", - "icu_collections", - "icu_locale_core", - "icu_properties_data", - "icu_provider", - "potential_utf", - "zerotrie", - "zerovec", -] - -[[package]] -name = "icu_properties_data" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" - -[[package]] -name = "icu_provider" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" -dependencies = [ - "displaydoc", - "icu_locale_core", - "stable_deref_trait", - "tinystr", - "writeable", - "yoke", - "zerofrom", - "zerotrie", - "zerovec", -] - -[[package]] -name = "idea" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "075557004419d7f2031b8bb7f44bb43e55a83ca7b63076a8fb8fe75753836477" -dependencies = [ - "cipher", -] - -[[package]] -name = "ident_case" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" - -[[package]] -name = "idna" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" -dependencies = [ - "unicode-bidi", - "unicode-normalization", -] - -[[package]] -name = "idna" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" -dependencies = [ - "idna_adapter", - "smallvec", - "utf8_iter", -] - -[[package]] -name = "idna_adapter" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" -dependencies = [ - "icu_normalizer", - "icu_properties", -] - -[[package]] -name = "indexmap" -version = "1.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" -dependencies = [ - "autocfg", - "hashbrown 0.12.3", - "serde", -] - -[[package]] -name = "indexmap" -version = "2.11.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b0f83760fb341a774ed326568e19f5a863af4a952def8c39f9ab92fd95b88e5" -dependencies = [ - "equivalent", - "hashbrown 0.16.0", -] - -[[package]] -name = "indoc" -version = "2.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4c7245a08504955605670dbf141fceab975f15ca21570696aebe9d2e71576bd" - -[[package]] -name = "inout" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" -dependencies = [ - "generic-array", -] - -[[package]] -name = "instant" -version = "0.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" -dependencies = [ - "cfg-if", - "js-sys", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "ipnet" -version = "2.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" - -[[package]] -name = "iref" -version = "2.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72758dab8e7c250a8643189063072ab0abf48e27eb453e0a38bbd2d7770ee8ec" -dependencies = [ - "hashbrown 0.13.2", - "pct-str 1.2.0", - "serde", - "smallvec", -] - -[[package]] -name = "iref" -version = "3.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "374372d9ca7331cec26f307b12552554849143e6b2077be3553576aa9aa8258c" -dependencies = [ - "iref-core", -] - -[[package]] -name = "iref-core" -version = "3.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b10559a0d518effd4f2cee107f40f83acf8583dcd3e6760b9b60293b0d2c2a70" -dependencies = [ - "pct-str 2.0.0", - "smallvec", - "static-regular-grammar", - "thiserror", -] - -[[package]] -name = "iri-string" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d0586ad318a04c73acdbad33f67969519b5452c80770c4c72059a686da48a7e" -dependencies = [ - "memchr", - "serde", -] - -[[package]] -name = "itoa" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" - -[[package]] -name = "jni" -version = "0.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36bcc950632e48b86da402c5c077590583da5ac0d480103611d5374e7c967a3c" -dependencies = [ - "cesu8", - "combine", - "error-chain", - "jni-sys", - "log", - "walkdir", -] - -[[package]] -name = "jni-sys" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" - -[[package]] -name = "js-sys" -version = "0.3.81" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec48937a97411dcb524a265206ccd4c90bb711fca92b2792c407f268825b9305" -dependencies = [ - "once_cell", - "wasm-bindgen", -] - -[[package]] -name = "json-ld" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e445d0986fc6a6e8bbe8b2c4ba0c847b7bebd201046cc37df645d632eb4202a" -dependencies = [ - "contextual", - "futures", - "json-ld-compaction", - "json-ld-context-processing", - "json-ld-core", - "json-ld-expansion", - "json-ld-syntax", - "json-syntax", - "locspan", - "rdf-types", - "thiserror", -] - -[[package]] -name = "json-ld-compaction" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd69243e6b268c66c9cdd6f1aab73bd0d4f6df617d53e8d77238b676a9ab01c3" -dependencies = [ - "contextual", - "derivative", - "futures", - "iref 2.2.3", - "json-ld-context-processing", - "json-ld-core", - "json-ld-expansion", - "json-ld-syntax", - "json-syntax", - "langtag", - "locspan", - "mown", - "rdf-types", - "thiserror", -] - -[[package]] -name = "json-ld-context-processing" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6162a8b000517178a4a23f546fa7fef31a0cac466393ef922a351d8e6041fb8f" -dependencies = [ - "contextual", - "futures", - "iref 2.2.3", - "json-ld-core", - "json-ld-syntax", - "locspan", - "mown", - "rdf-types", - "thiserror", -] - -[[package]] -name = "json-ld-core" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f103ff1c30bf42b3b7d09c69cbe12869e5ad42497638c5199d83de6fd7d7b13e" -dependencies = [ - "contextual", - "derivative", - "futures", - "hashbrown 0.13.2", - "iref 2.2.3", - "json-ld-syntax", - "json-syntax", - "langtag", - "locspan", - "locspan-derive", - "log", - "mime", - "mown", - "once_cell", - "permutohedron", - "pretty_dtoa", - "rdf-types", - "ryu-js", - "smallvec", - "static-iref", - "thiserror", -] - -[[package]] -name = "json-ld-expansion" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ec3b334e7ae66e64a139ac34f38d3559dd82e7a0deed8891d1897a933a006cc" -dependencies = [ - "contextual", - "derivative", - "futures", - "iref 2.2.3", - "json-ld-context-processing", - "json-ld-core", - "json-ld-syntax", - "json-syntax", - "langtag", - "locspan", - "mown", - "rdf-types", - "thiserror", -] - -[[package]] -name = "json-ld-syntax" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fe7e17ed956850ff813815c960dcf3ab80604d72a2590ddebf8112509fb3722" -dependencies = [ - "contextual", - "decoded-char", - "derivative", - "hashbrown 0.13.2", - "indexmap 1.9.3", - "iref 2.2.3", - "json-syntax", - "langtag", - "locspan", - "locspan-derive", - "rdf-types", - "smallvec", - "thiserror", -] - -[[package]] -name = "json-number" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66994b2bac615128d07a1e4527ad29e98b004dd1a1769e7b8fbc1173ccf43006" -dependencies = [ - "lexical", - "ryu-js", - "serde", - "smallvec", -] - -[[package]] -name = "json-patch" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb3fa5a61630976fc4c353c70297f2e93f1930e3ccee574d59d618ccbd5154ce" -dependencies = [ - "serde", - "serde_json", - "treediff", -] - -[[package]] -name = "json-syntax" -version = "0.9.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f2f4557e0fe320cc102bdebf9fa9471b8513e13bb34b5fc23d7e270c5f9b1cc" -dependencies = [ - "contextual", - "decoded-char", - "hashbrown 0.12.3", - "indexmap 1.9.3", - "json-number", - "locspan", - "locspan-derive", - "ryu-js", - "serde", - "smallstr", - "smallvec", -] - -[[package]] -name = "k256" -version = "0.11.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72c1e0b51e7ec0a97369623508396067a486bd0cbed95a2659a4b863d28cfc8b" -dependencies = [ - "cfg-if", - "ecdsa 0.14.8", - "elliptic-curve 0.12.3", - "sha2 0.10.9", - "sha3", -] - -[[package]] -name = "keccak" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" -dependencies = [ - "cpufeatures", -] - -[[package]] -name = "keccak-hash" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae0386ec98c26dd721aaa3412bf3a817156ff3ee7cb6959503f8d1095f4ccc51" -dependencies = [ - "primitive-types", - "tiny-keccak", -] - -[[package]] -name = "kv-log-macro" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0de8b303297635ad57c9f5059fd9cee7a47f8e8daa09df0fcd07dd39fb22977f" -dependencies = [ - "log", -] - -[[package]] -name = "langtag" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed60c85f254d6ae8450cec15eedd921efbc4d1bdf6fcf6202b9a58b403f6f805" - -[[package]] -name = "lazy_static" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" -dependencies = [ - "spin 0.9.8", -] - -[[package]] -name = "lexical" -version = "7.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bc8a009b2ff1f419ccc62706f04fe0ca6e67b37460513964a3dfdb919bb37d6" -dependencies = [ - "lexical-core", -] - -[[package]] -name = "lexical-core" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d8d125a277f807e55a77304455eb7b1cb52f2b18c143b60e766c120bd64a594" -dependencies = [ - "lexical-parse-float", - "lexical-parse-integer", - "lexical-util", - "lexical-write-float", - "lexical-write-integer", -] - -[[package]] -name = "lexical-parse-float" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52a9f232fbd6f550bc0137dcb5f99ab674071ac2d690ac69704593cb4abbea56" -dependencies = [ - "lexical-parse-integer", - "lexical-util", -] - -[[package]] -name = "lexical-parse-integer" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a7a039f8fb9c19c996cd7b2fcce303c1b2874fe1aca544edc85c4a5f8489b34" -dependencies = [ - "lexical-util", -] - -[[package]] -name = "lexical-util" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2604dd126bb14f13fb5d1bd6a66155079cb9fa655b37f875b3a742c705dbed17" - -[[package]] -name = "lexical-write-float" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50c438c87c013188d415fbabbb1dceb44249ab81664efbd31b14ae55dabb6361" -dependencies = [ - "lexical-util", - "lexical-write-integer", -] - -[[package]] -name = "lexical-write-integer" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "409851a618475d2d5796377cad353802345cba92c867d9fbcde9cf4eac4e14df" -dependencies = [ - "lexical-util", -] - -[[package]] -name = "libc" -version = "0.2.177" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" - -[[package]] -name = "libipld" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac9c3aa309c260aa2f174bac968901eddc546e9d85950c28eae6a7bec402f926" -dependencies = [ - "async-trait", - "cached 0.30.0", - "fnv", - "libipld-cbor 0.14.0", - "libipld-cbor-derive 0.14.0", - "libipld-core 0.14.0", - "libipld-json 0.14.0", - "libipld-macro 0.14.0", - "log", - "multihash 0.16.3", - "parking_lot", - "thiserror", -] - -[[package]] -name = "libipld" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1ccd6b8ffb3afee7081fcaec00e1b099fd1c7ccf35ba5729d88538fcc3b4599" -dependencies = [ - "fnv", - "libipld-cbor 0.16.0", - "libipld-cbor-derive 0.16.0", - "libipld-core 0.16.0", - "libipld-json 0.16.0", - "libipld-macro 0.16.0", - "libipld-pb", - "log", - "multihash 0.18.1", - "thiserror", -] - -[[package]] -name = "libipld-cbor" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8dd1ab68c9d26f20c7d0dfea6eecbae8c00359875210001b33ca27d4a02f3d09" -dependencies = [ - "byteorder", - "libipld-core 0.14.0", - "thiserror", -] - -[[package]] -name = "libipld-cbor" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77d98c9d1747aa5eef1cf099cd648c3fd2d235249f5fed07522aaebc348e423b" -dependencies = [ - "byteorder", - "libipld-core 0.16.0", - "thiserror", -] - -[[package]] -name = "libipld-cbor-derive" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69ec2f49393a1347a2d95ebcb248ff75d0d47235919b678036c010a8cd927375" -dependencies = [ - "proc-macro-crate", - "proc-macro2", - "quote", - "syn 1.0.109", - "synstructure 0.12.6", -] - -[[package]] -name = "libipld-cbor-derive" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d5ba3a729b72973e456a1812b0afe2e176a376c1836cc1528e9fc98ae8cb838" -dependencies = [ - "proc-macro-crate", - "proc-macro2", - "quote", - "syn 1.0.109", - "synstructure 0.12.6", -] - -[[package]] -name = "libipld-core" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d44790246ec6b7314cba745992c23d479d018073e66d49ae40ae1b64e5dd8eb5" -dependencies = [ - "anyhow", - "cid 0.8.6", - "core2", - "multibase 0.9.2", - "multihash 0.16.3", - "serde", - "thiserror", -] - -[[package]] -name = "libipld-core" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5acd707e8d8b092e967b2af978ed84709eaded82b75effe6cb6f6cc797ef8158" -dependencies = [ - "anyhow", - "cid 0.10.1", - "core2", - "multibase 0.9.2", - "multihash 0.18.1", - "serde", - "thiserror", -] - -[[package]] -name = "libipld-json" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18aa481a87f084d98473dd9ece253a9569c762b75f6bbba8217d54e48c9d63b3" -dependencies = [ - "libipld-core 0.14.0", - "multihash 0.16.3", - "serde", - "serde_json", -] - -[[package]] -name = "libipld-json" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25856def940047b07b25c33d4e66d248597049ab0202085215dc4dca0487731c" -dependencies = [ - "libipld-core 0.16.0", - "multihash 0.18.1", - "serde", - "serde_json", -] - -[[package]] -name = "libipld-macro" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "852c011562ae5059b67c3a917f9f5945af5a68df8e39ede4444fff33274d25e2" -dependencies = [ - "libipld-core 0.14.0", -] - -[[package]] -name = "libipld-macro" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71171c54214f866ae6722f3027f81dff0931e600e5a61e6b1b6a49ca0b5ed4ae" -dependencies = [ - "libipld-core 0.16.0", -] - -[[package]] -name = "libipld-pb" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3f2d0f866c4cd5dc9aa8068c429ba478d2882a3a4b70ab56f7e9a0eddf5d16f" -dependencies = [ - "bytes", - "libipld-core 0.16.0", - "quick-protobuf", - "thiserror", -] - -[[package]] -name = "libloading" -version = "0.8.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55" -dependencies = [ - "cfg-if", - "windows-link", -] - -[[package]] -name = "libm" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" - -[[package]] -name = "linux-raw-sys" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" - -[[package]] -name = "litemap" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" - -[[package]] -name = "lock_api" -version = "0.4.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" -dependencies = [ - "scopeguard", -] - -[[package]] -name = "locspan" -version = "0.7.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6eb541fabac50f90782ec4fafa7b0b3961adc0d1862c7c7a863dc94ed5541d73" -dependencies = [ - "contextual", - "hashbrown 0.13.2", -] - -[[package]] -name = "locspan-derive" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e88991223b049a3d29ca1f60c05639581336a0f3ee4bf8a659dddecc11c4961a" -dependencies = [ - "proc-macro-error", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "log" -version = "0.4.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" -dependencies = [ - "value-bag", -] - -[[package]] -name = "match-lookup" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1265724d8cb29dbbc2b0f06fffb8bf1a8c0cf73a78eede9ba73a4a66c52a981e" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "md-5" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" -dependencies = [ - "cfg-if", - "digest 0.10.7", -] - -[[package]] -name = "memchr" -version = "2.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" - -[[package]] -name = "mime" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" - -[[package]] -name = "minimal-lexical" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" - -[[package]] -name = "miniz_oxide" -version = "0.8.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" -dependencies = [ - "adler2", - "simd-adler32", -] - -[[package]] -name = "mio" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69d83b0086dc8ecf3ce9ae2874b2d1290252e2a30720bea58a5c6639b0092873" -dependencies = [ - "libc", - "wasi 0.11.1+wasi-snapshot-preview1", - "windows-sys 0.61.2", -] - -[[package]] -name = "mown" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7627d8bbeb17edbf1c3f74b21488e4af680040da89713b4217d0010e9cbd97e" - -[[package]] -name = "multibase" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b78c60039650ff12e140ae867ef5299a58e19dded4d334c849dc7177083667e2" -dependencies = [ - "base-x", - "data-encoding", - "data-encoding-macro", -] - -[[package]] -name = "multibase" -version = "0.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8694bb4835f452b0e3bb06dbebb1d6fc5385b6ca1caf2e55fd165c042390ec77" -dependencies = [ - "base-x", - "base256emoji", - "data-encoding", - "data-encoding-macro", -] - -[[package]] -name = "multihash" -version = "0.16.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c346cf9999c631f002d8f977c4eaeaa0e6386f16007202308d0b3757522c2cc" -dependencies = [ - "blake2b_simd 1.0.3", - "blake2s_simd", - "blake3", - "core2", - "digest 0.10.7", - "multihash-derive", - "serde", - "serde-big-array", - "sha2 0.10.9", - "sha3", - "unsigned-varint", -] - -[[package]] -name = "multihash" -version = "0.18.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfd8a792c1694c6da4f68db0a9d707c72bd260994da179e6030a5dcee00bb815" -dependencies = [ - "blake2b_simd 1.0.3", - "blake2s_simd", - "blake3", - "core2", - "digest 0.10.7", - "multihash-derive", - "serde", - "serde-big-array", - "sha2 0.10.9", - "sha3", - "unsigned-varint", -] - -[[package]] -name = "multihash-derive" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d6d4752e6230d8ef7adf7bd5d8c4b1f6561c1014c5ba9a37445ccefe18aa1db" -dependencies = [ - "proc-macro-crate", - "proc-macro-error", - "proc-macro2", - "quote", - "syn 1.0.109", - "synstructure 0.12.6", -] - -[[package]] -name = "napi" -version = "2.16.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55740c4ae1d8696773c78fdafd5d0e5fe9bc9f1b071c7ba493ba5c413a9184f3" -dependencies = [ - "bitflags 2.9.4", - "ctor", - "napi-derive", - "napi-sys", - "once_cell", - "tokio", -] - -[[package]] -name = "napi-build" -version = "2.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcae8ad5609d14afb3a3b91dee88c757016261b151e9dcecabf1b2a31a6cab14" - -[[package]] -name = "napi-derive" -version = "2.16.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cbe2585d8ac223f7d34f13701434b9d5f4eb9c332cccce8dee57ea18ab8ab0c" -dependencies = [ - "cfg-if", - "convert_case", - "napi-derive-backend", - "proc-macro2", - "quote", - "syn 2.0.106", -] - -[[package]] -name = "napi-derive-backend" -version = "1.0.75" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1639aaa9eeb76e91c6ae66da8ce3e89e921cd3885e99ec85f4abacae72fc91bf" -dependencies = [ - "convert_case", - "once_cell", - "proc-macro2", - "quote", - "regex", - "semver", - "syn 2.0.106", -] - -[[package]] -name = "napi-sys" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "427802e8ec3a734331fec1035594a210ce1ff4dc5bc1950530920ab717964ea3" -dependencies = [ - "libloading", -] - -[[package]] -name = "native-tls" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" -dependencies = [ - "libc", - "log", - "openssl", - "openssl-probe", - "openssl-sys", - "schannel", - "security-framework", - "security-framework-sys", - "tempfile", -] - -[[package]] -name = "nom" -version = "7.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" -dependencies = [ - "memchr", - "minimal-lexical", -] - -[[package]] -name = "num-bigint" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" -dependencies = [ - "num-integer", - "num-traits", -] - -[[package]] -name = "num-bigint-dig" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc84195820f291c7697304f3cbdadd1cb7199c0efc917ff5eafd71225c136151" -dependencies = [ - "byteorder", - "lazy_static", - "libm", - "num-integer", - "num-iter", - "num-traits", - "rand 0.8.5", - "serde", - "smallvec", - "zeroize", -] - -[[package]] -name = "num-conv" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" - -[[package]] -name = "num-derive" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "876a53fff98e03a936a674b29568b0e605f06b29372c2489ff4de23f1949743d" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "num-derive" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.106", -] - -[[package]] -name = "num-integer" -version = "0.1.46" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" -dependencies = [ - "num-traits", -] - -[[package]] -name = "num-iter" -version = "0.1.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-traits" -version = "0.2.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" -dependencies = [ - "autocfg", - "libm", -] - -[[package]] -name = "object" -version = "0.37.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe" -dependencies = [ - "memchr", -] - -[[package]] -name = "once_cell" -version = "1.21.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" - -[[package]] -name = "opaque-debug" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" - -[[package]] -name = "openssl" -version = "0.10.74" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24ad14dd45412269e1a30f52ad8f0664f0f4f4a89ee8fe28c3b3527021ebb654" -dependencies = [ - "bitflags 2.9.4", - "cfg-if", - "foreign-types", - "libc", - "once_cell", - "openssl-macros", - "openssl-sys", -] - -[[package]] -name = "openssl-macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.106", -] - -[[package]] -name = "openssl-probe" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" - -[[package]] -name = "openssl-src" -version = "300.5.3+3.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc6bad8cd0233b63971e232cc9c5e83039375b8586d2312f31fda85db8f888c2" -dependencies = [ - "cc", -] - -[[package]] -name = "openssl-sys" -version = "0.9.110" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a9f0075ba3c21b09f8e8b2026584b1d18d49388648f2fbbf3c97ea8deced8e2" -dependencies = [ - "cc", - "libc", - "openssl-src", - "pkg-config", - "vcpkg", -] - -[[package]] -name = "p256" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51f44edd08f51e2ade572f141051021c5af22677e42b7dd28a88155151c33594" -dependencies = [ - "ecdsa 0.14.8", - "elliptic-curve 0.12.3", - "sha2 0.10.9", -] - -[[package]] -name = "p256" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b" -dependencies = [ - "ecdsa 0.16.9", - "elliptic-curve 0.13.8", - "primeorder", - "sha2 0.10.9", -] - -[[package]] -name = "p384" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe42f1670a52a47d448f14b6a5c61dd78fce51856e68edaa38f7ae3a46b8d6b6" -dependencies = [ - "ecdsa 0.16.9", - "elliptic-curve 0.13.8", - "primeorder", - "sha2 0.10.9", -] - -[[package]] -name = "parking" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" - -[[package]] -name = "parking_lot" -version = "0.12.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" -dependencies = [ - "lock_api", - "parking_lot_core", -] - -[[package]] -name = "parking_lot_core" -version = "0.9.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" -dependencies = [ - "cfg-if", - "libc", - "redox_syscall", - "smallvec", - "windows-link", -] - -[[package]] -name = "pct-str" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77d207ec8d182c2fef45f028b9b9507770df19e89b3e14827ccd95d4a23f6003" -dependencies = [ - "utf8-decode", -] - -[[package]] -name = "pct-str" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf1bdcc492c285a50bed60860dfa00b50baf1f60c73c7d6b435b01a2a11fd6ff" -dependencies = [ - "thiserror", - "utf8-decode", -] - -[[package]] -name = "pem-rfc7468" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01de5d978f34aa4b2296576379fcc416034702fd94117c56ffd8a1a767cefb30" -dependencies = [ - "base64ct", -] - -[[package]] -name = "pem-rfc7468" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" -dependencies = [ - "base64ct", -] - -[[package]] -name = "percent-encoding" -version = "2.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" - -[[package]] -name = "permutohedron" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b687ff7b5da449d39e418ad391e5e08da53ec334903ddbb921db208908fc372c" - -[[package]] -name = "pgp" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27e1f8e085bfa9b85763fe3ddaacbe90a09cd847b3833129153a6cb063bbe132" -dependencies = [ - "aes", - "base64 0.21.7", - "bitfield", - "block-padding", - "blowfish", - "bstr", - "buffer-redux", - "byteorder", - "camellia", - "cast5", - "cfb-mode", - "chrono", - "cipher", - "crc24", - "curve25519-dalek 4.1.3", - "derive_builder 0.12.0", - "des", - "digest 0.10.7", - "ed25519-dalek 2.2.0", - "elliptic-curve 0.13.8", - "flate2", - "generic-array", - "hex", - "idea", - "log", - "md-5", - "nom", - "num-bigint-dig", - "num-derive 0.4.2", - "num-traits", - "p256 0.13.2", - "p384", - "rand 0.8.5", - "ripemd", - "rsa 0.9.8", - "sha1", - "sha2 0.10.9", - "sha3", - "signature 2.2.0", - "smallvec", - "thiserror", - "twofish", - "x25519-dalek", - "zeroize", -] - -[[package]] -name = "pin-project-lite" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" - -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - -[[package]] -name = "piper" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96c8c490f422ef9a4efd2cb5b42b76c8613d7e7dfc1caf667b8a3350a5acc066" -dependencies = [ - "atomic-waker", - "fastrand", - "futures-io", -] - -[[package]] -name = "pkcs1" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a78f66c04ccc83dd4486fd46c33896f4e17b24a7a3a6400dedc48ed0ddd72320" -dependencies = [ - "der 0.5.1", - "pkcs8 0.8.0", - "zeroize", -] - -[[package]] -name = "pkcs1" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f" -dependencies = [ - "der 0.7.10", - "pkcs8 0.10.2", - "spki 0.7.3", -] - -[[package]] -name = "pkcs8" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cabda3fb821068a9a4fab19a683eac3af12edf0f34b94a8be53c4972b8149d0" -dependencies = [ - "der 0.5.1", - "spki 0.5.4", - "zeroize", -] - -[[package]] -name = "pkcs8" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9eca2c590a5f85da82668fa685c09ce2888b9430e83299debf1f34b65fd4a4ba" -dependencies = [ - "der 0.6.1", - "spki 0.6.0", -] - -[[package]] -name = "pkcs8" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" -dependencies = [ - "der 0.7.10", - "spki 0.7.3", -] - -[[package]] -name = "pkg-config" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" - -[[package]] -name = "polling" -version = "3.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218" -dependencies = [ - "cfg-if", - "concurrent-queue", - "hermit-abi", - "pin-project-lite", - "rustix", - "windows-sys 0.61.2", -] - -[[package]] -name = "poly1305" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8159bd90725d2df49889a078b54f4f79e87f1f8a8444194cdca81d38f5393abf" -dependencies = [ - "cpufeatures", - "opaque-debug", - "universal-hash", -] - -[[package]] -name = "potential_utf" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84df19adbe5b5a0782edcab45899906947ab039ccf4573713735ee7de1e6b08a" -dependencies = [ - "zerovec", -] - -[[package]] -name = "powerfmt" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" - -[[package]] -name = "ppv-lite86" -version = "0.2.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" -dependencies = [ - "zerocopy", -] - -[[package]] -name = "pretty_dtoa" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a239bcdfda2c685fda1add3b4695c06225f50075e3cfb5b954e91545587edff2" -dependencies = [ - "ryu_floating_decimal", -] - -[[package]] -name = "primeorder" -version = "0.13.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "353e1ca18966c16d9deb1c69278edbc5f194139612772bd9537af60ac231e1e6" -dependencies = [ - "elliptic-curve 0.13.8", -] - -[[package]] -name = "primitive-types" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06345ee39fbccfb06ab45f3a1a5798d9dafa04cb8921a76d227040003a234b0e" -dependencies = [ - "fixed-hash", - "uint", -] - -[[package]] -name = "proc-macro-crate" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e17d47ce914bf4de440332250b0edd23ce48c005f59fab39d3335866b114f11a" -dependencies = [ - "thiserror", - "toml", -] - -[[package]] -name = "proc-macro-error" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" -dependencies = [ - "proc-macro-error-attr", - "proc-macro2", - "quote", - "syn 1.0.109", - "version_check", -] - -[[package]] -name = "proc-macro-error-attr" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" -dependencies = [ - "proc-macro2", - "quote", - "version_check", -] - -[[package]] -name = "proc-macro2" -version = "1.0.101" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "quick-protobuf" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d6da84cc204722a989e01ba2f6e1e276e190f22263d0cb6ce8526fcdb0d2e1f" -dependencies = [ - "byteorder", -] - -[[package]] -name = "quote" -version = "1.0.41" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce25767e7b499d1b604768e7cde645d14cc8584231ea6b295e9c9eb22c02e1d1" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "r-efi" -version = "5.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" - -[[package]] -name = "radium" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "643f8f41a8ebc4c5dc4515c82bb8abd397b527fc20fd681b7c011c2aee5d44fb" - -[[package]] -name = "rand" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" -dependencies = [ - "getrandom 0.1.16", - "libc", - "rand_chacha 0.2.2", - "rand_core 0.5.1", - "rand_hc", -] - -[[package]] -name = "rand" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -dependencies = [ - "libc", - "rand_chacha 0.3.1", - "rand_core 0.6.4", -] - -[[package]] -name = "rand_chacha" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" -dependencies = [ - "ppv-lite86", - "rand_core 0.5.1", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core 0.6.4", -] - -[[package]] -name = "rand_core" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" -dependencies = [ - "getrandom 0.1.16", -] - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom 0.2.16", -] - -[[package]] -name = "rand_hc" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" -dependencies = [ - "rand_core 0.5.1", -] - -[[package]] -name = "range-traits" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d20581732dd76fa913c7dff1a2412b714afe3573e94d41c34719de73337cc8ab" - -[[package]] -name = "rdf-types" -version = "0.12.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63d95f82a1f30f2d62e77b775ef4863f67ffafef1fc2c95ebfb55f3750be55df" -dependencies = [ - "contextual", - "iref 2.2.3", - "langtag", - "locspan", - "locspan-derive", -] - -[[package]] -name = "redox_syscall" -version = "0.5.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" -dependencies = [ - "bitflags 2.9.4", -] - -[[package]] -name = "regex" -version = "1.12.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4" -dependencies = [ - "aho-corasick", - "memchr", - "regex-automata", - "regex-syntax", -] - -[[package]] -name = "regex-automata" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax", -] - -[[package]] -name = "regex-syntax" -version = "0.8.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" - -[[package]] -name = "reqwest" -version = "0.11.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" -dependencies = [ - "base64 0.21.7", - "bytes", - "encoding_rs", - "futures-core", - "futures-util", - "h2", - "http", - "http-body", - "hyper", - "hyper-rustls", - "hyper-tls", - "ipnet", - "js-sys", - "log", - "mime", - "native-tls", - "once_cell", - "percent-encoding", - "pin-project-lite", - "rustls", - "rustls-pemfile", - "serde", - "serde_json", - "serde_urlencoded", - "sync_wrapper", - "system-configuration", - "tokio", - "tokio-native-tls", - "tokio-rustls", - "tokio-socks", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "webpki-roots", - "winreg", -] - -[[package]] -name = "rfc6979" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7743f17af12fa0b03b803ba12cd6a8d9483a587e89c69445e3909655c0b9fabb" -dependencies = [ - "crypto-bigint 0.4.9", - "hmac", - "zeroize", -] - -[[package]] -name = "rfc6979" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" -dependencies = [ - "hmac", - "subtle", -] - -[[package]] -name = "ring" -version = "0.16.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" -dependencies = [ - "cc", - "libc", - "once_cell", - "spin 0.5.2", - "untrusted 0.7.1", - "web-sys", - "winapi", -] - -[[package]] -name = "ring" -version = "0.17.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" -dependencies = [ - "cc", - "cfg-if", - "getrandom 0.2.16", - "libc", - "untrusted 0.9.0", - "windows-sys 0.52.0", -] - -[[package]] -name = "ripemd" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd124222d17ad93a644ed9d011a40f4fb64aa54275c08cc216524a9ea82fb09f" -dependencies = [ - "digest 0.10.7", -] - -[[package]] -name = "ripemd160" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2eca4ecc81b7f313189bf73ce724400a07da2a6dac19588b03c8bd76a2dcc251" -dependencies = [ - "block-buffer 0.9.0", - "digest 0.9.0", - "opaque-debug", -] - -[[package]] -name = "rsa" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cf22754c49613d2b3b119f0e5d46e34a2c628a937e3024b8762de4e7d8c710b" -dependencies = [ - "byteorder", - "digest 0.10.7", - "num-bigint-dig", - "num-integer", - "num-iter", - "num-traits", - "pkcs1 0.3.3", - "pkcs8 0.8.0", - "rand_core 0.6.4", - "smallvec", - "subtle", - "zeroize", -] - -[[package]] -name = "rsa" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78928ac1ed176a5ca1d17e578a1825f3d81ca54cf41053a592584b020cfd691b" -dependencies = [ - "const-oid 0.9.6", - "digest 0.10.7", - "num-bigint-dig", - "num-integer", - "num-traits", - "pkcs1 0.7.5", - "pkcs8 0.10.2", - "rand_core 0.6.4", - "signature 2.2.0", - "spki 0.7.3", - "subtle", - "zeroize", -] - -[[package]] -name = "rustc-demangle" -version = "0.1.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" - -[[package]] -name = "rustc_version" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" -dependencies = [ - "semver", -] - -[[package]] -name = "rustix" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" -dependencies = [ - "bitflags 2.9.4", - "errno", - "libc", - "linux-raw-sys", - "windows-sys 0.61.2", -] - -[[package]] -name = "rustls" -version = "0.21.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" -dependencies = [ - "log", - "ring 0.17.14", - "rustls-webpki", - "sct", -] - -[[package]] -name = "rustls-pemfile" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" -dependencies = [ - "base64 0.21.7", -] - -[[package]] -name = "rustls-webpki" -version = "0.101.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" -dependencies = [ - "ring 0.17.14", - "untrusted 0.9.0", -] - -[[package]] -name = "rustversion" -version = "1.0.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" - -[[package]] -name = "ryu" -version = "1.0.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" - -[[package]] -name = "ryu-js" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6518fc26bced4d53678a22d6e423e9d8716377def84545fe328236e3af070e7f" - -[[package]] -name = "ryu_floating_decimal" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "700de91d5fd6091442d00fdd9ee790af6d4f0f480562b0f5a1e8f59e90aafe73" - -[[package]] -name = "same-file" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" -dependencies = [ - "winapi-util", -] - -[[package]] -name = "schannel" -version = "0.1.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "891d81b926048e76efe18581bf793546b4c0eaf8448d72be8de2bbee5fd166e1" -dependencies = [ - "windows-sys 0.61.2", -] - -[[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - -[[package]] -name = "sct" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" -dependencies = [ - "ring 0.17.14", - "untrusted 0.9.0", -] - -[[package]] -name = "sec1" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3be24c1842290c45df0a7bf069e0c268a747ad05a192f2fd7dcfdbc1cba40928" -dependencies = [ - "base16ct 0.1.1", - "der 0.6.1", - "generic-array", - "pkcs8 0.9.0", - "subtle", - "zeroize", -] - -[[package]] -name = "sec1" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" -dependencies = [ - "base16ct 0.2.0", - "der 0.7.10", - "generic-array", - "pkcs8 0.10.2", - "subtle", - "zeroize", -] - -[[package]] -name = "security-framework" -version = "2.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" -dependencies = [ - "bitflags 2.9.4", - "core-foundation", - "core-foundation-sys", - "libc", - "security-framework-sys", -] - -[[package]] -name = "security-framework-sys" -version = "2.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc1f0cbffaac4852523ce30d8bd3c5cdc873501d96ff467ca09b6767bb8cd5c0" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "semver" -version = "1.0.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" - -[[package]] -name = "serde" -version = "1.0.228" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" -dependencies = [ - "serde_core", - "serde_derive", -] - -[[package]] -name = "serde-big-array" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd31f59f6fe2b0c055371bb2f16d7f0aa7d8881676c04a55b1596d1a17cd10a4" -dependencies = [ - "serde", -] - -[[package]] -name = "serde_bytes" -version = "0.11.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5d440709e79d88e51ac01c4b72fc6cb7314017bb7da9eeff678aa94c10e3ea8" -dependencies = [ - "serde", - "serde_core", -] - -[[package]] -name = "serde_core" -version = "1.0.228" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.228" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.106", -] - -[[package]] -name = "serde_jcs" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cacecf649bc1a7c5f0e299cc813977c6a78116abda2b93b1ee01735b71ead9a8" -dependencies = [ - "ryu-js", - "serde", - "serde_json", -] - -[[package]] -name = "serde_json" -version = "1.0.145" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" -dependencies = [ - "itoa", - "memchr", - "ryu", - "serde", - "serde_core", -] - -[[package]] -name = "serde_urlencoded" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" -dependencies = [ - "form_urlencoded", - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "serde_with" -version = "1.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "678b5a069e50bf00ecd22d0cd8ddf7c236f68581b03db652061ed5eb13a312ff" -dependencies = [ - "base64 0.13.1", - "serde", - "serde_with_macros 1.5.2", -] - -[[package]] -name = "serde_with" -version = "2.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07ff71d2c147a7b57362cead5e22f772cd52f6ab31cfcd9edcd7f6aeb2a0afbe" -dependencies = [ - "base64 0.13.1", - "chrono", - "hex", - "indexmap 1.9.3", - "serde", - "serde_json", - "serde_with_macros 2.3.3", - "time", -] - -[[package]] -name = "serde_with_macros" -version = "1.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e182d6ec6f05393cc0e5ed1bf81ad6db3a8feedf8ee515ecdd369809bcce8082" -dependencies = [ - "darling 0.13.4", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "serde_with_macros" -version = "2.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "881b6f881b17d13214e5d494c939ebab463d01264ce1811e9d4ac3a882e7695f" -dependencies = [ - "darling 0.20.11", - "proc-macro2", - "quote", - "syn 2.0.106", -] - -[[package]] -name = "sha1" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest 0.10.7", -] - -[[package]] -name = "sha2" -version = "0.9.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" -dependencies = [ - "block-buffer 0.9.0", - "cfg-if", - "cpufeatures", - "digest 0.9.0", - "opaque-debug", -] - -[[package]] -name = "sha2" -version = "0.10.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest 0.10.7", -] - -[[package]] -name = "sha3" -version = "0.10.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" -dependencies = [ - "digest 0.10.7", - "keccak", -] - -[[package]] -name = "shlex" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" - -[[package]] -name = "signature" -version = "1.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" -dependencies = [ - "digest 0.10.7", - "rand_core 0.6.4", -] - -[[package]] -name = "signature" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" -dependencies = [ - "digest 0.10.7", - "rand_core 0.6.4", -] - -[[package]] -name = "simd-adler32" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" - -[[package]] -name = "simple_asn1" -version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8eb4ea60fb301dc81dfc113df680571045d375ab7345d171c5dc7d7e13107a80" -dependencies = [ - "chrono", - "num-bigint", - "num-traits", - "thiserror", -] - -[[package]] -name = "siwe" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e6d1f422a568af1e98db37c6d0427c7218459ccac39218fd15a51a34d3933af" -dependencies = [ - "hex", - "http", - "iri-string", - "k256", - "rand 0.8.5", - "sha3", - "thiserror", - "time", -] - -[[package]] -name = "siwe-recap" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afe6254970fe99274b440ba4c5e9891550939e7a3c10274029b2e8a9ab2d5c8b" -dependencies = [ - "base64 0.12.3", - "iri-string", - "serde", - "serde_json", - "siwe", - "thiserror", -] - -[[package]] -name = "slab" -version = "0.4.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" - -[[package]] -name = "smallstr" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "862077b1e764f04c251fe82a2ef562fd78d7cadaeb072ca7c2bcaf7217b1ff3b" -dependencies = [ - "smallvec", -] - -[[package]] -name = "smallvec" -version = "1.15.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" - -[[package]] -name = "socket2" -version = "0.5.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" -dependencies = [ - "libc", - "windows-sys 0.52.0", -] - -[[package]] -name = "socket2" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881" -dependencies = [ - "libc", - "windows-sys 0.60.2", -] - -[[package]] -name = "spin" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" - -[[package]] -name = "spin" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" - -[[package]] -name = "spki" -version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d01ac02a6ccf3e07db148d2be087da624fea0221a16152ed01f0496a6b0a27" -dependencies = [ - "base64ct", - "der 0.5.1", -] - -[[package]] -name = "spki" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67cf02bbac7a337dc36e4f5a693db6c21e7863f45070f7064577eb4367a3212b" -dependencies = [ - "base64ct", - "der 0.6.1", -] - -[[package]] -name = "spki" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" -dependencies = [ - "base64ct", - "der 0.7.10", -] - -[[package]] -name = "sshkeys" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43dd24cd9c70e02c48882a32b74e784d8f2aaddba2a3a30c403d5a6e416fa117" -dependencies = [ - "base64 0.22.1", - "byteorder", - "sha2 0.10.9", -] - -[[package]] -name = "ssi" -version = "0.7.0" -dependencies = [ - "ssi-caips", - "ssi-core", - "ssi-crypto", - "ssi-dids", - "ssi-json-ld", - "ssi-jwk", - "ssi-jws", - "ssi-jwt", - "ssi-ldp", - "ssi-ssh", - "ssi-tzkey", - "ssi-ucan", - "ssi-vc", - "ssi-zcap-ld", -] - -[[package]] -name = "ssi-caips" -version = "0.1.0" -dependencies = [ - "bs58 0.4.0", - "ssi-jwk", - "thiserror", -] - -[[package]] -name = "ssi-contexts" -version = "0.1.5" - -[[package]] -name = "ssi-core" -version = "0.1.0" -dependencies = [ - "async-trait", - "serde", - "thiserror", -] - -[[package]] -name = "ssi-crypto" -version = "0.1.0" -dependencies = [ - "bs58 0.4.0", - "digest 0.9.0", - "k256", - "keccak-hash", - "ring 0.16.20", - "ripemd160", - "sha2 0.10.9", - "thiserror", - "zeroize", -] - -[[package]] -name = "ssi-dids" -version = "0.1.1" -dependencies = [ - "anyhow", - "async-trait", - "bs58 0.4.0", - "chrono", - "derive_builder 0.9.0", - "hex", - "iref 2.2.3", - "multibase 0.8.0", - "percent-encoding", - "reqwest", - "serde", - "serde_json", - "serde_urlencoded", - "ssi-caips", - "ssi-core", - "ssi-json-ld", - "ssi-jwk", - "static-iref", - "thiserror", -] - -[[package]] -name = "ssi-json-ld" -version = "0.2.2" -dependencies = [ - "async-std", - "combination", - "futures", - "grdf", - "iref 2.2.3", - "json-ld", - "json-syntax", - "lazy_static", - "locspan", - "rdf-types", - "ssi-contexts", - "ssi-crypto", - "static-iref", - "thiserror", -] - -[[package]] -name = "ssi-jwk" -version = "0.1.1" -dependencies = [ - "base64 0.12.3", - "blake2b_simd 0.5.11", - "bs58 0.4.0", - "ed25519-dalek 1.0.1", - "getrandom 0.2.16", - "k256", - "lazy_static", - "multibase 0.9.2", - "num-bigint", - "num-derive 0.3.3", - "num-traits", - "p256 0.11.1", - "rand 0.7.3", - "rand 0.8.5", - "ring 0.16.20", - "rsa 0.6.1", - "serde", - "simple_asn1", - "ssi-crypto", - "thiserror", - "unsigned-varint", - "zeroize", -] - -[[package]] -name = "ssi-jws" -version = "0.1.0" -dependencies = [ - "base64 0.12.3", - "blake2", - "clear_on_drop", - "ed25519-dalek 1.0.1", - "k256", - "p256 0.11.1", - "rand 0.8.5", - "ring 0.16.20", - "rsa 0.6.1", - "serde", - "serde_json", - "sha2 0.10.9", - "ssi-crypto", - "ssi-jwk", - "thiserror", -] - -[[package]] -name = "ssi-jwt" -version = "0.1.1" -dependencies = [ - "chrono", - "serde", - "serde_json", - "serde_with 2.3.3", - "ssi-jwk", - "ssi-jws", - "thiserror", -] - -[[package]] -name = "ssi-ldp" -version = "0.3.0" -dependencies = [ - "async-trait", - "bs58 0.4.0", - "chrono", - "grdf", - "hex", - "iref 2.2.3", - "json-syntax", - "k256", - "keccak-hash", - "lazy_static", - "locspan", - "multibase 0.8.0", - "p256 0.11.1", - "rdf-types", - "serde", - "serde_jcs", - "serde_json", - "sha2 0.10.9", - "ssi-caips", - "ssi-contexts", - "ssi-core", - "ssi-crypto", - "ssi-dids", - "ssi-json-ld", - "ssi-jwk", - "ssi-jws", - "ssi-tzkey", - "static-iref", - "thiserror", -] - -[[package]] -name = "ssi-ssh" -version = "0.1.0" -dependencies = [ - "sshkeys", - "ssi-jwk", - "thiserror", -] - -[[package]] -name = "ssi-tzkey" -version = "0.1.0" -dependencies = [ - "bs58 0.4.0", - "ed25519-dalek 1.0.1", - "ssi-jwk", - "ssi-jws", - "thiserror", -] - -[[package]] -name = "ssi-ucan" -version = "0.1.1" -dependencies = [ - "base64 0.12.3", - "chrono", - "libipld 0.14.0", - "serde", - "serde_json", - "serde_with 1.14.0", - "ssi-caips", - "ssi-core", - "ssi-dids", - "ssi-jwk", - "ssi-jws", - "ssi-jwt", - "thiserror", -] - -[[package]] -name = "ssi-vc" -version = "0.2.0" -dependencies = [ - "async-trait", - "base64 0.12.3", - "bitvec", - "boon", - "cacaos", - "chrono", - "flate2", - "iref 2.2.3", - "libipld 0.14.0", - "multihash 0.16.3", - "reqwest", - "serde", - "serde_json", - "siwe-recap", - "ssi-core", - "ssi-dids", - "ssi-json-ld", - "ssi-jwk", - "ssi-jws", - "ssi-jwt", - "ssi-ldp", - "thiserror", -] - -[[package]] -name = "ssi-zcap-ld" -version = "0.1.2" -dependencies = [ - "async-trait", - "iref 2.2.3", - "serde", - "serde_json", - "ssi-core", - "ssi-dids", - "ssi-json-ld", - "ssi-jwk", - "ssi-ldp", - "thiserror", -] - -[[package]] -name = "stable_deref_trait" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" - -[[package]] -name = "static-iref" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9786d4b8e9e5423fe85c57a826d7e0f0774746149a2ccd21e2104ff74b71ce7" -dependencies = [ - "iref 2.2.3", -] - -[[package]] -name = "static-regular-grammar" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f4a6c40247579acfbb138c3cd7de3dab113ab4ac6227f1b7de7d626ee667957" -dependencies = [ - "abnf", - "btree-range-map", - "ciborium", - "hex_fmt", - "indoc", - "proc-macro-error", - "proc-macro2", - "quote", - "serde", - "sha2 0.10.9", - "syn 2.0.106", - "thiserror", -] - -[[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" - -[[package]] -name = "strsim" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6446ced80d6c486436db5c078dde11a9f73d42b57fb273121e160b84f63d894c" - -[[package]] -name = "strsim" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" - -[[package]] -name = "strsim" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" - -[[package]] -name = "subtle" -version = "2.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" - -[[package]] -name = "syn" -version = "1.0.109" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "syn" -version = "2.0.106" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "sync_wrapper" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" - -[[package]] -name = "synstructure" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", - "unicode-xid", -] - -[[package]] -name = "synstructure" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.106", -] - -[[package]] -name = "system-configuration" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" -dependencies = [ - "bitflags 1.3.2", - "core-foundation", - "system-configuration-sys", -] - -[[package]] -name = "system-configuration-sys" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "tap" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" - -[[package]] -name = "tempfile" -version = "3.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16" -dependencies = [ - "fastrand", - "getrandom 0.3.4", - "once_cell", - "rustix", - "windows-sys 0.61.2", -] - -[[package]] -name = "thiserror" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" -dependencies = [ - "thiserror-impl", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.106", -] - -[[package]] -name = "time" -version = "0.3.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e7d9e3bb61134e77bde20dd4825b97c010155709965fedf0f49bb138e52a9d" -dependencies = [ - "deranged", - "itoa", - "num-conv", - "powerfmt", - "serde", - "time-core", - "time-macros", -] - -[[package]] -name = "time-core" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40868e7c1d2f0b8d73e4a8c7f0ff63af4f6d19be117e90bd73eb1d62cf831c6b" - -[[package]] -name = "time-macros" -version = "0.2.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30cfb0125f12d9c277f35663a0a33f8c30190f4e4574868a330595412d34ebf3" -dependencies = [ - "num-conv", - "time-core", -] - -[[package]] -name = "tiny-keccak" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" -dependencies = [ - "crunchy", -] - -[[package]] -name = "tinystr" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" -dependencies = [ - "displaydoc", - "zerovec", -] - -[[package]] -name = "tinyvec" -version = "1.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" -dependencies = [ - "tinyvec_macros", -] - -[[package]] -name = "tinyvec_macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" - -[[package]] -name = "tokio" -version = "1.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff360e02eab121e0bc37a2d3b4d4dc622e6eda3a8e5253d5435ecf5bd4c68408" -dependencies = [ - "bytes", - "libc", - "mio", - "pin-project-lite", - "socket2 0.6.1", - "windows-sys 0.61.2", -] - -[[package]] -name = "tokio-native-tls" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" -dependencies = [ - "native-tls", - "tokio", -] - -[[package]] -name = "tokio-rustls" -version = "0.24.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" -dependencies = [ - "rustls", - "tokio", -] - -[[package]] -name = "tokio-socks" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d4770b8024672c1101b3f6733eab95b18007dbe0847a8afe341fcf79e06043f" -dependencies = [ - "either", - "futures-util", - "thiserror", - "tokio", -] - -[[package]] -name = "tokio-util" -version = "0.7.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14307c986784f72ef81c89db7d9e28d6ac26d16213b109ea501696195e6e3ce5" -dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "toml" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" -dependencies = [ - "serde", -] - -[[package]] -name = "tower-service" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" - -[[package]] -name = "tracing" -version = "0.1.41" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" -dependencies = [ - "pin-project-lite", - "tracing-core", -] - -[[package]] -name = "tracing-core" -version = "0.1.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" -dependencies = [ - "once_cell", -] - -[[package]] -name = "treediff" -version = "3.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "761e8d5ad7ce14bb82b7e61ccc0ca961005a275a060b9644a2431aa11553c2ff" -dependencies = [ - "serde_json", -] - -[[package]] -name = "try-lock" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" - -[[package]] -name = "twofish" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a78e83a30223c757c3947cd144a31014ff04298d8719ae10d03c31c0448c8013" -dependencies = [ - "cipher", -] - -[[package]] -name = "typenum" -version = "1.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" - -[[package]] -name = "uint" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76f64bba2c53b04fcab63c01a7d7427eadc821e3bc48c34dc9ba29c501164b52" -dependencies = [ - "byteorder", - "crunchy", - "hex", - "static_assertions", -] - -[[package]] -name = "unicode-bidi" -version = "0.3.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" - -[[package]] -name = "unicode-ident" -version = "1.0.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f63a545481291138910575129486daeaf8ac54aee4387fe7906919f7830c7d9d" - -[[package]] -name = "unicode-normalization" -version = "0.1.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" -dependencies = [ - "tinyvec", -] - -[[package]] -name = "unicode-segmentation" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" - -[[package]] -name = "unicode-xid" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" - -[[package]] -name = "universal-hash" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" -dependencies = [ - "crypto-common", - "subtle", -] - -[[package]] -name = "unsigned-varint" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6889a77d49f1f013504cec6bf97a2c730394adedaeb1deb5ea08949a50541105" - -[[package]] -name = "untrusted" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" - -[[package]] -name = "untrusted" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" - -[[package]] -name = "url" -version = "2.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b" -dependencies = [ - "form_urlencoded", - "idna 1.1.0", - "percent-encoding", - "serde", -] - -[[package]] -name = "utf8-decode" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca61eb27fa339aa08826a29f03e87b99b4d8f0fc2255306fd266bb1b6a9de498" - -[[package]] -name = "utf8_iter" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" - -[[package]] -name = "value-bag" -version = "1.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "943ce29a8a743eb10d6082545d861b24f9d1b160b7d741e0f2cdf726bec909c5" - -[[package]] -name = "vcpkg" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" - -[[package]] -name = "version_check" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" - -[[package]] -name = "walkdir" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" -dependencies = [ - "same-file", - "winapi-util", -] - -[[package]] -name = "want" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" -dependencies = [ - "try-lock", -] - -[[package]] -name = "wasi" -version = "0.9.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" - -[[package]] -name = "wasi" -version = "0.11.1+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" - -[[package]] -name = "wasip2" -version = "1.0.1+wasi-0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" -dependencies = [ - "wit-bindgen", -] - -[[package]] -name = "wasm-bindgen" -version = "0.2.104" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1da10c01ae9f1ae40cbfac0bac3b1e724b320abfcf52229f80b547c0d250e2d" -dependencies = [ - "cfg-if", - "once_cell", - "rustversion", - "wasm-bindgen-macro", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.104" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "671c9a5a66f49d8a47345ab942e2cb93c7d1d0339065d4f8139c486121b43b19" -dependencies = [ - "bumpalo", - "log", - "proc-macro2", - "quote", - "syn 2.0.106", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-futures" -version = "0.4.54" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e038d41e478cc73bae0ff9b36c60cff1c98b8f38f8d7e8061e79ee63608ac5c" -dependencies = [ - "cfg-if", - "js-sys", - "once_cell", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.104" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ca60477e4c59f5f2986c50191cd972e3a50d8a95603bc9434501cf156a9a119" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.104" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f07d2f20d4da7b26400c9f4a0511e6e0345b040694e8a75bd41d578fa4421d7" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.106", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.104" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bad67dc8b2a1a6e5448428adec4c3e84c43e561d8c9ee8a9e5aabeb193ec41d1" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "web-sys" -version = "0.3.81" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9367c417a924a74cae129e6a2ae3b47fabb1f8995595ab474029da749a8be120" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "webpki-roots" -version = "0.25.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" - -[[package]] -name = "winapi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" -dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", -] - -[[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" - -[[package]] -name = "winapi-util" -version = "0.1.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" -dependencies = [ - "windows-sys 0.61.2", -] - -[[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" - -[[package]] -name = "windows-core" -version = "0.62.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" -dependencies = [ - "windows-implement", - "windows-interface", - "windows-link", - "windows-result", - "windows-strings", -] - -[[package]] -name = "windows-implement" -version = "0.60.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.106", -] - -[[package]] -name = "windows-interface" -version = "0.59.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.106", -] - -[[package]] -name = "windows-link" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" - -[[package]] -name = "windows-result" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" -dependencies = [ - "windows-link", -] - -[[package]] -name = "windows-strings" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" -dependencies = [ - "windows-link", -] - -[[package]] -name = "windows-sys" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" -dependencies = [ - "windows-targets 0.48.5", -] - -[[package]] -name = "windows-sys" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" -dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-sys" -version = "0.60.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" -dependencies = [ - "windows-targets 0.53.5", -] - -[[package]] -name = "windows-sys" -version = "0.61.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" -dependencies = [ - "windows-link", -] - -[[package]] -name = "windows-targets" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" -dependencies = [ - "windows_aarch64_gnullvm 0.48.5", - "windows_aarch64_msvc 0.48.5", - "windows_i686_gnu 0.48.5", - "windows_i686_msvc 0.48.5", - "windows_x86_64_gnu 0.48.5", - "windows_x86_64_gnullvm 0.48.5", - "windows_x86_64_msvc 0.48.5", -] - -[[package]] -name = "windows-targets" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" -dependencies = [ - "windows_aarch64_gnullvm 0.52.6", - "windows_aarch64_msvc 0.52.6", - "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm 0.52.6", - "windows_i686_msvc 0.52.6", - "windows_x86_64_gnu 0.52.6", - "windows_x86_64_gnullvm 0.52.6", - "windows_x86_64_msvc 0.52.6", -] - -[[package]] -name = "windows-targets" -version = "0.53.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" -dependencies = [ - "windows-link", - "windows_aarch64_gnullvm 0.53.1", - "windows_aarch64_msvc 0.53.1", - "windows_i686_gnu 0.53.1", - "windows_i686_gnullvm 0.53.1", - "windows_i686_msvc 0.53.1", - "windows_x86_64_gnu 0.53.1", - "windows_x86_64_gnullvm 0.53.1", - "windows_x86_64_msvc 0.53.1", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" - -[[package]] -name = "windows_i686_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" - -[[package]] -name = "windows_i686_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" - -[[package]] -name = "windows_i686_gnu" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" - -[[package]] -name = "windows_i686_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" - -[[package]] -name = "windows_i686_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" - -[[package]] -name = "windows_i686_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" - -[[package]] -name = "winreg" -version = "0.50.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" -dependencies = [ - "cfg-if", - "windows-sys 0.48.0", -] - -[[package]] -name = "wit-bindgen" -version = "0.46.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" - -[[package]] -name = "writeable" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" - -[[package]] -name = "wyz" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85e60b0d1b5f99db2556934e21937020776a5d31520bf169e851ac44e6420214" - -[[package]] -name = "x25519-dalek" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7e468321c81fb07fa7f4c636c3972b9100f0346e5b6a9f2bd0603a52f7ed277" -dependencies = [ - "curve25519-dalek 4.1.3", - "rand_core 0.6.4", - "serde", - "zeroize", -] - -[[package]] -name = "yoke" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" -dependencies = [ - "serde", - "stable_deref_trait", - "yoke-derive", - "zerofrom", -] - -[[package]] -name = "yoke-derive" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.106", - "synstructure 0.13.2", -] - -[[package]] -name = "zerocopy" -version = "0.8.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0894878a5fa3edfd6da3f88c4805f4c8558e2b996227a3d864f47fe11e38282c" -dependencies = [ - "zerocopy-derive", -] - -[[package]] -name = "zerocopy-derive" -version = "0.8.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.106", -] - -[[package]] -name = "zerofrom" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" -dependencies = [ - "zerofrom-derive", -] - -[[package]] -name = "zerofrom-derive" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.106", - "synstructure 0.13.2", -] - -[[package]] -name = "zeroize" -version = "1.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" -dependencies = [ - "zeroize_derive", -] - -[[package]] -name = "zeroize_derive" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.106", -] - -[[package]] -name = "zerotrie" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" -dependencies = [ - "displaydoc", - "yoke", - "zerofrom", -] - -[[package]] -name = "zerovec" -version = "0.11.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7aa2bd55086f1ab526693ecbe444205da57e25f4489879da80635a46d90e73b" -dependencies = [ - "yoke", - "zerofrom", - "zerovec-derive", -] - -[[package]] -name = "zerovec-derive" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.106", -] diff --git a/packages/plugins/didkit-plugin-node/native/Cargo.toml b/packages/plugins/didkit-plugin-node/native/Cargo.toml deleted file mode 100644 index 2c3c3a3328..0000000000 --- a/packages/plugins/didkit-plugin-node/native/Cargo.toml +++ /dev/null @@ -1,43 +0,0 @@ -[package] -name = "didkit_plugin_node" -version = "0.1.0" -authors = ["Learning Economy Foundation"] -edition = "2021" -license = "MIT" - -[lib] -crate-type = ["cdylib"] - -[dependencies] -napi = { version = "2", default-features = false, features = ["napi4", "tokio_rt"] } -napi-derive = "2" -tokio = { version = "1", features = ["rt-multi-thread"] } -once_cell = "1" -serde_json = "1" -serde = { version = "1", features = ["derive"] } -reqwest = { version = "0.11", default-features = false, features = ["rustls-tls", "json"] } -iref = "3.2" -json-ld-core = "0.12" -# Use the vendored DIDKit/SSI in the monorepo -didkit = { path = "../../../../lib/didkit/lib", default-features = false, features = ["w3c", "ed25519", "secp256k1", "tezos", "eip", "ripemd-160", "http-did", "ring"] } -ssi = { path = "../../../../lib/ssi" } -ssi-contexts = { path = "../../../../lib/ssi/contexts" } -# JWE dependencies -chacha20poly1305 = "0.10" -x25519-dalek = { version = "2", features = ["static_secrets"] } -ed25519-dalek = "2" -sha2 = "0.10" -rand_chacha = "0.3" -byteorder = "1" -base64 = "0.21" -anyhow = "1" -multibase = "0.9" -bs58 = "0.5" -libipld = { version = "0.16", features = ["serde-codec"] } -unsigned-varint = "0.7.0" - -[build-dependencies] -napi-build = "2" - -[package.metadata.napi] -name = "index" diff --git a/packages/plugins/didkit-plugin-node/native/build.rs b/packages/plugins/didkit-plugin-node/native/build.rs deleted file mode 100644 index 9fc2367889..0000000000 --- a/packages/plugins/didkit-plugin-node/native/build.rs +++ /dev/null @@ -1,5 +0,0 @@ -extern crate napi_build; - -fn main() { - napi_build::setup(); -} diff --git a/packages/plugins/didkit-plugin-node/native/src/dag.rs b/packages/plugins/didkit-plugin-node/native/src/dag.rs deleted file mode 100644 index c75480d5e4..0000000000 --- a/packages/plugins/didkit-plugin-node/native/src/dag.rs +++ /dev/null @@ -1,114 +0,0 @@ -use anyhow::{anyhow, Result}; -use libipld::{cbor::DagCborCodec, codec::Codec, Ipld}; -use libipld::serde::{from_ipld, to_ipld}; -use serde_json::Value; -use unsigned_varint::{decode as varint_decode, encode as varint_encode}; - -const ENC_BLOCK_SIZE: usize = 24; -const IDENTITY_CODE: u64 = 0x00; -const DAG_CBOR_CODE: u64 = 0x71; -const VERSION_1: u64 = 0x01; - -#[derive(Debug)] -struct SimpleCid { - codec: u64, - digest: Vec, -} - -impl SimpleCid { - fn new_v1(codec: u64, digest: Vec) -> Self { - Self { codec, digest } - } - - fn write_bytes(&self, mut w: impl std::io::Write) -> Result { - let mut version_buf = varint_encode::u64_buffer(); - let version = varint_encode::u64(VERSION_1, &mut version_buf); - - let mut codec_buf = varint_encode::u64_buffer(); - let codec = varint_encode::u64(self.codec, &mut codec_buf); - - let mut hash_code_buf = varint_encode::u64_buffer(); - let hash_code = varint_encode::u64(IDENTITY_CODE, &mut hash_code_buf); - - let mut size_buf = varint_encode::u64_buffer(); - let size = varint_encode::u64(self.digest.len() as u64, &mut size_buf); - - let mut written = 0; - written += w.write(version)?; - written += w.write(codec)?; - written += w.write(hash_code)?; - written += w.write(size)?; - written += w.write(&self.digest)?; - - Ok(written) - } - - fn to_bytes(&self) -> Result> { - let mut bytes = Vec::new(); - self.write_bytes(&mut bytes)?; - Ok(bytes) - } - - fn from_bytes(bytes: &[u8]) -> Result { - let (version, rest) = varint_decode::u64(bytes)?; - if version != VERSION_1 { - return Err(anyhow!("Only CIDv1 is supported")); - } - - let (codec, rest) = varint_decode::u64(rest)?; - - let (hash_code, rest) = varint_decode::u64(rest)?; - if hash_code != IDENTITY_CODE { - return Err(anyhow!("Only identity hash is supported")); - } - - let (hash_len, rest) = varint_decode::u64(rest)?; - let hash_len = hash_len as usize; - - if rest.len() < hash_len { - return Err(anyhow!("Invalid multihash length")); - } - - let digest = rest[..hash_len].to_vec(); - - Ok(Self::new_v1(codec, digest)) - } -} - -fn pad(bytes: &[u8], block_size: Option) -> Vec { - let block_size = block_size.unwrap_or(ENC_BLOCK_SIZE); - let pad_len = (block_size - (bytes.len() % block_size)) % block_size; - let mut padded = Vec::with_capacity(bytes.len() + pad_len); - padded.extend_from_slice(bytes); - padded.extend(std::iter::repeat(0).take(pad_len)); - padded -} - -/// Encodes a value using DAG-CBOR and creates a CID with identity multihash -fn encode_identity_cid(value: &Value) -> Result { - let ipld: Ipld = to_ipld(value).map_err(|e| anyhow!("IPLD conversion failed: {e}"))?; - let bytes = DagCborCodec.encode(&ipld)?; - Ok(SimpleCid::new_v1(DAG_CBOR_CODE, bytes)) -} - -/// Decodes a CID with identity multihash back to the original value -fn decode_identity_cid(cid: &SimpleCid) -> Result { - if cid.codec != DAG_CBOR_CODE { - return Err(anyhow!("CID codec must be dag-cbor")); - } - - let ipld: Ipld = DagCborCodec.decode(&cid.digest)?; - from_ipld(ipld).map_err(|e| anyhow!("IPLD conversion failed: {e}")) -} - -/// Prepare cleartext for encryption by encoding as CID and padding -pub fn prepare_cleartext(value: &Value, block_size: Option) -> Result> { - let cid = encode_identity_cid(value)?; - Ok(pad(&cid.to_bytes()?, block_size)) -} - -/// Decode a cleartext from CID bytes after decryption -pub fn decode_cleartext(bytes: &[u8]) -> Result { - let cid = SimpleCid::from_bytes(bytes)?; - decode_identity_cid(&cid) -} diff --git a/packages/plugins/didkit-plugin-node/native/src/jwe.rs b/packages/plugins/didkit-plugin-node/native/src/jwe.rs deleted file mode 100644 index 53e652a624..0000000000 --- a/packages/plugins/didkit-plugin-node/native/src/jwe.rs +++ /dev/null @@ -1,402 +0,0 @@ -use std::convert::TryFrom; - -use didkit::{error::Error, ssi::jwk::Params, DID_METHODS, JWK}; -use sha2::Digest; - -use anyhow::Result; -use base64::{engine::general_purpose::URL_SAFE_NO_PAD, Engine as _}; -use byteorder::{BigEndian, WriteBytesExt}; -use chacha20poly1305::{ - aead::{Aead, Payload}, - KeyInit, XChaCha20Poly1305, XNonce, -}; -use rand_chacha::{ - rand_core::{OsRng, RngCore, SeedableRng}, - ChaCha20Rng, -}; -use serde::{Deserialize, Serialize}; -use x25519_dalek::{PublicKey as X25519Public, StaticSecret}; - -#[derive(Serialize, Deserialize)] -struct ProtectedHeader { - enc: String, -} - -#[derive(Serialize, Deserialize, Debug, Clone)] -struct RecipientHeader { - alg: String, - iv: String, - tag: String, - epk: EphemeralPublicKey, - kid: String, -} - -#[derive(Serialize, Deserialize, Debug)] -struct Recipient { - encrypted_key: String, - header: RecipientHeader, -} - -#[derive(Serialize, Deserialize, Debug, Clone)] -struct EphemeralPublicKey { - kty: String, - crv: String, - x: String, -} - -#[derive(Serialize, Deserialize, Clone, Debug)] -pub struct JWE { - #[serde(rename = "protected")] - protected_header: String, - iv: String, - ciphertext: String, - tag: String, - recipients: Vec, -} - -#[derive(Serialize, Deserialize, Clone, Debug)] -struct RecipientInfo { - encrypted_key: String, - header: RecipientHeader, -} - -impl JWE { - /// Encrypts content to multiple recipients using XChaCha20Poly1305 - /// - /// # Arguments - /// * `content` - Byte slice of the content to encrypt - /// * `recipients` - List of recipient DIDs - pub async fn encrypt(content: &[u8], recipients: &[String]) -> Result { - let mut rng = ChaCha20Rng::from_rng(OsRng).unwrap(); - - let mut iv = [0u8; 24]; - rng.fill_bytes(&mut iv); - - let protected = ProtectedHeader { - enc: "XC20P".to_string(), - }; - let protected_b64 = URL_SAFE_NO_PAD.encode(serde_json::to_string(&protected)?.as_bytes()); - - // Generate content encryption key (CEK) - let mut cek = [0u8; 32]; - rng.fill_bytes(&mut cek); - - let mut recipient_infos = Vec::new(); - - for recipient_did in recipients { - let resolver = DID_METHODS.to_resolver(); - let (res_meta, doc, _) = resolver.resolve(recipient_did, &Default::default()).await; - - if res_meta.error.is_some() { - continue; // Skip this recipient on resolution error - } - - let Some(doc) = doc else { - continue; - }; - - // Find key agreement keys - let Some(key_agreements) = doc.key_agreement.as_ref() else { - continue; - }; - - for key_agreement in key_agreements { - // Try to extract X25519 public key from various verification method encodings - let recipient_x25519_opt: Option = match &key_agreement { - didkit::ssi::did::VerificationMethod::Map(vm) => { - // 1) publicKeyBase58 (X25519KeyAgreementKey2019 format) - if let Some(ref pk_b58) = vm.public_key_base58 { - // Decode base58 to get raw X25519 bytes - if let Ok(decoded) = bs58::decode(pk_b58).into_vec() { - if decoded.len() == 32 { - <[u8; 32]>::try_from(&decoded[..]) - .ok() - .map(X25519Public::from) - } else { - None - } - } else { - None - } - // 2) publicKeyJwk with crv X25519 - } else if let Some(ref jwk) = vm.public_key_jwk { - match &jwk.params { - Params::OKP(okp) if okp.curve == "X25519" => { - if okp.public_key.0.len() == 32 { - if let Ok(bytes) = <[u8; 32]>::try_from(&okp.public_key.0[..]) { - Some(X25519Public::from(bytes)) - } else { - None - } - } else { - None - } - } - _ => None, - } - // 3) publicKeyMultibase (Multikey format) - } else if let Some(ref props) = vm.property_set { - if let Some(serde_json::Value::String(multibase_str)) = props.get("publicKeyMultibase") { - // Decode multibase (typically base58btc for X25519) - if let Ok((_, bytes)) = multibase::decode(multibase_str) { - // X25519 keys in multibase format typically have a 2-byte multicodec prefix (0xec 0x01) - // The actual key is 32 bytes after the prefix - let key_bytes = if bytes.len() == 34 && bytes[0] == 0xec && bytes[1] == 0x01 { - &bytes[2..] - } else if bytes.len() == 32 { - &bytes[..] - } else { - &[][..] - }; - - if key_bytes.len() == 32 { - <[u8; 32]>::try_from(key_bytes) - .ok() - .map(X25519Public::from) - } else { - None - } - } else { - None - } - } else { - None - } - } else { - None - } - } - _ => None, - }; - - let Some(recipient_x25519) = recipient_x25519_opt else { - continue; - }; - - let vm_id = key_agreement.get_id(&doc.id); - - // Generate ephemeral key pair - let ephemeral_secret = StaticSecret::random_from_rng(&mut rng); - let ephemeral_public = X25519Public::from(&ephemeral_secret); - - // Compute shared secret - let shared_secret = ephemeral_secret.diffie_hellman(&recipient_x25519); - - // Derive KEK using concatKDF - let kek = concat_kdf(shared_secret.as_bytes(), 256, "ECDH-ES+XC20PKW", None); - - // Encrypt the CEK with KEK - let Ok(cipher) = XChaCha20Poly1305::new_from_slice(&kek) else { - continue; - }; - - let mut recipient_iv = [0u8; 24]; - rng.fill_bytes(&mut recipient_iv); - - let nonce = XNonce::from_slice(&recipient_iv); - - let Ok(mut encrypted_cek) = cipher.encrypt(nonce, cek.as_slice()) else { - continue; - }; - - // Split encrypted CEK and tag - let recipient_tag = encrypted_cek.split_off(encrypted_cek.len() - 16); - - recipient_infos.push(RecipientInfo { - encrypted_key: URL_SAFE_NO_PAD.encode(encrypted_cek), - header: RecipientHeader { - alg: "ECDH-ES+XC20PKW".to_string(), - iv: URL_SAFE_NO_PAD.encode(recipient_iv), - tag: URL_SAFE_NO_PAD.encode(recipient_tag), - epk: EphemeralPublicKey { - kty: "OKP".to_string(), - crv: "X25519".to_string(), - x: URL_SAFE_NO_PAD.encode(ephemeral_public.as_bytes()), - }, - kid: vm_id.clone(), - }, - }); - } - } - - if recipient_infos.is_empty() { - return Err(Error::UnableToGenerateDID); - } - - let cipher = XChaCha20Poly1305::new_from_slice(&cek) - .map_err(|_| Error::JWK(didkit::ssi::jwk::Error::InvalidKeyLength(cek.len())))?; - - let nonce = XNonce::from_slice(&iv); - - let payload = Payload { - msg: content, - aad: protected_b64.as_bytes(), - }; - - let mut encrypted = cipher - .encrypt(nonce, payload) - .map_err(|_| Error::UnableToGenerateDID)?; - - // Split ciphertext and tag - let tag = encrypted.split_off(encrypted.len() - 16); - - Ok(JWE { - protected_header: protected_b64, - iv: URL_SAFE_NO_PAD.encode(iv), - ciphertext: URL_SAFE_NO_PAD.encode(encrypted), - tag: URL_SAFE_NO_PAD.encode(tag), - recipients: recipient_infos, - }) - } - - pub fn decrypt(&self, jwks: &[JWK]) -> Option> { - for jwk in jwks { - // Convert JWK to X25519 - let Some(x25519_key) = convert_ed25519_to_x25519(jwk) else { - continue; - }; - - // Try each recipient - for recipient in &self.recipients { - let epk_bytes = match URL_SAFE_NO_PAD.decode(&recipient.header.epk.x) { - Ok(bytes) => bytes, - Err(_) => continue, - }; - - let ephemeral_public = - X25519Public::from(<[u8; 32]>::try_from(epk_bytes.as_slice()).ok()?); - - let shared_secret = x25519_key.diffie_hellman(&ephemeral_public); - - // Replace HKDF with concatKDF - let kek = concat_kdf( - shared_secret.as_bytes(), - 256, - "ECDH-ES+XC20PKW", - None, // apu - ); - - // Decrypt the content encryption key (CEK) - let cipher = match XChaCha20Poly1305::new_from_slice(&kek) { - Ok(c) => c, - Err(_) => continue, - }; - - let recipient_iv = match URL_SAFE_NO_PAD.decode(&recipient.header.iv) { - Ok(iv) => iv, - Err(_) => continue, - }; - - let nonce = XNonce::from_slice(&recipient_iv); - - let recipient_tag = match URL_SAFE_NO_PAD.decode(&recipient.header.tag) { - Ok(recipient_tag) => recipient_tag, - Err(_) => continue, - }; - - // Combine encrypted_key and tag - let mut encrypted_key_with_tag = - match URL_SAFE_NO_PAD.decode(&recipient.encrypted_key) { - Ok(encrypted_key) => encrypted_key, - Err(_) => continue, - }; - - encrypted_key_with_tag.extend_from_slice(&recipient_tag); - - let cek = match cipher.decrypt(&nonce, encrypted_key_with_tag.as_slice()) { - Ok(cek) => cek, - Err(_) => continue, - }; - - // Now decrypt the content - let content_cipher = match XChaCha20Poly1305::new_from_slice(&cek) { - Ok(c) => c, - Err(_) => continue, - }; - - let content_iv = match URL_SAFE_NO_PAD.decode(&self.iv) { - Ok(iv) => iv, - Err(_) => continue, - }; - - let content_nonce = XNonce::from_slice(&content_iv); - - let content_tag = match URL_SAFE_NO_PAD.decode(&self.tag) { - Ok(tag) => tag, - Err(_) => continue, - }; - - let mut ciphertext_with_tag = match URL_SAFE_NO_PAD.decode(&self.ciphertext) { - Ok(ct) => ct, - Err(_) => continue, - }; - - ciphertext_with_tag.extend_from_slice(&content_tag); - - let payload = Payload { - msg: ciphertext_with_tag.as_slice(), - aad: self.protected_header.as_bytes(), - }; - - match content_cipher.decrypt(&content_nonce, payload) { - Ok(content) => return Some(content), - Err(_) => continue, - } - } - } - - None - } -} - -/// Convert Ed25519 JWK to X25519 key for key agreement -fn convert_ed25519_to_x25519(jwk: &JWK) -> Option { - match &jwk.params { - Params::OKP(okp) => { - let ed25519_bytes = okp.private_key.as_ref()?; - - let ed25519_secret_bytes = <[u8; 32]>::try_from(ed25519_bytes.0.as_slice()).ok()?; - - let ed25519_secret_key = ed25519_dalek::SigningKey::from_bytes(&ed25519_secret_bytes); - - // Convert Ed25519 to X25519 - let x25519_bytes = ed25519_secret_key.to_scalar_bytes(); - - Some(StaticSecret::from(x25519_bytes)) - } - _ => None, - } -} - -/// Implements the concatKDF as per NIST SP 800-56A Rev. 3 -fn concat_kdf(shared_secret: &[u8], key_data_len: usize, algorithm: &str, apu: Option<&[u8]>) -> Vec { - let mut hasher = sha2::Sha256::new(); - - // Round 1 - let mut round_bytes = Vec::new(); - round_bytes.write_u32::(1).unwrap(); - round_bytes.extend_from_slice(shared_secret); - - // AlgorithmID - round_bytes.write_u32::(algorithm.len() as u32).unwrap(); - round_bytes.extend_from_slice(algorithm.as_bytes()); - - // PartyUInfo (APU) - if let Some(apu_data) = apu { - round_bytes.write_u32::(apu_data.len() as u32).unwrap(); - round_bytes.extend_from_slice(apu_data); - } else { - round_bytes.write_u32::(0).unwrap(); - } - - // PartyVInfo (APV) - empty - round_bytes.write_u32::(0).unwrap(); - - // KeyDataLen - round_bytes.write_u32::(key_data_len as u32).unwrap(); - - hasher.update(&round_bytes); - let hash = hasher.finalize(); - - hash[..32].to_vec() -} diff --git a/packages/plugins/didkit-plugin-node/native/src/lib.rs b/packages/plugins/didkit-plugin-node/native/src/lib.rs deleted file mode 100644 index caf04afe6d..0000000000 --- a/packages/plugins/didkit-plugin-node/native/src/lib.rs +++ /dev/null @@ -1,427 +0,0 @@ -#![deny(clippy::all)] -use napi::bindgen_prelude::*; -use napi_derive::napi; -use std::collections::HashMap; - -use once_cell::sync::Lazy; -use tokio::runtime::Runtime; - -// Multi-threaded runtime with 1 worker thread - handles Node.js shutdown gracefully -// (current_thread runtime causes segfaults on process exit) -static RUNTIME: Lazy = Lazy::new(|| { - tokio::runtime::Builder::new_multi_thread() - .worker_threads(1) - .enable_all() - .build() - .expect("Failed to create Tokio runtime") -}); - -// Helper to run async code synchronously -fn block_on(f: F) -> F::Output { - RUNTIME.block_on(f) -} - -use didkit::{ - get_verification_method, DIDWeb, JWTOrLDPOptions, LinkedDataProofOptions, ProofFormat, - ResolutionResult, Source, VerifiableCredential, VerifiablePresentation, DID_METHODS, JWK, -}; -use ssi::jsonld::ContextLoader; - -mod dag; -mod jwe; - -use dag::{decode_cleartext, prepare_cleartext}; -use jwe::JWE; - -// Key generation - -#[napi] -pub fn generate_ed25519_key_from_bytes(bytes: Buffer) -> Result { - let jwk = JWK::generate_ed25519_from_bytes(&bytes) - .map_err(|e| Error::from_reason(format!("didkit: {}", e)))?; - let jwk_json = - serde_json::to_string(&jwk).map_err(|e| Error::from_reason(format!("serde: {}", e)))?; - Ok(jwk_json) -} - -#[napi] -pub fn generate_secp256k1_key_from_bytes(bytes: Buffer) -> Result { - let jwk = JWK::generate_secp256k1_from_bytes(&bytes) - .map_err(|e| Error::from_reason(format!("didkit: {}", e)))?; - let jwk_json = - serde_json::to_string(&jwk).map_err(|e| Error::from_reason(format!("serde: {}", e)))?; - Ok(jwk_json) -} - -// DID operations - -#[napi] -pub fn key_to_did(method_pattern: String, jwk_json: String) -> Result { - let jwk: JWK = - serde_json::from_str(&jwk_json).map_err(|e| Error::from_reason(format!("serde: {}", e)))?; - let did = DID_METHODS - .generate(&Source::KeyAndPattern(&jwk, &method_pattern)) - .ok_or_else(|| Error::from_reason("Unable to generate DID".to_string()))?; - Ok(did) -} - -#[napi] -pub async fn key_to_verification_method(method_pattern: String, jwk_json: String) -> Result { - let jwk: JWK = - serde_json::from_str(&jwk_json).map_err(|e| Error::from_reason(format!("serde: {}", e)))?; - let did = DID_METHODS - .generate(&Source::KeyAndPattern(&jwk, &method_pattern)) - .ok_or_else(|| Error::from_reason("Unable to generate DID".to_string()))?; - let did_resolver = DID_METHODS.to_resolver(); - let vm = get_verification_method(&did, did_resolver).await - .ok_or_else(|| Error::from_reason("Unable to get verification method".to_string()))?; - Ok(vm) -} - -#[napi] -pub async fn did_to_verification_method(did: String) -> Result { - let did_resolver = DID_METHODS.to_resolver(); - let vm = get_verification_method(&did, did_resolver).await - .ok_or_else(|| Error::from_reason("Unable to get verification method".to_string()))?; - Ok(vm) -} - -#[napi] -pub async fn resolve_did(did: String, input_metadata: String) -> Result { - let input_meta: ssi::did_resolve::ResolutionInputMetadata = - serde_json::from_str(&input_metadata) - .map_err(|e| Error::from_reason(format!("serde: {}", e)))?; - let (res_meta, doc, _) = DID_METHODS.to_resolver().resolve(&did, &input_meta).await; - - if let Some(error) = res_meta.error { - return Err(Error::from_reason(error)); - } - - if let Some(d) = doc { - serde_json::to_string(&d).map_err(|e| Error::from_reason(format!("serde: {}", e))) - } else { - Err(Error::from_reason("No document resolved".to_string())) - } -} - -#[napi] -pub async fn did_resolver(did: String, input_metadata: String) -> Result { - let input_meta: ssi::did_resolve::ResolutionInputMetadata = - serde_json::from_str(&input_metadata) - .map_err(|e| Error::from_reason(format!("serde: {}", e)))?; - let (did_resolution_metadata, did_document, did_document_metadata) = - DID_METHODS.to_resolver().resolve(&did, &input_meta).await; - - let resolution_result = ResolutionResult { - did_document, - did_resolution_metadata: Some(did_resolution_metadata), - did_document_metadata, - ..Default::default() - }; - - serde_json::to_string(&resolution_result) - .map_err(|e| Error::from_reason(format!("serde: {}", e))) -} - -// Credential operations - -#[napi] -pub async fn issue_credential( - credential: String, - proof_options: String, - key: String, - context_map: String, -) -> Result { - let mut credential = VerifiableCredential::from_json_unsigned(&credential) - .map_err(|e| Error::from_reason(format!("vc: {}", e)))?; - let jwk: JWK = - serde_json::from_str(&key).map_err(|e| Error::from_reason(format!("serde: {}", e)))?; - let options: JWTOrLDPOptions = serde_json::from_str(&proof_options) - .map_err(|e| Error::from_reason(format!("serde: {}", e)))?; - let context_map: HashMap = serde_json::from_str(&context_map) - .map_err(|e| Error::from_reason(format!("serde: {}", e)))?; - let proof_format = options.proof_format.unwrap_or_default(); - let resolver = DID_METHODS.to_resolver(); - let mut context_loader = ContextLoader::default() - .with_context_map_from(context_map) - .map_err(|e| Error::from_reason(format!("context: {}", e)))?; - - let vc_string = match proof_format { - ProofFormat::JWT => { - credential.generate_jwt(Some(&jwk), &options.ldp_options, resolver).await - .map_err(|e| Error::from_reason(format!("jwt: {}", e)))? - } - _ => { - let proof = credential.generate_proof( - &jwk, - &options.ldp_options, - resolver, - &mut context_loader, - ).await - .map_err(|e| Error::from_reason(format!("ldp: {}", e)))?; - credential.add_proof(proof); - serde_json::to_string(&credential) - .map_err(|e| Error::from_reason(format!("serde: {}", e)))? - } - }; - - Ok(vc_string) -} - -#[napi] -pub async fn verify_credential( - credential: String, - proof_options: String, - context_map: String, -) -> Result { - let vc = VerifiableCredential::from_json(&credential) - .map_err(|e| Error::from_reason(format!("vc: {}", e)))?; - let options: LinkedDataProofOptions = serde_json::from_str(&proof_options) - .map_err(|e| Error::from_reason(format!("serde: {}", e)))?; - let context_map: HashMap = serde_json::from_str(&context_map) - .map_err(|e| Error::from_reason(format!("serde: {}", e)))?; - let resolver = DID_METHODS.to_resolver(); - let mut context_loader = ContextLoader::default() - .with_context_map_from(context_map) - .map_err(|e| Error::from_reason(format!("context: {}", e)))?; - - let result = vc.verify(Some(options), resolver, &mut context_loader).await; - serde_json::to_string(&result).map_err(|e| Error::from_reason(format!("serde: {}", e))) -} - -// Presentation operations - -#[napi] -pub async fn issue_presentation( - presentation: String, - proof_options: String, - key: String, - context_map: String, -) -> Result { - let mut presentation = VerifiablePresentation::from_json_unsigned(&presentation) - .map_err(|e| Error::from_reason(format!("vp: {}", e)))?; - let jwk: JWK = - serde_json::from_str(&key).map_err(|e| Error::from_reason(format!("serde: {}", e)))?; - let options: JWTOrLDPOptions = serde_json::from_str(&proof_options) - .map_err(|e| Error::from_reason(format!("serde: {}", e)))?; - let context_map: HashMap = serde_json::from_str(&context_map) - .map_err(|e| Error::from_reason(format!("serde: {}", e)))?; - let proof_format = options.proof_format.unwrap_or_default(); - let resolver = DID_METHODS.to_resolver(); - let mut context_loader = ContextLoader::default() - .with_context_map_from(context_map) - .map_err(|e| Error::from_reason(format!("context: {}", e)))?; - - let vp_string = match proof_format { - ProofFormat::JWT => { - presentation.generate_jwt(Some(&jwk), &options.ldp_options, resolver).await - .map_err(|e| Error::from_reason(format!("jwt: {}", e)))? - } - _ => { - let proof = presentation.generate_proof( - &jwk, - &options.ldp_options, - resolver, - &mut context_loader, - ).await - .map_err(|e| Error::from_reason(format!("ldp: {}", e)))?; - presentation.add_proof(proof); - serde_json::to_string(&presentation) - .map_err(|e| Error::from_reason(format!("serde: {}", e)))? - } - }; - - Ok(vp_string) -} - -#[napi] -pub async fn verify_presentation( - presentation: String, - proof_options: String, - context_map: String, -) -> Result { - let options: LinkedDataProofOptions = serde_json::from_str(&proof_options) - .map_err(|e| Error::from_reason(format!("serde: {}", e)))?; - let context_map: HashMap = serde_json::from_str(&context_map) - .map_err(|e| Error::from_reason(format!("serde: {}", e)))?; - let resolver = DID_METHODS.to_resolver(); - let mut context_loader = ContextLoader::default() - .with_context_map_from(context_map) - .map_err(|e| Error::from_reason(format!("context: {}", e)))?; - - // Check if this is a JWT (starts with "eyJ") - let result = if presentation.starts_with("eyJ") { - // Verify JWT presentation - VerifiablePresentation::verify_jwt( - &presentation, - Some(options), - resolver, - &mut context_loader, - ).await - } else { - // Verify JSON-LD presentation - let vp = VerifiablePresentation::from_json(&presentation) - .map_err(|e| Error::from_reason(format!("vp: {}", e)))?; - vp.verify(Some(options), resolver, &mut context_loader).await - }; - - serde_json::to_string(&result).map_err(|e| Error::from_reason(format!("serde: {}", e))) -} - -// Context loading - uses SSI's embedded static contexts (no HTTP) -// Returns the context JSON string for known contexts, or an error for unknown ones. -// HTTP fetching for unknown contexts should be done by DynamicLoaderPlugin in JS if needed. - -#[napi] -pub fn context_loader(url: String) -> Result { - let context = match url.as_str() { - "https://www.w3.org/2018/credentials/v1" => ssi_contexts::CREDENTIALS_V1, - "https://www.w3.org/ns/credentials/v2" => ssi_contexts::CREDENTIALS_V2, - "https://www.w3.org/2018/credentials/examples/v1" => ssi_contexts::CREDENTIALS_EXAMPLES_V1, - "https://www.w3.org/ns/credentials/examples/v2" => ssi_contexts::CREDENTIALS_EXAMPLES_V2, - "https://www.w3.org/ns/odrl.jsonld" => ssi_contexts::ODRL, - "https://schema.org/" => ssi_contexts::SCHEMA_ORG, - "https://w3id.org/security/v1" => ssi_contexts::SECURITY_V1, - "https://w3id.org/security/v2" => ssi_contexts::SECURITY_V2, - "https://www.w3.org/ns/did/v1" | "https://w3.org/ns/did/v1" | "https://w3id.org/did/v1" => { - ssi_contexts::DID_V1 - } - "https://w3id.org/did-resolution/v1" => ssi_contexts::DID_RESOLUTION_V1, - "https://w3id.org/security/suites/secp256k1recovery-2020/v2" => { - ssi_contexts::W3ID_ESRS2020_V2 - } - "https://w3c-ccg.github.io/lds-jws2020/contexts/lds-jws2020-v1.json" => { - ssi_contexts::LDS_JWS2020_V1 - } - "https://w3id.org/security/suites/jws-2020/v1" => ssi_contexts::W3ID_JWS2020_V1, - "https://w3id.org/security/suites/ed25519-2020/v1" => ssi_contexts::W3ID_ED2020_V1, - "https://w3id.org/security/multikey/v1" => ssi_contexts::W3ID_MULTIKEY_V1, - "https://w3id.org/security/data-integrity/v1" => ssi_contexts::W3ID_DATA_INTEGRITY_V1, - "https://w3id.org/security/suites/blockchain-2021/v1" => ssi_contexts::BLOCKCHAIN2021_V1, - "https://w3id.org/citizenship/v1" => ssi_contexts::CITIZENSHIP_V1, - "https://w3id.org/vaccination/v1" => ssi_contexts::VACCINATION_V1, - "https://w3id.org/traceability/v1" => ssi_contexts::TRACEABILITY_V1, - "https://w3id.org/vc-revocation-list-2020/v1" => ssi_contexts::REVOCATION_LIST_2020_V1, - "https://w3id.org/vc/status-list/2021/v1" | "https://w3id.org/vc/status-list/v1" => { - ssi_contexts::STATUS_LIST_2021_V1 - } - "https://w3id.org/security/bbs/v1" => ssi_contexts::BBS_V1, - "https://identity.foundation/presentation-exchange/submission/v1" => { - ssi_contexts::PRESENTATION_SUBMISSION_V1 - } - "https://w3id.org/vdl/v1" => ssi_contexts::VDL_V1, - "https://w3id.org/wallet/v1" => ssi_contexts::WALLET_V1, - "https://w3id.org/zcap/v1" => ssi_contexts::ZCAP_V1, - "https://demo.didkit.dev/2022/cacao-zcap/contexts/v1.json" => ssi_contexts::CACAO_ZCAP_V1, - "https://w3c-ccg.github.io/vc-ed/plugfest-1-2022/jff-vc-edu-plugfest-1-context.json" => { - ssi_contexts::JFF_VC_EDU_PLUGFEST_2022 - } - "https://identity.foundation/.well-known/contexts/did-configuration-v0.0.jsonld" => { - ssi_contexts::DID_CONFIGURATION_V0_0 - } - "https://openbadgespec.org/v2/context.json" => ssi_contexts::OBV2, - "https://purl.imsglobal.org/spec/ob/v3p0/context.json" - | "https://imsglobal.github.io/openbadges-specification/context.json" => ssi_contexts::OBV3, - "https://purl.imsglobal.org/spec/ob/v3p0/context-3.0.1.json" => ssi_contexts::OBV301, - "https://purl.imsglobal.org/spec/ob/v3p0/context-3.0.2.json" => ssi_contexts::OBV302, - "https://purl.imsglobal.org/spec/ob/v3p0/context-3.0.3.json" => ssi_contexts::OBV303, - "https://purl.imsglobal.org/spec/ob/v3p0/extensions.json" => ssi_contexts::OBV3_EXTENSIONS, - "https://purl.imsglobal.org/spec/clr/v2p0/context.json" => ssi_contexts::CLR_V2, - "https://ctx.learncard.com/boosts/1.0.0.json" => ssi_contexts::LEARNCARD_BOOSTS_V1_0_0, - "https://ctx.learncard.com/boosts/1.0.1.json" => ssi_contexts::LEARNCARD_BOOSTS_V1_0_1, - "https://ctx.learncard.com/boosts/1.0.2.json" => ssi_contexts::LEARNCARD_BOOSTS_V1_0_2, - "https://ctx.learncard.com/boosts/1.0.3.json" => ssi_contexts::LEARNCARD_BOOSTS_V1_0_3, - "https://ctx.learncard.com/boostIDs/1.0.0.json" => ssi_contexts::LEARNCARD_BOOSTIDS_V1_0_0, - "https://ctx.learncard.com/delegates/1.0.0.json" => { - ssi_contexts::LEARNCARD_DELEGATES_V1_0_0 - } - "https://ctx.learncard.com/qa/1.0.0.json" => ssi_contexts::LEARNCARD_QA_V1_0_0, - "https://playground.chapi.io/examples/alumni/alumni-v1.json" => ssi_contexts::CHAPI_ALUMNI, - "https://playground.chapi.io/examples/movieTicket/ticket-v1.json" => { - ssi_contexts::CHAPI_MOVIE_TICKET - } - _ => return Err(Error::from_reason(format!("Unknown context: {}", url))), - }; - - Ok(context.to_string()) -} - -// JWE encryption/decryption - -#[napi] -pub fn create_jwe(cleartext: String, recipients: Vec) -> Result { - let jwe = block_on(JWE::encrypt(cleartext.as_bytes(), &recipients)) - .map_err(|e| Error::from_reason(format!("jwe: {}", e)))?; - - let jwe_json = - serde_json::to_string(&jwe).map_err(|e| Error::from_reason(format!("serde: {}", e)))?; - - Ok(jwe_json) -} - -#[napi] -pub fn decrypt_jwe(jwe: String, jwks_json: Vec) -> Result { - let jwe: JWE = - serde_json::from_str(&jwe).map_err(|e| Error::from_reason(format!("serde: {}", e)))?; - - let jwks: Vec = jwks_json - .iter() - .map(|s| serde_json::from_str(s)) - .collect::, _>>() - .map_err(|e| Error::from_reason(format!("serde: {}", e)))?; - - let cleartext = jwe - .decrypt(&jwks) - .ok_or_else(|| Error::from_reason("Unable to decrypt JWE".to_string()))?; - - String::from_utf8(cleartext).map_err(|e| Error::from_reason(format!("utf8: {}", e))) -} - -#[napi] -pub fn create_dag_jwe(cleartext: String, recipients: Vec) -> Result { - // Parse the cleartext as JSON - let value: serde_json::Value = serde_json::from_str(&cleartext) - .map_err(|e| Error::from_reason(format!("serde: {}", e)))?; - - // Prepare cleartext (encode as CID and pad) - let prepared = - prepare_cleartext(&value, None).map_err(|e| Error::from_reason(format!("dag: {}", e)))?; - - let jwe = block_on(JWE::encrypt(&prepared, &recipients)) - .map_err(|e| Error::from_reason(format!("jwe: {}", e)))?; - - let jwe_json = - serde_json::to_string(&jwe).map_err(|e| Error::from_reason(format!("serde: {}", e)))?; - - Ok(jwe_json) -} - -#[napi] -pub fn decrypt_dag_jwe(jwe: String, jwks_json: Vec) -> Result { - let jwe: JWE = - serde_json::from_str(&jwe).map_err(|e| Error::from_reason(format!("serde: {}", e)))?; - - let jwks: Vec = jwks_json - .iter() - .map(|s| serde_json::from_str(s)) - .collect::, _>>() - .map_err(|e| Error::from_reason(format!("serde: {}", e)))?; - - let encrypted_data = jwe - .decrypt(&jwks) - .ok_or_else(|| Error::from_reason("Unable to decrypt DAG-JWE".to_string()))?; - - // Decode the cleartext (unpad and decode CID) - let value = - decode_cleartext(&encrypted_data).map_err(|e| Error::from_reason(format!("dag: {}", e)))?; - - serde_json::to_string(&value).map_err(|e| Error::from_reason(format!("serde: {}", e))) -} - -// Cache management - -#[napi] -pub async fn clear_cache() -> Result { - DIDWeb::clear_cache().await; - Ok("Cleared".to_string()) -} diff --git a/packages/plugins/didkit-plugin-node/package.json b/packages/plugins/didkit-plugin-node/package.json deleted file mode 100644 index 3d51b478bf..0000000000 --- a/packages/plugins/didkit-plugin-node/package.json +++ /dev/null @@ -1,49 +0,0 @@ -{ - "name": "@learncard/didkit-plugin-node", - "version": "0.2.0", - "description": "Node-native DIDKit plugin for LearnCard (N-API addon wrapper)", - "main": "./dist/index.js", - "module": "./dist/index.js", - "types": "./dist/index.d.ts", - "files": [ - "dist", - "native" - ], - "napi": { - "name": "index", - "triples": { - "defaults": true, - "additional": [ - "x86_64-unknown-linux-gnu", - "aarch64-unknown-linux-gnu", - "x86_64-unknown-linux-musl", - "aarch64-unknown-linux-musl" - ] - } - }, - "scripts": { - "build": "node scripts/build.js", - "build:debug": "napi build --platform --cargo-cwd native && tsc -p tsconfig.json", - "test": "jest --passWithNoTests", - "artifacts": "napi artifacts", - "prepublishOnly": "napi prepublish -t npm" - }, - "author": "Learning Economy Foundation (www.learningeconomy.io)", - "license": "MIT", - "repository": { - "type": "git", - "url": "git+https://github.com/WeLibraryOS/LearnCard.git" - }, - "bugs": { - "url": "https://github.com/WeLibraryOS/LearnCard/issues" - }, - "dependencies": { - "@learncard/core": "workspace:*", - "@learncard/types": "workspace:*", - "@learncard/didkit-plugin": "workspace:*" - }, - "devDependencies": { - "@napi-rs/cli": "^2.18.0", - "typescript": "^5.3.3" - } -} diff --git a/packages/plugins/didkit-plugin-node/project.json b/packages/plugins/didkit-plugin-node/project.json deleted file mode 100644 index 310be427f3..0000000000 --- a/packages/plugins/didkit-plugin-node/project.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "$schema": "../../../node_modules/nx/schemas/project-schema.json", - "name": "didkit-plugin-node", - "sourceRoot": "packages/plugins/didkit-plugin-node/src", - "projectType": "library", - "root": "packages/plugins/didkit-plugin-node", - "tags": [], - "implicitDependencies": ["types","core","didkit-plugin"], - "namedInputs": { - "source": ["{projectRoot}/src/**/*"], - "dist": ["{projectRoot}/dist/**/*"] - }, - "targets": { - "build": { - "executor": "nx:run-script", - "inputs": ["source"], - "options": { - "script": "build" - } - } - } -} diff --git a/packages/plugins/didkit-plugin-node/scripts/build.js b/packages/plugins/didkit-plugin-node/scripts/build.js deleted file mode 100644 index e346ae2fd6..0000000000 --- a/packages/plugins/didkit-plugin-node/scripts/build.js +++ /dev/null @@ -1,31 +0,0 @@ -#!/usr/bin/env node -const { execSync } = require('node:child_process'); -const fs = require('node:fs'); -const path = require('node:path'); - -const packageDir = path.resolve(__dirname, '..'); -const hasNodeBinary = fs.readdirSync(packageDir).some(f => f.endsWith('.node')); - -// Parse --target argument if provided -const args = process.argv.slice(2); -const targetIndex = args.indexOf('--target'); -const target = targetIndex !== -1 ? args[targetIndex + 1] : null; - -if (process.env.SKIP_DIDKIT_NAPI) { - console.log('āœ“ SKIP_DIDKIT_NAPI set, skipping napi build'); -} else if (process.env.CI && hasNodeBinary && !target) { - console.log('āœ“ CI detected with prebuilt binary, skipping napi build'); -} else { - const targetFlag = target ? ` --target ${target}` : ''; - console.log(`Building native addon...${target ? ` (target: ${target})` : ''}`); - execSync(`napi build --platform --release --cargo-cwd native${targetFlag}`, { - cwd: packageDir, - stdio: 'inherit', - }); -} - -console.log('Building TypeScript...'); -execSync('tsc -p tsconfig.json', { - cwd: packageDir, - stdio: 'inherit', -}); diff --git a/packages/plugins/didkit-plugin-node/src/index.ts b/packages/plugins/didkit-plugin-node/src/index.ts deleted file mode 100644 index 9367b2beeb..0000000000 --- a/packages/plugins/didkit-plugin-node/src/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './types'; -export * from './plugin'; diff --git a/packages/plugins/didkit-plugin-node/src/plugin.ts b/packages/plugins/didkit-plugin-node/src/plugin.ts deleted file mode 100644 index 4f73e6b7ae..0000000000 --- a/packages/plugins/didkit-plugin-node/src/plugin.ts +++ /dev/null @@ -1,243 +0,0 @@ -import type { InitInput } from '@learncard/types'; -import type { DIDKitPlugin, DidMethod } from '@learncard/didkit-plugin'; -import type { JWKWithPrivateKey } from '@learncard/types'; - -// Native addon interface -interface NativeAddon { - // Sync functions (pure CPU-bound operations - no network) - generateEd25519KeyFromBytes(bytes: Buffer): string; - generateSecp256K1KeyFromBytes(bytes: Buffer): string; - keyToDid(methodPattern: string, jwkJson: string): string; - contextLoader(url: string): string; - createJwe(cleartext: string, recipients: string[]): string; - decryptJwe(jwe: string, jwks: string[]): string; - createDagJwe(cleartext: string, recipients: string[]): string; - decryptDagJwe(jwe: string, jwks: string[]): string; - - // Async functions (may involve DID resolution which can make HTTP requests) - keyToVerificationMethod(methodPattern: string, jwkJson: string): Promise; - didToVerificationMethod(did: string): Promise; - resolveDid(did: string, inputMetadata: string): Promise; - didResolver(did: string, inputMetadata: string): Promise; - issueCredential( - credential: string, - proofOptions: string, - key: string, - contextMap: string - ): Promise; - verifyCredential(credential: string, proofOptions: string, contextMap: string): Promise; - issuePresentation( - presentation: string, - proofOptions: string, - key: string, - contextMap: string - ): Promise; - verifyPresentation( - presentation: string, - proofOptions: string, - contextMap: string - ): Promise; - clearCache(): Promise; -} - -let nativeAddon: NativeAddon | null = null; - -function loadNativeAddon(): NativeAddon { - if (nativeAddon) return nativeAddon; - - try { - // Load the platform-specific native addon - // napi-rs generates files like index.linux-x64-gnu.node - const path = require('path'); - const fs = require('fs'); - - // Use require.resolve to find package location (works from any context) - const packageJson = require.resolve('@learncard/didkit-plugin-node/package.json'); - const packageRoot = path.dirname(packageJson); - - // Try to find the platform-specific .node file - const files = fs.readdirSync(packageRoot); - const nodeFile = files.find((f: string) => f.startsWith('index.') && f.endsWith('.node')); - - if (!nodeFile) { - throw new Error( - `No .node binary found in ${packageRoot}. Files: ${files.join( - ', ' - )}. Run 'pnpm build' to compile.` - ); - } - - nativeAddon = require(path.join(packageRoot, nodeFile)) as NativeAddon; - return nativeAddon; - } catch (error) { - throw new Error( - `@learncard/didkit-plugin-node: Failed to load native module. ` + - `Ensure the addon is built for your platform. Original error: ${error}` - ); - } -} - -export const getDidKitPlugin = async ( - _input?: InitInput | Promise, - _allowRemoteContexts = false -): Promise => { - const native = loadNativeAddon(); - - return { - name: 'DIDKit', - displayName: 'DIDKit (Native)', - description: - 'Node-native N-API DIDKit plugin for LearnCard. Provides cryptographic operations without WASM overhead.', - context: { - resolveStaticDocument: async (_learnCard, url) => { - // Uses SSI's embedded static contexts from Rust (no HTTP) - // Returns undefined for unknown contexts - DynamicLoaderPlugin can handle HTTP if needed - try { - const result = native.contextLoader(url); - return JSON.parse(result) || undefined; - } catch (error) { - // Context not found in static contexts - this is expected for unknown URLs - _learnCard.debug?.('Context not in static loader:', url); - return undefined; - } - }, - }, - methods: { - generateEd25519KeyFromBytes: (_learnCard, bytes) => { - const jwkJson = native.generateEd25519KeyFromBytes(Buffer.from(bytes)); - return JSON.parse(jwkJson) as JWKWithPrivateKey; - }, - - generateSecp256k1KeyFromBytes: (_learnCard, bytes) => { - const jwkJson = native.generateSecp256K1KeyFromBytes(Buffer.from(bytes)); - return JSON.parse(jwkJson) as JWKWithPrivateKey; - }, - - keyToDid: (_learnCard, type: DidMethod, keypair) => { - return native.keyToDid(type, JSON.stringify(keypair)); - }, - - keyToVerificationMethod: async (_learnCard, type, keypair) => { - return await native.keyToVerificationMethod(type, JSON.stringify(keypair)); - }, - - didToVerificationMethod: async (_learnCard, did) => { - return await native.didToVerificationMethod(did); - }, - - issueCredential: async (_learnCard, credential, options, keypair) => { - const { getDocumentMap } = await import('@learncard/didkit-plugin'); - const contextMap = await getDocumentMap( - _learnCard, - credential, - _allowRemoteContexts - ); - const result = await native.issueCredential( - JSON.stringify(credential), - JSON.stringify(options), - JSON.stringify(keypair), - JSON.stringify(contextMap) - ); - return JSON.parse(result); - }, - - verifyCredential: async (_learnCard, credential, options = {}) => { - const { getDocumentMap } = await import('@learncard/didkit-plugin'); - const contextMap = await getDocumentMap( - _learnCard, - credential, - _allowRemoteContexts - ); - const result = await native.verifyCredential( - JSON.stringify(credential), - JSON.stringify(options), - JSON.stringify(contextMap) - ); - return JSON.parse(result); - }, - - issuePresentation: async (_learnCard, presentation, options, keypair) => { - const { getDocumentMap } = await import('@learncard/didkit-plugin'); - const isJwt = options.proofFormat === 'jwt'; - const contextMap = await getDocumentMap( - _learnCard, - presentation, - _allowRemoteContexts - ); - const result = await native.issuePresentation( - JSON.stringify(presentation), - JSON.stringify(options), - JSON.stringify(keypair), - JSON.stringify(contextMap) - ); - return isJwt ? result : JSON.parse(result); - }, - - verifyPresentation: async (_learnCard, presentation, options = {}) => { - const { getDocumentMap } = await import('@learncard/didkit-plugin'); - const isJwt = typeof presentation === 'string'; - const contextMap = isJwt - ? {} - : await getDocumentMap(_learnCard, presentation, _allowRemoteContexts); - // Filter out proofFormat as it's not part of LinkedDataProofOptions in Rust - const { proofFormat, ...nativeOptions } = options as any; - const result = await native.verifyPresentation( - isJwt ? presentation : JSON.stringify(presentation), - JSON.stringify(nativeOptions), - JSON.stringify(contextMap) - ); - return JSON.parse(result); - }, - - contextLoader: async (_learnCard, url) => { - try { - const result = native.contextLoader(url); - return JSON.parse(result); - } catch (e) { - // Context loading failed, return undefined to allow fallback - return undefined; - } - }, - - resolveDid: async (_learnCard, did, inputMetadata = {}) => { - const result = await native.resolveDid(did, JSON.stringify(inputMetadata)); - return JSON.parse(result); - }, - - didResolver: async (_learnCard, did, inputMetadata = {}) => { - const result = await native.didResolver(did, JSON.stringify(inputMetadata)); - return JSON.parse(result); - }, - - createJwe: async (_learnCard, cleartext, recipients) => { - const result = native.createJwe(cleartext, recipients); - return JSON.parse(result); - }, - - decryptJwe: async (_learnCard, jwe, jwks) => { - return native.decryptJwe( - JSON.stringify(jwe), - jwks.map((jwk: JWKWithPrivateKey) => JSON.stringify(jwk)) - ); - }, - - createDagJwe: async (_learnCard, cleartext, recipients) => { - const result = native.createDagJwe(JSON.stringify(cleartext), recipients); - return JSON.parse(result); - }, - - decryptDagJwe: async (_learnCard, jwe, jwks) => { - const result = native.decryptDagJwe( - JSON.stringify(jwe), - jwks.map((jwk: JWKWithPrivateKey) => JSON.stringify(jwk)) - ); - - return JSON.parse(result); - }, - - clearDidWebCache: async () => { - await native.clearCache(); - }, - }, - }; -}; diff --git a/packages/plugins/didkit-plugin-node/src/types.ts b/packages/plugins/didkit-plugin-node/src/types.ts deleted file mode 100644 index 1711d805af..0000000000 --- a/packages/plugins/didkit-plugin-node/src/types.ts +++ /dev/null @@ -1 +0,0 @@ -export type { DIDKitPlugin, DidMethod, ProofOptions, InputMetadata } from '@learncard/didkit-plugin'; diff --git a/packages/plugins/didkit-plugin-node/test-brain-service-exact.mjs b/packages/plugins/didkit-plugin-node/test-brain-service-exact.mjs deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/packages/plugins/didkit-plugin-node/test-jwt-verify.mjs b/packages/plugins/didkit-plugin-node/test-jwt-verify.mjs deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/packages/plugins/didkit-plugin-node/test-native.mjs b/packages/plugins/didkit-plugin-node/test-native.mjs deleted file mode 100644 index 08bb573a5e..0000000000 --- a/packages/plugins/didkit-plugin-node/test-native.mjs +++ /dev/null @@ -1,27 +0,0 @@ -import { getDidKitPlugin } from './dist/plugin.js'; - -console.log('Testing native DIDKit plugin...\n'); - -try { - const plugin = await getDidKitPlugin(); - console.log('āœ“ Plugin loaded successfully'); - console.log(' Name:', plugin.name); - console.log(' Display:', plugin.displayName); - - // Test generateEd25519KeyFromBytes - const seed = new Uint8Array(32).fill(1); - const jwk = plugin.methods.generateEd25519KeyFromBytes(null, seed); - console.log('\nāœ“ generateEd25519KeyFromBytes works'); - console.log(' Key type:', jwk.kty); - console.log(' Curve:', jwk.crv); - - // Test keyToDID - const did = plugin.methods.keyToDid(null, 'key', jwk); - console.log('\nāœ“ keyToDID works'); - console.log(' DID:', did); - - console.log('\nšŸŽ‰ All minimal methods working!'); -} catch (error) { - console.error('āŒ Error:', error.message); - process.exit(1); -} diff --git a/packages/plugins/didkit-plugin-node/tsconfig.json b/packages/plugins/didkit-plugin-node/tsconfig.json deleted file mode 100644 index e55aeb2acf..0000000000 --- a/packages/plugins/didkit-plugin-node/tsconfig.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "compilerOptions": { - "target": "ES2020", - "module": "CommonJS", - "declaration": true, - "declarationMap": true, - "outDir": "dist", - "strict": true, - "esModuleInterop": true, - "lib": ["dom", "es2021"], - "rootDir": "src", - "skipLibCheck": true, - "allowSyntheticDefaultImports": true, - "moduleResolution": "node" - }, - "include": ["src"], - "exclude": ["node_modules", "native"] -} diff --git a/packages/plugins/didkit/CHANGELOG.md b/packages/plugins/didkit/CHANGELOG.md index 19fe2b32c9..d7a6472b12 100644 --- a/packages/plugins/didkit/CHANGELOG.md +++ b/packages/plugins/didkit/CHANGELOG.md @@ -1,44 +1,5 @@ # learn-card-core -## 1.7.0 - -### Minor Changes - -- [#936](https://github.com/learningeconomy/LearnCard/pull/936) [`7e30fc7116411ba19a4889cfbf9fc71dd725c309`](https://github.com/learningeconomy/LearnCard/commit/7e30fc7116411ba19a4889cfbf9fc71dd725c309) Thanks [@TaylorBeeston](https://github.com/TaylorBeeston)! - ## New Native DIDKit Plugin (`@learncard/didkit-plugin-node`) - - Adds a high-performance native Node.js DIDKit plugin using Rust and N-API, providing **~18x faster cold starts** compared to the WASM version. - - ### Key Features - - - **Native Performance**: Eliminates WASM compilation overhead on cold starts (~1100ms → ~60ms) - - **Cross-Platform Binaries**: Prebuilt for Linux (x64/arm64, glibc/musl), macOS (x64/arm64), and Windows (x64) - - **Drop-in Replacement**: API-compatible with `@learncard/didkit-plugin` - - **JWE Support**: Full JWE and DAG-JWE encryption/decryption - - **Async Operations**: All crypto operations run on separate thread pool, non-blocking - - ### Usage - - ```typescript - import { initLearnCard } from '@learncard/init'; - - // Use native plugin instead of WASM - const learnCard = await initLearnCard({ - seed: 'your-seed', - didkit: 'node', // <-- new option - }); - ``` - - ### When to Use - - - āœ… Serverless functions (AWS Lambda, Vercel) - - āœ… Node.js servers (Express, Fastify, NestJS) - - āœ… CLI tools and scripts - - āœ… High-throughput credential processing - - ### Service Updates - - All LearnCard Network services (brain-service, learn-cloud-service, simple-signing-service) now use the native plugin in Docker/Lambda environments for improved cold start performance. - ## 1.6.4 ### Patch Changes diff --git a/packages/plugins/didkit/package.json b/packages/plugins/didkit/package.json index 4716eccc45..00550e244e 100644 --- a/packages/plugins/didkit/package.json +++ b/packages/plugins/didkit/package.json @@ -1,6 +1,6 @@ { "name": "@learncard/didkit-plugin", - "version": "1.7.0", + "version": "1.6.4", "description": "", "main": "./dist/index.js", "module": "./dist/didkit-plugin.esm.js", diff --git a/packages/plugins/didkit/src/index.ts b/packages/plugins/didkit/src/index.ts index 7b4e290a00..9367b2beeb 100644 --- a/packages/plugins/didkit/src/index.ts +++ b/packages/plugins/didkit/src/index.ts @@ -1,3 +1,2 @@ export * from './types'; export * from './plugin'; -export * from './helpers'; diff --git a/packages/plugins/lca-api-plugin/CHANGELOG.md b/packages/plugins/lca-api-plugin/CHANGELOG.md index 25f672aeed..445fa3c9c5 100644 --- a/packages/plugins/lca-api-plugin/CHANGELOG.md +++ b/packages/plugins/lca-api-plugin/CHANGELOG.md @@ -1,28 +1,5 @@ # lca-api-plugin -## 1.1.9 - -### Patch Changes - -- Updated dependencies []: - - @learncard/lca-api-client@1.1.9 - -## 1.1.8 - -### Patch Changes - -- Updated dependencies []: - - @learncard/lca-api-client@1.1.8 - -## 1.1.7 - -### Patch Changes - -- Updated dependencies [[`7e30fc7116411ba19a4889cfbf9fc71dd725c309`](https://github.com/learningeconomy/LearnCard/commit/7e30fc7116411ba19a4889cfbf9fc71dd725c309)]: - - @learncard/init@2.3.0 - - @learncard/didkit-plugin@1.7.0 - - @learncard/lca-api-client@1.1.7 - ## 1.1.6 ### Patch Changes diff --git a/packages/plugins/lca-api-plugin/package.json b/packages/plugins/lca-api-plugin/package.json index 12b1dc6c31..d757776625 100644 --- a/packages/plugins/lca-api-plugin/package.json +++ b/packages/plugins/lca-api-plugin/package.json @@ -1,6 +1,6 @@ { "name": "@learncard/lca-api-plugin", - "version": "1.1.9", + "version": "1.1.6", "description": "", "main": "./dist/index.js", "module": "./dist/lca-api-plugin.esm.js", diff --git a/packages/plugins/learn-card-network/CHANGELOG.md b/packages/plugins/learn-card-network/CHANGELOG.md index d225a217d5..ad2648fee2 100644 --- a/packages/plugins/learn-card-network/CHANGELOG.md +++ b/packages/plugins/learn-card-network/CHANGELOG.md @@ -1,19 +1,5 @@ # learn-card-core -## 2.9.7 - -### Patch Changes - -- Updated dependencies []: - - @learncard/network-brain-client@2.5.9 - -## 2.9.6 - -### Patch Changes - -- Updated dependencies []: - - @learncard/network-brain-client@2.5.8 - ## 2.9.5 ### Patch Changes diff --git a/packages/plugins/learn-card-network/package.json b/packages/plugins/learn-card-network/package.json index 29400a0844..bd8ff064b2 100644 --- a/packages/plugins/learn-card-network/package.json +++ b/packages/plugins/learn-card-network/package.json @@ -1,6 +1,6 @@ { "name": "@learncard/network-plugin", - "version": "2.9.7", + "version": "2.9.5", "description": "", "main": "./dist/index.js", "module": "./dist/lcn-plugin.esm.js", diff --git a/packages/plugins/learn-cloud/CHANGELOG.md b/packages/plugins/learn-cloud/CHANGELOG.md index 4898d47ebd..822b53397f 100644 --- a/packages/plugins/learn-cloud/CHANGELOG.md +++ b/packages/plugins/learn-cloud/CHANGELOG.md @@ -1,13 +1,5 @@ # learn-card-core -## 2.3.7 - -### Patch Changes - -- Updated dependencies [[`7e30fc7116411ba19a4889cfbf9fc71dd725c309`](https://github.com/learningeconomy/LearnCard/commit/7e30fc7116411ba19a4889cfbf9fc71dd725c309)]: - - @learncard/didkit-plugin@1.7.0 - - @learncard/learn-cloud-client@1.6.7 - ## 2.3.6 ### Patch Changes diff --git a/packages/plugins/learn-cloud/package.json b/packages/plugins/learn-cloud/package.json index 0a16045bd4..d2a58a7545 100644 --- a/packages/plugins/learn-cloud/package.json +++ b/packages/plugins/learn-cloud/package.json @@ -1,6 +1,6 @@ { "name": "@learncard/learn-cloud-plugin", - "version": "2.3.7", + "version": "2.3.6", "description": "", "main": "./dist/index.js", "module": "./dist/learn-cloud-plugin.esm.js", diff --git a/packages/plugins/open-badge-v2/CHANGELOG.md b/packages/plugins/open-badge-v2/CHANGELOG.md index 72290c72e3..82b44e57aa 100644 --- a/packages/plugins/open-badge-v2/CHANGELOG.md +++ b/packages/plugins/open-badge-v2/CHANGELOG.md @@ -1,12 +1,5 @@ # @learncard/open-badge-v2-plugin -## 1.1.5 - -### Patch Changes - -- Updated dependencies [[`7e30fc7116411ba19a4889cfbf9fc71dd725c309`](https://github.com/learningeconomy/LearnCard/commit/7e30fc7116411ba19a4889cfbf9fc71dd725c309)]: - - @learncard/vc-plugin@1.4.0 - ## 1.1.4 ### Patch Changes diff --git a/packages/plugins/open-badge-v2/package.json b/packages/plugins/open-badge-v2/package.json index dd834d78d0..d276bad4ed 100644 --- a/packages/plugins/open-badge-v2/package.json +++ b/packages/plugins/open-badge-v2/package.json @@ -1,6 +1,6 @@ { "name": "@learncard/open-badge-v2-plugin", - "version": "1.1.5", + "version": "1.1.4", "description": "OpenBadge v2 wrapper plugin for LearnCard. Wraps OBv2 assertions into self-issued VCs.", "main": "./dist/index.js", "module": "./dist/open-badge-v2-plugin.esm.js", diff --git a/packages/plugins/simple-signing-plugin/CHANGELOG.md b/packages/plugins/simple-signing-plugin/CHANGELOG.md index 629b4b7138..60e7415643 100644 --- a/packages/plugins/simple-signing-plugin/CHANGELOG.md +++ b/packages/plugins/simple-signing-plugin/CHANGELOG.md @@ -1,12 +1,5 @@ # lca-api-plugin -## 1.1.5 - -### Patch Changes - -- Updated dependencies []: - - @learncard/simple-signing-client@1.1.5 - ## 1.1.4 ### Patch Changes diff --git a/packages/plugins/simple-signing-plugin/package.json b/packages/plugins/simple-signing-plugin/package.json index dc8a98a4a4..a3dd8d048b 100644 --- a/packages/plugins/simple-signing-plugin/package.json +++ b/packages/plugins/simple-signing-plugin/package.json @@ -1,6 +1,6 @@ { "name": "@learncard/simple-signing-plugin", - "version": "1.1.5", + "version": "1.1.4", "description": "", "type": "module", "main": "./dist/index.cjs", diff --git a/packages/plugins/vc/CHANGELOG.md b/packages/plugins/vc/CHANGELOG.md index 552d34ae89..f2abf0519a 100644 --- a/packages/plugins/vc/CHANGELOG.md +++ b/packages/plugins/vc/CHANGELOG.md @@ -1,49 +1,5 @@ # learn-card-core -## 1.4.0 - -### Minor Changes - -- [#936](https://github.com/learningeconomy/LearnCard/pull/936) [`7e30fc7116411ba19a4889cfbf9fc71dd725c309`](https://github.com/learningeconomy/LearnCard/commit/7e30fc7116411ba19a4889cfbf9fc71dd725c309) Thanks [@TaylorBeeston](https://github.com/TaylorBeeston)! - ## New Native DIDKit Plugin (`@learncard/didkit-plugin-node`) - - Adds a high-performance native Node.js DIDKit plugin using Rust and N-API, providing **~18x faster cold starts** compared to the WASM version. - - ### Key Features - - - **Native Performance**: Eliminates WASM compilation overhead on cold starts (~1100ms → ~60ms) - - **Cross-Platform Binaries**: Prebuilt for Linux (x64/arm64, glibc/musl), macOS (x64/arm64), and Windows (x64) - - **Drop-in Replacement**: API-compatible with `@learncard/didkit-plugin` - - **JWE Support**: Full JWE and DAG-JWE encryption/decryption - - **Async Operations**: All crypto operations run on separate thread pool, non-blocking - - ### Usage - - ```typescript - import { initLearnCard } from '@learncard/init'; - - // Use native plugin instead of WASM - const learnCard = await initLearnCard({ - seed: 'your-seed', - didkit: 'node', // <-- new option - }); - ``` - - ### When to Use - - - āœ… Serverless functions (AWS Lambda, Vercel) - - āœ… Node.js servers (Express, Fastify, NestJS) - - āœ… CLI tools and scripts - - āœ… High-throughput credential processing - - ### Service Updates - - All LearnCard Network services (brain-service, learn-cloud-service, simple-signing-service) now use the native plugin in Docker/Lambda environments for improved cold start performance. - -### Patch Changes - -- Updated dependencies [[`7e30fc7116411ba19a4889cfbf9fc71dd725c309`](https://github.com/learningeconomy/LearnCard/commit/7e30fc7116411ba19a4889cfbf9fc71dd725c309)]: - - @learncard/didkit-plugin@1.7.0 - ## 1.3.4 ### Patch Changes diff --git a/packages/plugins/vc/package.json b/packages/plugins/vc/package.json index f0f452b23d..7621f91a9c 100644 --- a/packages/plugins/vc/package.json +++ b/packages/plugins/vc/package.json @@ -1,6 +1,6 @@ { "name": "@learncard/vc-plugin", - "version": "1.4.0", + "version": "1.3.4", "description": "", "main": "./dist/index.js", "module": "./dist/vc-plugin.esm.js", diff --git a/packages/plugins/vc/src/issueCredential.ts b/packages/plugins/vc/src/issueCredential.ts index 0e0775e0df..d2c092c873 100644 --- a/packages/plugins/vc/src/issueCredential.ts +++ b/packages/plugins/vc/src/issueCredential.ts @@ -14,23 +14,9 @@ export const issueCredential = (initLearnCard: VCDependentLearnCard) => { if (!kp) throw new Error('Cannot issue credential: Could not get subject keypair'); - // Check if credential uses v2 context - const contexts = Array.isArray(credential['@context']) - ? credential['@context'] - : [credential['@context']]; - const hasV2Context = contexts.some(ctx => - typeof ctx === 'string' && (ctx.includes('/ns/credentials/v2') || ctx.includes('/credentials/v2')) - ); - - // For v2 contexts, upgrade Ed25519Signature2018 to Ed25519Signature2020 - // Ed25519Signature2018 is incompatible with credentials v2 - const proofType = hasV2Context && signingOptions.type === 'Ed25519Signature2018' - ? 'Ed25519Signature2020' - : signingOptions.type ?? 'Ed25519Signature2020'; - const options = { proofPurpose: 'assertionMethod', - type: proofType, + type: 'Ed25519Signature2020', ...signingOptions, }; diff --git a/packages/plugins/vc/src/issuePresentation.ts b/packages/plugins/vc/src/issuePresentation.ts index fadae39333..5119d746f8 100644 --- a/packages/plugins/vc/src/issuePresentation.ts +++ b/packages/plugins/vc/src/issuePresentation.ts @@ -14,24 +14,10 @@ export const issuePresentation = (initLearnCard: VCDependentLearnCard) => { if (!kp) throw new Error('Cannot issue credential: Could not get subject keypair'); - // Check if presentation uses v2 context - const contexts = Array.isArray(presentation['@context']) - ? presentation['@context'] - : [presentation['@context']]; - const hasV2Context = contexts.some(ctx => - typeof ctx === 'string' && (ctx.includes('/ns/credentials/v2') || ctx.includes('/credentials/v2')) - ); - - // For v2 contexts, upgrade Ed25519Signature2018 to Ed25519Signature2020 - // Ed25519Signature2018 is incompatible with credentials v2 - const proofType = hasV2Context && signingOptions.type === 'Ed25519Signature2018' - ? 'Ed25519Signature2020' - : signingOptions.type ?? 'Ed25519Signature2020'; - const options = { ...(signingOptions.proofFormat === 'jwt' ? {} - : { proofPurpose: 'assertionMethod', type: proofType }), + : { proofPurpose: 'assertionMethod', type: 'Ed25519Signature2020' }), ...signingOptions, }; diff --git a/packages/react-learn-card/CHANGELOG.md b/packages/react-learn-card/CHANGELOG.md index c9c8098f6e..1cba042e52 100644 --- a/packages/react-learn-card/CHANGELOG.md +++ b/packages/react-learn-card/CHANGELOG.md @@ -1,20 +1,5 @@ # @welibraryos/react-learn-card -## 2.9.8 - -### Patch Changes - -- Updated dependencies [[`7e30fc7116411ba19a4889cfbf9fc71dd725c309`](https://github.com/learningeconomy/LearnCard/commit/7e30fc7116411ba19a4889cfbf9fc71dd725c309)]: - - @learncard/init@2.3.0 - -## 2.9.7 - -### Patch Changes - -- [#933](https://github.com/learningeconomy/LearnCard/pull/933) [`1247b3b2b372626b06d6193b5c9227504c23a3be`](https://github.com/learningeconomy/LearnCard/commit/1247b3b2b372626b06d6193b5c9227504c23a3be) Thanks [@goblincore](https://github.com/goblincore)! - [LC-1511] Override unknown issuer verifier state text and use roles in Scouts app - -- [#933](https://github.com/learningeconomy/LearnCard/pull/933) [`1247b3b2b372626b06d6193b5c9227504c23a3be`](https://github.com/learningeconomy/LearnCard/commit/1247b3b2b372626b06d6193b5c9227504c23a3be) Thanks [@goblincore](https://github.com/goblincore)! - [LC-1511] Override unknown issuer verifier state text and use roles in Scouts app - ## 2.9.6 ### Patch Changes diff --git a/packages/react-learn-card/package.json b/packages/react-learn-card/package.json index 74e6daee08..b1c592e51a 100644 --- a/packages/react-learn-card/package.json +++ b/packages/react-learn-card/package.json @@ -1,6 +1,6 @@ { "name": "@learncard/react", - "version": "2.9.8", + "version": "2.9.6", "description": "", "main": "dist/cjs", "module": "dist/esm", diff --git a/packages/react-learn-card/src/components/BoostGenericCard/BoostGenericCard.tsx b/packages/react-learn-card/src/components/BoostGenericCard/BoostGenericCard.tsx index 0bb84c240e..ac0835cde7 100644 --- a/packages/react-learn-card/src/components/BoostGenericCard/BoostGenericCard.tsx +++ b/packages/react-learn-card/src/components/BoostGenericCard/BoostGenericCard.tsx @@ -119,10 +119,10 @@ export const BoostGenericCard: React.FC = ({ {/* Date & Verifier */} {customDateDisplay || ( -
+

{verifierBadge} - {dateDisplay} -

+ {dateDisplay} +

)} {/* Skills count if in modal */} diff --git a/packages/react-learn-card/src/components/CertificateDisplayCard/CertificateDisplayCard.tsx b/packages/react-learn-card/src/components/CertificateDisplayCard/CertificateDisplayCard.tsx index cb5805c818..17271b30e5 100644 --- a/packages/react-learn-card/src/components/CertificateDisplayCard/CertificateDisplayCard.tsx +++ b/packages/react-learn-card/src/components/CertificateDisplayCard/CertificateDisplayCard.tsx @@ -40,9 +40,6 @@ type CertificateDisplayCardProps = { formattedDisplayType?: string; customLinkedCredentialsComponent?: React.ReactNode; customBodyContentSlot?: React.ReactNode; - unknownVerifierTitle?: string; - hideAwardedTo?: boolean; - hideFrontFaceDetails?: boolean; }; export const CertificateDisplayCard: React.FC = ({ @@ -73,9 +70,6 @@ export const CertificateDisplayCard: React.FC = ({ formattedDisplayType, customLinkedCredentialsComponent, customBodyContentSlot, - unknownVerifierTitle, - hideAwardedTo, - hideFrontFaceDetails, }) => { const [_isFront, _setIsFront] = useState(isFrontOverride ?? true); @@ -101,9 +95,6 @@ export const CertificateDisplayCard: React.FC = ({ showDetailsBtn={showDetailsBtn} formattedDisplayType={formattedDisplayType} customBodyContentSlot={customBodyContentSlot} - unknownVerifierTitle={unknownVerifierTitle} - hideAwardedTo={hideAwardedTo} - hideFrontFaceDetails={hideFrontFaceDetails} /> )} diff --git a/packages/react-learn-card/src/components/CertificateDisplayCard/CertificateFrontFace.tsx b/packages/react-learn-card/src/components/CertificateDisplayCard/CertificateFrontFace.tsx index 8345840cff..ca8a96b8cc 100644 --- a/packages/react-learn-card/src/components/CertificateDisplayCard/CertificateFrontFace.tsx +++ b/packages/react-learn-card/src/components/CertificateDisplayCard/CertificateFrontFace.tsx @@ -38,9 +38,6 @@ type CertificateFrontFaceProps = { showDetailsBtn?: boolean; formattedDisplayType?: string; customBodyContentSlot?: React.ReactNode; - unknownVerifierTitle?: string; - hideAwardedTo?: boolean; - hideFrontFaceDetails?: boolean; }; export const CertificateFrontFace: React.FC = ({ @@ -58,9 +55,6 @@ export const CertificateFrontFace: React.FC = ({ showDetailsBtn = false, formattedDisplayType, customBodyContentSlot, - unknownVerifierTitle, - hideAwardedTo: hideAwardedToProp, - hideFrontFaceDetails, }) => { const { title = '', @@ -116,8 +110,6 @@ export const CertificateFrontFace: React.FC = ({ // the extra "&& issuerDid" is so that the credential preview doesn't say "Self Verified" // the did:example:123 condition is so that we don't show this status from the Manage Boosts tab verifierState = VERIFIER_STATES.selfVerified; - } else if (unknownVerifierTitle) { - verifierState = VERIFIER_STATES.trustedVerifier; } else { if (knownDIDRegistry?.source === 'trusted') { verifierState = VERIFIER_STATES.trustedVerifier; @@ -134,7 +126,7 @@ export const CertificateFrontFace: React.FC = ({ const issueeImageExists = issueeImage || subjectImageComponent; const hideAwardedTo = - hideAwardedToProp ?? (issueeName?.includes('did:key') || issueeName?.includes('did:example:123')); + issueeName?.includes('did:key') || issueeName?.includes('did:example:123'); return (
= ({ {issuerName} - +
{customBodyContentSlot && customBodyContentSlot}
diff --git a/packages/react-learn-card/src/components/CertificateDisplayCard/VerifierStateBadgeAndText.tsx b/packages/react-learn-card/src/components/CertificateDisplayCard/VerifierStateBadgeAndText.tsx index aa79c9cb7b..493a6a1a48 100644 --- a/packages/react-learn-card/src/components/CertificateDisplayCard/VerifierStateBadgeAndText.tsx +++ b/packages/react-learn-card/src/components/CertificateDisplayCard/VerifierStateBadgeAndText.tsx @@ -12,51 +12,40 @@ export const VERIFIER_STATES = { } as const; export type VerifierState = (typeof VERIFIER_STATES)[keyof typeof VERIFIER_STATES]; -export type VerifierStateBadgeAndTextProps = { +type VerifierStateBadgeAndTextProps = { verifierState: VerifierState; className?: string; - unknownVerifierTitle?: string; }; export const VerifierStateBadgeAndText: React.FC = ({ verifierState, className = '', - unknownVerifierTitle, }) => { - // For Scouts: if we have a role-based title, show it with trusted styling - // BUT don't overwrite self-issued or untrusted status - const effectiveState = - unknownVerifierTitle && - verifierState !== VERIFIER_STATES.selfVerified && - verifierState !== VERIFIER_STATES.untrustedVerifier - ? VERIFIER_STATES.trustedVerifier - : verifierState; - return (
- {effectiveState === VERIFIER_STATES.selfVerified && ( -
+ {verifierState === VERIFIER_STATES.selfVerified && ( + - Self Issued -
+ Self Issued + )} - {effectiveState === VERIFIER_STATES.trustedVerifier && ( -
+ {verifierState === VERIFIER_STATES.trustedVerifier && ( + - {unknownVerifierTitle ?? 'Trusted Issuer'} -
+ Trusted Issuer + )} - {effectiveState === VERIFIER_STATES.unknownVerifier && ( -
+ {verifierState === VERIFIER_STATES.unknownVerifier && ( + - {unknownVerifierTitle ?? VERIFIER_STATES.unknownVerifier} -
+ Unknown Issuer + )} - {effectiveState === VERIFIER_STATES.untrustedVerifier && ( -
+ {verifierState === VERIFIER_STATES.untrustedVerifier && ( + - Untrusted Issuer -
+ Untrusted Issuer + )}
); diff --git a/packages/react-learn-card/src/components/MeritBadgeDisplayCard/MeritBadgeDisplayCard.tsx b/packages/react-learn-card/src/components/MeritBadgeDisplayCard/MeritBadgeDisplayCard.tsx index 26ef51f88c..574c0c4ed3 100644 --- a/packages/react-learn-card/src/components/MeritBadgeDisplayCard/MeritBadgeDisplayCard.tsx +++ b/packages/react-learn-card/src/components/MeritBadgeDisplayCard/MeritBadgeDisplayCard.tsx @@ -40,9 +40,6 @@ type MeritBadgeDisplayCardProps = { formattedDisplayType?: string; customLinkedCredentialsComponent?: React.ReactNode; customBodyContentSlot?: React.ReactNode; - unknownVerifierTitle?: string; - hideAwardedTo?: boolean; - hideFrontFaceDetails?: boolean; }; export const MeritBadgeDisplayCard: React.FC = ({ @@ -73,9 +70,6 @@ export const MeritBadgeDisplayCard: React.FC = ({ formattedDisplayType, customLinkedCredentialsComponent, customBodyContentSlot, - unknownVerifierTitle, - hideAwardedTo, - hideFrontFaceDetails, }) => { const [_isFront, _setIsFront] = useState(isFrontOverride ?? true); @@ -101,9 +95,6 @@ export const MeritBadgeDisplayCard: React.FC = ({ showDetailsBtn={showDetailsBtn} formattedDisplayType={formattedDisplayType} customBodyContentSlot={customBodyContentSlot} - unknownVerifierTitle={unknownVerifierTitle} - hideAwardedTo={hideAwardedTo} - hideFrontFaceDetails={hideFrontFaceDetails} /> )} diff --git a/packages/react-learn-card/src/components/MeritBadgeDisplayCard/MeritBadgeFrontFace.tsx b/packages/react-learn-card/src/components/MeritBadgeDisplayCard/MeritBadgeFrontFace.tsx index 13aa9bbc8d..f962f1bc3c 100644 --- a/packages/react-learn-card/src/components/MeritBadgeDisplayCard/MeritBadgeFrontFace.tsx +++ b/packages/react-learn-card/src/components/MeritBadgeDisplayCard/MeritBadgeFrontFace.tsx @@ -39,9 +39,6 @@ type MeritBadgeFrontFaceProps = { showDetailsBtn?: boolean; formattedDisplayType?: string; customBodyContentSlot?: React.ReactNode; - unknownVerifierTitle?: string; - hideAwardedTo?: boolean; - hideFrontFaceDetails?: boolean; }; export const MeritBadgeFrontFace: React.FC = ({ @@ -59,9 +56,6 @@ export const MeritBadgeFrontFace: React.FC = ({ showDetailsBtn = false, formattedDisplayType, customBodyContentSlot, - unknownVerifierTitle, - hideAwardedTo: hideAwardedToProp, - hideFrontFaceDetails, }) => { const { title = '', @@ -113,14 +107,10 @@ export const MeritBadgeFrontFace: React.FC = ({ typeof credential.issuer === 'string' ? credential.issuer : credential.issuer.id; let verifierState: VerifierState; - const hideAwardedTo = - hideAwardedToProp ?? (issueeName?.includes('did:key') || issueeName?.includes('did:example:123')); if (credentialSubject?.id === issuerDid && issuerDid && issuerDid !== 'did:example:123') { // the extra "&& issuerDid" is so that the credential preview doesn't say "Self Verified" // the did:example:123 condition is so that we don't show this status from the Manage Boosts tab verifierState = VERIFIER_STATES.selfVerified; - } else if (unknownVerifierTitle) { - verifierState = VERIFIER_STATES.trustedVerifier; } else { if (knownDIDRegistry?.source === 'trusted') { verifierState = VERIFIER_STATES.trustedVerifier; @@ -250,7 +240,6 @@ export const MeritBadgeFrontFace: React.FC = ({
diff --git a/packages/react-learn-card/src/components/VCDisplayCard2/VC2FrontFaceInfo.tsx b/packages/react-learn-card/src/components/VCDisplayCard2/VC2FrontFaceInfo.tsx index 7ed80bb640..b51897e857 100644 --- a/packages/react-learn-card/src/components/VCDisplayCard2/VC2FrontFaceInfo.tsx +++ b/packages/react-learn-card/src/components/VCDisplayCard2/VC2FrontFaceInfo.tsx @@ -31,7 +31,6 @@ type VC2FrontFaceInfoProps = { customThumbComponent?: React.ReactNode; knownDIDRegistry?: KnownDIDRegistryType; customBodyContentSlot?: React.ReactNode; - unknownVerifierTitle?: string; }; const VC2FrontFaceInfo: React.FC = ({ @@ -47,18 +46,16 @@ const VC2FrontFaceInfo: React.FC = ({ customThumbComponent, knownDIDRegistry, customBodyContentSlot, - unknownVerifierTitle, }) => { const issuerName = truncateWithEllipsis(getNameFromProfile(issuer ?? ''), 20); const issueeName = truncateWithEllipsis(getNameFromProfile(issuee ?? ''), 25); const issuerImage = getImageFromProfile(issuer ?? ''); const issueeImage = getImageFromProfile(issuee ?? ''); - + const { credentialSubject } = getInfoFromCredential(credential, 'MMM dd, yyyy', { uppercaseDate: false, }); - const getImageElement = ( imageUrl: string, alt: string, @@ -96,8 +93,6 @@ const VC2FrontFaceInfo: React.FC = ({ // the extra "&& issuerDid" is so that the credential preview doesn't say "Self Verified" // the did:example:123 condition is so that we don't show this status from the Manage Boosts tab verifierState = VERIFIER_STATES.selfVerified; - } else if (unknownVerifierTitle) { - verifierState = VERIFIER_STATES.trustedVerifier; } else { if (knownDIDRegistry?.source === 'trusted') { verifierState = VERIFIER_STATES.trustedVerifier; @@ -151,10 +146,7 @@ const VC2FrontFaceInfo: React.FC = ({ by {issuerName}
- +
)} diff --git a/packages/react-learn-card/src/components/VCDisplayCard2/VCDisplayCard2.tsx b/packages/react-learn-card/src/components/VCDisplayCard2/VCDisplayCard2.tsx index 98e64b3606..01d6ebf36b 100644 --- a/packages/react-learn-card/src/components/VCDisplayCard2/VCDisplayCard2.tsx +++ b/packages/react-learn-card/src/components/VCDisplayCard2/VCDisplayCard2.tsx @@ -78,9 +78,6 @@ export type VCDisplayCard2Props = { customLinkedCredentialsComponent?: React.ReactNode; customContentSlot?: React.ReactNode; customBodyContentSlot?: React.ReactNode; - unknownVerifierTitle?: string; - hideAwardedTo?: boolean; - hideFrontFaceDetails?: boolean; }; export const VCDisplayCard2: React.FC = ({ @@ -127,9 +124,6 @@ export const VCDisplayCard2: React.FC = ({ customLinkedCredentialsComponent, customContentSlot, customBodyContentSlot, - unknownVerifierTitle, - hideAwardedTo, - hideFrontFaceDetails, }) => { const { title = '', @@ -222,9 +216,6 @@ export const VCDisplayCard2: React.FC = ({ formattedDisplayType={formattedDisplayType} customLinkedCredentialsComponent={customLinkedCredentialsComponent} customBodyContentSlot={customBodyContentSlot} - unknownVerifierTitle={unknownVerifierTitle} - hideAwardedTo={hideAwardedTo} - hideFrontFaceDetails={hideFrontFaceDetails} /> ); } @@ -256,9 +247,6 @@ export const VCDisplayCard2: React.FC = ({ formattedDisplayType={formattedDisplayType} customLinkedCredentialsComponent={customLinkedCredentialsComponent} customBodyContentSlot={customBodyContentSlot} - unknownVerifierTitle={unknownVerifierTitle} - hideAwardedTo={hideAwardedTo} - hideFrontFaceDetails={hideFrontFaceDetails} /> ); } else if (credential?.display?.displayType === 'id' || categoryType === 'ID') { @@ -288,7 +276,6 @@ export const VCDisplayCard2: React.FC = ({ customIDDescription={customIDDescription} hideGradientBackground={hideGradientBackground} customLinkedCredentialsComponent={customLinkedCredentialsComponent} - unknownVerifierTitle={unknownVerifierTitle} />
); @@ -397,7 +384,6 @@ export const VCDisplayCard2: React.FC = ({ imageUrl={imageUrl} knownDIDRegistry={knownDIDRegistry} customBodyContentSlot={customBodyContentSlot} - unknownVerifierTitle={unknownVerifierTitle} /> )} {!isFront && ( diff --git a/packages/react-learn-card/src/components/VCDisplayCard2/VCIDDIsplayCard.tsx b/packages/react-learn-card/src/components/VCDisplayCard2/VCIDDIsplayCard.tsx index 09af0a73a0..8445d355f1 100644 --- a/packages/react-learn-card/src/components/VCDisplayCard2/VCIDDIsplayCard.tsx +++ b/packages/react-learn-card/src/components/VCDisplayCard2/VCIDDIsplayCard.tsx @@ -37,7 +37,6 @@ export type VCIDDisplayCardProps = { customIDDescription?: React.ReactNode; hideGradientBackground?: boolean; customLinkedCredentialsComponent?: React.ReactNode; - unknownVerifierTitle?: string; }; export const VCIDDisplayCard: React.FC = ({ @@ -64,7 +63,6 @@ export const VCIDDisplayCard: React.FC = ({ customIDDescription, hideGradientBackground = false, customLinkedCredentialsComponent, - unknownVerifierTitle, }) => { const [_isFront, _setIsFront] = useState(isFrontOverride ?? true); const isFront = isFrontOverride ?? _isFront; @@ -108,7 +106,6 @@ export const VCIDDisplayCard: React.FC = ({ qrCodeOnClick={qrCodeOnClick} hideQRCode={hideQRCode} customIDDescription={customIDDescription} - unknownVerifierTitle={unknownVerifierTitle} /> )} {!isFront && ( diff --git a/packages/react-learn-card/src/components/VCDisplayCard2/VCIDDisplayFrontFace.tsx b/packages/react-learn-card/src/components/VCDisplayCard2/VCIDDisplayFrontFace.tsx index d0a9e4daae..e0e48a24d8 100644 --- a/packages/react-learn-card/src/components/VCDisplayCard2/VCIDDisplayFrontFace.tsx +++ b/packages/react-learn-card/src/components/VCDisplayCard2/VCIDDisplayFrontFace.tsx @@ -26,7 +26,6 @@ type VCIDDisplayFrontFaceProps = { hideQRCode?: boolean; qrCodeOnClick?: () => void; customIDDescription?: React.ReactNode; - unknownVerifierTitle?: string; }; const VERIFIER_STATES = { @@ -47,7 +46,6 @@ const VCIDDisplayFrontFace: React.FC = ({ hideQRCode = false, qrCodeOnClick, customIDDescription, - unknownVerifierTitle, }) => { const { credentialSubject } = getInfoFromCredential(credential, 'MMM dd, yyyy', { uppercaseDate: false, @@ -61,8 +59,6 @@ const VCIDDisplayFrontFace: React.FC = ({ // the extra "&& issuerDid" is so that the credential preview doesn't say "Self Verified" // the did:example:123 condition is so that we don't show this status from the Manage Boosts tab verifierState = VERIFIER_STATES.selfVerified; - } else if (unknownVerifierTitle) { - verifierState = VERIFIER_STATES.trustedVerifier; } else { if (knownDIDRegistry?.source === 'trusted') { verifierState = VERIFIER_STATES.trustedVerifier; @@ -153,9 +149,9 @@ const VCIDDisplayFrontFace: React.FC = ({ )} {verifierState === VERIFIER_STATES.trustedVerifier && ( - + - {unknownVerifierTitle ?? 'Trusted Issuer'} + Trusted Issuer )} {verifierState === VERIFIER_STATES.unknownVerifier && ( diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2afb5ec215..58cc6fd0e3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5,7 +5,6 @@ settings: excludeLinksFromLockfile: false overrides: - fastify: 5.7.2 pvutils: 1.0.17 did-jwt: 5.9.0 typescript: 5.6.2 @@ -59,8 +58,8 @@ importers: specifier: ^3.25.1 version: 3.47.0 firebase: - specifier: 12.8.0 - version: 12.8.0 + specifier: 11.10.0 + version: 11.10.0 history: specifier: 4.10.1 version: 4.10.1 @@ -174,77 +173,77 @@ importers: apps/learn-card-app: dependencies: '@capacitor-community/media': - specifier: ^9.0.0 - version: 9.0.1(@capacitor/core@8.0.1) + specifier: ^8.0.1 + version: 8.0.1(@capacitor/core@7.4.2) '@capacitor-community/sqlite': specifier: ^7.0.1 - version: 7.0.2(@capacitor/core@8.0.1) + version: 7.0.2(@capacitor/core@7.4.2) '@capacitor-firebase/analytics': - specifier: 8.0.1 - version: 8.0.1(@capacitor/core@8.0.1)(firebase@12.8.0) + specifier: 7.3.0 + version: 7.3.0(@capacitor/core@7.4.2)(firebase@11.10.0) '@capacitor-firebase/authentication': - specifier: ^8.0.1 - version: 8.0.1(@capacitor/core@8.0.1)(firebase@12.8.0) + specifier: ^7.3.0 + version: 7.4.0(@capacitor/core@7.4.2)(firebase@11.10.0) '@capacitor-mlkit/barcode-scanning': - specifier: ^8.0.0 - version: 8.0.0(@capacitor/core@8.0.1) + specifier: ^7.3.0 + version: 7.3.0(@capacitor/core@7.4.2) '@capacitor/android': - specifier: ^8.0.1 - version: 8.0.1(@capacitor/core@8.0.1) + specifier: ^7.4.2 + version: 7.4.4(@capacitor/core@7.4.2) '@capacitor/app': - specifier: ^8.0.0 - version: 8.0.0(@capacitor/core@8.0.1) + specifier: ^7.0.2 + version: 7.1.0(@capacitor/core@7.4.2) '@capacitor/browser': - specifier: ^8.0.0 - version: 8.0.0(@capacitor/core@8.0.1) + specifier: ^7.0.2 + version: 7.0.2(@capacitor/core@7.4.2) '@capacitor/camera': - specifier: ^8.0.0 - version: 8.0.0(@capacitor/core@8.0.1) + specifier: ^7.0.2 + version: 7.0.2(@capacitor/core@7.4.2) '@capacitor/clipboard': - specifier: ^8.0.0 - version: 8.0.0(@capacitor/core@8.0.1) + specifier: ^7.0.2 + version: 7.0.2(@capacitor/core@7.4.2) '@capacitor/core': - specifier: 8.0.1 - version: 8.0.1 + specifier: 7.4.2 + version: 7.4.2 '@capacitor/file-transfer': - specifier: ^2.0.3 - version: 2.0.3(@capacitor/core@8.0.1) + specifier: ^1.0.6 + version: 1.0.6(@capacitor/core@7.4.2) '@capacitor/filesystem': - specifier: ^8.0.0 - version: 8.1.0(@capacitor/core@8.0.1) + specifier: ^7.1.4 + version: 7.1.5(@capacitor/core@7.4.2) '@capacitor/haptics': - specifier: ^8.0.0 - version: 8.0.0(@capacitor/core@8.0.1) + specifier: ^7.0.2 + version: 7.0.2(@capacitor/core@7.4.2) '@capacitor/ios': - specifier: ^8.0.1 - version: 8.0.1(@capacitor/core@8.0.1) + specifier: ^7.4.2 + version: 7.4.4(@capacitor/core@7.4.2) '@capacitor/keyboard': - specifier: ^8.0.0 - version: 8.0.0(@capacitor/core@8.0.1) + specifier: ^7.0.2 + version: 7.0.3(@capacitor/core@7.4.2) '@capacitor/local-notifications': - specifier: ^8.0.0 - version: 8.0.0(@capacitor/core@8.0.1) + specifier: ^7.0.2 + version: 7.0.3(@capacitor/core@7.4.2) '@capacitor/network': - specifier: ^8.0.0 - version: 8.0.0(@capacitor/core@8.0.1) + specifier: ^7.0.2 + version: 7.0.2(@capacitor/core@7.4.2) '@capacitor/push-notifications': - specifier: ^8.0.0 - version: 8.0.0(@capacitor/core@8.0.1) + specifier: ^7.0.2 + version: 7.0.3(@capacitor/core@7.4.2) '@capacitor/share': - specifier: ^8.0.0 - version: 8.0.0(@capacitor/core@8.0.1) + specifier: ^7.0.2 + version: 7.0.2(@capacitor/core@7.4.2) '@capacitor/splash-screen': - specifier: ^8.0.0 - version: 8.0.0(@capacitor/core@8.0.1) + specifier: ^7.0.2 + version: 7.0.3(@capacitor/core@7.4.2) '@capacitor/status-bar': - specifier: ^8.0.0 - version: 8.0.0(@capacitor/core@8.0.1) + specifier: ^7.0.2 + version: 7.0.3(@capacitor/core@7.4.2) '@capawesome/capacitor-badge': - specifier: 8.0.0 - version: 8.0.0(@capacitor/core@8.0.1) + specifier: 7.0.1 + version: 7.0.1(@capacitor/core@7.4.2) '@capgo/capacitor-updater': - specifier: 8.41.12 - version: 8.41.12(@capacitor/core@8.0.1) + specifier: 7.8.7 + version: 7.8.7(@capacitor/core@7.4.2) '@emoji-mart/data': specifier: ^1.2.1 version: 1.2.1 @@ -290,9 +289,12 @@ importers: '@testing-library/jest-dom': specifier: ^5.17.0 version: 5.17.0 + '@testing-library/react': + specifier: ^11.2.7 + version: 11.2.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@testing-library/user-event': specifier: ^12.8.3 - version: 12.8.3(@testing-library/dom@9.3.4) + version: 12.8.3(@testing-library/dom@8.20.1) '@types/jest': specifier: ^26.0.24 version: 26.0.24 @@ -316,7 +318,7 @@ importers: version: 9.7.0(@babel/runtime@7.28.4)(bufferutil@4.0.9)(typescript@5.6.2)(utf-8-validate@5.0.10)(zod@4.1.13) '@web3auth/no-modal': specifier: ^10.2.0 - version: 10.9.0(@babel/runtime@7.28.4)(@netlify/blobs@10.5.0)(@sentry/core@9.47.1)(bufferutil@4.0.9)(color@5.0.3)(ioredis@5.8.2)(react@18.3.1)(typescript@5.6.2)(utf-8-validate@5.0.10)(viem@2.40.4(bufferutil@4.0.9)(typescript@5.6.2)(utf-8-validate@5.0.10)(zod@4.1.13))(zod@4.1.13) + version: 10.8.0(@babel/runtime@7.28.4)(@netlify/blobs@10.5.0)(@sentry/core@9.47.1)(bufferutil@4.0.9)(color@5.0.3)(ioredis@5.8.2)(react@18.3.1)(typescript@5.6.2)(utf-8-validate@5.0.10)(viem@2.39.3(bufferutil@4.0.9)(typescript@5.6.2)(utf-8-validate@5.0.10)(zod@4.1.13))(zod@4.1.13) '@web3auth/openlogin-adapter': specifier: ^8.12.4 version: 8.12.4(@babel/runtime@7.28.4)(bufferutil@4.0.9)(utf-8-validate@5.0.10) @@ -342,11 +344,11 @@ importers: specifier: ^6.0.3 version: 6.0.3 capacitor-native-settings: - specifier: ^7.0.2 - version: 7.0.2(@capacitor/core@8.0.1) + specifier: ^7.0.1 + version: 7.0.2(@capacitor/core@7.4.2) capacitor-plugin-safe-area: - specifier: ^5.0.0 - version: 5.0.0(@capacitor/core@8.0.1) + specifier: ^4.0.0 + version: 4.0.3(@capacitor/core@7.4.2) crypto-js: specifier: ^4.2.0 version: 4.2.0 @@ -354,8 +356,8 @@ importers: specifier: ^4.12.0 version: 4.15.1(react@18.3.1) firebase: - specifier: 12.8.0 - version: 12.8.0 + specifier: 11.10.0 + version: 11.10.0 history: specifier: 4.10.1 version: 4.10.1 @@ -461,6 +463,9 @@ importers: react-shiki: specifier: ^0.5.3 version: 0.5.3(@types/react@18.3.27)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + recharts: + specifier: ^3.6.0 + version: 3.6.0(@types/react@18.3.27)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(redux@5.0.1) rehype-katex: specifier: ^7.0.1 version: 7.0.1 @@ -502,8 +507,8 @@ importers: specifier: ^3.0.5 version: 3.0.5(@swc/core@1.15.2(@swc/helpers@0.5.17))(@types/node@12.20.55)(typescript@5.6.2) '@capacitor/cli': - specifier: ^8.0.1 - version: 8.0.1 + specifier: ^7.0.1 + version: 7.4.4 '@capgo/cli': specifier: ^7.2.10 version: 7.29.1 @@ -522,9 +527,6 @@ importers: '@tailwindcss/typography': specifier: ^0.5.16 version: 0.5.19(tailwindcss@3.4.18(tsx@4.20.6)(yaml@2.8.1)) - '@testing-library/react': - specifier: ^14.3.1 - version: 14.3.1(@types/react@18.3.27)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@types/async': specifier: ^3.2.24 version: 3.2.25 @@ -570,75 +572,72 @@ importers: vite-tsconfig-paths: specifier: 4.2.3 version: 4.2.3(typescript@5.6.2)(vite@4.3.8(@types/node@12.20.55)(less@4.4.2)(sass@1.94.2)(terser@5.44.1)) - vitest: - specifier: ^3.0.0 - version: 3.2.4(@types/debug@4.1.12)(@types/node@12.20.55)(happy-dom@14.12.3)(jsdom@25.0.1(bufferutil@4.0.9)(utf-8-validate@5.0.10))(less@4.4.2)(lightningcss@1.30.2)(sass@1.94.2)(terser@5.44.1) apps/scouts: dependencies: '@capacitor-community/sqlite': specifier: ^7.0.1 - version: 7.0.2(@capacitor/core@8.0.1) + version: 7.0.2(@capacitor/core@7.4.2) '@capacitor-firebase/analytics': - specifier: 8.0.1 - version: 8.0.1(@capacitor/core@8.0.1)(firebase@12.8.0) + specifier: 7.3.0 + version: 7.3.0(@capacitor/core@7.4.2)(firebase@11.10.0) '@capacitor-firebase/authentication': - specifier: ^8.0.1 - version: 8.0.1(@capacitor/core@8.0.1)(firebase@12.8.0) + specifier: ^7.3.0 + version: 7.4.0(@capacitor/core@7.4.2)(firebase@11.10.0) '@capacitor-mlkit/barcode-scanning': - specifier: ^8.0.0 - version: 8.0.0(@capacitor/core@8.0.1) + specifier: ^7.3.0 + version: 7.3.0(@capacitor/core@7.4.2) '@capacitor/android': - specifier: ^8.0.1 - version: 8.0.1(@capacitor/core@8.0.1) + specifier: ^7.4.2 + version: 7.4.4(@capacitor/core@7.4.2) '@capacitor/app': - specifier: ^8.0.0 - version: 8.0.0(@capacitor/core@8.0.1) + specifier: ^7.0.2 + version: 7.1.0(@capacitor/core@7.4.2) '@capacitor/browser': - specifier: ^8.0.0 - version: 8.0.0(@capacitor/core@8.0.1) + specifier: ^7.0.2 + version: 7.0.2(@capacitor/core@7.4.2) '@capacitor/camera': - specifier: ^8.0.0 - version: 8.0.0(@capacitor/core@8.0.1) + specifier: ^7.0.2 + version: 7.0.2(@capacitor/core@7.4.2) '@capacitor/clipboard': - specifier: ^8.0.0 - version: 8.0.0(@capacitor/core@8.0.1) + specifier: ^7.0.2 + version: 7.0.2(@capacitor/core@7.4.2) '@capacitor/core': - specifier: 8.0.1 - version: 8.0.1 + specifier: 7.4.2 + version: 7.4.2 '@capacitor/haptics': - specifier: ^8.0.0 - version: 8.0.0(@capacitor/core@8.0.1) + specifier: ^7.0.2 + version: 7.0.2(@capacitor/core@7.4.2) '@capacitor/ios': - specifier: ^8.0.1 - version: 8.0.1(@capacitor/core@8.0.1) + specifier: ^7.4.2 + version: 7.4.4(@capacitor/core@7.4.2) '@capacitor/keyboard': - specifier: ^8.0.0 - version: 8.0.0(@capacitor/core@8.0.1) + specifier: ^7.0.2 + version: 7.0.3(@capacitor/core@7.4.2) '@capacitor/local-notifications': - specifier: ^8.0.0 - version: 8.0.0(@capacitor/core@8.0.1) + specifier: ^7.0.2 + version: 7.0.3(@capacitor/core@7.4.2) '@capacitor/network': - specifier: ^8.0.0 - version: 8.0.0(@capacitor/core@8.0.1) + specifier: ^7.0.2 + version: 7.0.2(@capacitor/core@7.4.2) '@capacitor/push-notifications': - specifier: ^8.0.0 - version: 8.0.0(@capacitor/core@8.0.1) + specifier: ^7.0.2 + version: 7.0.3(@capacitor/core@7.4.2) '@capacitor/share': - specifier: ^8.0.0 - version: 8.0.0(@capacitor/core@8.0.1) + specifier: ^7.0.2 + version: 7.0.2(@capacitor/core@7.4.2) '@capacitor/splash-screen': - specifier: ^8.0.0 - version: 8.0.0(@capacitor/core@8.0.1) + specifier: ^7.0.2 + version: 7.0.3(@capacitor/core@7.4.2) '@capacitor/status-bar': - specifier: ^8.0.0 - version: 8.0.0(@capacitor/core@8.0.1) + specifier: ^7.0.2 + version: 7.0.3(@capacitor/core@7.4.2) '@capawesome/capacitor-badge': - specifier: 8.0.0 - version: 8.0.0(@capacitor/core@8.0.1) + specifier: 7.0.1 + version: 7.0.1(@capacitor/core@7.4.2) '@capgo/capacitor-updater': - specifier: 8.41.12 - version: 8.41.12(@capacitor/core@8.0.1) + specifier: 7.8.7 + version: 7.8.7(@capacitor/core@7.4.2) '@datadog/browser-logs': specifier: ^4.50.1 version: 4.50.1 @@ -680,7 +679,7 @@ importers: version: 11.2.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@testing-library/user-event': specifier: ^12.8.3 - version: 12.8.3(@testing-library/dom@9.3.4) + version: 12.8.3(@testing-library/dom@8.20.1) '@types/jest': specifier: ^26.0.24 version: 26.0.24 @@ -710,7 +709,7 @@ importers: version: 9.7.0(@babel/runtime@7.28.4)(bufferutil@4.0.9)(typescript@5.6.2)(utf-8-validate@5.0.10)(zod@4.1.13) '@web3auth/no-modal': specifier: ^10.2.0 - version: 10.9.0(@babel/runtime@7.28.4)(@netlify/blobs@10.5.0)(@sentry/core@9.47.1)(bufferutil@4.0.9)(color@5.0.3)(ioredis@5.8.2)(react@18.3.1)(typescript@5.6.2)(utf-8-validate@5.0.10)(viem@2.40.4(bufferutil@4.0.9)(typescript@5.6.2)(utf-8-validate@5.0.10)(zod@4.1.13))(zod@4.1.13) + version: 10.8.0(@babel/runtime@7.28.4)(@netlify/blobs@10.5.0)(@sentry/core@9.47.1)(bufferutil@4.0.9)(color@5.0.3)(ioredis@5.8.2)(react@18.3.1)(typescript@5.6.2)(utf-8-validate@5.0.10)(viem@2.39.3(bufferutil@4.0.9)(typescript@5.6.2)(utf-8-validate@5.0.10)(zod@4.1.13))(zod@4.1.13) '@web3auth/openlogin-adapter': specifier: ^8.12.4 version: 8.12.4(@babel/runtime@7.28.4)(bufferutil@4.0.9)(utf-8-validate@5.0.10) @@ -724,11 +723,11 @@ importers: specifier: ^6.0.3 version: 6.0.3 capacitor-native-settings: - specifier: ^7.0.2 - version: 7.0.2(@capacitor/core@8.0.1) + specifier: ^7.0.1 + version: 7.0.2(@capacitor/core@7.4.2) capacitor-plugin-safe-area: - specifier: ^5.0.0 - version: 5.0.0(@capacitor/core@8.0.1) + specifier: ^4.0.0 + version: 4.0.3(@capacitor/core@7.4.2) capacitor-standard-version: specifier: ^1.1.21 version: 1.1.55(bufferutil@4.0.9)(utf-8-validate@5.0.10) @@ -742,8 +741,8 @@ importers: specifier: ^4.1.0 version: 4.1.0 firebase: - specifier: 12.8.0 - version: 12.8.0 + specifier: 11.10.0 + version: 11.10.0 immer: specifier: ^10.1.1 version: 10.2.0 @@ -848,8 +847,8 @@ importers: version: 3.7.2(react@18.3.1) devDependencies: '@capacitor/cli': - specifier: ^8.0.1 - version: 8.0.1 + specifier: ^7.0.1 + version: 7.4.4 '@esbuild-plugins/node-globals-polyfill': specifier: ^0.2.3 version: 0.2.3(esbuild@0.27.2) @@ -1178,28 +1177,28 @@ importers: dependencies: '@capacitor-community/sqlite': specifier: ^7.0.1 - version: 7.0.2(@capacitor/core@8.0.1) + version: 7.0.2(@capacitor/core@7.4.2) '@capacitor/app': - specifier: ^8.0.0 - version: 8.0.0(@capacitor/core@8.0.1) + specifier: ^7.0.2 + version: 7.1.0(@capacitor/core@7.4.2) '@capacitor/browser': - specifier: ^8.0.0 - version: 8.0.0(@capacitor/core@8.0.1) + specifier: ^7.0.2 + version: 7.0.2(@capacitor/core@7.4.2) '@capacitor/camera': - specifier: ^8.0.0 - version: 8.0.0(@capacitor/core@8.0.1) + specifier: ^7.0.2 + version: 7.0.2(@capacitor/core@7.4.2) '@capacitor/clipboard': - specifier: ^8.0.0 - version: 8.0.0(@capacitor/core@8.0.1) + specifier: ^7.0.2 + version: 7.0.2(@capacitor/core@7.4.2) '@capacitor/core': - specifier: 8.0.1 - version: 8.0.1 + specifier: 7.4.2 + version: 7.4.2 '@capacitor/keyboard': - specifier: ^8.0.0 - version: 8.0.0(@capacitor/core@8.0.1) + specifier: ^7.0.2 + version: 7.0.3(@capacitor/core@7.4.2) '@capacitor/push-notifications': - specifier: ^8.0.0 - version: 8.0.0(@capacitor/core@8.0.1) + specifier: ^7.0.2 + version: 7.0.3(@capacitor/core@7.4.2) '@digitalcredentials/issuer-registry-client': specifier: ^3.2.0-beta.5 version: 3.2.0-beta.5 @@ -1229,7 +1228,7 @@ importers: version: 9.7.0(@babel/runtime@7.28.4)(bufferutil@4.0.9)(typescript@5.6.2)(utf-8-validate@5.0.10)(zod@4.1.13) '@web3auth/no-modal': specifier: ^10.2.0 - version: 10.9.0(@babel/runtime@7.28.4)(@netlify/blobs@10.5.0)(@sentry/core@9.47.1)(bufferutil@4.0.9)(color@5.0.3)(ioredis@5.8.2)(react@18.3.1)(typescript@5.6.2)(utf-8-validate@5.0.10)(viem@2.40.4(bufferutil@4.0.9)(typescript@5.6.2)(utf-8-validate@5.0.10)(zod@4.1.13))(zod@4.1.13) + version: 10.8.0(@babel/runtime@7.28.4)(@netlify/blobs@10.5.0)(@sentry/core@9.47.1)(bufferutil@4.0.9)(color@5.0.3)(ioredis@5.8.2)(react@18.3.1)(typescript@5.6.2)(utf-8-validate@5.0.10)(viem@2.39.3(bufferutil@4.0.9)(typescript@5.6.2)(utf-8-validate@5.0.10)(zod@4.1.13))(zod@4.1.13) '@web3auth/openlogin-adapter': specifier: ^8.12.4 version: 8.12.4(@babel/runtime@7.28.4)(bufferutil@4.0.9)(utf-8-validate@5.0.10) @@ -1243,8 +1242,8 @@ importers: specifier: ^0.27.2 version: 0.27.2 capacitor-plugin-safe-area: - specifier: ^5.0.0 - version: 5.0.0(@capacitor/core@8.0.1) + specifier: ^4.0.0 + version: 4.0.3(@capacitor/core@7.4.2) class-variance-authority: specifier: 0.7.0 version: 0.7.0 @@ -1673,9 +1672,6 @@ importers: '@learncard/didkit-plugin': specifier: workspace:* version: link:../plugins/didkit - '@learncard/didkit-plugin-node': - specifier: workspace:* - version: link:../plugins/didkit-plugin-node '@learncard/dynamic-loader-plugin': specifier: workspace:* version: link:../plugins/dynamic-loader @@ -2199,25 +2195,6 @@ importers: specifier: ^29.0.3 version: 29.4.5(@babel/core@7.28.5)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.5))(esbuild@0.27.1)(jest-util@29.7.0)(jest@29.7.0(@types/node@17.0.45)(ts-node@10.9.2(@swc/core@1.15.2(@swc/helpers@0.5.17))(@types/node@17.0.45)(typescript@5.6.2)))(typescript@5.6.2) - packages/plugins/didkit-plugin-node: - dependencies: - '@learncard/core': - specifier: workspace:* - version: link:../../learn-card-core - '@learncard/didkit-plugin': - specifier: workspace:* - version: link:../didkit - '@learncard/types': - specifier: workspace:* - version: link:../../learn-card-types - devDependencies: - '@napi-rs/cli': - specifier: ^2.18.0 - version: 2.18.4 - typescript: - specifier: 5.6.2 - version: 5.6.2 - packages/plugins/dynamic-loader: dependencies: '@learncard/core': @@ -3227,17 +3204,17 @@ importers: specifier: ^3.2.0-beta.5 version: 3.2.0-beta.5 '@fastify/cors': - specifier: ^11.2.0 - version: 11.2.0 + specifier: ^9.0.1 + version: 9.0.1 '@fastify/static': - specifier: ^9.0.0 - version: 9.0.0 + specifier: ^7.0.4 + version: 7.0.4 '@fastify/swagger': - specifier: ^9.6.1 - version: 9.6.1 + specifier: ^8.15.0 + version: 8.15.0 '@fastify/swagger-ui': - specifier: ^5.2.4 - version: 5.2.4 + specifier: ^4.1.0 + version: 4.2.0 '@learncard/core': specifier: workspace:* version: link:../../../packages/learn-card-core @@ -3251,11 +3228,8 @@ importers: specifier: workspace:* version: link:../../../packages/plugins/didkey '@learncard/didkit-plugin': - specifier: workspace:* + specifier: workspace:^ version: link:../../../packages/plugins/didkit - '@learncard/didkit-plugin-node': - specifier: workspace:* - version: link:../../../packages/plugins/didkit-plugin-node '@learncard/encryption-plugin': specifier: workspace:* version: link:../../../packages/plugins/encryption @@ -3302,11 +3276,11 @@ importers: specifier: ^4.18.2 version: 4.21.2 fastify: - specifier: 5.7.2 - version: 5.7.2 + specifier: ^4.28.1 + version: 4.29.1 fastify-plugin: - specifier: ^5.1.0 - version: 5.1.0 + specifier: ^4.5.1 + version: 4.5.1 ioredis: specifier: ^5.2.2 version: 5.8.2 @@ -3432,11 +3406,11 @@ importers: services/learn-card-network/lca-api: dependencies: '@fastify/cors': - specifier: ^11.2.0 - version: 11.2.0 + specifier: ^9.0.1 + version: 9.0.1 '@fastify/static': - specifier: ^9.0.0 - version: 9.0.0 + specifier: ^7.0.4 + version: 7.0.4 '@learncard/core': specifier: workspace:* version: link:../../../packages/learn-card-core @@ -3446,9 +3420,6 @@ importers: '@learncard/didkit-plugin': specifier: workspace:* version: link:../../../packages/plugins/didkit - '@learncard/didkit-plugin-node': - specifier: workspace:* - version: link:../../../packages/plugins/didkit-plugin-node '@learncard/init': specifier: workspace:* version: link:../../../packages/learn-card-init @@ -3483,8 +3454,8 @@ importers: specifier: ^4.18.2 version: 4.21.2 fastify: - specifier: 5.7.2 - version: 5.7.2 + specifier: ^4.28.1 + version: 4.29.1 filestack-js: specifier: ^3.24.0 version: 3.44.2(@swc/core@1.15.2(@swc/helpers@0.5.17))(@types/node@18.19.130)(typescript@5.6.2) @@ -3568,14 +3539,14 @@ importers: specifier: ^6.4.4 version: 6.4.4 serverless-esbuild: - specifier: 1.55.0 + specifier: ^1.41.0 version: 1.55.0(bufferutil@4.0.9)(esbuild@0.27.1)(utf-8-validate@5.0.10) serverless-http: - specifier: 3.2.0 + specifier: ^3.1.1 version: 3.2.0 serverless-offline: - specifier: ^14.4.0 - version: 14.4.0(bufferutil@4.0.9)(serverless@3.40.0(@types/node@18.19.130)(bufferutil@4.0.9)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + specifier: ^12.0.4 + version: 12.0.4(@types/node@18.19.130)(bufferutil@4.0.9)(serverless@3.40.0(@types/node@18.19.130)(bufferutil@4.0.9)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) serverless-prune-plugin: specifier: ^2.1.0 version: 2.1.0(serverless@3.40.0(@types/node@18.19.130)(bufferutil@4.0.9)(utf-8-validate@5.0.10)) @@ -3586,11 +3557,11 @@ importers: services/learn-card-network/learn-cloud-service: dependencies: '@fastify/cors': - specifier: ^11.2.0 - version: 11.2.0 + specifier: ^9.0.1 + version: 9.0.1 '@fastify/static': - specifier: ^9.0.0 - version: 9.0.0 + specifier: ^7.0.4 + version: 7.0.4 '@learncard/core': specifier: workspace:* version: link:../../../packages/learn-card-core @@ -3606,9 +3577,6 @@ importers: '@learncard/didkit-plugin': specifier: workspace:^ version: link:../../../packages/plugins/didkit - '@learncard/didkit-plugin-node': - specifier: workspace:* - version: link:../../../packages/plugins/didkit-plugin-node '@learncard/encryption-plugin': specifier: workspace:* version: link:../../../packages/plugins/encryption @@ -3661,8 +3629,8 @@ importers: specifier: ^4.18.2 version: 4.21.2 fastify: - specifier: 5.7.2 - version: 5.7.2 + specifier: ^4.28.1 + version: 4.29.1 ioredis: specifier: ^5.2.2 version: 5.8.2 @@ -3797,11 +3765,11 @@ importers: specifier: ^3.370.0 version: 3.936.0 '@fastify/cors': - specifier: ^11.2.0 - version: 11.2.0 + specifier: ^9.0.1 + version: 9.0.1 '@fastify/static': - specifier: ^9.0.0 - version: 9.0.0 + specifier: ^7.0.4 + version: 7.0.4 '@learncard/core': specifier: workspace:* version: link:../../../packages/learn-card-core @@ -3851,8 +3819,8 @@ importers: specifier: ^4.18.2 version: 4.21.2 fastify: - specifier: 5.7.2 - version: 5.7.2 + specifier: ^4.28.1 + version: 4.29.1 ioredis: specifier: ^5.2.2 version: 5.8.2 @@ -4006,8 +3974,8 @@ importers: services/playwright-delete-service: dependencies: fastify: - specifier: 5.7.2 - version: 5.7.2 + specifier: ^5.0.0 + version: 5.6.2 ioredis: specifier: ^5.2.2 version: 5.8.2 @@ -4022,25 +3990,6 @@ importers: specifier: ^3.1.7 version: 3.1.11 - tests/benchmarking: - dependencies: - '@learncard/didkit-plugin-node': - specifier: workspace:* - version: link:../../packages/plugins/didkit-plugin-node - '@learncard/init': - specifier: workspace:* - version: link:../../packages/learn-card-init - devDependencies: - '@types/node': - specifier: ^20.0.0 - version: 20.19.27 - ts-node: - specifier: ^10.9.2 - version: 10.9.2(@swc/core@1.15.2(@swc/helpers@0.5.17))(@types/node@20.19.27)(typescript@5.6.2) - typescript: - specifier: 5.6.2 - version: 5.6.2 - tests/e2e: dependencies: '@learncard/core': @@ -5333,10 +5282,10 @@ packages: '@bcoe/v8-coverage@0.2.3': resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} - '@capacitor-community/media@9.0.1': - resolution: {integrity: sha512-MYTaEQduZc0vpzDX/glMQjPYdYUm/17I5sQslnpvk91e+xjpJkjRYNh11vtWzlR7WZpxf1X1ScqtGhR6B2F65Q==} + '@capacitor-community/media@8.0.1': + resolution: {integrity: sha512-u4+f7iVQV6BdsDi0MeQigJpwRztfuzsRTskwp1YS6nAS+6Gg5zLFOW/vnQgnpPIJQBO54plb4UZQYE9Wv/1Yxw==} peerDependencies: - '@capacitor/core': '>=8.0.0' + '@capacitor/core': '>=7.0.0' '@capacitor-community/sqlite@7.0.2': resolution: {integrity: sha512-TkxvuLgVCSmme/NSUEE2xopTVMwMqdT6+zH9pH8g76DMdi2z+ZsPEATQnJchGw4YAhhiQ8vTYxIP9se3/zkhGg==} @@ -5344,139 +5293,139 @@ packages: peerDependencies: '@capacitor/core': '>=7.0.0' - '@capacitor-firebase/analytics@8.0.1': - resolution: {integrity: sha512-/s8T6BhGwML6z4zGxRIfy2TE89ybric+v2yXCd1xscS4jV4ejv9l+TGZioEi0MvFDZyWdQoSCvgnFI0OKM+PRg==} + '@capacitor-firebase/analytics@7.3.0': + resolution: {integrity: sha512-+yeeaZO3O320OPOgIJRb206ZxwhxMiFRdpbHxlB/C84HlN7vRXubWRxrLVo1US12jkSsjNzk6FGNQhOmgJ6jmA==} peerDependencies: - '@capacitor/core': '>=8.0.0' - firebase: ^12.6.0 + '@capacitor/core': '>=7.0.0' + firebase: ^11.2.0 peerDependenciesMeta: firebase: optional: true - '@capacitor-firebase/authentication@8.0.1': - resolution: {integrity: sha512-F9ocfBGAnMGSvZ7dfwcqACS17HFZEF7B3dSbao34ZBxo5wCDikCROX/T6L5jNq2CGX4ByLOpOmvvzfH+nT5w3A==} + '@capacitor-firebase/authentication@7.4.0': + resolution: {integrity: sha512-T1ygiWfIguqGUmap87Gh836nCpnOm0C43v6O2xwrowCSx7442khs20NScm2cOebba5PX1aLWwZL19BENV148Yg==} peerDependencies: - '@capacitor/core': '>=8.0.0' - firebase: ^12.6.0 + '@capacitor/core': '>=7.0.0' + firebase: ^11.2.0 peerDependenciesMeta: firebase: optional: true - '@capacitor-mlkit/barcode-scanning@8.0.0': - resolution: {integrity: sha512-1bmCv26ml1/Vb6YKwMv9dzkVcpPwPGehx3jmcXMdTg2eFg7zgMyWswlbTL5vfIUazC5JbEIc0f6sOG6W2N03nQ==} + '@capacitor-mlkit/barcode-scanning@7.3.0': + resolution: {integrity: sha512-pgSbNw0illjIpOXJKC/A/1a3xn4cgCNubhymOhz/Qdu2ZoplhYvpnOlEYpfRcdeXAM9M+682pS8qFyrez6a84A==} peerDependencies: - '@capacitor/core': '>=8.0.0' + '@capacitor/core': '>=7.0.0' - '@capacitor/android@8.0.1': - resolution: {integrity: sha512-Mrk2MFKSg9YA4BPLKm03wwFnGKcvzNBERUTcxjW1NkLrF6YhJwygAT69f/YGopFvOhhqdnDPsuZuASUfmpkSpw==} + '@capacitor/android@7.4.4': + resolution: {integrity: sha512-y8knfV1JXNrd6XZZLZireGT+EBCN0lvOo+HZ/s7L8LkrPBu4nY5UZn0Wxz4yOezItEII9rqYJSHsS5fMJG9gdw==} peerDependencies: - '@capacitor/core': ^8.0.0 + '@capacitor/core': ^7.4.0 - '@capacitor/app@8.0.0': - resolution: {integrity: sha512-OwzIkUs4w433Bu9WWAEbEYngXEfJXZ9Wmdb8eoaqzYBgB0W9/3Ed/mh6sAYPNBAZlpyarmewgP7Nb+d3Vrh+xA==} + '@capacitor/app@7.1.0': + resolution: {integrity: sha512-W7m09IWrUjZbo7AKeq+rc/KyucxrJekTBg0l4QCm/yDtCejE3hebxp/W2esU26KKCzMc7H3ClkUw32E9lZkwRA==} peerDependencies: - '@capacitor/core': '>=8.0.0' + '@capacitor/core': '>=7.0.0' '@capacitor/assets@3.0.5': resolution: {integrity: sha512-ohz/OUq61Y1Fc6aVSt0uDrUdeOA7oTH4pkWDbv/8I3UrPjH7oPkzYhShuDRUjekNp9RBi198VSFdt0CetpEOzw==} engines: {node: '>=10.3.0'} hasBin: true - '@capacitor/browser@8.0.0': - resolution: {integrity: sha512-xey7maszGABKuStvXDV4vXN+EzIyz0o7zlyzw4JKG6o/1GzqeqHqVuE+8Ux+Hks3DZji4LoriWZVgVF6mR6RGg==} + '@capacitor/browser@7.0.2': + resolution: {integrity: sha512-5kySTunCtH+2sezmTjgDfwvspW7GW/hslQECZeLIRM2qefnxjGTc3fmCTeILYK5EuvcxMs+8sF5BhmzzKqOzuQ==} peerDependencies: - '@capacitor/core': '>=8.0.0' + '@capacitor/core': '>=7.0.0' - '@capacitor/camera@8.0.0': - resolution: {integrity: sha512-Iu8j2oxoIhY2mLuoEckbL7PFgw1XFm1nqmeWdIkILpcT3H9A+BrSDUDlzWqM/EeaDKo6JnhR59tYHwUhOdXaUg==} + '@capacitor/camera@7.0.2': + resolution: {integrity: sha512-1/UbZZ8MSbRTMMvjQHQFJ0cs2ZNURNoyuUex0rAJwECsyHO0I5SRvu7YoMY5qTcRWScBcqT+3QZcJvETtRg7ug==} peerDependencies: - '@capacitor/core': '>=8.0.0' + '@capacitor/core': '>=7.0.0' '@capacitor/cli@5.7.8': resolution: {integrity: sha512-qN8LDlREMhrYhOvVXahoJVNkP8LP55/YPRJrzTAFrMqlNJC18L3CzgWYIblFPnuwfbH/RxbfoZT/ydkwgVpMrw==} engines: {node: '>=16.0.0'} hasBin: true - '@capacitor/cli@8.0.1': - resolution: {integrity: sha512-okCNTsL8FNYrtPNeHWFjWb1S+PwBMhx5wFLhDC0MZOIrOLm+2ynMBtKu3BnR0Nv1hozoHcOCi6SuTF1TrRpb3w==} - engines: {node: '>=22.0.0'} + '@capacitor/cli@7.4.4': + resolution: {integrity: sha512-J7ciBE7GlJ70sr2s8oz1+H4ZdNk4MGG41fsakUlDHWva5UWgFIZYMiEdDvGbYazAYTaxN3lVZpH9zil9FfZj+Q==} + engines: {node: '>=20.0.0'} hasBin: true - '@capacitor/clipboard@8.0.0': - resolution: {integrity: sha512-nRgx07ThaoxOaTObZo/G39se9wA3oVgP0ooNO539P1TOZzWObwuXWObZgvaRJNpJfHVYcNe45Ylb8nlYl7VleA==} + '@capacitor/clipboard@7.0.2': + resolution: {integrity: sha512-Cm37cNPvSzuao3HlcrQT18py5WUfKdaNWBHFuQcubBzBuKhqtAC9P6xZ2d0ucPFdxvsEOgO7mjs2BWIpaKqpgg==} peerDependencies: - '@capacitor/core': '>=8.0.0' + '@capacitor/core': '>=7.0.0' - '@capacitor/core@8.0.1': - resolution: {integrity: sha512-5UqSWxGMp/B8KhYu7rAijqNtYslhcLh+TrbfU48PfdMDsPfaU/VY48sMNzC22xL8BmoFoql/3SKyP+pavTOvOA==} + '@capacitor/core@7.4.2': + resolution: {integrity: sha512-akCf9A1FUR8AWTtmgGjHEq6LmGsjA2U7igaJ9PxiCBfyxKqlDbuGHrlNdpvHEjV5tUPH3KYtkze6gtFcNKPU9A==} - '@capacitor/file-transfer@2.0.3': - resolution: {integrity: sha512-2r5zTot5qPaIiJzUF5o+MjtvfhV6f7XATFDhJtQIwvhQaFc7tGV0rVZNwf7LG7exoiJdgrWQk7ciSFQH3WUNpQ==} + '@capacitor/file-transfer@1.0.6': + resolution: {integrity: sha512-R4aGcolmn77hfGPA3+RGhH9YBX1xTR7H43WOcoQx56whWnIUTlQ3B6SQkd8912JPFHvnPhOJ4lC0yNCDY1TjrQ==} peerDependencies: - '@capacitor/core': '>=8.0.0' + '@capacitor/core': '>=7.0.0' - '@capacitor/filesystem@8.1.0': - resolution: {integrity: sha512-AfawIxQ8xBmKsEn/vEpgurGQB9+hFXRtwEiCXR+SSS0MkTw4bJrvLGnloZ/PblegYefvnay1q079Yz3PQ6y1dA==} + '@capacitor/filesystem@7.1.5': + resolution: {integrity: sha512-ZzJxpEh6SwKhF1cqSVmIAkEyNG3ozf3Lwg8rUNltX6CGdd94UJV45asqmFoP6X6aT5eVu7FPjPU5SHxi6XOFgA==} peerDependencies: - '@capacitor/core': '>=8.0.0' + '@capacitor/core': '>=7.0.0' - '@capacitor/haptics@8.0.0': - resolution: {integrity: sha512-DY1IUOjke1T4ITl7mFHQIKCaJJyHYAYRYHG9bVApU7PDOZiMVGMp48Yjzdqjya+wv/AHS5mDabSTUmhJ5uDvBA==} + '@capacitor/haptics@7.0.2': + resolution: {integrity: sha512-vqfeEM6s2zMgLjpITCTUIy7P/hadq/Gr5E/RClFgMJPB41Y5FsqOKD+j85/uwh8N2cf/aWaPeXUmjnTzJbEB2g==} peerDependencies: - '@capacitor/core': '>=8.0.0' + '@capacitor/core': '>=7.0.0' - '@capacitor/ios@8.0.1': - resolution: {integrity: sha512-pDxwQtx3n07DBhRKFGvYh4g00ruIsT7HxPm6IIT+tJD8VuTNgwgWYmEOZzfHkG6mZuCe03KqCsuD+aVmg5Rctg==} + '@capacitor/ios@7.4.4': + resolution: {integrity: sha512-Xp3bGWlSQAwsZGngRMWTdoD2agdMV12Whnm+/xsYPxfQSj+Tksbr7r/8Mso7VWkpnTKO4iMlx762g3PjW+wi4w==} peerDependencies: - '@capacitor/core': ^8.0.0 + '@capacitor/core': ^7.4.0 - '@capacitor/keyboard@8.0.0': - resolution: {integrity: sha512-ycPW6iQyFwzDK95jihesj5EGiyyGSfbBqNek11iNp9tBOB7zDeYkUA2S/vPpOETt3dhP6pWr7a9gNVGuEfj11g==} + '@capacitor/keyboard@7.0.3': + resolution: {integrity: sha512-BIBKjmky5rOYNhvYhNeDi0MMvjwYZ6YF9JoCYcGKvKY+XLJKtezsEL78XfOlgWZBkbfR8uq3tzktY6PqgoYLKA==} peerDependencies: - '@capacitor/core': '>=8.0.0' + '@capacitor/core': '>=7.0.0' - '@capacitor/local-notifications@8.0.0': - resolution: {integrity: sha512-Jn2IJs13vhRyOUtYni7PIPdMDYMILb4uI/rRAi7PmGg2lnaKbM5aWBmHZWt0laTYyVApYIbCWmdgBqWx/IH4dQ==} + '@capacitor/local-notifications@7.0.3': + resolution: {integrity: sha512-zVHZk5AYRiBwBDynaD7caPUROozgvwOG0L2SPFw1HBTWCscJvo0fsaE67NWW252jzel3PH0XogglJUYFx/jtHA==} peerDependencies: - '@capacitor/core': '>=8.0.0' + '@capacitor/core': '>=7.0.0' - '@capacitor/network@8.0.0': - resolution: {integrity: sha512-fgvB7pNKn8pKavuzys218j4YuA5euNfavp7nS3NuwWKWNupZAlbucfnl75lazxCyVF/ZRjzYVTb4vtTEfFrK1A==} + '@capacitor/network@7.0.2': + resolution: {integrity: sha512-KKkiUvGfMVKIcYaG+KlGAxrQtoRnwJtT+9yhTkCFzZWeYrY91sBZKOVOfnNHO8RiOxqbKn5VSUlyFLQQiyyfyg==} peerDependencies: - '@capacitor/core': '>=8.0.0' + '@capacitor/core': '>=7.0.0' - '@capacitor/push-notifications@8.0.0': - resolution: {integrity: sha512-xJWQLqAfC8b2ETqAPmwDnkKB4t/lVrbYc2D8VpA2fSu10JFSL/R722Vk0Lfl9Lo9WusmyIiQbVfILNQ3iFNGKw==} + '@capacitor/push-notifications@7.0.3': + resolution: {integrity: sha512-4qt5dRVBkHzq202NEoj3JC+S+zQCrZ1FJh7sjkICy/i1iEos+VaoB3bie8eWDQ2LTARktB4+k2xkdpu8pcVo/g==} peerDependencies: - '@capacitor/core': '>=8.0.0' + '@capacitor/core': '>=7.0.0' - '@capacitor/share@8.0.0': - resolution: {integrity: sha512-VU+xT4LFwr4keIC0UKDqGQVAiNlAHwoTMQg8wVVSxtn/k32VOvvtqFfu63qnXr40WKytZWrxJfVESvRjd761yg==} + '@capacitor/share@7.0.2': + resolution: {integrity: sha512-VyNPo/9831xnL17IMDeft5yNdBjoKNb451P95sRcr69hulRDqHc+kndqOVaMXnaA6IyBdWnnFv/n1HUf4cXpGw==} peerDependencies: - '@capacitor/core': '>=8.0.0' + '@capacitor/core': '>=7.0.0' - '@capacitor/splash-screen@8.0.0': - resolution: {integrity: sha512-zkFdUSd6C6gd3s3bIEgtO3DVjfwpaX5mmWU9er8xYTg47zr2toEkGtfyE6CPhhErG09fl4rCqrK5DfnGrXLh9w==} + '@capacitor/splash-screen@7.0.3': + resolution: {integrity: sha512-coAw2de3rRX0EfneK0/D9IZaDAUOtsPaE9ZNbSdCs2UtmXp0hdcr5Tsil01Kve707nQfLsd03pmvaesJYD60EA==} peerDependencies: - '@capacitor/core': '>=8.0.0' + '@capacitor/core': '>=7.0.0' - '@capacitor/status-bar@8.0.0': - resolution: {integrity: sha512-aIj3bc7z8lfPgOen8HlrBrkfnxpFnh21OCx6jCUx4Mvv+B6eEkUQ49b32DOddgVfr+igRHLX2SYi7duqIsNDXg==} + '@capacitor/status-bar@7.0.3': + resolution: {integrity: sha512-JyRpVnKwHij9hgPWolF6PK+HT3e2HSPjN11/h2OmKxq8GAdPGARFLv+97eZl0pvuvm0Kka/LpiLb5whXISBg7Q==} peerDependencies: - '@capacitor/core': '>=8.0.0' + '@capacitor/core': '>=7.0.0' '@capacitor/synapse@1.0.4': resolution: {integrity: sha512-/C1FUo8/OkKuAT4nCIu/34ny9siNHr9qtFezu4kxm6GY1wNFxrCFWjfYx5C1tUhVGz3fxBABegupkpjXvjCHrw==} - '@capawesome/capacitor-badge@8.0.0': - resolution: {integrity: sha512-dkcrXmjoxe01E8QkUAykQqXEstk2/x/ZfsYX+uMXo+UcJBILXWZtj/2JIHARRWaxCZjhr4iZnmyVziRKYCdSAg==} + '@capawesome/capacitor-badge@7.0.1': + resolution: {integrity: sha512-jhVieRRVLgGO1NU7PW8uWZmf3WD4IsYUlkrJ82KuoRgLFx1tbJGwHU1ro0sUJmEwfLO9vldhBnJJ/J5nHrjbQQ==} peerDependencies: - '@capacitor/core': '>=8.0.0' + '@capacitor/core': '>=7.0.0' - '@capgo/capacitor-updater@8.41.12': - resolution: {integrity: sha512-RPSdWnslC3FUHNh0mlv6NfPZ/crEgbwDRypGqVVpBDIhl/qjqEBUIVSL3OeVsQk1nglnRqEpIJch3SScT/1f4Q==} + '@capgo/capacitor-updater@7.8.7': + resolution: {integrity: sha512-wTKm9RKuRIPSfACXVVYBhOV1jlO/pD/LVxVRSayyb032m/zAPLr01fdp7lKj4PP2PFx8Q6hdeBnV6++pCdsDrQ==} peerDependencies: - '@capacitor/core': ^8.0.0 + '@capacitor/core': '>=7.0.0' '@capgo/cli@7.29.1': resolution: {integrity: sha512-VxHznVWWOBwQsAiKWQ2I5GmMolwyDiCn3e/gJbLBVCMdUUJugrAQJ3/1RkcBrGAZKFpxdk9eG9XatW92Simwrg==} @@ -7430,8 +7379,12 @@ packages: '@fal-works/esbuild-plugin-global-externals@2.1.2': resolution: {integrity: sha512-cEee/Z+I12mZcFJshKcCqC8tuX5hG3s+d+9nZ3LabqKF1vKdF41B92pJVCBggjAGORAeOzyyDDKrZwIkLffeOQ==} - '@fastify/accept-negotiator@2.0.1': - resolution: {integrity: sha512-/c/TW2bO/v9JeEgoD/g1G5GxGeCF1Hafdf79WPmUlgYiBXummY0oX3VVq4yFkKKVBKDNlaDUYoab7g38RpPqCQ==} + '@fastify/accept-negotiator@1.1.0': + resolution: {integrity: sha512-OIHZrb2ImZ7XG85HXOONLcJWGosv7sIvM2ifAPQVhg9Lv7qdmMBNVaai4QTdyuaqbKM5eO6sLSQOYI7wEQeCJQ==} + engines: {node: '>=14'} + + '@fastify/ajv-compiler@3.6.0': + resolution: {integrity: sha512-LwdXQJjmMD+GwLOkP7TVC68qa+pSSogeWWmznRJ/coyTcfe9qA05AHFSe1eZFwK6q+xVRpChnvFUkf1iYaSZsQ==} '@fastify/ajv-compiler@4.0.5': resolution: {integrity: sha512-KoWKW+MhvfTRWL4qrhUwAAZoaChluo0m0vbiJlGMt2GXvL4LVPQEjt8kSpHI3IBq5Rez8fg+XeH3cneztq+C7A==} @@ -7443,62 +7396,71 @@ packages: '@fastify/busboy@3.2.0': resolution: {integrity: sha512-m9FVDXU3GT2ITSe0UaMA5rU3QkfC/UXtCU8y0gSN/GugTqtVldOBWIB5V6V3sbmenVZUIpU6f+mPEO2+m5iTaA==} - '@fastify/cors@11.2.0': - resolution: {integrity: sha512-LbLHBuSAdGdSFZYTLVA3+Ch2t+sA6nq3Ejc6XLAKiQ6ViS2qFnvicpj0htsx03FyYeLs04HfRNBsz/a8SvbcUw==} + '@fastify/cors@9.0.1': + resolution: {integrity: sha512-YY9Ho3ovI+QHIL2hW+9X4XqQjXLjJqsU+sMV/xFsxZkE8p3GNnYVFpoOxF7SsP5ZL76gwvbo3V9L+FIekBGU4Q==} + + '@fastify/error@3.4.1': + resolution: {integrity: sha512-wWSvph+29GR783IhmvdwWnN4bUxTD01Vm5Xad4i7i1VuAOItLvbPAb69sb0IQ2N57yprvhNIwAP5B6xfKTmjmQ==} '@fastify/error@4.2.0': resolution: {integrity: sha512-RSo3sVDXfHskiBZKBPRgnQTtIqpi/7zhJOEmAxCiBcM7d0uwdGdxLlsCaLzGs8v8NnxIRlfG0N51p5yFaOentQ==} + '@fastify/fast-json-stringify-compiler@4.3.0': + resolution: {integrity: sha512-aZAXGYo6m22Fk1zZzEUKBvut/CIIQe/BapEORnxiD5Qr0kPHqqI69NtEMCme74h+at72sPhbkb4ZrLd1W3KRLA==} + '@fastify/fast-json-stringify-compiler@5.0.3': resolution: {integrity: sha512-uik7yYHkLr6fxd8hJSZ8c+xF4WafPK+XzneQDPU+D10r5X19GW8lJcom2YijX2+qtFF1ENJlHXKFM9ouXNJYgQ==} '@fastify/forwarded@3.0.1': resolution: {integrity: sha512-JqDochHFqXs3C3Ml3gOY58zM7OqO9ENqPo0UqAjAjH8L01fRZqwX9iLeX34//kiJubF7r2ZQHtBRU36vONbLlw==} + '@fastify/merge-json-schemas@0.1.1': + resolution: {integrity: sha512-fERDVz7topgNjtXsJTTW1JKLy0rhuLRcquYqNR9rF7OcVpCa2OVW49ZPDIhaRRCaUuvVxI+N416xUoF76HNSXA==} + '@fastify/merge-json-schemas@0.2.1': resolution: {integrity: sha512-OA3KGBCy6KtIvLf8DINC5880o5iBlDX4SxzLQS8HorJAbqluzLRn80UXU0bxZn7UOFhFgpRJDasfwn9nG4FG4A==} '@fastify/proxy-addr@5.1.0': resolution: {integrity: sha512-INS+6gh91cLUjB+PVHfu1UqcB76Sqtpyp7bnL+FYojhjygvOPA9ctiD/JDKsyD9Xgu4hUhCSJBPig/w7duNajw==} - '@fastify/send@4.1.0': - resolution: {integrity: sha512-TMYeQLCBSy2TOFmV95hQWkiTYgC/SEx7vMdV+wnZVX4tt8VBLKzmH8vV9OzJehV0+XBfg+WxPMt5wp+JBUKsVw==} + '@fastify/send@2.1.0': + resolution: {integrity: sha512-yNYiY6sDkexoJR0D8IDy3aRP3+L4wdqCpvx5WP+VtEU58sn7USmKynBzDQex5X42Zzvw2gNzzYgP90UfWShLFA==} - '@fastify/static@9.0.0': - resolution: {integrity: sha512-r64H8Woe/vfilg5RTy7lwWlE8ZZcTrc3kebYFMEUBrMqlydhQyoiExQXdYAy2REVpST/G35+stAM8WYp1WGmMA==} + '@fastify/static@7.0.4': + resolution: {integrity: sha512-p2uKtaf8BMOZWLs6wu+Ihg7bWNBdjNgCwDza4MJtTqg+5ovKmcbgbR9Xs5/smZ1YISfzKOCNYmZV8LaCj+eJ1Q==} - '@fastify/swagger-ui@5.2.4': - resolution: {integrity: sha512-Maw8OYPUDxlOzKQd3VMv7T/fmjf2h6BWR3XHkhk3dD3rIfzO7C/UPnzGuTpOGMqw1HCUnctADBbeTNAzAwzUqA==} + '@fastify/swagger-ui@4.2.0': + resolution: {integrity: sha512-pVutmTm49Pn98FS01E2m+eUH0WGhsHlImowWr9PXQt3rQPArSsocON8qF/8mm0dNLmilwtJZJqdsvFTnCUcapw==} - '@fastify/swagger@9.6.1': - resolution: {integrity: sha512-fKlpJqFMWoi4H3EdUkDaMteEYRCfQMEkK0HJJ0eaf4aRlKd8cbq0pVkOfXDXmtvMTXYcnx3E+l023eFDBsA1HA==} + '@fastify/swagger@8.15.0': + resolution: {integrity: sha512-zy+HEEKFqPMS2sFUsQU5X0MHplhKJvWeohBwTCkBAJA/GDYGLGUWQaETEhptiqxK7Hs0fQB9B4MDb3pbwIiCwA==} '@filestack/loader@1.0.9': resolution: {integrity: sha512-zvXbZSgeybT1p3ds5NZ5GQYPVnKacgb2YGWe7psdPs/JE1v3SL1j2SXYaHA/f/Qwc8Y1fjzz53maKP0vwDHrvA==} - '@firebase/ai@2.7.0': - resolution: {integrity: sha512-PwpCz+TtAMWICM7uQNO0mkSPpUKwrMV4NSwHkbVKDvPKoaQmSlO96vIz+Suw2Ao1EaUUsxYb5LGImHWt/fSnRQ==} - engines: {node: '>=20.0.0'} + '@firebase/ai@1.4.1': + resolution: {integrity: sha512-bcusQfA/tHjUjBTnMx6jdoPMpDl3r8K15Z+snHz9wq0Foox0F/V+kNLXucEOHoTL2hTc9l+onZCyBJs2QoIC3g==} + engines: {node: '>=18.0.0'} peerDependencies: '@firebase/app': 0.x '@firebase/app-types': 0.x - '@firebase/analytics-compat@0.2.25': - resolution: {integrity: sha512-fdzoaG0BEKbqksRDhmf4JoyZf16Wosrl0Y7tbZtJyVDOOwziE0vrFjmZuTdviL0yhak+Nco6rMsUUbkbD+qb6Q==} + '@firebase/analytics-compat@0.2.23': + resolution: {integrity: sha512-3AdO10RN18G5AzREPoFgYhW6vWXr3u+OYQv6pl3CX6Fky8QRk0AHurZlY3Q1xkXO0TDxIsdhO3y65HF7PBOJDw==} peerDependencies: '@firebase/app-compat': 0.x '@firebase/analytics-types@0.8.3': resolution: {integrity: sha512-VrIp/d8iq2g501qO46uGz3hjbDb8xzYMrbu8Tp0ovzIzrvJZ2fvmj649gTjge/b7cCCcjT0H37g1gVtlNhnkbg==} - '@firebase/analytics@0.10.19': - resolution: {integrity: sha512-3wU676fh60gaiVYQEEXsbGS4HbF2XsiBphyvvqDbtC1U4/dO4coshbYktcCHq+HFaGIK07iHOh4pME0hEq1fcg==} + '@firebase/analytics@0.10.17': + resolution: {integrity: sha512-n5vfBbvzduMou/2cqsnKrIes4auaBjdhg8QNA2ZQZ59QgtO2QiwBaXQZQE4O4sgB0Ds1tvLgUUkY+pwzu6/xEg==} peerDependencies: '@firebase/app': 0.x - '@firebase/app-check-compat@0.4.0': - resolution: {integrity: sha512-UfK2Q8RJNjYM/8MFORltZRG9lJj11k0nW84rrffiKvcJxLf1jf6IEjCIkCamykHE73C6BwqhVfhIBs69GXQV0g==} - engines: {node: '>=20.0.0'} + '@firebase/app-check-compat@0.3.26': + resolution: {integrity: sha512-PkX+XJMLDea6nmnopzFKlr+s2LMQGqdyT2DHdbx1v1dPSqOol2YzgpgymmhC67vitXVpNvS3m/AiWQWWhhRRPQ==} + engines: {node: '>=18.0.0'} peerDependencies: '@firebase/app-compat': 0.x @@ -7508,26 +7470,26 @@ packages: '@firebase/app-check-types@0.5.3': resolution: {integrity: sha512-hyl5rKSj0QmwPdsAxrI5x1otDlByQ7bvNvVt8G/XPO2CSwE++rmSVf3VEhaeOR4J8ZFaF0Z0NDSmLejPweZ3ng==} - '@firebase/app-check@0.11.0': - resolution: {integrity: sha512-XAvALQayUMBJo58U/rxW02IhsesaxxfWVmVkauZvGEz3vOAjMEQnzFlyblqkc2iAaO82uJ2ZVyZv9XzPfxjJ6w==} - engines: {node: '>=20.0.0'} + '@firebase/app-check@0.10.1': + resolution: {integrity: sha512-MgNdlms9Qb0oSny87pwpjKush9qUwCJhfmTJHDfrcKo4neLGiSeVE4qJkzP7EQTIUFKp84pbTxobSAXkiuQVYQ==} + engines: {node: '>=18.0.0'} peerDependencies: '@firebase/app': 0.x - '@firebase/app-compat@0.5.7': - resolution: {integrity: sha512-MO+jfap8IBZQ+K8L2QCiHObyMgpYHrxo4Hc7iJgfb9hjGRW/z1y6LWVdT9wBBK+VJ7cRP2DjAiWQP+thu53hHA==} - engines: {node: '>=20.0.0'} + '@firebase/app-compat@0.4.2': + resolution: {integrity: sha512-LssbyKHlwLeiV8GBATyOyjmHcMpX/tFjzRUCS1jnwGAew1VsBB4fJowyS5Ud5LdFbYpJeS+IQoC+RQxpK7eH3Q==} + engines: {node: '>=18.0.0'} '@firebase/app-types@0.9.3': resolution: {integrity: sha512-kRVpIl4vVGJ4baogMDINbyrIOtOxqhkZQg4jTq3l8Lw6WSk0xfpEYzezFu+Kl4ve4fbPl79dvwRtaFqAC/ucCw==} - '@firebase/app@0.14.7': - resolution: {integrity: sha512-o3ZfnOx0AWBD5n/36p2zPoB0rDDxQP8H/A60zDLvvfRLtW8b3LfCyV97GKpJaAVV1JMMl/BC89EDzMyzxFZxTw==} - engines: {node: '>=20.0.0'} + '@firebase/app@0.13.2': + resolution: {integrity: sha512-jwtMmJa1BXXDCiDx1vC6SFN/+HfYG53UkfJa6qeN5ogvOunzbFDO3wISZy5n9xgYFUrEP6M7e8EG++riHNTv9w==} + engines: {node: '>=18.0.0'} - '@firebase/auth-compat@0.6.2': - resolution: {integrity: sha512-8UhCzF6pav9bw/eXA8Zy1QAKssPRYEYXaWagie1ewLTwHkXv6bKp/j6/IwzSYQP67sy/BMFXIFaCCsoXzFLr7A==} - engines: {node: '>=20.0.0'} + '@firebase/auth-compat@0.5.28': + resolution: {integrity: sha512-HpMSo/cc6Y8IX7bkRIaPPqT//Jt83iWy5rmDWeThXQCAImstkdNo3giFLORJwrZw2ptiGkOij64EH1ztNJzc7Q==} + engines: {node: '>=18.0.0'} peerDependencies: '@firebase/app-compat': 0.x @@ -7540,39 +7502,54 @@ packages: '@firebase/app-types': 0.x '@firebase/util': 1.x - '@firebase/auth@1.12.0': - resolution: {integrity: sha512-zkvLpsrxynWHk07qGrUDfCSqKf4AvfZGEqJ7mVCtYGjNNDbGE71k0Yn84rg8QEZu4hQw1BC0qDEHzpNVBcSVmA==} - engines: {node: '>=20.0.0'} + '@firebase/auth@1.10.8': + resolution: {integrity: sha512-GpuTz5ap8zumr/ocnPY57ZanX02COsXloY6Y/2LYPAuXYiaJRf6BAGDEdRq1BMjP93kqQnKNuKZUTMZbQ8MNYA==} + engines: {node: '>=18.0.0'} peerDependencies: '@firebase/app': 0.x - '@react-native-async-storage/async-storage': ^2.2.0 + '@react-native-async-storage/async-storage': ^1.18.1 peerDependenciesMeta: '@react-native-async-storage/async-storage': optional: true + '@firebase/component@0.6.18': + resolution: {integrity: sha512-n28kPCkE2dL2U28fSxZJjzPPVpKsQminJ6NrzcKXAI0E/lYC8YhfwpyllScqVEvAI3J2QgJZWYgrX+1qGI+SQQ==} + engines: {node: '>=18.0.0'} + '@firebase/component@0.7.0': resolution: {integrity: sha512-wR9En2A+WESUHexjmRHkqtaVH94WLNKt6rmeqZhSLBybg4Wyf0Umk04SZsS6sBq4102ZsDBFwoqMqJYj2IoDSg==} engines: {node: '>=20.0.0'} - '@firebase/data-connect@0.3.12': - resolution: {integrity: sha512-baPddcoNLj/+vYo+HSJidJUdr5W4OkhT109c5qhR8T1dJoZcyJpkv/dFpYlw/VJ3dV66vI8GHQFrmAZw/xUS4g==} + '@firebase/data-connect@0.3.10': + resolution: {integrity: sha512-VMVk7zxIkgwlVQIWHOKFahmleIjiVFwFOjmakXPd/LDgaB/5vzwsB5DWIYo+3KhGxWpidQlR8geCIn39YflJIQ==} peerDependencies: '@firebase/app': 0.x + '@firebase/database-compat@2.0.11': + resolution: {integrity: sha512-itEsHARSsYS95+udF/TtIzNeQ0Uhx4uIna0sk4E0wQJBUnLc/G1X6D7oRljoOuwwCezRLGvWBRyNrugv/esOEw==} + engines: {node: '>=18.0.0'} + '@firebase/database-compat@2.1.0': resolution: {integrity: sha512-8nYc43RqxScsePVd1qe1xxvWNf0OBnbwHxmXJ7MHSuuTVYFO3eLyLW3PiCKJ9fHnmIz4p4LbieXwz+qtr9PZDg==} engines: {node: '>=20.0.0'} + '@firebase/database-types@1.0.15': + resolution: {integrity: sha512-XWHJ0VUJ0k2E9HDMlKxlgy/ZuTa9EvHCGLjaKSUvrQnwhgZuRU5N3yX6SZ+ftf2hTzZmfRkv+b3QRvGg40bKNw==} + '@firebase/database-types@1.0.16': resolution: {integrity: sha512-xkQLQfU5De7+SPhEGAXFBnDryUWhhlFXelEg2YeZOQMCdoe7dL64DDAd77SQsR+6uoXIZY5MB4y/inCs4GTfcw==} + '@firebase/database@1.0.20': + resolution: {integrity: sha512-H9Rpj1pQ1yc9+4HQOotFGLxqAXwOzCHsRSRjcQFNOr8lhUt6LeYjf0NSRL04sc4X0dWe8DsCvYKxMYvFG/iOJw==} + engines: {node: '>=18.0.0'} + '@firebase/database@1.1.0': resolution: {integrity: sha512-gM6MJFae3pTyNLoc9VcJNuaUDej0ctdjn3cVtILo3D5lpp0dmUHHLFN/pUKe7ImyeB1KAvRlEYxvIHNF04Filg==} engines: {node: '>=20.0.0'} - '@firebase/firestore-compat@0.4.4': - resolution: {integrity: sha512-JvxxIgi+D5v9BecjLA1YomdyF7LA6CXhJuVK10b4GtRrB3m2O2hT1jJWbKYZYHUAjTaajkvnos+4U5VNxqkI2w==} - engines: {node: '>=20.0.0'} + '@firebase/firestore-compat@0.3.53': + resolution: {integrity: sha512-qI3yZL8ljwAYWrTousWYbemay2YZa+udLWugjdjju2KODWtLG94DfO4NALJgPLv8CVGcDHNFXoyQexdRA0Cz8Q==} + engines: {node: '>=18.0.0'} peerDependencies: '@firebase/app-compat': 0.x @@ -7582,29 +7559,29 @@ packages: '@firebase/app-types': 0.x '@firebase/util': 1.x - '@firebase/firestore@4.10.0': - resolution: {integrity: sha512-fgF6EbpoagGWh5Vwfu/7/jYgBFwUCwTlPNVF/aSjHcoEDRXpRsIqVfAFTp1LD+dWAUcAKEK3h+osk8spMJXtxA==} - engines: {node: '>=20.0.0'} + '@firebase/firestore@4.8.0': + resolution: {integrity: sha512-QSRk+Q1/CaabKyqn3C32KSFiOdZpSqI9rpLK5BHPcooElumOBooPFa6YkDdiT+/KhJtel36LdAacha9BptMj2A==} + engines: {node: '>=18.0.0'} peerDependencies: '@firebase/app': 0.x - '@firebase/functions-compat@0.4.1': - resolution: {integrity: sha512-AxxUBXKuPrWaVNQ8o1cG1GaCAtXT8a0eaTDfqgS5VsRYLAR0ALcfqDLwo/QyijZj1w8Qf8n3Qrfy/+Im245hOQ==} - engines: {node: '>=20.0.0'} + '@firebase/functions-compat@0.3.26': + resolution: {integrity: sha512-A798/6ff5LcG2LTWqaGazbFYnjBW8zc65YfID/en83ALmkhu2b0G8ykvQnLtakbV9ajrMYPn7Yc/XcYsZIUsjA==} + engines: {node: '>=18.0.0'} peerDependencies: '@firebase/app-compat': 0.x '@firebase/functions-types@0.6.3': resolution: {integrity: sha512-EZoDKQLUHFKNx6VLipQwrSMh01A1SaL3Wg6Hpi//x6/fJ6Ee4hrAeswK99I5Ht8roiniKHw4iO0B1Oxj5I4plg==} - '@firebase/functions@0.13.1': - resolution: {integrity: sha512-sUeWSb0rw5T+6wuV2o9XNmh9yHxjFI9zVGFnjFi+n7drTEWpl7ZTz1nROgGrSu472r+LAaj+2YaSicD4R8wfbw==} - engines: {node: '>=20.0.0'} + '@firebase/functions@0.12.9': + resolution: {integrity: sha512-FG95w6vjbUXN84Ehezc2SDjGmGq225UYbHrb/ptkRT7OTuCiQRErOQuyt1jI1tvcDekdNog+anIObihNFz79Lg==} + engines: {node: '>=18.0.0'} peerDependencies: '@firebase/app': 0.x - '@firebase/installations-compat@0.2.19': - resolution: {integrity: sha512-khfzIY3EI5LePePo7vT19/VEIH1E3iYsHknI/6ek9T8QCozAZshWT9CjlwOzZrKvTHMeNcbpo/VSOSIWDSjWdQ==} + '@firebase/installations-compat@0.2.18': + resolution: {integrity: sha512-aLFohRpJO5kKBL/XYL4tN+GdwEB/Q6Vo9eZOM/6Kic7asSUgmSfGPpGUZO1OAaSRGwF4Lqnvi1f/f9VZnKzChw==} peerDependencies: '@firebase/app-compat': 0.x @@ -7613,57 +7590,61 @@ packages: peerDependencies: '@firebase/app-types': 0.x - '@firebase/installations@0.6.19': - resolution: {integrity: sha512-nGDmiwKLI1lerhwfwSHvMR9RZuIH5/8E3kgUWnVRqqL7kGVSktjLTWEMva7oh5yxQ3zXfIlIwJwMcaM5bK5j8Q==} + '@firebase/installations@0.6.18': + resolution: {integrity: sha512-NQ86uGAcvO8nBRwVltRL9QQ4Reidc/3whdAasgeWCPIcrhOKDuNpAALa6eCVryLnK14ua2DqekCOX5uC9XbU/A==} peerDependencies: '@firebase/app': 0.x + '@firebase/logger@0.4.4': + resolution: {integrity: sha512-mH0PEh1zoXGnaR8gD1DeGeNZtWFKbnz9hDO91dIml3iou1gpOnLqXQ2dJfB71dj6dpmUjcQ6phY3ZZJbjErr9g==} + engines: {node: '>=18.0.0'} + '@firebase/logger@0.5.0': resolution: {integrity: sha512-cGskaAvkrnh42b3BA3doDWeBmuHFO/Mx5A83rbRDYakPjO9bJtRL3dX7javzc2Rr/JHZf4HlterTW2lUkfeN4g==} engines: {node: '>=20.0.0'} - '@firebase/messaging-compat@0.2.23': - resolution: {integrity: sha512-SN857v/kBUvlQ9X/UjAqBoQ2FEaL1ZozpnmL1ByTe57iXkmnVVFm9KqAsTfmf+OEwWI4kJJe9NObtN/w22lUgg==} + '@firebase/messaging-compat@0.2.22': + resolution: {integrity: sha512-5ZHtRnj6YO6f/QPa/KU6gryjmX4Kg33Kn4gRpNU6M1K47Gm8kcQwPkX7erRUYEH1mIWptfvjvXMHWoZaWjkU7A==} peerDependencies: '@firebase/app-compat': 0.x '@firebase/messaging-interop-types@0.2.3': resolution: {integrity: sha512-xfzFaJpzcmtDjycpDeCUj0Ge10ATFi/VHVIvEEjDNc3hodVBQADZ7BWQU7CuFpjSHE+eLuBI13z5F/9xOoGX8Q==} - '@firebase/messaging@0.12.23': - resolution: {integrity: sha512-cfuzv47XxqW4HH/OcR5rM+AlQd1xL/VhuaeW/wzMW1LFrsFcTn0GND/hak1vkQc2th8UisBcrkVcQAnOnKwYxg==} + '@firebase/messaging@0.12.22': + resolution: {integrity: sha512-GJcrPLc+Hu7nk+XQ70Okt3M1u1eRr2ZvpMbzbc54oTPJZySHcX9ccZGVFcsZbSZ6o1uqumm8Oc7OFkD3Rn1/og==} peerDependencies: '@firebase/app': 0.x - '@firebase/performance-compat@0.2.22': - resolution: {integrity: sha512-xLKxaSAl/FVi10wDX/CHIYEUP13jXUjinL+UaNXT9ByIvxII5Ne5150mx6IgM8G6Q3V+sPiw9C8/kygkyHUVxg==} + '@firebase/performance-compat@0.2.20': + resolution: {integrity: sha512-XkFK5NmOKCBuqOKWeRgBUFZZGz9SzdTZp4OqeUg+5nyjapTiZ4XoiiUL8z7mB2q+63rPmBl7msv682J3rcDXIQ==} peerDependencies: '@firebase/app-compat': 0.x '@firebase/performance-types@0.2.3': resolution: {integrity: sha512-IgkyTz6QZVPAq8GSkLYJvwSLr3LS9+V6vNPQr0x4YozZJiLF5jYixj0amDtATf1X0EtYHqoPO48a9ija8GocxQ==} - '@firebase/performance@0.7.9': - resolution: {integrity: sha512-UzybENl1EdM2I1sjYm74xGt/0JzRnU/0VmfMAKo2LSpHJzaj77FCLZXmYQ4oOuE+Pxtt8Wy2BVJEENiZkaZAzQ==} + '@firebase/performance@0.7.7': + resolution: {integrity: sha512-JTlTQNZKAd4+Q5sodpw6CN+6NmwbY72av3Lb6wUKTsL7rb3cuBIhQSrslWbVz0SwK3x0ZNcqX24qtRbwKiv+6w==} peerDependencies: '@firebase/app': 0.x - '@firebase/remote-config-compat@0.2.21': - resolution: {integrity: sha512-9+lm0eUycxbu8GO25JfJe4s6R2xlDqlVt0CR6CvN9E6B4AFArEV4qfLoDVRgIEB7nHKwvH2nYRocPWfmjRQTnw==} + '@firebase/remote-config-compat@0.2.18': + resolution: {integrity: sha512-YiETpldhDy7zUrnS8e+3l7cNs0sL7+tVAxvVYU0lu7O+qLHbmdtAxmgY+wJqWdW2c9nDvBFec7QiF58pEUu0qQ==} peerDependencies: '@firebase/app-compat': 0.x - '@firebase/remote-config-types@0.5.0': - resolution: {integrity: sha512-vI3bqLoF14L/GchtgayMiFpZJF+Ao3uR8WCde0XpYNkSokDpAKca2DxvcfeZv7lZUqkUwQPL2wD83d3vQ4vvrg==} + '@firebase/remote-config-types@0.4.0': + resolution: {integrity: sha512-7p3mRE/ldCNYt8fmWMQ/MSGRmXYlJ15Rvs9Rk17t8p0WwZDbeK7eRmoI1tvCPaDzn9Oqh+yD6Lw+sGLsLg4kKg==} - '@firebase/remote-config@0.8.0': - resolution: {integrity: sha512-sJz7C2VACeE257Z/3kY9Ap2WXbFsgsDLfaGfZmmToKAK39ipXxFan+vzB9CSbF6mP7bzjyzEnqPcMXhAnYE6fQ==} + '@firebase/remote-config@0.6.5': + resolution: {integrity: sha512-fU0c8HY0vrVHwC+zQ/fpXSqHyDMuuuglV94VF6Yonhz8Fg2J+KOowPGANM0SZkLvVOYpTeWp3ZmM+F6NjwWLnw==} peerDependencies: '@firebase/app': 0.x - '@firebase/storage-compat@0.4.0': - resolution: {integrity: sha512-vDzhgGczr1OfcOy285YAPur5pWDEvD67w4thyeCUh6Ys0izN9fNYtA1MJERmNBfqjqu0lg0FM5GLbw0Il21M+g==} - engines: {node: '>=20.0.0'} + '@firebase/storage-compat@0.3.24': + resolution: {integrity: sha512-XHn2tLniiP7BFKJaPZ0P8YQXKiVJX+bMyE2j2YWjYfaddqiJnROJYqSomwW6L3Y+gZAga35ONXUJQju6MB6SOQ==} + engines: {node: '>=18.0.0'} peerDependencies: '@firebase/app-compat': 0.x @@ -7673,18 +7654,22 @@ packages: '@firebase/app-types': 0.x '@firebase/util': 1.x - '@firebase/storage@0.14.0': - resolution: {integrity: sha512-xWWbb15o6/pWEw8H01UQ1dC5U3rf8QTAzOChYyCpafV6Xki7KVp3Yaw2nSklUwHEziSWE9KoZJS7iYeyqWnYFA==} - engines: {node: '>=20.0.0'} + '@firebase/storage@0.13.14': + resolution: {integrity: sha512-xTq5ixxORzx+bfqCpsh+o3fxOsGoDjC1nO0Mq2+KsOcny3l7beyBhP/y1u5T6mgsFQwI1j6oAkbT5cWdDBx87g==} + engines: {node: '>=18.0.0'} peerDependencies: '@firebase/app': 0.x + '@firebase/util@1.12.1': + resolution: {integrity: sha512-zGlBn/9Dnya5ta9bX/fgEoNC3Cp8s6h+uYPYaDieZsFOAdHP/ExzQ/eaDgxD3GOROdPkLKpvKY0iIzr9adle0w==} + engines: {node: '>=18.0.0'} + '@firebase/util@1.13.0': resolution: {integrity: sha512-0AZUyYUfpMNcztR5l09izHwXkZpghLgCUaAGjtMwXnCg3bj4ml5VgiwqOMOxJ+Nw4qN/zJAaOQBcJ7KGkWStqQ==} engines: {node: '>=20.0.0'} - '@firebase/webchannel-wrapper@1.0.5': - resolution: {integrity: sha512-+uGNN7rkfn41HLO0vekTFhTxk61eKa8mTpRGLO0QSqlQdKvIoGAvLp3ppdVIWbTGYJWM6Kp0iN+PjMIOcnVqTw==} + '@firebase/webchannel-wrapper@1.0.3': + resolution: {integrity: sha512-2xCRM9q9FlzGZCdgDMJwc0gyUkWFtkosy7Xxr6sFgQwn+wMNIWd7xIvYNauU1r64B5L5rsGKy/n9TKJ0aAFeqQ==} '@floating-ui/core@1.7.3': resolution: {integrity: sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==} @@ -8717,8 +8702,8 @@ packages: '@metamask/sdk-install-modal-web@0.32.1': resolution: {integrity: sha512-MGmAo6qSjf1tuYXhCu2EZLftq+DSt5Z7fsIKr2P+lDgdTPWgLfZB1tJKzNcwKKOdf6q9Qmmxn7lJuI/gq5LrKw==} - '@metamask/sdk@0.34.0': - resolution: {integrity: sha512-8dkJUShZ5zFqYjNmhJaqKgDzZVne+F2rNjMQJ3pxs89n3oOUNuJ8dsTo08Grf9vlQ6Ldpdt2RTwqbrxKWyyqlw==} + '@metamask/sdk@0.33.1': + resolution: {integrity: sha512-1mcOQVGr9rSrVcbKPNVzbZ8eCl1K0FATsYH3WJ/MH4WcZDWGECWrXJPNMZoEAkLxWiMe8jOQBumg2pmcDa9zpQ==} '@metamask/snap-types@0.21.0': resolution: {integrity: sha512-wyamdpiZqVfrHjAysnplVQexEisH8b00XTv6F8kTyKd4pbRTBswmOOc1DhBbi2+7Fw2J5a7pdLb9+/MRMwnztg==} @@ -8795,11 +8780,6 @@ packages: nanostores: ^0.9.0 || ^0.10.0 || ^0.11.0 react: '>=18.0.0' - '@napi-rs/cli@2.18.4': - resolution: {integrity: sha512-SgJeA4df9DE2iAEpr3M2H0OKl/yjtg1BnRI5/JyowS71tUWhrfSu2LT0V3vlHET+g1hBVlrO60PmEXwUEKp8Mg==} - engines: {node: '>= 10'} - hasBin: true - '@ndelangen/get-tarball@3.0.9': resolution: {integrity: sha512-9JKTEik4vq+yGosHYhZ1tiH/3WpUS0Nh0kej4Agndhox8pAdWhEx5knFVRcb/ya9knCRCs1rPxNrSXTDdfVqpA==} @@ -9906,6 +9886,17 @@ packages: peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + '@reduxjs/toolkit@2.11.2': + resolution: {integrity: sha512-Kd6kAHTA6/nUpp8mySPqj3en3dm0tdMIgbttnQ1xFMVpufoj+ADi8pXLBsd4xzTRHQa7t/Jv8W5UnCuW4kuWMQ==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18 || ^19 + react-redux: ^7.2.1 || ^8.1.3 || ^9.0.0 + peerDependenciesMeta: + react: + optional: true + react-redux: + optional: true + '@rolldown/pluginutils@1.0.0-beta.27': resolution: {integrity: sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==} @@ -10828,6 +10819,9 @@ packages: '@standard-schema/spec@1.0.0': resolution: {integrity: sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==} + '@standard-schema/utils@0.3.0': + resolution: {integrity: sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==} + '@stencil/core@2.10.0': resolution: {integrity: sha512-15rWMTPQ/sp0lSV82HVCXkIya3QLN+uBl7pqK4JnTrp4HiLrzLmNbWjbvgCs55gw0lULbCIGbRIEsFz+Pe/Q+A==} engines: {node: '>=12.10.0', npm: '>=6.0.0'} @@ -11370,10 +11364,6 @@ packages: resolution: {integrity: sha512-/DiOQ5xBxgdYRC8LNk7U+RWat0S3qRLeIw3ZIkMQ9kkVlRmwD/Eg8k8CqIpD6GW7u20JIUOfMKbxtiLutpjQ4g==} engines: {node: '>=12'} - '@testing-library/dom@9.3.4': - resolution: {integrity: sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ==} - engines: {node: '>=14'} - '@testing-library/jest-dom@5.17.0': resolution: {integrity: sha512-ynmNeT7asXyH3aSVv4vvX4Rb+0qjOhdNHnO/3vuZNqPmhDpV/+rCSGwQ7bLcmU2cJ4dvoheIO85LQj0IbJHEtg==} engines: {node: '>=8', npm: '>=6', yarn: '>=1'} @@ -11392,13 +11382,6 @@ packages: react: ^18.0.0 react-dom: ^18.0.0 - '@testing-library/react@14.3.1': - resolution: {integrity: sha512-H99XjUhWQw0lTgyMN05W3xQG1Nh4lq574D8keFf1dDoNTJgp66VbJozRaczoF+wsiaPJNt/TcnfpLGufGxSrZQ==} - engines: {node: '>=14'} - peerDependencies: - react: ^18.0.0 - react-dom: ^18.0.0 - '@testing-library/user-event@12.8.3': resolution: {integrity: sha512-IR0iWbFkgd56Bu5ZI/ej8yQwrkCv8Qydx6RzwbKz9faXazR/+5tvYKsZQgyXJiwgpcva127YO6JcWy7YlCfofQ==} engines: {node: '>=10', npm: '>=6'} @@ -11449,8 +11432,8 @@ packages: peerDependencies: '@babel/runtime': 7.x - '@toruslabs/base-controllers@8.13.0': - resolution: {integrity: sha512-hqrCN2WBqe/IU1nRD5oxt3/ETJAruhobFLy5w//kseIApmmCRUMEpPcRwnvxcUIcyMukIpIx2v0G4naiE0zbRw==} + '@toruslabs/base-controllers@8.9.0': + resolution: {integrity: sha512-kJvri3u+1XUXwIekQxpOudrKm+rjUemyR3yWjzyHGR0XrnaciuGrA/daSeXzth9CuDhNfZIeHVDa7C0pim0hrw==} engines: {node: '>=20.x', npm: '>=9.x'} peerDependencies: '@babel/runtime': 7.x @@ -11519,8 +11502,8 @@ packages: resolution: {integrity: sha512-GbVAXDC5AIecb01gEafiiZzVfRNGiNk85R7ZUDMpUjoYGOy6/FdHdM4x2ySqBj7B6xiXWf+rMfr99J7+TLjyxg==} engines: {node: '>=20.x', npm: '>=9.x'} - '@toruslabs/ethereum-controllers@8.10.0': - resolution: {integrity: sha512-vpzXF1imMKhnD1msfsQgQ1LyAcA2rhwcwF+oeRNCTRFnIdloKEH7ljS+LGWAsR+RwnFPvhuGNVo3ZyFv7Cnc1g==} + '@toruslabs/ethereum-controllers@8.9.0': + resolution: {integrity: sha512-fMzlKXnHa6JymgFP2sQDlcO/cid9pASb2X3826sW0FGEh651FbYoWOHmVILYDCSoic7s9OFZbqHfr/T0eFbYIQ==} engines: {node: '>=20.x', npm: '>=9.x'} peerDependencies: '@babel/runtime': 7.x @@ -11802,9 +11785,6 @@ packages: '@types/caseless@0.12.5': resolution: {integrity: sha512-hWtVTC2q7hc7xZ/RLbxapMvDMgUnDvKvMOpKal4DrMyfGBUfB1oKaZlIRr6mJL+If3bAP6sV/QneGzF6tJjZDg==} - '@types/chai@5.2.3': - resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} - '@types/chrome@0.0.136': resolution: {integrity: sha512-XDEiRhLkMd+SB7Iw3ZUIj/fov3wLd4HyTdLltVszkgl1dBfc3Rb7oPMVZ2Mz2TLqnF7Ow+StbR8E7r9lqpb4DA==} @@ -11827,12 +11807,36 @@ packages: resolution: {integrity: sha512-BahAZSSvuFXyhgJiwQgsfsNlStE9K/ULGL+YEzK4mmL2Vf02Pjl2yZs+KmbkAg3MxkC9WwMuFwuwnwvrg7CqvQ==} deprecated: This is a stub types definition. cssnano provides its own type definitions, so you do not need this installed. + '@types/d3-array@3.2.2': + resolution: {integrity: sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==} + + '@types/d3-color@3.1.3': + resolution: {integrity: sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==} + + '@types/d3-ease@3.0.2': + resolution: {integrity: sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==} + + '@types/d3-interpolate@3.0.4': + resolution: {integrity: sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==} + + '@types/d3-path@3.1.1': + resolution: {integrity: sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==} + + '@types/d3-scale@4.0.9': + resolution: {integrity: sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==} + + '@types/d3-shape@3.1.7': + resolution: {integrity: sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg==} + + '@types/d3-time@3.0.4': + resolution: {integrity: sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==} + + '@types/d3-timer@3.0.2': + resolution: {integrity: sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==} + '@types/debug@4.1.12': resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} - '@types/deep-eql@4.0.2': - resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} - '@types/detect-port@1.3.5': resolution: {integrity: sha512-Rf3/lB9WkDfIL9eEKaSYKc+1L/rNVYBjThk22JTqQw0YozXarX8YljFAz+HCoC6h4B4KwCMsBPZHaFezwT4BNA==} @@ -12054,9 +12058,6 @@ packages: '@types/node@18.19.130': resolution: {integrity: sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==} - '@types/node@20.19.27': - resolution: {integrity: sha512-N2clP5pJhB2YnZJ3PIHFk5RkygRX5WO/5f0WC08tp0wd+sv0rsJk3MqWn3CbNmT2J505a5336jaQj4ph1AdMug==} - '@types/node@22.19.1': resolution: {integrity: sha512-LCCV0HdSZZZb34qifBsyWlUmok6W7ouER+oQIGBScS8EsZsQbrtFTUrDX4hOl+CS6p7cnNC4td+qrSVGSCTUfQ==} @@ -12212,6 +12213,9 @@ packages: '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + '@types/use-sync-external-store@0.0.6': + resolution: {integrity: sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==} + '@types/uuid@8.3.4': resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==} @@ -12370,50 +12374,21 @@ packages: '@vitest/expect@1.6.1': resolution: {integrity: sha512-jXL+9+ZNIJKruofqXuuTClf44eSpcHlgj3CiuNihUF3Ioujtmc0zIa3UJOW5RjDK1YLBJZnWBlPuqhYycLioog==} - '@vitest/expect@3.2.4': - resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==} - - '@vitest/mocker@3.2.4': - resolution: {integrity: sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==} - peerDependencies: - msw: ^2.4.9 - vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0 - peerDependenciesMeta: - msw: - optional: true - vite: - optional: true - - '@vitest/pretty-format@3.2.4': - resolution: {integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==} - '@vitest/runner@1.6.1': resolution: {integrity: sha512-3nSnYXkVkf3mXFfE7vVyPmi3Sazhb/2cfZGGs0JRzFsPFvAMBEcrweV1V1GsrstdXeKCTXlJbvnQwGWgEIHmOA==} - '@vitest/runner@3.2.4': - resolution: {integrity: sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==} - '@vitest/snapshot@1.6.1': resolution: {integrity: sha512-WvidQuWAzU2p95u8GAKlRMqMyN1yOJkGHnx3M1PL9Raf7AQ1kwLKg04ADlCa3+OXUZE7BceOhVZiuWAbzCKcUQ==} - '@vitest/snapshot@3.2.4': - resolution: {integrity: sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==} - '@vitest/spy@1.6.1': resolution: {integrity: sha512-MGcMmpGkZebsMZhbQKkAf9CX5zGvjkBTqf8Zx3ApYWXr3wG+QvEu2eXWfnIIWYSJExIp4V9FCKDEeygzkYrXMw==} - '@vitest/spy@3.2.4': - resolution: {integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==} - '@vitest/utils@0.34.7': resolution: {integrity: sha512-ziAavQLpCYS9sLOorGrFFKmy2gnfiNU0ZJ15TsMz/K92NAPS/rp9K4z6AJQQk5Y8adCy4Iwpxy7pQumQ/psnRg==} '@vitest/utils@1.6.1': resolution: {integrity: sha512-jOrrUvXM4Av9ZWiG1EajNto0u96kWAhJ1LmPmJhXXQx/32MecEKd10pOLYgS2BQx1TgkGhloPU1ArDW2vvaY6g==} - '@vitest/utils@3.2.4': - resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==} - '@vladfrangu/async_event_emitter@2.4.7': resolution: {integrity: sha512-Xfe6rpCTxSxfbswi/W/Pz7zp1WWSNn4A0eW4mLkQUewCrXXtMj31lCg+iQyTkh/CkusZSq9eDflu7tjEDXUY6g==} engines: {node: '>=v14.0.0', npm: '>=7.0.0'} @@ -12505,8 +12480,8 @@ packages: peerDependencies: '@babel/runtime': ^7.x - '@web3auth/auth@10.8.0': - resolution: {integrity: sha512-c0a7HVzzbO8IygPetCzw6CkUIcFkWlXSjIAQkJwwMSYtWofsHYhYLLMV7cixSgvIOxQKCuRcvO6Qo7fxz9BiBg==} + '@web3auth/auth@10.7.0': + resolution: {integrity: sha512-e0GYLTgd3hjCsKDwrTVk8XeAmgV/l0JZEMjG/owGjj2yM7kyKmEal6abYPCki8kHc/YDh+UnpQR06IF09eGv+Q==} engines: {node: '>=20.x', npm: '>=9.x'} peerDependencies: '@babel/runtime': 7.x @@ -12549,8 +12524,8 @@ packages: peerDependencies: '@babel/runtime': 7.x - '@web3auth/no-modal@10.9.0': - resolution: {integrity: sha512-MWSfmSlCZaX6ra/76vv4mbozgBHf4Df4A8uCrcnShASFWpZXs/uJ6Fv7Uy/isa5R6muKTm5GovsiC58te2O8qA==} + '@web3auth/no-modal@10.8.0': + resolution: {integrity: sha512-sIULULafuBfcgL4d0JT7uyu/aKAZfWEw9DYcnhhecNjAR5gzIDRmS/9ZkffjdQ69zjSdQ9nJqcQVou0uuIZOEw==} engines: {node: '>=20.x', npm: '>=9.x'} peerDependencies: '@babel/runtime': ^7.x @@ -12580,8 +12555,8 @@ packages: peerDependencies: '@babel/runtime': ^7.x - '@web3auth/ws-embed@5.3.0': - resolution: {integrity: sha512-RWDEOqQxFIAoVjtvU5AVmj3El76YIXV2/Jme1I0dFDZbcQvNsVRsnLuMupRxiAeyOqdUCvgJkThOjmWubqWfwQ==} + '@web3auth/ws-embed@5.2.2': + resolution: {integrity: sha512-8VOQqEVz1ypOz/QF3Zw6qCeF0qXksvKMEcfz718HRu8LS08KoAsAKWGvhKfBk3CGZNcgE8dJPMufDyzruU+OFw==} engines: {node: '>=20.x', npm: '>=9.x'} peerDependencies: '@babel/runtime': 7.x @@ -12740,8 +12715,8 @@ packages: zod: optional: true - abitype@1.2.0: - resolution: {integrity: sha512-fD3ROjckUrWsybaSor2AdWxzA0e/DSyV2dA4aYd7bd8orHsoJjl09fOgKfUkTDfk0BsDGBf4NBgu/c7JoS2Npw==} + abitype@1.1.2: + resolution: {integrity: sha512-mqpSSIuddHs7t3IgsAweIZgYIQT4RhpIzrdcSN4fvHp9d77O0mglAAQ7fnI3r/hHIvgMwdpJAKr2T9K9leccYw==} peerDependencies: typescript: 5.6.2 zod: 4.1.13 @@ -13185,10 +13160,6 @@ packages: assertion-error@1.1.0: resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} - assertion-error@2.0.1: - resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} - engines: {node: '>=12'} - assign-symbols@1.0.0: resolution: {integrity: sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==} engines: {node: '>=0.10.0'} @@ -13287,6 +13258,9 @@ packages: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} + avvio@8.4.0: + resolution: {integrity: sha512-CDSwaxINFy59iNwhYnkvALBwZiTydGkOecZyPkqBpABYR1KqGEsET0VOOYDwtleZSUIdeY36DC2bSZ24CO1igA==} + avvio@9.1.0: resolution: {integrity: sha512-fYASnYi600CsH/j9EQov7lECAniYiBFiiAtBNuZYLA2leLe9qOvZzqYHFjtIj6gD2VMoMLP14834LFWvr4IfDw==} @@ -13705,9 +13679,6 @@ packages: bowser@2.12.1: resolution: {integrity: sha512-z4rE2Gxh7tvshQ4hluIT7XcFrgLIQaw9X3A+kTTRdovCz5PMukm/0QC/BKSYPj3omF5Qfypn9O/c5kgpmvYUCw==} - bowser@2.13.1: - resolution: {integrity: sha512-OHawaAbjwx6rqICCKgSG0SAnT05bzd7ppyKLVUITZpANBaaMFBAsaNkto3LoQ31tyFP5kNujE8Cdx85G9VzOkw==} - boxen@5.1.2: resolution: {integrity: sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==} engines: {node: '>=10'} @@ -14028,10 +13999,10 @@ packages: peerDependencies: '@capacitor/core': '>=7.0.0' - capacitor-plugin-safe-area@5.0.0: - resolution: {integrity: sha512-Q7+mV7oxGGDB4qPPGXFwS/dexR2/bo/uwkoBRTeR3d/rCzboi3Rnylw18MxSFx/mbQHD9BB7gSDWl+YnncJohQ==} + capacitor-plugin-safe-area@4.0.3: + resolution: {integrity: sha512-RteQU+EcwfQFup66fOrlfYNfkGi3jSVwD8YimUAdyZlelriiqRctmKK5ONYXyt+Wd2e5y5F1A081kB9SRHGg2Q==} peerDependencies: - '@capacitor/core': '>=8.0.0' + '@capacitor/core': '>=7.0.0' capacitor-standard-version@1.1.55: resolution: {integrity: sha512-wNiSqpSFWurIsJb/iF9RyLkKOvQ7x/Ntx4patyTbciy/pq4SiT+fp4GfU4fmfMTsajD0rd/PUajbPXKDdcY6RQ==} @@ -14068,10 +14039,6 @@ packages: resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==} engines: {node: '>=4'} - chai@5.3.3: - resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==} - engines: {node: '>=18'} - chalk-template@0.4.0: resolution: {integrity: sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg==} engines: {node: '>=12'} @@ -14148,10 +14115,6 @@ packages: check-error@1.0.3: resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} - check-error@2.1.3: - resolution: {integrity: sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==} - engines: {node: '>= 16'} - cheerio-select@2.1.0: resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==} @@ -14617,10 +14580,6 @@ packages: resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} engines: {node: '>= 0.6'} - content-disposition@1.0.1: - resolution: {integrity: sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==} - engines: {node: '>=18'} - content-type@1.0.5: resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} engines: {node: '>= 0.6'} @@ -15066,6 +15025,50 @@ packages: resolution: {integrity: sha512-YGZxdTTL9lmLkCUTpg4j0zQ7IhRB5ZmqNBbGCl3Tg6MP/d5/6sY7L5mmTjzbc6JKgVZYiqTQTNhPFsbXNGlRaA==} engines: {node: '>=0.8'} + d3-array@3.2.4: + resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==} + engines: {node: '>=12'} + + d3-color@3.1.0: + resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} + engines: {node: '>=12'} + + d3-ease@3.0.1: + resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==} + engines: {node: '>=12'} + + d3-format@3.1.0: + resolution: {integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==} + engines: {node: '>=12'} + + d3-interpolate@3.0.1: + resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} + engines: {node: '>=12'} + + d3-path@3.1.0: + resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==} + engines: {node: '>=12'} + + d3-scale@4.0.2: + resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==} + engines: {node: '>=12'} + + d3-shape@3.2.0: + resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==} + engines: {node: '>=12'} + + d3-time-format@4.1.0: + resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==} + engines: {node: '>=12'} + + d3-time@3.1.0: + resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==} + engines: {node: '>=12'} + + d3-timer@3.0.1: + resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} + engines: {node: '>=12'} + d@1.0.2: resolution: {integrity: sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==} engines: {node: '>=0.12'} @@ -15197,6 +15200,9 @@ packages: resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} engines: {node: '>=0.10.0'} + decimal.js-light@2.5.1: + resolution: {integrity: sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==} + decimal.js@10.6.0: resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==} @@ -15258,10 +15264,6 @@ packages: resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} engines: {node: '>=6'} - deep-eql@5.0.2: - resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} - engines: {node: '>=6'} - deep-equal@2.2.3: resolution: {integrity: sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==} engines: {node: '>= 0.4'} @@ -16607,10 +16609,6 @@ packages: resolution: {integrity: sha512-rtmc+cjLZqnu9dSYosX9EWmSJhTwpACgJQTfj4hgg2JjOD/6SIQalZrt4a3aQeh++oNxkazcaxrhPUj6+g5G/Q==} engines: {node: '>=0.10.0'} - expect-type@1.3.0: - resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==} - engines: {node: '>=12.0.0'} - expect@28.1.3: resolution: {integrity: sha512-eEh0xn8HlsuOBxFgIss+2mX85VAS4Qy3OSkjV7rlBWljtA4oWH37glVGyOZSZvErDT/yBywZdPGwCXuTvSG85g==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} @@ -16759,6 +16757,9 @@ packages: resolution: {integrity: sha512-h5+1OzzfCC3Ef7VbtKdcv7zsstUQwUDlYpUTvjeUsJAssPgLn7QzbboPtL5ro04Mq0rPOsMzl7q5hIbRs2wD1A==} engines: {node: '>=8.0.0'} + fast-content-type-parse@1.1.0: + resolution: {integrity: sha512-fBHHqSTFLVnR61C+gltJuE5GkVQMV0S2nqUO8TJ+5Z3qAKG8vAx4FKai1s5jq/inV1+sREynIWSuQ6HgoSXpDQ==} + fast-decode-uri-component@1.0.1: resolution: {integrity: sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==} @@ -16791,6 +16792,9 @@ packages: fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + fast-json-stringify@5.16.1: + resolution: {integrity: sha512-KAdnLvy1yu/XrRtP+LJnxbBGrhN+xXu+gt3EUvZhYGKCr3lFHq/7UFJHHFgmJKoqlh6B40bZLEv7w46B0mqn1g==} + fast-json-stringify@6.1.1: resolution: {integrity: sha512-DbgptncYEXZqDUOEl4krff4mUiVrTZZVI7BBrQR/T3BqMj/eM1flTC1Uk2uUoLcWCxjT95xKulV/Lc6hhOZsBQ==} @@ -16812,6 +16816,9 @@ packages: fast-text-encoding@1.0.6: resolution: {integrity: sha512-VhXlQgj9ioXCqGstD37E/HBeqEGV/qOD/kmbVG8h5xKBYvM1L3lR1Zn4555cQ8GkYbJa8aJSipLPndE1k6zK2w==} + fast-uri@2.4.0: + resolution: {integrity: sha512-ypuAmmMKInk5q7XcepxlnUWDLWv4GFtaJqAzWKqn62IpQ3pejtr5dTVbt3vwqVaMKmkNR55sTT+CqUKIaT21BA==} + fast-uri@3.1.0: resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} @@ -16827,11 +16834,14 @@ packages: resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} engines: {node: '>= 4.9.1'} - fastify-plugin@5.1.0: - resolution: {integrity: sha512-FAIDA8eovSt5qcDgcBvDuX/v0Cjz0ohGhENZ/wpc3y+oZCY2afZ9Baqql3g/lC+OHRnciQol4ww7tuthOb9idw==} + fastify-plugin@4.5.1: + resolution: {integrity: sha512-stRHYGeuqpEZTL1Ef0Ovr2ltazUT9g844X5z/zEBFLG8RYlpDiOCIG+ATvYEp+/zmc7sN29mcIMp8gvYplYPIQ==} - fastify@5.7.2: - resolution: {integrity: sha512-dBJolW+hm6N/yJVf6J5E1BxOBNkuXNl405nrfeR8SpvGWG3aCC2XDHyiFBdow8Win1kj7sjawQc257JlYY6M/A==} + fastify@4.29.1: + resolution: {integrity: sha512-m2kMNHIG92tSNWv+Z3UeTR9AWLLuo7KctC7mlFPtMEVrfjIhmQhkQnT9v15qA/BfVq3vvj134Y0jl9SBje3jXQ==} + + fastify@5.6.2: + resolution: {integrity: sha512-dPugdGnsvYkBlENLhCgX8yhyGCsCPrpA8lFWbTNU428l+YOnLgYHR69hzV8HWPC79n536EqzqQtvhtdaCE0dKg==} fastq@1.19.1: resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} @@ -17024,6 +17034,10 @@ packages: find-my-way-ts@0.1.6: resolution: {integrity: sha512-a85L9ZoXtNAey3Y6Z+eBWW658kO/MwR7zIafkIUPUMf3isZG0NCs2pjW2wtjxAKuJPxMAsHUIP4ZPGv0o5gyTA==} + find-my-way@8.2.2: + resolution: {integrity: sha512-Dobi7gcTEq8yszimcfp/R7+owiT4WncAJ7VTTgFH1jYJ5GaG1FbhjwDG820hptN0QDFvzVY3RfCzdInvGPGzjA==} + engines: {node: '>=14'} + find-my-way@9.3.0: resolution: {integrity: sha512-eRoFWQw+Yv2tuYlK2pjFS2jGXSxSppAs3hSQjfxVKxM5amECzIgYYc1FEI8ZmhSh/Ig+FrKEz43NLRKJjYCZVg==} engines: {node: '>=20'} @@ -17074,8 +17088,8 @@ packages: resolution: {integrity: sha512-Y8DcyKK+4pl4B93ooiy1G8qvdyRMkcNFfBSh+8rbVcw4cW8dgG0VXCCTp5NUwub8sn9vSPsOwpb9tE2OuFmcfQ==} engines: {node: '>=18'} - firebase@12.8.0: - resolution: {integrity: sha512-S1tCIR3ENecee0tY2cfTHfMkXqkitHfbsvqpCtvsT0Zi9vDB7A4CodAjHfHCjVvu/XtGy1LHLjOasVcF10rCVw==} + firebase@11.10.0: + resolution: {integrity: sha512-nKBXoDzF0DrXTBQJlZa+sbC5By99ysYU1D6PkMRYknm0nCW7rJly47q492Ht7Ndz5MeYSBuboKuhS1e6mFC03w==} flairup@1.0.0: resolution: {integrity: sha512-IKlE+pNvL2R+kVL1kEhUYqRxVqeFnjiIvHWDMLFXNaqyUdFXQM2wte44EfMYJNHkW16X991t2Zg8apKkhv7OBA==} @@ -18122,6 +18136,9 @@ packages: immer@10.2.0: resolution: {integrity: sha512-d/+XTN3zfODyjr89gM3mPq1WNX2B8pYsu7eORitdwyA2sBubnTl3laYlBk4sXY5FUa5qTZGBDPJICVbvqzjlbw==} + immer@11.1.3: + resolution: {integrity: sha512-6jQTc5z0KJFtr1UgFpIL3N9XSC3saRaI9PwWtzM2pSqkNGtiNkYY2OSwkOGDK2XcTRcLb1pi/aNkKZz0nxVH4Q==} + immer@9.0.21: resolution: {integrity: sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==} @@ -18284,6 +18301,10 @@ packages: resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} engines: {node: '>= 0.4'} + internmap@2.0.3: + resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} + engines: {node: '>=12'} + interpret@1.4.0: resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} engines: {node: '>= 0.10'} @@ -19338,12 +19359,15 @@ packages: json-rpc-random-id@1.0.1: resolution: {integrity: sha512-RJ9YYNCkhVDBuP4zN5BBtYAzEl03yq/jIIsyif0JY9qyJuQQZNeDK7anAPKKlyEtLSj2s8h6hNh2F8zO5q7ScA==} + json-schema-ref-resolver@1.0.1: + resolution: {integrity: sha512-EJAj1pgHc1hxF6vo2Z3s69fMjO1INq6eGHXZ8Z6wCQeldCuwxGK9Sxf4/cScGn3FZubCVUehfWtcDM/PLteCQw==} + json-schema-ref-resolver@3.0.0: resolution: {integrity: sha512-hOrZIVL5jyYFjzk7+y7n5JDzGlU8rfWDuYyHwGa2WA8/pcmMHezp2xsVwxrebD/Q9t8Nc5DboieySDpCp4WG4A==} - json-schema-resolver@3.0.0: - resolution: {integrity: sha512-HqMnbz0tz2DaEJ3ntsqtx3ezzZyDE7G56A/pPY/NGmrPu76UzsWquOpHFRAf5beTNXoH2LU5cQePVvRli1nchA==} - engines: {node: '>=20'} + json-schema-resolver@2.0.0: + resolution: {integrity: sha512-pJ4XLQP4Q9HTxl6RVDLJ8Cyh1uitSs0CzDBAz1uoJ4sRD/Bk7cFSXL1FUXDW3zJ7YnfliJx6eu8Jn283bpZ4Yg==} + engines: {node: '>=10'} json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} @@ -19602,6 +19626,9 @@ packages: lie@3.3.0: resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} + light-my-request@5.14.0: + resolution: {integrity: sha512-aORPWntbpH5esaYpGOOmri0OHDOe3wC5M2MQxZ9dvMLZm6DnaAn0kJlcbU9hwsQgLzmZyReKwFwwPkR+nHu5kA==} + light-my-request@6.6.0: resolution: {integrity: sha512-CHYbu8RtboSIoVsHZ6Ye4cj4Aw/yg2oAFimlF7mNvfDV192LR7nDiKtSIfCuLT7KokPSTn/9kfVLm5OGN0A28A==} @@ -19974,9 +20001,6 @@ packages: loupe@2.3.7: resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} - loupe@3.2.1: - resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==} - lower-case@2.0.2: resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} @@ -20807,6 +20831,9 @@ packages: mlly@1.8.0: resolution: {integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==} + mnemonist@0.39.6: + resolution: {integrity: sha512-A/0v5Z59y63US00cRSLiloEIw3t5G+MiKz4BhX21FI+YBJXBOGW0ohFxTxO08dsOYlzxo87T7vGfZKYp2bcAWA==} + modify-values@1.0.1: resolution: {integrity: sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==} engines: {node: '>=0.10.0'} @@ -21026,11 +21053,6 @@ packages: engines: {node: '>=16.0.0'} hasBin: true - native-run@2.0.3: - resolution: {integrity: sha512-U1PllBuzW5d1gfan+88L+Hky2eZx+9gv3Pf6rNBxKbORxi7boHzqiA6QFGSnqMem4j0A9tZ08NMIs5+0m/VS1Q==} - engines: {node: '>=16.0.0'} - hasBin: true - natural-compare-lite@1.4.0: resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} @@ -21396,6 +21418,9 @@ packages: resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} engines: {node: '>= 0.4'} + obliterator@2.0.5: + resolution: {integrity: sha512-42CPE9AhahZRsMNslczq0ctAEtqk8Eka26QofnqC346BZdHDySk3LWka23LI7ULIw11NmltpiLagIq8gBozxTw==} + oblivious-set@1.4.0: resolution: {integrity: sha512-szyd0ou0T8nsAqHtprRcP3WidfsN1TnAR5yWXf2mFCEr5ek3LEOkT6EZ/92Xfs74HIdyhG5WkGxIssMU0jBaeg==} engines: {node: '>=16'} @@ -21947,10 +21972,6 @@ packages: pathval@1.1.1: resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - pathval@2.0.1: - resolution: {integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==} - engines: {node: '>= 14.16'} - pbkdf2-hmac@1.2.1: resolution: {integrity: sha512-hVmhFGESrB+GtfSYHk7JYYIevsq2r96ilSdDdQmUz3ukicz4m31xzk2gWPFm3300eek54DV4MekINaXu/G8VyA==} @@ -22092,6 +22113,10 @@ packages: resolution: {integrity: sha512-0zZC2ygfdqvqK8zJIr1e+wT1T/L+LF6qvqvbzEQ6tiMAoTqEVK9a1K3YRu8HEUvGEvNqZyPJTtb2sNIoTkB83w==} hasBin: true + pino@9.14.0: + resolution: {integrity: sha512-8OEwKp5juEvb/MjpIc4hjqfgCNysrS94RIOMXYvpYCdm/jglrKEiAYmiumbmGhCvs+IcInsphYDFwqrjr7398w==} + hasBin: true + pirates@4.0.7: resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} engines: {node: '>= 6'} @@ -22624,6 +22649,9 @@ packages: resolution: {integrity: sha512-fMyMQbKCxX51YxR7YGCzPjLsU3yDzXFkP4oi1/Mt5Ixnk7GO/7uUTj8mrCHUwuvozWzI+V7QSJR9cZYnwNOZPg==} engines: {node: '>=10.0'} + process-warning@3.0.0: + resolution: {integrity: sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==} + process-warning@4.0.1: resolution: {integrity: sha512-3c2LzQ3rY9d0hc1emcsHhfT9Jwz0cChib/QN89oME2R451w5fy3f0afAhERFZAwrbDU43wk12d0ORBpDVME50Q==} @@ -23095,6 +23123,18 @@ packages: peerDependencies: react: ^17.0.2 + react-redux@9.2.0: + resolution: {integrity: sha512-ROY9fvHhwOD9ySfrF0wmvu//bKCQ6AeZZq1nJNtbDC+kk5DuSuNX/n6YWYF/SYy7bSba4D4FSz8DJeKY/S/r+g==} + peerDependencies: + '@types/react': ^18.2.25 || ^19 + react: ^18.0 || ^19 + redux: ^5.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + redux: + optional: true + react-refresh@0.14.2: resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} engines: {node: '>=0.10.0'} @@ -23265,6 +23305,14 @@ packages: resolution: {integrity: sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA==} engines: {node: '>= 4'} + recharts@3.6.0: + resolution: {integrity: sha512-L5bjxvQRAe26RlToBAziKUB7whaGKEwD3znoM6fz3DrTowCIC/FnJYnuq1GEzB8Zv2kdTfaxQfi5GoH0tBinyg==} + engines: {node: '>=18'} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-is: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + rechoir@0.6.2: resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} engines: {node: '>= 0.10'} @@ -23285,6 +23333,14 @@ packages: resolution: {integrity: sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==} engines: {node: '>=4'} + redux-thunk@3.1.0: + resolution: {integrity: sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw==} + peerDependencies: + redux: ^5.0.0 + + redux@5.0.1: + resolution: {integrity: sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==} + reflect.getprototypeof@1.0.10: resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} engines: {node: '>= 0.4'} @@ -23493,6 +23549,9 @@ packages: requires-port@1.0.0: resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + reselect@5.1.1: + resolution: {integrity: sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==} + resize-observer-polyfill@1.5.1: resolution: {integrity: sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==} @@ -23582,6 +23641,10 @@ packages: resolution: {integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==} engines: {node: '>=0.12'} + ret@0.4.3: + resolution: {integrity: sha512-0f4Memo5QP7WQyUEAYUO3esD/XjOc3Zjjg5CPsAq1p8sIu0XPeMbHJemKA0BO7tV0X7+A0FoEpbmHXWxPyD3wQ==} + engines: {node: '>=10'} + ret@0.5.0: resolution: {integrity: sha512-I1XxrZSQ+oErkRR4jYbAyEEu2I0avBvvMM5JN+6EBprOGRCs63ENqZ3vjavq8fBw2+62G5LF5XelKwuJpcvcxw==} engines: {node: '>=10'} @@ -23846,6 +23909,9 @@ packages: resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} engines: {node: '>= 0.4'} + safe-regex2@3.1.0: + resolution: {integrity: sha512-RAAZAGbap2kBfbVhvmnTFv73NWLMvDGOITFYTZBAaY8eR+Ir4ef7Up/e7amo+y1+AH+3PtLkrt9mvcTsG9LXug==} + safe-regex2@5.0.0: resolution: {integrity: sha512-YwJwe5a51WlK7KbOJREPdjNrpViQBI3p4T50lfwPuDhZnE3XGVTlGvi+aolc5+RvxDD6bnUmjVsU9n1eboLUYw==} @@ -23952,6 +24018,9 @@ packages: resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} engines: {node: '>=4'} + secure-json-parse@2.7.0: + resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} + secure-json-parse@4.1.0: resolution: {integrity: sha512-l4KnYfEyqYJxDwlNVyRfO2E4NTHfMKAWdUuA8J0yve2Dz/E/PdBepY03RvyJpssIpRFwJoCD55wA+mEDs6ByWA==} @@ -24791,9 +24860,6 @@ packages: strip-literal@2.1.1: resolution: {integrity: sha512-631UJ6O00eNGfMiWG78ck80dfBab8X6IVFB51jZK5Icd7XAs60Z5y7QdSd/wGIklnWvRbUNloVzhOKKmutxQ6Q==} - strip-literal@3.1.0: - resolution: {integrity: sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==} - strip-outer@1.0.1: resolution: {integrity: sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==} engines: {node: '>=0.10.0'} @@ -25016,10 +25082,6 @@ packages: resolution: {integrity: sha512-7NyxrTE4Anh8km8iEy7o0QYPs+0JKBTj5ZaqHg6B39erLg0qYXN3BijtShwbsNSvQ+LN75+KV+C4QR/f6Gwnpg==} engines: {node: '>=18'} - tar@7.5.6: - resolution: {integrity: sha512-xqUeu2JAIJpXyvskvU3uvQW8PAmHrtXp2KDuMJwQqW8Sqq0CaZBAQ+dKS3RBXVhU4wC5NjAdKrmh84241gO9cA==} - engines: {node: '>=18'} - teeny-request@9.0.0: resolution: {integrity: sha512-resvxdc6Mgb7YEThw6G6bExlXKkv6+YbuzGg9xuXxSgxJF7Ozs+o8Y9+2R3sArdWdW8nOokoQb1yrpFB0pQK2g==} engines: {node: '>=14'} @@ -25179,22 +25241,10 @@ packages: resolution: {integrity: sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==} engines: {node: '>=14.0.0'} - tinypool@1.1.1: - resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} - engines: {node: ^18.0.0 || >=20.0.0} - - tinyrainbow@2.0.0: - resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} - engines: {node: '>=14.0.0'} - tinyspy@2.2.1: resolution: {integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==} engines: {node: '>=14.0.0'} - tinyspy@4.0.4: - resolution: {integrity: sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==} - engines: {node: '>=14.0.0'} - titleize@3.0.0: resolution: {integrity: sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==} engines: {node: '>=12'} @@ -26256,6 +26306,9 @@ packages: vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + victory-vendor@37.3.6: + resolution: {integrity: sha512-SbPDPdDBYp+5MJHhBCAyI7wKM3d5ivekigc2Dk2s7pgbZ9wIgIBYGVw4zGHBml/qTFbexrofXW6Gu4noGxrOwQ==} + viem@2.39.3: resolution: {integrity: sha512-s11rPQRvUEdc5qHK3xT4fIk4qvgPAaLwaTFq+EbFlcJJD+Xn3R4mc9H6B6fquEiHl/mdsdbG/uKCnYpoNtHNHw==} peerDependencies: @@ -26264,24 +26317,11 @@ packages: typescript: optional: true - viem@2.40.4: - resolution: {integrity: sha512-3W4f23daRtoOExWKwgT+Uy8c8Hoy4wTikhxRrjlKGU3m9hp8wQ+62TDXngapQ7kaEbHabCqb4aJSRVnEa7N62g==} - peerDependencies: - typescript: 5.6.2 - peerDependenciesMeta: - typescript: - optional: true - vite-node@1.6.1: resolution: {integrity: sha512-YAXkfvGtuTzwWbDSACdJSg4A4DZiAqckWe90Zapc/sEX3XvHcw1NdurM/6od8J207tSDqNbSsgdCacBgvJKFuA==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true - vite-node@3.2.4: - resolution: {integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} - hasBin: true - vite-plugin-svgr@3.3.0: resolution: {integrity: sha512-vWZMCcGNdPqgziYFKQ3Y95XP0d0YGp28+MM3Dp9cTa/px5CKcHHrIoPl2Jw81rgVm6/ZUNONzjXbZQZ7Kw66og==} peerDependencies: @@ -26512,34 +26552,6 @@ packages: jsdom: optional: true - vitest@3.2.4: - resolution: {integrity: sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} - hasBin: true - peerDependencies: - '@edge-runtime/vm': '*' - '@types/debug': ^4.1.12 - '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 - '@vitest/browser': 3.2.4 - '@vitest/ui': 3.2.4 - happy-dom: '*' - jsdom: '*' - peerDependenciesMeta: - '@edge-runtime/vm': - optional: true - '@types/debug': - optional: true - '@types/node': - optional: true - '@vitest/browser': - optional: true - '@vitest/ui': - optional: true - happy-dom: - optional: true - jsdom: - optional: true - vizion@2.2.1: resolution: {integrity: sha512-sfAcO2yeSU0CSPFI/DmZp3FsFE9T+8913nv1xWBOyzODv13fwkn6Vl7HqxGpkr9F608M+8SuFId3s+BlZqfXww==} engines: {node: '>=4.0'} @@ -29515,38 +29527,38 @@ snapshots: '@bcoe/v8-coverage@0.2.3': {} - '@capacitor-community/media@9.0.1(@capacitor/core@8.0.1)': + '@capacitor-community/media@8.0.1(@capacitor/core@7.4.2)': dependencies: - '@capacitor/core': 8.0.1 + '@capacitor/core': 7.4.2 - '@capacitor-community/sqlite@7.0.2(@capacitor/core@8.0.1)': + '@capacitor-community/sqlite@7.0.2(@capacitor/core@7.4.2)': dependencies: - '@capacitor/core': 8.0.1 + '@capacitor/core': 7.4.2 jeep-sqlite: 2.8.0 - '@capacitor-firebase/analytics@8.0.1(@capacitor/core@8.0.1)(firebase@12.8.0)': + '@capacitor-firebase/analytics@7.3.0(@capacitor/core@7.4.2)(firebase@11.10.0)': dependencies: - '@capacitor/core': 8.0.1 + '@capacitor/core': 7.4.2 optionalDependencies: - firebase: 12.8.0 + firebase: 11.10.0 - '@capacitor-firebase/authentication@8.0.1(@capacitor/core@8.0.1)(firebase@12.8.0)': + '@capacitor-firebase/authentication@7.4.0(@capacitor/core@7.4.2)(firebase@11.10.0)': dependencies: - '@capacitor/core': 8.0.1 + '@capacitor/core': 7.4.2 optionalDependencies: - firebase: 12.8.0 + firebase: 11.10.0 - '@capacitor-mlkit/barcode-scanning@8.0.0(@capacitor/core@8.0.1)': + '@capacitor-mlkit/barcode-scanning@7.3.0(@capacitor/core@7.4.2)': dependencies: - '@capacitor/core': 8.0.1 + '@capacitor/core': 7.4.2 - '@capacitor/android@8.0.1(@capacitor/core@8.0.1)': + '@capacitor/android@7.4.4(@capacitor/core@7.4.2)': dependencies: - '@capacitor/core': 8.0.1 + '@capacitor/core': 7.4.2 - '@capacitor/app@8.0.0(@capacitor/core@8.0.1)': + '@capacitor/app@7.1.0(@capacitor/core@7.4.2)': dependencies: - '@capacitor/core': 8.0.1 + '@capacitor/core': 7.4.2 '@capacitor/assets@3.0.5(@swc/core@1.15.2(@swc/helpers@0.5.17))(@types/node@12.20.55)(typescript@5.6.2)': dependencies: @@ -29573,13 +29585,13 @@ snapshots: - supports-color - typescript - '@capacitor/browser@8.0.0(@capacitor/core@8.0.1)': + '@capacitor/browser@7.0.2(@capacitor/core@7.4.2)': dependencies: - '@capacitor/core': 8.0.1 + '@capacitor/core': 7.4.2 - '@capacitor/camera@8.0.0(@capacitor/core@8.0.1)': + '@capacitor/camera@7.0.2(@capacitor/core@7.4.2)': dependencies: - '@capacitor/core': 8.0.1 + '@capacitor/core': 7.4.2 '@capacitor/cli@5.7.8': dependencies: @@ -29598,12 +29610,12 @@ snapshots: rimraf: 4.4.1 semver: 7.7.3 tar: 6.2.1 - tslib: 2.8.1 + tslib: 2.6.2 xml2js: 0.5.0 transitivePeerDependencies: - supports-color - '@capacitor/cli@8.0.1': + '@capacitor/cli@7.4.4': dependencies: '@ionic/cli-framework-output': 2.2.8 '@ionic/utils-subprocess': 3.0.1 @@ -29613,7 +29625,7 @@ snapshots: env-paths: 2.2.1 fs-extra: 11.3.2 kleur: 4.1.5 - native-run: 2.0.3 + native-run: 2.0.1 open: 8.4.2 plist: 3.1.0 prompts: 2.4.2 @@ -29625,69 +29637,69 @@ snapshots: transitivePeerDependencies: - supports-color - '@capacitor/clipboard@8.0.0(@capacitor/core@8.0.1)': + '@capacitor/clipboard@7.0.2(@capacitor/core@7.4.2)': dependencies: - '@capacitor/core': 8.0.1 + '@capacitor/core': 7.4.2 - '@capacitor/core@8.0.1': + '@capacitor/core@7.4.2': dependencies: tslib: 2.8.1 - '@capacitor/file-transfer@2.0.3(@capacitor/core@8.0.1)': + '@capacitor/file-transfer@1.0.6(@capacitor/core@7.4.2)': dependencies: - '@capacitor/core': 8.0.1 + '@capacitor/core': 7.4.2 '@capacitor/synapse': 1.0.4 - '@capacitor/filesystem@8.1.0(@capacitor/core@8.0.1)': + '@capacitor/filesystem@7.1.5(@capacitor/core@7.4.2)': dependencies: - '@capacitor/core': 8.0.1 + '@capacitor/core': 7.4.2 '@capacitor/synapse': 1.0.4 - '@capacitor/haptics@8.0.0(@capacitor/core@8.0.1)': + '@capacitor/haptics@7.0.2(@capacitor/core@7.4.2)': dependencies: - '@capacitor/core': 8.0.1 + '@capacitor/core': 7.4.2 - '@capacitor/ios@8.0.1(@capacitor/core@8.0.1)': + '@capacitor/ios@7.4.4(@capacitor/core@7.4.2)': dependencies: - '@capacitor/core': 8.0.1 + '@capacitor/core': 7.4.2 - '@capacitor/keyboard@8.0.0(@capacitor/core@8.0.1)': + '@capacitor/keyboard@7.0.3(@capacitor/core@7.4.2)': dependencies: - '@capacitor/core': 8.0.1 + '@capacitor/core': 7.4.2 - '@capacitor/local-notifications@8.0.0(@capacitor/core@8.0.1)': + '@capacitor/local-notifications@7.0.3(@capacitor/core@7.4.2)': dependencies: - '@capacitor/core': 8.0.1 + '@capacitor/core': 7.4.2 - '@capacitor/network@8.0.0(@capacitor/core@8.0.1)': + '@capacitor/network@7.0.2(@capacitor/core@7.4.2)': dependencies: - '@capacitor/core': 8.0.1 + '@capacitor/core': 7.4.2 - '@capacitor/push-notifications@8.0.0(@capacitor/core@8.0.1)': + '@capacitor/push-notifications@7.0.3(@capacitor/core@7.4.2)': dependencies: - '@capacitor/core': 8.0.1 + '@capacitor/core': 7.4.2 - '@capacitor/share@8.0.0(@capacitor/core@8.0.1)': + '@capacitor/share@7.0.2(@capacitor/core@7.4.2)': dependencies: - '@capacitor/core': 8.0.1 + '@capacitor/core': 7.4.2 - '@capacitor/splash-screen@8.0.0(@capacitor/core@8.0.1)': + '@capacitor/splash-screen@7.0.3(@capacitor/core@7.4.2)': dependencies: - '@capacitor/core': 8.0.1 + '@capacitor/core': 7.4.2 - '@capacitor/status-bar@8.0.0(@capacitor/core@8.0.1)': + '@capacitor/status-bar@7.0.3(@capacitor/core@7.4.2)': dependencies: - '@capacitor/core': 8.0.1 + '@capacitor/core': 7.4.2 '@capacitor/synapse@1.0.4': {} - '@capawesome/capacitor-badge@8.0.0(@capacitor/core@8.0.1)': + '@capawesome/capacitor-badge@7.0.1(@capacitor/core@7.4.2)': dependencies: - '@capacitor/core': 8.0.1 + '@capacitor/core': 7.4.2 - '@capgo/capacitor-updater@8.41.12(@capacitor/core@8.0.1)': + '@capgo/capacitor-updater@7.8.7(@capacitor/core@7.4.2)': dependencies: - '@capacitor/core': 8.0.1 + '@capacitor/core': 7.4.2 '@capgo/cli@7.29.1': {} @@ -32246,7 +32258,7 @@ snapshots: source-map-support: 0.5.21 stacktrace-parser: 0.1.11 structured-headers: 0.4.1 - tar: 7.5.6 + tar: 7.5.2 terminal-link: 2.1.1 undici: 6.22.0 wrap-ansi: 7.0.0 @@ -32509,7 +32521,13 @@ snapshots: '@fal-works/esbuild-plugin-global-externals@2.1.2': {} - '@fastify/accept-negotiator@2.0.1': {} + '@fastify/accept-negotiator@1.1.0': {} + + '@fastify/ajv-compiler@3.6.0': + dependencies: + ajv: 8.17.1 + ajv-formats: 2.1.1(ajv@8.17.1) + fast-uri: 2.4.0 '@fastify/ajv-compiler@4.0.5': dependencies: @@ -32521,19 +32539,29 @@ snapshots: '@fastify/busboy@3.2.0': {} - '@fastify/cors@11.2.0': + '@fastify/cors@9.0.1': dependencies: - fastify-plugin: 5.1.0 - toad-cache: 3.7.0 + fastify-plugin: 4.5.1 + mnemonist: 0.39.6 + + '@fastify/error@3.4.1': {} '@fastify/error@4.2.0': {} + '@fastify/fast-json-stringify-compiler@4.3.0': + dependencies: + fast-json-stringify: 5.16.1 + '@fastify/fast-json-stringify-compiler@5.0.3': dependencies: fast-json-stringify: 6.1.1 '@fastify/forwarded@3.0.1': {} + '@fastify/merge-json-schemas@0.1.1': + dependencies: + fast-deep-equal: 3.1.3 + '@fastify/merge-json-schemas@0.2.1': dependencies: dequal: 2.0.3 @@ -32543,7 +32571,7 @@ snapshots: '@fastify/forwarded': 3.0.1 ipaddr.js: 2.2.0 - '@fastify/send@4.1.0': + '@fastify/send@2.1.0': dependencies: '@lukeed/ms': 2.0.2 escape-html: 1.0.3 @@ -32551,27 +32579,27 @@ snapshots: http-errors: 2.0.0 mime: 3.0.0 - '@fastify/static@9.0.0': + '@fastify/static@7.0.4': dependencies: - '@fastify/accept-negotiator': 2.0.1 - '@fastify/send': 4.1.0 - content-disposition: 1.0.1 - fastify-plugin: 5.1.0 + '@fastify/accept-negotiator': 1.1.0 + '@fastify/send': 2.1.0 + content-disposition: 0.5.4 + fastify-plugin: 4.5.1 fastq: 1.19.1 - glob: 13.0.0 + glob: 10.5.0 - '@fastify/swagger-ui@5.2.4': + '@fastify/swagger-ui@4.2.0': dependencies: - '@fastify/static': 9.0.0 - fastify-plugin: 5.1.0 + '@fastify/static': 7.0.4 + fastify-plugin: 4.5.1 openapi-types: 12.1.3 rfdc: 1.4.1 yaml: 2.8.1 - '@fastify/swagger@9.6.1': + '@fastify/swagger@8.15.0': dependencies: - fastify-plugin: 5.1.0 - json-schema-resolver: 3.0.0 + fastify-plugin: 4.5.1 + json-schema-resolver: 2.0.0 openapi-types: 12.1.3 rfdc: 1.4.1 yaml: 2.8.1 @@ -32580,46 +32608,46 @@ snapshots: '@filestack/loader@1.0.9': {} - '@firebase/ai@2.7.0(@firebase/app-types@0.9.3)(@firebase/app@0.14.7)': + '@firebase/ai@1.4.1(@firebase/app-types@0.9.3)(@firebase/app@0.13.2)': dependencies: - '@firebase/app': 0.14.7 + '@firebase/app': 0.13.2 '@firebase/app-check-interop-types': 0.3.3 '@firebase/app-types': 0.9.3 - '@firebase/component': 0.7.0 - '@firebase/logger': 0.5.0 - '@firebase/util': 1.13.0 + '@firebase/component': 0.6.18 + '@firebase/logger': 0.4.4 + '@firebase/util': 1.12.1 tslib: 2.8.1 - '@firebase/analytics-compat@0.2.25(@firebase/app-compat@0.5.7)(@firebase/app@0.14.7)': + '@firebase/analytics-compat@0.2.23(@firebase/app-compat@0.4.2)(@firebase/app@0.13.2)': dependencies: - '@firebase/analytics': 0.10.19(@firebase/app@0.14.7) + '@firebase/analytics': 0.10.17(@firebase/app@0.13.2) '@firebase/analytics-types': 0.8.3 - '@firebase/app-compat': 0.5.7 - '@firebase/component': 0.7.0 - '@firebase/util': 1.13.0 + '@firebase/app-compat': 0.4.2 + '@firebase/component': 0.6.18 + '@firebase/util': 1.12.1 tslib: 2.8.1 transitivePeerDependencies: - '@firebase/app' '@firebase/analytics-types@0.8.3': {} - '@firebase/analytics@0.10.19(@firebase/app@0.14.7)': + '@firebase/analytics@0.10.17(@firebase/app@0.13.2)': dependencies: - '@firebase/app': 0.14.7 - '@firebase/component': 0.7.0 - '@firebase/installations': 0.6.19(@firebase/app@0.14.7) - '@firebase/logger': 0.5.0 - '@firebase/util': 1.13.0 + '@firebase/app': 0.13.2 + '@firebase/component': 0.6.18 + '@firebase/installations': 0.6.18(@firebase/app@0.13.2) + '@firebase/logger': 0.4.4 + '@firebase/util': 1.12.1 tslib: 2.8.1 - '@firebase/app-check-compat@0.4.0(@firebase/app-compat@0.5.7)(@firebase/app@0.14.7)': + '@firebase/app-check-compat@0.3.26(@firebase/app-compat@0.4.2)(@firebase/app@0.13.2)': dependencies: - '@firebase/app-check': 0.11.0(@firebase/app@0.14.7) + '@firebase/app-check': 0.10.1(@firebase/app@0.13.2) '@firebase/app-check-types': 0.5.3 - '@firebase/app-compat': 0.5.7 - '@firebase/component': 0.7.0 - '@firebase/logger': 0.5.0 - '@firebase/util': 1.13.0 + '@firebase/app-compat': 0.4.2 + '@firebase/component': 0.6.18 + '@firebase/logger': 0.4.4 + '@firebase/util': 1.12.1 tslib: 2.8.1 transitivePeerDependencies: - '@firebase/app' @@ -32628,39 +32656,39 @@ snapshots: '@firebase/app-check-types@0.5.3': {} - '@firebase/app-check@0.11.0(@firebase/app@0.14.7)': + '@firebase/app-check@0.10.1(@firebase/app@0.13.2)': dependencies: - '@firebase/app': 0.14.7 - '@firebase/component': 0.7.0 - '@firebase/logger': 0.5.0 - '@firebase/util': 1.13.0 + '@firebase/app': 0.13.2 + '@firebase/component': 0.6.18 + '@firebase/logger': 0.4.4 + '@firebase/util': 1.12.1 tslib: 2.8.1 - '@firebase/app-compat@0.5.7': + '@firebase/app-compat@0.4.2': dependencies: - '@firebase/app': 0.14.7 - '@firebase/component': 0.7.0 - '@firebase/logger': 0.5.0 - '@firebase/util': 1.13.0 + '@firebase/app': 0.13.2 + '@firebase/component': 0.6.18 + '@firebase/logger': 0.4.4 + '@firebase/util': 1.12.1 tslib: 2.8.1 '@firebase/app-types@0.9.3': {} - '@firebase/app@0.14.7': + '@firebase/app@0.13.2': dependencies: - '@firebase/component': 0.7.0 - '@firebase/logger': 0.5.0 - '@firebase/util': 1.13.0 + '@firebase/component': 0.6.18 + '@firebase/logger': 0.4.4 + '@firebase/util': 1.12.1 idb: 7.1.1 tslib: 2.8.1 - '@firebase/auth-compat@0.6.2(@firebase/app-compat@0.5.7)(@firebase/app-types@0.9.3)(@firebase/app@0.14.7)': + '@firebase/auth-compat@0.5.28(@firebase/app-compat@0.4.2)(@firebase/app-types@0.9.3)(@firebase/app@0.13.2)': dependencies: - '@firebase/app-compat': 0.5.7 - '@firebase/auth': 1.12.0(@firebase/app@0.14.7) - '@firebase/auth-types': 0.13.0(@firebase/app-types@0.9.3)(@firebase/util@1.13.0) - '@firebase/component': 0.7.0 - '@firebase/util': 1.13.0 + '@firebase/app-compat': 0.4.2 + '@firebase/auth': 1.10.8(@firebase/app@0.13.2) + '@firebase/auth-types': 0.13.0(@firebase/app-types@0.9.3)(@firebase/util@1.12.1) + '@firebase/component': 0.6.18 + '@firebase/util': 1.12.1 tslib: 2.8.1 transitivePeerDependencies: - '@firebase/app' @@ -32669,17 +32697,22 @@ snapshots: '@firebase/auth-interop-types@0.2.4': {} - '@firebase/auth-types@0.13.0(@firebase/app-types@0.9.3)(@firebase/util@1.13.0)': + '@firebase/auth-types@0.13.0(@firebase/app-types@0.9.3)(@firebase/util@1.12.1)': dependencies: '@firebase/app-types': 0.9.3 - '@firebase/util': 1.13.0 + '@firebase/util': 1.12.1 - '@firebase/auth@1.12.0(@firebase/app@0.14.7)': + '@firebase/auth@1.10.8(@firebase/app@0.13.2)': dependencies: - '@firebase/app': 0.14.7 - '@firebase/component': 0.7.0 - '@firebase/logger': 0.5.0 - '@firebase/util': 1.13.0 + '@firebase/app': 0.13.2 + '@firebase/component': 0.6.18 + '@firebase/logger': 0.4.4 + '@firebase/util': 1.12.1 + tslib: 2.8.1 + + '@firebase/component@0.6.18': + dependencies: + '@firebase/util': 1.12.1 tslib: 2.8.1 '@firebase/component@0.7.0': @@ -32687,13 +32720,22 @@ snapshots: '@firebase/util': 1.13.0 tslib: 2.8.1 - '@firebase/data-connect@0.3.12(@firebase/app@0.14.7)': + '@firebase/data-connect@0.3.10(@firebase/app@0.13.2)': dependencies: - '@firebase/app': 0.14.7 + '@firebase/app': 0.13.2 '@firebase/auth-interop-types': 0.2.4 - '@firebase/component': 0.7.0 - '@firebase/logger': 0.5.0 - '@firebase/util': 1.13.0 + '@firebase/component': 0.6.18 + '@firebase/logger': 0.4.4 + '@firebase/util': 1.12.1 + tslib: 2.8.1 + + '@firebase/database-compat@2.0.11': + dependencies: + '@firebase/component': 0.6.18 + '@firebase/database': 1.0.20 + '@firebase/database-types': 1.0.15 + '@firebase/logger': 0.4.4 + '@firebase/util': 1.12.1 tslib: 2.8.1 '@firebase/database-compat@2.1.0': @@ -32705,11 +32747,26 @@ snapshots: '@firebase/util': 1.13.0 tslib: 2.8.1 + '@firebase/database-types@1.0.15': + dependencies: + '@firebase/app-types': 0.9.3 + '@firebase/util': 1.12.1 + '@firebase/database-types@1.0.16': dependencies: '@firebase/app-types': 0.9.3 '@firebase/util': 1.13.0 + '@firebase/database@1.0.20': + dependencies: + '@firebase/app-check-interop-types': 0.3.3 + '@firebase/auth-interop-types': 0.2.4 + '@firebase/component': 0.6.18 + '@firebase/logger': 0.4.4 + '@firebase/util': 1.12.1 + faye-websocket: 0.11.4 + tslib: 2.8.1 + '@firebase/database@1.1.0': dependencies: '@firebase/app-check-interop-types': 0.3.3 @@ -32720,64 +32777,64 @@ snapshots: faye-websocket: 0.11.4 tslib: 2.8.1 - '@firebase/firestore-compat@0.4.4(@firebase/app-compat@0.5.7)(@firebase/app-types@0.9.3)(@firebase/app@0.14.7)': + '@firebase/firestore-compat@0.3.53(@firebase/app-compat@0.4.2)(@firebase/app-types@0.9.3)(@firebase/app@0.13.2)': dependencies: - '@firebase/app-compat': 0.5.7 - '@firebase/component': 0.7.0 - '@firebase/firestore': 4.10.0(@firebase/app@0.14.7) - '@firebase/firestore-types': 3.0.3(@firebase/app-types@0.9.3)(@firebase/util@1.13.0) - '@firebase/util': 1.13.0 + '@firebase/app-compat': 0.4.2 + '@firebase/component': 0.6.18 + '@firebase/firestore': 4.8.0(@firebase/app@0.13.2) + '@firebase/firestore-types': 3.0.3(@firebase/app-types@0.9.3)(@firebase/util@1.12.1) + '@firebase/util': 1.12.1 tslib: 2.8.1 transitivePeerDependencies: - '@firebase/app' - '@firebase/app-types' - '@firebase/firestore-types@3.0.3(@firebase/app-types@0.9.3)(@firebase/util@1.13.0)': + '@firebase/firestore-types@3.0.3(@firebase/app-types@0.9.3)(@firebase/util@1.12.1)': dependencies: '@firebase/app-types': 0.9.3 - '@firebase/util': 1.13.0 + '@firebase/util': 1.12.1 - '@firebase/firestore@4.10.0(@firebase/app@0.14.7)': + '@firebase/firestore@4.8.0(@firebase/app@0.13.2)': dependencies: - '@firebase/app': 0.14.7 - '@firebase/component': 0.7.0 - '@firebase/logger': 0.5.0 - '@firebase/util': 1.13.0 - '@firebase/webchannel-wrapper': 1.0.5 + '@firebase/app': 0.13.2 + '@firebase/component': 0.6.18 + '@firebase/logger': 0.4.4 + '@firebase/util': 1.12.1 + '@firebase/webchannel-wrapper': 1.0.3 '@grpc/grpc-js': 1.9.15 '@grpc/proto-loader': 0.7.15 tslib: 2.8.1 - '@firebase/functions-compat@0.4.1(@firebase/app-compat@0.5.7)(@firebase/app@0.14.7)': + '@firebase/functions-compat@0.3.26(@firebase/app-compat@0.4.2)(@firebase/app@0.13.2)': dependencies: - '@firebase/app-compat': 0.5.7 - '@firebase/component': 0.7.0 - '@firebase/functions': 0.13.1(@firebase/app@0.14.7) + '@firebase/app-compat': 0.4.2 + '@firebase/component': 0.6.18 + '@firebase/functions': 0.12.9(@firebase/app@0.13.2) '@firebase/functions-types': 0.6.3 - '@firebase/util': 1.13.0 + '@firebase/util': 1.12.1 tslib: 2.8.1 transitivePeerDependencies: - '@firebase/app' '@firebase/functions-types@0.6.3': {} - '@firebase/functions@0.13.1(@firebase/app@0.14.7)': + '@firebase/functions@0.12.9(@firebase/app@0.13.2)': dependencies: - '@firebase/app': 0.14.7 + '@firebase/app': 0.13.2 '@firebase/app-check-interop-types': 0.3.3 '@firebase/auth-interop-types': 0.2.4 - '@firebase/component': 0.7.0 + '@firebase/component': 0.6.18 '@firebase/messaging-interop-types': 0.2.3 - '@firebase/util': 1.13.0 + '@firebase/util': 1.12.1 tslib: 2.8.1 - '@firebase/installations-compat@0.2.19(@firebase/app-compat@0.5.7)(@firebase/app-types@0.9.3)(@firebase/app@0.14.7)': + '@firebase/installations-compat@0.2.18(@firebase/app-compat@0.4.2)(@firebase/app-types@0.9.3)(@firebase/app@0.13.2)': dependencies: - '@firebase/app-compat': 0.5.7 - '@firebase/component': 0.7.0 - '@firebase/installations': 0.6.19(@firebase/app@0.14.7) + '@firebase/app-compat': 0.4.2 + '@firebase/component': 0.6.18 + '@firebase/installations': 0.6.18(@firebase/app@0.13.2) '@firebase/installations-types': 0.5.3(@firebase/app-types@0.9.3) - '@firebase/util': 1.13.0 + '@firebase/util': 1.12.1 tslib: 2.8.1 transitivePeerDependencies: - '@firebase/app' @@ -32787,116 +32844,124 @@ snapshots: dependencies: '@firebase/app-types': 0.9.3 - '@firebase/installations@0.6.19(@firebase/app@0.14.7)': + '@firebase/installations@0.6.18(@firebase/app@0.13.2)': dependencies: - '@firebase/app': 0.14.7 - '@firebase/component': 0.7.0 - '@firebase/util': 1.13.0 + '@firebase/app': 0.13.2 + '@firebase/component': 0.6.18 + '@firebase/util': 1.12.1 idb: 7.1.1 tslib: 2.8.1 + '@firebase/logger@0.4.4': + dependencies: + tslib: 2.8.1 + '@firebase/logger@0.5.0': dependencies: tslib: 2.8.1 - '@firebase/messaging-compat@0.2.23(@firebase/app-compat@0.5.7)(@firebase/app@0.14.7)': + '@firebase/messaging-compat@0.2.22(@firebase/app-compat@0.4.2)(@firebase/app@0.13.2)': dependencies: - '@firebase/app-compat': 0.5.7 - '@firebase/component': 0.7.0 - '@firebase/messaging': 0.12.23(@firebase/app@0.14.7) - '@firebase/util': 1.13.0 + '@firebase/app-compat': 0.4.2 + '@firebase/component': 0.6.18 + '@firebase/messaging': 0.12.22(@firebase/app@0.13.2) + '@firebase/util': 1.12.1 tslib: 2.8.1 transitivePeerDependencies: - '@firebase/app' '@firebase/messaging-interop-types@0.2.3': {} - '@firebase/messaging@0.12.23(@firebase/app@0.14.7)': + '@firebase/messaging@0.12.22(@firebase/app@0.13.2)': dependencies: - '@firebase/app': 0.14.7 - '@firebase/component': 0.7.0 - '@firebase/installations': 0.6.19(@firebase/app@0.14.7) + '@firebase/app': 0.13.2 + '@firebase/component': 0.6.18 + '@firebase/installations': 0.6.18(@firebase/app@0.13.2) '@firebase/messaging-interop-types': 0.2.3 - '@firebase/util': 1.13.0 + '@firebase/util': 1.12.1 idb: 7.1.1 tslib: 2.8.1 - '@firebase/performance-compat@0.2.22(@firebase/app-compat@0.5.7)(@firebase/app@0.14.7)': + '@firebase/performance-compat@0.2.20(@firebase/app-compat@0.4.2)(@firebase/app@0.13.2)': dependencies: - '@firebase/app-compat': 0.5.7 - '@firebase/component': 0.7.0 - '@firebase/logger': 0.5.0 - '@firebase/performance': 0.7.9(@firebase/app@0.14.7) + '@firebase/app-compat': 0.4.2 + '@firebase/component': 0.6.18 + '@firebase/logger': 0.4.4 + '@firebase/performance': 0.7.7(@firebase/app@0.13.2) '@firebase/performance-types': 0.2.3 - '@firebase/util': 1.13.0 + '@firebase/util': 1.12.1 tslib: 2.8.1 transitivePeerDependencies: - '@firebase/app' '@firebase/performance-types@0.2.3': {} - '@firebase/performance@0.7.9(@firebase/app@0.14.7)': + '@firebase/performance@0.7.7(@firebase/app@0.13.2)': dependencies: - '@firebase/app': 0.14.7 - '@firebase/component': 0.7.0 - '@firebase/installations': 0.6.19(@firebase/app@0.14.7) - '@firebase/logger': 0.5.0 - '@firebase/util': 1.13.0 + '@firebase/app': 0.13.2 + '@firebase/component': 0.6.18 + '@firebase/installations': 0.6.18(@firebase/app@0.13.2) + '@firebase/logger': 0.4.4 + '@firebase/util': 1.12.1 tslib: 2.8.1 web-vitals: 4.2.4 - '@firebase/remote-config-compat@0.2.21(@firebase/app-compat@0.5.7)(@firebase/app@0.14.7)': + '@firebase/remote-config-compat@0.2.18(@firebase/app-compat@0.4.2)(@firebase/app@0.13.2)': dependencies: - '@firebase/app-compat': 0.5.7 - '@firebase/component': 0.7.0 - '@firebase/logger': 0.5.0 - '@firebase/remote-config': 0.8.0(@firebase/app@0.14.7) - '@firebase/remote-config-types': 0.5.0 - '@firebase/util': 1.13.0 + '@firebase/app-compat': 0.4.2 + '@firebase/component': 0.6.18 + '@firebase/logger': 0.4.4 + '@firebase/remote-config': 0.6.5(@firebase/app@0.13.2) + '@firebase/remote-config-types': 0.4.0 + '@firebase/util': 1.12.1 tslib: 2.8.1 transitivePeerDependencies: - '@firebase/app' - '@firebase/remote-config-types@0.5.0': {} + '@firebase/remote-config-types@0.4.0': {} - '@firebase/remote-config@0.8.0(@firebase/app@0.14.7)': + '@firebase/remote-config@0.6.5(@firebase/app@0.13.2)': dependencies: - '@firebase/app': 0.14.7 - '@firebase/component': 0.7.0 - '@firebase/installations': 0.6.19(@firebase/app@0.14.7) - '@firebase/logger': 0.5.0 - '@firebase/util': 1.13.0 + '@firebase/app': 0.13.2 + '@firebase/component': 0.6.18 + '@firebase/installations': 0.6.18(@firebase/app@0.13.2) + '@firebase/logger': 0.4.4 + '@firebase/util': 1.12.1 tslib: 2.8.1 - '@firebase/storage-compat@0.4.0(@firebase/app-compat@0.5.7)(@firebase/app-types@0.9.3)(@firebase/app@0.14.7)': + '@firebase/storage-compat@0.3.24(@firebase/app-compat@0.4.2)(@firebase/app-types@0.9.3)(@firebase/app@0.13.2)': dependencies: - '@firebase/app-compat': 0.5.7 - '@firebase/component': 0.7.0 - '@firebase/storage': 0.14.0(@firebase/app@0.14.7) - '@firebase/storage-types': 0.8.3(@firebase/app-types@0.9.3)(@firebase/util@1.13.0) - '@firebase/util': 1.13.0 + '@firebase/app-compat': 0.4.2 + '@firebase/component': 0.6.18 + '@firebase/storage': 0.13.14(@firebase/app@0.13.2) + '@firebase/storage-types': 0.8.3(@firebase/app-types@0.9.3)(@firebase/util@1.12.1) + '@firebase/util': 1.12.1 tslib: 2.8.1 transitivePeerDependencies: - '@firebase/app' - '@firebase/app-types' - '@firebase/storage-types@0.8.3(@firebase/app-types@0.9.3)(@firebase/util@1.13.0)': + '@firebase/storage-types@0.8.3(@firebase/app-types@0.9.3)(@firebase/util@1.12.1)': dependencies: '@firebase/app-types': 0.9.3 - '@firebase/util': 1.13.0 + '@firebase/util': 1.12.1 - '@firebase/storage@0.14.0(@firebase/app@0.14.7)': + '@firebase/storage@0.13.14(@firebase/app@0.13.2)': + dependencies: + '@firebase/app': 0.13.2 + '@firebase/component': 0.6.18 + '@firebase/util': 1.12.1 + tslib: 2.8.1 + + '@firebase/util@1.12.1': dependencies: - '@firebase/app': 0.14.7 - '@firebase/component': 0.7.0 - '@firebase/util': 1.13.0 tslib: 2.8.1 '@firebase/util@1.13.0': dependencies: tslib: 2.8.1 - '@firebase/webchannel-wrapper@1.0.5': {} + '@firebase/webchannel-wrapper@1.0.3': {} '@floating-ui/core@1.7.3': dependencies: @@ -33431,7 +33496,7 @@ snapshots: '@ionic/utils-array@2.1.6': dependencies: debug: 4.3.4 - tslib: 2.8.1 + tslib: 2.6.2 transitivePeerDependencies: - supports-color @@ -33449,7 +33514,7 @@ snapshots: '@types/fs-extra': 8.1.5 debug: 4.3.4 fs-extra: 9.1.0 - tslib: 2.8.1 + tslib: 2.6.2 transitivePeerDependencies: - supports-color @@ -34447,7 +34512,7 @@ snapshots: node-fetch: 2.7.0 nopt: 8.1.0 semver: 7.7.3 - tar: 7.5.6 + tar: 7.5.2 transitivePeerDependencies: - encoding - supports-color @@ -34516,14 +34581,14 @@ snapshots: '@metamask/delegation-deployments@0.12.0': {} - '@metamask/delegation-toolkit@0.13.0(viem@2.40.4(bufferutil@4.0.9)(typescript@5.6.2)(utf-8-validate@5.0.10)(zod@4.1.13))': + '@metamask/delegation-toolkit@0.13.0(viem@2.39.3(bufferutil@4.0.9)(typescript@5.6.2)(utf-8-validate@5.0.10)(zod@4.1.13))': dependencies: '@metamask/7715-permission-types': 0.3.0 '@metamask/delegation-abis': 0.11.0 '@metamask/delegation-core': 0.2.0 '@metamask/delegation-deployments': 0.12.0 buffer: 6.0.3 - viem: 2.40.4(bufferutil@4.0.9)(typescript@5.6.2)(utf-8-validate@5.0.10)(zod@4.1.13) + viem: 2.39.3(bufferutil@4.0.9)(typescript@5.6.2)(utf-8-validate@5.0.10)(zod@4.1.13) webauthn-p256: 0.0.10 transitivePeerDependencies: - supports-color @@ -34581,7 +34646,7 @@ snapshots: '@metamask/onboarding@1.0.1': dependencies: - bowser: 2.13.1 + bowser: 2.12.1 '@metamask/providers@16.1.0': dependencies: @@ -34656,7 +34721,7 @@ snapshots: dependencies: '@paulmillr/qr': 0.2.1 - '@metamask/sdk@0.34.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)': + '@metamask/sdk@0.33.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)': dependencies: '@babel/runtime': 7.28.4 '@metamask/onboarding': 1.0.1 @@ -34665,7 +34730,7 @@ snapshots: '@metamask/sdk-communication-layer': 0.33.1(cross-fetch@4.1.0)(eciesjs@0.4.16)(eventemitter2@6.4.9)(readable-stream@3.6.2)(socket.io-client@4.8.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)) '@metamask/sdk-install-modal-web': 0.32.1 '@paulmillr/qr': 0.2.1 - bowser: 2.13.1 + bowser: 2.12.1 cross-fetch: 4.1.0 debug: 4.3.4 eciesjs: 0.4.16 @@ -34815,8 +34880,6 @@ snapshots: nanostores: 0.11.4 react: 18.3.1 - '@napi-rs/cli@2.18.4': {} - '@ndelangen/get-tarball@3.0.9': dependencies: gunzip-maybe: 1.4.2 @@ -36198,6 +36261,18 @@ snapshots: dependencies: react: 18.3.1 + '@reduxjs/toolkit@2.11.2(react-redux@9.2.0(@types/react@18.3.27)(react@18.3.1)(redux@5.0.1))(react@18.3.1)': + dependencies: + '@standard-schema/spec': 1.0.0 + '@standard-schema/utils': 0.3.0 + immer: 11.1.3 + redux: 5.0.1 + redux-thunk: 3.1.0(redux@5.0.1) + reselect: 5.1.1 + optionalDependencies: + react: 18.3.1 + react-redux: 9.2.0(@types/react@18.3.27)(react@18.3.1)(redux@5.0.1) + '@rolldown/pluginutils@1.0.0-beta.27': {} '@rollup/plugin-commonjs@22.0.2(rollup@2.79.2)': @@ -37477,6 +37552,8 @@ snapshots: '@standard-schema/spec@1.0.0': {} + '@standard-schema/utils@0.3.0': {} + '@stencil/core@2.10.0': {} '@stencil/core@4.36.2': @@ -38510,17 +38587,6 @@ snapshots: lz-string: 1.5.0 pretty-format: 27.5.1 - '@testing-library/dom@9.3.4': - dependencies: - '@babel/code-frame': 7.27.1 - '@babel/runtime': 7.28.4 - '@types/aria-query': 5.0.4 - aria-query: 5.1.3 - chalk: 4.1.2 - dom-accessibility-api: 0.5.16 - lz-string: 1.5.0 - pretty-format: 27.5.1 - '@testing-library/jest-dom@5.17.0': dependencies: '@adobe/css-tools': 4.4.4 @@ -38550,20 +38616,10 @@ snapshots: transitivePeerDependencies: - '@types/react' - '@testing-library/react@14.3.1(@types/react@18.3.27)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@babel/runtime': 7.28.4 - '@testing-library/dom': 9.3.4 - '@types/react-dom': 18.3.7(@types/react@18.3.27) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - '@types/react' - - '@testing-library/user-event@12.8.3(@testing-library/dom@9.3.4)': + '@testing-library/user-event@12.8.3(@testing-library/dom@8.20.1)': dependencies: '@babel/runtime': 7.28.4 - '@testing-library/dom': 9.3.4 + '@testing-library/dom': 8.20.1 '@testing-library/user-event@13.5.0(@testing-library/dom@8.20.1)': dependencies: @@ -38637,16 +38693,16 @@ snapshots: - supports-color - utf-8-validate - '@toruslabs/base-controllers@8.13.0(@babel/runtime@7.28.4)(@sentry/core@9.47.1)(bufferutil@4.0.9)(color@5.0.3)(utf-8-validate@5.0.10)': + '@toruslabs/base-controllers@8.9.0(@babel/runtime@7.28.4)(@sentry/core@9.47.1)(bufferutil@4.0.9)(color@5.0.3)(utf-8-validate@5.0.10)': dependencies: '@babel/runtime': 7.28.4 '@ethereumjs/util': 10.1.0 '@toruslabs/broadcast-channel': 12.0.0(@sentry/core@9.47.1)(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@toruslabs/http-helpers': 8.1.1(@babel/runtime@7.28.4)(@sentry/core@9.47.1) - '@web3auth/auth': 10.8.0(@babel/runtime@7.28.4)(@sentry/core@9.47.1)(bufferutil@4.0.9)(color@5.0.3)(utf-8-validate@5.0.10) + '@web3auth/auth': 10.7.0(@babel/runtime@7.28.4)(@sentry/core@9.47.1)(bufferutil@4.0.9)(color@5.0.3)(utf-8-validate@5.0.10) async-mutex: 0.5.0 bignumber.js: 9.3.1 - bowser: 2.13.1 + bowser: 2.12.1 ethereum-cryptography: 3.2.0 events: 3.3.0 jwt-decode: 4.0.0 @@ -38741,7 +38797,7 @@ snapshots: '@toruslabs/session-manager': 4.0.2(@babel/runtime@7.28.4)(@sentry/core@9.47.1) '@toruslabs/torus.js': 16.0.0(@babel/runtime@7.28.4)(@sentry/core@9.47.1) base64url: 3.0.1 - bowser: 2.13.1 + bowser: 2.12.1 deepmerge: 4.3.1 events: 3.3.0 loglevel: 1.9.2 @@ -38764,14 +38820,14 @@ snapshots: dependencies: elliptic: 6.6.1 - '@toruslabs/ethereum-controllers@8.10.0(@babel/runtime@7.28.4)(@sentry/core@9.47.1)(bufferutil@4.0.9)(color@5.0.3)(utf-8-validate@5.0.10)(viem@2.40.4(bufferutil@4.0.9)(typescript@5.6.2)(utf-8-validate@5.0.10)(zod@4.1.13))': + '@toruslabs/ethereum-controllers@8.9.0(@babel/runtime@7.28.4)(@sentry/core@9.47.1)(bufferutil@4.0.9)(color@5.0.3)(utf-8-validate@5.0.10)(viem@2.39.3(bufferutil@4.0.9)(typescript@5.6.2)(utf-8-validate@5.0.10)(zod@4.1.13))': dependencies: '@babel/runtime': 7.28.4 '@ethereumjs/util': 10.1.0 - '@metamask/delegation-toolkit': 0.13.0(viem@2.40.4(bufferutil@4.0.9)(typescript@5.6.2)(utf-8-validate@5.0.10)(zod@4.1.13)) - '@toruslabs/base-controllers': 8.13.0(@babel/runtime@7.28.4)(@sentry/core@9.47.1)(bufferutil@4.0.9)(color@5.0.3)(utf-8-validate@5.0.10) + '@metamask/delegation-toolkit': 0.13.0(viem@2.39.3(bufferutil@4.0.9)(typescript@5.6.2)(utf-8-validate@5.0.10)(zod@4.1.13)) + '@toruslabs/base-controllers': 8.9.0(@babel/runtime@7.28.4)(@sentry/core@9.47.1)(bufferutil@4.0.9)(color@5.0.3)(utf-8-validate@5.0.10) '@toruslabs/http-helpers': 8.1.1(@babel/runtime@7.28.4)(@sentry/core@9.47.1) - '@web3auth/auth': 10.8.0(@babel/runtime@7.28.4)(@sentry/core@9.47.1)(bufferutil@4.0.9)(color@5.0.3)(utf-8-validate@5.0.10) + '@web3auth/auth': 10.7.0(@babel/runtime@7.28.4)(@sentry/core@9.47.1)(bufferutil@4.0.9)(color@5.0.3)(utf-8-validate@5.0.10) async-mutex: 0.5.0 bignumber.js: 9.3.1 bn.js: 5.2.2 @@ -38782,8 +38838,8 @@ snapshots: fast-safe-stringify: 2.1.1 jsonschema: 1.5.0 loglevel: 1.9.2 - permissionless: 0.2.57(viem@2.40.4(bufferutil@4.0.9)(typescript@5.6.2)(utf-8-validate@5.0.10)(zod@4.1.13)) - viem: 2.40.4(bufferutil@4.0.9)(typescript@5.6.2)(utf-8-validate@5.0.10)(zod@4.1.13) + permissionless: 0.2.57(viem@2.39.3(bufferutil@4.0.9)(typescript@5.6.2)(utf-8-validate@5.0.10)(zod@4.1.13)) + viem: 2.39.3(bufferutil@4.0.9)(typescript@5.6.2)(utf-8-validate@5.0.10)(zod@4.1.13) transitivePeerDependencies: - '@sentry/core' - bufferutil @@ -39180,7 +39236,7 @@ snapshots: '@types/body-parser@1.19.6': dependencies: '@types/connect': 3.4.38 - '@types/node': 22.19.1 + '@types/node': 18.19.130 '@types/bonjour@3.5.13': dependencies: @@ -39200,11 +39256,6 @@ snapshots: '@types/caseless@0.12.5': optional: true - '@types/chai@5.2.3': - dependencies: - '@types/deep-eql': 4.0.2 - assertion-error: 2.0.1 - '@types/chrome@0.0.136': dependencies: '@types/filesystem': 0.0.36 @@ -39217,7 +39268,7 @@ snapshots: '@types/connect@3.4.38': dependencies: - '@types/node': 22.19.1 + '@types/node': 18.19.130 '@types/cookie@0.6.0': {} @@ -39235,12 +39286,34 @@ snapshots: transitivePeerDependencies: - postcss + '@types/d3-array@3.2.2': {} + + '@types/d3-color@3.1.3': {} + + '@types/d3-ease@3.0.2': {} + + '@types/d3-interpolate@3.0.4': + dependencies: + '@types/d3-color': 3.1.3 + + '@types/d3-path@3.1.1': {} + + '@types/d3-scale@4.0.9': + dependencies: + '@types/d3-time': 3.0.4 + + '@types/d3-shape@3.1.7': + dependencies: + '@types/d3-path': 3.1.1 + + '@types/d3-time@3.0.4': {} + + '@types/d3-timer@3.0.2': {} + '@types/debug@4.1.12': dependencies: '@types/ms': 2.1.0 - '@types/deep-eql@4.0.2': {} - '@types/detect-port@1.3.5': {} '@types/docker-modem@3.0.6': @@ -39294,7 +39367,7 @@ snapshots: '@types/express-serve-static-core@4.19.7': dependencies: - '@types/node': 22.19.1 + '@types/node': 18.19.130 '@types/qs': 6.14.0 '@types/range-parser': 1.2.7 '@types/send': 1.2.1 @@ -39419,7 +39492,7 @@ snapshots: '@types/jsonwebtoken@9.0.10': dependencies: '@types/ms': 2.1.0 - '@types/node': 22.19.1 + '@types/node': 18.19.130 '@types/katex@0.16.7': {} @@ -39485,10 +39558,6 @@ snapshots: dependencies: undici-types: 5.26.5 - '@types/node@20.19.27': - dependencies: - undici-types: 6.21.0 - '@types/node@22.19.1': dependencies: undici-types: 6.21.0 @@ -39575,7 +39644,7 @@ snapshots: '@types/request@2.48.13': dependencies: '@types/caseless': 0.12.5 - '@types/node': 22.19.1 + '@types/node': 18.19.130 '@types/tough-cookie': 4.0.5 form-data: 2.5.5 optional: true @@ -39609,11 +39678,11 @@ snapshots: '@types/send@0.17.6': dependencies: '@types/mime': 1.3.5 - '@types/node': 22.19.1 + '@types/node': 18.19.130 '@types/send@1.2.1': dependencies: - '@types/node': 22.19.1 + '@types/node': 18.19.130 '@types/serve-index@1.9.4': dependencies: @@ -39622,7 +39691,7 @@ snapshots: '@types/serve-static@1.15.10': dependencies: '@types/http-errors': 2.0.5 - '@types/node': 22.19.1 + '@types/node': 18.19.130 '@types/send': 0.17.6 '@types/slice-ansi@4.0.0': {} @@ -39665,6 +39734,8 @@ snapshots: '@types/unist@3.0.3': {} + '@types/use-sync-external-store@0.0.6': {} + '@types/uuid@8.3.4': {} '@types/uuid@9.0.8': {} @@ -39908,58 +39979,22 @@ snapshots: '@vitest/utils': 1.6.1 chai: 4.5.0 - '@vitest/expect@3.2.4': - dependencies: - '@types/chai': 5.2.3 - '@vitest/spy': 3.2.4 - '@vitest/utils': 3.2.4 - chai: 5.3.3 - tinyrainbow: 2.0.0 - - '@vitest/mocker@3.2.4(vite@5.4.21(@types/node@12.20.55)(less@4.4.2)(lightningcss@1.30.2)(sass@1.94.2)(terser@5.44.1))': - dependencies: - '@vitest/spy': 3.2.4 - estree-walker: 3.0.3 - magic-string: 0.30.21 - optionalDependencies: - vite: 5.4.21(@types/node@12.20.55)(less@4.4.2)(lightningcss@1.30.2)(sass@1.94.2)(terser@5.44.1) - - '@vitest/pretty-format@3.2.4': - dependencies: - tinyrainbow: 2.0.0 - '@vitest/runner@1.6.1': dependencies: '@vitest/utils': 1.6.1 p-limit: 5.0.0 pathe: 1.1.2 - '@vitest/runner@3.2.4': - dependencies: - '@vitest/utils': 3.2.4 - pathe: 2.0.3 - strip-literal: 3.1.0 - '@vitest/snapshot@1.6.1': dependencies: magic-string: 0.30.21 pathe: 1.1.2 pretty-format: 29.7.0 - '@vitest/snapshot@3.2.4': - dependencies: - '@vitest/pretty-format': 3.2.4 - magic-string: 0.30.21 - pathe: 2.0.3 - '@vitest/spy@1.6.1': dependencies: tinyspy: 2.2.1 - '@vitest/spy@3.2.4': - dependencies: - tinyspy: 4.0.4 - '@vitest/utils@0.34.7': dependencies: diff-sequences: 29.6.3 @@ -39973,12 +40008,6 @@ snapshots: loupe: 2.3.7 pretty-format: 29.7.0 - '@vitest/utils@3.2.4': - dependencies: - '@vitest/pretty-format': 3.2.4 - loupe: 3.2.1 - tinyrainbow: 2.0.0 - '@vladfrangu/async_event_emitter@2.4.7': {} '@vscode/emmet-helper@2.11.0': @@ -40269,7 +40298,7 @@ snapshots: - supports-color - utf-8-validate - '@web3auth/auth@10.8.0(@babel/runtime@7.28.4)(@sentry/core@9.47.1)(bufferutil@4.0.9)(color@5.0.3)(utf-8-validate@5.0.10)': + '@web3auth/auth@10.7.0(@babel/runtime@7.28.4)(@sentry/core@9.47.1)(bufferutil@4.0.9)(color@5.0.3)(utf-8-validate@5.0.10)': dependencies: '@babel/runtime': 7.28.4 '@ethereumjs/util': 10.1.0 @@ -40424,19 +40453,19 @@ snapshots: - utf-8-validate - zod - '@web3auth/no-modal@10.9.0(@babel/runtime@7.28.4)(@netlify/blobs@10.5.0)(@sentry/core@9.47.1)(bufferutil@4.0.9)(color@5.0.3)(ioredis@5.8.2)(react@18.3.1)(typescript@5.6.2)(utf-8-validate@5.0.10)(viem@2.40.4(bufferutil@4.0.9)(typescript@5.6.2)(utf-8-validate@5.0.10)(zod@4.1.13))(zod@4.1.13)': + '@web3auth/no-modal@10.8.0(@babel/runtime@7.28.4)(@netlify/blobs@10.5.0)(@sentry/core@9.47.1)(bufferutil@4.0.9)(color@5.0.3)(ioredis@5.8.2)(react@18.3.1)(typescript@5.6.2)(utf-8-validate@5.0.10)(viem@2.39.3(bufferutil@4.0.9)(typescript@5.6.2)(utf-8-validate@5.0.10)(zod@4.1.13))(zod@4.1.13)': dependencies: '@babel/runtime': 7.28.4 '@ethereumjs/util': 10.1.0 - '@metamask/sdk': 0.34.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@metamask/sdk': 0.33.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@segment/analytics-next': 1.81.1 '@solana/wallet-standard-features': 1.3.0 '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@5.6.2)(utf-8-validate@5.0.10) - '@toruslabs/base-controllers': 8.13.0(@babel/runtime@7.28.4)(@sentry/core@9.47.1)(bufferutil@4.0.9)(color@5.0.3)(utf-8-validate@5.0.10) + '@toruslabs/base-controllers': 8.9.0(@babel/runtime@7.28.4)(@sentry/core@9.47.1)(bufferutil@4.0.9)(color@5.0.3)(utf-8-validate@5.0.10) '@toruslabs/bs58': 1.0.0(@babel/runtime@7.28.4) '@toruslabs/constants': 15.0.0(@babel/runtime@7.28.4) '@toruslabs/eccrypto': 6.2.0 - '@toruslabs/ethereum-controllers': 8.10.0(@babel/runtime@7.28.4)(@sentry/core@9.47.1)(bufferutil@4.0.9)(color@5.0.3)(utf-8-validate@5.0.10)(viem@2.40.4(bufferutil@4.0.9)(typescript@5.6.2)(utf-8-validate@5.0.10)(zod@4.1.13)) + '@toruslabs/ethereum-controllers': 8.9.0(@babel/runtime@7.28.4)(@sentry/core@9.47.1)(bufferutil@4.0.9)(color@5.0.3)(utf-8-validate@5.0.10)(viem@2.39.3(bufferutil@4.0.9)(typescript@5.6.2)(utf-8-validate@5.0.10)(zod@4.1.13)) '@toruslabs/http-helpers': 8.1.1(@babel/runtime@7.28.4)(@sentry/core@9.47.1) '@toruslabs/loglevel-sentry': 8.1.0(@babel/runtime@7.28.4) '@toruslabs/secure-pub-sub': 3.0.2(@babel/runtime@7.28.4)(@sentry/core@9.47.1)(bufferutil@4.0.9)(utf-8-validate@5.0.10) @@ -40447,12 +40476,12 @@ snapshots: '@walletconnect/sign-client': 2.23.0(@netlify/blobs@10.5.0)(bufferutil@4.0.9)(ioredis@5.8.2)(typescript@5.6.2)(utf-8-validate@5.0.10)(zod@4.1.13) '@walletconnect/types': 2.23.0(@netlify/blobs@10.5.0)(ioredis@5.8.2) '@walletconnect/utils': 2.23.0(@netlify/blobs@10.5.0)(ioredis@5.8.2)(typescript@5.6.2)(zod@4.1.13) - '@web3auth/auth': 10.8.0(@babel/runtime@7.28.4)(@sentry/core@9.47.1)(bufferutil@4.0.9)(color@5.0.3)(utf-8-validate@5.0.10) - '@web3auth/ws-embed': 5.3.0(@babel/runtime@7.28.4)(@sentry/core@9.47.1)(bufferutil@4.0.9)(color@5.0.3)(utf-8-validate@5.0.10) + '@web3auth/auth': 10.7.0(@babel/runtime@7.28.4)(@sentry/core@9.47.1)(bufferutil@4.0.9)(color@5.0.3)(utf-8-validate@5.0.10) + '@web3auth/ws-embed': 5.2.2(@babel/runtime@7.28.4)(@sentry/core@9.47.1)(bufferutil@4.0.9)(color@5.0.3)(utf-8-validate@5.0.10) assert: 2.1.0 bignumber.js: 9.3.1 bn.js: 5.2.2 - bowser: 2.13.1 + bowser: 2.12.1 deepmerge: 4.3.1 ethers: 6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) json-rpc-random-id: 1.0.1 @@ -40460,13 +40489,13 @@ snapshots: jwt-decode: 4.0.0 loglevel: 1.9.2 mipd: 0.0.7(typescript@5.6.2) - permissionless: 0.2.57(viem@2.40.4(bufferutil@4.0.9)(typescript@5.6.2)(utf-8-validate@5.0.10)(zod@4.1.13)) + permissionless: 0.2.57(viem@2.39.3(bufferutil@4.0.9)(typescript@5.6.2)(utf-8-validate@5.0.10)(zod@4.1.13)) ripple-keypairs: 1.3.1 ts-custom-error: 3.3.1 xrpl: 2.14.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) optionalDependencies: react: 18.3.1 - viem: 2.40.4(bufferutil@4.0.9)(typescript@5.6.2)(utf-8-validate@5.0.10)(zod@4.1.13) + viem: 2.39.3(bufferutil@4.0.9)(typescript@5.6.2)(utf-8-validate@5.0.10)(zod@4.1.13) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -40530,11 +40559,11 @@ snapshots: - supports-color - utf-8-validate - '@web3auth/ws-embed@5.3.0(@babel/runtime@7.28.4)(@sentry/core@9.47.1)(bufferutil@4.0.9)(color@5.0.3)(utf-8-validate@5.0.10)': + '@web3auth/ws-embed@5.2.2(@babel/runtime@7.28.4)(@sentry/core@9.47.1)(bufferutil@4.0.9)(color@5.0.3)(utf-8-validate@5.0.10)': dependencies: '@babel/runtime': 7.28.4 - '@toruslabs/base-controllers': 8.13.0(@babel/runtime@7.28.4)(@sentry/core@9.47.1)(bufferutil@4.0.9)(color@5.0.3)(utf-8-validate@5.0.10) - '@web3auth/auth': 10.8.0(@babel/runtime@7.28.4)(@sentry/core@9.47.1)(bufferutil@4.0.9)(color@5.0.3)(utf-8-validate@5.0.10) + '@toruslabs/base-controllers': 8.9.0(@babel/runtime@7.28.4)(@sentry/core@9.47.1)(bufferutil@4.0.9)(color@5.0.3)(utf-8-validate@5.0.10) + '@web3auth/auth': 10.7.0(@babel/runtime@7.28.4)(@sentry/core@9.47.1)(bufferutil@4.0.9)(color@5.0.3)(utf-8-validate@5.0.10) fast-deep-equal: 3.1.3 loglevel: 1.9.2 pump: 3.0.3 @@ -40730,7 +40759,7 @@ snapshots: typescript: 5.6.2 zod: 4.1.13 - abitype@1.2.0(typescript@5.6.2)(zod@4.1.13): + abitype@1.1.2(typescript@5.6.2)(zod@4.1.13): optionalDependencies: typescript: 5.6.2 zod: 4.1.13 @@ -41341,8 +41370,6 @@ snapshots: assertion-error@1.1.0: {} - assertion-error@2.0.1: {} - assign-symbols@1.0.0: {} ast-types@0.13.4: @@ -41633,6 +41660,11 @@ snapshots: dependencies: possible-typed-array-names: 1.1.0 + avvio@8.4.0: + dependencies: + '@fastify/error': 3.4.1 + fastq: 1.19.1 + avvio@9.1.0: dependencies: '@fastify/error': 4.2.0 @@ -42166,8 +42198,6 @@ snapshots: bowser@2.12.1: {} - bowser@2.13.1: {} - boxen@5.1.2: dependencies: ansi-align: 3.0.1 @@ -42619,13 +42649,13 @@ snapshots: svg-pathdata: 6.0.3 optional: true - capacitor-native-settings@7.0.2(@capacitor/core@8.0.1): + capacitor-native-settings@7.0.2(@capacitor/core@7.4.2): dependencies: - '@capacitor/core': 8.0.1 + '@capacitor/core': 7.4.2 - capacitor-plugin-safe-area@5.0.0(@capacitor/core@8.0.1): + capacitor-plugin-safe-area@4.0.3(@capacitor/core@7.4.2): dependencies: - '@capacitor/core': 8.0.1 + '@capacitor/core': 7.4.2 capacitor-standard-version@1.1.55(bufferutil@4.0.9)(utf-8-validate@5.0.10): dependencies: @@ -42678,14 +42708,6 @@ snapshots: pathval: 1.1.1 type-detect: 4.1.0 - chai@5.3.3: - dependencies: - assertion-error: 2.0.1 - check-error: 2.1.3 - deep-eql: 5.0.2 - loupe: 3.2.1 - pathval: 2.0.1 - chalk-template@0.4.0: dependencies: chalk: 4.1.2 @@ -42763,8 +42785,6 @@ snapshots: dependencies: get-func-name: 2.0.2 - check-error@2.1.3: {} - cheerio-select@2.1.0: dependencies: boolbase: 1.0.0 @@ -43303,8 +43323,6 @@ snapshots: dependencies: safe-buffer: 5.2.1 - content-disposition@1.0.1: {} - content-type@1.0.5: {} conventional-changelog-angular@5.0.13: @@ -43904,6 +43922,44 @@ snapshots: find-pkg: 0.1.2 fs-exists-sync: 0.1.0 + d3-array@3.2.4: + dependencies: + internmap: 2.0.3 + + d3-color@3.1.0: {} + + d3-ease@3.0.1: {} + + d3-format@3.1.0: {} + + d3-interpolate@3.0.1: + dependencies: + d3-color: 3.1.0 + + d3-path@3.1.0: {} + + d3-scale@4.0.2: + dependencies: + d3-array: 3.2.4 + d3-format: 3.1.0 + d3-interpolate: 3.0.1 + d3-time: 3.1.0 + d3-time-format: 4.1.0 + + d3-shape@3.2.0: + dependencies: + d3-path: 3.1.0 + + d3-time-format@4.1.0: + dependencies: + d3-time: 3.1.0 + + d3-time@3.1.0: + dependencies: + d3-array: 3.2.4 + + d3-timer@3.0.1: {} + d@1.0.2: dependencies: es5-ext: 0.10.64 @@ -44019,6 +44075,8 @@ snapshots: decamelize@1.2.0: {} + decimal.js-light@2.5.1: {} + decimal.js@10.6.0: {} decode-named-character-reference@1.2.0: @@ -44087,8 +44145,6 @@ snapshots: dependencies: type-detect: 4.1.0 - deep-eql@5.0.2: {} - deep-equal@2.2.3: dependencies: array-buffer-byte-length: 1.0.2 @@ -45837,8 +45893,6 @@ snapshots: dependencies: os-homedir: 1.0.2 - expect-type@1.3.0: {} - expect@28.1.3: dependencies: '@jest/expect-utils': 28.1.3 @@ -46036,8 +46090,8 @@ snapshots: extension-port-stream@3.0.0: dependencies: - readable-stream: 4.7.0 - webextension-polyfill: 0.12.0 + readable-stream: 3.6.2 + webextension-polyfill: 0.10.0 external-editor@3.1.0: dependencies: @@ -46081,6 +46135,8 @@ snapshots: dependencies: pure-rand: 6.1.0 + fast-content-type-parse@1.1.0: {} + fast-decode-uri-component@1.0.1: {} fast-deep-equal@2.0.1: {} @@ -46113,6 +46169,16 @@ snapshots: fast-json-stable-stringify@2.1.0: {} + fast-json-stringify@5.16.1: + dependencies: + '@fastify/merge-json-schemas': 0.1.1 + ajv: 8.17.1 + ajv-formats: 3.0.1(ajv@8.17.1) + fast-deep-equal: 3.1.3 + fast-uri: 2.4.0 + json-schema-ref-resolver: 1.0.1 + rfdc: 1.4.1 + fast-json-stringify@6.1.1: dependencies: '@fastify/merge-json-schemas': 0.2.1 @@ -46140,6 +46206,8 @@ snapshots: fast-text-encoding@1.0.6: {} + fast-uri@2.4.0: {} + fast-uri@3.1.0: {} fast-xml-parser@4.5.3: @@ -46152,9 +46220,28 @@ snapshots: fastest-levenshtein@1.0.16: {} - fastify-plugin@5.1.0: {} + fastify-plugin@4.5.1: {} - fastify@5.7.2: + fastify@4.29.1: + dependencies: + '@fastify/ajv-compiler': 3.6.0 + '@fastify/error': 3.4.1 + '@fastify/fast-json-stringify-compiler': 4.3.0 + abstract-logging: 2.0.1 + avvio: 8.4.0 + fast-content-type-parse: 1.1.0 + fast-json-stringify: 5.16.1 + find-my-way: 8.2.2 + light-my-request: 5.14.0 + pino: 9.14.0 + process-warning: 3.0.0 + proxy-addr: 2.0.7 + rfdc: 1.4.1 + secure-json-parse: 2.7.0 + semver: 7.7.3 + toad-cache: 3.7.0 + + fastify@5.6.2: dependencies: '@fastify/ajv-compiler': 4.0.5 '@fastify/error': 4.2.0 @@ -46427,6 +46514,12 @@ snapshots: find-my-way-ts@0.1.6: {} + find-my-way@8.2.2: + dependencies: + fast-deep-equal: 3.1.3 + fast-querystring: 1.1.2 + safe-regex2: 3.1.0 + find-my-way@9.3.0: dependencies: fast-deep-equal: 3.1.3 @@ -46500,36 +46593,36 @@ snapshots: - encoding - supports-color - firebase@12.8.0: + firebase@11.10.0: dependencies: - '@firebase/ai': 2.7.0(@firebase/app-types@0.9.3)(@firebase/app@0.14.7) - '@firebase/analytics': 0.10.19(@firebase/app@0.14.7) - '@firebase/analytics-compat': 0.2.25(@firebase/app-compat@0.5.7)(@firebase/app@0.14.7) - '@firebase/app': 0.14.7 - '@firebase/app-check': 0.11.0(@firebase/app@0.14.7) - '@firebase/app-check-compat': 0.4.0(@firebase/app-compat@0.5.7)(@firebase/app@0.14.7) - '@firebase/app-compat': 0.5.7 + '@firebase/ai': 1.4.1(@firebase/app-types@0.9.3)(@firebase/app@0.13.2) + '@firebase/analytics': 0.10.17(@firebase/app@0.13.2) + '@firebase/analytics-compat': 0.2.23(@firebase/app-compat@0.4.2)(@firebase/app@0.13.2) + '@firebase/app': 0.13.2 + '@firebase/app-check': 0.10.1(@firebase/app@0.13.2) + '@firebase/app-check-compat': 0.3.26(@firebase/app-compat@0.4.2)(@firebase/app@0.13.2) + '@firebase/app-compat': 0.4.2 '@firebase/app-types': 0.9.3 - '@firebase/auth': 1.12.0(@firebase/app@0.14.7) - '@firebase/auth-compat': 0.6.2(@firebase/app-compat@0.5.7)(@firebase/app-types@0.9.3)(@firebase/app@0.14.7) - '@firebase/data-connect': 0.3.12(@firebase/app@0.14.7) - '@firebase/database': 1.1.0 - '@firebase/database-compat': 2.1.0 - '@firebase/firestore': 4.10.0(@firebase/app@0.14.7) - '@firebase/firestore-compat': 0.4.4(@firebase/app-compat@0.5.7)(@firebase/app-types@0.9.3)(@firebase/app@0.14.7) - '@firebase/functions': 0.13.1(@firebase/app@0.14.7) - '@firebase/functions-compat': 0.4.1(@firebase/app-compat@0.5.7)(@firebase/app@0.14.7) - '@firebase/installations': 0.6.19(@firebase/app@0.14.7) - '@firebase/installations-compat': 0.2.19(@firebase/app-compat@0.5.7)(@firebase/app-types@0.9.3)(@firebase/app@0.14.7) - '@firebase/messaging': 0.12.23(@firebase/app@0.14.7) - '@firebase/messaging-compat': 0.2.23(@firebase/app-compat@0.5.7)(@firebase/app@0.14.7) - '@firebase/performance': 0.7.9(@firebase/app@0.14.7) - '@firebase/performance-compat': 0.2.22(@firebase/app-compat@0.5.7)(@firebase/app@0.14.7) - '@firebase/remote-config': 0.8.0(@firebase/app@0.14.7) - '@firebase/remote-config-compat': 0.2.21(@firebase/app-compat@0.5.7)(@firebase/app@0.14.7) - '@firebase/storage': 0.14.0(@firebase/app@0.14.7) - '@firebase/storage-compat': 0.4.0(@firebase/app-compat@0.5.7)(@firebase/app-types@0.9.3)(@firebase/app@0.14.7) - '@firebase/util': 1.13.0 + '@firebase/auth': 1.10.8(@firebase/app@0.13.2) + '@firebase/auth-compat': 0.5.28(@firebase/app-compat@0.4.2)(@firebase/app-types@0.9.3)(@firebase/app@0.13.2) + '@firebase/data-connect': 0.3.10(@firebase/app@0.13.2) + '@firebase/database': 1.0.20 + '@firebase/database-compat': 2.0.11 + '@firebase/firestore': 4.8.0(@firebase/app@0.13.2) + '@firebase/firestore-compat': 0.3.53(@firebase/app-compat@0.4.2)(@firebase/app-types@0.9.3)(@firebase/app@0.13.2) + '@firebase/functions': 0.12.9(@firebase/app@0.13.2) + '@firebase/functions-compat': 0.3.26(@firebase/app-compat@0.4.2)(@firebase/app@0.13.2) + '@firebase/installations': 0.6.18(@firebase/app@0.13.2) + '@firebase/installations-compat': 0.2.18(@firebase/app-compat@0.4.2)(@firebase/app-types@0.9.3)(@firebase/app@0.13.2) + '@firebase/messaging': 0.12.22(@firebase/app@0.13.2) + '@firebase/messaging-compat': 0.2.22(@firebase/app-compat@0.4.2)(@firebase/app@0.13.2) + '@firebase/performance': 0.7.7(@firebase/app@0.13.2) + '@firebase/performance-compat': 0.2.20(@firebase/app-compat@0.4.2)(@firebase/app@0.13.2) + '@firebase/remote-config': 0.6.5(@firebase/app@0.13.2) + '@firebase/remote-config-compat': 0.2.18(@firebase/app-compat@0.4.2)(@firebase/app@0.13.2) + '@firebase/storage': 0.13.14(@firebase/app@0.13.2) + '@firebase/storage-compat': 0.3.24(@firebase/app-compat@0.4.2)(@firebase/app-types@0.9.3)(@firebase/app@0.13.2) + '@firebase/util': 1.12.1 transitivePeerDependencies: - '@react-native-async-storage/async-storage' @@ -47936,6 +48029,8 @@ snapshots: immer@10.2.0: {} + immer@11.1.3: {} + immer@9.0.21: {} immutable@5.1.4: {} @@ -48158,6 +48253,8 @@ snapshots: hasown: 2.0.2 side-channel: 1.1.0 + internmap@2.0.3: {} + interpret@1.4.0: {} invariant@2.2.4: @@ -49966,15 +50063,19 @@ snapshots: json-rpc-random-id@1.0.1: {} + json-schema-ref-resolver@1.0.1: + dependencies: + fast-deep-equal: 3.1.3 + json-schema-ref-resolver@3.0.0: dependencies: dequal: 2.0.3 - json-schema-resolver@3.0.0: + json-schema-resolver@2.0.0: dependencies: debug: 4.4.3(supports-color@5.5.0) - fast-uri: 3.1.0 rfdc: 1.4.1 + uri-js: 4.4.1 transitivePeerDependencies: - supports-color @@ -50281,6 +50382,12 @@ snapshots: dependencies: immediate: 3.0.6 + light-my-request@5.14.0: + dependencies: + cookie: 0.7.2 + process-warning: 3.0.0 + set-cookie-parser: 2.7.2 + light-my-request@6.6.0: dependencies: cookie: 1.1.1 @@ -50674,8 +50781,6 @@ snapshots: dependencies: get-func-name: 2.0.2 - loupe@3.2.1: {} - lower-case@2.0.2: dependencies: tslib: 2.8.1 @@ -52191,6 +52296,10 @@ snapshots: pkg-types: 1.3.1 ufo: 1.6.1 + mnemonist@0.39.6: + dependencies: + obliterator: 2.0.5 + modify-values@1.0.1: {} module-deps@6.2.3: @@ -52481,22 +52590,6 @@ snapshots: transitivePeerDependencies: - supports-color - native-run@2.0.3: - dependencies: - '@ionic/utils-fs': 3.1.7 - '@ionic/utils-terminal': 2.3.5 - bplist-parser: 0.3.2 - debug: 4.4.3(supports-color@5.5.0) - elementtree: 0.1.7 - ini: 4.1.3 - plist: 3.1.0 - split2: 4.2.0 - through2: 4.0.2 - tslib: 2.8.1 - yauzl: 2.10.0 - transitivePeerDependencies: - - supports-color - natural-compare-lite@1.4.0: {} natural-compare@1.4.0: {} @@ -53035,6 +53128,8 @@ snapshots: define-properties: 1.2.1 es-object-atoms: 1.1.1 + obliterator@2.0.5: {} + oblivious-set@1.4.0: {} obuf@1.1.2: {} @@ -53263,7 +53358,7 @@ snapshots: '@noble/hashes': 1.8.0 '@scure/bip32': 1.7.0 '@scure/bip39': 1.6.0 - abitype: 1.2.0(typescript@5.6.2)(zod@4.1.13) + abitype: 1.1.2(typescript@5.6.2)(zod@4.1.13) eventemitter3: 5.0.1 optionalDependencies: typescript: 5.6.2 @@ -53672,8 +53767,6 @@ snapshots: pathval@1.1.1: {} - pathval@2.0.1: {} - pbkdf2-hmac@1.2.1: {} pbkdf2@3.1.5: @@ -53706,9 +53799,9 @@ snapshots: performance-now@2.1.0: {} - permissionless@0.2.57(viem@2.40.4(bufferutil@4.0.9)(typescript@5.6.2)(utf-8-validate@5.0.10)(zod@4.1.13)): + permissionless@0.2.57(viem@2.39.3(bufferutil@4.0.9)(typescript@5.6.2)(utf-8-validate@5.0.10)(zod@4.1.13)): dependencies: - viem: 2.40.4(bufferutil@4.0.9)(typescript@5.6.2)(utf-8-validate@5.0.10)(zod@4.1.13) + viem: 2.39.3(bufferutil@4.0.9)(typescript@5.6.2)(utf-8-validate@5.0.10)(zod@4.1.13) pg-cloudflare@1.2.7: optional: true @@ -53819,6 +53912,20 @@ snapshots: sonic-boom: 4.2.0 thread-stream: 3.1.0 + pino@9.14.0: + dependencies: + '@pinojs/redact': 0.4.0 + atomic-sleep: 1.0.0 + on-exit-leak-free: 2.1.2 + pino-abstract-transport: 2.0.0 + pino-std-serializers: 7.0.0 + process-warning: 5.0.0 + quick-format-unescaped: 4.0.4 + real-require: 0.2.0 + safe-stable-stringify: 2.5.0 + sonic-boom: 4.2.0 + thread-stream: 3.1.0 + pirates@4.0.7: {} pixelmatch@4.0.2: @@ -54395,6 +54502,8 @@ snapshots: memoizee: 0.4.17 type: 2.7.3 + process-warning@3.0.0: {} + process-warning@4.0.1: {} process-warning@5.0.0: {} @@ -54474,7 +54583,7 @@ snapshots: '@protobufjs/path': 1.1.2 '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.0 - '@types/node': 22.19.1 + '@types/node': 18.19.130 long: 5.3.2 proxy-addr@2.0.7: @@ -55018,6 +55127,15 @@ snapshots: react: 18.3.1 scheduler: 0.20.2 + react-redux@9.2.0(@types/react@18.3.27)(react@18.3.1)(redux@5.0.1): + dependencies: + '@types/use-sync-external-store': 0.0.6 + react: 18.3.1 + use-sync-external-store: 1.6.0(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.27 + redux: 5.0.1 + react-refresh@0.14.2: {} react-refresh@0.17.0: {} @@ -55266,6 +55384,26 @@ snapshots: tiny-invariant: 1.3.3 tslib: 2.8.1 + recharts@3.6.0(@types/react@18.3.27)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(redux@5.0.1): + dependencies: + '@reduxjs/toolkit': 2.11.2(react-redux@9.2.0(@types/react@18.3.27)(react@18.3.1)(redux@5.0.1))(react@18.3.1) + clsx: 2.1.1 + decimal.js-light: 2.5.1 + es-toolkit: 1.39.3 + eventemitter3: 5.0.1 + immer: 10.2.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-is: 18.3.1 + react-redux: 9.2.0(@types/react@18.3.27)(react@18.3.1)(redux@5.0.1) + reselect: 5.1.1 + tiny-invariant: 1.3.3 + use-sync-external-store: 1.6.0(react@18.3.1) + victory-vendor: 37.3.6 + transitivePeerDependencies: + - '@types/react' + - redux + rechoir@0.6.2: dependencies: resolve: 1.22.11 @@ -55285,6 +55423,12 @@ snapshots: dependencies: redis-errors: 1.2.0 + redux-thunk@3.1.0(redux@5.0.1): + dependencies: + redux: 5.0.1 + + redux@5.0.1: {} + reflect.getprototypeof@1.0.10: dependencies: call-bind: 1.0.8 @@ -55632,6 +55776,8 @@ snapshots: requires-port@1.0.0: {} + reselect@5.1.1: {} + resize-observer-polyfill@1.5.1: {} resolve-alpn@1.2.1: {} @@ -55722,6 +55868,8 @@ snapshots: ret@0.1.15: {} + ret@0.4.3: {} + ret@0.5.0: {} retext-latin@3.1.0: @@ -56099,6 +56247,10 @@ snapshots: es-errors: 1.3.0 is-regex: 1.2.1 + safe-regex2@3.1.0: + dependencies: + ret: 0.4.3 + safe-regex2@5.0.0: dependencies: ret: 0.5.0 @@ -56207,6 +56359,8 @@ snapshots: extend-shallow: 2.0.1 kind-of: 6.0.3 + secure-json-parse@2.7.0: {} + secure-json-parse@4.1.0: {} seek-bzip@1.0.6: @@ -57445,10 +57599,6 @@ snapshots: dependencies: js-tokens: 9.0.1 - strip-literal@3.1.0: - dependencies: - js-tokens: 9.0.1 - strip-outer@1.0.1: dependencies: escape-string-regexp: 1.0.5 @@ -57763,14 +57913,6 @@ snapshots: minizlib: 3.1.0 yallist: 5.0.0 - tar@7.5.6: - dependencies: - '@isaacs/fs-minipass': 4.0.1 - chownr: 3.0.0 - minipass: 7.1.2 - minizlib: 3.1.0 - yallist: 5.0.0 - teeny-request@9.0.0: dependencies: http-proxy-agent: 5.0.0 @@ -58008,14 +58150,8 @@ snapshots: tinypool@0.8.4: {} - tinypool@1.1.1: {} - - tinyrainbow@2.0.0: {} - tinyspy@2.2.1: {} - tinyspy@4.0.4: {} - titleize@3.0.0: {} tldts-core@6.1.86: {} @@ -58321,26 +58457,6 @@ snapshots: optionalDependencies: '@swc/core': 1.15.2(@swc/helpers@0.5.17) - ts-node@10.9.2(@swc/core@1.15.2(@swc/helpers@0.5.17))(@types/node@20.19.27)(typescript@5.6.2): - dependencies: - '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.12 - '@tsconfig/node12': 1.0.11 - '@tsconfig/node14': 1.0.3 - '@tsconfig/node16': 1.0.4 - '@types/node': 20.19.27 - acorn: 8.15.0 - acorn-walk: 8.3.4 - arg: 4.1.3 - create-require: 1.1.1 - diff: 4.0.2 - make-error: 1.3.6 - typescript: 5.6.2 - v8-compile-cache-lib: 3.0.1 - yn: 3.1.1 - optionalDependencies: - '@swc/core': 1.15.2(@swc/helpers@0.5.17) - ts-node@10.9.2(@swc/core@1.15.2(@swc/helpers@0.5.17))(@types/node@22.19.1)(typescript@5.6.2): dependencies: '@cspotcode/source-map-support': 0.8.1 @@ -59196,24 +59312,24 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 - viem@2.39.3(bufferutil@4.0.9)(typescript@5.6.2)(utf-8-validate@5.0.10)(zod@4.1.13): - dependencies: - '@noble/curves': 1.9.1 - '@noble/hashes': 1.8.0 - '@scure/bip32': 1.7.0 - '@scure/bip39': 1.6.0 - abitype: 1.1.0(typescript@5.6.2)(zod@4.1.13) - isows: 1.0.7(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - ox: 0.9.6(typescript@5.6.2)(zod@4.1.13) - ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) - optionalDependencies: - typescript: 5.6.2 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - zod + victory-vendor@37.3.6: + dependencies: + '@types/d3-array': 3.2.2 + '@types/d3-ease': 3.0.2 + '@types/d3-interpolate': 3.0.4 + '@types/d3-scale': 4.0.9 + '@types/d3-shape': 3.1.7 + '@types/d3-time': 3.0.4 + '@types/d3-timer': 3.0.2 + d3-array: 3.2.4 + d3-ease: 3.0.1 + d3-interpolate: 3.0.1 + d3-scale: 4.0.2 + d3-shape: 3.2.0 + d3-time: 3.1.0 + d3-timer: 3.0.1 - viem@2.40.4(bufferutil@4.0.9)(typescript@5.6.2)(utf-8-validate@5.0.10)(zod@4.1.13): + viem@2.39.3(bufferutil@4.0.9)(typescript@5.6.2)(utf-8-validate@5.0.10)(zod@4.1.13): dependencies: '@noble/curves': 1.9.1 '@noble/hashes': 1.8.0 @@ -59248,24 +59364,6 @@ snapshots: - supports-color - terser - vite-node@3.2.4(@types/node@12.20.55)(less@4.4.2)(lightningcss@1.30.2)(sass@1.94.2)(terser@5.44.1): - dependencies: - cac: 6.7.14 - debug: 4.4.3(supports-color@5.5.0) - es-module-lexer: 1.7.0 - pathe: 2.0.3 - vite: 5.4.21(@types/node@12.20.55)(less@4.4.2)(lightningcss@1.30.2)(sass@1.94.2)(terser@5.44.1) - transitivePeerDependencies: - - '@types/node' - - less - - lightningcss - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - vite-plugin-svgr@3.3.0(rollup@4.53.3)(typescript@5.6.2)(vite@4.3.8(@types/node@12.20.55)(less@4.4.2)(sass@1.94.2)(terser@5.44.1)): dependencies: '@rollup/pluginutils': 5.3.0(rollup@4.53.3) @@ -59371,19 +59469,6 @@ snapshots: sass: 1.94.2 terser: 5.44.1 - vite@5.4.21(@types/node@12.20.55)(less@4.4.2)(lightningcss@1.30.2)(sass@1.94.2)(terser@5.44.1): - dependencies: - esbuild: 0.21.5 - postcss: 8.5.6 - rollup: 4.53.3 - optionalDependencies: - '@types/node': 12.20.55 - fsevents: 2.3.3 - less: 4.4.2 - lightningcss: 1.30.2 - sass: 1.94.2 - terser: 5.44.1 - vite@5.4.21(@types/node@18.19.130)(less@4.4.2)(lightningcss@1.30.2)(sass@1.94.2)(terser@5.44.1): dependencies: esbuild: 0.21.5 @@ -59493,47 +59578,6 @@ snapshots: - supports-color - terser - vitest@3.2.4(@types/debug@4.1.12)(@types/node@12.20.55)(happy-dom@14.12.3)(jsdom@25.0.1(bufferutil@4.0.9)(utf-8-validate@5.0.10))(less@4.4.2)(lightningcss@1.30.2)(sass@1.94.2)(terser@5.44.1): - dependencies: - '@types/chai': 5.2.3 - '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@5.4.21(@types/node@12.20.55)(less@4.4.2)(lightningcss@1.30.2)(sass@1.94.2)(terser@5.44.1)) - '@vitest/pretty-format': 3.2.4 - '@vitest/runner': 3.2.4 - '@vitest/snapshot': 3.2.4 - '@vitest/spy': 3.2.4 - '@vitest/utils': 3.2.4 - chai: 5.3.3 - debug: 4.4.3(supports-color@5.5.0) - expect-type: 1.3.0 - magic-string: 0.30.21 - pathe: 2.0.3 - picomatch: 4.0.3 - std-env: 3.10.0 - tinybench: 2.9.0 - tinyexec: 0.3.2 - tinyglobby: 0.2.15 - tinypool: 1.1.1 - tinyrainbow: 2.0.0 - vite: 5.4.21(@types/node@12.20.55)(less@4.4.2)(lightningcss@1.30.2)(sass@1.94.2)(terser@5.44.1) - vite-node: 3.2.4(@types/node@12.20.55)(less@4.4.2)(lightningcss@1.30.2)(sass@1.94.2)(terser@5.44.1) - why-is-node-running: 2.3.0 - optionalDependencies: - '@types/debug': 4.1.12 - '@types/node': 12.20.55 - happy-dom: 14.12.3 - jsdom: 25.0.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) - transitivePeerDependencies: - - less - - lightningcss - - msw - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - vizion@2.2.1: dependencies: async: 2.6.4 diff --git a/services/learn-card-discord-bot/CHANGELOG.md b/services/learn-card-discord-bot/CHANGELOG.md index ea353ffe58..6c2ea175ad 100644 --- a/services/learn-card-discord-bot/CHANGELOG.md +++ b/services/learn-card-discord-bot/CHANGELOG.md @@ -1,12 +1,5 @@ # learn-card-discord-bot -## 1.1.206 - -### Patch Changes - -- Updated dependencies [[`7e30fc7116411ba19a4889cfbf9fc71dd725c309`](https://github.com/learningeconomy/LearnCard/commit/7e30fc7116411ba19a4889cfbf9fc71dd725c309)]: - - @learncard/init@2.3.0 - ## 1.1.205 ### Patch Changes diff --git a/services/learn-card-discord-bot/package.json b/services/learn-card-discord-bot/package.json index e1e99ae75f..cafcbc109a 100644 --- a/services/learn-card-discord-bot/package.json +++ b/services/learn-card-discord-bot/package.json @@ -1,7 +1,7 @@ { "name": "learn-card-discord-bot", "private": true, - "version": "1.1.206", + "version": "1.1.205", "description": "", "main": "dist/index.js", "bin": "dist/index.js", diff --git a/services/learn-card-network/brain-service/.dockerignore b/services/learn-card-network/brain-service/.dockerignore deleted file mode 100644 index 3ab08dde63..0000000000 --- a/services/learn-card-network/brain-service/.dockerignore +++ /dev/null @@ -1,6 +0,0 @@ -# Exclude Rust build artifacts to save space -lib/didkit/target -lib/ssi/target -node_modules -*.log -.git diff --git a/services/learn-card-network/brain-service/.npmrc b/services/learn-card-network/brain-service/.npmrc deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/services/learn-card-network/brain-service/CHANGELOG.md b/services/learn-card-network/brain-service/CHANGELOG.md index dd68559b81..bfa304bd9c 100644 --- a/services/learn-card-network/brain-service/CHANGELOG.md +++ b/services/learn-card-network/brain-service/CHANGELOG.md @@ -1,57 +1,5 @@ # @learncard/network-brain-service -## 3.10.0 - -### Minor Changes - -- [#936](https://github.com/learningeconomy/LearnCard/pull/936) [`7e30fc7116411ba19a4889cfbf9fc71dd725c309`](https://github.com/learningeconomy/LearnCard/commit/7e30fc7116411ba19a4889cfbf9fc71dd725c309) Thanks [@TaylorBeeston](https://github.com/TaylorBeeston)! - ## New Native DIDKit Plugin (`@learncard/didkit-plugin-node`) - - Adds a high-performance native Node.js DIDKit plugin using Rust and N-API, providing **~18x faster cold starts** compared to the WASM version. - - ### Key Features - - - **Native Performance**: Eliminates WASM compilation overhead on cold starts (~1100ms → ~60ms) - - **Cross-Platform Binaries**: Prebuilt for Linux (x64/arm64, glibc/musl), macOS (x64/arm64), and Windows (x64) - - **Drop-in Replacement**: API-compatible with `@learncard/didkit-plugin` - - **JWE Support**: Full JWE and DAG-JWE encryption/decryption - - **Async Operations**: All crypto operations run on separate thread pool, non-blocking - - ### Usage - - ```typescript - import { initLearnCard } from '@learncard/init'; - - // Use native plugin instead of WASM - const learnCard = await initLearnCard({ - seed: 'your-seed', - didkit: 'node', // <-- new option - }); - ``` - - ### When to Use - - - āœ… Serverless functions (AWS Lambda, Vercel) - - āœ… Node.js servers (Express, Fastify, NestJS) - - āœ… CLI tools and scripts - - āœ… High-throughput credential processing - - ### Service Updates - - All LearnCard Network services (brain-service, learn-cloud-service, simple-signing-service) now use the native plugin in Docker/Lambda environments for improved cold start performance. - -### Patch Changes - -- Updated dependencies [[`7e30fc7116411ba19a4889cfbf9fc71dd725c309`](https://github.com/learningeconomy/LearnCard/commit/7e30fc7116411ba19a4889cfbf9fc71dd725c309)]: - - @learncard/didkit-plugin-node@0.2.0 - - @learncard/didkit-plugin@1.7.0 - - @learncard/vc-plugin@1.4.0 - -## 3.9.6 - -### Patch Changes - -- [#952](https://github.com/learningeconomy/LearnCard/pull/952) [`e41a15b2b2850fc3c562b254b3aef707d34e5437`](https://github.com/learningeconomy/LearnCard/commit/e41a15b2b2850fc3c562b254b3aef707d34e5437) Thanks [@Custard7](https://github.com/Custard7)! - fix: Encrypt for Recipient with SA - ## 3.9.5 ### Patch Changes diff --git a/services/learn-card-network/brain-service/Dockerfile b/services/learn-card-network/brain-service/Dockerfile index 5e4f88d3b2..e596465059 100644 --- a/services/learn-card-network/brain-service/Dockerfile +++ b/services/learn-card-network/brain-service/Dockerfile @@ -1,27 +1,23 @@ -# Using bullseye (Debian 11) to avoid native module build issues on Debian 12 -FROM node:20.10.0-bullseye-slim - -# Skip native DIDKit build (uses WASM fallback) -ENV SKIP_DIDKIT_NAPI=1 +FROM node:20.10.0-slim +# Set working directory to /app WORKDIR /app -# Install build dependencies and pnpm in one layer -RUN apt-get update && apt-get install -y --no-install-recommends \ +# Install PNPM package manager +RUN npm install -g pnpm + +# Sometimes we need python to build packages +RUN apt-get update || : && apt-get install -y \ python3 \ - build-essential \ - && rm -rf /var/lib/apt/lists/* \ - && npm install -g pnpm + build-essential # Copy everything over from the source directory to the build directory COPY package.json pnpm-lock.yaml pnpm-workspace.yaml nx.json tsconfig.json .npmrc ./ -COPY lib lib COPY packages/learn-card-core packages/learn-card-core COPY packages/plugins/crypto packages/plugins/crypto COPY packages/plugins/did-web-plugin packages/plugins/did-web-plugin COPY packages/plugins/didkey packages/plugins/didkey COPY packages/plugins/didkit packages/plugins/didkit -COPY packages/plugins/didkit-plugin-node packages/plugins/didkit-plugin-node COPY packages/plugins/encryption packages/plugins/encryption COPY packages/plugins/expiration packages/plugins/expiration COPY packages/learn-card-helpers packages/learn-card-helpers @@ -33,6 +29,7 @@ COPY packages/plugins/vc-templates packages/plugins/vc-templates COPY tools/executors/workspace/run-command tools/executors/workspace/run-command COPY services/learn-card-network/brain-service services/learn-card-network/brain-service +# Install dependencies - Install inside container ensures parity on all machines RUN pnpm install --no-frozen-lockfile # Build project - Building inside container ensures parity on all machines diff --git a/services/learn-card-network/brain-service/Dockerfile.local b/services/learn-card-network/brain-service/Dockerfile.local index b06c93c5cd..002558b636 100644 --- a/services/learn-card-network/brain-service/Dockerfile.local +++ b/services/learn-card-network/brain-service/Dockerfile.local @@ -1,15 +1,38 @@ -ARG BASE_IMAGE=learncard-monorepo-local - -FROM ${BASE_IMAGE} - -# Skip native DIDKit build (local dev uses WASM fallback) -ENV SKIP_DIDKIT_NAPI=1 +FROM node:20.10.0-slim +# Set working directory to /app WORKDIR /app -# Install build dependencies and pnpm in one layer +# Sometimes we need python to build packages +RUN apt-get update || : && apt-get install -y \ + python3 \ + build-essential + +# Install PNPM package manager +RUN npm install -g pnpm # Copy everything over from the source directory to the build directory +COPY package.json pnpm-lock.yaml pnpm-workspace.yaml nx.json tsconfig.json .npmrc ./ +COPY packages/learn-card-core packages/learn-card-core +COPY packages/plugins/crypto packages/plugins/crypto +COPY packages/plugins/did-web-plugin packages/plugins/did-web-plugin +COPY packages/plugins/didkey packages/plugins/didkey +COPY packages/plugins/didkit packages/plugins/didkit +COPY packages/plugins/encryption packages/plugins/encryption +COPY packages/plugins/expiration packages/plugins/expiration +COPY packages/learn-card-helpers packages/learn-card-helpers +COPY packages/plugins/learn-card packages/plugins/learn-card +COPY packages/learn-card-types packages/learn-card-types +COPY packages/plugins/vc packages/plugins/vc +COPY packages/plugins/vc-templates packages/plugins/vc-templates +COPY packages/plugins/vc-templates packages/plugins/vc-templates +COPY tools/executors/workspace/run-command tools/executors/workspace/run-command +COPY services/learn-card-network/brain-service services/learn-card-network/brain-service + +# Install dependencies - Install inside container ensures parity on all machines +RUN pnpm install --no-frozen-lockfile + +RUN pnpm exec nx build:docker network-brain-service # Expose common ports used by server EXPOSE 3000 diff --git a/services/learn-card-network/brain-service/esbuild-docker.mjs b/services/learn-card-network/brain-service/esbuild-docker.mjs index 338ee6d54f..d4289192ee 100644 --- a/services/learn-card-network/brain-service/esbuild-docker.mjs +++ b/services/learn-card-network/brain-service/esbuild-docker.mjs @@ -13,7 +13,7 @@ const finalBuildObj = { format: 'cjs', outdir: 'build', target: 'node20', - external: ['@learncard/didkit-plugin-node', '@learncard/didkit-plugin', 'p-limit'], + external: ['@learncard/didkit-plugin/dist/didkit_wasm_bg.wasm', 'p-limit'], plugins, minify: true, sourcemap: true, diff --git a/services/learn-card-network/brain-service/nodemon.docker.json b/services/learn-card-network/brain-service/nodemon.docker.json deleted file mode 100644 index 539d36bde8..0000000000 --- a/services/learn-card-network/brain-service/nodemon.docker.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "watch": [ - "src", - "../../../packages/learn-card-types/dist", - "../../../packages/learn-card-helpers/dist", - "../../../packages/learn-card-core/dist", - "../../../packages/plugins/crypto/dist", - "../../../packages/plugins/didkey/dist", - "../../../packages/plugins/didkit/dist", - "../../../packages/plugins/didkit-plugin-node/dist", - "../../../packages/plugins/did-web-plugin/dist", - "../../../packages/plugins/encryption/dist", - "../../../packages/plugins/expiration/dist", - "../../../packages/plugins/learn-card/dist", - "../../../packages/plugins/vc/dist", - "../../../packages/plugins/vc-templates/dist" - ], - "ext": "ts,js,cjs,mjs,json", - "ignore": ["**/*.d.ts", "**/node_modules/**", "**/coverage/**", "**/*.test.ts", "**/*.spec.ts"], - "exec": "pnpm build:docker && node --enable-source-maps build/docker-entry.js", - "delay": "500", - "verbose": true -} diff --git a/services/learn-card-network/brain-service/package.json b/services/learn-card-network/brain-service/package.json index 29e51adbca..1d4e13b050 100644 --- a/services/learn-card-network/brain-service/package.json +++ b/services/learn-card-network/brain-service/package.json @@ -1,6 +1,6 @@ { "name": "@learncard/network-brain-service", - "version": "3.10.0", + "version": "3.9.5", "description": "", "main": "dist/index.js", "types": "dist/index.d.ts", @@ -11,10 +11,7 @@ "build:docker": "shx rm -rf build && node esbuild-docker.mjs", "start": "PORT=3000 serverless offline --httpPort 3000 --websocketPort 3001 --lambdaPort 3002 --albPort 3003 --host 127.0.0.1 --config serverless-local.yml", "start-p-4000": "PORT=4000 serverless offline --httpPort 4000 --websocketPort 4001 --lambdaPort 4002 --albPort 4003 --host 127.0.0.1 --config serverless-local.yml", - "dev": "nodemon --config nodemon.docker.json", - "dev:docker": "nodemon --watch src --watch ../../../packages/plugins --watch ../../../packages/learn-card-core --watch ../../../packages/learn-card-types --watch ../../../packages/learn-card-helpers -e ts,js --ignore \"../../**/*.d.ts\" --exec \"pnpm exec nx start:docker network-brain-service\"", - "dev:legacy": "nodemon --watch src --watch ../../../packages/plugins/*/dist --watch ../../../packages/learn-card-core/dist --watch ../../../packages/learn-card-types/dist --watch ../../../packages/learn-card-helpers/dist -e ts,js,cjs,mjs --ignore \"**/*.d.ts\" --exec \"pnpm build:docker && node --enable-source-maps build/docker-entry.js\"", - "start:docker": "pnpm build:docker && node --enable-source-maps build/docker-entry.js", + "dev": "nodemon --watch src --watch ../../../packages/plugins --watch ../../../packages/learn-card-core --watch ../../../packages/learn-card-types --watch ../../../packages/learn-card-helpers -e ts,js --ignore \"../../**/*.d.ts\" --exec \"pnpm build:docker && node --enable-source-maps build/docker-entry.js\"", "serverless-deploy": "serverless deploy --verbose" }, "keywords": [], @@ -48,16 +45,15 @@ "dependencies": { "@aws-sdk/client-sqs": "^3.379.1", "@digitalcredentials/issuer-registry-client": "^3.2.0-beta.5", - "@fastify/cors": "^11.2.0", - "@fastify/static": "^9.0.0", - "@fastify/swagger": "^9.6.1", - "@fastify/swagger-ui": "^5.2.4", + "@fastify/cors": "^9.0.1", + "@fastify/static": "^7.0.4", + "@fastify/swagger": "^8.15.0", + "@fastify/swagger-ui": "^4.1.0", "@learncard/core": "workspace:*", "@learncard/crypto-plugin": "workspace:*", "@learncard/did-web-plugin": "workspace:*", "@learncard/didkey-plugin": "workspace:*", - "@learncard/didkit-plugin": "workspace:*", - "@learncard/didkit-plugin-node": "workspace:*", + "@learncard/didkit-plugin": "workspace:^", "@learncard/encryption-plugin": "workspace:*", "@learncard/expiration-plugin": "workspace:*", "@learncard/helpers": "workspace:*", @@ -73,8 +69,8 @@ "cors": "^2.8.5", "dotenv": "^16.0.3", "express": "^4.18.2", - "fastify": "^5.7.2", - "fastify-plugin": "^5.1.0", + "fastify": "^4.28.1", + "fastify-plugin": "^4.5.1", "ioredis": "^5.2.2", "ioredis-mock": "^8.2.2", "jwt-decode": "^3.1.2", diff --git a/services/learn-card-network/brain-service/project.json b/services/learn-card-network/brain-service/project.json index 4141e0e02e..8a0a311331 100644 --- a/services/learn-card-network/brain-service/project.json +++ b/services/learn-card-network/brain-service/project.json @@ -20,61 +20,80 @@ "nx-run-command" ], "namedInputs": { - "source": ["{projectRoot}/src/**/*"], - "tests": ["{projectRoot}/test/**/*"], - "dist": ["{projectRoot}/dist/**/*"] + "source": [ + "{projectRoot}/src/**/*" + ], + "tests": [ + "{projectRoot}/test/**/*" + ], + "dist": [ + "{projectRoot}/dist/**/*" + ] }, "targets": { "serverless-deploy": { "executor": "nx:run-script", - "inputs": ["source"], - "dependsOn": ["^build"], + "inputs": [ + "source" + ], + "dependsOn": [ + "^build" + ], "options": { "script": "serverless-deploy" } }, "build": { "executor": "nx:run-script", - "inputs": ["source"], + "inputs": [ + "source" + ], "options": { "script": "build" } }, "build:docker": { "executor": "nx:run-script", - "inputs": ["source"], - "dependsOn": ["^build"], + "inputs": [ + "source" + ], + "dependsOn": [ + "^build" + ], "options": { "script": "build:docker" } }, - "start:docker": { - "executor": "nx:run-script", - "inputs": ["source"], - "dependsOn": ["^build"], - "options": { - "script": "start:docker" - } - }, "start": { "executor": "nx:run-script", - "inputs": ["source"], - "dependsOn": ["^build"], + "inputs": [ + "source" + ], + "dependsOn": [ + "^build" + ], "options": { "script": "start" } }, "start-p-4000": { "executor": "nx:run-script", - "inputs": ["source"], - "dependsOn": ["^build"], + "inputs": [ + "source" + ], + "dependsOn": [ + "^build" + ], "options": { "script": "start-p-4000" } }, "test": { "executor": "nx:run-script", - "inputs": ["source", "tests"], + "inputs": [ + "source", + "tests" + ], "options": { "script": "test" } diff --git a/services/learn-card-network/brain-service/serverless-local.yml b/services/learn-card-network/brain-service/serverless-local.yml index 2518a8caa3..85c39785cd 100644 --- a/services/learn-card-network/brain-service/serverless-local.yml +++ b/services/learn-card-network/brain-service/serverless-local.yml @@ -118,7 +118,6 @@ functions: events: - httpApi: GET /skills/{skillId} - httpApi: GET /frameworks/{frameworkId} - - httpApi: GET /frameworks/{frameworkId}/skills/{skillId} resources: Resources: diff --git a/services/learn-card-network/brain-service/serverless.local.yml b/services/learn-card-network/brain-service/serverless.local.yml index ab05a17091..326bb2f9a1 100644 --- a/services/learn-card-network/brain-service/serverless.local.yml +++ b/services/learn-card-network/brain-service/serverless.local.yml @@ -109,7 +109,6 @@ functions: events: - httpApi: GET /skills/{skillId} - httpApi: GET /frameworks/{frameworkId} - - httpApi: GET /frameworks/{frameworkId}/skills/{skillId} resources: Resources: diff --git a/services/learn-card-network/brain-service/serverless.yml b/services/learn-card-network/brain-service/serverless.yml index b37f39e2c5..9251deb16e 100644 --- a/services/learn-card-network/brain-service/serverless.yml +++ b/services/learn-card-network/brain-service/serverless.yml @@ -31,7 +31,7 @@ custom: plugins: esbuildPlugins.cjs bundle: true minify: true - external: ['@learncard/didkit-plugin/dist/didkit_wasm_bg.wasm', '*.node', 'p-limit'] + external: ['@learncard/didkit-plugin/dist/didkit_wasm_bg.wasm', 'p-limit'] sourcemap: external target: 'node20' watch: @@ -86,9 +86,6 @@ package: patterns: - '!node_modules/**' - 'node_modules/@learncard/didkit-plugin/dist/didkit_wasm_bg.wasm' - - 'node_modules/@learncard/didkit-plugin-node/*.node' - - 'node_modules/@learncard/didkit-plugin-node/package.json' - - 'node_modules/@learncard/didkit-plugin-node/dist/**' - 'src/swagger-ui' provider: @@ -192,7 +189,6 @@ functions: events: - httpApi: GET /skills/{skillId} - httpApi: GET /frameworks/{frameworkId} - - httpApi: GET /frameworks/{frameworkId}/skills/{skillId} resources: Resources: diff --git a/services/learn-card-network/brain-service/src/helpers/learnCard.helpers.ts b/services/learn-card-network/brain-service/src/helpers/learnCard.helpers.ts index b2c2576b34..7835f56a63 100644 --- a/services/learn-card-network/brain-service/src/helpers/learnCard.helpers.ts +++ b/services/learn-card-network/brain-service/src/helpers/learnCard.helpers.ts @@ -1,62 +1,25 @@ import { readFile } from 'node:fs/promises'; -import { generateLearnCard } from '@learncard/core'; -import type { LearnCard } from '@learncard/core'; -import { CryptoPlugin } from '@learncard/crypto-plugin'; -import type { CryptoPluginType } from '@learncard/crypto-plugin'; -import type { DIDKitPlugin, DidMethod } from '@learncard/didkit-plugin'; -import { getDidKeyPlugin } from '@learncard/didkey-plugin'; -import type { DidKeyPlugin } from '@learncard/didkey-plugin'; -import { getEncryptionPlugin } from '@learncard/encryption-plugin'; -import type { EncryptionPluginType } from '@learncard/encryption-plugin'; -import { getVCPlugin } from '@learncard/vc-plugin'; -import type { VCPlugin } from '@learncard/vc-plugin'; -import { getVCTemplatesPlugin } from '@learncard/vc-templates-plugin'; -import type { VCTemplatePlugin } from '@learncard/vc-templates-plugin'; -import { expirationPlugin } from '@learncard/expiration-plugin'; -import type { ExpirationPlugin } from '@learncard/expiration-plugin'; -import { getLearnCardPlugin } from '@learncard/learn-card-plugin'; -import type { LearnCardPlugin } from '@learncard/learn-card-plugin'; -import { getDidWebPlugin } from '@learncard/did-web-plugin'; -import type { DidWebPlugin } from '@learncard/did-web-plugin'; - -// Try native plugin first, fall back to WASM -let didKitPluginPromise: Promise | null = null; - -const resolveDidKitPluginFactory = ( - module: Record -): ((input?: unknown, allowRemoteContexts?: boolean) => Promise) => { - const factory = - (module as { getDidKitPlugin?: unknown }).getDidKitPlugin ?? - (module as { default?: { getDidKitPlugin?: unknown } }).default?.getDidKitPlugin; - - if (typeof factory !== 'function') { - throw new Error('DIDKit plugin factory not found in module exports'); +import { generateLearnCard, LearnCard } from '@learncard/core'; +import { CryptoPlugin, CryptoPluginType } from '@learncard/crypto-plugin'; +import { DIDKitPlugin, DidMethod, getDidKitPlugin } from '@learncard/didkit-plugin'; +import { DidKeyPlugin, getDidKeyPlugin } from '@learncard/didkey-plugin'; +import { EncryptionPluginType, getEncryptionPlugin } from '@learncard/encryption-plugin'; +import { VCPlugin, getVCPlugin } from '@learncard/vc-plugin'; +import { VCTemplatePlugin, getVCTemplatesPlugin } from '@learncard/vc-templates-plugin'; +import { ExpirationPlugin, expirationPlugin } from '@learncard/expiration-plugin'; +import { LearnCardPlugin, getLearnCardPlugin } from '@learncard/learn-card-plugin'; +import { getDidWebPlugin, DidWebPlugin } from '@learncard/did-web-plugin'; + +// Initialize didkit lazily to avoid top-level await issues +let didkitPromise: Promise | null = null; +const getDidkitWasm = () => { + if (!didkitPromise) { + didkitPromise = readFile( + require.resolve('@learncard/didkit-plugin/dist/didkit_wasm_bg.wasm') + ); } - - return factory as (input?: unknown, allowRemoteContexts?: boolean) => Promise; -}; - -const getDidKitPlugin = async (allowRemoteContexts = false): Promise => { - if (didKitPluginPromise) return didKitPluginPromise; - - didKitPluginPromise = (async () => { - try { - const didkitModule = await import('@learncard/didkit-plugin-node'); - const getNativePlugin = resolveDidKitPluginFactory(didkitModule); - return await getNativePlugin(undefined, allowRemoteContexts); - } catch (e) { - console.log('Native DIDKit plugin not available, falling back to WASM'); - const didkitModule = await import('@learncard/didkit-plugin'); - const getWasmPlugin = resolveDidKitPluginFactory(didkitModule); - const wasmBuffer = await readFile( - require.resolve('@learncard/didkit-plugin/dist/didkit_wasm_bg.wasm') - ); - return await getWasmPlugin(wasmBuffer, allowRemoteContexts); - } - })(); - - return didKitPluginPromise; + return didkitPromise; }; export type EmptyLearnCard = LearnCard< @@ -92,7 +55,7 @@ export type DidWebLearnCard = LearnCard< let emptyLearnCard: EmptyLearnCard; -const learnCards: Record = {}; +let learnCards: Record = {}; let didWebLearnCard: DidWebLearnCard; const IS_OFFLINE = process.env.IS_OFFLINE; @@ -101,7 +64,7 @@ export const getEmptyLearnCard = async (): Promise => { if (!emptyLearnCard || IS_OFFLINE) { const cryptoLc = await (await generateLearnCard()).addPlugin(CryptoPlugin); - const didkitLc = await cryptoLc.addPlugin(await getDidKitPlugin()); + const didkitLc = await cryptoLc.addPlugin(await getDidKitPlugin(await getDidkitWasm())); const expirationLc = await didkitLc.addPlugin(expirationPlugin(didkitLc)); @@ -113,16 +76,13 @@ export const getEmptyLearnCard = async (): Promise => { return emptyLearnCard; }; -export const getLearnCard = async ( - seed = process.env.SEED, - allowRemoteContexts = false -): Promise => { +export const getLearnCard = async (seed = process.env.SEED, allowRemoteContexts = false): Promise => { if (!seed) throw new Error('No seed set!'); if (!learnCards[seed] || IS_OFFLINE) { const cryptoLc = await (await generateLearnCard()).addPlugin(CryptoPlugin); - const didkitLc = await cryptoLc.addPlugin(await getDidKitPlugin(allowRemoteContexts)); + const didkitLc = await cryptoLc.addPlugin(await getDidKitPlugin(await getDidkitWasm(), allowRemoteContexts)); const didkeyLc = await didkitLc.addPlugin( await getDidKeyPlugin(didkitLc, seed, 'key') @@ -139,13 +99,7 @@ export const getLearnCard = async ( learnCards[seed] = await expirationLc.addPlugin(getLearnCardPlugin(expirationLc)); } - const learnCard = learnCards[seed]; - - if (!learnCard) { - throw new Error('LearnCard not initialized'); - } - - return learnCard; + return learnCards[seed]!; }; export const getServerDidWebDID = (): string => { @@ -162,9 +116,7 @@ export const isServersDidWebDID = (did: string): boolean => { }; export const isTrustedLoginProviderDID = (did: string): boolean => { - const loginProviderDid = process.env.LOGIN_PROVIDER_DID; - - return did === getServerDidWebDID() || (loginProviderDid ? did === loginProviderDid : false); + return did === getServerDidWebDID() || did === process.env.LOGIN_PROVIDER_DID!; }; export const getDidWebLearnCard = async (): Promise => { @@ -177,7 +129,7 @@ export const getDidWebLearnCard = async (): Promise => { if (!didWebLearnCard || IS_OFFLINE) { const cryptoLc = await (await generateLearnCard()).addPlugin(CryptoPlugin); - const didkitLc = await cryptoLc.addPlugin(await getDidKitPlugin()); + const didkitLc = await cryptoLc.addPlugin(await getDidKitPlugin(await getDidkitWasm())); const didkeyLc = await didkitLc.addPlugin( await getDidKeyPlugin(didkitLc, seed, 'key') diff --git a/services/learn-card-network/brain-service/src/helpers/signingAuthority.helpers.ts b/services/learn-card-network/brain-service/src/helpers/signingAuthority.helpers.ts index 79b5258049..6a6627b5ec 100644 --- a/services/learn-card-network/brain-service/src/helpers/signingAuthority.helpers.ts +++ b/services/learn-card-network/brain-service/src/helpers/signingAuthority.helpers.ts @@ -47,18 +47,8 @@ export async function issueCredentialWithSigningAuthority( if (!IS_TEST_ENVIRONMENT) console.log('Issuer Endpoint: ', issuerEndpoint); const ownerDid = getDidWeb(domain ?? 'network.learncard.com', owner.profileId); - const subjectId = Array.isArray(credential?.credentialSubject) - ? credential?.credentialSubject[0]?.id - : credential?.credentialSubject?.id; - - const encryption = encrypt - ? { - recipients: [ - learnCard.id.did(), - ...(subjectId ? [subjectId] : []), - ], - } - : undefined; + + const encryption = encrypt ? { recipients: [learnCard.id.did()] } : undefined; // Create an AbortController instance and get the signal const controller = new AbortController(); diff --git a/services/learn-card-network/brain-service/test/consentflow.spec.ts b/services/learn-card-network/brain-service/test/consentflow.spec.ts index ff33f3717d..facdbb874c 100644 --- a/services/learn-card-network/brain-service/test/consentflow.spec.ts +++ b/services/learn-card-network/brain-service/test/consentflow.spec.ts @@ -3563,7 +3563,7 @@ describe('Consent Flow Contracts', () => { ...thirdPageMedium.records, ]; expect(combinedRecords.length).toEqual(allResults.records.length); - }, 30000); // Increased timeout: creates 15 credentials with signing overhead + }); it('should handle edge cases with uneven page divisions', async () => { // Create 10 credentials for pagination testing @@ -3646,7 +3646,7 @@ describe('Consent Flow Contracts', () => { ...thirdPage.records, ...fourthPage.records, ]); - }, 20000); // Increased timeout: creates 10 credentials with signing overhead + }); it('should maintain cursor consistency across requests', async () => { // Add a set of credentials @@ -3706,7 +3706,7 @@ describe('Consent Flow Contracts', () => { // Results should be identical expect(secondPageA.records).toEqual(secondPageB.records); expect(secondPageA.cursor).toEqual(secondPageB.cursor); - }, 20000); // Increased timeout: creates 10 credentials with signing overhead + }); }); describe('syncCredentialsToContract', () => { @@ -4063,7 +4063,7 @@ describe('Consent Flow Contracts', () => { boostUri: boost2, credential: credential2, }); - }, 15000); // Increased hook timeout: sets up complex contract state with credential signing + }); afterEach(async () => { await Profile.delete({ detach: true, where: {} }); @@ -4190,7 +4190,7 @@ describe('Consent Flow Contracts', () => { expect( [...firstPage.records, ...secondPage.records, ...thirdPage.records].length ).toEqual(allResults.records.length); - }, 20000); // Increased timeout: creates 10 additional credentials with signing overhead + }); it('should respect the includeReceived parameter', async () => { // Get all credentials diff --git a/services/learn-card-network/brain-service/test/contact-method.spec.ts b/services/learn-card-network/brain-service/test/contact-method.spec.ts index 013ec45e56..a2884fcdf4 100644 --- a/services/learn-card-network/brain-service/test/contact-method.spec.ts +++ b/services/learn-card-network/brain-service/test/contact-method.spec.ts @@ -24,8 +24,8 @@ describe('Contact Methods', () => { afterAll(() => { process.env = originalEnv; - }); - + }); + beforeAll(async () => { userA = await getUser('a'.repeat(64)); userB = await getUser('b'.repeat(64)); @@ -43,6 +43,7 @@ describe('Contact Methods', () => { }); describe('Verify With Credential (proof-of-login VP-JWT)', () => { + beforeEach(async () => { sendSpy.mockClear(); await Profile.delete({ detach: true, where: {} }); @@ -70,7 +71,7 @@ describe('Contact Methods', () => { const methods = await userB.clients.fullAuth.contactMethods.getMyContactMethods(); const cm = methods?.find(m => m.value === 'userB@test.com'); expect(cm?.isVerified).toBe(true); - expect(cm?.verifiedAt).toBeDefined(); + expect(cm?.verifiedAt).toBeDefined(); }); it('should reject a VP-JWT whose holder is not a trusted login provider', async () => { @@ -80,9 +81,7 @@ describe('Contact Methods', () => { })) as unknown as string; await expect( - userB.clients.fullAuth.contactMethods.verifyWithCredential({ - proofOfLoginJwt: vpJwt, - }) + userB.clients.fullAuth.contactMethods.verifyWithCredential({ proofOfLoginJwt: vpJwt }) ).rejects.toMatchObject({ code: 'UNAUTHORIZED' }); }); @@ -93,9 +92,7 @@ describe('Contact Methods', () => { })) as unknown as string; await expect( - userB.clients.fullAuth.contactMethods.verifyWithCredential({ - proofOfLoginJwt: vpJwt, - }) + userB.clients.fullAuth.contactMethods.verifyWithCredential({ proofOfLoginJwt: vpJwt }) ).rejects.toMatchObject({ code: 'BAD_REQUEST' }); }); @@ -106,9 +103,7 @@ describe('Contact Methods', () => { })) as unknown as string; await expect( - userB.clients.fullAuth.contactMethods.verifyWithCredential({ - proofOfLoginJwt: vpJwt, - }) + userB.clients.fullAuth.contactMethods.verifyWithCredential({ proofOfLoginJwt: vpJwt }) ).rejects.toMatchObject({ code: 'BAD_REQUEST' }); }); }); @@ -120,7 +115,9 @@ describe('Contact Methods', () => { }); it('should not let a user get their contact methods without full auth', async () => { - await expect(noAuthClient.contactMethods.getMyContactMethods()).rejects.toMatchObject({ + await expect( + noAuthClient.contactMethods.getMyContactMethods() + ).rejects.toMatchObject({ code: 'UNAUTHORIZED', }); await expect( @@ -129,26 +126,22 @@ describe('Contact Methods', () => { }); it('should let a user get their contact methods', async () => { - const contactMethods = - await userB.clients.fullAuth.contactMethods.getMyContactMethods(); + const contactMethods = await userB.clients.fullAuth.contactMethods.getMyContactMethods(); expect(contactMethods).toBeDefined(); expect(contactMethods?.length).toBe(0); + }); it('should allow adding a contact method', async () => { - const contactMethod = await userB.clients.fullAuth.contactMethods.addContactMethod({ - type: 'email', - value: 'userB@test.com', - }); + const contactMethod = await userB.clients.fullAuth.contactMethods.addContactMethod({ type: 'email', value: 'userB@test.com' }); expect(contactMethod).toBeDefined(); expect(contactMethod?.verificationRequired).toBe(true); expect(contactMethod?.contactMethodId).toBeDefined(); - - const contactMethods = - await userB.clients.fullAuth.contactMethods.getMyContactMethods(); + + const contactMethods = await userB.clients.fullAuth.contactMethods.getMyContactMethods(); expect(contactMethods).toBeDefined(); expect(contactMethods?.length).toBe(1); - if (!contactMethods?.[0]) { + if(!contactMethods?.[0]) { throw new Error('Contact method is undefined'); } expect(contactMethods?.[0].value).toBe('userB@test.com'); @@ -158,17 +151,12 @@ describe('Contact Methods', () => { if (!contactMethods?.[0].createdAt) { throw new Error('Created at is undefined'); } - expect(new Date(contactMethods?.[0].createdAt).getTime()).toBeLessThanOrEqual( - new Date().getTime() - ); + expect(new Date(contactMethods?.[0].createdAt).getTime()).toBeLessThanOrEqual(new Date().getTime()); }); it('should allow verifying an email contact method', async () => { // Add a contact method. This will also trigger the verification email. - await userB.clients.fullAuth.contactMethods.addContactMethod({ - type: 'email', - value: 'userB@test.com', - }); + await userB.clients.fullAuth.contactMethods.addContactMethod({ type: 'email', value: 'userB@test.com' }); // Check that the delivery service was called expect(sendSpy).toHaveBeenCalledOnce(); @@ -181,30 +169,22 @@ describe('Contact Methods', () => { expect(verificationToken).toBeDefined(); // Use the retrieved token to complete the verification - await userB.clients.fullAuth.contactMethods.verifyContactMethod({ - token: verificationToken, - }); + await userB.clients.fullAuth.contactMethods.verifyContactMethod({ token: verificationToken }); // Assert that the contact method is now verified - const contactMethods = - await userB.clients.fullAuth.contactMethods.getMyContactMethods(); + const contactMethods = await userB.clients.fullAuth.contactMethods.getMyContactMethods(); const verifiedMethod = contactMethods?.find(cm => cm.value === 'userB@test.com'); expect(verifiedMethod?.isVerified).toBe(true); if (!verifiedMethod?.verifiedAt) { throw new Error('Verified at is undefined'); } - expect(new Date(verifiedMethod?.verifiedAt).getTime()).toBeLessThanOrEqual( - new Date().getTime() - ); + expect(new Date(verifiedMethod?.verifiedAt).getTime()).toBeLessThanOrEqual(new Date().getTime()); }); it('should allow verifying a phone contact method', async () => { process.env.TRUSTED_ISSUERS_WHITELIST = userB.learnCard.id.did(); // Add a contact method. This will also trigger the verification SMS. - await userB.clients.fullAuth.contactMethods.addContactMethod({ - type: 'phone', - value: '+15555555', - }); + await userB.clients.fullAuth.contactMethods.addContactMethod({ type: 'phone', value: '+15555555' }); // Check that the delivery service was called expect(sendSpy).toHaveBeenCalledOnce(); @@ -217,31 +197,21 @@ describe('Contact Methods', () => { expect(verificationToken).toBeDefined(); // Use the retrieved token to complete the verification - await userB.clients.fullAuth.contactMethods.verifyContactMethod({ - token: verificationToken, - }); + await userB.clients.fullAuth.contactMethods.verifyContactMethod({ token: verificationToken }); // Assert that the contact method is now verified - const contactMethods = - await userB.clients.fullAuth.contactMethods.getMyContactMethods(); + const contactMethods = await userB.clients.fullAuth.contactMethods.getMyContactMethods(); const verifiedMethod = contactMethods?.find(cm => cm.value === '+15555555'); expect(verifiedMethod?.isVerified).toBe(true); }); it('should not allow verifying a phone contact if the profiles DID is not in the trusted issuers whitelist', async () => { - await expect( - userB.clients.fullAuth.contactMethods.addContactMethod({ - type: 'phone', - value: '+15555555', - }) - ).rejects.toThrow(); + await expect(userB.clients.fullAuth.contactMethods.addContactMethod({ type: 'phone', value: '+15555555' })).rejects.toThrow(); }); it('should not allow verifying a contact method that does not exist', async () => { await expect( - userB.clients.fullAuth.contactMethods.verifyContactMethod({ - token: 'invalid-token', - }) + userB.clients.fullAuth.contactMethods.verifyContactMethod({ token: 'invalid-token' }) ).rejects.toMatchObject({ code: 'BAD_REQUEST', message: 'Invalid or expired verification token', @@ -250,10 +220,7 @@ describe('Contact Methods', () => { it('should not allow verifying a contact method that does not belong to the profile', async () => { // Add a contact method to user A - await userA.clients.fullAuth.contactMethods.addContactMethod({ - type: 'email', - value: 'userA@test.com', - }); + await userA.clients.fullAuth.contactMethods.addContactMethod({ type: 'email', value: 'userA@test.com' }); // Get the verification token from the spy's call arguments const sendArgs = sendSpy.mock.calls[0][0]; @@ -261,78 +228,60 @@ describe('Contact Methods', () => { // Verify the contact method as user B await expect( - userB.clients.fullAuth.contactMethods.verifyContactMethod({ - token: verificationToken, - }) + userB.clients.fullAuth.contactMethods.verifyContactMethod({ token: verificationToken }) ).rejects.toMatchObject({ code: 'FORBIDDEN', message: 'You do not own this contact method', }); // Assert that the contact method is not verified for user A - const contactMethods = - await userA.clients.fullAuth.contactMethods.getMyContactMethods(); + const contactMethods = await userA.clients.fullAuth.contactMethods.getMyContactMethods(); const verifiedMethod = contactMethods?.find(cm => cm.value === 'userA@test.com'); expect(verifiedMethod?.isVerified).toBe(false); }); it('if multiple profiles add the contact method, it should delete it from other profiles once verified', async () => { // Add a contact method to user A - await userA.clients.fullAuth.contactMethods.addContactMethod({ - type: 'email', - value: 'userA@test.com', - }); + await userA.clients.fullAuth.contactMethods.addContactMethod({ type: 'email', value: 'userA@test.com' }); // Get the verification token from the spy's call arguments const sendArgs = sendSpy.mock.calls[0][0]; const verificationToken = sendArgs.templateModel.verificationToken; // Add a contact method to user A - await userB.clients.fullAuth.contactMethods.addContactMethod({ - type: 'email', - value: 'userA@test.com', - }); + await userB.clients.fullAuth.contactMethods.addContactMethod({ type: 'email', value: 'userA@test.com' }); // Get the verification token from the spy's call arguments const sendArgs2 = sendSpy.mock.calls[1][0]; const verificationToken2 = sendArgs2.templateModel.verificationToken; + // Verify the contact method as user B await expect( - userB.clients.fullAuth.contactMethods.verifyContactMethod({ - token: verificationToken2, - }) + userB.clients.fullAuth.contactMethods.verifyContactMethod({ token: verificationToken2 }) ).resolves.not.toThrow(); // Assert that the contact method is verified for user B - const contactMethods = - await userB.clients.fullAuth.contactMethods.getMyContactMethods(); + const contactMethods = await userB.clients.fullAuth.contactMethods.getMyContactMethods(); const verifiedMethod = contactMethods?.find(cm => cm.value === 'userA@test.com'); expect(verifiedMethod?.isVerified).toBe(true); // Assert that the contact method is deleted for user A - const contactMethods2 = - await userA.clients.fullAuth.contactMethods.getMyContactMethods(); + const contactMethods2 = await userA.clients.fullAuth.contactMethods.getMyContactMethods(); const verifiedMethod2 = contactMethods2?.find(cm => cm.value === 'userA@test.com'); - expect(verifiedMethod2).toBeUndefined(); + expect(verifiedMethod2).toBeUndefined(); + }); it('should allow setting a contact method as primary', async () => { // Add a contact method to user B - const { contactMethodId } = - await userB.clients.fullAuth.contactMethods.addContactMethod({ - type: 'email', - value: 'userB@test.com', - }); + const { contactMethodId } = await userB.clients.fullAuth.contactMethods.addContactMethod({ type: 'email', value: 'userB@test.com' }); // Set the contact method as primary - await userB.clients.fullAuth.contactMethods.setPrimaryContactMethod({ - contactMethodId, - }); + await userB.clients.fullAuth.contactMethods.setPrimaryContactMethod({ contactMethodId }); // Assert that the contact method is now primary - const contactMethods = - await userB.clients.fullAuth.contactMethods.getMyContactMethods(); + const contactMethods = await userB.clients.fullAuth.contactMethods.getMyContactMethods(); const primaryMethod = contactMethods?.find(cm => cm.value === 'userB@test.com'); expect(primaryMethod?.isPrimary).toBe(true); }); @@ -340,27 +289,16 @@ describe('Contact Methods', () => { it('should unset previous primary contacts when setting a new primary contact', async () => { process.env.TRUSTED_ISSUERS_WHITELIST = userB.learnCard.id.did(); // Add a contact method to user B - const { contactMethodId } = - await userB.clients.fullAuth.contactMethods.addContactMethod({ - type: 'email', - value: 'userB@test.com', - }); + const { contactMethodId } = await userB.clients.fullAuth.contactMethods.addContactMethod({ type: 'email', value: 'userB@test.com' }); // Add another contact method to user B - const { contactMethodId: contactMethodId2 } = - await userB.clients.fullAuth.contactMethods.addContactMethod({ - type: 'phone', - value: '+15555555', - }); + const { contactMethodId: contactMethodId2 } = await userB.clients.fullAuth.contactMethods.addContactMethod({ type: 'phone', value: '+15555555' }); // Set the contact method as primary - await userB.clients.fullAuth.contactMethods.setPrimaryContactMethod({ - contactMethodId, - }); + await userB.clients.fullAuth.contactMethods.setPrimaryContactMethod({ contactMethodId }); // Assert that the contact method is now primary - const contactMethods = - await userB.clients.fullAuth.contactMethods.getMyContactMethods(); + const contactMethods = await userB.clients.fullAuth.contactMethods.getMyContactMethods(); const primaryMethod = contactMethods?.find(cm => cm.value === 'userB@test.com'); expect(primaryMethod?.isPrimary).toBe(true); @@ -369,13 +307,10 @@ describe('Contact Methods', () => { expect(primaryMethod2?.isPrimary).toBe(false); // Set the other contact method as primary - await userB.clients.fullAuth.contactMethods.setPrimaryContactMethod({ - contactMethodId: contactMethodId2, - }); + await userB.clients.fullAuth.contactMethods.setPrimaryContactMethod({ contactMethodId: contactMethodId2 }); // Assert that the contact method is now primary - const contactMethods3 = - await userB.clients.fullAuth.contactMethods.getMyContactMethods(); + const contactMethods3 = await userB.clients.fullAuth.contactMethods.getMyContactMethods(); const primaryMethod3 = contactMethods3?.find(cm => cm.value === '+15555555'); expect(primaryMethod3?.isPrimary).toBe(true); @@ -386,11 +321,7 @@ describe('Contact Methods', () => { it('should not allow setting a contact method as primary that does not belong to the profile', async () => { // Add a contact method to user A - const { contactMethodId } = - await userA.clients.fullAuth.contactMethods.addContactMethod({ - type: 'email', - value: 'userA@test.com', - }); + const { contactMethodId } = await userA.clients.fullAuth.contactMethods.addContactMethod({ type: 'email', value: 'userA@test.com' }); // Set the contact method as primary for user B await expect( @@ -403,30 +334,19 @@ describe('Contact Methods', () => { it('should allow removing a contact method', async () => { // Add a contact method to user B - const { contactMethodId } = - await userB.clients.fullAuth.contactMethods.addContactMethod({ - type: 'email', - value: 'userB@test.com', - }); + const { contactMethodId } = await userB.clients.fullAuth.contactMethods.addContactMethod({ type: 'email', value: 'userB@test.com' }); // Remove the contact method - await userB.clients.fullAuth.contactMethods.removeContactMethod({ - id: contactMethodId, - }); + await userB.clients.fullAuth.contactMethods.removeContactMethod({ id: contactMethodId }); // Assert that the contact method is no longer associated with the profile - const contactMethods = - await userB.clients.fullAuth.contactMethods.getMyContactMethods(); + const contactMethods = await userB.clients.fullAuth.contactMethods.getMyContactMethods(); expect(contactMethods?.length).toBe(0); }); it('should allow removing a verified contact method', async () => { // Add a contact method. This will also trigger the verification email. - const { contactMethodId } = - await userB.clients.fullAuth.contactMethods.addContactMethod({ - type: 'email', - value: 'userB@test.com', - }); + const { contactMethodId } =await userB.clients.fullAuth.contactMethods.addContactMethod({ type: 'email', value: 'userB@test.com' }); // Check that the delivery service was called expect(sendSpy).toHaveBeenCalledOnce(); @@ -439,28 +359,19 @@ describe('Contact Methods', () => { expect(verificationToken).toBeDefined(); // Use the retrieved token to complete the verification - await userB.clients.fullAuth.contactMethods.verifyContactMethod({ - token: verificationToken, - }); + await userB.clients.fullAuth.contactMethods.verifyContactMethod({ token: verificationToken }); // Remove the contact method - await userB.clients.fullAuth.contactMethods.removeContactMethod({ - id: contactMethodId, - }); + await userB.clients.fullAuth.contactMethods.removeContactMethod({ id: contactMethodId }); // Assert that the contact method is no longer associated with the profile - const contactMethods2 = - await userB.clients.fullAuth.contactMethods.getMyContactMethods(); + const contactMethods2 = await userB.clients.fullAuth.contactMethods.getMyContactMethods(); expect(contactMethods2?.length).toBe(0); }); it('should not allow removing a contact method that does not belong to the profile', async () => { // Add a contact method to user A - const { contactMethodId } = - await userA.clients.fullAuth.contactMethods.addContactMethod({ - type: 'email', - value: 'userA@test.com', - }); + const { contactMethodId } = await userA.clients.fullAuth.contactMethods.addContactMethod({ type: 'email', value: 'userA@test.com' }); // Remove the contact method for user B await expect( @@ -470,9 +381,11 @@ describe('Contact Methods', () => { message: 'You do not own this contact method', }); }); + }); describe('Create Inbox Claim Session', () => { + beforeEach(async () => { sendSpy.mockClear(); await Profile.delete({ detach: true, where: {} }); @@ -481,15 +394,14 @@ describe('Contact Methods', () => { await userA.clients.fullAuth.profile.createProfile({ profileId: 'usera' }); await userB.clients.fullAuth.profile.createProfile({ profileId: 'userb' }); + const integrationId = await userA.clients.fullAuth.integrations.addIntegration({ name: 'test', whitelistedDomains: ['localhost:3000'], - description: 'test', - }); - - integration = await userA.clients.fullAuth.integrations.getIntegration({ - id: integrationId, - }); + description: 'test', + }); + + integration = await userA.clients.fullAuth.integrations.getIntegration({ id: integrationId }); }); afterAll(async () => { @@ -500,22 +412,16 @@ describe('Contact Methods', () => { }); it('should return UNAUTHORIZED when creating a contact method session with an incorrect otp code', async () => { + if (!integration) { throw new Error('Integration not found'); } - - // Add a contact method to user A - await userA.clients.fullAuth.contactMethods.sendChallenge({ - type: 'email', - value: 'userA@test.com', - configuration: { publishableKey: integration.publishableKey }, - }); - + + // Add a contact method to user A + await userA.clients.fullAuth.contactMethods.sendChallenge({ type: 'email', value: 'userA@test.com', configuration: { publishableKey: integration.publishableKey } }); + await expect( - userB.clients.fullAuth.contactMethods.createContactMethodSession({ - contactMethod: { type: 'email', value: 'userA@test.com' }, - otpChallenge: '123456', - }) + userB.clients.fullAuth.contactMethods.createContactMethodSession({ contactMethod: { type: 'email', value: 'userA@test.com' }, otpChallenge: '123456' }) ).rejects.toMatchObject({ code: 'UNAUTHORIZED', message: 'Invalid OTP challenge' }); }); }); diff --git a/services/learn-card-network/brain-service/vite.config.ts b/services/learn-card-network/brain-service/vite.config.ts index a28dd8dba3..3aae5eb9ce 100644 --- a/services/learn-card-network/brain-service/vite.config.ts +++ b/services/learn-card-network/brain-service/vite.config.ts @@ -23,7 +23,6 @@ export default defineConfig({ IS_E2E_TEST: 'true', LOGIN_PROVIDER_DID: 'did:key:z6Mko9uYxDPk2BetRRziLz1xHN8nR5zQWdNjytKNDPcygHJP', APP_STORE_ADMIN_PROFILE_IDS: 'app-store-admin', - }, - // testTimeout: 30000, + } }, }); diff --git a/services/learn-card-network/lca-api/.dockerignore b/services/learn-card-network/lca-api/.dockerignore deleted file mode 100644 index 3ab08dde63..0000000000 --- a/services/learn-card-network/lca-api/.dockerignore +++ /dev/null @@ -1,6 +0,0 @@ -# Exclude Rust build artifacts to save space -lib/didkit/target -lib/ssi/target -node_modules -*.log -.git diff --git a/services/learn-card-network/lca-api/.npmrc b/services/learn-card-network/lca-api/.npmrc deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/services/learn-card-network/lca-api/CHANGELOG.md b/services/learn-card-network/lca-api/CHANGELOG.md index cdac00d757..450e66e9cd 100644 --- a/services/learn-card-network/lca-api/CHANGELOG.md +++ b/services/learn-card-network/lca-api/CHANGELOG.md @@ -1,26 +1,5 @@ # @welibraryos/lca-api-service -## 1.1.9 - -### Patch Changes - -- [`175a828f712da5b44eeb3c242e8fd604736df073`](https://github.com/learningeconomy/LearnCard/commit/175a828f712da5b44eeb3c242e8fd604736df073) Thanks [@TaylorBeeston](https://github.com/TaylorBeeston)! - Add debug logging - -## 1.1.8 - -### Patch Changes - -- [`c04ff8e86677b7f88fb2858be2b9b3f8bb28f427`](https://github.com/learningeconomy/LearnCard/commit/c04ff8e86677b7f88fb2858be2b9b3f8bb28f427) Thanks [@TaylorBeeston](https://github.com/TaylorBeeston)! - Fix Deployed Lambda issue - -## 1.1.7 - -### Patch Changes - -- Updated dependencies [[`7e30fc7116411ba19a4889cfbf9fc71dd725c309`](https://github.com/learningeconomy/LearnCard/commit/7e30fc7116411ba19a4889cfbf9fc71dd725c309)]: - - @learncard/didkit-plugin-node@0.2.0 - - @learncard/init@2.3.0 - - @learncard/didkit-plugin@1.7.0 - ## 1.1.6 ### Patch Changes diff --git a/services/learn-card-network/lca-api/Dockerfile b/services/learn-card-network/lca-api/Dockerfile index eed89cd7a3..da2f59918c 100644 --- a/services/learn-card-network/lca-api/Dockerfile +++ b/services/learn-card-network/lca-api/Dockerfile @@ -1,18 +1,16 @@ # Use an official Node runtime as the base image -# Using bullseye (Debian 11) to avoid native module build issues on Debian 12 -FROM node:20.10.0-bullseye-slim - -# Skip native DIDKit build (uses WASM fallback) -ENV SKIP_DIDKIT_NAPI=1 +FROM node:20.10.0-slim +# Set working directory to /app WORKDIR /app -# Install build dependencies and pnpm in one layer -RUN apt-get update && apt-get install -y --no-install-recommends \ +# Sometimes we need python to build packages +RUN apt-get update || : && apt-get install -y \ python3 \ - build-essential \ - && rm -rf /var/lib/apt/lists/* \ - && npm install -g pnpm + build-essential + +# Install PNPM package manager +RUN npm install -g pnpm # Copy root workspace files @@ -35,7 +33,6 @@ COPY packages/plugins/idx/package.json packages/plugins/idx/ COPY packages/plugins/ceramic/package.json packages/plugins/ceramic/ COPY packages/plugins/didkey/package.json packages/plugins/didkey/ COPY packages/plugins/didkit/package.json packages/plugins/didkit/ -COPY packages/plugins/didkit-plugin-node/package.json packages/plugins/didkit-plugin-node/ COPY packages/plugins/did-web-plugin/package.json packages/plugins/did-web-plugin/ COPY packages/plugins/dynamic-loader/package.json packages/plugins/dynamic-loader/ COPY packages/plugins/encryption/package.json packages/plugins/encryption/ @@ -50,6 +47,7 @@ COPY packages/plugins/vc-api/package.json packages/plugins/vc-api/ COPY packages/plugins/vc-templates/package.json packages/plugins/vc-templates/ COPY packages/plugins/vpqr/package.json packages/plugins/vpqr/ +# Install dependencies - Install inside container ensures parity on all machines RUN pnpm install --no-frozen-lockfile # Copy full sources after installing dependencies to leverage caching @@ -68,7 +66,6 @@ COPY packages/plugins/idx packages/plugins/idx COPY packages/plugins/ceramic packages/plugins/ceramic COPY packages/plugins/didkey packages/plugins/didkey COPY packages/plugins/didkit packages/plugins/didkit -COPY packages/plugins/didkit-plugin-node packages/plugins/didkit-plugin-node COPY packages/plugins/did-web-plugin packages/plugins/did-web-plugin COPY packages/plugins/dynamic-loader packages/plugins/dynamic-loader COPY packages/plugins/encryption packages/plugins/encryption diff --git a/services/learn-card-network/lca-api/Dockerfile.local b/services/learn-card-network/lca-api/Dockerfile.local index dc9a9dc8b2..7f623660d0 100644 --- a/services/learn-card-network/lca-api/Dockerfile.local +++ b/services/learn-card-network/lca-api/Dockerfile.local @@ -1,17 +1,89 @@ # Use an official Node runtime as the base image -ARG BASE_IMAGE=learncard-monorepo-local - -FROM ${BASE_IMAGE} - -# Skip native DIDKit build (local dev uses WASM fallback) -ENV SKIP_DIDKIT_NAPI=1 +FROM node:20.10.0-slim +# Set working directory to /app WORKDIR /app -# Install build dependencies and pnpm in one layer +# Sometimes we need python to build packages +RUN apt-get update || : && apt-get install -y \ + python3 \ + build-essential + +# Install PNPM package manager +RUN npm install -g pnpm # Copy root workspace files +COPY package.json pnpm-lock.yaml pnpm-workspace.yaml nx.json tsconfig.json .npmrc .gitignore .nxignore ./ +COPY tools/executors/workspace/run-command tools/executors/workspace/run-command + +# Copy dependency manifests for better Docker caching +COPY services/learn-card-network/lca-api/package.json services/learn-card-network/lca-api/ +COPY packages/learn-card-helpers/package.json packages/learn-card-helpers/ +COPY packages/learn-card-types/package.json packages/learn-card-types/ +COPY packages/learn-card-core/package.json packages/learn-card-core/ +COPY packages/learn-card-init/package.json packages/learn-card-init/ +COPY packages/learn-card-network/brain-client/package.json packages/learn-card-network/brain-client/ +COPY packages/learn-card-network/cloud-client/package.json packages/learn-card-network/cloud-client/ +COPY services/learn-card-network/brain-service/package.json services/learn-card-network/brain-service/ +COPY services/learn-card-network/learn-cloud-service/package.json services/learn-card-network/learn-cloud-service/ +COPY packages/plugins/chapi/package.json packages/plugins/chapi/ +COPY packages/plugins/crypto/package.json packages/plugins/crypto/ +COPY packages/plugins/idx/package.json packages/plugins/idx/ +COPY packages/plugins/ceramic/package.json packages/plugins/ceramic/ +COPY packages/plugins/didkey/package.json packages/plugins/didkey/ +COPY packages/plugins/didkit/package.json packages/plugins/didkit/ +COPY packages/plugins/did-web-plugin/package.json packages/plugins/did-web-plugin/ +COPY packages/plugins/dynamic-loader/package.json packages/plugins/dynamic-loader/ +COPY packages/plugins/encryption/package.json packages/plugins/encryption/ +COPY packages/plugins/ethereum/package.json packages/plugins/ethereum/ +COPY packages/plugins/expiration/package.json packages/plugins/expiration/ +COPY packages/plugins/learn-card/package.json packages/plugins/learn-card/ +COPY packages/plugins/learn-card-network/package.json packages/plugins/learn-card-network/ +COPY packages/plugins/linked-claims/package.json packages/plugins/linked-claims/ +COPY packages/plugins/learn-cloud/package.json packages/plugins/learn-cloud/ +COPY packages/plugins/vc/package.json packages/plugins/vc/ +COPY packages/plugins/vc-api/package.json packages/plugins/vc-api/ +COPY packages/plugins/vc-templates/package.json packages/plugins/vc-templates/ +COPY packages/plugins/vpqr/package.json packages/plugins/vpqr/ + +# Install dependencies - Install inside container ensures parity on all machines +RUN pnpm install --no-frozen-lockfile + +# Copy full sources after installing dependencies to leverage caching +COPY services/learn-card-network/lca-api services/learn-card-network/lca-api +COPY packages/learn-card-helpers packages/learn-card-helpers +COPY packages/learn-card-types packages/learn-card-types +COPY packages/learn-card-core packages/learn-card-core +COPY packages/learn-card-init packages/learn-card-init +COPY packages/learn-card-network/brain-client packages/learn-card-network/brain-client +COPY packages/learn-card-network/cloud-client packages/learn-card-network/cloud-client +COPY services/learn-card-network/brain-service services/learn-card-network/brain-service +COPY services/learn-card-network/learn-cloud-service services/learn-card-network/learn-cloud-service +COPY packages/plugins/chapi packages/plugins/chapi +COPY packages/plugins/crypto packages/plugins/crypto +COPY packages/plugins/idx packages/plugins/idx +COPY packages/plugins/ceramic packages/plugins/ceramic +COPY packages/plugins/didkey packages/plugins/didkey +COPY packages/plugins/didkit packages/plugins/didkit +COPY packages/plugins/did-web-plugin packages/plugins/did-web-plugin +COPY packages/plugins/dynamic-loader packages/plugins/dynamic-loader +COPY packages/plugins/encryption packages/plugins/encryption +COPY packages/plugins/ethereum packages/plugins/ethereum +COPY packages/plugins/expiration packages/plugins/expiration +COPY packages/plugins/learn-card packages/plugins/learn-card +COPY packages/plugins/learn-card-network packages/plugins/learn-card-network +COPY packages/plugins/linked-claims packages/plugins/linked-claims +COPY packages/plugins/learn-cloud packages/plugins/learn-cloud +COPY packages/plugins/vc packages/plugins/vc +COPY packages/plugins/vc-api packages/plugins/vc-api +COPY packages/plugins/vc-templates packages/plugins/vc-templates +COPY packages/plugins/vpqr packages/plugins/vpqr + +RUN rm -rf node_modules/.cache/nx + +RUN pnpm exec nx build:docker lca-api-service + # Expose common ports used by server EXPOSE 3000 EXPOSE 4200 diff --git a/services/learn-card-network/lca-api/esbuild-docker.mjs b/services/learn-card-network/lca-api/esbuild-docker.mjs index 17be27a7e5..a270a92b61 100644 --- a/services/learn-card-network/lca-api/esbuild-docker.mjs +++ b/services/learn-card-network/lca-api/esbuild-docker.mjs @@ -12,7 +12,7 @@ const finalBuildObj = { format: 'cjs', outdir: 'dist', target: 'node18', - external: ['snappy', '@learncard/didkit-plugin/dist/didkit_wasm_bg.wasm', '@learncard/didkit-plugin-node', '@learncard/didkit-plugin', 'p-limit'], + external: ['snappy', '@learncard/didkit-plugin/dist/didkit_wasm_bg.wasm', 'p-limit'], plugins, minify: true, }; diff --git a/services/learn-card-network/lca-api/nodemon.docker.json b/services/learn-card-network/lca-api/nodemon.docker.json deleted file mode 100644 index 4c79da5d03..0000000000 --- a/services/learn-card-network/lca-api/nodemon.docker.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "watch": [ - "src", - "../../../packages/learn-card-types/dist", - "../../../packages/learn-card-core/dist", - "../../../packages/learn-card-init/dist", - "../../../packages/plugins/didkit/dist", - "../../../packages/plugins/did-web-plugin/dist" - ], - "ext": "ts,js,cjs,mjs,json", - "ignore": ["**/*.d.ts", "**/node_modules/**", "**/coverage/**", "**/*.test.ts", "**/*.spec.ts"], - "exec": "pnpm build:docker && node dist/docker-entry.js", - "delay": "500", - "verbose": true -} diff --git a/services/learn-card-network/lca-api/package.json b/services/learn-card-network/lca-api/package.json index 24b17aeda1..2caa330ae6 100644 --- a/services/learn-card-network/lca-api/package.json +++ b/services/learn-card-network/lca-api/package.json @@ -1,6 +1,6 @@ { "name": "@learncard/lca-api-service", - "version": "1.1.9", + "version": "1.1.6", "description": "", "main": "dist/index.js", "types": "dist/index.d.ts", @@ -11,10 +11,7 @@ "start": "PORT=3000 serverless offline --httpPort 3000 --websocketPort 3001 --lambdaPort 3002 --albPort 3003 --config serverless-local.yml", "start-p-4000": "PORT=4000 serverless offline --httpPort 4000 --websocketPort 4001 --lambdaPort 4002 --albPort 4003 --config serverless-local.yml", "start-p-5000": "PORT=5000 serverless offline --httpPort 5000 --websocketPort 5001 --lambdaPort 5002 --albPort 5003 --config serverless-local.yml", - "dev": "nodemon --config nodemon.docker.json", - "dev:legacy": "nodemon --watch src -e ts,js --ignore \"**/*.d.ts\" --exec \"pnpm build:docker && node dist/docker-entry.js\"", - "dev:docker": "nodemon --watch src --watch ../../../packages/plugins --watch ../../../packages/learn-card-core --watch ../../../packages/learn-card-types --watch ../../../packages/learn-card-helpers -e ts,js --ignore \"../../**/*.d.ts\" --exec \"pnpm exec nx start:docker lca-api-service\"", - "start:docker": "pnpm build:docker && node dist/docker-entry.js", + "dev": "nodemon --watch src -e ts,js --ignore \"../../**/*.d.ts\" --exec \"pnpm build:docker && node dist/docker-entry.js\"", "serverless-deploy": "serverless deploy", "serverless-deploy-scouts": "serverless deploy --config serverless-scouts.yml" }, @@ -34,19 +31,18 @@ "serverless": "3.40.0", "serverless-certificate-creator": "^1.6.0", "serverless-domain-manager": "^6.4.4", - "serverless-esbuild": "1.55.0", - "serverless-http": "3.2.0", - "serverless-offline": "^14.4.0", + "serverless-esbuild": "^1.41.0", + "serverless-http": "^3.1.1", + "serverless-offline": "^12.0.4", "serverless-prune-plugin": "^2.1.0", "shx": "^0.3.4" }, "dependencies": { - "@fastify/cors": "^11.2.0", - "@fastify/static": "^9.0.0", + "@fastify/cors": "^9.0.1", + "@fastify/static": "^7.0.4", "@learncard/core": "workspace:*", "@learncard/did-web-plugin": "workspace:*", "@learncard/didkit-plugin": "workspace:*", - "@learncard/didkit-plugin-node": "workspace:*", "@learncard/init": "workspace:*", "@learncard/types": "workspace:*", "@sentry/esbuild-plugin": "^2.5.0", @@ -58,7 +54,7 @@ "axios": "^0.27.2", "dotenv": "^16.0.3", "express": "^4.18.2", - "fastify": "^5.7.2", + "fastify": "^4.28.1", "filestack-js": "^3.24.0", "firebase-admin": "13.4.0", "ioredis": "^5.2.2", diff --git a/services/learn-card-network/lca-api/project.json b/services/learn-card-network/lca-api/project.json index fc1c770e35..edb0847c64 100644 --- a/services/learn-card-network/lca-api/project.json +++ b/services/learn-card-network/lca-api/project.json @@ -27,14 +27,6 @@ "script": "build:docker" } }, - "start:docker": { - "executor": "nx:run-script", - "inputs": ["source"], - "dependsOn": ["^build"], - "options": { - "script": "start:docker" - } - }, "serverless-deploy": { "executor": "nx:run-script", "inputs": ["source"], diff --git a/services/learn-card-network/lca-api/serverless.yml b/services/learn-card-network/lca-api/serverless.yml index a152bfc253..5ca93cc7d2 100644 --- a/services/learn-card-network/lca-api/serverless.yml +++ b/services/learn-card-network/lca-api/serverless.yml @@ -23,12 +23,7 @@ custom: plugins: esbuildPlugins.cjs bundle: true minify: true - external: - [ - 'snappy', - '@learncard/didkit-plugin/dist/didkit_wasm_bg.wasm', - '@learncard/didkit-plugin-node/*.node', - ] + external: ['snappy', '@learncard/didkit-plugin/dist/didkit_wasm_bg.wasm'] sourcemap: external target: 'node20' watch: @@ -81,9 +76,6 @@ package: patterns: - '!node_modules/**' - 'node_modules/@learncard/didkit-plugin/dist/didkit_wasm_bg.wasm' - - 'node_modules/@learncard/didkit-plugin-node/*.node' - - 'node_modules/@learncard/didkit-plugin-node/package.json' - - 'node_modules/@learncard/didkit-plugin-node/dist/**' - 'src/swagger-ui' provider: diff --git a/services/learn-card-network/lca-api/src/helpers/learnCard.helpers.ts b/services/learn-card-network/lca-api/src/helpers/learnCard.helpers.ts index 2ac060ee47..91b90ec351 100644 --- a/services/learn-card-network/lca-api/src/helpers/learnCard.helpers.ts +++ b/services/learn-card-network/lca-api/src/helpers/learnCard.helpers.ts @@ -1,8 +1,10 @@ import { readFile } from 'node:fs/promises'; - -import { initLearnCard } from '@learncard/init'; -import type { EmptyLearnCard, LearnCardFromSeed, DidWebLearnCardFromSeed } from '@learncard/init'; - +import { + initLearnCard, + EmptyLearnCard, + LearnCardFromSeed, + DidWebLearnCardFromSeed, +} from '@learncard/init'; import { getSigningAuthorityForDid } from '@accesslayer/signing-authority/read'; import { getLRUCache } from '@cache/in-memory-lru'; @@ -19,54 +21,12 @@ const saCardsCache = getLRUCache< const didWebCardsCache = getLRUCache(); const ephemeralCardsCache = getLRUCache(); -// Try native plugin first, fall back to WASM -let didKitInitPromise: Promise<'node' | Buffer> | null = null; - -const resolveDidKitPluginFactory = ( - module: Record -): (() => Promise) => { - const factory = - (module as { getDidKitPlugin?: unknown }).getDidKitPlugin ?? - (module as { default?: { getDidKitPlugin?: unknown } }).default?.getDidKitPlugin; - - if (typeof factory !== 'function') { - throw new Error('DIDKit plugin factory not found in module exports'); - } - - return factory as () => Promise; -}; - -const getDidKitInit = async (): Promise<'node' | Buffer> => { - if (didKitInitPromise) return didKitInitPromise; - - didKitInitPromise = (async () => { - try { - // Check if native plugin is available by trying to load it - const didkitModule = await import('@learncard/didkit-plugin-node'); - const getNativePlugin = resolveDidKitPluginFactory(didkitModule); - - // Test that it actually works - await getNativePlugin(); - return 'node' as const; - } catch (e) { - console.log('Native DIDKit plugin not available, falling back to WASM'); - - // Return the WASM buffer for initLearnCard to use - const wasmBuffer = await readFile( - require.resolve('@learncard/didkit-plugin/dist/didkit_wasm_bg.wasm') - ); - - return wasmBuffer; - } - })(); - - return didKitInitPromise; -}; +const didkit = readFile(require.resolve('@learncard/didkit-plugin/dist/didkit_wasm_bg.wasm')); export const getEmptyLearnCard = async (): Promise => { if (!emptyLearnCard) emptyLearnCard = await initLearnCard({ - didkit: await getDidKitInit(), + didkit: await didkit, }); return emptyLearnCard; @@ -79,7 +39,7 @@ export const getLearnCard = async (): Promise if (!learnCard) learnCard = await initLearnCard({ - didkit: await getDidKitInit(), + didkit: await didkit, seed, cloud, }); @@ -95,22 +55,22 @@ export const getSigningAuthorityLearnCard = async ( if (!seed) throw new Error('No seed set for SA!'); - const cachedValue = saCardsCache.get(seed); + let cachedValue = saCardsCache.get(seed); if (cachedValue) return cachedValue; const saLearnCard = ownerDID.startsWith('did:web:') ? await initLearnCard({ - didkit: await getDidKitInit(), - seed, - didWeb: ownerDID, - cloud, - }) + didkit: await didkit, + seed, + didWeb: ownerDID, + cloud, + }) : await initLearnCard({ - didkit: await getDidKitInit(), - seed, - cloud, - }); + didkit: await didkit, + seed, + cloud, + }); saCardsCache.add(seed, saLearnCard); @@ -130,6 +90,7 @@ export const getDidWebLearnCard = async ( seed?: string, didWeb?: string ): Promise => { + const _seed = seed || process.env.SEED; const _didWeb = didWeb || getServerDidWebDID(); if (!_seed) throw new Error('No seed set!'); @@ -140,7 +101,7 @@ export const getDidWebLearnCard = async ( if (cachedValue) return cachedValue; const didWebLearnCard = await initLearnCard({ - didkit: await getDidKitInit(), + didkit: await didkit, seed: _seed, didWeb: _didWeb, cloud, @@ -159,7 +120,7 @@ export const getEphemeralLearnCard = async ( if (cachedValue) return cachedValue; const ephemeralLearnCard = await initLearnCard({ - didkit: await getDidKitInit(), + didkit: await didkit, seed, cloud, }); diff --git a/services/learn-card-network/lca-api/src/routes/ai.ts b/services/learn-card-network/lca-api/src/routes/ai.ts index 6b598c6f72..ffe0e3ce9f 100644 --- a/services/learn-card-network/lca-api/src/routes/ai.ts +++ b/services/learn-card-network/lca-api/src/routes/ai.ts @@ -200,7 +200,6 @@ export const aiRouter = t.router({ const { user: { did }, } = ctx; - if (!openai) { throw new TRPCError({ code: 'INTERNAL_SERVER_ERROR', @@ -225,40 +224,24 @@ Rules: // TODO switch to gpt 5 and use responses API // will have to bump the openai package - let completion: any; - try { - completion = await openai.chat.completions.create({ - model: 'gpt-4o-2024-08-06', - messages: [ - { - role: 'system', - content: systemPrompt, - }, - { role: 'user', content: userContent }, - ], - // Use the object-wrapped list schema for structured outputs - // currently breaks because response is wrapped in a code fence (```json ... ```) - // likely would need to to bump openai package version - // response_format: zodResponseFormat(IconListContainerValidator, 'icons'), - response_format: { type: 'json_object' }, - user: did, - }); - } catch (error) { - console.error('šŸ”„šŸ”„šŸ”„šŸ”„šŸ”„šŸ”„šŸ”„šŸ”„šŸ”„'); - console.error('error:', error); - } + const completion = await openai.chat.completions.create({ + model: 'gpt-4o-2024-08-06', + messages: [ + { + role: 'system', + content: systemPrompt, + }, + { role: 'user', content: userContent }, + ], + // Use the object-wrapped list schema for structured outputs + response_format: zodResponseFormat(IconListContainerValidator, 'icons'), + user: did, + }); - const content = completion.choices[0]?.message.content ?? ''; + const response = JSON.parse(completion.choices[0]?.message.content ?? ''); - const response = JSON.parse(content); // First, validate the model output with the object-wrapped list schema const parsed = await IconListContainerValidator.parseAsync(response); - if (!parsed) { - throw new TRPCError({ - code: 'INTERNAL_SERVER_ERROR', - message: 'No parsed structured output returned.', - }); - } // Transform into a record mapping input names to icons const record: Record = {}; diff --git a/services/learn-card-network/lca-api/src/routes/credentials.ts b/services/learn-card-network/lca-api/src/routes/credentials.ts index 3fffe27d63..bd4e06a28b 100644 --- a/services/learn-card-network/lca-api/src/routes/credentials.ts +++ b/services/learn-card-network/lca-api/src/routes/credentials.ts @@ -61,28 +61,10 @@ export const credentialsRouter = t.router({ }); if (encryption) { - console.log('!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'); - console.log('!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'); - console.log('!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'); - console.log('!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'); - console.log('!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'); - console.log('!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'); - console.log('!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'); - console.log('recipients', [learnCard.id.did(), ...encryption.recipients]); - console.log('!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'); - console.log('!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'); - console.log('!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'); - console.log('!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'); - console.log('!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'); - console.log('!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'); - console.log('!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'); - console.log('!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'); - console.log('!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'); const jwe = await learnCard.invoke.createDagJwe(issuedCredential, [ learnCard.id.did(), ...encryption.recipients, ]); - console.log('jwe', JSON.stringify(jwe)); return jwe; } diff --git a/services/learn-card-network/learn-cloud-service/.dockerignore b/services/learn-card-network/learn-cloud-service/.dockerignore deleted file mode 100644 index 3ab08dde63..0000000000 --- a/services/learn-card-network/learn-cloud-service/.dockerignore +++ /dev/null @@ -1,6 +0,0 @@ -# Exclude Rust build artifacts to save space -lib/didkit/target -lib/ssi/target -node_modules -*.log -.git diff --git a/services/learn-card-network/learn-cloud-service/.npmrc b/services/learn-card-network/learn-cloud-service/.npmrc deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/services/learn-card-network/learn-cloud-service/CHANGELOG.md b/services/learn-card-network/learn-cloud-service/CHANGELOG.md index dc345d67f3..3af806ee24 100644 --- a/services/learn-card-network/learn-cloud-service/CHANGELOG.md +++ b/services/learn-card-network/learn-cloud-service/CHANGELOG.md @@ -1,51 +1,5 @@ # @learncard/network-brain-service -## 2.5.0 - -### Minor Changes - -- [#936](https://github.com/learningeconomy/LearnCard/pull/936) [`7e30fc7116411ba19a4889cfbf9fc71dd725c309`](https://github.com/learningeconomy/LearnCard/commit/7e30fc7116411ba19a4889cfbf9fc71dd725c309) Thanks [@TaylorBeeston](https://github.com/TaylorBeeston)! - ## New Native DIDKit Plugin (`@learncard/didkit-plugin-node`) - - Adds a high-performance native Node.js DIDKit plugin using Rust and N-API, providing **~18x faster cold starts** compared to the WASM version. - - ### Key Features - - - **Native Performance**: Eliminates WASM compilation overhead on cold starts (~1100ms → ~60ms) - - **Cross-Platform Binaries**: Prebuilt for Linux (x64/arm64, glibc/musl), macOS (x64/arm64), and Windows (x64) - - **Drop-in Replacement**: API-compatible with `@learncard/didkit-plugin` - - **JWE Support**: Full JWE and DAG-JWE encryption/decryption - - **Async Operations**: All crypto operations run on separate thread pool, non-blocking - - ### Usage - - ```typescript - import { initLearnCard } from '@learncard/init'; - - // Use native plugin instead of WASM - const learnCard = await initLearnCard({ - seed: 'your-seed', - didkit: 'node', // <-- new option - }); - ``` - - ### When to Use - - - āœ… Serverless functions (AWS Lambda, Vercel) - - āœ… Node.js servers (Express, Fastify, NestJS) - - āœ… CLI tools and scripts - - āœ… High-throughput credential processing - - ### Service Updates - - All LearnCard Network services (brain-service, learn-cloud-service, simple-signing-service) now use the native plugin in Docker/Lambda environments for improved cold start performance. - -### Patch Changes - -- Updated dependencies [[`7e30fc7116411ba19a4889cfbf9fc71dd725c309`](https://github.com/learningeconomy/LearnCard/commit/7e30fc7116411ba19a4889cfbf9fc71dd725c309)]: - - @learncard/didkit-plugin-node@0.2.0 - - @learncard/didkit-plugin@1.7.0 - - @learncard/vc-plugin@1.4.0 - ## 2.4.6 ### Patch Changes diff --git a/services/learn-card-network/learn-cloud-service/Dockerfile b/services/learn-card-network/learn-cloud-service/Dockerfile index f7d5db5f04..715bdca5de 100644 --- a/services/learn-card-network/learn-cloud-service/Dockerfile +++ b/services/learn-card-network/learn-cloud-service/Dockerfile @@ -1,27 +1,23 @@ -# Using bullseye (Debian 11) to avoid native module build issues on Debian 12 -FROM node:20.10.0-bullseye-slim - -# Skip native DIDKit build (uses WASM fallback) -ENV SKIP_DIDKIT_NAPI=1 +FROM node:20.10.0-slim +# Set working directory to /app WORKDIR /app -# Install build dependencies and pnpm in one layer -RUN apt-get update && apt-get install -y --no-install-recommends \ +# Sometimes we need python to build packages +RUN apt-get update || : && apt-get install -y \ python3 \ - build-essential \ - && rm -rf /var/lib/apt/lists/* \ - && npm install -g pnpm + build-essential + +# Install PNPM package manager +RUN npm install -g pnpm # Copy everything over from the source directory to the build directory COPY package.json pnpm-lock.yaml pnpm-workspace.yaml nx.json tsconfig.json .npmrc ./ -COPY lib lib COPY packages/learn-card-core packages/learn-card-core COPY packages/plugins/crypto packages/plugins/crypto COPY packages/plugins/did-web-plugin packages/plugins/did-web-plugin COPY packages/plugins/didkey packages/plugins/didkey COPY packages/plugins/didkit packages/plugins/didkit -COPY packages/plugins/didkit-plugin-node packages/plugins/didkit-plugin-node COPY packages/plugins/encryption packages/plugins/encryption COPY packages/plugins/expiration packages/plugins/expiration COPY packages/learn-card-helpers packages/learn-card-helpers @@ -32,6 +28,7 @@ COPY packages/plugins/vc-templates packages/plugins/vc-templates COPY tools/executors/workspace/run-command tools/executors/workspace/run-command COPY services/learn-card-network/learn-cloud-service services/learn-card-network/learn-cloud-service +# Install dependencies - Install inside container ensures parity on all machines RUN pnpm install --no-frozen-lockfile RUN pnpm exec nx build:docker learn-cloud-service diff --git a/services/learn-card-network/learn-cloud-service/Dockerfile.local b/services/learn-card-network/learn-cloud-service/Dockerfile.local index 9b2a9e1be9..0b0ddab299 100644 --- a/services/learn-card-network/learn-cloud-service/Dockerfile.local +++ b/services/learn-card-network/learn-cloud-service/Dockerfile.local @@ -1,15 +1,37 @@ -ARG BASE_IMAGE=learncard-monorepo-local - -FROM ${BASE_IMAGE} - -# Skip native DIDKit build (local dev uses WASM fallback) -ENV SKIP_DIDKIT_NAPI=1 +FROM node:20.10.0-slim +# Set working directory to /app WORKDIR /app -# Install build dependencies and pnpm in one layer +# Sometimes we need python to build packages +RUN apt-get update || : && apt-get install -y \ + python3 \ + build-essential + +# Install PNPM package manager +RUN npm install -g pnpm # Copy everything over from the source directory to the build directory +COPY package.json pnpm-lock.yaml pnpm-workspace.yaml nx.json tsconfig.json .npmrc ./ +COPY packages/learn-card-core packages/learn-card-core +COPY packages/plugins/crypto packages/plugins/crypto +COPY packages/plugins/did-web-plugin packages/plugins/did-web-plugin +COPY packages/plugins/didkey packages/plugins/didkey +COPY packages/plugins/didkit packages/plugins/didkit +COPY packages/plugins/encryption packages/plugins/encryption +COPY packages/plugins/expiration packages/plugins/expiration +COPY packages/learn-card-helpers packages/learn-card-helpers +COPY packages/plugins/learn-card packages/plugins/learn-card +COPY packages/learn-card-types packages/learn-card-types +COPY packages/plugins/vc packages/plugins/vc +COPY packages/plugins/vc-templates packages/plugins/vc-templates +COPY tools/executors/workspace/run-command tools/executors/workspace/run-command +COPY services/learn-card-network/learn-cloud-service services/learn-card-network/learn-cloud-service + +# Install dependencies - Install inside container ensures parity on all machines +RUN pnpm install --no-frozen-lockfile + +RUN pnpm exec nx build:docker learn-cloud-service # Expose common ports used by server EXPOSE 3000 diff --git a/services/learn-card-network/learn-cloud-service/esbuild-docker.mjs b/services/learn-card-network/learn-cloud-service/esbuild-docker.mjs index 3267b0d7f9..a0f3009391 100644 --- a/services/learn-card-network/learn-cloud-service/esbuild-docker.mjs +++ b/services/learn-card-network/learn-cloud-service/esbuild-docker.mjs @@ -12,7 +12,7 @@ const finalBuildObj = { format: 'cjs', outdir: 'dist', target: 'node18', - external: ['@learncard/didkit-plugin-node', '@learncard/didkit-plugin', 'p-limit'], + external: ['@learncard/didkit-plugin/dist/didkit_wasm_bg.wasm', 'p-limit'], plugins, minify: true, }; diff --git a/services/learn-card-network/learn-cloud-service/nodemon.docker.json b/services/learn-card-network/learn-cloud-service/nodemon.docker.json deleted file mode 100644 index 8767206595..0000000000 --- a/services/learn-card-network/learn-cloud-service/nodemon.docker.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "watch": [ - "src", - "../../../packages/learn-card-types/dist", - "../../../packages/learn-card-helpers/dist", - "../../../packages/learn-card-core/dist", - "../../../packages/plugins/crypto/dist", - "../../../packages/plugins/didkey/dist", - "../../../packages/plugins/didkit/dist", - "../../../packages/plugins/didkit-plugin-node/dist", - "../../../packages/plugins/did-web-plugin/dist", - "../../../packages/plugins/encryption/dist", - "../../../packages/plugins/expiration/dist", - "../../../packages/plugins/learn-card/dist", - "../../../packages/plugins/vc/dist", - "../../../packages/plugins/vc-templates/dist" - ], - "ext": "ts,js,cjs,mjs,json", - "ignore": ["**/*.d.ts", "**/node_modules/**", "**/coverage/**", "**/*.test.ts", "**/*.spec.ts"], - "exec": "pnpm build:docker && node dist/docker-entry.js", - "delay": "500", - "verbose": true -} diff --git a/services/learn-card-network/learn-cloud-service/package.json b/services/learn-card-network/learn-cloud-service/package.json index d824927a39..d289288fe8 100644 --- a/services/learn-card-network/learn-cloud-service/package.json +++ b/services/learn-card-network/learn-cloud-service/package.json @@ -1,6 +1,6 @@ { "name": "@learncard/learn-cloud-service", - "version": "2.5.0", + "version": "2.4.6", "description": "", "main": "dist/index.js", "types": "dist/index.d.ts", @@ -11,10 +11,7 @@ "start": "PORT=3000 serverless offline --httpPort 3000 --websocketPort 3001 --lambdaPort 3002 --albPort 3003 --config serverless-local.yml", "start-p-4000": "PORT=4000 serverless offline --httpPort 4000 --websocketPort 4001 --lambdaPort 4002 --albPort 4003 --config serverless-local.yml", "start-p-5000": "PORT=5000 serverless offline --httpPort 5000 --websocketPort 5001 --lambdaPort 5002 --albPort 5003 --config serverless-local.yml", - "dev": "nodemon --config nodemon.docker.json", - "dev:legacy": "nodemon --watch src --watch ../../../packages/plugins/*/dist --watch ../../../packages/learn-card-core/dist --watch ../../../packages/learn-card-types/dist --watch ../../../packages/learn-card-helpers/dist -e ts,js,cjs,mjs --ignore \"**/*.d.ts\" --exec \"pnpm build:docker && node dist/docker-entry.js\"", - "dev:docker": "nodemon --watch src --watch ../../../packages/plugins --watch ../../../packages/learn-card-core --watch ../../../packages/learn-card-types --watch ../../../packages/learn-card-helpers -e ts,js --ignore \"../../**/*.d.ts\" --exec \"pnpm exec nx start:docker learn-cloud-service\"", - "start:docker": "pnpm build:docker && node dist/docker-entry.js", + "dev": "nodemon --watch src --watch ../../../packages/plugins --watch ../../../packages/learn-card-core --watch ../../../packages/learn-card-types --watch ../../../packages/learn-card-helpers -e ts,js --ignore \"../../**/*.d.ts\" --exec \"pnpm build:docker && node dist/docker-entry.js\"", "serverless-deploy": "serverless deploy" }, "keywords": [], @@ -48,14 +45,13 @@ "testcontainers": "^9.1.1" }, "dependencies": { - "@fastify/cors": "^11.2.0", - "@fastify/static": "^9.0.0", + "@fastify/cors": "^9.0.1", + "@fastify/static": "^7.0.4", "@learncard/core": "workspace:*", "@learncard/crypto-plugin": "workspace:*", "@learncard/did-web-plugin": "workspace:*", "@learncard/didkey-plugin": "workspace:*", "@learncard/didkit-plugin": "workspace:^", - "@learncard/didkit-plugin-node": "workspace:*", "@learncard/encryption-plugin": "workspace:*", "@learncard/expiration-plugin": "workspace:*", "@learncard/helpers": "workspace:*", @@ -73,7 +69,7 @@ "cors": "^2.8.5", "dotenv": "^16.0.3", "express": "^4.18.2", - "fastify": "^5.7.2", + "fastify": "^4.28.1", "ioredis": "^5.2.2", "ioredis-mock": "^8.2.2", "json-stringify-deterministic": "^1.0.8", diff --git a/services/learn-card-network/learn-cloud-service/project.json b/services/learn-card-network/learn-cloud-service/project.json index 11538919d3..68d9cb5e58 100644 --- a/services/learn-card-network/learn-cloud-service/project.json +++ b/services/learn-card-network/learn-cloud-service/project.json @@ -20,45 +20,56 @@ "nx-run-command" ], "namedInputs": { - "source": ["{projectRoot}/src/**/*"], - "tests": ["{projectRoot}/test/**/*"], - "dist": ["{projectRoot}/dist/**/*"] + "source": [ + "{projectRoot}/src/**/*" + ], + "tests": [ + "{projectRoot}/test/**/*" + ], + "dist": [ + "{projectRoot}/dist/**/*" + ] }, "targets": { "serverless-deploy": { "executor": "nx:run-script", - "inputs": ["source"], - "dependsOn": ["^build"], + "inputs": [ + "source" + ], + "dependsOn": [ + "^build" + ], "options": { "script": "serverless-deploy" } }, "build": { "executor": "nx:run-script", - "inputs": ["source"], + "inputs": [ + "source" + ], "options": { "script": "build" } }, "build:docker": { "executor": "nx:run-script", - "inputs": ["source"], - "dependsOn": ["^build"], + "inputs": [ + "source" + ], + "dependsOn": [ + "^build" + ], "options": { "script": "build:docker" } }, - "start:docker": { - "executor": "nx:run-script", - "inputs": ["source"], - "dependsOn": ["^build"], - "options": { - "script": "start:docker" - } - }, "test": { "executor": "nx:run-script", - "inputs": ["source", "tests"], + "inputs": [ + "source", + "tests" + ], "options": { "script": "test" } diff --git a/services/learn-card-network/learn-cloud-service/serverless.yml b/services/learn-card-network/learn-cloud-service/serverless.yml index 4eee6d6a00..05a31910b6 100644 --- a/services/learn-card-network/learn-cloud-service/serverless.yml +++ b/services/learn-card-network/learn-cloud-service/serverless.yml @@ -23,7 +23,7 @@ custom: plugins: esbuildPlugins.cjs bundle: true # minify: true - external: ['@learncard/didkit-plugin/dist/didkit_wasm_bg.wasm', '*.node'] + external: ['@learncard/didkit-plugin/dist/didkit_wasm_bg.wasm'] sourcemap: external target: 'node16' watch: @@ -79,9 +79,6 @@ package: patterns: - '!node_modules/**' - 'node_modules/@learncard/didkit-plugin/dist/didkit_wasm_bg.wasm' - - 'node_modules/@learncard/didkit-plugin-node/*.node' - - 'node_modules/@learncard/didkit-plugin-node/package.json' - - 'node_modules/@learncard/didkit-plugin-node/dist/**' provider: name: aws diff --git a/services/learn-card-network/learn-cloud-service/src/helpers/learnCard.helpers.ts b/services/learn-card-network/learn-cloud-service/src/helpers/learnCard.helpers.ts index 7cc2c82b0d..c8cf31e21f 100644 --- a/services/learn-card-network/learn-cloud-service/src/helpers/learnCard.helpers.ts +++ b/services/learn-card-network/learn-cloud-service/src/helpers/learnCard.helpers.ts @@ -1,65 +1,17 @@ import { readFile } from 'node:fs/promises'; -import { generateLearnCard } from '@learncard/core'; -import type { LearnCard } from '@learncard/core'; -import { CryptoPlugin } from '@learncard/crypto-plugin'; -import type { CryptoPluginType } from '@learncard/crypto-plugin'; -import type { DIDKitPlugin, DidMethod } from '@learncard/didkit-plugin'; -import { getEncryptionPlugin } from '@learncard/encryption-plugin'; -import type { EncryptionPluginType } from '@learncard/encryption-plugin'; -import { getDidKeyPlugin } from '@learncard/didkey-plugin'; -import type { DidKeyPlugin } from '@learncard/didkey-plugin'; -import { getVCPlugin } from '@learncard/vc-plugin'; -import type { VCPlugin } from '@learncard/vc-plugin'; -import { getVCTemplatesPlugin } from '@learncard/vc-templates-plugin'; -import type { VCTemplatePlugin } from '@learncard/vc-templates-plugin'; -import { expirationPlugin } from '@learncard/expiration-plugin'; -import type { ExpirationPlugin } from '@learncard/expiration-plugin'; -import { getLearnCardPlugin } from '@learncard/learn-card-plugin'; -import type { LearnCardPlugin } from '@learncard/learn-card-plugin'; +import { generateLearnCard, LearnCard } from '@learncard/core'; +import { CryptoPlugin, CryptoPluginType } from '@learncard/crypto-plugin'; +import { DIDKitPlugin, DidMethod, getDidKitPlugin } from '@learncard/didkit-plugin'; +import { EncryptionPluginType, getEncryptionPlugin } from '@learncard/encryption-plugin'; +import { DidKeyPlugin, getDidKeyPlugin } from '@learncard/didkey-plugin'; +import { VCPlugin, getVCPlugin } from '@learncard/vc-plugin'; +import { VCTemplatePlugin, getVCTemplatesPlugin } from '@learncard/vc-templates-plugin'; +import { ExpirationPlugin, expirationPlugin } from '@learncard/expiration-plugin'; +import { LearnCardPlugin, getLearnCardPlugin } from '@learncard/learn-card-plugin'; import { isTest } from './test.helpers'; -// Try native plugin first, fall back to WASM -let didKitPluginPromise: Promise | null = null; - -const resolveDidKitPluginFactory = ( - module: Record -): ((input?: unknown, allowRemoteContexts?: boolean) => Promise) => { - const factory = - (module as { getDidKitPlugin?: unknown }).getDidKitPlugin ?? - (module as { default?: { getDidKitPlugin?: unknown } }).default?.getDidKitPlugin; - - if (typeof factory !== 'function') { - throw new Error('DIDKit plugin factory not found in module exports'); - } - - return factory as (input?: unknown, allowRemoteContexts?: boolean) => Promise; -}; - -const getDidKitPlugin = async (): Promise => { - if (didKitPluginPromise) return didKitPluginPromise; - - didKitPluginPromise = (async () => { - try { - const didkitModule = await import('@learncard/didkit-plugin-node'); - const getNativePlugin = resolveDidKitPluginFactory(didkitModule); - return await getNativePlugin(); - } catch (e) { - console.log('Native DIDKit plugin not available, falling back to WASM'); - - const didkitModule = await import('@learncard/didkit-plugin'); - const getWasmPlugin = resolveDidKitPluginFactory(didkitModule); - - const wasmBuffer = await readFile( - require.resolve('@learncard/didkit-plugin/dist/didkit_wasm_bg.wasm') - ); - - return await getWasmPlugin(wasmBuffer); - } - })(); - - return didKitPluginPromise; -}; +const didkit = readFile(require.resolve('@learncard/didkit-plugin/dist/didkit_wasm_bg.wasm')); export type EmptyLearnCard = LearnCard< [CryptoPluginType, DIDKitPlugin, ExpirationPlugin, VCTemplatePlugin, LearnCardPlugin] @@ -80,13 +32,13 @@ export type SeedLearnCard = LearnCard< let emptyLearnCard: EmptyLearnCard; -const learnCards: Record = {}; +let learnCards: Record = {}; export const getEmptyLearnCard = async (): Promise => { if (!emptyLearnCard) { const cryptoLc = await (await generateLearnCard()).addPlugin(CryptoPlugin); - const didkitLc = await cryptoLc.addPlugin(await getDidKitPlugin()); + const didkitLc = await cryptoLc.addPlugin(await getDidKitPlugin(await didkit)); const expirationLc = await didkitLc.addPlugin(expirationPlugin(didkitLc)); @@ -106,7 +58,7 @@ export const getLearnCard = async ( if (!learnCards[seed]) { const cryptoLc = await (await generateLearnCard()).addPlugin(CryptoPlugin); - const didkitLc = await cryptoLc.addPlugin(await getDidKitPlugin()); + const didkitLc = await cryptoLc.addPlugin(await getDidKitPlugin(await didkit)); const didkeyLc = await didkitLc.addPlugin( await getDidKeyPlugin(didkitLc, seed, 'key') @@ -123,11 +75,5 @@ export const getLearnCard = async ( learnCards[seed] = await expirationLc.addPlugin(getLearnCardPlugin(expirationLc)); } - const learnCard = learnCards[seed]; - - if (!learnCard) { - throw new Error('LearnCard not initialized'); - } - - return learnCard; + return learnCards[seed]!; }; diff --git a/services/learn-card-network/simple-signing-service/.dockerignore b/services/learn-card-network/simple-signing-service/.dockerignore deleted file mode 100644 index 3ab08dde63..0000000000 --- a/services/learn-card-network/simple-signing-service/.dockerignore +++ /dev/null @@ -1,6 +0,0 @@ -# Exclude Rust build artifacts to save space -lib/didkit/target -lib/ssi/target -node_modules -*.log -.git diff --git a/services/learn-card-network/simple-signing-service/.npmrc b/services/learn-card-network/simple-signing-service/.npmrc deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/services/learn-card-network/simple-signing-service/CHANGELOG.md b/services/learn-card-network/simple-signing-service/CHANGELOG.md index eb56f6cb49..6462fe92df 100644 --- a/services/learn-card-network/simple-signing-service/CHANGELOG.md +++ b/services/learn-card-network/simple-signing-service/CHANGELOG.md @@ -1,50 +1,5 @@ # @welibraryos/lca-api-service -## 1.2.0 - -### Minor Changes - -- [#936](https://github.com/learningeconomy/LearnCard/pull/936) [`7e30fc7116411ba19a4889cfbf9fc71dd725c309`](https://github.com/learningeconomy/LearnCard/commit/7e30fc7116411ba19a4889cfbf9fc71dd725c309) Thanks [@TaylorBeeston](https://github.com/TaylorBeeston)! - ## New Native DIDKit Plugin (`@learncard/didkit-plugin-node`) - - Adds a high-performance native Node.js DIDKit plugin using Rust and N-API, providing **~18x faster cold starts** compared to the WASM version. - - ### Key Features - - - **Native Performance**: Eliminates WASM compilation overhead on cold starts (~1100ms → ~60ms) - - **Cross-Platform Binaries**: Prebuilt for Linux (x64/arm64, glibc/musl), macOS (x64/arm64), and Windows (x64) - - **Drop-in Replacement**: API-compatible with `@learncard/didkit-plugin` - - **JWE Support**: Full JWE and DAG-JWE encryption/decryption - - **Async Operations**: All crypto operations run on separate thread pool, non-blocking - - ### Usage - - ```typescript - import { initLearnCard } from '@learncard/init'; - - // Use native plugin instead of WASM - const learnCard = await initLearnCard({ - seed: 'your-seed', - didkit: 'node', // <-- new option - }); - ``` - - ### When to Use - - - āœ… Serverless functions (AWS Lambda, Vercel) - - āœ… Node.js servers (Express, Fastify, NestJS) - - āœ… CLI tools and scripts - - āœ… High-throughput credential processing - - ### Service Updates - - All LearnCard Network services (brain-service, learn-cloud-service, simple-signing-service) now use the native plugin in Docker/Lambda environments for improved cold start performance. - -### Patch Changes - -- Updated dependencies [[`7e30fc7116411ba19a4889cfbf9fc71dd725c309`](https://github.com/learningeconomy/LearnCard/commit/7e30fc7116411ba19a4889cfbf9fc71dd725c309)]: - - @learncard/didkit-plugin@1.7.0 - - @learncard/vc-plugin@1.4.0 - ## 1.1.4 ### Patch Changes diff --git a/services/learn-card-network/simple-signing-service/Dockerfile b/services/learn-card-network/simple-signing-service/Dockerfile index 53e1049a49..74ebf98a11 100644 --- a/services/learn-card-network/simple-signing-service/Dockerfile +++ b/services/learn-card-network/simple-signing-service/Dockerfile @@ -1,16 +1,15 @@ FROM node:20.10.0-slim -# Skip native DIDKit build (uses WASM fallback) -ENV SKIP_DIDKIT_NAPI=1 - +# Set working directory to /app WORKDIR /app -# Install build dependencies and pnpm in one layer -RUN apt-get update && apt-get install -y --no-install-recommends \ +# Sometimes we need python to build packages +RUN apt-get update || : && apt-get install -y \ python3 \ - build-essential \ - && rm -rf /var/lib/apt/lists/* \ - && npm install -g pnpm + build-essential + +# Install PNPM package manager +RUN npm install -g pnpm # Copy everything over from the source directory to the build directory COPY package.json pnpm-lock.yaml pnpm-workspace.yaml nx.json tsconfig.json .npmrc ./ @@ -18,7 +17,6 @@ COPY packages/learn-card-core packages/learn-card-core COPY packages/plugins/did-web-plugin packages/plugins/did-web-plugin COPY packages/plugins/didkey packages/plugins/didkey COPY packages/plugins/didkit packages/plugins/didkit -COPY packages/plugins/didkit-plugin-node packages/plugins/didkit-plugin-node COPY packages/plugins/expiration packages/plugins/expiration COPY packages/learn-card-helpers packages/learn-card-helpers COPY packages/plugins/learn-card packages/plugins/learn-card @@ -27,6 +25,7 @@ COPY packages/plugins/vc packages/plugins/vc COPY tools/executors/workspace/run-command tools/executors/workspace/run-command COPY services/learn-card-network/simple-signing-service services/learn-card-network/simple-signing-service +# Install dependencies - Install inside container ensures parity on all machines RUN pnpm install --no-frozen-lockfile RUN pnpm exec nx build:docker simple-signing-service diff --git a/services/learn-card-network/simple-signing-service/Dockerfile.local b/services/learn-card-network/simple-signing-service/Dockerfile.local index ad3b76aa61..5cac59332f 100644 --- a/services/learn-card-network/simple-signing-service/Dockerfile.local +++ b/services/learn-card-network/simple-signing-service/Dockerfile.local @@ -1,16 +1,15 @@ FROM node:20.10.0-slim -# Skip native DIDKit build (local dev uses WASM fallback) -ENV SKIP_DIDKIT_NAPI=1 - +# Set working directory to /app WORKDIR /app -# Install build dependencies and pnpm in one layer -RUN apt-get update && apt-get install -y --no-install-recommends \ +# Sometimes we need python to build packages +RUN apt-get update || : && apt-get install -y \ python3 \ - build-essential \ - && rm -rf /var/lib/apt/lists/* \ - && npm install -g pnpm + build-essential + +# Install PNPM package manager +RUN npm install -g pnpm # Copy everything over from the source directory to the build directory COPY package.json pnpm-lock.yaml pnpm-workspace.yaml nx.json tsconfig.json .npmrc ./ @@ -18,7 +17,6 @@ COPY packages/learn-card-core packages/learn-card-core COPY packages/plugins/did-web-plugin packages/plugins/did-web-plugin COPY packages/plugins/didkey packages/plugins/didkey COPY packages/plugins/didkit packages/plugins/didkit -COPY packages/plugins/didkit-plugin-node packages/plugins/didkit-plugin-node COPY packages/plugins/expiration packages/plugins/expiration COPY packages/learn-card-helpers packages/learn-card-helpers COPY packages/plugins/learn-card packages/plugins/learn-card @@ -27,6 +25,7 @@ COPY packages/plugins/vc packages/plugins/vc COPY tools/executors/workspace/run-command tools/executors/workspace/run-command COPY services/learn-card-network/simple-signing-service services/learn-card-network/simple-signing-service +# Install dependencies - Install inside container ensures parity on all machines RUN pnpm install --no-frozen-lockfile RUN pnpm exec nx build:docker simple-signing-service diff --git a/services/learn-card-network/simple-signing-service/esbuild-docker.mjs b/services/learn-card-network/simple-signing-service/esbuild-docker.mjs index 9b64baf6ad..a270a92b61 100644 --- a/services/learn-card-network/simple-signing-service/esbuild-docker.mjs +++ b/services/learn-card-network/simple-signing-service/esbuild-docker.mjs @@ -12,7 +12,7 @@ const finalBuildObj = { format: 'cjs', outdir: 'dist', target: 'node18', - external: ['snappy', '@learncard/didkit-plugin-node', '@learncard/didkit-plugin', 'p-limit'], + external: ['snappy', '@learncard/didkit-plugin/dist/didkit_wasm_bg.wasm', 'p-limit'], plugins, minify: true, }; diff --git a/services/learn-card-network/simple-signing-service/package.json b/services/learn-card-network/simple-signing-service/package.json index c40b95a21c..9acbbe161e 100644 --- a/services/learn-card-network/simple-signing-service/package.json +++ b/services/learn-card-network/simple-signing-service/package.json @@ -1,6 +1,6 @@ { "name": "@learncard/simple-signing-service", - "version": "1.2.0", + "version": "1.1.4", "description": "", "main": "dist/index.js", "types": "dist/index.d.ts", @@ -43,8 +43,8 @@ }, "dependencies": { "@aws-sdk/client-lambda": "^3.370.0", - "@fastify/cors": "^11.2.0", - "@fastify/static": "^9.0.0", + "@fastify/cors": "^9.0.1", + "@fastify/static": "^7.0.4", "@learncard/core": "workspace:*", "@learncard/did-web-plugin": "workspace:*", "@learncard/didkey-plugin": "workspace:*", @@ -61,7 +61,7 @@ "cors": "^2.8.5", "dotenv": "^16.0.3", "express": "^4.18.2", - "fastify": "^5.7.2", + "fastify": "^4.28.1", "ioredis": "^5.2.2", "ioredis-mock": "^8.2.2", "jwt-decode": "^3.1.2", diff --git a/services/learn-card-network/simple-signing-service/project.json b/services/learn-card-network/simple-signing-service/project.json index 4d582bca96..c6ae35c894 100644 --- a/services/learn-card-network/simple-signing-service/project.json +++ b/services/learn-card-network/simple-signing-service/project.json @@ -1,6 +1,6 @@ { "$schema": "../../../node_modules/nx/schemas/project-schema.json", - "name": "simple-signing-service-app", + "name": "simple-signing-service", "sourceRoot": "services/learn-card-network/simple-signing-service/src", "projectType": "application", "root": "services/learn-card-network/simple-signing-service", diff --git a/services/learn-card-network/simple-signing-service/serverless.yml b/services/learn-card-network/simple-signing-service/serverless.yml index 13a42427e9..d7f81f4151 100644 --- a/services/learn-card-network/simple-signing-service/serverless.yml +++ b/services/learn-card-network/simple-signing-service/serverless.yml @@ -18,7 +18,7 @@ custom: esbuild: packager: pnpm plugins: esbuildPlugins.cjs - external: ['snappy', '@learncard/didkit-plugin/dist/didkit_wasm_bg.wasm', '*.node'] + external: ['snappy', '@learncard/didkit-plugin/dist/didkit_wasm_bg.wasm'] sourcemap: external watch: pattern: ['src/**/*.ts', 'dids.ts'] @@ -68,10 +68,7 @@ custom: package: patterns: - '!node_modules/**' - - 'node_modules/@learncard/didkit-plugin/dist/didkit_wasm_bg.wasm' - - 'node_modules/@learncard/didkit-plugin-node/*.node' - - 'node_modules/@learncard/didkit-plugin-node/package.json' - - 'node_modules/@learncard/didkit-plugin-node/dist/**' + - 'node_modules/@learncard/didkit-plugin' provider: name: aws diff --git a/services/playwright-delete-service/package.json b/services/playwright-delete-service/package.json index 50daaaa17b..b824ed8d62 100644 --- a/services/playwright-delete-service/package.json +++ b/services/playwright-delete-service/package.json @@ -9,7 +9,7 @@ "dev": "nodemon index.js" }, "dependencies": { - "fastify": "5.7.2", + "fastify": "^5.0.0", "ioredis": "^5.2.2", "mongodb": "^6.2.0", "neo4j-driver": "^4.4.5" diff --git a/tests/benchmarking/CHANGELOG.md b/tests/benchmarking/CHANGELOG.md deleted file mode 100644 index 0b42317ca6..0000000000 --- a/tests/benchmarking/CHANGELOG.md +++ /dev/null @@ -1,9 +0,0 @@ -# @learncard/benchmarking - -## 1.0.1 - -### Patch Changes - -- Updated dependencies [[`7e30fc7116411ba19a4889cfbf9fc71dd725c309`](https://github.com/learningeconomy/LearnCard/commit/7e30fc7116411ba19a4889cfbf9fc71dd725c309)]: - - @learncard/didkit-plugin-node@0.2.0 - - @learncard/init@2.3.0 diff --git a/tests/benchmarking/benchmark.js b/tests/benchmarking/benchmark.js deleted file mode 100644 index d349729474..0000000000 --- a/tests/benchmarking/benchmark.js +++ /dev/null @@ -1,205 +0,0 @@ -/** - * LearnCard SDK Benchmarks: WASM vs Native - * - * - Cold start: Spawns fresh Node processes (true cold start for init) - * - Warm operations: Runs in-process after init - */ - -const { execSync } = require('child_process'); -const { performance } = require('perf_hooks'); - -const COLD_ITERATIONS = 10; -const WARM_ITERATIONS = 20; -const WARMUP = 3; -const SEED = '0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef'; - -function runColdInit(useNative) { - const didkit = useNative ? ", didkit: 'node'" : ''; - const script = ` - const { initLearnCard } = require('@learncard/init'); - const start = Date.now(); - initLearnCard({ seed: '${SEED}'${didkit} }) - .then(() => { console.log(Date.now() - start); process.exit(0); }) - .catch(() => { console.log(Date.now() - start); process.exit(0); }); - `; - - try { - const result = execSync(`node -e "${script.replace(/\n/g, ' ')}"`, { - cwd: __dirname, - encoding: 'utf8', - timeout: 60000, - stdio: ['pipe', 'pipe', 'pipe'], - }); - return parseInt(result.trim().split('\n')[0], 10); - } catch (e) { - if (e.stdout) { - const time = parseInt(e.stdout.trim().split('\n')[0], 10); - if (!isNaN(time)) return time; - } - throw e; - } -} - -async function benchmarkWarm(fn, iterations) { - for (let i = 0; i < WARMUP; i++) await fn(); - - const times = []; - for (let i = 0; i < iterations; i++) { - const start = performance.now(); - await fn(); - times.push(performance.now() - start); - } - - return times.reduce((a, b) => a + b, 0) / times.length; -} - -function printResult(op, wasmMs, nativeMs) { - const speedup = wasmMs / nativeMs; - const indicator = speedup >= 1 ? '🟢' : 'šŸ”“'; - console.log( - ` ${indicator} ${op.padEnd(20)} WASM: ${wasmMs - .toFixed(2) - .padStart(8)}ms | Native: ${nativeMs.toFixed(2).padStart(8)}ms | ${speedup.toFixed(2)}x` - ); -} - -async function main() { - console.log('šŸ”¬ LearnCard SDK Benchmarks: WASM vs Native'); - console.log('━'.repeat(70)); - - // Cold start benchmark - console.log('\nšŸ“Š COLD START (spawns fresh Node process each iteration)'); - console.log(` Iterations: ${COLD_ITERATIONS}\n`); - - const wasmTimes = []; - const nativeTimes = []; - - for (let i = 0; i < COLD_ITERATIONS; i++) { - wasmTimes.push(runColdInit(false)); - nativeTimes.push(runColdInit(true)); - process.stdout.write( - ` [${i + 1}/${COLD_ITERATIONS}] WASM: ${wasmTimes[i]}ms | Native: ${ - nativeTimes[i] - }ms\n` - ); - } - - const wasmAvg = wasmTimes.reduce((a, b) => a + b, 0) / wasmTimes.length; - const nativeAvg = nativeTimes.reduce((a, b) => a + b, 0) / nativeTimes.length; - const initSpeedup = wasmAvg / nativeAvg; - - console.log( - `\n šŸš€ initLearnCard() cold start: WASM ${wasmAvg.toFixed( - 0 - )}ms → Native ${nativeAvg.toFixed(0)}ms (${initSpeedup.toFixed(1)}x faster)` - ); - - // Warm operations - console.log('\n' + '━'.repeat(70)); - console.log('\nšŸ“Š WARM OPERATIONS (pre-initialized LearnCards)'); - console.log(` Iterations: ${WARM_ITERATIONS} + ${WARMUP} warmup\n`); - - const { initLearnCard } = require('@learncard/init'); - - const wasmLC = await initLearnCard({ - seed: 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', - }); - const nativeLC = await initLearnCard({ - seed: 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb', - didkit: 'node', - }); - - // Credentials - const testVC = { - '@context': ['https://www.w3.org/2018/credentials/v1'], - type: ['VerifiableCredential'], - issuer: nativeLC.id.did(), - issuanceDate: new Date().toISOString(), - credentialSubject: { id: 'did:example:subject' }, - }; - - const wasmIssue = await benchmarkWarm( - () => wasmLC.invoke.issueCredential({ ...testVC, issuer: wasmLC.id.did() }), - WARM_ITERATIONS - ); - const nativeIssue = await benchmarkWarm( - () => nativeLC.invoke.issueCredential({ ...testVC, issuer: nativeLC.id.did() }), - WARM_ITERATIONS - ); - printResult('issueCredential()', wasmIssue, nativeIssue); - - const signedVC = await nativeLC.invoke.issueCredential({ - ...testVC, - issuer: nativeLC.id.did(), - }); - const wasmVerify = await benchmarkWarm( - () => wasmLC.invoke.verifyCredential(signedVC), - WARM_ITERATIONS - ); - const nativeVerify = await benchmarkWarm( - () => nativeLC.invoke.verifyCredential(signedVC), - WARM_ITERATIONS - ); - printResult('verifyCredential()', wasmVerify, nativeVerify); - - // JWE - const wasmDid = wasmLC.id.did(); - const nativeDid = nativeLC.id.did(); - - const wasmCreateJwe = await benchmarkWarm( - () => wasmLC.invoke.createJwe('secret', [wasmDid]), - WARM_ITERATIONS - ); - const nativeCreateJwe = await benchmarkWarm( - () => nativeLC.invoke.createJwe('secret', [nativeDid]), - WARM_ITERATIONS - ); - printResult('createJwe()', wasmCreateJwe, nativeCreateJwe); - - const wasmJwe = await wasmLC.invoke.createJwe('secret', [wasmDid]); - const nativeJwe = await nativeLC.invoke.createJwe('secret', [nativeDid]); - const wasmDecryptJwe = await benchmarkWarm( - () => wasmLC.invoke.decryptJwe(wasmJwe), - WARM_ITERATIONS - ); - const nativeDecryptJwe = await benchmarkWarm( - () => nativeLC.invoke.decryptJwe(nativeJwe), - WARM_ITERATIONS - ); - printResult('decryptJwe()', wasmDecryptJwe, nativeDecryptJwe); - - const dagData = { x: 1 }; - const wasmCreateDag = await benchmarkWarm( - () => wasmLC.invoke.createDagJwe(dagData, [wasmDid]), - WARM_ITERATIONS - ); - const nativeCreateDag = await benchmarkWarm( - () => nativeLC.invoke.createDagJwe(dagData, [nativeDid]), - WARM_ITERATIONS - ); - printResult('createDagJwe()', wasmCreateDag, nativeCreateDag); - - const wasmDagJwe = await wasmLC.invoke.createDagJwe(dagData, [wasmDid]); - const nativeDagJwe = await nativeLC.invoke.createDagJwe(dagData, [nativeDid]); - const wasmDecryptDag = await benchmarkWarm( - () => wasmLC.invoke.decryptDagJwe(wasmDagJwe), - WARM_ITERATIONS - ); - const nativeDecryptDag = await benchmarkWarm( - () => nativeLC.invoke.decryptDagJwe(nativeDagJwe), - WARM_ITERATIONS - ); - printResult('decryptDagJwe()', wasmDecryptDag, nativeDecryptDag); - - // Summary - console.log('\n' + '━'.repeat(70)); - console.log('šŸ“ˆ SUMMARY\n'); - console.log( - ` Cold start speedup: ${initSpeedup.toFixed(1)}x (${(wasmAvg - nativeAvg).toFixed( - 0 - )}ms saved per init)` - ); - console.log('\n šŸš€ Use { didkit: "node" } for serverless, CLI tools, worker threads!\n'); -} - -main().catch(console.error); diff --git a/tests/benchmarking/package.json b/tests/benchmarking/package.json deleted file mode 100644 index b9c72fdefb..0000000000 --- a/tests/benchmarking/package.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "name": "@learncard/benchmarking", - "version": "1.0.1", - "private": true, - "description": "Performance benchmarks for LearnCard SDK", - "type": "commonjs", - "scripts": { - "benchmark": "node benchmark.js" - }, - "dependencies": { - "@learncard/init": "workspace:*", - "@learncard/didkit-plugin-node": "workspace:*" - }, - "devDependencies": { - "@types/node": "^20.0.0", - "ts-node": "^10.9.2", - "typescript": "^5.3.3" - } -} diff --git a/tests/e2e/compose.yaml b/tests/e2e/compose.yaml index 850eb9970c..b51f03a570 100644 --- a/tests/e2e/compose.yaml +++ b/tests/e2e/compose.yaml @@ -1,22 +1,15 @@ services: brain: - image: learncard-monorepo-local + image: welibrary/lcn-brain-service build: context: ../../ - dockerfile: Dockerfile.monorepo + dockerfile: services/learn-card-network/brain-service/Dockerfile.local expose: - 4000 ports: - "4000:4000" - command: - [ - "sh", - "-c", - "cd services/learn-card-network/brain-service && pnpm dev", - ] - depends_on: neo4j: condition: service_healthy @@ -43,7 +36,6 @@ services: IS_OFFLINE: true IS_E2E_TEST: true - SKIP_DIDKIT_NAPI: "1" NEO4J_URI: ${NEO4J_URI:-bolt://neo4j:7687} NEO4J_USERNAME: ${NEO4J_USERNAME:-neo4j} @@ -65,23 +57,16 @@ services: APP_STORE_ADMIN_PROFILE_IDS: ${APP_STORE_ADMIN_PROFILE_IDS:-testa} cloud: - image: learncard-monorepo-local + image: welibrary/lcn-cloud-service build: context: ../../ - dockerfile: Dockerfile.monorepo + dockerfile: services/learn-card-network/learn-cloud-service/Dockerfile.local expose: - 4100 ports: - "4100:4100" - command: - [ - "sh", - "-c", - "cd services/learn-card-network/learn-cloud-service && pnpm dev", - ] - depends_on: - mongodb - redis2 @@ -99,7 +84,6 @@ services: PORT: 4100 LEARN_CLOUD_SEED: b - SKIP_DIDKIT_NAPI: "1" LEARN_CLOUD_MONGO_URI: ${LEARN_CLOUD_MONGO_URI:-mongodb://mongodb:27017?ssl=false&replicaSet=rs0} LEARN_CLOUD_MONGO_DB_NAME: ${LEARN_CLOUD_MONGO_DB_NAME:-learn-cloud} @@ -115,23 +99,16 @@ services: JWT_SIGNING_KEY: test signing: - image: learncard-monorepo-local + image: welibrary/simple-signing-service build: context: ../../ - dockerfile: Dockerfile.monorepo + dockerfile: services/learn-card-network/simple-signing-service/Dockerfile.local expose: - 4200 ports: - "4200:4200" - command: - [ - "sh", - "-c", - "cd services/learn-card-network/simple-signing-service && pnpm dev", - ] - depends_on: - mongodb - redis3 @@ -149,7 +126,6 @@ services: PORT: 4200 IS_OFFLINE: true - SKIP_DIDKIT_NAPI: "1" SEED: c AUTHORIZED_DIDS: did:web:localhost%3A4000 diff --git a/tests/test-embed-app/index.html b/tests/test-embed-app/index.html index d4226ea55d..41cbef97b1 100644 --- a/tests/test-embed-app/index.html +++ b/tests/test-embed-app/index.html @@ -123,19 +123,6 @@

Request Identity

-
-

Request Consent

- - - - - - -
-

Log

@@ -227,13 +214,6 @@

Log

sendAppEvent(event) { return this.sendMessage('APP_EVENT', event); } - - requestConsent(contractUri, options = {}) { - return this.sendMessage('REQUEST_CONSENT', { - contractUri, - redirect: options.redirect ?? false, - }); - } } window.initialize = async function () { @@ -246,7 +226,6 @@

Log

document.getElementById('status').textContent = 'SDK Initialized āœ“'; document.getElementById('sendBtn').disabled = false; document.getElementById('identityBtn').disabled = false; - document.getElementById('consentBtn').disabled = false; document.getElementById('initBtn').disabled = true; log('SDK initialized successfully!', 'success'); @@ -265,24 +244,6 @@

Log

} }; - window.requestConsent = async function () { - const contractUri = document.getElementById('contractUri').value.trim(); - const redirectEnabled = document.getElementById('redirectEnabled').checked; - - if (!contractUri) { - log('Contract URI is required', 'error'); - return; - } - - try { - log(`Requesting consent for: ${contractUri} (redirect: ${redirectEnabled})`, 'info'); - const result = await sdk.requestConsent(contractUri, { redirect: redirectEnabled }); - log(`Consent result: ${JSON.stringify(result, null, 2)}`, 'success'); - } catch (e) { - log(`Consent request failed: ${JSON.stringify(e)}`, 'error'); - } - }; - window.sendCredential = async function () { const templateAlias = document.getElementById('templateAlias').value.trim(); const templateDataStr = document.getElementById('templateData').value.trim(); diff --git a/tools/scripts/nx-watch-build.sh b/tools/scripts/nx-watch-build.sh deleted file mode 100644 index e5209a21f7..0000000000 --- a/tools/scripts/nx-watch-build.sh +++ /dev/null @@ -1,44 +0,0 @@ -#!/usr/bin/env sh -set -e - -if [ -z "$NX_PROJECT_NAME" ] && [ -z "$NX_FILE_CHANGES" ]; then - exit 0 -fi - -should_build=true - -filtered_files="" - -if [ -n "$NX_FILE_CHANGES" ]; then - should_build=false - - for file in $NX_FILE_CHANGES; do - case "$file" in - */dist/*|*/build/*|*/coverage/*|*/.nx/*|*/node_modules/*) - ;; - *) - should_build=true - filtered_files="$filtered_files $file" - ;; - esac - done -fi - -if [ "$should_build" != "true" ]; then - exit 0 -fi - -projects="$NX_PROJECT_NAME" - -if [ -z "$projects" ] && [ -n "$filtered_files" ]; then - projects=$(pnpm exec nx print-affected --files="$filtered_files" --select=projects | tr ',' ' ') -fi - -for project in $projects; do - if [ -z "$project" ] || [ "$project" = "learn-card-app" ]; then - continue - fi - - echo "[nx-watch] rebuilding $project" - pnpm exec nx run "$project:build" -done