diff --git a/.github/actions/yarn-playwright-install/action.yml b/.github/actions/yarn-playwright-install/action.yml index ea3ae0469b8d0d..f88a4a185c47e3 100644 --- a/.github/actions/yarn-playwright-install/action.yml +++ b/.github/actions/yarn-playwright-install/action.yml @@ -38,9 +38,47 @@ runs: ${{ github.workspace }}/node_modules/playwright key: ${{ runner.os }}-playwright-${{ env.PLAYWRIGHT_VERSION }} - # In default mode: run if playwright-cache missed - # In skip mode: run if playwright-cache-check missed (but cache restore step was also skipped) + - name: Determine if playwright install will run + id: should-install + shell: bash + run: | + if [[ "${{ inputs.skip-install-if-cache-hit }}" == "true" ]]; then + cache_hit="${{ steps.playwright-cache-check.outputs.cache-hit }}" + else + cache_hit="${{ steps.playwright-cache.outputs.cache-hit }}" + fi + if [[ "$cache_hit" == "true" ]]; then + echo "value=false" >> "$GITHUB_OUTPUT" + else + echo "value=true" >> "$GITHUB_OUTPUT" + fi + + # When the caller uses yarn-install with skip-install-if-cache-hit, node_modules is never + # materialized on disk if all yarn caches hit (pure lookup). `yarn playwright install` needs + # node_modules to resolve the playwright bin, so restore it here (and fall back to a full + # install if that cache also missed) before running the install step. + - name: Restore node_modules for playwright install + if: ${{ steps.should-install.outputs.value == 'true' }} + id: nm-restore + uses: actions/cache/restore@v4 + with: + path: | + **/node_modules/ + !**/.next/node_modules/ + key: ${{ runner.os }}-yarn-nm-cache-${{ hashFiles('yarn.lock', '.yarnrc.yml') }} + + - name: Yarn install (fallback when node_modules cache also missed) + if: ${{ steps.should-install.outputs.value == 'true' && steps.nm-restore.outputs.cache-hit != 'true' }} + shell: bash + run: yarn install --inline-builds + env: + YARN_ENABLE_IMMUTABLE_INSTALLS: "false" + YARN_ENABLE_GLOBAL_CACHE: "false" + YARN_INSTALL_STATE_PATH: .yarn/ci-cache/install-state.gz + YARN_NM_MODE: "hardlinks-local" + HUSKY: "0" + - name: Yarn playwright install - if: ${{ (inputs.skip-install-if-cache-hit != 'true' && steps.playwright-cache.outputs.cache-hit != 'true') || (inputs.skip-install-if-cache-hit == 'true' && steps.playwright-cache-check.outputs.cache-hit != 'true') }} + if: ${{ steps.should-install.outputs.value == 'true' }} shell: bash run: yarn playwright install --with-deps diff --git a/.github/workflows/cleanup-report.yml b/.github/workflows/cleanup-report.yml deleted file mode 100644 index e3e7daf1f9e7f4..00000000000000 --- a/.github/workflows/cleanup-report.yml +++ /dev/null @@ -1,46 +0,0 @@ -on: - workflow_call: - pull_request: - types: [closed] - -permissions: - contents: write - issues: write - pull-requests: write -jobs: - cleanup-report: - runs-on: ubuntu-latest - steps: - - name: Generate GitHub App token - id: generate-token - uses: actions/create-github-app-token@7e473efe3cb98aa54f8d4bac15400b15fad77d94 - with: - app-id: ${{ secrets.CI_CAL_APP_ID }} - private-key: ${{ secrets.CI_CAL_APP_PRIVATE_KEY }} - repositories: 'test-results-2' - - - name: Checkout GitHub Pages Branch - uses: actions/checkout@v4 - with: - repository: calcom/test-results-2 - ref: gh-pages - token: ${{ steps.generate-token.outputs.token }} - - - name: Set Git User - run: | - git config --global user.name "github-actions[bot]" - git config --global user.email "41898282+github-actions[bot]@users.noreply.github.com" - - - name: Cleanup HTML reports on PR close/merge - env: - BRANCH_REPORTS_DIR: reports/${{ github.event.pull_request.head.ref }} - HEAD_REF: ${{ github.event.pull_request.head.ref }} - run: | - if [ -d "$BRANCH_REPORTS_DIR" ]; then - rm -rf "$BRANCH_REPORTS_DIR" - git add . - git commit -m "workflow: remove all reports for branch $HEAD_REF (PR closed/merged)" - git push - else - echo "No reports found for branch $HEAD_REF. Nothing to clean up." - fi diff --git a/.github/workflows/cleanup.yml b/.github/workflows/cleanup.yml deleted file mode 100644 index 6e7fd6140ee1ee..00000000000000 --- a/.github/workflows/cleanup.yml +++ /dev/null @@ -1,73 +0,0 @@ -name: Delete - -on: - delete: - branches-ignore: [main, gh-pages] - -permissions: - contents: write - issues: write - pull-requests: write - -# ensures that currently running Playwright workflow of deleted branch gets cancelled -concurrency: - group: ${{ github.event.ref }} - cancel-in-progress: true - -jobs: - delete_reports: - name: Delete Reports - runs-on: ubuntu-latest - env: - # Contains all reports for deleted branch - BRANCH_REPORTS_DIR: reports/${{ github.event.ref }} - steps: - - name: Generate GitHub App token - id: generate-token - uses: actions/create-github-app-token@7e473efe3cb98aa54f8d4bac15400b15fad77d94 - with: - app-id: ${{ secrets.CI_CAL_APP_ID }} - private-key: ${{ secrets.CI_CAL_APP_PRIVATE_KEY }} - repositories: 'test-results-2' - - - name: Checkout GitHub Pages Branch - uses: actions/checkout@v4 - with: - repository: calcom/test-results-2 - ref: gh-pages - token: ${{ steps.generate-token.outputs.token }} - - name: Set Git User - # see: https://github.com/actions/checkout/issues/13#issuecomment-724415212 - run: | - git config --global user.name "github-actions[bot]" - git config --global user.email "41898282+github-actions[bot]@users.noreply.github.com" - - name: Check for workflow reports - run: | - if [ -z "$(ls -A $BRANCH_REPORTS_DIR)" ]; then - echo "BRANCH_REPORTS_EXIST="false"" >> $GITHUB_ENV - else - echo "BRANCH_REPORTS_EXIST="true"" >> $GITHUB_ENV - fi - - name: Delete reports from repo for branch - if: ${{ env.BRANCH_REPORTS_EXIST == 'true' }} - timeout-minutes: 3 - run: | - cd $BRANCH_REPORTS_DIR/.. - - rm -rf ${{ github.event.ref }} - git add . - git commit -m "workflow: remove all reports for branch ${{ github.event.ref }}" - - while true; do - git pull --rebase - if [ $? -ne 0 ]; then - echo "Failed to rebase. Please review manually." - exit 1 - fi - - git push - if [ $? -eq 0 ]; then - echo "Successfully pushed HTML reports to repo." - exit 0 - fi - done diff --git a/.github/workflows/e2e-app-store.yml b/.github/workflows/e2e-app-store.yml index 6caa7bc1b1a729..985708ef98ce15 100644 --- a/.github/workflows/e2e-app-store.yml +++ b/.github/workflows/e2e-app-store.yml @@ -8,6 +8,8 @@ env: NODE_OPTIONS: --max-old-space-size=4096 ALLOWED_HOSTNAMES: ${{ vars.CI_ALLOWED_HOSTNAMES }} CALENDSO_ENCRYPTION_KEY: ${{ secrets.CI_CALENDSO_ENCRYPTION_KEY }} + CURRENTS_RECORD_KEY: ${{ secrets.CURRENTS_RECORD_KEY }} + CURRENTS_PROJECT_ID: ${{ vars.CURRENTS_PROJECT_ID }} DAILY_API_KEY: ${{ secrets.CI_DAILY_API_KEY }} DATABASE_URL: ${{ secrets.CI_DATABASE_URL }} DATABASE_DIRECT_URL: ${{ secrets.CI_DATABASE_URL }} @@ -98,9 +100,3 @@ jobs: - uses: ./.github/actions/cache-build - name: Run Tests run: yarn e2e:app-store --workers=4 - - name: Upload Test Results - if: ${{ always() }} - uses: actions/upload-artifact@v4 - with: - name: blob-report-app-store - path: blob-report diff --git a/.github/workflows/e2e-atoms.yml b/.github/workflows/e2e-atoms.yml index e694acea444fa3..fec22637b26442 100644 --- a/.github/workflows/e2e-atoms.yml +++ b/.github/workflows/e2e-atoms.yml @@ -8,6 +8,8 @@ permissions: env: NODE_OPTIONS: --max-old-space-size=8096 + CURRENTS_RECORD_KEY: ${{ secrets.CURRENTS_RECORD_KEY }} + CURRENTS_PROJECT_ID: ${{ vars.CURRENTS_PROJECT_ID }} ATOMS_E2E_OAUTH_CLIENT_ID: ${{ secrets.ATOMS_E2E_OAUTH_CLIENT_ID }} ATOMS_E2E_OAUTH_CLIENT_SECRET: ${{ secrets.ATOMS_E2E_OAUTH_CLIENT_SECRET }} ATOMS_E2E_API_URL: ${{ secrets.ATOMS_E2E_API_URL }} diff --git a/.github/workflows/e2e-embed-react.yml b/.github/workflows/e2e-embed-react.yml index a097116dd49411..5ee07e94491461 100644 --- a/.github/workflows/e2e-embed-react.yml +++ b/.github/workflows/e2e-embed-react.yml @@ -8,6 +8,8 @@ env: NODE_OPTIONS: --max-old-space-size=4096 ALLOWED_HOSTNAMES: ${{ vars.CI_ALLOWED_HOSTNAMES }} CALENDSO_ENCRYPTION_KEY: ${{ secrets.CI_CALENDSO_ENCRYPTION_KEY }} + CURRENTS_RECORD_KEY: ${{ secrets.CURRENTS_RECORD_KEY }} + CURRENTS_PROJECT_ID: ${{ vars.CURRENTS_PROJECT_ID }} DAILY_API_KEY: ${{ secrets.CI_DAILY_API_KEY }} DATABASE_URL: ${{ secrets.CI_DATABASE_URL }} DATABASE_DIRECT_URL: ${{ secrets.CI_DATABASE_URL }} @@ -85,9 +87,3 @@ jobs: run: | yarn e2e:embed-react --workers=4 yarn workspace @calcom/embed-react packaged:tests - - name: Upload Test Results - if: ${{ always() }} - uses: actions/upload-artifact@v4 - with: - name: blob-report-embed-react - path: blob-report diff --git a/.github/workflows/e2e-embed.yml b/.github/workflows/e2e-embed.yml index 2c9ca42ab63cd0..ffc2a97b14c7b2 100644 --- a/.github/workflows/e2e-embed.yml +++ b/.github/workflows/e2e-embed.yml @@ -8,6 +8,8 @@ env: NODE_OPTIONS: --max-old-space-size=4096 ALLOWED_HOSTNAMES: ${{ vars.CI_ALLOWED_HOSTNAMES }} CALENDSO_ENCRYPTION_KEY: ${{ secrets.CI_CALENDSO_ENCRYPTION_KEY }} + CURRENTS_RECORD_KEY: ${{ secrets.CURRENTS_RECORD_KEY }} + CURRENTS_PROJECT_ID: ${{ vars.CURRENTS_PROJECT_ID }} DAILY_API_KEY: ${{ secrets.CI_DAILY_API_KEY }} DATABASE_URL: ${{ secrets.CI_DATABASE_URL }} DATABASE_DIRECT_URL: ${{ secrets.CI_DATABASE_URL }} @@ -91,9 +93,3 @@ jobs: - uses: ./.github/actions/cache-build - name: Run Tests run: yarn e2e:embed --workers=4 - - name: Upload Test Results - if: ${{ always() }} - uses: actions/upload-artifact@v4 - with: - name: blob-report-embed-core - path: blob-report diff --git a/.github/workflows/e2e-report.yml b/.github/workflows/e2e-report.yml deleted file mode 100644 index c992f0c7d1fd1c..00000000000000 --- a/.github/workflows/e2e-report.yml +++ /dev/null @@ -1,212 +0,0 @@ -name: E2E Report - -on: - workflow_run: - workflows: ["PR Update"] - types: - - completed - workflow_dispatch: - inputs: - pr_number: - description: 'The PR number to generate report for' - required: true - type: string - -jobs: - get-pr-info: - name: Get PR Info - runs-on: ubuntu-latest - # For workflow_run: only run if the triggering workflow failed - # For workflow_dispatch: always run (inputs are provided manually) - if: ${{ github.event_name == 'workflow_dispatch' || github.event.workflow_run.conclusion == 'failure' }} - permissions: - actions: read - pull-requests: read - outputs: - pr-number: ${{ steps.get-info.outputs.pr-number }} - head-branch: ${{ steps.get-info.outputs.head-branch }} - has-blob-reports: ${{ steps.get-info.outputs.has-blob-reports }} - source-run-id: ${{ steps.get-info.outputs.source-run-id }} - source-run-number: ${{ steps.get-info.outputs.source-run-number }} - source-run-attempt: ${{ steps.get-info.outputs.source-run-attempt }} - source-head-sha: ${{ steps.get-info.outputs.source-head-sha }} - steps: - - name: Get PR and run info - id: get-info - uses: actions/github-script@v7 - with: - script: | - const isDispatch = context.eventName === 'workflow_dispatch'; - - if (isDispatch) { - // For workflow_dispatch: look up everything from PR number - const prNumber = context.payload.inputs.pr_number; - console.log('Looking up PR:', prNumber); - - // Get PR details - const { data: pr } = await github.rest.pulls.get({ - owner: context.repo.owner, - repo: context.repo.repo, - pull_number: parseInt(prNumber) - }); - - const headSha = pr.head.sha; - const headBranch = pr.head.ref; - console.log('PR head SHA:', headSha); - console.log('PR head branch:', headBranch); - - // Find the "PR Update" workflow - const { data: workflows } = await github.rest.actions.listRepoWorkflows({ - owner: context.repo.owner, - repo: context.repo.repo - }); - const prUpdateWorkflow = workflows.workflows.find(w => w.name === 'PR Update'); - if (!prUpdateWorkflow) { - core.setFailed('Could not find "PR Update" workflow'); - return; - } - console.log('Found PR Update workflow ID:', prUpdateWorkflow.id); - - // Find the most recent completed run for this branch with blob-report artifacts - // We search by branch instead of SHA to handle cases where: - // 1. The PR was updated after E2E tests ran (artifacts exist for older SHA) - // 2. The current run for the SHA is still queued/in-progress - const { data: runs } = await github.rest.actions.listWorkflowRuns({ - owner: context.repo.owner, - repo: context.repo.repo, - workflow_id: prUpdateWorkflow.id, - branch: headBranch, - status: 'completed', - per_page: 20 - }); - - console.log('Found', runs.workflow_runs.length, 'completed runs for branch', headBranch); - - // Find a run with blob-report artifacts - let selectedRun = null; - let hasBlobReports = false; - - for (const run of runs.workflow_runs) { - console.log('Checking run', run.id, 'conclusion:', run.conclusion); - - const { data: artifacts } = await github.rest.actions.listWorkflowRunArtifacts({ - owner: context.repo.owner, - repo: context.repo.repo, - run_id: run.id - }); - - const blobReports = artifacts.artifacts.filter(a => a.name.startsWith('blob-report-')); - if (blobReports.length > 0) { - console.log('Found run with blob reports:', run.id, 'artifacts:', blobReports.map(a => a.name)); - selectedRun = run; - hasBlobReports = true; - break; - } - } - - if (!selectedRun) { - console.log('No runs found with blob-report artifacts'); - core.setOutput('pr-number', prNumber); - core.setOutput('head-branch', headBranch); - core.setOutput('source-head-sha', headSha); - core.setOutput('has-blob-reports', 'false'); - core.setOutput('source-run-id', ''); - core.setOutput('source-run-number', ''); - core.setOutput('source-run-attempt', ''); - return; - } - - core.setOutput('pr-number', prNumber); - core.setOutput('head-branch', headBranch); - core.setOutput('source-head-sha', headSha); - core.setOutput('source-run-id', selectedRun.id.toString()); - core.setOutput('source-run-number', selectedRun.run_number.toString()); - core.setOutput('source-run-attempt', selectedRun.run_attempt.toString()); - core.setOutput('has-blob-reports', 'true'); - return; - } - - // For workflow_run: extract from payload - const workflowRun = context.payload.workflow_run; - const headSha = workflowRun.head_sha; - const headBranch = workflowRun.head_branch; - - console.log('Head SHA:', headSha); - console.log('Head Branch:', headBranch); - - // Set source run info - core.setOutput('source-run-id', workflowRun.id.toString()); - core.setOutput('source-run-number', workflowRun.run_number.toString()); - core.setOutput('source-run-attempt', workflowRun.run_attempt.toString()); - core.setOutput('source-head-sha', headSha); - - // Check for blob report artifacts - const { data: artifacts } = await github.rest.actions.listWorkflowRunArtifacts({ - owner: context.repo.owner, - repo: context.repo.repo, - run_id: workflowRun.id - }); - - const blobReports = artifacts.artifacts.filter(a => a.name.startsWith('blob-report-')); - console.log('Found blob reports:', blobReports.map(a => a.name)); - core.setOutput('has-blob-reports', blobReports.length > 0 ? 'true' : 'false'); - - // Try to get PR number from workflow_run payload first - if (workflowRun.pull_requests && workflowRun.pull_requests.length > 0) { - const prNumber = workflowRun.pull_requests[0].number; - console.log('PR number from payload:', prNumber); - core.setOutput('pr-number', prNumber.toString()); - core.setOutput('head-branch', headBranch); - return; - } - - // Fall back to API lookup - try { - const { data: prs } = await github.rest.repos.listPullRequestsAssociatedWithCommit({ - owner: context.repo.owner, - repo: context.repo.repo, - commit_sha: headSha - }); - - if (prs.length === 0) { - console.log('No PRs found for commit'); - core.setOutput('pr-number', ''); - core.setOutput('head-branch', headBranch); - return; - } - - // Find open PR or use first one - const openPr = prs.find(pr => pr.state === 'open') || prs[0]; - console.log('PR number from API:', openPr.number); - core.setOutput('pr-number', openPr.number.toString()); - core.setOutput('head-branch', openPr.head.ref); - } catch (e) { - console.log('Error fetching PR:', e); - core.setOutput('pr-number', ''); - core.setOutput('head-branch', headBranch); - } - - merge-reports: - name: Merge reports - needs: [get-pr-info] - if: ${{ needs.get-pr-info.outputs.has-blob-reports == 'true' && needs.get-pr-info.outputs.pr-number != '' }} - uses: ./.github/workflows/merge-reports.yml - with: - source_run_id: ${{ needs.get-pr-info.outputs.source-run-id }} - source_run_number: ${{ needs.get-pr-info.outputs.source-run-number }} - source_run_attempt: ${{ needs.get-pr-info.outputs.source-run-attempt }} - source_head_sha: ${{ needs.get-pr-info.outputs.source-head-sha }} - # No secrets: inherit - merge-reports only needs the default GITHUB_TOKEN for artifact download - - publish-report: - name: Publish HTML report - needs: [get-pr-info, merge-reports] - if: ${{ needs.get-pr-info.outputs.pr-number != '' }} - uses: ./.github/workflows/publish-report.yml - with: - head_branch: ${{ needs.get-pr-info.outputs.head-branch }} - source_run_id: ${{ needs.get-pr-info.outputs.source-run-id }} - source_run_number: ${{ needs.get-pr-info.outputs.source-run-number }} - source_run_attempt: ${{ needs.get-pr-info.outputs.source-run-attempt }} - pr_number: ${{ needs.get-pr-info.outputs.pr-number }} - secrets: inherit diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml index 1c19c446a399a9..67d2bd4745ca3b 100644 --- a/.github/workflows/e2e.yml +++ b/.github/workflows/e2e.yml @@ -7,6 +7,8 @@ permissions: env: ALLOWED_HOSTNAMES: ${{ vars.CI_ALLOWED_HOSTNAMES }} CALENDSO_ENCRYPTION_KEY: ${{ secrets.CI_CALENDSO_ENCRYPTION_KEY }} + CURRENTS_RECORD_KEY: ${{ secrets.CURRENTS_RECORD_KEY }} + CURRENTS_PROJECT_ID: ${{ vars.CURRENTS_PROJECT_ID }} DAILY_API_KEY: ${{ secrets.CI_DAILY_API_KEY }} DATABASE_URL: ${{ secrets.CI_DATABASE_URL }} DATABASE_DIRECT_URL: ${{ secrets.CI_DATABASE_URL }} @@ -92,10 +94,3 @@ jobs: - uses: ./.github/actions/cache-build - name: Run Tests run: yarn e2e --shard=${{ matrix.shard }}/${{ strategy.job-total }} --workers=4 - - name: Upload Test Results - uses: actions/upload-artifact@v4 - if: always() - with: - name: blob-report-${{ matrix.shard }} - path: blob-report - retention-days: 30 diff --git a/.github/workflows/merge-reports.yml b/.github/workflows/merge-reports.yml deleted file mode 100644 index 5c76bb9a0ede59..00000000000000 --- a/.github/workflows/merge-reports.yml +++ /dev/null @@ -1,45 +0,0 @@ -# https://playwright.dev/docs/test-sharding#merging-reports-from-multiple-shards -on: - workflow_call: - inputs: - source_run_id: - description: 'The run ID to download artifacts from (for workflow_run triggered calls)' - required: true - type: string - source_run_number: - description: 'The run number for artifact naming' - required: true - type: string - source_run_attempt: - description: 'The run attempt for artifact naming' - required: true - type: string - source_head_sha: - description: 'The head SHA to checkout for Playwright version consistency' - required: true - type: string -jobs: - merge-reports: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - with: - ref: ${{ inputs.source_head_sha }} - - uses: ./.github/actions/yarn-install - - uses: ./.github/actions/yarn-playwright-install - - name: Download blob reports from GitHub Actions Artifacts - uses: actions/download-artifact@v4 - with: - run-id: ${{ inputs.source_run_id }} - github-token: ${{ github.token }} - path: all-blob-reports - pattern: blob-report-* - merge-multiple: true - - name: Merge into HTML Report - run: yarn playwright merge-reports --reporter html ./all-blob-reports - - name: Upload HTML report - uses: actions/upload-artifact@v4 - with: - name: html-report--attempt-${{ inputs.source_run_number }}-${{ inputs.source_run_attempt }} - path: playwright-report - retention-days: 14 diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index a9c7ffe832538d..3107855003d768 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -1,4 +1,3 @@ -# ⚠️ SECURITY: Do not add steps that checkout PR code or run local actions before trust-check job completes. name: PR Update on: @@ -19,149 +18,8 @@ concurrency: cancel-in-progress: true jobs: - # Security gate: Check if PR is from a trusted contributor or approved via run-ci label - # This MUST run before any job that checks out PR code and executes it with secrets - trust-check: - name: Trust Check - runs-on: ubuntu-latest - permissions: - pull-requests: read - actions: read - issues: read - outputs: - is-trusted: ${{ steps.check-trust.outputs.is-trusted }} - steps: - - name: Check if PR is trusted - id: check-trust - uses: actions/github-script@v7 - with: - script: | - const trustedAssociations = ['OWNER', 'MEMBER', 'COLLABORATOR']; - - if (!context.payload.pull_request) { - if (context.eventName === 'workflow_dispatch') { - console.log('workflow_dispatch event - assuming trusted (manual trigger)'); - core.setOutput('is-trusted', true); - return; - } - console.log('No pull request context found'); - core.setOutput('is-trusted', false); - return; - } - - const owner = context.repo.owner; - const repo = context.repo.repo; - - // Fetch fresh PR data - payload labels may be stale on re-runs - const { data: pr } = await github.rest.pulls.get({ - owner, - repo, - pull_number: context.payload.pull_request.number, - }); - - const prNumber = pr.number; - const headSha = pr.head.sha; - - async function hasWriteAccess(username) { - try { - const { data: permission } = await github.rest.repos.getCollaboratorPermissionLevel({ - owner, - repo, - username, - }); - return ['admin', 'maintain', 'write'].includes(permission.permission); - } catch (e) { - console.log(`Permission check failed for ${username}: ${e.message}`); - return false; - } - } - - console.log(`PR #${prNumber} by ${pr.user.login} (${pr.author_association})`); - - // Check 1: Is the author a trusted contributor? - if (trustedAssociations.includes(pr.author_association)) { - console.log(`Author has trusted association: ${pr.author_association}`); - core.setOutput('is-trusted', true); - return; - } - - // Check 2: Verify write access via API (author_association can be unreliable) - if (await hasWriteAccess(pr.user.login)) { - console.log(`Author has write access`); - core.setOutput('is-trusted', true); - return; - } - - // Check 3: Was 'run-ci' label added AFTER this SHA was pushed by someone with write access? - // This enables re-runs triggered by the run-ci.yml workflow - // NOTE: We use workflow run created_at instead of commit timestamp because - // git commit timestamps can be arbitrarily backdated by attackers - if (pr.labels?.some(l => l.name === 'run-ci')) { - // Skip stale check if this is a re-run (run_attempt > 1) - // Re-runs are explicitly triggered by maintainers - const runAttempt = parseInt(process.env.GITHUB_RUN_ATTEMPT || '1', 10); - if (runAttempt > 1) { - console.log(`Re-run detected (attempt ${runAttempt}), trusting existing 'run-ci' label`); - core.setOutput('is-trusted', true); - return; - } - - const events = await github.paginate(github.rest.issues.listEvents, { - owner, - repo, - issue_number: prNumber, - per_page: 100, - }); - - const labelEvent = events - .filter(e => e.event === 'labeled' && e.label?.name === 'run-ci') - .sort((a, b) => new Date(b.created_at) - new Date(a.created_at))[0]; - - if (labelEvent) { - // Get workflow runs to find when this SHA was first pushed - const runs = await github.paginate(github.rest.actions.listWorkflowRuns, { - owner, - repo, - workflow_id: 'pr.yml', - head_sha: headSha, - per_page: 100, - }); - - // Filter runs to this PR (in case same SHA exists in multiple PRs) - const matchingRuns = runs.filter(run => - !run.pull_requests?.length || run.pull_requests.some(p => p.number === prNumber) - ); - - if (matchingRuns.length > 0) { - const labelTime = new Date(labelEvent.created_at); - // Use the oldest run's created_at as the push time - const originalRun = matchingRuns[matchingRuns.length - 1]; - const pushTime = new Date(originalRun.created_at); - - if (labelTime > pushTime) { - const adder = labelEvent.actor.login; - if (await hasWriteAccess(adder)) { - console.log(`Approved via 'run-ci' label added by ${adder} after push (label: ${labelTime.toISOString()}, push: ${pushTime.toISOString()})`); - core.setOutput('is-trusted', true); - return; - } - console.log(`Label 'run-ci' added by ${adder} (no write access)`); - } else { - console.log(`Label 'run-ci' is stale (label: ${labelTime.toISOString()}, push: ${pushTime.toISOString()})`); - } - } else { - console.log('No workflow runs found for this SHA - cannot validate label timing'); - } - } - } - - console.log('External contribution requires "run-ci" label from a maintainer'); - core.setOutput('is-trusted', false); - prepare: name: Prepare - needs: [trust-check] - if: needs.trust-check.outputs.is-trusted == 'true' runs-on: ubuntu-latest permissions: pull-requests: read @@ -170,7 +28,6 @@ jobs: has-api-v2-changes: ${{ steps.filter-inclusions.outputs.has-api-v2-changes }} has-prisma-changes: ${{ steps.filter-inclusions.outputs.has-prisma-changes }} commit-sha: ${{ steps.get_sha.outputs.commit-sha }} - run-e2e: ${{ steps.check-if-pr-has-label.outputs.run-e2e == 'true' }} db-cache-hit: ${{ steps.cache-db-check.outputs.cache-hit }} steps: - uses: actions/checkout@v4 @@ -224,66 +81,6 @@ jobs: id: get_sha run: | echo "commit-sha=$(git rev-parse HEAD)" >> $GITHUB_OUTPUT - - name: Check if PR exists with ready-for-e2e label for this SHA - id: check-if-pr-has-label - uses: actions/github-script@v7 - with: - script: | - let labels = []; - let prNumber = null; - - if (context.payload.pull_request) { - prNumber = context.payload.pull_request.number; - } else { - try { - const sha = '${{ steps.get_sha.outputs.commit-sha }}'; - console.log('sha', sha); - const { data: prs } = await github.rest.repos.listPullRequestsAssociatedWithCommit({ - owner: context.repo.owner, - repo: context.repo.repo, - commit_sha: sha - }); - - if (prs.length === 0) { - core.setOutput('run-e2e', false); - console.log(`No pull requests found for commit SHA ${sha}`); - return; - } - - prNumber = prs[0].number; - } - catch (e) { - core.setOutput('run-e2e', false); - console.log(e); - return; - } - } - - // Always fetch fresh PR data to get current labels - // This avoids stale label data from event payloads - try { - const { data: pr } = await github.rest.pulls.get({ - owner: context.repo.owner, - repo: context.repo.repo, - pull_number: prNumber - }); - - console.log(`PR number: ${pr.number}`); - console.log(`PR title: ${pr.title}`); - console.log(`PR state: ${pr.state}`); - console.log(`PR URL: ${pr.html_url}`); - - labels = pr.labels; - } - catch (e) { - core.setOutput('run-e2e', false); - console.log(e); - return; - } - - const labelFound = labels.map(l => l.name).includes('ready-for-e2e'); - console.log('Found the label?', labelFound); - core.setOutput('run-e2e', labelFound); - uses: ./.github/actions/yarn-install if: ${{ steps.filter-exclusions.outputs.has-files-requiring-all-checks == 'true' }} with: @@ -338,7 +135,7 @@ jobs: setup-db: name: Setup Database needs: [prepare] - if: ${{ needs.prepare.outputs.run-e2e == 'true' && needs.prepare.outputs.has-files-requiring-all-checks == 'true' }} + if: ${{ needs.prepare.outputs.has-files-requiring-all-checks == 'true' }} uses: ./.github/workflows/setup-db.yml with: DB_CACHE_HIT: ${{ needs.prepare.outputs.db-cache-hit }} @@ -347,63 +144,63 @@ jobs: build-api-v2: name: Production builds needs: [prepare] - if: ${{ needs.prepare.outputs.run-e2e == 'true' && needs.prepare.outputs.has-files-requiring-all-checks == 'true' }} + if: ${{ needs.prepare.outputs.has-files-requiring-all-checks == 'true' }} uses: ./.github/workflows/api-v2-production-build.yml secrets: inherit build-atoms: name: Production builds needs: [prepare] - if: ${{ needs.prepare.outputs.run-e2e == 'true' && needs.prepare.outputs.has-files-requiring-all-checks == 'true' }} + if: ${{ needs.prepare.outputs.has-files-requiring-all-checks == 'true' }} uses: ./.github/workflows/atoms-production-build.yml secrets: inherit build: name: Production builds needs: [prepare] - if: ${{ needs.prepare.outputs.run-e2e == 'true' && needs.prepare.outputs.has-files-requiring-all-checks == 'true' }} + if: ${{ needs.prepare.outputs.has-files-requiring-all-checks == 'true' }} uses: ./.github/workflows/production-build-without-database.yml secrets: inherit integration-test: name: Tests needs: [prepare, build, setup-db] - if: ${{ needs.prepare.outputs.run-e2e == 'true' && needs.prepare.outputs.has-files-requiring-all-checks == 'true' }} + if: ${{ needs.prepare.outputs.has-files-requiring-all-checks == 'true' }} uses: ./.github/workflows/integration-tests.yml secrets: inherit e2e: name: Tests needs: [prepare, build, setup-db] - if: ${{ needs.prepare.outputs.run-e2e == 'true' && needs.prepare.outputs.has-files-requiring-all-checks == 'true' }} + if: ${{ needs.prepare.outputs.has-files-requiring-all-checks == 'true' }} uses: ./.github/workflows/e2e.yml secrets: inherit e2e-api-v2: name: Tests needs: [prepare, setup-db] - if: ${{ needs.prepare.outputs.run-e2e == 'true' && needs.prepare.outputs.has-files-requiring-all-checks == 'true' }} + if: ${{ needs.prepare.outputs.has-files-requiring-all-checks == 'true' }} uses: ./.github/workflows/e2e-api-v2.yml secrets: inherit e2e-app-store: name: Tests needs: [prepare, build, setup-db] - if: ${{ needs.prepare.outputs.run-e2e == 'true' && needs.prepare.outputs.has-files-requiring-all-checks == 'true' }} + if: ${{ needs.prepare.outputs.has-files-requiring-all-checks == 'true' }} uses: ./.github/workflows/e2e-app-store.yml secrets: inherit e2e-embed: name: Tests needs: [prepare, build, setup-db] - if: ${{ needs.prepare.outputs.run-e2e == 'true' && needs.prepare.outputs.has-files-requiring-all-checks == 'true' }} + if: ${{ needs.prepare.outputs.has-files-requiring-all-checks == 'true' }} uses: ./.github/workflows/e2e-embed.yml secrets: inherit e2e-embed-react: name: Tests needs: [prepare, build, setup-db] - if: ${{ needs.prepare.outputs.run-e2e == 'true' && needs.prepare.outputs.has-files-requiring-all-checks == 'true' }} + if: ${{ needs.prepare.outputs.has-files-requiring-all-checks == 'true' }} uses: ./.github/workflows/e2e-embed-react.yml secrets: inherit @@ -416,7 +213,6 @@ jobs: required: needs: [ - trust-check, prepare, lint, type-check, @@ -438,17 +234,6 @@ jobs: if: always() runs-on: ubuntu-latest steps: - - name: Fail if trust-check did not succeed - run: | - echo "::error::Trust check did not complete successfully (result: ${{ needs.trust-check.result }}). Please re-run the workflow." - exit 1 - if: needs.trust-check.result != 'success' - - name: Fail if PR is not trusted (external contributor without run-ci label) - run: | - echo "::error::This PR is from an external contributor and requires the 'run-ci' label before CI can run." - echo "A maintainer must review the code and add the 'run-ci' label to trigger CI checks." - exit 1 - if: needs.trust-check.outputs.is-trusted != 'true' && needs.trust-check.result == 'success' - name: Fail if conditional jobs failed run: exit 1 if: | diff --git a/.github/workflows/publish-report.yml b/.github/workflows/publish-report.yml deleted file mode 100644 index 107c08049aead4..00000000000000 --- a/.github/workflows/publish-report.yml +++ /dev/null @@ -1,132 +0,0 @@ -on: - workflow_call: - inputs: - head_branch: - description: 'The head branch name for report path' - required: true - type: string - source_run_id: - description: 'The source run ID for report path' - required: true - type: string - source_run_number: - description: 'The source run number for artifact naming and comment' - required: true - type: string - source_run_attempt: - description: 'The source run attempt for artifact naming and comment' - required: true - type: string - pr_number: - description: 'The PR number to post comment on' - required: true - type: string -permissions: - contents: write - issues: write - pull-requests: write -jobs: - publish-report: - runs-on: ubuntu-latest - continue-on-error: true - env: - # Unique URL path for each workflow run attempt - HTML_REPORT_URL_PATH: reports/${{ inputs.head_branch }}/${{ inputs.source_run_id }}/${{ inputs.source_run_attempt }} - BRANCH_REPORTS_DIR: reports/${{ inputs.head_branch }} - steps: - - name: Generate GitHub App token - id: generate-token - uses: actions/create-github-app-token@7e473efe3cb98aa54f8d4bac15400b15fad77d94 - with: - app-id: ${{ secrets.CI_CAL_APP_ID }} - private-key: ${{ secrets.CI_CAL_APP_PRIVATE_KEY }} - repositories: 'test-results-2' - - - name: Checkout GitHub Pages Branch - uses: actions/checkout@v4 - with: - repository: calcom/test-results-2 - ref: gh-pages - token: ${{ steps.generate-token.outputs.token }} - - name: Set Git User - # see: https://github.com/actions/checkout/issues/13#issuecomment-724415212 - run: | - git config --global user.name "github-actions[bot]" - git config --global user.email "41898282+github-actions[bot]@users.noreply.github.com" - - name: Check for workflow reports - run: | - if [ -z "$(ls -A $BRANCH_REPORTS_DIR)" ]; then - echo "BRANCH_REPORTS_EXIST="false"" >> $GITHUB_ENV - else - echo "BRANCH_REPORTS_EXIST="true"" >> $GITHUB_ENV - fi - - name: Cleanup old HTML reports - if: ${{ env.BRANCH_REPORTS_EXIST == 'true' }} - timeout-minutes: 3 - env: - HEAD_BRANCH: ${{ inputs.head_branch }} - run: | - rm -rf "$BRANCH_REPORTS_DIR" - git add . - git commit -m "workflow: remove all reports for branch $HEAD_BRANCH" - - name: Download zipped HTML report - uses: actions/download-artifact@v4 - with: - name: html-report--attempt-${{ inputs.source_run_number }}-${{ inputs.source_run_attempt }} - path: ${{ env.HTML_REPORT_URL_PATH }} - - name: Push HTML Report - timeout-minutes: 3 - # commit report, then try push-rebase-loop until it's able to merge the HTML report to the gh-pages branch - # this is necessary when this job running at least twice at the same time (e.g. through two pushes at the same time) - env: - RUN_ID: ${{ inputs.source_run_id }} - RUN_ATTEMPT: ${{ inputs.source_run_attempt }} - run: | - git add . - git commit -m "workflow: add HTML report for run-id $RUN_ID (attempt: $RUN_ATTEMPT)" - - while true; do - git pull --rebase - if [ $? -ne 0 ]; then - echo "Failed to rebase. Please review manually." - exit 1 - fi - - git push - if [ $? -eq 0 ]; then - echo "Successfully pushed HTML report to repo." - exit 0 - fi - done - - name: Output Report URL as Workflow Annotation - id: url - run: | - FULL_HTML_REPORT_URL=https://calcom.github.io/test-results-2/$HTML_REPORT_URL_PATH - echo "::notice title=📋 Published Playwright Test Report::$FULL_HTML_REPORT_URL" - echo "link=$FULL_HTML_REPORT_URL" >> $GITHUB_OUTPUT - - name: Find Comment - uses: peter-evans/find-comment@v2 - id: fc - with: - issue-number: ${{ inputs.pr_number }} - comment-author: "github-actions[bot]" - body-includes: - - name: Create comment - if: steps.fc.outputs.comment-id == '' - uses: peter-evans/create-or-update-comment@v3 - with: - issue-number: ${{ inputs.pr_number }} - body: | - - ## E2E results are ready! - - [Workflow #${{ inputs.source_run_number }}.${{ inputs.source_run_attempt }} latest results](${{ steps.url.outputs.link }}) - - name: Update comment - if: steps.fc.outputs.comment-id != '' - uses: peter-evans/create-or-update-comment@v3 - with: - comment-id: ${{ steps.fc.outputs.comment-id }} - edit-mode: replace - body: | - - ## E2E results are ready! - - [Workflow #${{ inputs.source_run_number }}.${{ inputs.source_run_attempt }} latest results](${{ steps.url.outputs.link }}) diff --git a/.github/workflows/run-ci.yml b/.github/workflows/run-ci.yml deleted file mode 100644 index 00ba78b46bb567..00000000000000 --- a/.github/workflows/run-ci.yml +++ /dev/null @@ -1,125 +0,0 @@ -name: Run CI - -on: - pull_request_target: - types: [labeled] - -permissions: - actions: write - contents: read - -jobs: - trigger: - name: Trigger CI - if: github.event.label.name == 'run-ci' || github.event.label.name == 'ready-for-e2e' - runs-on: ubuntu-latest - steps: - - name: Verify and trigger CI - uses: actions/github-script@v7 - with: - script: | - const adder = context.payload.sender.login; - const senderType = context.payload.sender.type; - const pr = context.payload.pull_request; - - console.log(`Sender: ${adder} (type: ${senderType})`); - - const trustedBotLogins = ['graphite-app[bot]']; - let isAuthorized = false; - - if (senderType === 'Bot' && trustedBotLogins.includes(adder)) { - console.log(`Authorized: trusted GitHub App`); - isAuthorized = true; - } - - if (!isAuthorized) { - const { data: perm } = await github.rest.repos.getCollaboratorPermissionLevel({ - owner: context.repo.owner, - repo: context.repo.repo, - username: adder, - }); - - if (!['admin', 'maintain', 'write'].includes(perm.permission)) { - core.setFailed(`${adder} does not have write access`); - return; - } - - console.log(`Label added by ${adder}`); - } - - // Find the latest pr.yml run for this PR's head SHA - const { data: runs } = await github.rest.actions.listWorkflowRuns({ - owner: context.repo.owner, - repo: context.repo.repo, - workflow_id: 'pr.yml', - head_sha: pr.head.sha, - per_page: 5, - }); - - // Filter runs to this PR (in case same SHA exists in multiple PRs) - const matchingRuns = runs.workflow_runs.filter(run => - !run.pull_requests?.length || run.pull_requests.some(p => p.number === pr.number) - ); - - if (matchingRuns.length === 0) { - core.setFailed(`No PR workflow found for SHA ${pr.head.sha}`); - return; - } - - const latestRun = matchingRuns[0]; - - // If workflow is still running, cancel it first then re-run - if (latestRun.status === 'in_progress' || latestRun.status === 'queued') { - console.log(`Workflow is running (status: ${latestRun.status}). Cancelling it first...`); - - await github.rest.actions.cancelWorkflowRun({ - owner: context.repo.owner, - repo: context.repo.repo, - run_id: latestRun.id, - }); - - // Wait for the workflow to be cancelled (poll with timeout) - const maxWaitTime = 60000; // 60 seconds - const pollInterval = 2000; // 2 seconds - const startTime = Date.now(); - - while (Date.now() - startTime < maxWaitTime) { - await new Promise(resolve => setTimeout(resolve, pollInterval)); - - const { data: updatedRun } = await github.rest.actions.getWorkflowRun({ - owner: context.repo.owner, - repo: context.repo.repo, - run_id: latestRun.id, - }); - - if (updatedRun.status === 'completed') { - console.log(`Workflow cancelled successfully (conclusion: ${updatedRun.conclusion})`); - break; - } - - console.log(`Waiting for workflow to cancel... (status: ${updatedRun.status})`); - } - - // Check final status - const { data: finalRun } = await github.rest.actions.getWorkflowRun({ - owner: context.repo.owner, - repo: context.repo.repo, - run_id: latestRun.id, - }); - - if (finalRun.status !== 'completed') { - core.setFailed(`Timed out waiting for workflow to cancel (status: ${finalRun.status})`); - return; - } - } - - console.log(`Re-running workflow ${latestRun.id} (was: ${latestRun.conclusion || latestRun.status})`); - - // Re-run preserves original context (PR, SHA, etc.) - await github.rest.actions.reRunWorkflow({ - owner: context.repo.owner, - repo: context.repo.repo, - run_id: latestRun.id, - }); - - console.log(`Triggered: ${latestRun.html_url}`); diff --git a/__checks__/csp-login.spec.ts b/__checks__/csp-login.spec.ts index 5b1ba2d10436ac..f6197a3b1212fe 100644 --- a/__checks__/csp-login.spec.ts +++ b/__checks__/csp-login.spec.ts @@ -1,4 +1,4 @@ -import { test, expect } from "@playwright/test"; +import { test, expect } from "@approxima/test"; test.describe("CSP Headers", () => { test("Login page should have CSP header with nonce", async ({ page }) => { diff --git a/apps/web/package.json b/apps/web/package.json index 92303d2a495fd1..ff2a0fb3108a84 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -150,6 +150,7 @@ "zod": "3.25.76" }, "devDependencies": { + "@approxima/test": "0.0.2", "@babel/core": "7.26.10", "@biomejs/biome": "2.3.10", "@calcom/config": "workspace:*", diff --git a/apps/web/playwright/ab-tests-redirect.e2e.ts b/apps/web/playwright/ab-tests-redirect.e2e.ts index c2cd8142156284..e9044d818eaea8 100644 --- a/apps/web/playwright/ab-tests-redirect.e2e.ts +++ b/apps/web/playwright/ab-tests-redirect.e2e.ts @@ -1,4 +1,4 @@ -import { expect } from "@playwright/test"; +import { expect } from "@approxima/test"; import { test } from "./lib/fixtures"; test.describe.configure({ mode: "parallel" }); diff --git a/apps/web/playwright/auth/delete-account.e2e.ts b/apps/web/playwright/auth/delete-account.e2e.ts index 4c576f8bdaa243..75179680410d10 100644 --- a/apps/web/playwright/auth/delete-account.e2e.ts +++ b/apps/web/playwright/auth/delete-account.e2e.ts @@ -1,4 +1,4 @@ -import { expect } from "@playwright/test"; +import { expect } from "@approxima/test"; import { test } from "../lib/fixtures"; diff --git a/apps/web/playwright/auth/forgot-password.e2e.ts b/apps/web/playwright/auth/forgot-password.e2e.ts index 3a53ede82e0fc6..1b57d911678534 100644 --- a/apps/web/playwright/auth/forgot-password.e2e.ts +++ b/apps/web/playwright/auth/forgot-password.e2e.ts @@ -1,4 +1,4 @@ -import { expect } from "@playwright/test"; +import { expect } from "@approxima/test"; import { uuid } from "short-uuid"; import { verifyPassword } from "@calcom/features/auth/lib/verifyPassword"; diff --git a/apps/web/playwright/availability.e2e.ts b/apps/web/playwright/availability.e2e.ts index 0e6d0ef3fe976d..3cca419051f3bd 100644 --- a/apps/web/playwright/availability.e2e.ts +++ b/apps/web/playwright/availability.e2e.ts @@ -1,4 +1,4 @@ -import { expect } from "@playwright/test"; +import { expect } from "@approxima/test"; import dayjs from "@calcom/dayjs"; diff --git a/apps/web/playwright/booking-confirm-reject.e2e.ts b/apps/web/playwright/booking-confirm-reject.e2e.ts index 217ee0c26ffeca..cc26784d772870 100644 --- a/apps/web/playwright/booking-confirm-reject.e2e.ts +++ b/apps/web/playwright/booking-confirm-reject.e2e.ts @@ -1,4 +1,4 @@ -import { expect } from "@playwright/test"; +import { expect } from "@approxima/test"; import { v4 as uuidv4 } from "uuid"; import { prisma } from "@calcom/prisma"; diff --git a/apps/web/playwright/booking-duplicate-api-calls.e2e.ts b/apps/web/playwright/booking-duplicate-api-calls.e2e.ts index f0accf7d34b286..b9d0021a03cbdd 100644 --- a/apps/web/playwright/booking-duplicate-api-calls.e2e.ts +++ b/apps/web/playwright/booking-duplicate-api-calls.e2e.ts @@ -1,5 +1,5 @@ -import { expect } from "@playwright/test"; -import type { Page } from "@playwright/test"; +import { expect } from "@approxima/test"; +import type { Page } from "@approxima/test"; import { test } from "./lib/fixtures"; diff --git a/apps/web/playwright/booking-limits.e2e.ts b/apps/web/playwright/booking-limits.e2e.ts index c5e3da42e986db..b0ae9eb05c6bc8 100644 --- a/apps/web/playwright/booking-limits.e2e.ts +++ b/apps/web/playwright/booking-limits.e2e.ts @@ -2,7 +2,7 @@ * These e2e tests only aim to cover standard cases * Edge cases are currently handled in integration tests only */ -import { expect } from "@playwright/test"; +import { expect } from "@approxima/test"; import type { Dayjs } from "@calcom/dayjs"; import dayjs from "@calcom/dayjs"; diff --git a/apps/web/playwright/booking-pages.e2e.ts b/apps/web/playwright/booking-pages.e2e.ts index 8e4efde9c2b852..c2aa567992e5e4 100644 --- a/apps/web/playwright/booking-pages.e2e.ts +++ b/apps/web/playwright/booking-pages.e2e.ts @@ -2,7 +2,7 @@ import { WEBAPP_URL } from "@calcom/lib/constants"; import { generateHashedLink } from "@calcom/lib/generateHashedLink"; import { randomString } from "@calcom/lib/random"; import type { Schedule, TimeRange } from "@calcom/types/schedule"; -import { expect } from "@playwright/test"; +import { expect } from "@approxima/test"; import { JSDOM } from "jsdom"; import { test, todo } from "./lib/fixtures"; import { diff --git a/apps/web/playwright/booking-phone-autofill.e2e.ts b/apps/web/playwright/booking-phone-autofill.e2e.ts index 848f88cc26dd93..64e94a1dc7e4fd 100644 --- a/apps/web/playwright/booking-phone-autofill.e2e.ts +++ b/apps/web/playwright/booking-phone-autofill.e2e.ts @@ -1,5 +1,5 @@ -import type { Page } from "@playwright/test"; -import { expect } from "@playwright/test"; +import type { Page } from "@approxima/test"; +import { expect } from "@approxima/test"; import type { createUsersFixture } from "playwright/fixtures/users"; import { test } from "./lib/fixtures"; diff --git a/apps/web/playwright/booking-seats.e2e.ts b/apps/web/playwright/booking-seats.e2e.ts index 8b74780610bdd2..b6334ffbc058f3 100644 --- a/apps/web/playwright/booking-seats.e2e.ts +++ b/apps/web/playwright/booking-seats.e2e.ts @@ -1,7 +1,7 @@ import { randomString } from "@calcom/lib/random"; import prisma from "@calcom/prisma"; import { BookingStatus } from "@calcom/prisma/enums"; -import { expect } from "@playwright/test"; +import { expect } from "@approxima/test"; import { v4 as uuidv4 } from "uuid"; import { test } from "./lib/fixtures"; import { diff --git a/apps/web/playwright/booking-sheet-keyboard.e2e.ts b/apps/web/playwright/booking-sheet-keyboard.e2e.ts index 617efdbfcec479..91adedb6643c89 100644 --- a/apps/web/playwright/booking-sheet-keyboard.e2e.ts +++ b/apps/web/playwright/booking-sheet-keyboard.e2e.ts @@ -1,6 +1,6 @@ import { BookingStatus } from "@calcom/prisma/enums"; -import type { Page } from "@playwright/test"; -import { expect } from "@playwright/test"; +import type { Page } from "@approxima/test"; +import { expect } from "@approxima/test"; import type { Fixtures } from "./lib/fixtures"; import { test } from "./lib/fixtures"; diff --git a/apps/web/playwright/cancellation-fee-warning.e2e.ts b/apps/web/playwright/cancellation-fee-warning.e2e.ts index 239944f8ea339b..2b069ad9813167 100644 --- a/apps/web/playwright/cancellation-fee-warning.e2e.ts +++ b/apps/web/playwright/cancellation-fee-warning.e2e.ts @@ -1,4 +1,4 @@ -import { expect } from "@playwright/test"; +import { expect } from "@approxima/test"; import type { EventType } from "@calcom/prisma/client"; diff --git a/apps/web/playwright/change-password.e2e.ts b/apps/web/playwright/change-password.e2e.ts index b37d900eff1d4c..c815033a0aa293 100644 --- a/apps/web/playwright/change-password.e2e.ts +++ b/apps/web/playwright/change-password.e2e.ts @@ -1,4 +1,4 @@ -import { expect } from "@playwright/test"; +import { expect } from "@approxima/test"; import { test } from "./lib/fixtures"; import { submitAndWaitForResponse } from "./lib/testUtils"; diff --git a/apps/web/playwright/change-theme.e2e.ts b/apps/web/playwright/change-theme.e2e.ts index 174f62c6efbf8f..b81f4dd34f38ac 100644 --- a/apps/web/playwright/change-theme.e2e.ts +++ b/apps/web/playwright/change-theme.e2e.ts @@ -1,4 +1,4 @@ -import { expect } from "@playwright/test"; +import { expect } from "@approxima/test"; import { test } from "./lib/fixtures"; diff --git a/apps/web/playwright/change-username.e2e.ts b/apps/web/playwright/change-username.e2e.ts index a44d7020f00eb3..3a6b27c0ba4a58 100644 --- a/apps/web/playwright/change-username.e2e.ts +++ b/apps/web/playwright/change-username.e2e.ts @@ -1,5 +1,5 @@ import { WEBAPP_URL } from "@calcom/lib/constants"; -import { expect } from "@playwright/test"; +import { expect } from "@approxima/test"; import { test } from "./lib/fixtures"; import { IS_STRIPE_ENABLED, submitAndWaitForResponse } from "./lib/testUtils"; diff --git a/apps/web/playwright/duration-limits.e2e.ts b/apps/web/playwright/duration-limits.e2e.ts index 5bbf2e38760ce3..8de1abd4c801c1 100644 --- a/apps/web/playwright/duration-limits.e2e.ts +++ b/apps/web/playwright/duration-limits.e2e.ts @@ -2,7 +2,7 @@ * These e2e tests only aim to cover standard cases * Edge cases are currently handled in integration tests only */ -import { expect } from "@playwright/test"; +import { expect } from "@approxima/test"; import type { Dayjs } from "@calcom/dayjs"; import dayjs from "@calcom/dayjs"; diff --git a/apps/web/playwright/dynamic-booking-pages.e2e.ts b/apps/web/playwright/dynamic-booking-pages.e2e.ts index 301b0958d39ba0..cc4556bc12fff8 100644 --- a/apps/web/playwright/dynamic-booking-pages.e2e.ts +++ b/apps/web/playwright/dynamic-booking-pages.e2e.ts @@ -1,4 +1,4 @@ -import { expect } from "@playwright/test"; +import { expect } from "@approxima/test"; import { test } from "./lib/fixtures"; import { diff --git a/apps/web/playwright/embed-code-generator.e2e.ts b/apps/web/playwright/embed-code-generator.e2e.ts index 85e11fd46e589a..b64a276562f00f 100644 --- a/apps/web/playwright/embed-code-generator.e2e.ts +++ b/apps/web/playwright/embed-code-generator.e2e.ts @@ -2,8 +2,8 @@ import { spawnSync } from "node:child_process"; import { createRequire } from "node:module"; import { EMBED_LIB_URL, WEBAPP_URL } from "@calcom/lib/constants"; import { MembershipRole } from "@calcom/prisma/enums"; -import type { Page } from "@playwright/test"; -import { expect } from "@playwright/test"; +import type { Page } from "@approxima/test"; +import { expect } from "@approxima/test"; import { parse } from "node-html-parser"; import { test } from "./lib/fixtures"; diff --git a/apps/web/playwright/event-types.e2e.ts b/apps/web/playwright/event-types.e2e.ts index 31ab2619048475..e16b3a77320697 100644 --- a/apps/web/playwright/event-types.e2e.ts +++ b/apps/web/playwright/event-types.e2e.ts @@ -1,7 +1,7 @@ import { WEBAPP_URL } from "@calcom/lib/constants"; import { randomString } from "@calcom/lib/random"; -import type { Page } from "@playwright/test"; -import { expect } from "@playwright/test"; +import type { Page } from "@approxima/test"; +import { expect } from "@approxima/test"; import { test } from "./lib/fixtures"; import { diff --git a/apps/web/playwright/filter-helpers.ts b/apps/web/playwright/filter-helpers.ts index 4c8e33d5018919..f2b1e169dd2c2d 100644 --- a/apps/web/playwright/filter-helpers.ts +++ b/apps/web/playwright/filter-helpers.ts @@ -1,5 +1,5 @@ -import type { Page } from "@playwright/test"; -import { expect } from "@playwright/test"; +import type { Page } from "@approxima/test"; +import { expect } from "@approxima/test"; import { submitAndWaitForResponse } from "playwright/lib/testUtils"; // Helper function to get text within a specific table column diff --git a/apps/web/playwright/fixtures/apps.ts b/apps/web/playwright/fixtures/apps.ts index 7ff8f5f4d04591..f71b62c17b0156 100644 --- a/apps/web/playwright/fixtures/apps.ts +++ b/apps/web/playwright/fixtures/apps.ts @@ -1,4 +1,4 @@ -import { expect, type Page } from "@playwright/test"; +import { expect, type Page } from "@approxima/test"; import type { TApp } from "../apps/conferencing/types"; import { diff --git a/apps/web/playwright/fixtures/bookings.ts b/apps/web/playwright/fixtures/bookings.ts index 5a39522950ab36..662b1d580c20e0 100644 --- a/apps/web/playwright/fixtures/bookings.ts +++ b/apps/web/playwright/fixtures/bookings.ts @@ -1,4 +1,4 @@ -import type { Page, WorkerInfo } from "@playwright/test"; +import type { Page, WorkerInfo } from "@approxima/test"; import short from "short-uuid"; import { v5 as uuidv5 } from "uuid"; diff --git a/apps/web/playwright/fixtures/embeds.ts b/apps/web/playwright/fixtures/embeds.ts index cce688bf9632d3..9c9e26b0ffb02f 100644 --- a/apps/web/playwright/fixtures/embeds.ts +++ b/apps/web/playwright/fixtures/embeds.ts @@ -1,4 +1,4 @@ -import type { Page } from "@playwright/test"; +import type { Page } from "@approxima/test"; export const createEmbedsFixture = (page: Page) => { return { diff --git a/apps/web/playwright/fixtures/eventTypes.ts b/apps/web/playwright/fixtures/eventTypes.ts index 6a76220d886b1d..820aa3b4ebff87 100644 --- a/apps/web/playwright/fixtures/eventTypes.ts +++ b/apps/web/playwright/fixtures/eventTypes.ts @@ -1,4 +1,4 @@ -import { expect, type Page } from "@playwright/test"; +import { expect, type Page } from "@approxima/test"; import { localize } from "../lib/localize"; diff --git a/apps/web/playwright/fixtures/features.ts b/apps/web/playwright/fixtures/features.ts index abc11b03cd59f6..09b03a1930e16b 100644 --- a/apps/web/playwright/fixtures/features.ts +++ b/apps/web/playwright/fixtures/features.ts @@ -1,4 +1,4 @@ -import type { Page } from "@playwright/test"; +import type { Page } from "@approxima/test"; import type { AppFlags } from "@calcom/features/flags/config"; import { prisma } from "@calcom/prisma"; diff --git a/apps/web/playwright/fixtures/orgs.ts b/apps/web/playwright/fixtures/orgs.ts index 0719e1dc623911..aa83c5f67e9238 100644 --- a/apps/web/playwright/fixtures/orgs.ts +++ b/apps/web/playwright/fixtures/orgs.ts @@ -1,4 +1,4 @@ -import type { Page } from "@playwright/test"; +import type { Page } from "@approxima/test"; import { prisma } from "@calcom/prisma"; import type { Team } from "@calcom/prisma/client"; diff --git a/apps/web/playwright/fixtures/payments.ts b/apps/web/playwright/fixtures/payments.ts index 8331beee413e8c..d691102afe8f8e 100644 --- a/apps/web/playwright/fixtures/payments.ts +++ b/apps/web/playwright/fixtures/payments.ts @@ -1,4 +1,4 @@ -import type { Page } from "@playwright/test"; +import type { Page } from "@approxima/test"; import { v4 as uuidv4 } from "uuid"; import { prisma } from "@calcom/prisma"; diff --git a/apps/web/playwright/fixtures/regularBookings.ts b/apps/web/playwright/fixtures/regularBookings.ts index cb3311d3a85f2c..5a79a90ca801df 100644 --- a/apps/web/playwright/fixtures/regularBookings.ts +++ b/apps/web/playwright/fixtures/regularBookings.ts @@ -1,4 +1,4 @@ -import { expect, type Page } from "@playwright/test"; +import { expect, type Page } from "@approxima/test"; import type { MembershipRole } from "@calcom/prisma/enums"; diff --git a/apps/web/playwright/fixtures/users.ts b/apps/web/playwright/fixtures/users.ts index 765110e63254a7..fb98cdede1b8c2 100644 --- a/apps/web/playwright/fixtures/users.ts +++ b/apps/web/playwright/fixtures/users.ts @@ -9,8 +9,8 @@ import type { EventType, Prisma, Team, User } from "@calcom/prisma/client"; import { MembershipRole, SchedulingType } from "@calcom/prisma/enums"; import { teamMetadataSchema } from "@calcom/prisma/zod-utils"; import type { Schedule } from "@calcom/types/schedule"; -import type { Browser, Page, WorkerInfo } from "@playwright/test"; -import { expect } from "@playwright/test"; +import type { Browser, Page, WorkerInfo } from "@approxima/test"; +import { expect } from "@approxima/test"; import { hashSync as hash } from "bcryptjs"; import { uuid } from "short-uuid"; import { v4 } from "uuid"; diff --git a/apps/web/playwright/fixtures/webhooks.ts b/apps/web/playwright/fixtures/webhooks.ts index 18a65dea997722..3642c08ceeb090 100644 --- a/apps/web/playwright/fixtures/webhooks.ts +++ b/apps/web/playwright/fixtures/webhooks.ts @@ -1,4 +1,4 @@ -import { expect, type Page } from "@playwright/test"; +import { expect, type Page } from "@approxima/test"; import { createHttpServer } from "../lib/testUtils"; diff --git a/apps/web/playwright/hash-my-url.e2e.ts b/apps/web/playwright/hash-my-url.e2e.ts index 9623022d5449e9..a7c25a0ab99cf5 100644 --- a/apps/web/playwright/hash-my-url.e2e.ts +++ b/apps/web/playwright/hash-my-url.e2e.ts @@ -1,4 +1,4 @@ -import { expect } from "@playwright/test"; +import { expect } from "@approxima/test"; import { test } from "./lib/fixtures"; import { diff --git a/apps/web/playwright/hide-duration-selector.e2e.ts b/apps/web/playwright/hide-duration-selector.e2e.ts index 501aeb78d35fbc..6422a8f10fdf0a 100644 --- a/apps/web/playwright/hide-duration-selector.e2e.ts +++ b/apps/web/playwright/hide-duration-selector.e2e.ts @@ -1,4 +1,4 @@ -import { expect } from "@playwright/test"; +import { expect } from "@approxima/test"; import { test } from "./lib/fixtures"; import { bookTimeSlot, selectFirstAvailableTimeSlotNextMonth } from "./lib/testUtils"; diff --git a/apps/web/playwright/i18n-routing.e2e.ts b/apps/web/playwright/i18n-routing.e2e.ts index 801293d434cf71..323ad37f3b5db1 100644 --- a/apps/web/playwright/i18n-routing.e2e.ts +++ b/apps/web/playwright/i18n-routing.e2e.ts @@ -1,4 +1,4 @@ -import { expect } from "@playwright/test"; +import { expect } from "@approxima/test"; import { test } from "./lib/fixtures"; diff --git a/apps/web/playwright/icons.e2e.ts b/apps/web/playwright/icons.e2e.ts index 15575c18208c7f..83c61d3819d97e 100644 --- a/apps/web/playwright/icons.e2e.ts +++ b/apps/web/playwright/icons.e2e.ts @@ -1,4 +1,4 @@ -import { expect } from "@playwright/test"; +import { expect } from "@approxima/test"; import { test } from "./lib/fixtures"; diff --git a/apps/web/playwright/icons.e2e.ts-snapshots/icons--calcom-web-darwin.png b/apps/web/playwright/icons.e2e.ts-snapshots/icons--calcom-web-darwin.png new file mode 100644 index 00000000000000..28b7b6ab2b95f2 Binary files /dev/null and b/apps/web/playwright/icons.e2e.ts-snapshots/icons--calcom-web-darwin.png differ diff --git a/apps/web/playwright/lib/chart-helpers.ts b/apps/web/playwright/lib/chart-helpers.ts index 9f63f4ab0cd49c..bbe0db5d4b2021 100644 --- a/apps/web/playwright/lib/chart-helpers.ts +++ b/apps/web/playwright/lib/chart-helpers.ts @@ -1,4 +1,4 @@ -import { expect, type Page } from "@playwright/test"; +import { expect, type Page } from "@approxima/test"; export type ChartLoadingState = "initial" | "loading" | "loaded" | "error"; diff --git a/apps/web/playwright/lib/fixtures.ts b/apps/web/playwright/lib/fixtures.ts index 8aa6a8a408cba1..45d4ead47b7a45 100644 --- a/apps/web/playwright/lib/fixtures.ts +++ b/apps/web/playwright/lib/fixtures.ts @@ -1,5 +1,5 @@ -import type { Page } from "@playwright/test"; -import { test as base } from "@playwright/test"; +import type { Page } from "@approxima/test"; +import { test as base } from "@approxima/test"; // eslint-disable-next-line no-restricted-imports import { noop } from "lodash"; diff --git a/apps/web/playwright/lib/pageObject.ts b/apps/web/playwright/lib/pageObject.ts index 95ae87ebe18c0f..6f4a742dda9cd3 100644 --- a/apps/web/playwright/lib/pageObject.ts +++ b/apps/web/playwright/lib/pageObject.ts @@ -1,4 +1,4 @@ -import type { Page } from "@playwright/test"; +import type { Page } from "@approxima/test"; export const selectInteractions = { async chooseOption({ diff --git a/apps/web/playwright/lib/testUtils.ts b/apps/web/playwright/lib/testUtils.ts index bf69cf246ed51a..3e8ae66ab0189c 100644 --- a/apps/web/playwright/lib/testUtils.ts +++ b/apps/web/playwright/lib/testUtils.ts @@ -6,8 +6,8 @@ import process from "node:process"; import type { IntervalLimit } from "@calcom/lib/intervalLimits/intervalLimitSchema"; import type { Prisma } from "@calcom/prisma/client"; import { BookingStatus, SchedulingType } from "@calcom/prisma/enums"; -import type { Frame, Page, Request as PlaywrightRequest } from "@playwright/test"; -import { expect } from "@playwright/test"; +import type { Frame, Page, Request as PlaywrightRequest } from "@approxima/test"; +import { expect } from "@approxima/test"; import type { Messages } from "mailhog"; import { totp } from "otplib"; import { v4 as uuid } from "uuid"; diff --git a/apps/web/playwright/locale.e2e.ts b/apps/web/playwright/locale.e2e.ts index 2b9c1836de02af..eea7d9bfce8efd 100644 --- a/apps/web/playwright/locale.e2e.ts +++ b/apps/web/playwright/locale.e2e.ts @@ -1,4 +1,4 @@ -import { expect } from "@playwright/test"; +import { expect } from "@approxima/test"; import { test } from "./lib/fixtures"; import { submitAndWaitForResponse } from "./lib/testUtils"; diff --git a/apps/web/playwright/login.2fa.e2e.ts b/apps/web/playwright/login.2fa.e2e.ts index 7a01caf547a276..3e1083e1453669 100644 --- a/apps/web/playwright/login.2fa.e2e.ts +++ b/apps/web/playwright/login.2fa.e2e.ts @@ -1,5 +1,5 @@ -import type { Page } from "@playwright/test"; -import { expect } from "@playwright/test"; +import type { Page } from "@approxima/test"; +import { expect } from "@approxima/test"; import { authenticator } from "otplib"; import { symmetricDecrypt } from "@calcom/lib/crypto"; diff --git a/apps/web/playwright/login.api.e2e.ts b/apps/web/playwright/login.api.e2e.ts index 83e1f64cd66c60..464e9f591a478b 100644 --- a/apps/web/playwright/login.api.e2e.ts +++ b/apps/web/playwright/login.api.e2e.ts @@ -1,4 +1,4 @@ -import { expect } from "@playwright/test"; +import { expect } from "@approxima/test"; import { test } from "./lib/fixtures"; diff --git a/apps/web/playwright/login.e2e.ts b/apps/web/playwright/login.e2e.ts index 3a898e56299640..cf85662296d605 100644 --- a/apps/web/playwright/login.e2e.ts +++ b/apps/web/playwright/login.e2e.ts @@ -1,4 +1,4 @@ -import { expect } from "@playwright/test"; +import { expect } from "@approxima/test"; import { login } from "./fixtures/users"; import { test } from "./lib/fixtures"; diff --git a/apps/web/playwright/login.oauth.e2e.ts b/apps/web/playwright/login.oauth.e2e.ts index d218c8e40ec4c2..5c29a6ecd5f484 100644 --- a/apps/web/playwright/login.oauth.e2e.ts +++ b/apps/web/playwright/login.oauth.e2e.ts @@ -1,4 +1,4 @@ -import { expect, test } from "@playwright/test"; +import { expect, test } from "@approxima/test"; import { IS_GOOGLE_LOGIN_ENABLED } from "../server/lib/constants"; diff --git a/apps/web/playwright/manage-booking-questions.e2e.ts b/apps/web/playwright/manage-booking-questions.e2e.ts index cefbbb1eff346f..e3103129f98194 100644 --- a/apps/web/playwright/manage-booking-questions.e2e.ts +++ b/apps/web/playwright/manage-booking-questions.e2e.ts @@ -1,5 +1,5 @@ -import type { Locator, Page, PlaywrightTestArgs } from "@playwright/test"; -import { expect } from "@playwright/test"; +import type { Locator, Page, PlaywrightTestArgs } from "@approxima/test"; +import { expect } from "@approxima/test"; import type { createUsersFixture } from "playwright/fixtures/users"; import { uuid } from "short-uuid"; diff --git a/apps/web/playwright/oauth-provider.e2e.ts b/apps/web/playwright/oauth-provider.e2e.ts index a4e6dd0677adcd..3f825c69e7b0d1 100644 --- a/apps/web/playwright/oauth-provider.e2e.ts +++ b/apps/web/playwright/oauth-provider.e2e.ts @@ -1,4 +1,4 @@ -import { expect } from "@playwright/test"; +import { expect } from "@approxima/test"; import { createHash, randomBytes } from "node:crypto"; import { OAUTH_ERROR_REASONS } from "@calcom/features/oauth/services/OAuthService"; diff --git a/apps/web/playwright/oauth/oauth-authorize-approval-status.e2e.ts b/apps/web/playwright/oauth/oauth-authorize-approval-status.e2e.ts index 84a1e386babf28..0b8f3513ac1f6e 100644 --- a/apps/web/playwright/oauth/oauth-authorize-approval-status.e2e.ts +++ b/apps/web/playwright/oauth/oauth-authorize-approval-status.e2e.ts @@ -1,7 +1,7 @@ import { randomBytes } from "node:crypto"; import { OAUTH_ERROR_REASONS } from "@calcom/features/oauth/services/OAuthService"; import type { PrismaClient } from "@calcom/prisma"; -import { expect } from "@playwright/test"; +import { expect } from "@approxima/test"; import { test } from "../lib/fixtures"; test.describe("OAuth authorize - client approval status", () => { diff --git a/apps/web/playwright/oauth/oauth-client-admin.e2e.ts b/apps/web/playwright/oauth/oauth-client-admin.e2e.ts index 4e05e9c74cd700..8b5328c64fd6db 100644 --- a/apps/web/playwright/oauth/oauth-client-admin.e2e.ts +++ b/apps/web/playwright/oauth/oauth-client-admin.e2e.ts @@ -1,5 +1,5 @@ import type { PrismaClient } from "@calcom/prisma"; -import { expect, type Page } from "@playwright/test"; +import { expect, type Page } from "@approxima/test"; import { test } from "../lib/fixtures"; import { closeOAuthClientDetails, diff --git a/apps/web/playwright/oauth/oauth-client-helpers.ts b/apps/web/playwright/oauth/oauth-client-helpers.ts index b6f449b4f8e705..079072093296be 100644 --- a/apps/web/playwright/oauth/oauth-client-helpers.ts +++ b/apps/web/playwright/oauth/oauth-client-helpers.ts @@ -1,4 +1,4 @@ -import { expect, type Locator, type Page } from "@playwright/test"; +import { expect, type Locator, type Page } from "@approxima/test"; import path from "node:path"; export async function loginAsSeededAdmin(page: Page) { diff --git a/apps/web/playwright/oauth/oauth-client-owner-crud.e2e.ts b/apps/web/playwright/oauth/oauth-client-owner-crud.e2e.ts index adb0d319419934..adddfac65423b2 100644 --- a/apps/web/playwright/oauth/oauth-client-owner-crud.e2e.ts +++ b/apps/web/playwright/oauth/oauth-client-owner-crud.e2e.ts @@ -1,7 +1,7 @@ import path from "node:path"; import type { PrismaClient } from "@calcom/prisma"; import type { OAuthClientType } from "@calcom/prisma/enums"; -import { expect, type Locator, type Page } from "@playwright/test"; +import { expect, type Locator, type Page } from "@approxima/test"; import { test } from "../lib/fixtures"; async function loginAsSeededAdminAndGoToOAuthSettings(page: Page) { diff --git a/apps/web/playwright/oauth/oauth-refresh-tokens.e2e.ts b/apps/web/playwright/oauth/oauth-refresh-tokens.e2e.ts index e884a000d98283..79b01f3fd77b1a 100644 --- a/apps/web/playwright/oauth/oauth-refresh-tokens.e2e.ts +++ b/apps/web/playwright/oauth/oauth-refresh-tokens.e2e.ts @@ -1,4 +1,4 @@ -import { expect } from "@playwright/test"; +import { expect } from "@approxima/test"; import { randomBytes } from "node:crypto"; import jwt from "jsonwebtoken"; diff --git a/apps/web/playwright/onboarding.e2e.ts b/apps/web/playwright/onboarding.e2e.ts index ebe147363926ba..51721313bbddec 100644 --- a/apps/web/playwright/onboarding.e2e.ts +++ b/apps/web/playwright/onboarding.e2e.ts @@ -1,5 +1,5 @@ import { IdentityProvider } from "@calcom/prisma/enums"; -import { expect } from "@playwright/test"; +import { expect } from "@approxima/test"; import { test } from "./lib/fixtures"; test.describe.configure({ mode: "parallel" }); diff --git a/apps/web/playwright/out-of-office.e2e.ts b/apps/web/playwright/out-of-office.e2e.ts index ee5e4be957c92a..0291c4431b3941 100644 --- a/apps/web/playwright/out-of-office.e2e.ts +++ b/apps/web/playwright/out-of-office.e2e.ts @@ -1,5 +1,5 @@ -import type { Page } from "@playwright/test"; -import { expect } from "@playwright/test"; +import type { Page } from "@approxima/test"; +import { expect } from "@approxima/test"; import { v4 as uuidv4 } from "uuid"; import dayjs from "@calcom/dayjs"; diff --git a/apps/web/playwright/payment-apps.e2e.ts b/apps/web/playwright/payment-apps.e2e.ts index e7875cb297a235..103d6defdf7e31 100644 --- a/apps/web/playwright/payment-apps.e2e.ts +++ b/apps/web/playwright/payment-apps.e2e.ts @@ -1,6 +1,6 @@ import prisma from "@calcom/prisma"; -import type { Page } from "@playwright/test"; -import { expect } from "@playwright/test"; +import type { Page } from "@approxima/test"; +import { expect } from "@approxima/test"; import { test } from "./lib/fixtures"; import { IS_STRIPE_ENABLED, selectFirstAvailableTimeSlotNextMonth, submitAndWaitForResponse } from "./lib/testUtils"; diff --git a/apps/web/playwright/payment.e2e.ts b/apps/web/playwright/payment.e2e.ts index 0f7a677450fbaf..85af91e560f6d9 100644 --- a/apps/web/playwright/payment.e2e.ts +++ b/apps/web/playwright/payment.e2e.ts @@ -1,4 +1,4 @@ -import { expect } from "@playwright/test"; +import { expect } from "@approxima/test"; import { bookTimeSlot, selectFirstAvailableTimeSlotNextMonth } from "@calcom/web/playwright/lib/testUtils"; diff --git a/apps/web/playwright/profile.e2e.ts b/apps/web/playwright/profile.e2e.ts index 72408fb3a2db03..33bf00e5093cf0 100644 --- a/apps/web/playwright/profile.e2e.ts +++ b/apps/web/playwright/profile.e2e.ts @@ -1,5 +1,5 @@ -import { expect } from "@playwright/test"; -import type { Page } from "@playwright/test"; +import { expect } from "@approxima/test"; +import type { Page } from "@approxima/test"; import type { createUsersFixture } from "./fixtures/users"; import { WEBAPP_URL } from "@calcom/lib/constants"; diff --git a/apps/web/playwright/reschedule.e2e.ts b/apps/web/playwright/reschedule.e2e.ts index 6867e1239d5303..4d628c30fab998 100644 --- a/apps/web/playwright/reschedule.e2e.ts +++ b/apps/web/playwright/reschedule.e2e.ts @@ -1,4 +1,4 @@ -import { expect } from "@playwright/test"; +import { expect } from "@approxima/test"; import dayjs from "@calcom/dayjs"; import { prisma } from "@calcom/prisma"; diff --git a/apps/web/playwright/settings-admin.e2e.ts b/apps/web/playwright/settings-admin.e2e.ts index 3df06eda63f754..6d3a3d86f80362 100644 --- a/apps/web/playwright/settings-admin.e2e.ts +++ b/apps/web/playwright/settings-admin.e2e.ts @@ -1,4 +1,4 @@ -import { expect } from "@playwright/test"; +import { expect } from "@approxima/test"; import { test } from "./lib/fixtures"; diff --git a/apps/web/playwright/settings/upload-avatar.e2e.ts b/apps/web/playwright/settings/upload-avatar.e2e.ts index 9dd34c5d8c603a..960d62719957b0 100644 --- a/apps/web/playwright/settings/upload-avatar.e2e.ts +++ b/apps/web/playwright/settings/upload-avatar.e2e.ts @@ -1,4 +1,4 @@ -import { expect } from "@playwright/test"; +import { expect } from "@approxima/test"; import path from "node:path"; import { CAL_URL } from "@calcom/lib/constants"; diff --git a/apps/web/playwright/signup.e2e.ts b/apps/web/playwright/signup.e2e.ts index 8e636f5598a5de..4230529b6bbd24 100644 --- a/apps/web/playwright/signup.e2e.ts +++ b/apps/web/playwright/signup.e2e.ts @@ -2,8 +2,8 @@ import { randomBytes } from "node:crypto"; import process from "node:process"; import { APP_NAME, IS_MAILHOG_ENABLED } from "@calcom/lib/constants"; import prisma from "@calcom/prisma"; -import type { Page } from "@playwright/test"; -import { expect } from "@playwright/test"; +import type { Page } from "@approxima/test"; +import { expect } from "@approxima/test"; import { IS_GOOGLE_LOGIN_ENABLED } from "../server/lib/constants"; import { test } from "./lib/fixtures"; import { getEmailsReceivedByUser } from "./lib/testUtils"; diff --git a/apps/web/playwright/team/expects.ts b/apps/web/playwright/team/expects.ts index 09ce139971c680..4a6f1e45e8c207 100644 --- a/apps/web/playwright/team/expects.ts +++ b/apps/web/playwright/team/expects.ts @@ -1,5 +1,5 @@ -import type { Page } from "@playwright/test"; -import { expect } from "@playwright/test"; +import type { Page } from "@approxima/test"; +import { expect } from "@approxima/test"; import { JSDOM } from "jsdom"; import type { Messages } from "mailhog"; import type { createEmailsFixture } from "playwright/fixtures/emails"; diff --git a/apps/web/playwright/webhook.e2e.ts b/apps/web/playwright/webhook.e2e.ts index 9d0dda61f570f0..0563ac88f4f8a5 100644 --- a/apps/web/playwright/webhook.e2e.ts +++ b/apps/web/playwright/webhook.e2e.ts @@ -1,7 +1,7 @@ import dayjs from "@calcom/dayjs"; import prisma from "@calcom/prisma"; import { BookingStatus } from "@calcom/prisma/enums"; -import { expect } from "@playwright/test"; +import { expect } from "@approxima/test"; import { v4 as uuidv4 } from "uuid"; import { test } from "./lib/fixtures"; import { diff --git a/apps/web/playwright/wipe-my-cal.e2e.ts b/apps/web/playwright/wipe-my-cal.e2e.ts index dcea3796d9bf82..5ae0af20afb88a 100644 --- a/apps/web/playwright/wipe-my-cal.e2e.ts +++ b/apps/web/playwright/wipe-my-cal.e2e.ts @@ -1,4 +1,4 @@ -import { expect } from "@playwright/test"; +import { expect } from "@approxima/test"; import _dayjs from "@calcom/dayjs"; import prisma from "@calcom/prisma"; diff --git a/currents.config.ts b/currents.config.ts new file mode 100644 index 00000000000000..7b0d7a49ecf340 --- /dev/null +++ b/currents.config.ts @@ -0,0 +1,8 @@ +import type { CurrentsConfig } from "@currents/playwright"; + +const config: CurrentsConfig = { + recordKey: process.env.CURRENTS_RECORD_KEY!, + projectId: process.env.CURRENTS_PROJECT_ID!, +}; + +export default config; diff --git a/package.json b/package.json index 746985df394741..8b27970d0010a3 100644 --- a/package.json +++ b/package.json @@ -85,9 +85,11 @@ "lint-staged": "lint-staged" }, "devDependencies": { + "@approxima/test": "0.0.2", "@biomejs/biome": "2.3.10", "@changesets/changelog-github": "0.5.1", "@changesets/cli": "2.29.4", + "@currents/playwright": "^1.23.2", "@faker-js/faker": "9.2.0", "@jetstreamapp/soql-parser-js": "6.1.0", "@playwright/test": "1.57.0", diff --git a/packages/app-store/googlecalendar/tests/google-calendar.e2e.ts b/packages/app-store/googlecalendar/tests/google-calendar.e2e.ts index 36240d597b5416..a22a27aef823fc 100644 --- a/packages/app-store/googlecalendar/tests/google-calendar.e2e.ts +++ b/packages/app-store/googlecalendar/tests/google-calendar.e2e.ts @@ -1,5 +1,5 @@ -import { expect } from "@playwright/test"; -import type { Page } from "@playwright/test"; +import { expect } from "@approxima/test"; +import type { Page } from "@approxima/test"; import dayjs from "@calcom/dayjs"; import { APP_CREDENTIAL_SHARING_ENABLED } from "@calcom/lib/constants"; diff --git a/packages/app-store/googlecalendar/tests/testUtils.ts b/packages/app-store/googlecalendar/tests/testUtils.ts index da391734f947e9..a19b531ddafd20 100644 --- a/packages/app-store/googlecalendar/tests/testUtils.ts +++ b/packages/app-store/googlecalendar/tests/testUtils.ts @@ -1,6 +1,6 @@ import { calendar_v3 } from "@googleapis/calendar"; -import type { Page } from "@playwright/test"; -import { expect } from "@playwright/test"; +import type { Page } from "@approxima/test"; +import { expect } from "@approxima/test"; import prisma from "@calcom/prisma"; import type { Prisma } from "@calcom/prisma/client"; diff --git a/packages/embeds/embed-core/package.json b/packages/embeds/embed-core/package.json index 50147ba27e6321..8f2d248f28a31c 100644 --- a/packages/embeds/embed-core/package.json +++ b/packages/embeds/embed-core/package.json @@ -41,6 +41,7 @@ "dist" ], "devDependencies": { + "@approxima/test": "0.0.2", "@biomejs/biome": "2.3.10", "@playwright/test": "1.57.0", "@tailwindcss/cli": "4.1.16", diff --git a/packages/embeds/embed-core/playwright/lib/pages/bookingSuccessPage.ts b/packages/embeds/embed-core/playwright/lib/pages/bookingSuccessPage.ts index e7f01cc324fdc5..efdd631e2e29be 100644 --- a/packages/embeds/embed-core/playwright/lib/pages/bookingSuccessPage.ts +++ b/packages/embeds/embed-core/playwright/lib/pages/bookingSuccessPage.ts @@ -1,5 +1,5 @@ -import type { Frame } from "@playwright/test"; -import { expect } from "@playwright/test"; +import type { Frame } from "@approxima/test"; +import { expect } from "@approxima/test"; export async function expectHostsToBe({ hosts, frame }: { hosts: { email: string }[]; frame: Frame }) { try { diff --git a/packages/embeds/embed-core/playwright/lib/testUtils.ts b/packages/embeds/embed-core/playwright/lib/testUtils.ts index c75d7876ba7ccd..59e1f53a755995 100644 --- a/packages/embeds/embed-core/playwright/lib/testUtils.ts +++ b/packages/embeds/embed-core/playwright/lib/testUtils.ts @@ -1,5 +1,5 @@ -import type { Page, Frame } from "@playwright/test"; -import { expect } from "@playwright/test"; +import type { Page, Frame } from "@approxima/test"; +import { expect } from "@approxima/test"; import prisma from "@calcom/prisma"; diff --git a/packages/embeds/embed-core/playwright/tests/action-based.e2e.ts b/packages/embeds/embed-core/playwright/tests/action-based.e2e.ts index 4cc02378e5d056..687b27971dc0cc 100644 --- a/packages/embeds/embed-core/playwright/tests/action-based.e2e.ts +++ b/packages/embeds/embed-core/playwright/tests/action-based.e2e.ts @@ -1,5 +1,5 @@ -import type { Page } from "@playwright/test"; -import { expect } from "@playwright/test"; +import type { Page } from "@approxima/test"; +import { expect } from "@approxima/test"; import { test, todo } from "@calcom/web/playwright/lib/fixtures"; import type { Fixtures } from "@calcom/web/playwright/lib/fixtures"; diff --git a/packages/embeds/embed-core/playwright/tests/embed-pages.e2e.ts b/packages/embeds/embed-core/playwright/tests/embed-pages.e2e.ts index 8d8c359654a0e6..d84c5cd271fdcd 100644 --- a/packages/embeds/embed-core/playwright/tests/embed-pages.e2e.ts +++ b/packages/embeds/embed-core/playwright/tests/embed-pages.e2e.ts @@ -1,4 +1,4 @@ -import { expect } from "@playwright/test"; +import { expect } from "@approxima/test"; // eslint-disable-next-line no-restricted-imports import { test } from "@calcom/web/playwright/lib/fixtures"; diff --git a/packages/embeds/embed-core/playwright/tests/inline.e2e.ts b/packages/embeds/embed-core/playwright/tests/inline.e2e.ts index 446b6d15fdc0f1..c0425f3081fbf7 100644 --- a/packages/embeds/embed-core/playwright/tests/inline.e2e.ts +++ b/packages/embeds/embed-core/playwright/tests/inline.e2e.ts @@ -1,4 +1,4 @@ -import { expect } from "@playwright/test"; +import { expect } from "@approxima/test"; import { test, todo } from "@calcom/web/playwright/lib/fixtures"; diff --git a/packages/embeds/embed-core/playwright/tests/namespacing.e2e.ts b/packages/embeds/embed-core/playwright/tests/namespacing.e2e.ts index 671e864c59a895..9e7a378f72e3e0 100644 --- a/packages/embeds/embed-core/playwright/tests/namespacing.e2e.ts +++ b/packages/embeds/embed-core/playwright/tests/namespacing.e2e.ts @@ -1,4 +1,4 @@ -import { expect } from "@playwright/test"; +import { expect } from "@approxima/test"; import { test } from "@calcom/web/playwright/lib/fixtures"; diff --git a/packages/embeds/embed-core/playwright/tests/preview.e2e.ts b/packages/embeds/embed-core/playwright/tests/preview.e2e.ts index 585e5f26ae11a2..111d1ba49c7611 100644 --- a/packages/embeds/embed-core/playwright/tests/preview.e2e.ts +++ b/packages/embeds/embed-core/playwright/tests/preview.e2e.ts @@ -1,4 +1,4 @@ -import { expect } from "@playwright/test"; +import { expect } from "@approxima/test"; import { test } from "@calcom/web/playwright/lib/fixtures"; diff --git a/packages/embeds/embed-core/playwright/tests/two-step-slot-selection.e2e.ts b/packages/embeds/embed-core/playwright/tests/two-step-slot-selection.e2e.ts index e2b84a29a0353f..1dafbb3809a759 100644 --- a/packages/embeds/embed-core/playwright/tests/two-step-slot-selection.e2e.ts +++ b/packages/embeds/embed-core/playwright/tests/two-step-slot-selection.e2e.ts @@ -1,5 +1,5 @@ import { test } from "@calcom/web/playwright/lib/fixtures"; -import { expect } from "@playwright/test"; +import { expect } from "@approxima/test"; import { deleteAllBookingsByEmail, ensureEmbedIframe, getBooking } from "../lib/testUtils"; // Mobile viewport dimensions diff --git a/packages/embeds/embed-react/package.json b/packages/embeds/embed-react/package.json index cfb1d20e516638..299d8e6accf53c 100644 --- a/packages/embeds/embed-react/package.json +++ b/packages/embeds/embed-react/package.json @@ -44,6 +44,7 @@ } }, "devDependencies": { + "@approxima/test": "0.0.2", "@playwright/test": "1.57.0", "@types/react": "18.0.26", "@types/react-dom": "18.2.6", diff --git a/packages/embeds/embed-react/playwright/tests/basic.e2e.ts b/packages/embeds/embed-react/playwright/tests/basic.e2e.ts index fa3ca6a978262b..d2467cc4ac4b47 100644 --- a/packages/embeds/embed-react/playwright/tests/basic.e2e.ts +++ b/packages/embeds/embed-react/playwright/tests/basic.e2e.ts @@ -1,4 +1,4 @@ -import { expect } from "@playwright/test"; +import { expect } from "@approxima/test"; import { getEmbedIframe } from "@calcom/embed-core/playwright/lib/testUtils"; diff --git a/packages/platform/examples/base/currents.config.ts b/packages/platform/examples/base/currents.config.ts new file mode 100644 index 00000000000000..7b0d7a49ecf340 --- /dev/null +++ b/packages/platform/examples/base/currents.config.ts @@ -0,0 +1,8 @@ +import type { CurrentsConfig } from "@currents/playwright"; + +const config: CurrentsConfig = { + recordKey: process.env.CURRENTS_RECORD_KEY!, + projectId: process.env.CURRENTS_PROJECT_ID!, +}; + +export default config; diff --git a/packages/platform/examples/base/package.json b/packages/platform/examples/base/package.json index 229c82e4c6ee6c..4cc21b9d1a4ec5 100644 --- a/packages/platform/examples/base/package.json +++ b/packages/platform/examples/base/package.json @@ -20,6 +20,7 @@ "react-select": "5.8.0" }, "devDependencies": { + "@approxima/test": "0.0.2", "@playwright/test": "1.57.0", "@tailwindcss/postcss": "4.1.15", "@types/node": "20.17.23", diff --git a/packages/platform/examples/base/playwright.config.ts b/packages/platform/examples/base/playwright.config.ts index 7a81bb3e36df76..9c90f9743d704b 100644 --- a/packages/platform/examples/base/playwright.config.ts +++ b/packages/platform/examples/base/playwright.config.ts @@ -1,4 +1,5 @@ -import { defineConfig, devices } from "@playwright/test"; +import { currentsReporter } from "@currents/playwright"; +import { defineConfig, devices } from "@approxima/test"; import dotenv from "dotenv"; import path from "node:path" @@ -20,12 +21,15 @@ export default defineConfig({ reporter: [ ["list"], ["html", { outputFolder: "./test-results/reports/playwright-html-report", open: "never" }], + ...(process.env.CURRENTS_RECORD_KEY ? [currentsReporter()] : []), ], outputDir: "./test-results/results", use: { baseURL: "http://localhost:4322", locale: "en-US", - trace: "retain-on-failure", + trace: "on", + video: "on", + screenshot: "on", headless, }, projects: [ diff --git a/packages/platform/examples/base/tests/availability-settings-atom/availability-settings-atom.e2e.ts b/packages/platform/examples/base/tests/availability-settings-atom/availability-settings-atom.e2e.ts index 2f741fecd2bb1d..99a7f6283c35b4 100644 --- a/packages/platform/examples/base/tests/availability-settings-atom/availability-settings-atom.e2e.ts +++ b/packages/platform/examples/base/tests/availability-settings-atom/availability-settings-atom.e2e.ts @@ -1,5 +1,5 @@ -import { test, expect } from "@playwright/test"; -import type { Page } from "@playwright/test"; +import { test, expect } from "@approxima/test"; +import type { Page } from "@approxima/test"; async function selectOption(page: Page, optionNumber: number) { for (let i = 0; i < optionNumber; i++) { diff --git a/packages/platform/examples/base/tests/booker-atom/booker-atom.e2e.ts b/packages/platform/examples/base/tests/booker-atom/booker-atom.e2e.ts index 4a342f4b10a3cc..c3f27624c92e66 100644 --- a/packages/platform/examples/base/tests/booker-atom/booker-atom.e2e.ts +++ b/packages/platform/examples/base/tests/booker-atom/booker-atom.e2e.ts @@ -1,5 +1,5 @@ -import { test, expect } from "@playwright/test"; -import type { Page } from "@playwright/test"; +import { test, expect } from "@approxima/test"; +import type { Page } from "@approxima/test"; async function selectOption(page: Page, optionNumber: number) { for (let i = 0; i < optionNumber; i++) { diff --git a/packages/platform/examples/base/tests/connect-atoms/apple-connect.e2e.ts b/packages/platform/examples/base/tests/connect-atoms/apple-connect.e2e.ts index eed8380b0330ec..bcf5b62827d7db 100644 --- a/packages/platform/examples/base/tests/connect-atoms/apple-connect.e2e.ts +++ b/packages/platform/examples/base/tests/connect-atoms/apple-connect.e2e.ts @@ -1,4 +1,4 @@ -import { test, expect } from "@playwright/test"; +import { test, expect } from "@approxima/test"; test("connect calendar using the apple connect atom", async ({ page }) => { const appleId = process.env.ATOMS_E2E_APPLE_ID; diff --git a/packages/platform/examples/base/tests/create-event-type-atom/create-event-type.e2e.ts b/packages/platform/examples/base/tests/create-event-type-atom/create-event-type.e2e.ts index d0094357553fab..9d84b82902c679 100644 --- a/packages/platform/examples/base/tests/create-event-type-atom/create-event-type.e2e.ts +++ b/packages/platform/examples/base/tests/create-event-type-atom/create-event-type.e2e.ts @@ -1,4 +1,4 @@ -import { test, expect } from "@playwright/test"; +import { test, expect } from "@approxima/test"; import { generateRandomText } from "../../src/lib/generateRandomText"; diff --git a/packages/platform/examples/base/tests/create-team-event-type-atom/create-team-event-type.e2e.ts b/packages/platform/examples/base/tests/create-team-event-type-atom/create-team-event-type.e2e.ts index 6253cbb963e1e0..9478dd79a00c39 100644 --- a/packages/platform/examples/base/tests/create-team-event-type-atom/create-team-event-type.e2e.ts +++ b/packages/platform/examples/base/tests/create-team-event-type-atom/create-team-event-type.e2e.ts @@ -1,4 +1,4 @@ -import { test, expect } from "@playwright/test"; +import { test, expect } from "@approxima/test"; import { generateRandomText } from "../../src/lib/generateRandomText"; diff --git a/playwright.config.ts b/playwright.config.ts index f0e72806f9c72d..493f75239b2e0c 100644 --- a/playwright.config.ts +++ b/playwright.config.ts @@ -1,5 +1,6 @@ -import type { Frame, PlaywrightTestConfig } from "@playwright/test"; -import { devices, expect } from "@playwright/test"; +import { currentsReporter } from "@currents/playwright"; +import type { Frame, PlaywrightTestConfig } from "@approxima/test"; +import { devices, expect } from "@approxima/test"; import dotEnv from "dotenv"; import * as os from "node:os"; import * as path from "node:path"; @@ -101,16 +102,19 @@ const config: PlaywrightTestConfig = { maxFailures: headless ? 10 : undefined, fullyParallel: true, reporter: [ - [process.env.CI ? "blob" : "list"], + ["list"], ["html", { outputFolder: "./test-results/reports/playwright-html-report", open: "never" }], ["junit", { outputFile: "./test-results/reports/results.xml" }], + ...(process.env.CURRENTS_RECORD_KEY ? [currentsReporter()] : []), ], outputDir: path.join(outputDir, "results"), webServer, use: { baseURL: process.env.NEXT_PUBLIC_WEBAPP_URL, locale: "en-US", - trace: "retain-on-failure", + trace: "on", + video: "on", + screenshot: "on", headless, }, projects: [ diff --git a/yarn.lock b/yarn.lock index 9e32fd238b1dce..a66d2afd515a73 100644 --- a/yarn.lock +++ b/yarn.lock @@ -290,6 +290,15 @@ __metadata: languageName: node linkType: hard +"@approxima/test@npm:0.0.2": + version: 0.0.2 + resolution: "@approxima/test@npm:0.0.2" + peerDependencies: + "@playwright/test": ">=1.50.0" + checksum: 10/9ab3147c86ef5cbc04059532c8e6af50b41f27517b472bfc38c752af29203bc9ac900902bdb5469578a97261cb4ea2788f26612a6d432ba70ea581bf330fcc4a + languageName: node + linkType: hard + "@ardatan/relay-compiler@npm:^12.0.3": version: 12.0.3 resolution: "@ardatan/relay-compiler@npm:12.0.3" @@ -1136,6 +1145,17 @@ __metadata: languageName: node linkType: hard +"@babel/code-frame@npm:^7.29.0": + version: 7.29.0 + resolution: "@babel/code-frame@npm:7.29.0" + dependencies: + "@babel/helper-validator-identifier": "npm:^7.28.5" + js-tokens: "npm:^4.0.0" + picocolors: "npm:^1.1.1" + checksum: 10/199e15ff89007dd30675655eec52481cb245c9fdf4f81e4dc1f866603b0217b57aff25f5ffa0a95bbc8e31eb861695330cd7869ad52cc211aa63016320ef72c5 + languageName: node + linkType: hard + "@babel/compat-data@npm:^7.26.8": version: 7.26.8 resolution: "@babel/compat-data@npm:7.26.8" @@ -2125,6 +2145,7 @@ __metadata: version: 0.0.0-use.local resolution: "@calcom/base@workspace:packages/platform/examples/base" dependencies: + "@approxima/test": "npm:0.0.2" "@calcom/atoms": "workspace:*" "@playwright/test": "npm:1.57.0" "@prisma/client": "npm:6.16.1" @@ -2331,6 +2352,7 @@ __metadata: version: 0.0.0-use.local resolution: "@calcom/embed-core@workspace:packages/embeds/embed-core" dependencies: + "@approxima/test": "npm:0.0.2" "@biomejs/biome": "npm:2.3.10" "@playwright/test": "npm:1.57.0" "@tailwindcss/cli": "npm:4.1.16" @@ -2350,6 +2372,7 @@ __metadata: version: 0.0.0-use.local resolution: "@calcom/embed-react@workspace:packages/embeds/embed-react" dependencies: + "@approxima/test": "npm:0.0.2" "@calcom/embed-core": "workspace:*" "@calcom/embed-snippet": "workspace:*" "@playwright/test": "npm:1.57.0" @@ -3275,6 +3298,7 @@ __metadata: version: 0.0.0-use.local resolution: "@calcom/web@workspace:apps/web" dependencies: + "@approxima/test": "npm:0.0.2" "@babel/core": "npm:7.26.10" "@biomejs/biome": "npm:2.3.10" "@boxyhq/saml-jackson": "npm:1.52.2" @@ -3882,6 +3906,15 @@ __metadata: languageName: node linkType: hard +"@commander-js/extra-typings@npm:^13.1.0": + version: 13.1.0 + resolution: "@commander-js/extra-typings@npm:13.1.0" + peerDependencies: + commander: ~13.1.0 + checksum: 10/cdb7f854ac6c0b60c073ae928f2b836517ae7c1a8e86eb603144337fc87087ab9adebce67ed60d35beb82d80ef834ec40e7c20ef6053f4b115def21f1cd1d25f + languageName: node + linkType: hard + "@coss/ui@workspace:*, @coss/ui@workspace:packages/coss-ui": version: 0.0.0-use.local resolution: "@coss/ui@workspace:packages/coss-ui" @@ -3956,6 +3989,66 @@ __metadata: languageName: node linkType: hard +"@currents/commit-info@npm:1.0.1-beta.0": + version: 1.0.1-beta.0 + resolution: "@currents/commit-info@npm:1.0.1-beta.0" + dependencies: + bluebird: "npm:3.5.5" + check-more-types: "npm:2.24.0" + debug: "npm:4.3.4" + execa: "npm:1.0.0" + lazy-ass: "npm:1.6.0" + ramda: "npm:0.26.1" + checksum: 10/78a49b44de901b3f61f78954a96ba8b7f918064e84d6abaa830f5af9c2930df16f823ad53f49c7788a05c51d3528c2f2c18462094dcdc6630d71c8ab8518612c + languageName: node + linkType: hard + +"@currents/playwright@npm:^1.23.2": + version: 1.23.2 + resolution: "@currents/playwright@npm:1.23.2" + dependencies: + "@babel/code-frame": "npm:^7.29.0" + "@commander-js/extra-typings": "npm:^13.1.0" + "@currents/commit-info": "npm:1.0.1-beta.0" + async-retry: "npm:^1.3.3" + axios: "npm:1.15.0" + axios-retry: "npm:4.5.0" + chalk: "npm:^4.1.2" + commander: "npm:^13.1.0" + date-fns: "npm:^4.1.0" + debug: "npm:^4.4.3" + dotenv: "npm:^17.2.3" + execa: "npm:^9.6.0" + getos: "npm:^3.2.1" + https-proxy-agent: "npm:^7.0.5" + istanbul-lib-coverage: "npm:^3.2.2" + jiti: "npm:2.6.1" + json-stringify-safe: "npm:^5.0.1" + lil-http-terminator: "npm:^1.2.3" + lodash: "npm:^4.18.1" + nanoid: "npm:^3.3.8" + object-sizeof: "npm:^2.6.5" + p-debounce: "npm:^2.1.0" + p-map: "npm:^4.0.0" + p-queue: "npm:6.6.2" + pluralize: "npm:^8.0.0" + pretty-ms: "npm:^7.0.1" + proxy-from-env: "npm:^1.1.0" + regexp.escape: "npm:^2.0.1" + safe-regex2: "npm:^5.0.0" + source-map-support: "npm:^0.5.21" + stack-utils: "npm:^2.0.6" + tmp: "npm:^0.2.5" + tmp-promise: "npm:^3.0.3" + ts-pattern: "npm:^5.8.0" + ws: "npm:^8.18.3" + bin: + pwc: dist/bin/pwc.js + pwc-p: dist/bin/pwc-p.js + checksum: 10/a246941392a9a3ebf898bb8fed867bc84ce03597274a70d52baded6020e1b7aa2068844e99aaa9c992576d9e6859fad2abfdb75619bb70369392256ce76d097c + languageName: node + linkType: hard + "@dabh/diagnostics@npm:^2.0.2": version: 2.0.3 resolution: "@dabh/diagnostics@npm:2.0.3" @@ -18474,6 +18567,15 @@ __metadata: languageName: node linkType: hard +"async-retry@npm:^1.3.3": + version: 1.3.3 + resolution: "async-retry@npm:1.3.3" + dependencies: + retry: "npm:0.13.1" + checksum: 10/38a7152ff7265a9321ea214b9c69e8224ab1febbdec98efbbde6e562f17ff68405569b796b1c5271f354aef8783665d29953f051f68c1fc45306e61aec82fdc4 + languageName: node + linkType: hard + "async-scheduler@npm:^1.4.4": version: 1.4.4 resolution: "async-scheduler@npm:1.4.4" @@ -18488,6 +18590,13 @@ __metadata: languageName: node linkType: hard +"async@npm:^3.2.0": + version: 3.2.6 + resolution: "async@npm:3.2.6" + checksum: 10/cb6e0561a3c01c4b56a799cc8bab6ea5fef45f069ab32500b6e19508db270ef2dffa55e5aed5865c5526e9907b1f8be61b27530823b411ffafb5e1538c86c368 + languageName: node + linkType: hard + "asynckit@npm:^0.4.0": version: 0.4.0 resolution: "asynckit@npm:0.4.0" @@ -18572,17 +18681,7 @@ __metadata: languageName: node linkType: hard -"axios-retry@npm:^3.2.4": - version: 3.2.4 - resolution: "axios-retry@npm:3.2.4" - dependencies: - "@babel/runtime": "npm:^7.15.4" - is-retry-allowed: "npm:^2.2.0" - checksum: 10/b9c2649d59c509ee73640945c74f50bc2d054af0afe48c8d87c1ddf074e3a7d058e49baf3391c9f9426baed73dd120181c9a772368f33c6e3b4a9b76c452fdc2 - languageName: node - linkType: hard - -"axios-retry@npm:^4.5.0": +"axios-retry@npm:4.5.0, axios-retry@npm:^4.5.0": version: 4.5.0 resolution: "axios-retry@npm:4.5.0" dependencies: @@ -18593,6 +18692,16 @@ __metadata: languageName: node linkType: hard +"axios-retry@npm:^3.2.4": + version: 3.2.4 + resolution: "axios-retry@npm:3.2.4" + dependencies: + "@babel/runtime": "npm:^7.15.4" + is-retry-allowed: "npm:^2.2.0" + checksum: 10/b9c2649d59c509ee73640945c74f50bc2d054af0afe48c8d87c1ddf074e3a7d058e49baf3391c9f9426baed73dd120181c9a772368f33c6e3b4a9b76c452fdc2 + languageName: node + linkType: hard + "axios@npm:1.15.0": version: 1.15.0 resolution: "axios@npm:1.15.0" @@ -18906,6 +19015,13 @@ __metadata: languageName: node linkType: hard +"bluebird@npm:3.5.5": + version: 3.5.5 + resolution: "bluebird@npm:3.5.5" + checksum: 10/188666d2039d6d54cfa2d550b9a48baa2d8a5aef4fa386e65c9ad47ac129c72cdf266d67102b016d45930d51e1d960a391e93cc3e0c235a568712494c4514d72 + languageName: node + linkType: hard + "bluebird@npm:^3.7.2": version: 3.7.2 resolution: "bluebird@npm:3.7.2" @@ -19344,9 +19460,11 @@ __metadata: version: 0.0.0-use.local resolution: "calcom-monorepo@workspace:." dependencies: + "@approxima/test": "npm:0.0.2" "@biomejs/biome": "npm:2.3.10" "@changesets/changelog-github": "npm:0.5.1" "@changesets/cli": "npm:2.29.4" + "@currents/playwright": "npm:^1.23.2" "@faker-js/faker": "npm:9.2.0" "@jetstreamapp/soql-parser-js": "npm:6.1.0" "@playwright/test": "npm:1.57.0" @@ -19703,6 +19821,13 @@ __metadata: languageName: node linkType: hard +"check-more-types@npm:2.24.0": + version: 2.24.0 + resolution: "check-more-types@npm:2.24.0" + checksum: 10/67c5288443bd73a81638e1185f8c5410d0edf6458c086149ef1cda95c07535b5dd5c11c426dc3ee8f0de0f3244aa2d4f2ba1937aaa8a94995589cdcce0bbccb9 + languageName: node + linkType: hard + "checkly@npm:latest": version: 4.2.0 resolution: "checkly@npm:4.2.0" @@ -20359,7 +20484,7 @@ __metadata: languageName: node linkType: hard -"commander@npm:13.1.0": +"commander@npm:13.1.0, commander@npm:^13.1.0": version: 13.1.0 resolution: "commander@npm:13.1.0" checksum: 10/d3b4b79e6be8471ddadacbb8cd441fe82154d7da7393b50e76165a9e29ccdb74fa911a186437b9a211d0fc071db6051915c94fb8ef16d77511d898e9dbabc6af @@ -20933,7 +21058,7 @@ __metadata: languageName: node linkType: hard -"cross-spawn@npm:^6.0.5": +"cross-spawn@npm:^6.0.0, cross-spawn@npm:^6.0.5": version: 6.0.6 resolution: "cross-spawn@npm:6.0.6" dependencies: @@ -21715,7 +21840,7 @@ __metadata: languageName: node linkType: hard -"date-fns@npm:4.1.0": +"date-fns@npm:4.1.0, date-fns@npm:^4.1.0": version: 4.1.0 resolution: "date-fns@npm:4.1.0" checksum: 10/d5f6e9de5bbc52310f786099e18609289ed5e30af60a71e0646784c8185ddd1d0eebcf7c96b7faaaefc4a8366f3a3a4244d099b6d0866ee2bec80d1361e64342 @@ -22437,6 +22562,13 @@ __metadata: languageName: node linkType: hard +"dotenv@npm:^17.2.3": + version: 17.4.2 + resolution: "dotenv@npm:17.4.2" + checksum: 10/ca1b6f54d58e39914901e1518958e86083aca8deb5aa2e7f2a51acd53291d97852479b0ab26ed949b6a45a0e9adcc7b0d1c3c72375e8ea670f7005e341c6daba + languageName: node + linkType: hard + "dotenv@npm:^8.1.0": version: 8.6.0 resolution: "dotenv@npm:8.6.0" @@ -22903,6 +23035,68 @@ __metadata: languageName: node linkType: hard +"es-abstract@npm:^1.23.3": + version: 1.24.2 + resolution: "es-abstract@npm:1.24.2" + dependencies: + array-buffer-byte-length: "npm:^1.0.2" + arraybuffer.prototype.slice: "npm:^1.0.4" + available-typed-arrays: "npm:^1.0.7" + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.4" + data-view-buffer: "npm:^1.0.2" + data-view-byte-length: "npm:^1.0.2" + data-view-byte-offset: "npm:^1.0.1" + es-define-property: "npm:^1.0.1" + es-errors: "npm:^1.3.0" + es-object-atoms: "npm:^1.1.1" + es-set-tostringtag: "npm:^2.1.0" + es-to-primitive: "npm:^1.3.0" + function.prototype.name: "npm:^1.1.8" + get-intrinsic: "npm:^1.3.0" + get-proto: "npm:^1.0.1" + get-symbol-description: "npm:^1.1.0" + globalthis: "npm:^1.0.4" + gopd: "npm:^1.2.0" + has-property-descriptors: "npm:^1.0.2" + has-proto: "npm:^1.2.0" + has-symbols: "npm:^1.1.0" + hasown: "npm:^2.0.2" + internal-slot: "npm:^1.1.0" + is-array-buffer: "npm:^3.0.5" + is-callable: "npm:^1.2.7" + is-data-view: "npm:^1.0.2" + is-negative-zero: "npm:^2.0.3" + is-regex: "npm:^1.2.1" + is-set: "npm:^2.0.3" + is-shared-array-buffer: "npm:^1.0.4" + is-string: "npm:^1.1.1" + is-typed-array: "npm:^1.1.15" + is-weakref: "npm:^1.1.1" + math-intrinsics: "npm:^1.1.0" + object-inspect: "npm:^1.13.4" + object-keys: "npm:^1.1.1" + object.assign: "npm:^4.1.7" + own-keys: "npm:^1.0.1" + regexp.prototype.flags: "npm:^1.5.4" + safe-array-concat: "npm:^1.1.3" + safe-push-apply: "npm:^1.0.0" + safe-regex-test: "npm:^1.1.0" + set-proto: "npm:^1.0.0" + stop-iteration-iterator: "npm:^1.1.0" + string.prototype.trim: "npm:^1.2.10" + string.prototype.trimend: "npm:^1.0.9" + string.prototype.trimstart: "npm:^1.0.8" + typed-array-buffer: "npm:^1.0.3" + typed-array-byte-length: "npm:^1.0.3" + typed-array-byte-offset: "npm:^1.0.4" + typed-array-length: "npm:^1.0.7" + unbox-primitive: "npm:^1.1.0" + which-typed-array: "npm:^1.1.19" + checksum: 10/e2c97263d87b7faf65102d887074af421db7e48cd92b8b3cd308216cdd2547b647e8f61bf51429bdb13adc463bb7f421989544cbfd2e7f7469ef7a69ae8a4205 + languageName: node + linkType: hard + "es-define-property@npm:^1.0.0, es-define-property@npm:^1.0.1": version: 1.0.1 resolution: "es-define-property@npm:1.0.1" @@ -23459,6 +23653,21 @@ __metadata: languageName: node linkType: hard +"execa@npm:1.0.0": + version: 1.0.0 + resolution: "execa@npm:1.0.0" + dependencies: + cross-spawn: "npm:^6.0.0" + get-stream: "npm:^4.0.0" + is-stream: "npm:^1.1.0" + npm-run-path: "npm:^2.0.0" + p-finally: "npm:^1.0.0" + signal-exit: "npm:^3.0.0" + strip-eof: "npm:^1.0.0" + checksum: 10/9b7a0077ba9d0ecdd41bf2d8644f83abf736e37622e3d1af39dec9d5f2cfa6bf8263301d0df489688dda3873d877f4168c01172cbafed5fffd12c808983515b0 + languageName: node + linkType: hard + "execa@npm:9.3.0": version: 9.3.0 resolution: "execa@npm:9.3.0" @@ -23513,6 +23722,26 @@ __metadata: languageName: node linkType: hard +"execa@npm:^9.6.0": + version: 9.6.1 + resolution: "execa@npm:9.6.1" + dependencies: + "@sindresorhus/merge-streams": "npm:^4.0.0" + cross-spawn: "npm:^7.0.6" + figures: "npm:^6.1.0" + get-stream: "npm:^9.0.0" + human-signals: "npm:^8.0.1" + is-plain-obj: "npm:^4.1.0" + is-stream: "npm:^4.0.1" + npm-run-path: "npm:^6.0.0" + pretty-ms: "npm:^9.2.0" + signal-exit: "npm:^4.1.0" + strip-final-newline: "npm:^4.0.0" + yoctocolors: "npm:^2.1.1" + checksum: 10/d0f7a2185152379f8772f6d780b188f2728a95b9a68d1a897f58805d7ba6bd55eaa5e128cb66a274251a6b5e4d9388332b1417bd7d46c25e020e4e55725cf79e + languageName: node + linkType: hard + "exif-parser@npm:^0.1.12": version: 0.1.12 resolution: "exif-parser@npm:0.1.12" @@ -24741,6 +24970,15 @@ __metadata: languageName: node linkType: hard +"get-stream@npm:^4.0.0": + version: 4.1.0 + resolution: "get-stream@npm:4.1.0" + dependencies: + pump: "npm:^3.0.0" + checksum: 10/12673e8aebc79767d187b203e5bfabb8266304037815d3bcc63b6f8c67c6d4ad0d98d4d4528bcdc1cbea68f1dd91bcbd87827aa3cdcfa9c5fa4a4644716d72c2 + languageName: node + linkType: hard + "get-stream@npm:^6.0.0": version: 6.0.1 resolution: "get-stream@npm:6.0.1" @@ -24785,6 +25023,15 @@ __metadata: languageName: node linkType: hard +"getos@npm:^3.2.1": + version: 3.2.1 + resolution: "getos@npm:3.2.1" + dependencies: + async: "npm:^3.2.0" + checksum: 10/228bede057f5cbed93dc6a66ce459a0364059faa2869682547663302f612e6295f13d3ad2a54ebbed573a9eb7f8124508b24409df6bcda6e15906c357526d11f + languageName: node + linkType: hard + "gettext-parser@npm:8.0.0": version: 8.0.0 resolution: "gettext-parser@npm:8.0.0" @@ -26033,6 +26280,13 @@ __metadata: languageName: node linkType: hard +"human-signals@npm:^8.0.1": + version: 8.0.1 + resolution: "human-signals@npm:8.0.1" + checksum: 10/903389a018b16f330c5e0f6e8b76d592c79552152ea892f249e5290e71c790f5722dc9b740fedd4bdef30566754a69012aaed97a6a528da0d417fad990a6f515 + languageName: node + linkType: hard + "humanize-duration@npm:^3.27.3": version: 3.33.1 resolution: "humanize-duration@npm:3.33.1" @@ -27176,6 +27430,13 @@ __metadata: languageName: node linkType: hard +"is-stream@npm:^1.1.0": + version: 1.1.0 + resolution: "is-stream@npm:1.1.0" + checksum: 10/351aa77c543323c4e111204482808cfad68d2e940515949e31ccd0b010fc13d5fba4b9c230e4887fd24284713040f43e542332fbf172f6b9944b7d62e389c0ec + languageName: node + linkType: hard + "is-stream@npm:^2.0.0": version: 2.0.1 resolution: "is-stream@npm:2.0.1" @@ -28065,6 +28326,15 @@ __metadata: languageName: node linkType: hard +"jiti@npm:2.6.1, jiti@npm:^2.0.0, jiti@npm:^2.4.2, jiti@npm:^2.6.0, jiti@npm:^2.6.1": + version: 2.6.1 + resolution: "jiti@npm:2.6.1" + bin: + jiti: lib/jiti-cli.mjs + checksum: 10/8cd72c5fd03a0502564c3f46c49761090f6dadead21fa191b73535724f095ad86c2fa89ee6fe4bc3515337e8d406cc8fb2d37b73fa0c99a34584bac35cd4a4de + languageName: node + linkType: hard + "jiti@npm:^1.17.1, jiti@npm:^1.19.1, jiti@npm:^1.21.6": version: 1.21.7 resolution: "jiti@npm:1.21.7" @@ -28074,15 +28344,6 @@ __metadata: languageName: node linkType: hard -"jiti@npm:^2.0.0, jiti@npm:^2.4.2, jiti@npm:^2.6.0, jiti@npm:^2.6.1": - version: 2.6.1 - resolution: "jiti@npm:2.6.1" - bin: - jiti: lib/jiti-cli.mjs - checksum: 10/8cd72c5fd03a0502564c3f46c49761090f6dadead21fa191b73535724f095ad86c2fa89ee6fe4bc3515337e8d406cc8fb2d37b73fa0c99a34584bac35cd4a4de - languageName: node - linkType: hard - "jju@npm:~1.4.0": version: 1.4.0 resolution: "jju@npm:1.4.0" @@ -28357,6 +28618,13 @@ __metadata: languageName: node linkType: hard +"json-stringify-safe@npm:^5.0.1": + version: 5.0.1 + resolution: "json-stringify-safe@npm:5.0.1" + checksum: 10/59169a081e4eeb6f9559ae1f938f656191c000e0512aa6df9f3c8b2437a4ab1823819c6b9fd1818a4e39593ccfd72e9a051fdd3e2d1e340ed913679e888ded8c + languageName: node + linkType: hard + "json-to-pretty-yaml@npm:^1.2.2": version: 1.2.2 resolution: "json-to-pretty-yaml@npm:1.2.2" @@ -28604,6 +28872,13 @@ __metadata: languageName: node linkType: hard +"lazy-ass@npm:1.6.0": + version: 1.6.0 + resolution: "lazy-ass@npm:1.6.0" + checksum: 10/3969ebef060b6f665fc78310ec769f7d2945db2d5af2b6663eda1bc9ec45c845deba9c4a3f75f124ce2c76fedf56514a063ee5c2affc8bc94963fbbddb442a88 + languageName: node + linkType: hard + "leven@npm:^2.1.0": version: 2.1.0 resolution: "leven@npm:2.1.0" @@ -28759,6 +29034,13 @@ __metadata: languageName: node linkType: hard +"lil-http-terminator@npm:^1.2.3": + version: 1.2.3 + resolution: "lil-http-terminator@npm:1.2.3" + checksum: 10/f65ca86c5d73391ce98912f46ccb6954395b0db39947c9c8527a78fc0c27b8210814e526c3dbdec48fe5f619f277e81ed1b82a65d8c1097c94dca2cd98e874c6 + languageName: node + linkType: hard + "lilconfig@npm:2.0.5": version: 2.0.5 resolution: "lilconfig@npm:2.0.5" @@ -32319,6 +32601,15 @@ __metadata: languageName: node linkType: hard +"npm-run-path@npm:^2.0.0": + version: 2.0.2 + resolution: "npm-run-path@npm:2.0.2" + dependencies: + path-key: "npm:^2.0.0" + checksum: 10/acd5ad81648ba4588ba5a8effb1d98d2b339d31be16826a118d50f182a134ac523172101b82eab1d01cb4c2ba358e857d54cfafd8163a1ffe7bd52100b741125 + languageName: node + linkType: hard + "npm-run-path@npm:^4.0.1": version: 4.0.1 resolution: "npm-run-path@npm:4.0.1" @@ -32337,6 +32628,16 @@ __metadata: languageName: node linkType: hard +"npm-run-path@npm:^6.0.0": + version: 6.0.0 + resolution: "npm-run-path@npm:6.0.0" + dependencies: + path-key: "npm:^4.0.0" + unicorn-magic: "npm:^0.3.0" + checksum: 10/1a1b50aba6e6af7fd34a860ba2e252e245c4a59b316571a990356417c0cdf0414cabf735f7f52d9c330899cb56f0ab804a8e21fb12a66d53d7843e39ada4a3b6 + languageName: node + linkType: hard + "npm-to-yarn@npm:^3.0.0": version: 3.0.1 resolution: "npm-to-yarn@npm:3.0.1" @@ -32496,6 +32797,15 @@ __metadata: languageName: node linkType: hard +"object-sizeof@npm:^2.6.5": + version: 2.6.5 + resolution: "object-sizeof@npm:2.6.5" + dependencies: + buffer: "npm:^6.0.3" + checksum: 10/f0c7a4ad6ab9186449fad85f957884c0d0dc4c202dab841943bae623885f4c58641a2cff1afb430d966d97f8414fb6ed76067046f3f34defdbe2355e88a8b0de + languageName: node + linkType: hard + "object-treeify@npm:^1.1.33": version: 1.1.33 resolution: "object-treeify@npm:1.1.33" @@ -32831,6 +33141,13 @@ __metadata: languageName: node linkType: hard +"p-debounce@npm:^2.1.0": + version: 2.1.0 + resolution: "p-debounce@npm:2.1.0" + checksum: 10/a0f15041f41fbbc0ec26425f9f1e408958986558a4c6da0e8be1dd0005262cd3b79f30744e8392bce549613b830a0539bfd911874a6f1f621e65880a5ef71d04 + languageName: node + linkType: hard + "p-filter@npm:^2.1.0": version: 2.1.0 resolution: "p-filter@npm:2.1.0" @@ -33122,6 +33439,13 @@ __metadata: languageName: node linkType: hard +"parse-ms@npm:^2.1.0": + version: 2.1.0 + resolution: "parse-ms@npm:2.1.0" + checksum: 10/517eab80cdb9df6ae22a8fad944bfb4289482699bcde5211a1c127091dfea33c3dcb217246b188865fc32e998bcee815bfa4a863f41e3b2d0bcc69f34ef1a543 + languageName: node + linkType: hard + "parse-ms@npm:^4.0.0": version: 4.0.0 resolution: "parse-ms@npm:4.0.0" @@ -33318,7 +33642,7 @@ __metadata: languageName: node linkType: hard -"path-key@npm:^2.0.1": +"path-key@npm:^2.0.0, path-key@npm:^2.0.1": version: 2.0.1 resolution: "path-key@npm:2.0.1" checksum: 10/6e654864e34386a2a8e6bf72cf664dcabb76574dd54013add770b374384d438aca95f4357bb26935b514a4e4c2c9b19e191f2200b282422a76ee038b9258c5e7 @@ -33754,7 +34078,7 @@ __metadata: languageName: node linkType: hard -"pluralize@npm:8.0.0": +"pluralize@npm:8.0.0, pluralize@npm:^8.0.0": version: 8.0.0 resolution: "pluralize@npm:8.0.0" checksum: 10/17877fdfdb7ddb3639ce257ad73a7c51a30a966091e40f56ea9f2f545b5727ce548d4928f8cb3ce38e7dc0c5150407d318af6a4ed0ea5265d378473b4c2c61ec @@ -34498,6 +34822,15 @@ __metadata: languageName: node linkType: hard +"pretty-ms@npm:^7.0.1": + version: 7.0.1 + resolution: "pretty-ms@npm:7.0.1" + dependencies: + parse-ms: "npm:^2.1.0" + checksum: 10/a39aac23cc7dae7a94c70518ab8b6c6db0894a7b84c81ee7abc8778c5ec8bae2d1e71ba991ff641732b38433724bfbdbb37bd3a00418637f797c072e06fe8b4c + languageName: node + linkType: hard + "pretty-ms@npm:^9.0.0": version: 9.1.0 resolution: "pretty-ms@npm:9.1.0" @@ -34507,6 +34840,15 @@ __metadata: languageName: node linkType: hard +"pretty-ms@npm:^9.2.0": + version: 9.3.0 + resolution: "pretty-ms@npm:9.3.0" + dependencies: + parse-ms: "npm:^4.0.0" + checksum: 10/beb4e04dc17071885b827e3f33d36be279791f2f36a8c29a45c77e59979dad79a5d7e5211922c72a3f6f109bb64a707d70fcdba6746e077122afcd88ce202e98 + languageName: node + linkType: hard + "prism-react-renderer@npm:^2.4.1": version: 2.4.1 resolution: "prism-react-renderer@npm:2.4.1" @@ -34860,6 +35202,13 @@ __metadata: languageName: node linkType: hard +"ramda@npm:0.26.1": + version: 0.26.1 + resolution: "ramda@npm:0.26.1" + checksum: 10/32f99fa901bf54a42f7cef607668921d2553c34fe6ba3ea9776309604a57ea91cce36624de50d9547f82335d814de6ebe1dce83442b8a5ff002a53130be31e43 + languageName: node + linkType: hard + "range-parser@npm:^1.2.0, range-parser@npm:^1.2.1, range-parser@npm:~1.2.1": version: 1.2.1 resolution: "range-parser@npm:1.2.1" @@ -35832,6 +36181,20 @@ __metadata: languageName: node linkType: hard +"regexp.escape@npm:^2.0.1": + version: 2.0.1 + resolution: "regexp.escape@npm:2.0.1" + dependencies: + call-bind: "npm:^1.0.7" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.3" + es-errors: "npm:^1.3.0" + for-each: "npm:^0.3.3" + safe-regex-test: "npm:^1.0.3" + checksum: 10/591e73051fe9b3275c27fe628f649a800b015aaa684cd056d3b382594ef0c9c957f59c80bc41520d2763ee64572f083c9ec45364162d835022b0996bdb35067d + languageName: node + linkType: hard + "regexp.prototype.flags@npm:^1.5.4": version: 1.5.4 resolution: "regexp.prototype.flags@npm:1.5.4" @@ -36271,6 +36634,13 @@ __metadata: languageName: node linkType: hard +"ret@npm:~0.5.0": + version: 0.5.0 + resolution: "ret@npm:0.5.0" + checksum: 10/fb58f61268ceb762de471fd5871a53def1f47160487c6e21dcbe5274b3eb2df40a80d9eab7ed3732c8de4e4fadc911a66a190a129b5cf75c3e70302a7607f82f + languageName: node + linkType: hard + "retell-client-js-sdk@npm:2.0.7": version: 2.0.7 resolution: "retell-client-js-sdk@npm:2.0.7" @@ -36341,6 +36711,13 @@ __metadata: languageName: node linkType: hard +"retry@npm:0.13.1, retry@npm:^0.13.1": + version: 0.13.1 + resolution: "retry@npm:0.13.1" + checksum: 10/6125ec2e06d6e47e9201539c887defba4e47f63471db304c59e4b82fc63c8e89ca06a77e9d34939a9a42a76f00774b2f46c0d4a4cbb3e287268bd018ed69426d + languageName: node + linkType: hard + "retry@npm:^0.12.0": version: 0.12.0 resolution: "retry@npm:0.12.0" @@ -36348,13 +36725,6 @@ __metadata: languageName: node linkType: hard -"retry@npm:^0.13.1": - version: 0.13.1 - resolution: "retry@npm:0.13.1" - checksum: 10/6125ec2e06d6e47e9201539c887defba4e47f63471db304c59e4b82fc63c8e89ca06a77e9d34939a9a42a76f00774b2f46c0d4a4cbb3e287268bd018ed69426d - languageName: node - linkType: hard - "reusify@npm:^1.0.4": version: 1.0.4 resolution: "reusify@npm:1.0.4" @@ -36676,7 +37046,7 @@ __metadata: languageName: node linkType: hard -"safe-regex-test@npm:^1.1.0": +"safe-regex-test@npm:^1.0.3, safe-regex-test@npm:^1.1.0": version: 1.1.0 resolution: "safe-regex-test@npm:1.1.0" dependencies: @@ -36687,6 +37057,17 @@ __metadata: languageName: node linkType: hard +"safe-regex2@npm:^5.0.0": + version: 5.1.1 + resolution: "safe-regex2@npm:5.1.1" + dependencies: + ret: "npm:~0.5.0" + bin: + safe-regex2: bin/safe-regex2.js + checksum: 10/378043ef4daa7d278773feebbc55915ac3e6e87ffd0648922200a9e8ed2b9f5584245e998645cd284933cd87d950264d5bdba6abbefe1936c2ecb7fc7edf1f8f + languageName: node + linkType: hard + "safe-stable-stringify@npm:^2.3.1": version: 2.4.3 resolution: "safe-stable-stringify@npm:2.4.3" @@ -37391,7 +37772,7 @@ __metadata: languageName: node linkType: hard -"signal-exit@npm:^3.0.2, signal-exit@npm:^3.0.3, signal-exit@npm:^3.0.7": +"signal-exit@npm:^3.0.0, signal-exit@npm:^3.0.2, signal-exit@npm:^3.0.3, signal-exit@npm:^3.0.7": version: 3.0.7 resolution: "signal-exit@npm:3.0.7" checksum: 10/a2f098f247adc367dffc27845853e9959b9e88b01cb301658cfe4194352d8d2bb32e18467c786a7fe15f1d44b233ea35633d076d5e737870b7139949d1ab6318 @@ -37698,7 +38079,7 @@ __metadata: languageName: node linkType: hard -"source-map-support@npm:0.5.21, source-map-support@npm:~0.5.20": +"source-map-support@npm:0.5.21, source-map-support@npm:^0.5.21, source-map-support@npm:~0.5.20": version: 0.5.21 resolution: "source-map-support@npm:0.5.21" dependencies: @@ -38254,6 +38635,13 @@ __metadata: languageName: node linkType: hard +"strip-eof@npm:^1.0.0": + version: 1.0.0 + resolution: "strip-eof@npm:1.0.0" + checksum: 10/40bc8ddd7e072f8ba0c2d6d05267b4e0a4800898c3435b5fb5f5a21e6e47dfaff18467e7aa0d1844bb5d6274c3097246595841fbfeb317e541974ee992cac506 + languageName: node + linkType: hard + "strip-final-newline@npm:^2.0.0": version: 2.0.0 resolution: "strip-final-newline@npm:2.0.0" @@ -39164,7 +39552,7 @@ __metadata: languageName: node linkType: hard -"tmp@npm:^0.2.0": +"tmp@npm:^0.2.0, tmp@npm:^0.2.5": version: 0.2.5 resolution: "tmp@npm:0.2.5" checksum: 10/dd4b78b32385eab4899d3ae296007b34482b035b6d73e1201c4a9aede40860e90997a1452c65a2d21aee73d53e93cd167d741c3db4015d90e63b6d568a93d7ec @@ -39590,6 +39978,13 @@ __metadata: languageName: node linkType: hard +"ts-pattern@npm:^5.8.0": + version: 5.9.0 + resolution: "ts-pattern@npm:5.9.0" + checksum: 10/0df8cc63d731a596f3541a305eff10f055c9a761d1a8b3776781dc6d6430c6bd8be8cd333fac62138c5d88e1209b4d8dccf1f40041091b634e5018908281417b + languageName: node + linkType: hard + "tsafe@npm:^1.8.5": version: 1.8.12 resolution: "tsafe@npm:1.8.12" @@ -40313,6 +40708,13 @@ __metadata: languageName: node linkType: hard +"unicorn-magic@npm:^0.3.0": + version: 0.3.0 + resolution: "unicorn-magic@npm:0.3.0" + checksum: 10/bdd7d7c522f9456f32a0b77af23f8854f9a7db846088c3868ec213f9550683ab6a2bdf3803577eacbafddb4e06900974385841ccb75338d17346ccef45f9cb01 + languageName: node + linkType: hard + "unified@npm:11.0.5, unified@npm:^11.0.0, unified@npm:^11.0.4, unified@npm:^11.0.5": version: 11.0.5 resolution: "unified@npm:11.0.5" @@ -41734,6 +42136,21 @@ __metadata: languageName: node linkType: hard +"ws@npm:^8.18.3": + version: 8.20.0 + resolution: "ws@npm:8.20.0" + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ">=5.0.2" + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + checksum: 10/b7ab934b21ffdea9f25a5af5097e8c1ec7625db553bca026c5a23e35b7c236f3fb89782f2b57fab9da553864512f9aa7d245827ef998d26ffa1b2187a19a6d10 + languageName: node + linkType: hard + "ws@npm:~8.17.1": version: 8.17.1 resolution: "ws@npm:8.17.1" @@ -42132,6 +42549,13 @@ __metadata: languageName: node linkType: hard +"yoctocolors@npm:^2.1.1": + version: 2.1.2 + resolution: "yoctocolors@npm:2.1.2" + checksum: 10/6ee42d665a4cc161c7de3f015b2a65d6c65d2808bfe3b99e228bd2b1b784ef1e54d1907415c025fc12b400f26f372bfc1b71966c6c738d998325ca422eb39363 + languageName: node + linkType: hard + "yoga-layout-prebuilt@npm:^1.9.6": version: 1.10.0 resolution: "yoga-layout-prebuilt@npm:1.10.0"