diff --git a/.github/files/build-reminder-comment/check-test-reminder-comment.js b/.github/files/build-reminder-comment/check-test-reminder-comment.js index ddcc6a107dd2..6737b184684d 100644 --- a/.github/files/build-reminder-comment/check-test-reminder-comment.js +++ b/.github/files/build-reminder-comment/check-test-reminder-comment.js @@ -13,7 +13,7 @@ const getCheckComments = require( './get-check-comments.js' ); * @param {string} owner - Repository owner. * @param {string} repo - Repository name. * @param {string} number - PR number. - * @param {Core} core - A reference to the @actions/core package + * @param {Core} core - A reference to the `@actions/core` package * @return {Promise} Promise resolving to an object with keys `simple` and `woa`, each being an array of strings identifying what needs testing. */ async function touchedProjectsNeedingTesting( github, owner, repo, number, core ) { @@ -51,7 +51,7 @@ async function touchedProjectsNeedingTesting( github, owner, repo, number, core * * @param {github} github - Pre-authenticated octokit/rest.js client with pagination plugins * @param {object} context - Context of the workflow run - * @param {core} core - A reference to the @actions/core package + * @param {core} core - A reference to the `@actions/core` package * @return {Promise} Promise resolving to an object with the following properties: * - {commentId} - a comment ID, or 0 if no comment is found. * - {simple} - an array of strings identifying what needs testing on Simple. @@ -146,7 +146,7 @@ async function checkTestPendingComment( github, context, core ) { * * @param {github} github - Pre-authenticated octokit/rest.js client with pagination plugins * @param {object} context - Context of the workflow run - * @param {core} core - A reference to the @actions/core package + * @param {core} core - A reference to the `@actions/core` package * @return {Promise} Promise resolving to an object with the following properties: * - {commentId} - a comment ID, or 0 if no comment is found. * - {simple} - an array of strings identifying what needs testing on Simple. diff --git a/.github/files/build-reminder-comment/get-check-comments.js b/.github/files/build-reminder-comment/get-check-comments.js index 6d040422ac6e..6f6c1e72a8f6 100644 --- a/.github/files/build-reminder-comment/get-check-comments.js +++ b/.github/files/build-reminder-comment/get-check-comments.js @@ -9,7 +9,7 @@ const cache = {}; * @param {string} repo - Repository name. * @param {string} number - Issue number. * @param {string} testCommentIndicator - A piece of text unique to all test reminder comments. - * @param {core} core - A reference to the @actions/core package + * @param {core} core - A reference to the `@actions/core` package * @return {Promise} Promise resolving to an array of comment IDs. */ async function getCheckComments( github, owner, repo, number, testCommentIndicator, core ) { diff --git a/.github/files/gh-autorelease/workflows/autorelease.yml b/.github/files/gh-autorelease/workflows/autorelease.yml index 0682a03f1e8a..865d57e5d604 100644 --- a/.github/files/gh-autorelease/workflows/autorelease.yml +++ b/.github/files/gh-autorelease/workflows/autorelease.yml @@ -18,7 +18,7 @@ jobs: name: Release runs-on: ubuntu-latest steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - name: Create release env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/files/gh-autotagger/workflows/autotagger.yml b/.github/files/gh-autotagger/workflows/autotagger.yml index 526bfb3932cf..7ea514ccd6f1 100644 --- a/.github/files/gh-autotagger/workflows/autotagger.yml +++ b/.github/files/gh-autotagger/workflows/autotagger.yml @@ -22,7 +22,7 @@ jobs: exit 1 fi - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 with: # We want to potentially trigger "tag" events, but the default GITHUB_TOKEN # explicitly does not trigger events. diff --git a/.github/files/gh-npmjs-autopublisher/workflows/npmjs-autopublisher.yml b/.github/files/gh-npmjs-autopublisher/workflows/npmjs-autopublisher.yml index b098b8608c85..6dfee80c7b48 100644 --- a/.github/files/gh-npmjs-autopublisher/workflows/npmjs-autopublisher.yml +++ b/.github/files/gh-npmjs-autopublisher/workflows/npmjs-autopublisher.yml @@ -15,7 +15,7 @@ jobs: name: Publish runs-on: ubuntu-latest steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - uses: actions/setup-node@v4 with: diff --git a/.github/files/gh-wp-svn-autopublish/workflows/wp-svn-autopublish.yml b/.github/files/gh-wp-svn-autopublish/workflows/wp-svn-autopublish.yml index 2e343874b9ed..5a373c64b978 100644 --- a/.github/files/gh-wp-svn-autopublish/workflows/wp-svn-autopublish.yml +++ b/.github/files/gh-wp-svn-autopublish/workflows/wp-svn-autopublish.yml @@ -34,7 +34,7 @@ jobs: - name: Install svn run: command -v svn || sudo apt-get install -y subversion - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 with: path: src diff --git a/.github/workflows/autotagger.yml b/.github/workflows/autotagger.yml index d1ed78638d52..2a27aea9ea91 100644 --- a/.github/workflows/autotagger.yml +++ b/.github/workflows/autotagger.yml @@ -19,7 +19,7 @@ jobs: name: Tag runs-on: ubuntu-latest steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - name: Fetch tags, shallowly and blobless run: | diff --git a/.github/workflows/build-docker-monorepo.yml b/.github/workflows/build-docker-monorepo.yml index 6dde5304d159..6169e772d0ae 100644 --- a/.github/workflows/build-docker-monorepo.yml +++ b/.github/workflows/build-docker-monorepo.yml @@ -34,7 +34,7 @@ jobs: images: ${{ steps.buildargs.outputs.images }} steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - name: Fetch build args id: buildargs @@ -82,7 +82,7 @@ jobs: platform: arm64 steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 @@ -134,7 +134,7 @@ jobs: touch "$TEMP/digests/${DIGEST#sha256:}" - name: Upload digest - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: digests-linux-${{ matrix.platform }} path: ${{ runner.temp }}/digests/* @@ -152,7 +152,7 @@ jobs: steps: - name: Download digests - uses: actions/download-artifact@v5 + uses: actions/download-artifact@v6 with: path: ${{ runner.temp }}/digests pattern: digests-* diff --git a/.github/workflows/build-docker.yml b/.github/workflows/build-docker.yml index 858154efb2e8..3f8f5676a58d 100644 --- a/.github/workflows/build-docker.yml +++ b/.github/workflows/build-docker.yml @@ -36,7 +36,7 @@ jobs: images: ${{ steps.buildargs.outputs.images }} steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - name: Fetch build args id: buildargs @@ -84,7 +84,7 @@ jobs: platform: arm64 steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 @@ -135,7 +135,7 @@ jobs: touch "$TEMP/digests/${DIGEST#sha256:}" - name: Upload digest - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: digests-linux-${{ matrix.platform }} path: ${{ runner.temp }}/digests/* @@ -153,7 +153,7 @@ jobs: steps: - name: Download digests - uses: actions/download-artifact@v5 + uses: actions/download-artifact@v6 with: path: ${{ runner.temp }}/digests pattern: digests-* diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index f350f44ee3f0..0fe51ee7325f 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -39,7 +39,7 @@ jobs: changed_projects: ${{ steps.changed.outputs.projects }} steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 # For pull requests, list-changed-projects.sh needs the merge base. # But it doesn't have to be checked out. @@ -149,7 +149,7 @@ jobs: run: tar --owner=0 --group=0 --xz -cvvf build.tar.xz -C "$BUILD_BASE" --transform 's,^\.,build,' . - name: Store build as artifact - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: jetpack-build path: build.tar.xz @@ -160,7 +160,7 @@ jobs: - name: Store plugins.tsv as artifact if: steps.plugins.outputs.any == 'true' - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: plugins.tsv path: ${{ env.BUILD_BASE }}/plugins.tsv @@ -186,12 +186,12 @@ jobs: if: needs.build.outputs.any_plugins == 'true' timeout-minutes: 10 # 2025-11-06: Successful runs should take about 30 seconds. But sometimes the upload is slow. steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 with: path: monorepo - name: Download build artifact - uses: actions/download-artifact@v5 + uses: actions/download-artifact@v6 with: name: jetpack-build - name: Extract build archive @@ -257,7 +257,7 @@ jobs: echo "any-built=$ANY_BUILT" >> "$GITHUB_OUTPUT" - name: Create plugins artifact - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 if: steps.prepare.outputs.any-built == 'true' with: name: plugins @@ -282,13 +282,13 @@ jobs: # Not setting a job-level timeout because it would be kind of pointless with the blocking step. Set a step timeout for all other steps instead. steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 with: path: monorepo timeout-minutes: 1 # 2025-11-06: Successful runs seem to take a few seconds - name: Download build artifact - uses: actions/download-artifact@v5 + uses: actions/download-artifact@v6 with: name: jetpack-build timeout-minutes: 2 # 2025-11-06: Successful runs normally take a few seconds diff --git a/.github/workflows/coverage-check.yml b/.github/workflows/coverage-check.yml index af3322370edc..627f80a0ddc5 100644 --- a/.github/workflows/coverage-check.yml +++ b/.github/workflows/coverage-check.yml @@ -28,7 +28,7 @@ jobs: timeout-minutes: 5 # 2025-11-20: Less than 30 seconds. steps: - name: Checkout - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Get token id: get_token diff --git a/.github/workflows/delete-mirror-branches.yml b/.github/workflows/delete-mirror-branches.yml index 85c4b0b9c568..83bdfcc1cb15 100644 --- a/.github/workflows/delete-mirror-branches.yml +++ b/.github/workflows/delete-mirror-branches.yml @@ -14,7 +14,7 @@ jobs: timeout-minutes: 5 # 2025-11-20: Less than a minute. if: github.event_name == 'delete' && github.repository == 'Automattic/jetpack' && github.event.ref == 'prerelease' steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 with: ref: trunk - name: Delete branches diff --git a/.github/workflows/e2e-tests.yml b/.github/workflows/e2e-tests.yml index 91199025970d..7179f70eda78 100644 --- a/.github/workflows/e2e-tests.yml +++ b/.github/workflows/e2e-tests.yml @@ -31,7 +31,7 @@ jobs: matrix: ${{ steps.evaluate.outputs.matrix }} build-matrix: ${{ steps.evaluate.outputs.build-matrix }} steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 # For pull requests, list-changed-projects.sh needs the merge base. - name: Deepen to merge base @@ -93,7 +93,7 @@ jobs: - name: Checkout code if: steps.jetpack-build-cache.outputs.cache-hit != 'true' - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Setup tools if: steps.jetpack-build-cache.outputs.cache-hit != 'true' @@ -158,7 +158,7 @@ jobs: matrix: include: ${{ fromJson( needs.create-test-matrix.outputs.matrix ) }} steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - name: Restore ${{ matrix.buildGroup }} build cache id: jetpack-build-cache @@ -187,14 +187,14 @@ jobs: - name: Checkout jetpack-production if: github.event_name == 'repository_dispatch' && github.event.client_payload.repository != 'Automattic/jetpack-production' - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: repository: Automattic/jetpack-production path: build-output/build/Automattic/jetpack-production - name: Checkout mirror repo if: github.event_name == 'repository_dispatch' - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: repository: ${{ github.event.client_payload.repository }} ref: ${{ github.event.client_payload.ref_name }} @@ -314,7 +314,7 @@ jobs: - name: Upload test artifacts if: ${{ always() }} continue-on-error: true - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: test-output-${{ matrix.project }} path: ${{ matrix.path }}/output @@ -383,7 +383,7 @@ jobs: needs: [e2e-tests] steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - name: Set up tools uses: ./.github/actions/tool-setup @@ -398,7 +398,7 @@ jobs: working-directory: ./projects/github-actions/test-results-to-slack - name: Download test artifacts - uses: actions/download-artifact@v5 + uses: actions/download-artifact@v6 with: path: test-output diff --git a/.github/workflows/gardening.yml b/.github/workflows/gardening.yml index cc6fdab583ca..fce75ba4e4df 100644 --- a/.github/workflows/gardening.yml +++ b/.github/workflows/gardening.yml @@ -37,7 +37,7 @@ jobs: timeout-minutes: 10 # 2025-11-06: Successful runs seem to take a minute or two, primarily since we wait for previous runs to complete. steps: - name: Checkout - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Setup tools uses: ./.github/actions/tool-setup @@ -53,7 +53,7 @@ jobs: - name: Check out the PR if: github.event_name == 'pull_request_target' && github.event.pull_request.state != 'closed' - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: ref: ${{ github.event.pull_request.head.ref }} repository: ${{ github.event.pull_request.head.repo.full_name }} diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index a2ecdf7e56e8..2519505f019c 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -77,7 +77,7 @@ jobs: steps: - if: github.event_name == 'pull_request' - uses: actions/checkout@v5 + uses: actions/checkout@v6 - if: github.event_name == 'pull_request' uses: dorny/paths-filter@v3 @@ -222,7 +222,7 @@ jobs: experimental: [ false ] steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - name: Setup tools uses: ./.github/actions/tool-setup @@ -256,7 +256,7 @@ jobs: timeout-minutes: 5 # 2025-11-06: Successful runs seem to take ~2 minutes. Leaving some extra for future expansion. steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - name: Setup tools uses: ./.github/actions/tool-setup @@ -284,7 +284,7 @@ jobs: timeout-minutes: 5 # 2025-11-06: Successful runs seem to take ~1 minute. Leaving some extra for future expansion. steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - name: Setup tools uses: ./.github/actions/tool-setup @@ -315,7 +315,7 @@ jobs: steps: # We don't need full git history, but phpcs-changed does need everything up to the merge-base. - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 with: ref: ${{ github.event.pull_request.head.sha }} fetch-depth: 10 @@ -352,7 +352,7 @@ jobs: timeout-minutes: 10 # 2025-11-06: Runs now take ~5 minutes due to now installing all php/js deps to ensure valid linting. steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - name: Setup tools uses: ./.github/actions/tool-setup @@ -376,7 +376,7 @@ jobs: steps: # We don't need full git history, but eslint-changed does need everything up to the merge-base. - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 with: ref: ${{ github.event.pull_request.head.sha }} fetch-depth: 10 @@ -405,7 +405,7 @@ jobs: timeout-minutes: 5 # 2025-11-06: Takes a bit more than a minute, so give a little wiggle room. steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - name: Setup tools uses: ./.github/actions/tool-setup @@ -426,7 +426,7 @@ jobs: if: github.event_name == 'push' || needs.changed_files.outputs.ghactionsfiles == 'true' || needs.changed_files.outputs.misc == 'true' timeout-minutes: 5 # 2025-11-06: Takes less than a minute. steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - name: Setup tools uses: ./.github/actions/tool-setup @@ -445,7 +445,7 @@ jobs: timeout-minutes: 1 # 2025-11-06: Successful runs seem to take a few seconds. steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - run: ./tools/check-copied-files.sh ### Runs tools/cleanup-excludelists.sh and checks for any changes @@ -459,7 +459,7 @@ jobs: if: github.event_name == 'push' || needs.changed_files.outputs.excludelist == 'true' timeout-minutes: 10 # 2025-11-06: The check itself takes 2 minutes. steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - name: Setup tools uses: ./.github/actions/tool-setup @@ -482,7 +482,7 @@ jobs: timeout-minutes: 5 # 2025-11-06: Takes a few seconds. steps: # We don't need full git history, but tools/check-changelogger-use.php does need everything up to the merge-base. - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 with: ref: ${{ github.event.pull_request.head.sha }} fetch-depth: 10 @@ -506,7 +506,7 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 5 # 2025-11-06: Takes less than a minute. steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - name: Setup tools uses: ./.github/actions/tool-setup @@ -528,7 +528,7 @@ jobs: if: github.event_name == 'push' || needs.changed_files.outputs.lockfiles == 'true' || needs.changed_files.outputs.misc == 'true' timeout-minutes: 7 # 2025-11-06: Successful runs seem to take about 2 minutes. steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - name: Setup tools uses: ./.github/actions/tool-setup @@ -546,7 +546,7 @@ jobs: if: github.event_name == 'push' || needs.changed_files.outputs.lockfiles == 'true' || needs.changed_files.outputs.misc == 'true' timeout-minutes: 7 # 2025-11-06: Takes a minute or two. steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - name: Setup tools uses: ./.github/actions/tool-setup - run: pnpm install @@ -560,7 +560,7 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 5 # 2025-11-06: Takes a minute or two. steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - name: Setup tools uses: ./.github/actions/tool-setup @@ -581,7 +581,7 @@ jobs: # step "Warn about stubs" pull-requests: write steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - uses: ./.github/actions/deepen-to-merge-base id: deepen - name: Warn about stubs @@ -609,7 +609,7 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 10 # 2025-11-20: Takes around 3 minutes. steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - name: Setup tools uses: ./.github/actions/tool-setup - name: Pnpm install @@ -632,7 +632,7 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 25 # 2025-11-20: Up to about 10 minutes now that we're running against the old WP and Woo stubs too. steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - name: Setup tools uses: ./.github/actions/tool-setup - name: Pnpm install diff --git a/.github/workflows/phpcompatibility-dev.yml b/.github/workflows/phpcompatibility-dev.yml index 3a3f323c4807..3d21da1709da 100644 --- a/.github/workflows/phpcompatibility-dev.yml +++ b/.github/workflows/phpcompatibility-dev.yml @@ -61,7 +61,7 @@ jobs: timeout-minutes: 7 # 2025-11-06: Successful runs seem to take ~2 minutes. steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - name: Setup tools uses: ./.github/actions/tool-setup diff --git a/.github/workflows/post-build.yml b/.github/workflows/post-build.yml index e1e8ee75142b..52714a937ae8 100644 --- a/.github/workflows/post-build.yml +++ b/.github/workflows/post-build.yml @@ -45,7 +45,7 @@ jobs: run: | echo "$SUMMARY" >> $GITHUB_STEP_SUMMARY - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - name: Get token id: get_token @@ -85,7 +85,7 @@ jobs: if: github.event.workflow_run.conclusion != 'success' timeout-minutes: 2 # 2025-11-20: Seems like it should be fast. steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - name: Get token id: get_token @@ -128,7 +128,7 @@ jobs: zip_url: ${{ steps.run.outputs.zip_url }} any_plugins: ${{ steps.run.outputs.any_plugins }} steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - name: Find artifact id: run @@ -201,7 +201,7 @@ jobs: if: needs.find_artifact.outputs.any_plugins == 'false' timeout-minutes: 2 # 2025-11-20: Takes a few seconds. steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - name: Get token id: get_token @@ -244,7 +244,7 @@ jobs: timeout-minutes: 5 # 2025-11-20: Takes a few seconds. steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - name: Get token id: get_token @@ -336,10 +336,10 @@ jobs: - 80:80 steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 with: path: trunk - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 with: ref: ${{ github.event.workflow_run.head_commit.id }} path: commit @@ -383,7 +383,7 @@ jobs: timeout-minutes: 5 # 2025-11-20: Takes a few seconds. steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - name: Get token id: get_token @@ -414,10 +414,10 @@ jobs: if: needs.find_artifact.outputs.any_plugins == 'true' timeout-minutes: 15 # 2025-11-20: Less than a minute, but leave time for the downloads. steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 with: path: trunk - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 with: ref: ${{ github.event.workflow_run.head_commit.id }} path: commit diff --git a/.github/workflows/pr-is-up-to-date.yml b/.github/workflows/pr-is-up-to-date.yml index 7acc9513bab6..45311f4378f6 100644 --- a/.github/workflows/pr-is-up-to-date.yml +++ b/.github/workflows/pr-is-up-to-date.yml @@ -27,7 +27,7 @@ jobs: # First, the "PR or tag" job. - name: Checkout trunk for tag push or PR - uses: actions/checkout@v5 + uses: actions/checkout@v6 if: github.event_name != 'push' || github.ref != 'refs/heads/trunk' with: ref: trunk @@ -76,7 +76,7 @@ jobs: # Second, the "push to trunk" job. - name: Checkout push to trunk - uses: actions/checkout@v5 + uses: actions/checkout@v6 if: github.event_name == 'push' && github.ref == 'refs/heads/trunk' with: # The "Check whether the tag needs updating for trunk commit" needs the previous commit for diffing. diff --git a/.github/workflows/renovate.yml b/.github/workflows/renovate.yml index df7209073ce5..7d9a8e27f94a 100644 --- a/.github/workflows/renovate.yml +++ b/.github/workflows/renovate.yml @@ -36,7 +36,7 @@ jobs: name: Renovate runs-on: ubuntu-latest steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 with: path: monorepo - env: diff --git a/.github/workflows/slack-branch-existence-notification.yml b/.github/workflows/slack-branch-existence-notification.yml index 732b65980ff3..cd26e4cc45e8 100644 --- a/.github/workflows/slack-branch-existence-notification.yml +++ b/.github/workflows/slack-branch-existence-notification.yml @@ -15,7 +15,7 @@ jobs: if: github.event.ref == 'prerelease' steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 with: ref: trunk - name: Generate message diff --git a/.github/workflows/slack-workflow-failed.yml b/.github/workflows/slack-workflow-failed.yml index 5807d7e4984e..2daaf3b103d3 100644 --- a/.github/workflows/slack-workflow-failed.yml +++ b/.github/workflows/slack-workflow-failed.yml @@ -28,7 +28,7 @@ jobs: if: ${{ github.repository == 'Automattic/jetpack' && github.event.workflow_run.conclusion == 'failure' && github.event.workflow_run.event != 'issues' && github.event.workflow_run.event != 'issue_comment' }} steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - name: Generate message id: message env: diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index d119ec4c6402..ea9bb8bcabd4 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -26,7 +26,7 @@ jobs: outputs: matrix: ${{ steps.create-matrix.outputs.matrix }} steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - id: create-matrix run: | MATRIX="$(.github/files/generate-ci-matrix.php)" @@ -65,7 +65,7 @@ jobs: coverage-status: ${{ matrix.script == 'test-coverage' && steps.run-tests.conclusion || '' }} steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 with: # Test coverage checks require a fetch depth > 1. fetch-depth: 2 @@ -309,7 +309,7 @@ jobs: - name: Upload artifacts id: upload-artifacts if: always() && steps.check-artifacts.outputs.any == 'true' - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: ${{ matrix.artifact }} path: artifacts @@ -323,7 +323,7 @@ jobs: needs: run-tests if: always() && needs.run-tests.outputs.did-coverage == 'true' && github.repository == 'Automattic/jetpack' && ( github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name == github.event.pull_request.base.repo.full_name || github.event_name == 'push' && github.ref == 'refs/heads/trunk' ) steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - name: Get token id: get_token @@ -337,7 +337,7 @@ jobs: uses: ./.github/actions/tool-setup - name: Download coverage artifact - uses: actions/download-artifact@v5 + uses: actions/download-artifact@v6 with: name: 'Code coverage' path: coverage @@ -356,7 +356,7 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 20 # 2025-11-20: Takes about 4 minutes steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 # For pull requests, list-changed-projects.sh needs the merge base. # But it doesn't have to be checked out. @@ -412,7 +412,7 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 5 # 2025-11-20: Takes less than a minute. steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - name: Setup tools uses: ./.github/actions/tool-setup with: diff --git a/.github/workflows/update-jetpack-staging-sites.yml b/.github/workflows/update-jetpack-staging-sites.yml index 6d0d959a40a9..ff473ed344d8 100644 --- a/.github/workflows/update-jetpack-staging-sites.yml +++ b/.github/workflows/update-jetpack-staging-sites.yml @@ -14,7 +14,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout repo - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Env config env: @@ -35,7 +35,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout repo - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Run k6 frontend tests uses: grafana/k6-action@v0.3.0 @@ -58,7 +58,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout repo - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Execute shell script shell: bash diff --git a/.github/workflows/update-phan-stubs.yml b/.github/workflows/update-phan-stubs.yml index 9a16c158d526..05f7ac67d53c 100644 --- a/.github/workflows/update-phan-stubs.yml +++ b/.github/workflows/update-phan-stubs.yml @@ -20,7 +20,7 @@ jobs: name: Update stubs runs-on: ubuntu-latest steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 with: # Use the matticbot token so CI runs on the created PR. token: ${{ secrets.STUB_UPDATE_TOKEN_GITHUB }} diff --git a/.github/workflows/wpcloud.yml b/.github/workflows/wpcloud.yml index ec36f8f0e248..6266755ebeaf 100644 --- a/.github/workflows/wpcloud.yml +++ b/.github/workflows/wpcloud.yml @@ -21,7 +21,7 @@ jobs: outputs: wpcomsh: ${{ steps.changed.outputs.wpcomsh }} steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 # For pull requests, list-changed-projects.sh needs the merge base. # But it doesn't have to be checked out. @@ -85,7 +85,7 @@ jobs: needs: build if: needs.build.outputs.wpcomsh == 'true' steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - name: Restore wpcomsh build cache id: wpcomsh-build-cache diff --git a/.phan/stubs/gutenberg-stubs.php b/.phan/stubs/gutenberg-stubs.php index 6aa76f808752..edc589a818b7 100644 --- a/.phan/stubs/gutenberg-stubs.php +++ b/.phan/stubs/gutenberg-stubs.php @@ -1,6 +1,6 @@ =7.0.0' + version: 9.39.1 jest: specifier: 30.2.0 version: 30.2.0 @@ -1022,11 +1025,11 @@ importers: specifier: 6.36.0 version: 6.36.0 eslint: - specifier: 9.38.0 - version: 9.38.0 + specifier: 9.39.1 + version: 9.39.1 eslint-plugin-es-x: - specifier: 9.1.2 - version: 9.1.2(eslint@9.38.0) + specifier: 9.2.0 + version: 9.2.0(eslint@9.39.1) globals: specifier: 16.5.0 version: 16.5.0 @@ -1436,8 +1439,8 @@ importers: specifier: 10.36.0 version: 10.36.0(patch_hash=2659f08edd4c0250f15fb428f013852a17e84da9c745e6dae6307de837e4d30b)(react@18.3.1) '@wordpress/dataviews': - specifier: 10.2.0 - version: 10.2.0(patch_hash=2659f08edd4c0250f15fb428f013852a17e84da9c745e6dae6307de837e4d30b)(@types/react@18.3.26)(react@18.3.1) + specifier: 11.0.0 + version: 11.0.0(patch_hash=2659f08edd4c0250f15fb428f013852a17e84da9c745e6dae6307de837e4d30b)(@types/react@18.3.26)(react@18.3.1) '@wordpress/date': specifier: 5.36.0 version: 5.36.0(patch_hash=0c63a888feb97f2f1d416ca013ad85c31b6360b41cc0b6e2b0ae28f778fbdc5b) @@ -1618,8 +1621,8 @@ importers: specifier: 30.9.0 version: 30.9.0(patch_hash=2659f08edd4c0250f15fb428f013852a17e84da9c745e6dae6307de837e4d30b)(@types/react@18.3.26)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@wordpress/dataviews': - specifier: 10.2.0 - version: 10.2.0(patch_hash=2659f08edd4c0250f15fb428f013852a17e84da9c745e6dae6307de837e4d30b)(@types/react@18.3.26)(react@18.3.1) + specifier: 11.0.0 + version: 11.0.0(patch_hash=2659f08edd4c0250f15fb428f013852a17e84da9c745e6dae6307de837e4d30b)(@types/react@18.3.26)(react@18.3.1) '@wordpress/date': specifier: 5.36.0 version: 5.36.0(patch_hash=0c63a888feb97f2f1d416ca013ad85c31b6360b41cc0b6e2b0ae28f778fbdc5b) @@ -1638,12 +1641,6 @@ importers: debug: specifier: 4.4.1 version: 4.4.1 - react: - specifier: ^18.2.0 - version: 18.3.1 - react-dom: - specifier: ^18.2.0 - version: 18.3.1(react@18.3.1) devDependencies: '@storybook/addon-docs': specifier: 10.0.8 @@ -1669,6 +1666,12 @@ importers: jest-environment-jsdom: specifier: 30.2.0 version: 30.2.0 + react: + specifier: ^18.2.0 + version: 18.3.1 + react-dom: + specifier: ^18.2.0 + version: 18.3.1(react@18.3.1) storybook: specifier: 10.0.8 version: 10.0.8(@testing-library/dom@10.4.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -1799,12 +1802,6 @@ importers: prop-types: specifier: ^15.8.1 version: 15.8.1 - react: - specifier: 18.3.1 - version: 18.3.1 - react-dom: - specifier: 18.3.1 - version: 18.3.1(react@18.3.1) devDependencies: '@types/react': specifier: 18.3.26 @@ -1815,6 +1812,12 @@ importers: glob: specifier: 11.1.0 version: 11.1.0 + react: + specifier: ^18.3.1 + version: 18.3.1 + react-dom: + specifier: ^18.3.1 + version: 18.3.1(react@18.3.1) svg2ttf: specifier: ^6.0.3 version: 6.0.3 @@ -2684,8 +2687,8 @@ importers: specifier: 10.36.0 version: 10.36.0(patch_hash=2659f08edd4c0250f15fb428f013852a17e84da9c745e6dae6307de837e4d30b)(react@18.3.1) '@wordpress/dataviews': - specifier: 10.2.0 - version: 10.2.0(patch_hash=2659f08edd4c0250f15fb428f013852a17e84da9c745e6dae6307de837e4d30b)(@types/react@18.3.26)(react@18.3.1) + specifier: 11.0.0 + version: 11.0.0(patch_hash=2659f08edd4c0250f15fb428f013852a17e84da9c745e6dae6307de837e4d30b)(@types/react@18.3.26)(react@18.3.1) '@wordpress/dom-ready': specifier: 4.36.0 version: 4.36.0(patch_hash=2659f08edd4c0250f15fb428f013852a17e84da9c745e6dae6307de837e4d30b) @@ -3262,8 +3265,8 @@ importers: specifier: 10.36.0 version: 10.36.0(patch_hash=2659f08edd4c0250f15fb428f013852a17e84da9c745e6dae6307de837e4d30b)(react@18.3.1) '@wordpress/dataviews': - specifier: 10.2.0 - version: 10.2.0(patch_hash=2659f08edd4c0250f15fb428f013852a17e84da9c745e6dae6307de837e4d30b)(@types/react@18.3.26)(react@18.3.1) + specifier: 11.0.0 + version: 11.0.0(patch_hash=2659f08edd4c0250f15fb428f013852a17e84da9c745e6dae6307de837e4d30b)(@types/react@18.3.26)(react@18.3.1) '@wordpress/date': specifier: 5.36.0 version: 5.36.0(patch_hash=0c63a888feb97f2f1d416ca013ad85c31b6360b41cc0b6e2b0ae28f778fbdc5b) @@ -3371,8 +3374,8 @@ importers: projects/packages/newsletter: dependencies: '@wordpress/dataviews': - specifier: 10.2.0 - version: 10.2.0(patch_hash=2659f08edd4c0250f15fb428f013852a17e84da9c745e6dae6307de837e4d30b)(@types/react@18.3.26)(react@18.3.1) + specifier: 11.0.0 + version: 11.0.0(patch_hash=2659f08edd4c0250f15fb428f013852a17e84da9c745e6dae6307de837e4d30b)(@types/react@18.3.26)(react@18.3.1) '@wordpress/element': specifier: 6.36.0 version: 6.36.0(patch_hash=2659f08edd4c0250f15fb428f013852a17e84da9c745e6dae6307de837e4d30b) @@ -3886,8 +3889,8 @@ importers: specifier: 10.36.0 version: 10.36.0(patch_hash=2659f08edd4c0250f15fb428f013852a17e84da9c745e6dae6307de837e4d30b)(react@18.3.1) '@wordpress/dataviews': - specifier: 10.2.0 - version: 10.2.0(patch_hash=2659f08edd4c0250f15fb428f013852a17e84da9c745e6dae6307de837e4d30b)(react@18.3.1) + specifier: 11.0.0 + version: 11.0.0(patch_hash=2659f08edd4c0250f15fb428f013852a17e84da9c745e6dae6307de837e4d30b)(react@18.3.1) '@wordpress/element': specifier: 6.36.0 version: 6.36.0(patch_hash=2659f08edd4c0250f15fb428f013852a17e84da9c745e6dae6307de837e4d30b) @@ -3957,9 +3960,6 @@ importers: '@automattic/jetpack-api': specifier: workspace:* version: link:../../js-packages/api - '@automattic/jetpack-base-styles': - specifier: workspace:* - version: link:../../js-packages/base-styles '@automattic/jetpack-components': specifier: workspace:* version: link:../../js-packages/components @@ -3969,9 +3969,6 @@ importers: '@automattic/jetpack-script-data': specifier: workspace:* version: link:../../js-packages/script-data - '@automattic/jetpack-shared-extension-utils': - specifier: workspace:* - version: link:../../js-packages/shared-extension-utils '@wordpress/api-fetch': specifier: 7.36.0 version: 7.36.0(patch_hash=0c63a888feb97f2f1d416ca013ad85c31b6360b41cc0b6e2b0ae28f778fbdc5b) @@ -4057,6 +4054,12 @@ importers: '@automattic/calypso-color-schemes': specifier: 4.0.0 version: 4.0.0 + '@automattic/jetpack-base-styles': + specifier: workspace:* + version: link:../../js-packages/base-styles + '@automattic/jetpack-shared-extension-utils': + specifier: workspace:* + version: link:../../js-packages/shared-extension-utils '@automattic/jetpack-webpack-config': specifier: workspace:* version: link:../../js-packages/webpack-config @@ -4796,10 +4799,6 @@ importers: version: 6.0.1(webpack@5.101.3) projects/plugins/inspect: - dependencies: - tslib: - specifier: 2.8.1 - version: 2.8.1 devDependencies: '@babel/core': specifier: 7.28.4 @@ -4846,6 +4845,9 @@ importers: svelte-preprocess: specifier: 6.0.2 version: 6.0.2(@babel/core@7.28.4)(postcss@8.5.6)(sass-embedded@1.87.0)(svelte@4.2.19)(typescript@5.9.3) + tslib: + specifier: 2.8.1 + version: 2.8.1 typescript: specifier: 5.9.3 version: 5.9.3 @@ -5937,17 +5939,17 @@ importers: specifier: 7.27.1 version: 7.27.1(@babel/core@7.28.4) '@eslint/compat': - specifier: 1.4.0 - version: 1.4.0(eslint@9.38.0) + specifier: 2.0.0 + version: 2.0.0(eslint@9.39.1) '@eslint/eslintrc': - specifier: 3.3.1 - version: 3.3.1 + specifier: 3.3.3 + version: 3.3.3 '@eslint/js': - specifier: 9.38.0 - version: 9.38.0 + specifier: 9.39.1 + version: 9.39.1 '@eslint/json': - specifier: 0.13.2 - version: 0.13.2 + specifier: 0.14.0 + version: 0.14.0 '@octokit/auth-token': specifier: 5.1.2 version: 5.1.2 @@ -5956,13 +5958,13 @@ importers: version: 21.1.1 '@tanstack/eslint-plugin-query': specifier: 5.91.2 - version: 5.91.2(eslint@9.38.0)(typescript@5.9.3) + version: 5.91.2(eslint@9.39.1)(typescript@5.9.3) '@testing-library/jest-dom': specifier: 6.9.1 version: 6.9.1 '@wordpress/eslint-plugin': specifier: 22.22.0 - version: 22.22.0(@babel/core@7.28.4)(eslint-config-prettier@10.1.8(eslint@9.38.0))(eslint-plugin-import@2.32.0)(eslint-plugin-jest@29.0.1(eslint@9.38.0)(jest@30.2.0)(typescript@5.9.3))(eslint-plugin-jsdoc@51.4.1(eslint@9.38.0))(eslint-plugin-jsx-a11y@6.10.2(eslint@9.38.0))(eslint-plugin-playwright@2.2.2(eslint@9.38.0))(eslint-plugin-prettier@5.5.4(eslint-config-prettier@10.1.8(eslint@9.38.0))(eslint@9.38.0)(wp-prettier@3.0.3))(eslint-plugin-react-hooks@5.2.0(eslint@9.38.0))(eslint-plugin-react@7.37.5(eslint@9.38.0))(eslint@9.38.0)(typescript@5.9.3)(wp-prettier@3.0.3) + version: 22.22.0(@babel/core@7.28.4)(eslint-config-prettier@10.1.8(eslint@9.39.1))(eslint-plugin-import@2.32.0)(eslint-plugin-jest@29.2.1(eslint@9.39.1)(jest@30.2.0)(typescript@5.9.3))(eslint-plugin-jsdoc@61.4.1(eslint@9.39.1))(eslint-plugin-jsx-a11y@6.10.2(eslint@9.39.1))(eslint-plugin-playwright@2.4.0(eslint@9.39.1))(eslint-plugin-prettier@5.5.4(eslint-config-prettier@10.1.8(eslint@9.39.1))(eslint@9.39.1)(wp-prettier@3.0.3))(eslint-plugin-react-hooks@7.0.1(eslint@9.39.1))(eslint-plugin-react@7.37.5(eslint@9.39.1))(eslint@9.39.1)(typescript@5.9.3)(wp-prettier@3.0.3) '@wordpress/jest-console': specifier: 8.36.0 version: 8.36.0(patch_hash=0c63a888feb97f2f1d416ca013ad85c31b6360b41cc0b6e2b0ae28f778fbdc5b)(jest@30.2.0) @@ -5982,62 +5984,62 @@ importers: specifier: 2.4.1 version: 2.4.1 eslint: - specifier: 9.38.0 - version: 9.38.0 + specifier: 9.39.1 + version: 9.39.1 eslint-config-prettier: specifier: 10.1.8 - version: 10.1.8(eslint@9.38.0) + version: 10.1.8(eslint@9.39.1) eslint-import-resolver-typescript: specifier: 4.4.4 - version: 4.4.4(eslint-plugin-import@2.32.0)(eslint@9.38.0) + version: 4.4.4(eslint-plugin-import@2.32.0)(eslint@9.39.1) eslint-json-compat-utils: specifier: 0.2.1 - version: 0.2.1(@eslint/json@0.13.2)(eslint@9.38.0)(jsonc-eslint-parser@2.4.1) + version: 0.2.1(@eslint/json@0.14.0)(eslint@9.39.1)(jsonc-eslint-parser@2.4.1) eslint-plugin-es-x: - specifier: 9.1.2 - version: 9.1.2(eslint@9.38.0) + specifier: 9.2.0 + version: 9.2.0(eslint@9.39.1) eslint-plugin-import: specifier: 2.32.0 - version: 2.32.0(eslint-import-resolver-typescript@4.4.4)(eslint@9.38.0) + version: 2.32.0(eslint-import-resolver-typescript@4.4.4)(eslint@9.39.1) eslint-plugin-jest: - specifier: 29.0.1 - version: 29.0.1(eslint@9.38.0)(jest@30.2.0)(typescript@5.9.3) + specifier: 29.2.1 + version: 29.2.1(eslint@9.39.1)(jest@30.2.0)(typescript@5.9.3) eslint-plugin-jest-dom: specifier: 5.5.0 - version: 5.5.0(eslint@9.38.0) + version: 5.5.0(eslint@9.39.1) eslint-plugin-jsdoc: - specifier: 51.4.1 - version: 51.4.1(eslint@9.38.0) + specifier: 61.4.1 + version: 61.4.1(eslint@9.39.1) eslint-plugin-jsx-a11y: specifier: 6.10.2 - version: 6.10.2(eslint@9.38.0) + version: 6.10.2(eslint@9.39.1) eslint-plugin-lodash: specifier: 8.0.0 - version: 8.0.0(eslint@9.38.0) + version: 8.0.0(eslint@9.39.1) eslint-plugin-n: specifier: 17.23.1 - version: 17.23.1(eslint@9.38.0)(typescript@5.9.3) + version: 17.23.1(eslint@9.39.1)(typescript@5.9.3) eslint-plugin-package-json: - specifier: 0.59.0 - version: 0.59.0(eslint@9.38.0)(jsonc-eslint-parser@2.4.1) + specifier: 0.85.0 + version: 0.85.0(eslint@9.39.1)(jsonc-eslint-parser@2.4.1) eslint-plugin-playwright: - specifier: 2.2.2 - version: 2.2.2(eslint@9.38.0) + specifier: 2.4.0 + version: 2.4.0(eslint@9.39.1) eslint-plugin-prettier: specifier: 5.5.4 - version: 5.5.4(eslint-config-prettier@10.1.8(eslint@9.38.0))(eslint@9.38.0)(wp-prettier@3.0.3) + version: 5.5.4(eslint-config-prettier@10.1.8(eslint@9.39.1))(eslint@9.39.1)(wp-prettier@3.0.3) eslint-plugin-react: specifier: 7.37.5 - version: 7.37.5(eslint@9.38.0) + version: 7.37.5(eslint@9.39.1) eslint-plugin-react-hooks: - specifier: 5.2.0 - version: 5.2.0(eslint@9.38.0) + specifier: 7.0.1 + version: 7.0.1(eslint@9.39.1) eslint-plugin-svelte: - specifier: 3.12.5 - version: 3.12.5(eslint@9.38.0)(svelte@4.2.19) + specifier: 3.13.0 + version: 3.13.0(eslint@9.39.1)(svelte@4.2.19) eslint-plugin-testing-library: - specifier: 7.13.3 - version: 7.13.3(eslint@9.38.0)(typescript@5.9.3) + specifier: 7.13.5 + version: 7.13.5(eslint@9.39.1)(typescript@5.9.3) eslint-plugin-you-dont-need-lodash-underscore: specifier: 6.14.0 version: 6.14.0 @@ -6096,8 +6098,8 @@ importers: specifier: 5.9.3 version: 5.9.3 typescript-eslint: - specifier: 8.46.2 - version: 8.46.2(eslint@9.38.0)(typescript@5.9.3) + specifier: 8.48.0 + version: 8.48.0(eslint@9.39.1)(typescript@5.9.3) yaml: specifier: 2.2.2 version: 2.2.2 @@ -7206,10 +7208,14 @@ packages: '@emotion/weak-memoize@0.4.0': resolution: {integrity: sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==} - '@es-joy/jsdoccomment@0.52.0': - resolution: {integrity: sha512-BXuN7BII+8AyNtn57euU2Yxo9yA/KUDNzrpXyi3pfqKmBhhysR6ZWOebFh3vyPoqA3/j1SOvGgucElMGwlXing==} + '@es-joy/jsdoccomment@0.76.0': + resolution: {integrity: sha512-g+RihtzFgGTx2WYCuTHbdOXJeAlGnROws0TeALx9ow/ZmOROOZkVg5wp/B44n0WJgI4SQFP1eWM2iRPlU2Y14w==} engines: {node: '>=20.11.0'} + '@es-joy/resolve.exports@1.2.0': + resolution: {integrity: sha512-Q9hjxWI5xBM+qW2enxfe8wDKdFWMfd0Z29k5ZJnuBqD/CasY5Zryj09aCA6owbGATWz+39p5uIdaHXpopOcG8g==} + engines: {node: '>=10'} + '@esbuild/aix-ppc64@0.25.9': resolution: {integrity: sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==} engines: {node: '>=18'} @@ -7376,9 +7382,9 @@ packages: resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/compat@1.4.0': - resolution: {integrity: sha512-DEzm5dKeDBPm3r08Ixli/0cmxr8LkRdwxMRUIJBlSCpAwSrvFEJpVBzV+66JhDxiaqKxnRzCXhtiMiczF7Hglg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/compat@2.0.0': + resolution: {integrity: sha512-T9AfE1G1uv4wwq94ozgTGio5EUQBqAVe1X9qsQtSNVEYW6j3hvtZVm8Smr4qL1qDPFg+lOB2cL5RxTRMzq4CTA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} peerDependencies: eslint: ^8.40 || 9 peerDependenciesMeta: @@ -7393,38 +7399,30 @@ packages: resolution: {integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/core@0.15.2': - resolution: {integrity: sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/core@0.16.0': - resolution: {integrity: sha512-nmC8/totwobIiFcGkDza3GIKfAw1+hLiYVrh3I1nIomQ8PEr5cxg34jnkmGawul/ep52wGRAcyeDCNtWKSOj4Q==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/core@0.17.0': resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/eslintrc@3.3.1': - resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} + '@eslint/core@1.0.0': + resolution: {integrity: sha512-PRfWP+8FOldvbApr6xL7mNCw4cJcSTq4GA7tYbgq15mRb0kWKO/wEB2jr+uwjFH3sZvEZneZyCUGTxsv4Sahyw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + '@eslint/eslintrc@3.3.3': + resolution: {integrity: sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.38.0': - resolution: {integrity: sha512-UZ1VpFvXf9J06YG9xQBdnzU+kthors6KjhMAl6f4gH4usHyh31rUf2DLGInT8RFYIReYXNSydgPY0V2LuWgl7A==} + '@eslint/js@9.39.1': + resolution: {integrity: sha512-S26Stp4zCy88tH94QbBv3XCuzRQiZ9yXofEILmglYTh/Ug/a9/umqvgFtYBAo3Lp0nsI/5/qH1CCrbdK3AP1Tw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/json@0.13.2': - resolution: {integrity: sha512-yWLyRE18rHgHXhWigRpiyv1LDPkvWtC6oa7QHXW7YdP6gosJoq7BiLZW2yCs9U7zN7X4U3ZeOJjepA10XAOIMw==} + '@eslint/json@0.14.0': + resolution: {integrity: sha512-rvR/EZtvUG3p9uqrSmcDJPYSH7atmWr0RnFWN6m917MAPx82+zQgPUmDu0whPFG6XTyM0vB/hR6c1Q63OaYtCQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/object-schema@2.1.7': resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/plugin-kit@0.3.5': - resolution: {integrity: sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/plugin-kit@0.4.1': resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -8790,6 +8788,10 @@ packages: '@sinclair/typebox@0.34.41': resolution: {integrity: sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==} + '@sindresorhus/base62@1.0.0': + resolution: {integrity: sha512-TeheYy0ILzBEI/CO55CP6zJCSdSWeRtGnHy8U8dWSUH4I68iqTsy7HkMktR4xakThc9jotkPQUXT4ITdbV7cHA==} + engines: {node: '>=18'} + '@sinonjs/commons@3.0.1': resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} @@ -9481,100 +9483,63 @@ packages: '@types/yauzl@2.10.3': resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} - '@typescript-eslint/eslint-plugin@8.46.2': - resolution: {integrity: sha512-ZGBMToy857/NIPaaCucIUQgqueOiq7HeAKkhlvqVV4lm089zUFW6ikRySx2v+cAhKeUCPuWVHeimyk6Dw1iY3w==} + '@typescript-eslint/eslint-plugin@8.48.0': + resolution: {integrity: sha512-XxXP5tL1txl13YFtrECECQYeZjBZad4fyd3cFV4a19LkAY/bIp9fev3US4S5fDVV2JaYFiKAZ/GRTOLer+mbyQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.46.2 + '@typescript-eslint/parser': ^8.48.0 eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/parser@8.46.2': - resolution: {integrity: sha512-BnOroVl1SgrPLywqxyqdJ4l3S2MsKVLDVxZvjI1Eoe8ev2r3kGDo+PcMihNmDE+6/KjkTubSJnmqGZZjQSBq/g==} + '@typescript-eslint/parser@8.48.0': + resolution: {integrity: sha512-jCzKdm/QK0Kg4V4IK/oMlRZlY+QOcdjv89U2NgKHZk1CYTj82/RVSx1mV/0gqCVMJ/DA+Zf/S4NBWNF8GQ+eqQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/project-service@8.46.2': - resolution: {integrity: sha512-PULOLZ9iqwI7hXcmL4fVfIsBi6AN9YxRc0frbvmg8f+4hQAjQ5GYNKK0DIArNo+rOKmR/iBYwkpBmnIwin4wBg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.0.0' - - '@typescript-eslint/project-service@8.46.4': - resolution: {integrity: sha512-nPiRSKuvtTN+no/2N1kt2tUh/HoFzeEgOm9fQ6XQk4/ApGqjx0zFIIaLJ6wooR1HIoozvj2j6vTi/1fgAz7UYQ==} + '@typescript-eslint/project-service@8.48.0': + resolution: {integrity: sha512-Ne4CTZyRh1BecBf84siv42wv5vQvVmgtk8AuiEffKTUo3DrBaGYZueJSxxBZ8fjk/N3DrgChH4TOdIOwOwiqqw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/scope-manager@8.46.2': - resolution: {integrity: sha512-LF4b/NmGvdWEHD2H4MsHD8ny6JpiVNDzrSZr3CsckEgCbAGZbYM4Cqxvi9L+WqDMT+51Ozy7lt2M+d0JLEuBqA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/scope-manager@8.46.4': - resolution: {integrity: sha512-tMDbLGXb1wC+McN1M6QeDx7P7c0UWO5z9CXqp7J8E+xGcJuUuevWKxuG8j41FoweS3+L41SkyKKkia16jpX7CA==} + '@typescript-eslint/scope-manager@8.48.0': + resolution: {integrity: sha512-uGSSsbrtJrLduti0Q1Q9+BF1/iFKaxGoQwjWOIVNJv0o6omrdyR8ct37m4xIl5Zzpkp69Kkmvom7QFTtue89YQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.46.2': - resolution: {integrity: sha512-a7QH6fw4S57+F5y2FIxxSDyi5M4UfGF+Jl1bCGd7+L4KsaUY80GsiF/t0UoRFDHAguKlBaACWJRmdrc6Xfkkag==} + '@typescript-eslint/tsconfig-utils@8.48.0': + resolution: {integrity: sha512-WNebjBdFdyu10sR1M4OXTt2OkMd5KWIL+LLfeH9KhgP+jzfDV/LI3eXzwJ1s9+Yc0Kzo2fQCdY/OpdusCMmh6w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/tsconfig-utils@8.46.4': - resolution: {integrity: sha512-+/XqaZPIAk6Cjg7NWgSGe27X4zMGqrFqZ8atJsX3CWxH/jACqWnrWI68h7nHQld0y+k9eTTjb9r+KU4twLoo9A==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.0.0' - - '@typescript-eslint/type-utils@8.46.2': - resolution: {integrity: sha512-HbPM4LbaAAt/DjxXaG9yiS9brOOz6fabal4uvUmaUYe6l3K1phQDMQKBRUrr06BQkxkvIZVVHttqiybM9nJsLA==} + '@typescript-eslint/type-utils@8.48.0': + resolution: {integrity: sha512-zbeVaVqeXhhab6QNEKfK96Xyc7UQuoFWERhEnj3mLVnUWrQnv15cJNseUni7f3g557gm0e46LZ6IJ4NJVOgOpw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/types@8.46.2': - resolution: {integrity: sha512-lNCWCbq7rpg7qDsQrd3D6NyWYu+gkTENkG5IKYhUIcxSb59SQC/hEQ+MrG4sTgBVghTonNWq42bA/d4yYumldQ==} + '@typescript-eslint/types@8.48.0': + resolution: {integrity: sha512-cQMcGQQH7kwKoVswD1xdOytxQR60MWKM1di26xSUtxehaDs/32Zpqsu5WJlXTtTTqyAVK8R7hvsUnIXRS+bjvA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/types@8.46.4': - resolution: {integrity: sha512-USjyxm3gQEePdUwJBFjjGNG18xY9A2grDVGuk7/9AkjIF1L+ZrVnwR5VAU5JXtUnBL/Nwt3H31KlRDaksnM7/w==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/typescript-estree@8.46.2': - resolution: {integrity: sha512-f7rW7LJ2b7Uh2EiQ+7sza6RDZnajbNbemn54Ob6fRwQbgcIn+GWfyuHDHRYgRoZu1P4AayVScrRW+YfbTvPQoQ==} + '@typescript-eslint/typescript-estree@8.48.0': + resolution: {integrity: sha512-ljHab1CSO4rGrQIAyizUS6UGHHCiAYhbfcIZ1zVJr5nMryxlXMVWS3duFPSKvSUbFPwkXMFk1k0EMIjub4sRRQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/typescript-estree@8.46.4': - resolution: {integrity: sha512-7oV2qEOr1d4NWNmpXLR35LvCfOkTNymY9oyW+lUHkmCno7aOmIf/hMaydnJBUTBMRCOGZh8YjkFOc8dadEoNGA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.0.0' - - '@typescript-eslint/utils@8.46.2': - resolution: {integrity: sha512-sExxzucx0Tud5tE0XqR0lT0psBQvEpnpiul9XbGUB1QwpWJJAps1O/Z7hJxLGiZLBKMCutjTzDgmd1muEhBnVg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' - - '@typescript-eslint/utils@8.46.4': - resolution: {integrity: sha512-AbSv11fklGXV6T28dp2Me04Uw90R2iJ30g2bgLz529Koehrmkbs1r7paFqr1vPCZi7hHwYxYtxfyQMRC8QaVSg==} + '@typescript-eslint/utils@8.48.0': + resolution: {integrity: sha512-yTJO1XuGxCsSfIVt1+1UrLHtue8xz16V8apzPYI06W0HbEbEWHxHXgZaAgavIkoh+GeV6hKKd5jm0sS6OYxWXQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/visitor-keys@8.46.2': - resolution: {integrity: sha512-tUFMXI4gxzzMXt4xpGJEsBsTox0XbNQ1y94EwlD/CuZwFcQP79xfQqMhau9HsRc/J0cAPA/HZt1dZPtGn9V/7w==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/visitor-keys@8.46.4': - resolution: {integrity: sha512-/++5CYLQqsO9HFGLI7APrxBJYo+5OCMpViuhV8q5/Qa3o5mMrF//eQHks+PXcsAVaLdn817fMuS7zqoXNNZGaw==} + '@typescript-eslint/visitor-keys@8.48.0': + resolution: {integrity: sha512-T0XJMaRPOH3+LBbAfzR2jalckP1MSG/L9eUtY0DEzUyVaXJ/t6zN0nR7co5kz0Jko/nkSYCBRkz1djvjajVTTg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@ungap/structured-clone@1.3.0': @@ -10011,12 +9976,6 @@ packages: peerDependencies: react: ^18.0.0 - '@wordpress/dataviews@10.2.0': - resolution: {integrity: sha512-Kwt5tB4SRkyWFVVqgGNraRajNm5lACObrzLV1f2A2343dQ88cgiS5iukI9qdhzy7CiGIHN7UrQaFbpDoTtOKAA==} - engines: {node: '>=18.12.0', npm: '>=8.19.2'} - peerDependencies: - react: ^18.0.0 - '@wordpress/dataviews@11.0.0': resolution: {integrity: sha512-En5jZGybCYrkPRX6XBaN6sROeYx11z26vU4y6ZteS607htJlU1e+nKSE5R2o6V8d4NaQaa03jgs/s0N89KHWEQ==} engines: {node: '>=18.12.0', npm: '>=8.19.2'} @@ -12040,8 +11999,8 @@ packages: peerDependencies: eslint: '>=8' - eslint-plugin-es-x@9.1.2: - resolution: {integrity: sha512-v019GsVMydtD8e0QazxOtwQRtmKVZgkpykvUwaKH8otLHaLsnV6txRrQWN4MeGn8W1A00Dh8N0R41uiIyvMsYA==} + eslint-plugin-es-x@9.2.0: + resolution: {integrity: sha512-mQrBhl8pvoKih9ohoK5t0v4ihugf3NJEKIXtEokz0BPEcTTjDssntXREgrVbLOM/G6tcUcjGfptyuQ8eNnXzwQ==} engines: {node: ^20.19.0 || >=22.12.0} peerDependencies: eslint: '>=9.29.0' @@ -12066,8 +12025,8 @@ packages: '@testing-library/dom': optional: true - eslint-plugin-jest@29.0.1: - resolution: {integrity: sha512-EE44T0OSMCeXhDrrdsbKAhprobKkPtJTbQz5yEktysNpHeDZTAL1SfDTNKmcFfJkY6yrQLtTKZALrD3j/Gpmiw==} + eslint-plugin-jest@29.2.1: + resolution: {integrity: sha512-0WLIezrIxitUGbjMIGwznVzSIp0uFJV0PZ2fiSvpyVcxe+QMXKUt7MRhUpzdbctnnLwiOTOFkACplgB0wAglFw==} engines: {node: ^20.12.0 || ^22.0.0 || >=24.0.0} peerDependencies: '@typescript-eslint/eslint-plugin': ^8.0.0 @@ -12079,8 +12038,8 @@ packages: jest: optional: true - eslint-plugin-jsdoc@51.4.1: - resolution: {integrity: sha512-y4CA9OkachG8v5nAtrwvcvjIbdcKgSyS6U//IfQr4FZFFyeBFwZFf/tfSsMr46mWDJgidZjBTqoCRlXywfFBMg==} + eslint-plugin-jsdoc@61.4.1: + resolution: {integrity: sha512-3c1QW/bV25sJ1MsIvsvW+EtLtN6yZMduw7LVQNVt72y2/5BbV5Pg5b//TE5T48LRUxoEQGaZJejCmcj3wCxBzw==} engines: {node: '>=20.11.0'} peerDependencies: eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 @@ -12103,16 +12062,16 @@ packages: peerDependencies: eslint: '>=8.23.0' - eslint-plugin-package-json@0.59.0: - resolution: {integrity: sha512-4xdVhL3b7LqQQh8cvN3hX8HkAVM6cxZoXqyN4ZE4kN9NuJ21sgnj1IGS19/bmIgCdGBhmsWGXbbyD1H9mjZfMA==} + eslint-plugin-package-json@0.85.0: + resolution: {integrity: sha512-MrOxFvhbqLuk4FIPG9v3u9Amn0n137J8LKILHvgfxK3rRyAHEVzuZM0CtpXFTx7cx4LzmAzONtlpjbM0UFNuTA==} engines: {node: ^20.19.0 || >=22.12.0} peerDependencies: eslint: '>=8.0.0' jsonc-eslint-parser: ^2.0.0 - eslint-plugin-playwright@2.2.2: - resolution: {integrity: sha512-j0jKpndIPOXRRP9uMkwb9l/nSmModOU3452nrFdgFJoEv/435J1onk8+aITzjDW8DfypxgmVaDMdmVIa6F7I0w==} - engines: {node: '>=16.6.0'} + eslint-plugin-playwright@2.4.0: + resolution: {integrity: sha512-MWNXfXlLfwXAjj4Z80PvCCFCXgCYy5OCHan57Z/beGrjkJ3maG1GanuGX8Ck6T6fagplBx2ZdkifxSfByftaTQ==} + engines: {node: '>=16.9.0'} peerDependencies: eslint: '>=8.40.0' @@ -12130,9 +12089,9 @@ packages: eslint-config-prettier: optional: true - eslint-plugin-react-hooks@5.2.0: - resolution: {integrity: sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==} - engines: {node: '>=10'} + eslint-plugin-react-hooks@7.0.1: + resolution: {integrity: sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA==} + engines: {node: '>=18'} peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 @@ -12142,8 +12101,8 @@ packages: peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 - eslint-plugin-svelte@3.12.5: - resolution: {integrity: sha512-4KRG84eAHQfYd9OjZ1K7sCHy0nox+9KwT+s5WCCku3jTim5RV4tVENob274nCwIaApXsYPKAUAZFBxKZ3Wyfjw==} + eslint-plugin-svelte@3.13.0: + resolution: {integrity: sha512-2ohCCQJJTNbIpQCSDSTWj+FN0OVfPmSO03lmSNT7ytqMaWF6kpT86LdzDqtm4sh7TVPl/OEWJ/d7R87bXP2Vjg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.1 || ^9.0.0 @@ -12152,9 +12111,9 @@ packages: svelte: optional: true - eslint-plugin-testing-library@7.13.3: - resolution: {integrity: sha512-STwyXN7GnHulgsfdXVd5iC8fFCJVRQj2AcKtMmQOsA8G4oMnSCOX1p3MjbrDQ9fmwVf5wZy6vboTOTFobWuxOA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0, pnpm: ^9.14.0} + eslint-plugin-testing-library@7.13.5: + resolution: {integrity: sha512-75rUmtNnXeO9cyMwG78vXxGEB7muIQ+IwcwBTma+M9KFc68SFaMKevGydObsUgX+IFef4lRLO/ysR9JqK1odyg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -12188,8 +12147,8 @@ packages: resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.38.0: - resolution: {integrity: sha512-t5aPOpmtJcZcz5UJyY2GbvpDlsK5E8JqRqoKtfiKE3cNh437KIqfJr3A3AKf5k64NPx6d0G3dno6XDY05PqPtw==} + eslint@9.39.1: + resolution: {integrity: sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -12799,6 +12758,12 @@ packages: header-case@2.0.4: resolution: {integrity: sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==} + hermes-estree@0.25.1: + resolution: {integrity: sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==} + + hermes-parser@0.25.1: + resolution: {integrity: sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==} + highlight-words-core@1.2.3: resolution: {integrity: sha512-m1O9HW3/GNHxzSIXWw1wCNXXsgLlxrP0OI6+ycGUhiUHkikqW3OrwVHz+lxeNBe5yqLESdIcj8PowHQ2zLvUvQ==} @@ -13514,9 +13479,9 @@ packages: resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} hasBin: true - jsdoc-type-pratt-parser@4.1.0: - resolution: {integrity: sha512-Hicd6JK5Njt2QB6XYFS7ok9e37O8AYk3jTcppG4YVQnYjOemymvTcmc7OWsmq/Qqj5TdRFO5/x/tIPmBeRtGHg==} - engines: {node: '>=12.0.0'} + jsdoc-type-pratt-parser@6.10.0: + resolution: {integrity: sha512-+LexoTRyYui5iOhJGn13N9ZazL23nAHGkXsa1p/C8yeq79WRfLBag6ZZ0FQG2aRoc9yfo59JT9EYCQonOkHKkQ==} + engines: {node: '>=20.0.0'} jsdom@26.1.0: resolution: {integrity: sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg==} @@ -14298,6 +14263,9 @@ packages: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} + object-deep-merge@2.0.0: + resolution: {integrity: sha512-3DC3UMpeffLTHiuXSy/UG4NOIYTLlY9u3V82+djSCLYClWobZiS4ivYzpIUWrRY/nfsJ8cWsKyG3QfyLePmhvg==} + object-inspect@1.13.4: resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} engines: {node: '>= 0.4'} @@ -14476,8 +14444,8 @@ packages: package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} - package-json-validator@0.31.0: - resolution: {integrity: sha512-kAVO0fNFWI2xpmthogYHnHjCtg0nJvwm9yjd9nnrR5OKIts5fmNMK2OhhjnLD1/ohJNodhCa5tZm8AolOgkfMg==} + package-json-validator@0.59.0: + resolution: {integrity: sha512-WBTDKtO9pBa9GmA1sPbQHqlWxRdnHNfLFIIA49PPgV7px/rG27gHX57DWy77qyu374fla4veaIHy+gA+qRRuug==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true @@ -15463,6 +15431,10 @@ packages: reselect@5.1.1: resolution: {integrity: sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==} + reserved-identifiers@1.2.0: + resolution: {integrity: sha512-yE7KUfFvaBFzGPs5H3Ops1RevfUEsDc5Iz65rOwWg4lE8HJSYtle77uul3+573457oHvBKuHYDl/xqUkKpEEdw==} + engines: {node: '>=18'} + resize-observer-polyfill@1.5.1: resolution: {integrity: sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==} @@ -16534,6 +16506,10 @@ packages: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} + to-valid-identifier@1.0.0: + resolution: {integrity: sha512-41wJyvKep3yT2tyPqX/4blcfybknGB4D+oETKLs7Q76UiPqRpUJK3hr1nxelyYO0PHKVzJwlu0aCeEAsGI6rpw==} + engines: {node: '>=20'} + toidentifier@1.0.1: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} @@ -16707,8 +16683,8 @@ packages: typescript-compare@0.0.2: resolution: {integrity: sha512-8ja4j7pMHkfLJQO2/8tut7ub+J3Lw2S3061eJLFQcvs3tsmJKp8KG5NtpLn7KcY2w08edF74BSVN7qJS0U6oHA==} - typescript-eslint@8.46.2: - resolution: {integrity: sha512-vbw8bOmiuYNdzzV3lsiWv6sRwjyuKJMQqWulBOU7M0RrxedXledX8G8kBbQeiOYDnTfiXz0Y4081E1QMNB6iQg==} + typescript-eslint@8.48.0: + resolution: {integrity: sha512-fcKOvQD9GUn3Xw63EgiDqhvWJ5jsyZUaekl3KVpGsDJnN46WJTe3jWxtQP9lMZm1LJNkFLlTaWAxK2vUQR+cqw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -16908,9 +16884,9 @@ packages: validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} - validate-npm-package-name@6.0.2: - resolution: {integrity: sha512-IUoow1YUtvoBBC06dXs8bR8B9vuA3aJfmQNKMoaPG/OFsPmoQvw8xh+6Ye25Gx9DQhoEom3Pcu9MKHerm/NpUQ==} - engines: {node: ^18.17.0 || >=20.5.0} + validate-npm-package-name@7.0.0: + resolution: {integrity: sha512-bwVk/OK+Qu108aJcMAEiU4yavHUI7aN20TgZNBj9MR2iU1zPUl1Z1Otr7771ExfYTPTvfN8ZJ1pbr5Iklgt4xg==} + engines: {node: ^20.17.0 || >=22.9.0} varint@6.0.0: resolution: {integrity: sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==} @@ -17276,6 +17252,12 @@ packages: resolution: {integrity: sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==} engines: {node: '>=12.20'} + zod-validation-error@4.0.2: + resolution: {integrity: sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==} + engines: {node: '>=18.0.0'} + peerDependencies: + zod: ^3.25.0 || ^4.0.0 + zod@3.25.76: resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} @@ -17357,7 +17339,7 @@ snapshots: '@automattic/api-core@1.0.0(@types/react@18.3.26)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@automattic/shopping-cart': 2.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@wordpress/dataviews': 10.2.0(patch_hash=2659f08edd4c0250f15fb428f013852a17e84da9c745e6dae6307de837e4d30b)(@types/react@18.3.26)(react@18.3.1) + '@wordpress/dataviews': 11.0.0(patch_hash=2659f08edd4c0250f15fb428f013852a17e84da9c745e6dae6307de837e4d30b)(@types/react@18.3.26)(react@18.3.1) '@wordpress/i18n': 6.9.0(patch_hash=0c63a888feb97f2f1d416ca013ad85c31b6360b41cc0b6e2b0ae28f778fbdc5b) he: 1.2.0 tslib: 2.8.1 @@ -17689,11 +17671,11 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/eslint-parser@7.28.5(@babel/core@7.28.4)(eslint@9.38.0)': + '@babel/eslint-parser@7.28.5(@babel/core@7.28.4)(eslint@9.39.1)': dependencies: '@babel/core': 7.28.4 '@nicolo-ribaudo/eslint-scope-5-internals': 5.1.1-v1 - eslint: 9.38.0 + eslint: 9.39.1 eslint-visitor-keys: 2.1.0 semver: 6.3.1 @@ -18961,13 +18943,15 @@ snapshots: '@emotion/weak-memoize@0.4.0': {} - '@es-joy/jsdoccomment@0.52.0': + '@es-joy/jsdoccomment@0.76.0': dependencies: '@types/estree': 1.0.8 - '@typescript-eslint/types': 8.46.4 + '@typescript-eslint/types': 8.48.0 comment-parser: 1.4.1 esquery: 1.6.0 - jsdoc-type-pratt-parser: 4.1.0 + jsdoc-type-pratt-parser: 6.10.0 + + '@es-joy/resolve.exports@1.2.0': {} '@esbuild/aix-ppc64@0.25.9': optional: true @@ -19047,18 +19031,18 @@ snapshots: '@esbuild/win32-x64@0.25.9': optional: true - '@eslint-community/eslint-utils@4.9.0(eslint@9.38.0)': + '@eslint-community/eslint-utils@4.9.0(eslint@9.39.1)': dependencies: - eslint: 9.38.0 + eslint: 9.39.1 eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.2': {} - '@eslint/compat@1.4.0(eslint@9.38.0)': + '@eslint/compat@2.0.0(eslint@9.39.1)': dependencies: - '@eslint/core': 0.16.0 + '@eslint/core': 1.0.0 optionalDependencies: - eslint: 9.38.0 + eslint: 9.39.1 '@eslint/config-array@0.21.1': dependencies: @@ -19072,19 +19056,15 @@ snapshots: dependencies: '@eslint/core': 0.17.0 - '@eslint/core@0.15.2': - dependencies: - '@types/json-schema': 7.0.15 - - '@eslint/core@0.16.0': + '@eslint/core@0.17.0': dependencies: '@types/json-schema': 7.0.15 - '@eslint/core@0.17.0': + '@eslint/core@1.0.0': dependencies: '@types/json-schema': 7.0.15 - '@eslint/eslintrc@3.3.1': + '@eslint/eslintrc@3.3.3': dependencies: ajv: 6.12.6 debug: 4.4.3 @@ -19098,22 +19078,17 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@9.38.0': {} + '@eslint/js@9.39.1': {} - '@eslint/json@0.13.2': + '@eslint/json@0.14.0': dependencies: - '@eslint/core': 0.15.2 - '@eslint/plugin-kit': 0.3.5 + '@eslint/core': 0.17.0 + '@eslint/plugin-kit': 0.4.1 '@humanwhocodes/momoa': 3.3.10 natural-compare: 1.4.0 '@eslint/object-schema@2.1.7': {} - '@eslint/plugin-kit@0.3.5': - dependencies: - '@eslint/core': 0.15.2 - levn: 0.4.1 - '@eslint/plugin-kit@0.4.1': dependencies: '@eslint/core': 0.17.0 @@ -20820,6 +20795,8 @@ snapshots: '@sinclair/typebox@0.34.41': {} + '@sindresorhus/base62@1.0.0': {} + '@sinonjs/commons@3.0.1': dependencies: type-detect: 4.0.8 @@ -21298,10 +21275,10 @@ snapshots: '@tannin/sprintf@1.3.3': {} - '@tanstack/eslint-plugin-query@5.91.2(eslint@9.38.0)(typescript@5.9.3)': + '@tanstack/eslint-plugin-query@5.91.2(eslint@9.39.1)(typescript@5.9.3)': dependencies: - '@typescript-eslint/utils': 8.46.4(eslint@9.38.0)(typescript@5.9.3) - eslint: 9.38.0 + '@typescript-eslint/utils': 8.48.0(eslint@9.39.1)(typescript@5.9.3) + eslint: 9.39.1 transitivePeerDependencies: - supports-color - typescript @@ -21721,15 +21698,15 @@ snapshots: '@types/node': 20.19.24 optional: true - '@typescript-eslint/eslint-plugin@8.46.2(@typescript-eslint/parser@8.46.2(eslint@9.38.0)(typescript@5.9.3))(eslint@9.38.0)(typescript@5.9.3)': + '@typescript-eslint/eslint-plugin@8.48.0(@typescript-eslint/parser@8.48.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.46.2(eslint@9.38.0)(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.46.2 - '@typescript-eslint/type-utils': 8.46.2(eslint@9.38.0)(typescript@5.9.3) - '@typescript-eslint/utils': 8.46.2(eslint@9.38.0)(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.46.2 - eslint: 9.38.0 + '@typescript-eslint/parser': 8.48.0(eslint@9.39.1)(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.48.0 + '@typescript-eslint/type-utils': 8.48.0(eslint@9.39.1)(typescript@5.9.3) + '@typescript-eslint/utils': 8.48.0(eslint@9.39.1)(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.48.0 + eslint: 9.39.1 graphemer: 1.4.0 ignore: 7.0.0 natural-compare: 1.4.0 @@ -21738,132 +21715,79 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.46.2(eslint@9.38.0)(typescript@5.9.3)': + '@typescript-eslint/parser@8.48.0(eslint@9.39.1)(typescript@5.9.3)': dependencies: - '@typescript-eslint/scope-manager': 8.46.2 - '@typescript-eslint/types': 8.46.2 - '@typescript-eslint/typescript-estree': 8.46.2(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.46.2 + '@typescript-eslint/scope-manager': 8.48.0 + '@typescript-eslint/types': 8.48.0 + '@typescript-eslint/typescript-estree': 8.48.0(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.48.0 debug: 4.4.3 - eslint: 9.38.0 + eslint: 9.39.1 typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.46.2(typescript@5.9.3)': + '@typescript-eslint/project-service@8.48.0(typescript@5.9.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.46.4(typescript@5.9.3) - '@typescript-eslint/types': 8.46.4 + '@typescript-eslint/tsconfig-utils': 8.48.0(typescript@5.9.3) + '@typescript-eslint/types': 8.48.0 debug: 4.4.3 typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.46.4(typescript@5.9.3)': + '@typescript-eslint/scope-manager@8.48.0': dependencies: - '@typescript-eslint/tsconfig-utils': 8.46.4(typescript@5.9.3) - '@typescript-eslint/types': 8.46.4 - debug: 4.4.3 - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/scope-manager@8.46.2': - dependencies: - '@typescript-eslint/types': 8.46.2 - '@typescript-eslint/visitor-keys': 8.46.2 - - '@typescript-eslint/scope-manager@8.46.4': - dependencies: - '@typescript-eslint/types': 8.46.4 - '@typescript-eslint/visitor-keys': 8.46.4 + '@typescript-eslint/types': 8.48.0 + '@typescript-eslint/visitor-keys': 8.48.0 - '@typescript-eslint/tsconfig-utils@8.46.2(typescript@5.9.3)': + '@typescript-eslint/tsconfig-utils@8.48.0(typescript@5.9.3)': dependencies: typescript: 5.9.3 - '@typescript-eslint/tsconfig-utils@8.46.4(typescript@5.9.3)': + '@typescript-eslint/type-utils@8.48.0(eslint@9.39.1)(typescript@5.9.3)': dependencies: - typescript: 5.9.3 - - '@typescript-eslint/type-utils@8.46.2(eslint@9.38.0)(typescript@5.9.3)': - dependencies: - '@typescript-eslint/types': 8.46.2 - '@typescript-eslint/typescript-estree': 8.46.2(typescript@5.9.3) - '@typescript-eslint/utils': 8.46.2(eslint@9.38.0)(typescript@5.9.3) + '@typescript-eslint/types': 8.48.0 + '@typescript-eslint/typescript-estree': 8.48.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.48.0(eslint@9.39.1)(typescript@5.9.3) debug: 4.4.3 - eslint: 9.38.0 + eslint: 9.39.1 ts-api-utils: 2.1.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.46.2': {} - - '@typescript-eslint/types@8.46.4': {} + '@typescript-eslint/types@8.48.0': {} - '@typescript-eslint/typescript-estree@8.46.2(typescript@5.9.3)': + '@typescript-eslint/typescript-estree@8.48.0(typescript@5.9.3)': dependencies: - '@typescript-eslint/project-service': 8.46.2(typescript@5.9.3) - '@typescript-eslint/tsconfig-utils': 8.46.2(typescript@5.9.3) - '@typescript-eslint/types': 8.46.2 - '@typescript-eslint/visitor-keys': 8.46.2 + '@typescript-eslint/project-service': 8.48.0(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.48.0(typescript@5.9.3) + '@typescript-eslint/types': 8.48.0 + '@typescript-eslint/visitor-keys': 8.48.0 debug: 4.4.3 - fast-glob: 3.3.3 - is-glob: 4.0.3 - minimatch: 9.0.5 - semver: 7.7.3 - ts-api-utils: 2.1.0(typescript@5.9.3) - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/typescript-estree@8.46.4(typescript@5.9.3)': - dependencies: - '@typescript-eslint/project-service': 8.46.4(typescript@5.9.3) - '@typescript-eslint/tsconfig-utils': 8.46.4(typescript@5.9.3) - '@typescript-eslint/types': 8.46.4 - '@typescript-eslint/visitor-keys': 8.46.4 - debug: 4.4.3 - fast-glob: 3.3.3 - is-glob: 4.0.3 minimatch: 9.0.5 semver: 7.7.3 + tinyglobby: 0.2.15 ts-api-utils: 2.1.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.46.2(eslint@9.38.0)(typescript@5.9.3)': - dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.38.0) - '@typescript-eslint/scope-manager': 8.46.2 - '@typescript-eslint/types': 8.46.2 - '@typescript-eslint/typescript-estree': 8.46.2(typescript@5.9.3) - eslint: 9.38.0 - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/utils@8.46.4(eslint@9.38.0)(typescript@5.9.3)': + '@typescript-eslint/utils@8.48.0(eslint@9.39.1)(typescript@5.9.3)': dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.38.0) - '@typescript-eslint/scope-manager': 8.46.4 - '@typescript-eslint/types': 8.46.4 - '@typescript-eslint/typescript-estree': 8.46.4(typescript@5.9.3) - eslint: 9.38.0 + '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1) + '@typescript-eslint/scope-manager': 8.48.0 + '@typescript-eslint/types': 8.48.0 + '@typescript-eslint/typescript-estree': 8.48.0(typescript@5.9.3) + eslint: 9.39.1 typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.46.2': + '@typescript-eslint/visitor-keys@8.48.0': dependencies: - '@typescript-eslint/types': 8.46.2 - eslint-visitor-keys: 4.2.1 - - '@typescript-eslint/visitor-keys@8.46.4': - dependencies: - '@typescript-eslint/types': 8.46.4 + '@typescript-eslint/types': 8.48.0 eslint-visitor-keys: 4.2.1 '@ungap/structured-clone@1.3.0': {} @@ -23075,100 +22999,6 @@ snapshots: rememo: 4.0.2 use-memo-one: 1.1.3(react@18.3.1) - '@wordpress/dataviews@10.2.0(patch_hash=2659f08edd4c0250f15fb428f013852a17e84da9c745e6dae6307de837e4d30b)(@types/react@18.3.26)(react@18.3.1)': - dependencies: - '@ariakit/react': 0.4.19(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@wordpress/base-styles': 6.12.0 - '@wordpress/components': 30.9.0(patch_hash=2659f08edd4c0250f15fb428f013852a17e84da9c745e6dae6307de837e4d30b)(@types/react@18.3.26)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@wordpress/compose': 7.36.0(patch_hash=2659f08edd4c0250f15fb428f013852a17e84da9c745e6dae6307de837e4d30b)(react@18.3.1) - '@wordpress/data': 10.36.0(patch_hash=2659f08edd4c0250f15fb428f013852a17e84da9c745e6dae6307de837e4d30b)(react@18.3.1) - '@wordpress/element': 6.36.0(patch_hash=2659f08edd4c0250f15fb428f013852a17e84da9c745e6dae6307de837e4d30b) - '@wordpress/i18n': 6.9.0(patch_hash=0c63a888feb97f2f1d416ca013ad85c31b6360b41cc0b6e2b0ae28f778fbdc5b) - '@wordpress/icons': 11.3.0(patch_hash=2659f08edd4c0250f15fb428f013852a17e84da9c745e6dae6307de837e4d30b)(react@18.3.1) - '@wordpress/keycodes': 4.36.0(patch_hash=2659f08edd4c0250f15fb428f013852a17e84da9c745e6dae6307de837e4d30b) - '@wordpress/primitives': 4.36.0(patch_hash=2659f08edd4c0250f15fb428f013852a17e84da9c745e6dae6307de837e4d30b)(react@18.3.1) - '@wordpress/private-apis': 1.36.0(patch_hash=2659f08edd4c0250f15fb428f013852a17e84da9c745e6dae6307de837e4d30b) - '@wordpress/url': 4.36.0(patch_hash=2659f08edd4c0250f15fb428f013852a17e84da9c745e6dae6307de837e4d30b) - '@wordpress/warning': 3.36.0(patch_hash=2659f08edd4c0250f15fb428f013852a17e84da9c745e6dae6307de837e4d30b) - clsx: 2.1.1 - react: 18.3.1 - remove-accents: 0.5.0 - optionalDependencies: - '@emotion/cache': 11.14.0 - '@emotion/css': 11.13.5 - '@emotion/react': 11.14.0(@types/react@18.3.26)(react@18.3.1) - '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@18.3.26)(react@18.3.1))(@types/react@18.3.26)(react@18.3.1) - '@emotion/utils': 1.4.2 - '@floating-ui/react-dom': 2.0.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@use-gesture/react': 10.3.1(react@18.3.1) - '@wordpress/date': 5.36.0(patch_hash=0c63a888feb97f2f1d416ca013ad85c31b6360b41cc0b6e2b0ae28f778fbdc5b) - '@wordpress/hooks': 4.36.0(patch_hash=0c63a888feb97f2f1d416ca013ad85c31b6360b41cc0b6e2b0ae28f778fbdc5b) - change-case: 4.1.2 - colord: 2.9.3 - date-fns: 4.1.0 - deepmerge: 4.3.1 - fast-deep-equal: 3.1.3 - framer-motion: 11.18.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - highlight-words-core: 1.2.3 - is-plain-object: 5.0.0 - memize: 2.1.1 - react-colorful: 5.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react-day-picker: 9.11.1(react@18.3.1) - react-dom: 18.3.1(react@18.3.1) - use-memo-one: 1.1.3(react@18.3.1) - uuid: 9.0.1(patch_hash=87a713b75995ed86c0ecd0cadfd1b9f85092ca16fdff7132ff98b62fc3cf2db0) - transitivePeerDependencies: - - '@emotion/is-prop-valid' - - '@types/react' - - supports-color - - '@wordpress/dataviews@10.2.0(patch_hash=2659f08edd4c0250f15fb428f013852a17e84da9c745e6dae6307de837e4d30b)(react@18.3.1)': - dependencies: - '@ariakit/react': 0.4.19(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@wordpress/base-styles': 6.12.0 - '@wordpress/components': 30.9.0(patch_hash=2659f08edd4c0250f15fb428f013852a17e84da9c745e6dae6307de837e4d30b)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@wordpress/compose': 7.36.0(patch_hash=2659f08edd4c0250f15fb428f013852a17e84da9c745e6dae6307de837e4d30b)(react@18.3.1) - '@wordpress/data': 10.36.0(patch_hash=2659f08edd4c0250f15fb428f013852a17e84da9c745e6dae6307de837e4d30b)(react@18.3.1) - '@wordpress/element': 6.36.0(patch_hash=2659f08edd4c0250f15fb428f013852a17e84da9c745e6dae6307de837e4d30b) - '@wordpress/i18n': 6.9.0(patch_hash=0c63a888feb97f2f1d416ca013ad85c31b6360b41cc0b6e2b0ae28f778fbdc5b) - '@wordpress/icons': 11.3.0(patch_hash=2659f08edd4c0250f15fb428f013852a17e84da9c745e6dae6307de837e4d30b)(react@18.3.1) - '@wordpress/keycodes': 4.36.0(patch_hash=2659f08edd4c0250f15fb428f013852a17e84da9c745e6dae6307de837e4d30b) - '@wordpress/primitives': 4.36.0(patch_hash=2659f08edd4c0250f15fb428f013852a17e84da9c745e6dae6307de837e4d30b)(react@18.3.1) - '@wordpress/private-apis': 1.36.0(patch_hash=2659f08edd4c0250f15fb428f013852a17e84da9c745e6dae6307de837e4d30b) - '@wordpress/url': 4.36.0(patch_hash=2659f08edd4c0250f15fb428f013852a17e84da9c745e6dae6307de837e4d30b) - '@wordpress/warning': 3.36.0(patch_hash=2659f08edd4c0250f15fb428f013852a17e84da9c745e6dae6307de837e4d30b) - clsx: 2.1.1 - react: 18.3.1 - remove-accents: 0.5.0 - optionalDependencies: - '@emotion/cache': 11.14.0 - '@emotion/css': 11.13.5 - '@emotion/react': 11.14.0(react@18.3.1) - '@emotion/styled': 11.14.1(@emotion/react@11.14.0(react@18.3.1))(react@18.3.1) - '@emotion/utils': 1.4.2 - '@floating-ui/react-dom': 2.0.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@use-gesture/react': 10.3.1(react@18.3.1) - '@wordpress/date': 5.36.0(patch_hash=0c63a888feb97f2f1d416ca013ad85c31b6360b41cc0b6e2b0ae28f778fbdc5b) - '@wordpress/hooks': 4.36.0(patch_hash=0c63a888feb97f2f1d416ca013ad85c31b6360b41cc0b6e2b0ae28f778fbdc5b) - change-case: 4.1.2 - colord: 2.9.3 - date-fns: 4.1.0 - deepmerge: 4.3.1 - fast-deep-equal: 3.1.3 - framer-motion: 11.18.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - highlight-words-core: 1.2.3 - is-plain-object: 5.0.0 - memize: 2.1.1 - react-colorful: 5.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react-day-picker: 9.11.1(react@18.3.1) - react-dom: 18.3.1(react@18.3.1) - use-memo-one: 1.1.3(react@18.3.1) - uuid: 9.0.1(patch_hash=87a713b75995ed86c0ecd0cadfd1b9f85092ca16fdff7132ff98b62fc3cf2db0) - transitivePeerDependencies: - - '@emotion/is-prop-valid' - - '@types/react' - - supports-color - '@wordpress/dataviews@11.0.0(patch_hash=2659f08edd4c0250f15fb428f013852a17e84da9c745e6dae6307de837e4d30b)(@types/react@18.3.26)(react@18.3.1)': dependencies: '@ariakit/react': 0.4.19(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -23629,24 +23459,24 @@ snapshots: '@wordpress/escape-html@3.36.0(patch_hash=2659f08edd4c0250f15fb428f013852a17e84da9c745e6dae6307de837e4d30b)': {} - '@wordpress/eslint-plugin@22.22.0(@babel/core@7.28.4)(eslint-config-prettier@10.1.8(eslint@9.38.0))(eslint-plugin-import@2.32.0)(eslint-plugin-jest@29.0.1(eslint@9.38.0)(jest@30.2.0)(typescript@5.9.3))(eslint-plugin-jsdoc@51.4.1(eslint@9.38.0))(eslint-plugin-jsx-a11y@6.10.2(eslint@9.38.0))(eslint-plugin-playwright@2.2.2(eslint@9.38.0))(eslint-plugin-prettier@5.5.4(eslint-config-prettier@10.1.8(eslint@9.38.0))(eslint@9.38.0)(wp-prettier@3.0.3))(eslint-plugin-react-hooks@5.2.0(eslint@9.38.0))(eslint-plugin-react@7.37.5(eslint@9.38.0))(eslint@9.38.0)(typescript@5.9.3)(wp-prettier@3.0.3)': + '@wordpress/eslint-plugin@22.22.0(@babel/core@7.28.4)(eslint-config-prettier@10.1.8(eslint@9.39.1))(eslint-plugin-import@2.32.0)(eslint-plugin-jest@29.2.1(eslint@9.39.1)(jest@30.2.0)(typescript@5.9.3))(eslint-plugin-jsdoc@61.4.1(eslint@9.39.1))(eslint-plugin-jsx-a11y@6.10.2(eslint@9.39.1))(eslint-plugin-playwright@2.4.0(eslint@9.39.1))(eslint-plugin-prettier@5.5.4(eslint-config-prettier@10.1.8(eslint@9.39.1))(eslint@9.39.1)(wp-prettier@3.0.3))(eslint-plugin-react-hooks@7.0.1(eslint@9.39.1))(eslint-plugin-react@7.37.5(eslint@9.39.1))(eslint@9.39.1)(typescript@5.9.3)(wp-prettier@3.0.3)': dependencies: '@babel/core': 7.28.4 - '@babel/eslint-parser': 7.28.5(@babel/core@7.28.4)(eslint@9.38.0) + '@babel/eslint-parser': 7.28.5(@babel/core@7.28.4)(eslint@9.39.1) '@wordpress/babel-preset-default': 8.36.0 '@wordpress/prettier-config': 4.36.0(wp-prettier@3.0.3) cosmiconfig: 7.1.0 - eslint: 9.38.0 - eslint-config-prettier: 10.1.8(eslint@9.38.0) - eslint-import-resolver-typescript: 4.4.4(eslint-plugin-import@2.32.0)(eslint@9.38.0) - eslint-plugin-import: 2.32.0(eslint-import-resolver-typescript@4.4.4)(eslint@9.38.0) - eslint-plugin-jest: 29.0.1(eslint@9.38.0)(jest@30.2.0)(typescript@5.9.3) - eslint-plugin-jsdoc: 51.4.1(eslint@9.38.0) - eslint-plugin-jsx-a11y: 6.10.2(eslint@9.38.0) - eslint-plugin-playwright: 2.2.2(eslint@9.38.0) - eslint-plugin-prettier: 5.5.4(eslint-config-prettier@10.1.8(eslint@9.38.0))(eslint@9.38.0)(wp-prettier@3.0.3) - eslint-plugin-react: 7.37.5(eslint@9.38.0) - eslint-plugin-react-hooks: 5.2.0(eslint@9.38.0) + eslint: 9.39.1 + eslint-config-prettier: 10.1.8(eslint@9.39.1) + eslint-import-resolver-typescript: 4.4.4(eslint-plugin-import@2.32.0)(eslint@9.39.1) + eslint-plugin-import: 2.32.0(eslint-import-resolver-typescript@4.4.4)(eslint@9.39.1) + eslint-plugin-jest: 29.2.1(eslint@9.39.1)(jest@30.2.0)(typescript@5.9.3) + eslint-plugin-jsdoc: 61.4.1(eslint@9.39.1) + eslint-plugin-jsx-a11y: 6.10.2(eslint@9.39.1) + eslint-plugin-playwright: 2.4.0(eslint@9.39.1) + eslint-plugin-prettier: 5.5.4(eslint-config-prettier@10.1.8(eslint@9.39.1))(eslint@9.39.1)(wp-prettier@3.0.3) + eslint-plugin-react: 7.37.5(eslint@9.39.1) + eslint-plugin-react-hooks: 7.0.1(eslint@9.39.1) globals: 13.24.0 requireindex: 1.2.0 optionalDependencies: @@ -26374,18 +26204,18 @@ snapshots: optionalDependencies: source-map: 0.6.1 - eslint-compat-utils@0.5.1(eslint@9.38.0): + eslint-compat-utils@0.5.1(eslint@9.39.1): dependencies: - eslint: 9.38.0 + eslint: 9.39.1 semver: 7.7.3 - eslint-config-prettier@10.1.8(eslint@9.38.0): + eslint-config-prettier@10.1.8(eslint@9.39.1): dependencies: - eslint: 9.38.0 + eslint: 9.39.1 - eslint-fix-utils@0.4.0(eslint@9.38.0): + eslint-fix-utils@0.4.0(eslint@9.39.1): dependencies: - eslint: 9.38.0 + eslint: 9.39.1 eslint-import-context@0.1.9(unrs-resolver@1.11.1): dependencies: @@ -26402,10 +26232,10 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@4.4.4(eslint-plugin-import@2.32.0)(eslint@9.38.0): + eslint-import-resolver-typescript@4.4.4(eslint-plugin-import@2.32.0)(eslint@9.39.1): dependencies: debug: 4.4.3 - eslint: 9.38.0 + eslint: 9.39.1 eslint-import-context: 0.1.9(unrs-resolver@1.11.1) get-tsconfig: 4.13.0 is-bun-module: 2.0.0 @@ -26413,43 +26243,43 @@ snapshots: tinyglobby: 0.2.15 unrs-resolver: 1.11.1 optionalDependencies: - eslint-plugin-import: 2.32.0(eslint-import-resolver-typescript@4.4.4)(eslint@9.38.0) + eslint-plugin-import: 2.32.0(eslint-import-resolver-typescript@4.4.4)(eslint@9.39.1) transitivePeerDependencies: - supports-color - eslint-json-compat-utils@0.2.1(@eslint/json@0.13.2)(eslint@9.38.0)(jsonc-eslint-parser@2.4.1): + eslint-json-compat-utils@0.2.1(@eslint/json@0.14.0)(eslint@9.39.1)(jsonc-eslint-parser@2.4.1): dependencies: - eslint: 9.38.0 + eslint: 9.39.1 esquery: 1.6.0 jsonc-eslint-parser: 2.4.1 optionalDependencies: - '@eslint/json': 0.13.2 + '@eslint/json': 0.14.0 - eslint-module-utils@2.12.1(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@4.4.4)(eslint@9.38.0): + eslint-module-utils@2.12.1(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@4.4.4)(eslint@9.39.1): dependencies: debug: 3.2.7 optionalDependencies: - eslint: 9.38.0 + eslint: 9.39.1 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 4.4.4(eslint-plugin-import@2.32.0)(eslint@9.38.0) + eslint-import-resolver-typescript: 4.4.4(eslint-plugin-import@2.32.0)(eslint@9.39.1) transitivePeerDependencies: - supports-color - eslint-plugin-es-x@7.8.0(eslint@9.38.0): + eslint-plugin-es-x@7.8.0(eslint@9.39.1): dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.38.0) + '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1) '@eslint-community/regexpp': 4.12.2 - eslint: 9.38.0 - eslint-compat-utils: 0.5.1(eslint@9.38.0) + eslint: 9.39.1 + eslint-compat-utils: 0.5.1(eslint@9.39.1) - eslint-plugin-es-x@9.1.2(eslint@9.38.0): + eslint-plugin-es-x@9.2.0(eslint@9.39.1): dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.38.0) + '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1) '@eslint-community/regexpp': 4.12.2 - eslint: 9.38.0 - eslint-type-tracer: 0.4.1(eslint@9.38.0) + eslint: 9.39.1 + eslint-type-tracer: 0.4.1(eslint@9.39.1) - eslint-plugin-import@2.32.0(eslint-import-resolver-typescript@4.4.4)(eslint@9.38.0): + eslint-plugin-import@2.32.0(eslint-import-resolver-typescript@4.4.4)(eslint@9.39.1): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -26458,9 +26288,9 @@ snapshots: array.prototype.flatmap: 1.3.3 debug: 3.2.7 doctrine: 2.1.0 - eslint: 9.38.0 + eslint: 9.39.1 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@4.4.4)(eslint@9.38.0) + eslint-module-utils: 2.12.1(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@4.4.4)(eslint@9.39.1) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -26476,39 +26306,43 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-plugin-jest-dom@5.5.0(eslint@9.38.0): + eslint-plugin-jest-dom@5.5.0(eslint@9.39.1): dependencies: '@babel/runtime': 7.28.4 - eslint: 9.38.0 + eslint: 9.39.1 requireindex: 1.2.0 - eslint-plugin-jest@29.0.1(eslint@9.38.0)(jest@30.2.0)(typescript@5.9.3): + eslint-plugin-jest@29.2.1(eslint@9.39.1)(jest@30.2.0)(typescript@5.9.3): dependencies: - '@typescript-eslint/utils': 8.46.4(eslint@9.38.0)(typescript@5.9.3) - eslint: 9.38.0 + '@typescript-eslint/utils': 8.48.0(eslint@9.39.1)(typescript@5.9.3) + eslint: 9.39.1 optionalDependencies: jest: 30.2.0 transitivePeerDependencies: - supports-color - typescript - eslint-plugin-jsdoc@51.4.1(eslint@9.38.0): + eslint-plugin-jsdoc@61.4.1(eslint@9.39.1): dependencies: - '@es-joy/jsdoccomment': 0.52.0 + '@es-joy/jsdoccomment': 0.76.0 + '@es-joy/resolve.exports': 1.2.0 are-docs-informative: 0.0.2 comment-parser: 1.4.1 debug: 4.4.3 escape-string-regexp: 4.0.0 - eslint: 9.38.0 + eslint: 9.39.1 espree: 10.4.0 esquery: 1.6.0 + html-entities: 2.6.0 + object-deep-merge: 2.0.0 parse-imports-exports: 0.2.4 semver: 7.7.3 spdx-expression-parse: 4.0.0 + to-valid-identifier: 1.0.0 transitivePeerDependencies: - supports-color - eslint-plugin-jsx-a11y@6.10.2(eslint@9.38.0): + eslint-plugin-jsx-a11y@6.10.2(eslint@9.39.1): dependencies: aria-query: 5.3.2 array-includes: 3.1.9 @@ -26518,7 +26352,7 @@ snapshots: axobject-query: 4.1.0 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 - eslint: 9.38.0 + eslint: 9.39.1 hasown: 2.0.2 jsx-ast-utils: 3.3.5 language-tags: 1.0.9 @@ -26527,17 +26361,17 @@ snapshots: safe-regex-test: 1.1.0 string.prototype.includes: 2.0.1 - eslint-plugin-lodash@8.0.0(eslint@9.38.0): + eslint-plugin-lodash@8.0.0(eslint@9.39.1): dependencies: - eslint: 9.38.0 + eslint: 9.39.1 lodash: 4.17.21 - eslint-plugin-n@17.23.1(eslint@9.38.0)(typescript@5.9.3): + eslint-plugin-n@17.23.1(eslint@9.39.1)(typescript@5.9.3): dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.38.0) + '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1) enhanced-resolve: 5.18.3 - eslint: 9.38.0 - eslint-plugin-es-x: 7.8.0(eslint@9.38.0) + eslint: 9.39.1 + eslint-plugin-es-x: 7.8.0(eslint@9.39.1) get-tsconfig: 4.13.0 globals: 15.15.0 globrex: 0.1.2 @@ -26547,42 +26381,49 @@ snapshots: transitivePeerDependencies: - typescript - eslint-plugin-package-json@0.59.0(eslint@9.38.0)(jsonc-eslint-parser@2.4.1): + eslint-plugin-package-json@0.85.0(eslint@9.39.1)(jsonc-eslint-parser@2.4.1): dependencies: '@altano/repository-tools': 2.0.1 change-case: 5.4.4 detect-indent: 7.0.2 detect-newline: 4.0.1 - eslint: 9.38.0 - eslint-fix-utils: 0.4.0(eslint@9.38.0) + eslint: 9.39.1 + eslint-fix-utils: 0.4.0(eslint@9.39.1) jsonc-eslint-parser: 2.4.1 - package-json-validator: 0.31.0 + package-json-validator: 0.59.0 semver: 7.7.3 sort-object-keys: 2.0.1 sort-package-json: 3.4.0 - validate-npm-package-name: 6.0.2 + validate-npm-package-name: 7.0.0 transitivePeerDependencies: - '@types/estree' - eslint-plugin-playwright@2.2.2(eslint@9.38.0): + eslint-plugin-playwright@2.4.0(eslint@9.39.1): dependencies: - eslint: 9.38.0 - globals: 13.24.0 + eslint: 9.39.1 + globals: 16.5.0 - eslint-plugin-prettier@5.5.4(eslint-config-prettier@10.1.8(eslint@9.38.0))(eslint@9.38.0)(wp-prettier@3.0.3): + eslint-plugin-prettier@5.5.4(eslint-config-prettier@10.1.8(eslint@9.39.1))(eslint@9.39.1)(wp-prettier@3.0.3): dependencies: - eslint: 9.38.0 + eslint: 9.39.1 prettier: wp-prettier@3.0.3 prettier-linter-helpers: 1.0.0 synckit: 0.11.11 optionalDependencies: - eslint-config-prettier: 10.1.8(eslint@9.38.0) + eslint-config-prettier: 10.1.8(eslint@9.39.1) - eslint-plugin-react-hooks@5.2.0(eslint@9.38.0): + eslint-plugin-react-hooks@7.0.1(eslint@9.39.1): dependencies: - eslint: 9.38.0 + '@babel/core': 7.28.4 + '@babel/parser': 7.28.5 + eslint: 9.39.1 + hermes-parser: 0.25.1 + zod: 3.25.76 + zod-validation-error: 4.0.2(zod@3.25.76) + transitivePeerDependencies: + - supports-color - eslint-plugin-react@7.37.5(eslint@9.38.0): + eslint-plugin-react@7.37.5(eslint@9.39.1): dependencies: array-includes: 3.1.9 array.prototype.findlast: 1.2.5 @@ -26590,7 +26431,7 @@ snapshots: array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 es-iterator-helpers: 1.2.1 - eslint: 9.38.0 + eslint: 9.39.1 estraverse: 5.3.0 hasown: 2.0.2 jsx-ast-utils: 3.3.5 @@ -26604,11 +26445,11 @@ snapshots: string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0 - eslint-plugin-svelte@3.12.5(eslint@9.38.0)(svelte@4.2.19): + eslint-plugin-svelte@3.13.0(eslint@9.39.1)(svelte@4.2.19): dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.38.0) + '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1) '@jridgewell/sourcemap-codec': 1.5.5 - eslint: 9.38.0 + eslint: 9.39.1 esutils: 2.0.3 globals: 16.5.0 known-css-properties: 0.37.0 @@ -26622,11 +26463,11 @@ snapshots: transitivePeerDependencies: - ts-node - eslint-plugin-testing-library@7.13.3(eslint@9.38.0)(typescript@5.9.3): + eslint-plugin-testing-library@7.13.5(eslint@9.39.1)(typescript@5.9.3): dependencies: - '@typescript-eslint/scope-manager': 8.46.4 - '@typescript-eslint/utils': 8.46.4(eslint@9.38.0)(typescript@5.9.3) - eslint: 9.38.0 + '@typescript-eslint/scope-manager': 8.48.0 + '@typescript-eslint/utils': 8.48.0(eslint@9.39.1)(typescript@5.9.3) + eslint: 9.39.1 transitivePeerDependencies: - supports-color - typescript @@ -26645,10 +26486,10 @@ snapshots: esrecurse: 4.3.0 estraverse: 5.3.0 - eslint-type-tracer@0.4.1(eslint@9.38.0): + eslint-type-tracer@0.4.1(eslint@9.39.1): dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.38.0) - eslint: 9.38.0 + '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1) + eslint: 9.39.1 eslint-visitor-keys@2.1.0: {} @@ -26656,15 +26497,15 @@ snapshots: eslint-visitor-keys@4.2.1: {} - eslint@9.38.0: + eslint@9.39.1: dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.38.0) + '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1) '@eslint-community/regexpp': 4.12.2 '@eslint/config-array': 0.21.1 '@eslint/config-helpers': 0.4.2 - '@eslint/core': 0.16.0 - '@eslint/eslintrc': 3.3.1 - '@eslint/js': 9.38.0 + '@eslint/core': 0.17.0 + '@eslint/eslintrc': 3.3.3 + '@eslint/js': 9.39.1 '@eslint/plugin-kit': 0.4.1 '@humanfs/node': 0.16.7 '@humanwhocodes/module-importer': 1.0.1 @@ -27375,6 +27216,12 @@ snapshots: capital-case: 1.0.4 tslib: 2.8.1 + hermes-estree@0.25.1: {} + + hermes-parser@0.25.1: + dependencies: + hermes-estree: 0.25.1 + highlight-words-core@1.2.3: {} history@5.3.0: @@ -28369,7 +28216,7 @@ snapshots: dependencies: argparse: 2.0.1 - jsdoc-type-pratt-parser@4.1.0: {} + jsdoc-type-pratt-parser@6.10.0: {} jsdom@26.1.0: dependencies: @@ -29389,6 +29236,8 @@ snapshots: object-assign@4.1.1: {} + object-deep-merge@2.0.0: {} + object-inspect@1.13.4: {} object-is@1.1.6: @@ -29596,10 +29445,11 @@ snapshots: package-json-from-dist@1.0.1: {} - package-json-validator@0.31.0: + package-json-validator@0.59.0: dependencies: semver: 7.7.3 validate-npm-package-license: 3.0.4 + validate-npm-package-name: 7.0.0 yargs: 18.0.0 param-case@3.0.4: @@ -30625,6 +30475,8 @@ snapshots: reselect@5.1.1: {} + reserved-identifiers@1.2.0: {} + resize-observer-polyfill@1.5.1: {} resolve-cwd@3.0.0: @@ -31844,6 +31696,11 @@ snapshots: dependencies: is-number: 7.0.0 + to-valid-identifier@1.0.0: + dependencies: + '@sindresorhus/base62': 1.0.0 + reserved-identifiers: 1.2.0 + toidentifier@1.0.1: {} tough-cookie@5.1.2: @@ -32022,13 +31879,13 @@ snapshots: dependencies: typescript-logic: 0.0.0 - typescript-eslint@8.46.2(eslint@9.38.0)(typescript@5.9.3): + typescript-eslint@8.48.0(eslint@9.39.1)(typescript@5.9.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.46.2(@typescript-eslint/parser@8.46.2(eslint@9.38.0)(typescript@5.9.3))(eslint@9.38.0)(typescript@5.9.3) - '@typescript-eslint/parser': 8.46.2(eslint@9.38.0)(typescript@5.9.3) - '@typescript-eslint/typescript-estree': 8.46.2(typescript@5.9.3) - '@typescript-eslint/utils': 8.46.2(eslint@9.38.0)(typescript@5.9.3) - eslint: 9.38.0 + '@typescript-eslint/eslint-plugin': 8.48.0(@typescript-eslint/parser@8.48.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(typescript@5.9.3) + '@typescript-eslint/parser': 8.48.0(eslint@9.39.1)(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.48.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.48.0(eslint@9.39.1)(typescript@5.9.3) + eslint: 9.39.1 typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -32249,7 +32106,7 @@ snapshots: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 - validate-npm-package-name@6.0.2: {} + validate-npm-package-name@7.0.0: {} varint@6.0.0: {} @@ -32703,6 +32560,10 @@ snapshots: yocto-queue@1.2.1: {} + zod-validation-error@4.0.2(zod@3.25.76): + dependencies: + zod: 3.25.76 + zod@3.25.76: {} zwitch@2.0.4: {} diff --git a/projects/js-packages/charts/changelog/renovate-major-eslint-packages b/projects/js-packages/charts/changelog/renovate-major-eslint-packages new file mode 100644 index 000000000000..7a568881a52e --- /dev/null +++ b/projects/js-packages/charts/changelog/renovate-major-eslint-packages @@ -0,0 +1,5 @@ +Significance: patch +Type: changed +Comment: Fix new lints in jsdoc comments. Should be no changes to functionality. + + diff --git a/projects/js-packages/charts/src/components/private/with-responsive/with-responsive.tsx b/projects/js-packages/charts/src/components/private/with-responsive/with-responsive.tsx index b528f191e752..d1a1ebdf9cd2 100644 --- a/projects/js-packages/charts/src/components/private/with-responsive/with-responsive.tsx +++ b/projects/js-packages/charts/src/components/private/with-responsive/with-responsive.tsx @@ -35,7 +35,7 @@ const useResponsiveDimensions = ( { /** * A higher-order component that provides responsive dimensions - * to the wrapped chart component using useParentSize from @visx/responsive. + * to the wrapped chart component using useParentSize from `@visx/responsive`. * * @param WrappedComponent - The chart component to be wrapped. * @return A functional component that renders the wrapped component with responsive dimensions. diff --git a/projects/js-packages/charts/src/utils/color-utils.ts b/projects/js-packages/charts/src/utils/color-utils.ts index 9fa47a4fd21d..4851fd777f26 100644 --- a/projects/js-packages/charts/src/utils/color-utils.ts +++ b/projects/js-packages/charts/src/utils/color-utils.ts @@ -1,7 +1,7 @@ /** * Validate hex color format - * @param hex - The hex color string to validate - * @throws Error if hex string is malformed + * @param hex - The hex color string to validate + * @throws {Error} if hex string is malformed */ const validateHexColor = ( hex: string ): void => { // Validate hex format @@ -29,10 +29,10 @@ const validateHexColor = ( hex: string ): void => { /** * Convert hex color to rgba with specified opacity * This is genuinely reusable across chart components - * @param hex - The hex color string (e.g., '#ff0000') - * @param alpha - The opacity value between 0 and 1 + * @param hex - The hex color string (e.g., '#ff0000') + * @param alpha - The opacity value between 0 and 1 * @return The rgba color string (e.g., 'rgba(255, 0, 0, 0.5)') - * @throws Error if hex string is malformed + * @throws {Error} if hex string is malformed */ export const hexToRgba = ( hex: string, alpha: number ): string => { validateHexColor( hex ); @@ -50,9 +50,9 @@ export const hexToRgba = ( hex: string, alpha: number ): string => { /** * Convert hex color to HSL - * @param hex - hex color string + * @param hex - hex color string * @return HSL values as [h, s, l] - * @throws Error if hex string is malformed + * @throws {Error} if hex string is malformed */ export const hexToHsl = ( hex: string ): [ number, number, number ] => { validateHexColor( hex ); diff --git a/projects/js-packages/charts/src/utils/format-metric-value.ts b/projects/js-packages/charts/src/utils/format-metric-value.ts index 0e81620e9b55..be3fddb0dd8b 100644 --- a/projects/js-packages/charts/src/utils/format-metric-value.ts +++ b/projects/js-packages/charts/src/utils/format-metric-value.ts @@ -13,7 +13,7 @@ type FormatMetricValueOptions = { /** * Format a numeric metric value based on type, precision and scale. - * Supports currency, number and percentage, using @automattic/number-formatters. + * Supports currency, number and percentage, using `@automattic/number-formatters`. * * @param value - The value to format * @param type - The type of formatting to apply diff --git a/projects/js-packages/charts/src/utils/format-percentage.ts b/projects/js-packages/charts/src/utils/format-percentage.ts index 3dd55e539b3d..c8f175099c27 100644 --- a/projects/js-packages/charts/src/utils/format-percentage.ts +++ b/projects/js-packages/charts/src/utils/format-percentage.ts @@ -2,7 +2,7 @@ import { formatNumber } from '@automattic/number-formatters'; /** * Format a percentage value with smart decimal handling. - * Uses @automattic/number-formatters for consistent formatting. + * Uses `@automattic/number-formatters` for consistent formatting. * Removes unnecessary trailing zeros and caps at 2 decimal places. * * @param value - The percentage value (0-100 range) diff --git a/projects/js-packages/connection/changelog/renovate-major-eslint-packages b/projects/js-packages/connection/changelog/renovate-major-eslint-packages new file mode 100644 index 000000000000..7a568881a52e --- /dev/null +++ b/projects/js-packages/connection/changelog/renovate-major-eslint-packages @@ -0,0 +1,5 @@ +Significance: patch +Type: changed +Comment: Fix new lints in jsdoc comments. Should be no changes to functionality. + + diff --git a/projects/js-packages/connection/declarations.d.ts b/projects/js-packages/connection/declarations.d.ts index 2c04b62c9329..a4d1c949b54f 100644 --- a/projects/js-packages/connection/declarations.d.ts +++ b/projects/js-packages/connection/declarations.d.ts @@ -10,7 +10,7 @@ declare module '@automattic/jetpack-script-data' { declare global { interface Window { /** - * @deprecated In favor of getScriptData from @automattic/jetpack-script-data + * @deprecated In favor of getScriptData from `@automattic/jetpack-script-data` */ JP_CONNECTION_INITIAL_STATE: ConnectionScriptData; } diff --git a/projects/js-packages/eslint-changed/CHANGELOG.md b/projects/js-packages/eslint-changed/CHANGELOG.md index fb193f473ef0..30db3461b466 100644 --- a/projects/js-packages/eslint-changed/CHANGELOG.md +++ b/projects/js-packages/eslint-changed/CHANGELOG.md @@ -5,6 +5,11 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [2.1.5] - 2025-12-04 +### Fixed +- Do the right thing for `--git --diff-only` and input paths not relative to the repo root. [#46180] +- Try accounting for forward-slash vs backslash paths on Windows. [#46180] + ## [2.1.4] - 2025-11-25 ### Changed - Update package dependencies. [#45590] [#45958] @@ -114,6 +119,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 * Created as a tool within the monorepo. +[2.1.5]: https://github.com/Automattic/eslint-changed/compare/2.1.4...2.1.5 [2.1.4]: https://github.com/Automattic/eslint-changed/compare/2.1.3...2.1.4 [2.1.3]: https://github.com/Automattic/eslint-changed/compare/2.1.2...2.1.3 [2.1.2]: https://github.com/Automattic/eslint-changed/compare/2.1.1...2.1.2 diff --git a/projects/js-packages/eslint-changed/package.json b/projects/js-packages/eslint-changed/package.json index 56179a892b8b..db9df2c81067 100644 --- a/projects/js-packages/eslint-changed/package.json +++ b/projects/js-packages/eslint-changed/package.json @@ -1,6 +1,6 @@ { "name": "@automattic/eslint-changed", - "version": "2.1.4", + "version": "2.1.5", "description": "Run eslint on files, but only report warnings and errors from lines that were changed.", "keywords": [ "eslint", @@ -31,6 +31,7 @@ "parse-diff": "0.8.1" }, "devDependencies": { + "eslint": ">=7.0.0", "jest": "30.2.0" }, "peerDependencies": { diff --git a/projects/js-packages/eslint-changed/src/cli.js b/projects/js-packages/eslint-changed/src/cli.js index beeb3900eb63..110f73e373fd 100755 --- a/projects/js-packages/eslint-changed/src/cli.js +++ b/projects/js-packages/eslint-changed/src/cli.js @@ -7,7 +7,7 @@ import { Command } from 'commander'; import * as ESLintPkg from 'eslint'; import parseDiff from 'parse-diff'; -const APP_VERSION = '2.1.4'; +const APP_VERSION = '2.1.5'; const { ESLint } = ESLintPkg; const loadESLint = ESLintPkg.loadESLint ?? ( () => ESLint ); @@ -220,14 +220,23 @@ async function main( process, argv, program ) { debug( 'Running git diff command:', git, args.join( ' ' ) ); diff = parseDiff( doCmd( git, args ) ); + + let argfiles = program.args.map( p => + path.relative( diffBase, path.resolve( process.cwd(), p ) ) + ); + // Avoid problems on Windows, git wants forward-slashes while path uses backslashes there. + if ( argfiles.length && path.sep !== path.posix.sep ) { + argfiles = argfiles.map( f => f.replaceAll( path.sep, path.posix.sep ) ); + } + if ( ! argv.inDiffOnly && program.args.length ) { - files = program.args.map( p => path.relative( diffBase, path.resolve( process.cwd(), p ) ) ); + files = argfiles; debug( 'Determined files from command line:', files ); } else { files = getFilesFromDiff( diff ); debug( 'Determined files from diff:', files ); - if ( program.args.length ) { - const cmdLineFiles = new Set( program.args ); + if ( argfiles.length ) { + const cmdLineFiles = new Set( argfiles ); files = files.filter( file => cmdLineFiles.has( file ) ); debug( 'Intersected files with those from the command line:', files ); } diff --git a/projects/js-packages/eslint-changed/tests/cli.test.js b/projects/js-packages/eslint-changed/tests/cli.test.js index 455d785451ac..20d301d58b25 100644 --- a/projects/js-packages/eslint-changed/tests/cli.test.js +++ b/projects/js-packages/eslint-changed/tests/cli.test.js @@ -1067,6 +1067,83 @@ describe( 'bin/eslint-changed.js', () => { expect( output ).toEqual( expectOutput ); } ); + test( 'Works with --in-diff-only and filtered files with full paths', async () => { + await mktmpdirgit( + [ + { + files: { + 'eslint.config.mjs': eslintconfig, + '1.js': "var x = 'Hello, world!';\n\n\n\n\n\n\n\n\n\n\n\nconsole.log( x )\n", + '2.js': "var x = 'Hello, world!';\n\n\n\n\n\n\n\n\n\n\n\nconsole.log( x )\n", + '3.js': "var x = 'Hello, world!';\n\n\n\n\n\n\n\n\n\n\n\nconsole.log( x )\n", + }, + }, + ], + { + '2.js': "var y = 'Hello, world!';\n\n\n\n\n\n\n\n\n\n\n\nconsole.log( x )\n", + '3.js': "var y = 'Hello, world!';\n\n\n\n\n\n\n\n\n\n\n\nconsole.log( x )\n", + } + ); + + const data = await runEslintChanged( + [ + '--format=json', + '--git', + '--in-diff-only', + path.join( tmpdir, '1.js' ), + path.join( tmpdir, '2.js' ), + ], + { + cwd: tmpdir, + } + ); + expect( data.exitCode ).toBe( 1 ); + + expect( data.stdout ).toBeValidJSON(); + const output = JSON.parse( data.stdout ); + expect( output ).toBeInstanceOf( Array ); + const expectOutput = [ + { + filePath: path.join( tmpdir, '2.js' ), + messages: [ + { + ruleId: 'no-unused-vars', + severity: 2, + message: "'y' is assigned a value but never used.", + line: 1, + column: 5, + nodeType: 'Identifier', + messageId: 'unusedVar', + endLine: 1, + endColumn: 6, + suggestions: [ + { + data: { + varName: 'y', + }, + desc: "Remove unused variable 'y'.", + fix: { + range: [ 0, 24 ], + text: '', + }, + messageId: 'removeVar', + }, + ], + }, + ], + errorCount: 1, + fatalErrorCount: 0, + warningCount: 0, + fixableErrorCount: 0, + fixableWarningCount: 0, + source: "var y = 'Hello, world!';\n\n\n\n\n\n\n\n\n\n\n\nconsole.log( x )\n", + suppressedMessages: [], + usedDeprecatedRules, + }, + ]; + expect( output ).toEqual( expectOutput ); + } ); + test( 'Works when run from a subdirectory', async () => { await mktmpdirgit( [ @@ -1236,6 +1313,123 @@ describe( 'bin/eslint-changed.js', () => { expect( output ).toEqual( expectOutput ); } ); + test( 'Works with --in-diff-only when run from a subdirectory', async () => { + await mktmpdirgit( + [ + { + files: { + 'eslint.config.mjs': eslintconfig, + 'x/1.js': "var x = 'Hello, world!';\n\n\n\n\n\n\n\n\n\n\n\nconsole.log( x )\n", + 'x/2.js': "var x = 'Hello, world!';\n\n\n\n\n\n\n\n\n\n\n\nconsole.log( x )\n", + 'x/3.js': "var x = 'Hello, world!';\n\n\n\n\n\n\n\n\n\n\n\nconsole.log( x )\n", + 'x/4.js': "var x = 'Hello, world!';\n\n\n\n\n\n\n\n\n\n\n\nconsole.log( x )\n", + }, + }, + ], + { + 'x/2.js': "var y = 'Hello, world!';\n\n\n\n\n\n\n\n\n\n\n\nconsole.log( x )\n", + 'x/3.js': "var y = 'Hello, world!';\n\n\n\n\n\n\n\n\n\n\n\nconsole.log( x )\n", + 'x/4.js': "var y = 'Hello, world!';\n\n\n\n\n\n\n\n\n\n\n\nconsole.log( x )\n", + } + ); + + const data = await runEslintChanged( + [ + '--format=json', + '--git', + '--in-diff-only', + '1.js', + '2.js', + path.join( tmpdir, 'x/4.js' ), + ], + { + cwd: path.join( tmpdir, 'x' ), + } + ); + expect( data.exitCode ).toBe( 1 ); + + expect( data.stdout ).toBeValidJSON(); + const output = JSON.parse( data.stdout ); + expect( output ).toBeInstanceOf( Array ); + const expectOutput = [ + { + filePath: path.join( tmpdir, 'x/2.js' ), + messages: [ + { + ruleId: 'no-unused-vars', + severity: 2, + message: "'y' is assigned a value but never used.", + line: 1, + column: 5, + nodeType: 'Identifier', + messageId: 'unusedVar', + endLine: 1, + endColumn: 6, + suggestions: [ + { + data: { + varName: 'y', + }, + desc: "Remove unused variable 'y'.", + fix: { + range: [ 0, 24 ], + text: '', + }, + messageId: 'removeVar', + }, + ], + }, + ], + errorCount: 1, + fatalErrorCount: 0, + warningCount: 0, + fixableErrorCount: 0, + fixableWarningCount: 0, + source: "var y = 'Hello, world!';\n\n\n\n\n\n\n\n\n\n\n\nconsole.log( x )\n", + suppressedMessages: [], + usedDeprecatedRules, + }, + { + filePath: path.join( tmpdir, 'x/4.js' ), + messages: [ + { + ruleId: 'no-unused-vars', + severity: 2, + message: "'y' is assigned a value but never used.", + line: 1, + column: 5, + nodeType: 'Identifier', + messageId: 'unusedVar', + endLine: 1, + endColumn: 6, + suggestions: [ + { + data: { + varName: 'y', + }, + desc: "Remove unused variable 'y'.", + fix: { + range: [ 0, 24 ], + text: '', + }, + messageId: 'removeVar', + }, + ], + }, + ], + errorCount: 1, + fatalErrorCount: 0, + warningCount: 0, + fixableErrorCount: 0, + fixableWarningCount: 0, + source: "var y = 'Hello, world!';\n\n\n\n\n\n\n\n\n\n\n\nconsole.log( x )\n", + suppressedMessages: [], + usedDeprecatedRules, + }, + ]; + expect( output ).toEqual( expectOutput ); + } ); + describe( '--eslint-options works', () => { const eslintOptionsRepo = [ [ diff --git a/projects/js-packages/eslint-config-target-es/CHANGELOG.md b/projects/js-packages/eslint-config-target-es/CHANGELOG.md index 54df4a05486b..fb2c5f5b43c9 100644 --- a/projects/js-packages/eslint-config-target-es/CHANGELOG.md +++ b/projects/js-packages/eslint-config-target-es/CHANGELOG.md @@ -11,7 +11,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [4.0.0] - 2025-08-06 ### Added -- Enable new rules from `eslint-plugin-es-x'. [#44288] +- Enable new rules from `eslint-plugin-es-x`. [#44288] ### Changed - Update package dependencies. [#43522] [#43578] [#44020] [#44148] [#44217] [#44276] [#44288] [#44289] [#44355] [#44508] diff --git a/projects/js-packages/eslint-config-target-es/changelog/renovate-eslint-packages#2 b/projects/js-packages/eslint-config-target-es/changelog/renovate-eslint-packages#2 new file mode 100644 index 000000000000..45028352a802 --- /dev/null +++ b/projects/js-packages/eslint-config-target-es/changelog/renovate-eslint-packages#2 @@ -0,0 +1,4 @@ +Significance: patch +Type: changed + +Update package dependencies. diff --git a/projects/js-packages/eslint-config-target-es/changelog/renovate-eslint-packages#3 b/projects/js-packages/eslint-config-target-es/changelog/renovate-eslint-packages#3 new file mode 100644 index 000000000000..c370decbb055 --- /dev/null +++ b/projects/js-packages/eslint-config-target-es/changelog/renovate-eslint-packages#3 @@ -0,0 +1,4 @@ +Significance: major +Type: added + +Enable new rules from `eslint-plugin-es-x`. diff --git a/projects/js-packages/eslint-config-target-es/package.json b/projects/js-packages/eslint-config-target-es/package.json index 219ce93c2bdd..2f44b0840e68 100644 --- a/projects/js-packages/eslint-config-target-es/package.json +++ b/projects/js-packages/eslint-config-target-es/package.json @@ -45,8 +45,8 @@ }, "devDependencies": { "@wordpress/browserslist-config": "6.36.0", - "eslint": "9.38.0", - "eslint-plugin-es-x": "9.1.2", + "eslint": "9.39.1", + "eslint-plugin-es-x": "9.2.0", "globals": "16.5.0", "jest": "30.2.0" }, diff --git a/projects/js-packages/eslint-config-target-es/src/rulesMap.js b/projects/js-packages/eslint-config-target-es/src/rulesMap.js index 27ba961f46fe..cb4a59b92d29 100644 --- a/projects/js-packages/eslint-config-target-es/src/rulesMap.js +++ b/projects/js-packages/eslint-config-target-es/src/rulesMap.js @@ -6,6 +6,16 @@ module.exports = { 'no-asyncdisposablestack': 'javascript.builtins.AsyncDisposableStack.AsyncDisposableStack', 'no-disposablestack': 'javascript.builtins.DisposableStack.DisposableStack', 'no-error-iserror': 'javascript.builtins.Error.isError', + 'no-intl-locale-prototype-firstdayofweek': false, // No compat data yet. + 'no-intl-locale-prototype-getcalendars': 'javascript.builtins.Intl.Locale.getCalendars', + 'no-intl-locale-prototype-getcollations': 'javascript.builtins.Intl.Locale.getCollations', + 'no-intl-locale-prototype-gethourcycles': 'javascript.builtins.Intl.Locale.getHourCycles', + 'no-intl-locale-prototype-getnumberingsystems': + 'javascript.builtins.Intl.Locale.getNumberingSystems', + 'no-intl-locale-prototype-gettextinfo': 'javascript.builtins.Intl.Locale.getTextInfo', + 'no-intl-locale-prototype-gettimezones': 'javascript.builtins.Intl.Locale.getTimeZones', + 'no-intl-locale-prototype-getweekinfo': 'javascript.builtins.Intl.Locale.getWeekInfo', + 'no-iterator-concat': false, // No compat data yet. 'no-suppressederror': 'javascript.builtins.SuppressedError.SuppressedError', 'no-symbol-asyncdispose': 'javascript.builtins.Symbol.asyncDispose', 'no-symbol-dispose': 'javascript.builtins.Symbol.dispose', diff --git a/projects/js-packages/i18n-check-webpack-plugin/changelog/renovate-major-eslint-packages b/projects/js-packages/i18n-check-webpack-plugin/changelog/renovate-major-eslint-packages new file mode 100644 index 000000000000..7a568881a52e --- /dev/null +++ b/projects/js-packages/i18n-check-webpack-plugin/changelog/renovate-major-eslint-packages @@ -0,0 +1,5 @@ +Significance: patch +Type: changed +Comment: Fix new lints in jsdoc comments. Should be no changes to functionality. + + diff --git a/projects/js-packages/i18n-check-webpack-plugin/src/GettextExtractor.js b/projects/js-packages/i18n-check-webpack-plugin/src/GettextExtractor.js index fb8f6e06c553..edb9b4e8a659 100644 --- a/projects/js-packages/i18n-check-webpack-plugin/src/GettextExtractor.js +++ b/projects/js-packages/i18n-check-webpack-plugin/src/GettextExtractor.js @@ -8,9 +8,9 @@ const debug = require( 'debug' )( `${ PLUGIN_NAME }:gettext` ); // eslint-disabl const { parseAsync, parseSync, traverse, types: t } = babel; // Some typedefs for jsdoc. Babel doesn't export the actual constructors for us. -/** @typedef babel.Node */ -/** @typedef babel.Comment */ -/** @typedef {babel.Node} babel.CallExpression */ +/** @typedef {babel.Node} BabelNode */ +/** @typedef {babel.Comment} BabelComment */ +/** @typedef {babel.Node} BabelCallExpression */ /** * Default function mappings. @@ -310,7 +310,7 @@ class GettextExtractor { * Resolve the callee of a CallExpression. * * @see https://github.com/wp-cli/i18n-command/blob/e9eef8aab4b5e43c3aa09bf60e1e7a9d6d30d302/src/JsFunctionsScanner.php#L254 - * @param {babel.CallExpression} node - CallExpression node. + * @param {BabelCallExpression} node - CallExpression node. * @return {{ name: string, comments: string[] }|undefined} Callee name and comments, or undefined. */ #resolveExpressionCallee( node ) { @@ -421,8 +421,8 @@ class GettextExtractor { * Test if the comment comes before the node. * * @see https://github.com/wp-cli/i18n-command/blob/e9eef8aab4b5e43c3aa09bf60e1e7a9d6d30d302/src/JsFunctionsScanner.php#L364 - * @param {babel.Comment} comment - Comment. - * @param {babel.Node} node - Node. + * @param {BabelComment} comment - Comment. + * @param {BabelNode} node - Node. * @return {boolean} Whether the comment comes before the node. */ #commentPrecedesNode( comment, node ) { diff --git a/projects/js-packages/licensing/changelog/renovate-major-eslint-packages b/projects/js-packages/licensing/changelog/renovate-major-eslint-packages new file mode 100644 index 000000000000..7a568881a52e --- /dev/null +++ b/projects/js-packages/licensing/changelog/renovate-major-eslint-packages @@ -0,0 +1,5 @@ +Significance: patch +Type: changed +Comment: Fix new lints in jsdoc comments. Should be no changes to functionality. + + diff --git a/projects/js-packages/licensing/components/activation-screen/index.jsx b/projects/js-packages/licensing/components/activation-screen/index.jsx index c5842ecb44ed..09d71fbe0d8a 100644 --- a/projects/js-packages/licensing/components/activation-screen/index.jsx +++ b/projects/js-packages/licensing/components/activation-screen/index.jsx @@ -17,7 +17,7 @@ import './style.scss'; * * @param {(object|Array)} result -- the result from the attachLicenses request * @return {number} The activatedProductId from the result - * @throws Errors either from the API response or from any issues parsing the response + * @throws {Error} either from the API response or from any issues parsing the response */ const parseAttachLicensesResult = result => { let currentResult = result; diff --git a/projects/js-packages/publicize-components/changelog/renovate-@wordpressdataviews b/projects/js-packages/publicize-components/changelog/renovate-@wordpressdataviews new file mode 100644 index 000000000000..45028352a802 --- /dev/null +++ b/projects/js-packages/publicize-components/changelog/renovate-@wordpressdataviews @@ -0,0 +1,4 @@ +Significance: patch +Type: changed + +Update package dependencies. diff --git a/projects/js-packages/publicize-components/changelog/renovate-major-eslint-packages b/projects/js-packages/publicize-components/changelog/renovate-major-eslint-packages new file mode 100644 index 000000000000..7a568881a52e --- /dev/null +++ b/projects/js-packages/publicize-components/changelog/renovate-major-eslint-packages @@ -0,0 +1,5 @@ +Significance: patch +Type: changed +Comment: Fix new lints in jsdoc comments. Should be no changes to functionality. + + diff --git a/projects/js-packages/publicize-components/changelog/update-social-connections-list-in-sidebar b/projects/js-packages/publicize-components/changelog/update-social-connections-list-in-sidebar new file mode 100644 index 000000000000..e963202c0c7b --- /dev/null +++ b/projects/js-packages/publicize-components/changelog/update-social-connections-list-in-sidebar @@ -0,0 +1,4 @@ +Significance: patch +Type: changed + +Update connections list in the editor sidebar to flip the toggle position. diff --git a/projects/js-packages/publicize-components/changelog/update-social-empty-connections-state b/projects/js-packages/publicize-components/changelog/update-social-empty-connections-state new file mode 100644 index 000000000000..e762a877df81 --- /dev/null +++ b/projects/js-packages/publicize-components/changelog/update-social-empty-connections-state @@ -0,0 +1,4 @@ +Significance: patch +Type: changed + +Social: Update empty connections UI in the editor. diff --git a/projects/js-packages/publicize-components/package.json b/projects/js-packages/publicize-components/package.json index 921184d9cbe6..e74bf910da96 100644 --- a/projects/js-packages/publicize-components/package.json +++ b/projects/js-packages/publicize-components/package.json @@ -41,7 +41,7 @@ "@wordpress/compose": "7.36.0", "@wordpress/core-data": "7.36.0", "@wordpress/data": "10.36.0", - "@wordpress/dataviews": "10.2.0", + "@wordpress/dataviews": "11.0.0", "@wordpress/date": "5.36.0", "@wordpress/edit-post": "8.36.0", "@wordpress/editor": "14.36.0", diff --git a/projects/js-packages/publicize-components/src/assets/networks-illustration.png b/projects/js-packages/publicize-components/src/assets/networks-illustration.png new file mode 100644 index 000000000000..8256715fae8b Binary files /dev/null and b/projects/js-packages/publicize-components/src/assets/networks-illustration.png differ diff --git a/projects/js-packages/publicize-components/src/components/connection-icon/styles.module.scss b/projects/js-packages/publicize-components/src/components/connection-icon/styles.module.scss index 6b95f2f990c5..e3eb7cab1361 100644 --- a/projects/js-packages/publicize-components/src/components/connection-icon/styles.module.scss +++ b/projects/js-packages/publicize-components/src/components/connection-icon/styles.module.scss @@ -1,5 +1,10 @@ .wrapper { display: grid; + width: 28px; + height: 28px; + justify-content: start; + align-items: center; + overflow: hidden; &.disabled { opacity: 0.4; @@ -15,12 +20,11 @@ } .social-icon { - width: 15px; - height: 15px; + width: 14px; + height: 14px; grid-area: 1 / 1 / 2 / 2; margin-top: 14px; margin-inline-start: 14px; - margin-inline-end: 5px; border-radius: 2px; background-color: #fff; } diff --git a/projects/js-packages/publicize-components/src/components/connections-toggle-list/index.tsx b/projects/js-packages/publicize-components/src/components/connections-toggle-list/index.tsx index a39766877931..fc0d6973036d 100644 --- a/projects/js-packages/publicize-components/src/components/connections-toggle-list/index.tsx +++ b/projects/js-packages/publicize-components/src/components/connections-toggle-list/index.tsx @@ -1,4 +1,4 @@ -import { FormToggle, MenuGroup, MenuItem } from '@wordpress/components'; +import { Flex, FormToggle, MenuGroup, MenuItem } from '@wordpress/components'; import { _x, sprintf } from '@wordpress/i18n'; import clsx from 'clsx'; import { useCallback } from 'react'; @@ -62,33 +62,35 @@ export function ConnectionsToggleList( { return ( } + iconPosition="right" isSelected={ isSelected } onClick={ onClickConnection( connection ) } aria-label={ ariaLabel } + aria-checked={ isSelected } className={ clsx( styles.item, getItemClassName?.( connection ) ) } > -
- +
{ connection.display_name }
-
+
); } ) } diff --git a/projects/js-packages/publicize-components/src/components/connections-toggle-list/styles.module.scss b/projects/js-packages/publicize-components/src/components/connections-toggle-list/styles.module.scss index a91c905c124e..bc9485ba8a4e 100644 --- a/projects/js-packages/publicize-components/src/components/connections-toggle-list/styles.module.scss +++ b/projects/js-packages/publicize-components/src/components/connections-toggle-list/styles.module.scss @@ -11,12 +11,6 @@ } } - .item-content { - display: flex; - align-items: center; - gap: 4px; - } - .display-name { max-width: 8rem; overflow: hidden; diff --git a/projects/js-packages/publicize-components/src/components/form/empty-state.tsx b/projects/js-packages/publicize-components/src/components/form/empty-state.tsx index 24256a1e7bfe..d3fdabd3e0e2 100644 --- a/projects/js-packages/publicize-components/src/components/form/empty-state.tsx +++ b/projects/js-packages/publicize-components/src/components/form/empty-state.tsx @@ -1,7 +1,7 @@ /* eslint-disable @wordpress/no-unsafe-wp-apis */ import { Flex, FlexBlock, PanelRow, __experimentalText as Text } from '@wordpress/components'; import { __ } from '@wordpress/i18n'; -import illustration from '../../assets/illustration.png'; +import illustration from '../../assets/networks-illustration.png'; import usePublicizeConfig from '../../hooks/use-publicize-config'; import useSocialMediaConnections from '../../hooks/use-social-media-connections'; import { SettingsButton } from './settings-button'; @@ -23,7 +23,7 @@ export function EmptyState() { return ( - + { // Do not show illustration if there are connections ! hasConnections && diff --git a/projects/js-packages/publicize-components/src/components/form/styles.module.scss b/projects/js-packages/publicize-components/src/components/form/styles.module.scss index b5e316a0d78e..751b237f28ba 100644 --- a/projects/js-packages/publicize-components/src/components/form/styles.module.scss +++ b/projects/js-packages/publicize-components/src/components/form/styles.module.scss @@ -69,10 +69,6 @@ .empty-state { - .illustration { - max-width: 8rem; - } - .connect-account-text { text-align: center; } diff --git a/projects/js-packages/publicize-components/src/components/manage-connections-modal/confirmation-form/index.tsx b/projects/js-packages/publicize-components/src/components/manage-connections-modal/confirmation-form/index.tsx index 7966da720292..705f3bc2603c 100644 --- a/projects/js-packages/publicize-components/src/components/manage-connections-modal/confirmation-form/index.tsx +++ b/projects/js-packages/publicize-components/src/components/manage-connections-modal/confirmation-form/index.tsx @@ -226,7 +226,7 @@ export function ConfirmationForm( { { // /** - * It is such a shame that we can't use any of the form components from @wordpress/components here. + * It is such a shame that we can't use any of the form components from `@wordpress/components` here. * Because of the way the components are designed, we can't use them in an uncontrolled way. * Every component is forced be used only in controlled mode. * diff --git a/projects/js-packages/publicize-components/src/components/panel/auto-share-toggle.tsx b/projects/js-packages/publicize-components/src/components/panel/auto-share-toggle.tsx index d62f7cb519d5..21cc82319f9b 100644 --- a/projects/js-packages/publicize-components/src/components/panel/auto-share-toggle.tsx +++ b/projects/js-packages/publicize-components/src/components/panel/auto-share-toggle.tsx @@ -1,4 +1,4 @@ -import { CheckboxControl, PanelRow } from '@wordpress/components'; +import { PanelRow, ToggleControl } from '@wordpress/components'; import { useSelect } from '@wordpress/data'; import { store as editorStore } from '@wordpress/editor'; import { __ } from '@wordpress/i18n'; @@ -20,7 +20,7 @@ export function AutoShareToggle() { return ( - willReturn( array( 'response' => array( 'code' => 200 ), - 'body' => json_encode( array( 'email_send_success' => true ) ), + 'body' => json_encode( array( 'email_send_success' => true ), JSON_UNESCAPED_SLASHES ), ) ); @@ -197,7 +197,8 @@ public function test_api_send_auth_email_returns_error_if_response_code_is_not_2 'code' => 'email_send_error', 'message' => 'Failed to send authentication code.', 'email_send_success' => true, - ) + ), + JSON_UNESCAPED_SLASHES ), ) ); @@ -252,7 +253,7 @@ public function test_api_send_auth_email_returns_error_if_response_from_api_is_f ->willReturn( array( 'response' => array( 'code' => 200 ), - 'body' => json_encode( array( 'email_sent' => false ) ), + 'body' => json_encode( array( 'email_sent' => false ), JSON_UNESCAPED_SLASHES ), ) ); diff --git a/projects/packages/account-protection/tests/php/Validation_Service_Test.php b/projects/packages/account-protection/tests/php/Validation_Service_Test.php index 6816576a32e5..c942f0eb2598 100644 --- a/projects/packages/account-protection/tests/php/Validation_Service_Test.php +++ b/projects/packages/account-protection/tests/php/Validation_Service_Test.php @@ -237,7 +237,8 @@ public function test_returns_true_if_password_is_compromised() { 'body' => json_encode( array( 'compromised' => array( 'c90fcfd699f0ddbdcb30c2c9183d2d933ea' ), - ) + ), + JSON_UNESCAPED_SLASHES ), ) ); @@ -261,7 +262,8 @@ public function test_returns_true_if_password_is_common() { 'body' => json_encode( array( 'common' => array( 'c90fcfd699f0ddbdcb30c2c9183d2d933ea' ), - ) + ), + JSON_UNESCAPED_SLASHES ), ) ); @@ -286,7 +288,8 @@ public function test_returns_false_if_password_is_not_leaked() { array( 'compromised' => array( '1234' ), 'common' => array(), - ) + ), + JSON_UNESCAPED_SLASHES ), ) ); diff --git a/projects/packages/analyzer/changelog/fix-audit_json_encode_flags b/projects/packages/analyzer/changelog/fix-audit_json_encode_flags new file mode 100644 index 000000000000..f140a52a9274 --- /dev/null +++ b/projects/packages/analyzer/changelog/fix-audit_json_encode_flags @@ -0,0 +1,4 @@ +Significance: patch +Type: fixed + +Ensure proper flags are used with `json_encode()`. diff --git a/projects/packages/analyzer/src/Declarations/class-class-method.php b/projects/packages/analyzer/src/Declarations/class-class-method.php index 77f05132787d..ba337b22a282 100644 --- a/projects/packages/analyzer/src/Declarations/class-class-method.php +++ b/projects/packages/analyzer/src/Declarations/class-class-method.php @@ -34,7 +34,7 @@ function to_csv_array() { $this->class_name, $this->method_name, $this->static, - json_encode( $this->params ), + json_encode( $this->params, JSON_UNESCAPED_SLASHES ), $this->deprecated, ); } diff --git a/projects/packages/analyzer/src/Declarations/class-function.php b/projects/packages/analyzer/src/Declarations/class-function.php index 1f55ffcc3c6c..7f142e819f82 100644 --- a/projects/packages/analyzer/src/Declarations/class-function.php +++ b/projects/packages/analyzer/src/Declarations/class-function.php @@ -30,7 +30,7 @@ function to_csv_array() { '', $this->func_name, '', - json_encode( $this->params ), + json_encode( $this->params, JSON_UNESCAPED_SLASHES ), $this->deprecated, ); } diff --git a/projects/packages/analyzer/src/api/class-model.php b/projects/packages/analyzer/src/api/class-model.php index 5aa928ff455d..b76a332eb0b5 100644 --- a/projects/packages/analyzer/src/api/class-model.php +++ b/projects/packages/analyzer/src/api/class-model.php @@ -87,7 +87,7 @@ public function persist( $arr = null ) { if ( $arr === null ) { $arr = $this->content; } - file_put_contents( $this->db_file, json_encode( $arr ) ); + file_put_contents( $this->db_file, json_encode( $arr, JSON_UNESCAPED_SLASHES ) ); } public function reset() { diff --git a/projects/packages/analyzer/src/class-PersistentList.php b/projects/packages/analyzer/src/class-PersistentList.php index f818120eb3b3..d0b50a17f50f 100644 --- a/projects/packages/analyzer/src/class-PersistentList.php +++ b/projects/packages/analyzer/src/class-PersistentList.php @@ -79,7 +79,8 @@ function ( $item ) { return $item->to_map(); }, $this->items - ) + ), + JSON_UNESCAPED_SLASHES ) ); } diff --git a/projects/packages/assets/changelog/fix-audit_json_encode_flags b/projects/packages/assets/changelog/fix-audit_json_encode_flags new file mode 100644 index 000000000000..f140a52a9274 --- /dev/null +++ b/projects/packages/assets/changelog/fix-audit_json_encode_flags @@ -0,0 +1,4 @@ +Significance: patch +Type: fixed + +Ensure proper flags are used with `json_encode()`. diff --git a/projects/packages/assets/src/class-assets.php b/projects/packages/assets/src/class-assets.php index 71725eec465a..e3050faa29f1 100644 --- a/projects/packages/assets/src/class-assets.php +++ b/projects/packages/assets/src/class-assets.php @@ -530,7 +530,7 @@ public static function wp_default_scripts_hook( $wp_scripts ) { } else { $data['domainMap'] = (object) $data['domainMap']; // Ensure it becomes a json object. $data['domainPaths'] = (object) $data['domainPaths']; // Ensure it becomes a json object. - $wp_scripts->add_inline_script( $handle, 'wp.jpI18nLoader.state = ' . wp_json_encode( $data, JSON_UNESCAPED_SLASHES ) . ';' ); + $wp_scripts->add_inline_script( $handle, 'wp.jpI18nLoader.state = ' . wp_json_encode( $data, JSON_UNESCAPED_SLASHES | JSON_HEX_TAG | JSON_HEX_AMP ) . ';' ); } // Deprecated state module: Depend on wp-i18n to ensure global `wp` exists and because anything needing this will need that too. diff --git a/projects/packages/autoloader/changelog/fix-audit_json_encode_flags b/projects/packages/autoloader/changelog/fix-audit_json_encode_flags new file mode 100644 index 000000000000..f140a52a9274 --- /dev/null +++ b/projects/packages/autoloader/changelog/fix-audit_json_encode_flags @@ -0,0 +1,4 @@ +Significance: patch +Type: fixed + +Ensure proper flags are used with `json_encode()`. diff --git a/projects/packages/autoloader/tests/php/lib/class-test-plugin-factory.php b/projects/packages/autoloader/tests/php/lib/class-test-plugin-factory.php index c92892edc2a1..63cb53762bec 100644 --- a/projects/packages/autoloader/tests/php/lib/class-test-plugin-factory.php +++ b/projects/packages/autoloader/tests/php/lib/class-test-plugin-factory.php @@ -538,7 +538,7 @@ private function has_plugin_changed( $plugin_dir, $plugin_file, &$composer_confi // Prepare a checksum object for comparison and store it in the composer config so we can retrieve it later. $factory_checksum = array( 'plugin' => hash( 'crc32', $plugin_file ), - 'composer' => hash( 'crc32', json_encode( $composer_config ) ), + 'composer' => hash( 'crc32', json_encode( $composer_config, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE ) ), 'files' => array(), ); foreach ( $this->files as $path => $content ) { diff --git a/projects/packages/backup/changelog/fix-audit_json_encode_flags b/projects/packages/backup/changelog/fix-audit_json_encode_flags new file mode 100644 index 000000000000..f140a52a9274 --- /dev/null +++ b/projects/packages/backup/changelog/fix-audit_json_encode_flags @@ -0,0 +1,4 @@ +Significance: patch +Type: fixed + +Ensure proper flags are used with `json_encode()`. diff --git a/projects/packages/backup/src/class-initial-state.php b/projects/packages/backup/src/class-initial-state.php index 98a508472166..c945375bb150 100644 --- a/projects/packages/backup/src/class-initial-state.php +++ b/projects/packages/backup/src/class-initial-state.php @@ -64,6 +64,6 @@ private function get_data() { public function render() { add_action( 'jetpack_use_iframe_authorization_flow', '__return_true' ); - return 'var JPBACKUP_INITIAL_STATE=JSON.parse(decodeURIComponent("' . rawurlencode( wp_json_encode( $this->get_data() ) ) . '"));'; + return 'var JPBACKUP_INITIAL_STATE=' . wp_json_encode( $this->get_data(), JSON_UNESCAPED_SLASHES | JSON_HEX_TAG | JSON_HEX_AMP ) . ';'; } } diff --git a/projects/packages/backup/tests/php/REST_Controller_Test.php b/projects/packages/backup/tests/php/REST_Controller_Test.php index 5bd3ea6635bb..b5d3c72fa8bc 100644 --- a/projects/packages/backup/tests/php/REST_Controller_Test.php +++ b/projects/packages/backup/tests/php/REST_Controller_Test.php @@ -112,7 +112,7 @@ public function test_install_backup_helper_script_unauthorized() { ); $request = new WP_REST_Request( 'POST', '/jetpack/v4/backup-helper-script' ); $request->set_header( 'content-type', 'application/json' ); - $request->set_body( wp_json_encode( $body ) ); + $request->set_body( wp_json_encode( $body, JSON_UNESCAPED_SLASHES ) ); $response = $this->server->dispatch( $request ); $this->assertEquals( 403, $response->get_status() ); $this->assertEquals( 'You are not allowed to perform this action.', $response->get_data()['message'] ); @@ -128,7 +128,7 @@ public function test_install_backup_helper_script_success() { $request = new WP_REST_Request( 'POST', '/jetpack/v4/backup-helper-script' ); $request->set_header( 'content-type', 'application/json' ); - $request->set_body( wp_json_encode( $body ) ); + $request->set_body( wp_json_encode( $body, JSON_UNESCAPED_SLASHES ) ); $response = $this->dispatch_request_signed_with_blog_token( $request ); $response_data = $response->get_data(); @@ -167,7 +167,7 @@ public function test_install_backup_helper_script_bad_header() { $request = new WP_REST_Request( 'POST', '/jetpack/v4/backup-helper-script' ); $request->set_header( 'content-type', 'application/json' ); - $request->set_body( wp_json_encode( $body ) ); + $request->set_body( wp_json_encode( $body, JSON_UNESCAPED_SLASHES ) ); $response = $this->dispatch_request_signed_with_blog_token( $request ); $this->assertEquals( 400, $response->get_status() ); @@ -196,7 +196,7 @@ public function test_delete_backup_helper_script_unauthorized() { $request = new WP_REST_Request( 'DELETE', '/jetpack/v4/backup-helper-script' ); $request->set_header( 'content-type', 'application/json' ); - $request->set_body( wp_json_encode( $body ) ); + $request->set_body( wp_json_encode( $body, JSON_UNESCAPED_SLASHES ) ); $response = $this->server->dispatch( $request ); $this->assertEquals( 403, $response->get_status() ); @@ -213,7 +213,7 @@ public function test_delete_backup_helper_script_success() { $request = new WP_REST_Request( 'DELETE', '/jetpack/v4/backup-helper-script' ); $request->set_header( 'content-type', 'application/json' ); - $request->set_body( wp_json_encode( $body ) ); + $request->set_body( wp_json_encode( $body, JSON_UNESCAPED_SLASHES ) ); $response = $this->dispatch_request_signed_with_blog_token( $request ); $this->assertEquals( 200, $response->get_status() ); @@ -232,7 +232,7 @@ public function test_delete_backup_helper_script_bad_header() { $request = new WP_REST_Request( 'DELETE', '/jetpack/v4/backup-helper-script' ); $request->set_header( 'content-type', 'application/json' ); - $request->set_body( wp_json_encode( $body ) ); + $request->set_body( wp_json_encode( $body, JSON_UNESCAPED_SLASHES ) ); $response = $this->dispatch_request_signed_with_blog_token( $request ); $this->assertEquals( 500, $response->get_status() ); diff --git a/projects/packages/blaze/changelog/fix-audit_json_encode_flags b/projects/packages/blaze/changelog/fix-audit_json_encode_flags new file mode 100644 index 000000000000..f140a52a9274 --- /dev/null +++ b/projects/packages/blaze/changelog/fix-audit_json_encode_flags @@ -0,0 +1,4 @@ +Significance: patch +Type: fixed + +Ensure proper flags are used with `json_encode()`. diff --git a/projects/packages/blaze/src/class-dashboard-config-data.php b/projects/packages/blaze/src/class-dashboard-config-data.php index 803acb1ec883..ba828f968946 100644 --- a/projects/packages/blaze/src/class-dashboard-config-data.php +++ b/projects/packages/blaze/src/class-dashboard-config-data.php @@ -50,7 +50,8 @@ public function __construct( $admin_page = 'tools.php', $menu_slug = 'advertisin */ public function get_js_config_data( $config_data = null ) { return 'window.configData = ' . wp_json_encode( - $config_data === null ? $this->get_data() : $config_data + $config_data === null ? $this->get_data() : $config_data, + JSON_UNESCAPED_SLASHES | JSON_HEX_TAG | JSON_HEX_AMP ) . ';'; } diff --git a/projects/packages/blaze/src/class-dashboard-rest-controller.php b/projects/packages/blaze/src/class-dashboard-rest-controller.php index b064d4e31f28..0ea83adf2f20 100644 --- a/projects/packages/blaze/src/class-dashboard-rest-controller.php +++ b/projects/packages/blaze/src/class-dashboard-rest-controller.php @@ -863,7 +863,7 @@ protected function add_prices_in_posts( $posts ) { */ protected function request_as_user( $path, $version = '2', $args = array(), $body = null, $base_api_path = 'wpcom', $use_cache = false ) { // Arrays are serialized without considering the order of objects, but it's okay atm. - $cache_key = 'BLAZE_REST_RESP_' . md5( implode( '|', array( $path, $version, wp_json_encode( $args ), wp_json_encode( $body ), $base_api_path ) ) ); + $cache_key = 'BLAZE_REST_RESP_' . md5( implode( '|', array( $path, $version, wp_json_encode( $args, JSON_UNESCAPED_SLASHES ), wp_json_encode( $body, JSON_UNESCAPED_SLASHES ), $base_api_path ) ) ); if ( $use_cache ) { $response_body_content = get_transient( $cache_key ); diff --git a/projects/packages/blaze/tests/php/Blaze_Test.php b/projects/packages/blaze/tests/php/Blaze_Test.php index f4f7098a4a19..84f2c55b0f89 100644 --- a/projects/packages/blaze/tests/php/Blaze_Test.php +++ b/projects/packages/blaze/tests/php/Blaze_Test.php @@ -206,7 +206,7 @@ public function test_site_supports_blaze( $eligibility_details, $expected_eligib set_transient( 'jetpack_blaze_site_supports_blaze_0', $eligibility_details['transient'] ); } else { if ( isset( $eligibility_details['body'] ) ) { - $eligibility_details['body'] = wp_json_encode( $eligibility_details['body'] ); + $eligibility_details['body'] = wp_json_encode( $eligibility_details['body'], JSON_UNESCAPED_SLASHES ); } $remote_request_happened = true; diff --git a/projects/packages/boost-core/changelog/fix-audit_json_encode_flags b/projects/packages/boost-core/changelog/fix-audit_json_encode_flags new file mode 100644 index 000000000000..f140a52a9274 --- /dev/null +++ b/projects/packages/boost-core/changelog/fix-audit_json_encode_flags @@ -0,0 +1,4 @@ +Significance: patch +Type: fixed + +Ensure proper flags are used with `json_encode()`. diff --git a/projects/packages/boost-core/src/lib/class-utils.php b/projects/packages/boost-core/src/lib/class-utils.php index e16fd12e2816..0dc605ed7b95 100644 --- a/projects/packages/boost-core/src/lib/class-utils.php +++ b/projects/packages/boost-core/src/lib/class-utils.php @@ -38,7 +38,7 @@ public static function standardize_error( $error ) { if ( is_object( $error ) ) { return array( 'name' => 'Error', - 'message' => json_decode( wp_json_encode( $error ), true ), + 'message' => json_decode( wp_json_encode( $error, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE ), true ), ); } @@ -114,7 +114,7 @@ public static function send_wpcom_request( $method, $endpoint, $args = null, $bo $endpoint, '2', array_merge( $default_args, empty( $args ) ? array() : $args ), - empty( $body ) ? null : wp_json_encode( $body ), + empty( $body ) ? null : wp_json_encode( $body, JSON_UNESCAPED_SLASHES ), 'wpcom' ); diff --git a/projects/packages/changelogger/CHANGELOG.md b/projects/packages/changelogger/CHANGELOG.md index 4d91d36e7cd5..82b3f9dfea41 100644 --- a/projects/packages/changelogger/CHANGELOG.md +++ b/projects/packages/changelogger/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [6.0.11] - 2025-12-04 +### Fixed +- Ensure proper flags are used with `json_encode()`. [#46092] + ## [6.0.10] - 2025-12-01 ### Changed - Update tests to use addCommand() instead of deprecated add() method. [#46126] @@ -307,6 +311,7 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm ### Added - Initial version. +[6.0.11]: https://github.com/Automattic/jetpack-changelogger/compare/6.0.10...6.0.11 [6.0.10]: https://github.com/Automattic/jetpack-changelogger/compare/6.0.9...6.0.10 [6.0.9]: https://github.com/Automattic/jetpack-changelogger/compare/6.0.8...6.0.9 [6.0.8]: https://github.com/Automattic/jetpack-changelogger/compare/6.0.7...6.0.8 diff --git a/projects/packages/changelogger/changelog/fix-changelogger-symfony-console-add b/projects/packages/changelogger/changelog/fix-changelogger-symfony-console-add deleted file mode 100644 index 2e1ed035081a..000000000000 --- a/projects/packages/changelogger/changelog/fix-changelogger-symfony-console-add +++ /dev/null @@ -1,5 +0,0 @@ -Significance: patch -Type: fixed -Comment: Actually update tests to use addCommand() instead of deprecated add() method - - diff --git a/projects/packages/changelogger/src/Application.php b/projects/packages/changelogger/src/Application.php index f639ec3b8256..278de6f6130d 100644 --- a/projects/packages/changelogger/src/Application.php +++ b/projects/packages/changelogger/src/Application.php @@ -19,7 +19,7 @@ */ class Application extends SymfonyApplication { - const VERSION = '6.0.10'; + const VERSION = '6.0.11'; /** * Constructor. diff --git a/projects/packages/changelogger/tests/php/tests/lib/ChangeEntryTest.php b/projects/packages/changelogger/tests/php/tests/lib/ChangeEntryTest.php index 661d7b6aa81c..03dc451d454d 100644 --- a/projects/packages/changelogger/tests/php/tests/lib/ChangeEntryTest.php +++ b/projects/packages/changelogger/tests/php/tests/lib/ChangeEntryTest.php @@ -410,7 +410,7 @@ public function testJson( $json, $change ) { $this->expectExceptionMessage( $change ); ChangeEntry::jsonUnserialize( json_decode( $json ) ); } else { - $this->assertSame( $json, json_encode( $change ) ); + $this->assertSame( $json, json_encode( $change, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE ) ); $this->assertEquals( $change, ChangeEntry::jsonUnserialize( json_decode( $json ) ) ); } } diff --git a/projects/packages/changelogger/tests/php/tests/lib/ChangelogEntryTest.php b/projects/packages/changelogger/tests/php/tests/lib/ChangelogEntryTest.php index f565b3910936..41146db5cbd0 100644 --- a/projects/packages/changelogger/tests/php/tests/lib/ChangelogEntryTest.php +++ b/projects/packages/changelogger/tests/php/tests/lib/ChangelogEntryTest.php @@ -234,7 +234,7 @@ public function testJson( $json, $entry ) { $this->expectExceptionMessage( $entry ); ChangelogEntry::jsonUnserialize( json_decode( $json ) ); } else { - $this->assertSame( $json, json_encode( $entry ) ); + $this->assertSame( $json, json_encode( $entry, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE ) ); $this->assertEquals( $entry, ChangelogEntry::jsonUnserialize( json_decode( $json ) ) ); } } @@ -249,7 +249,7 @@ public static function provideJson() { ( new ChangelogEntry( '1.0' ) )->setTimestamp( '2021-02-18' ), ), 'Serialization with data' => array( - '{"__class__":"Automattic\\\\Jetpack\\\\Changelog\\\\ChangelogEntry","version":"1.0","link":"https:\\/\\/example.org","timestamp":"2021-02-18T12:07:16-0500","prologue":"Foo","epilogue":"Bar","changes":[{"__class__":"Automattic\\\\Jetpack\\\\Changelog\\\\ChangeEntry","significance":null,"timestamp":"2021-02-17T00:00:00+0000","subheading":"","author":"","content":""},{"__class__":"Automattic\\\\Jetpack\\\\Changelog\\\\ChangeEntry","significance":null,"timestamp":"2021-02-18T00:00:00+0000","subheading":"","author":"","content":""}]}', + '{"__class__":"Automattic\\\\Jetpack\\\\Changelog\\\\ChangelogEntry","version":"1.0","link":"https://example.org","timestamp":"2021-02-18T12:07:16-0500","prologue":"Foo","epilogue":"Bar","changes":[{"__class__":"Automattic\\\\Jetpack\\\\Changelog\\\\ChangeEntry","significance":null,"timestamp":"2021-02-17T00:00:00+0000","subheading":"","author":"","content":""},{"__class__":"Automattic\\\\Jetpack\\\\Changelog\\\\ChangeEntry","significance":null,"timestamp":"2021-02-18T00:00:00+0000","subheading":"","author":"","content":""}]}', ( new ChangelogEntry( '1.0' ) )->setTimestamp( '2021-02-18T12:07:16-0500' )->setPrologue( 'Foo' )->setEpilogue( 'Bar' )->setLink( 'https://example.org' )->setChanges( array( new ChangeEntry( array( 'timestamp' => '2021-02-17' ) ), diff --git a/projects/packages/changelogger/tests/php/tests/lib/ChangelogTest.php b/projects/packages/changelogger/tests/php/tests/lib/ChangelogTest.php index 4acfbd3c243d..9e11795e47e6 100644 --- a/projects/packages/changelogger/tests/php/tests/lib/ChangelogTest.php +++ b/projects/packages/changelogger/tests/php/tests/lib/ChangelogTest.php @@ -104,7 +104,7 @@ public function testJson( $json, $changelog ) { $this->expectExceptionMessage( $changelog ); Changelog::jsonUnserialize( json_decode( $json ) ); } else { - $this->assertSame( $json, json_encode( $changelog ) ); + $this->assertSame( $json, json_encode( $changelog, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE ) ); $this->assertEquals( $changelog, Changelog::jsonUnserialize( json_decode( $json ) ) ); } } diff --git a/projects/packages/changelogger/tests/php/tests/src/UtilsTest.php b/projects/packages/changelogger/tests/php/tests/src/UtilsTest.php index fea87b64ca80..ff841a9e8cd6 100644 --- a/projects/packages/changelogger/tests/php/tests/src/UtilsTest.php +++ b/projects/packages/changelogger/tests/php/tests/src/UtilsTest.php @@ -460,7 +460,7 @@ function ( $data ) { $this->assertSame( '{"a":{"__class__":"Automattic\\\\Jetpack\\\\Changelog\\\\ChangeEntry","significance":"minor","timestamp":"2021-02-22T00:00:00+0000","subheading":"Added!","author":"","content":"AAAAA"},"b":{"__class__":"Automattic\\\\Jetpack\\\\Changelog\\\\ChangeEntry","significance":"minor","timestamp":"2021-02-24T00:00:00+0000","subheading":"Unknown","author":"","content":"BBBBB"}}', - json_encode( $ret ) + json_encode( $ret, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE ) ); $this->assertSame( array( diff --git a/projects/packages/classic-theme-helper/changelog/fix-audit_json_encode_flags b/projects/packages/classic-theme-helper/changelog/fix-audit_json_encode_flags new file mode 100644 index 000000000000..f140a52a9274 --- /dev/null +++ b/projects/packages/classic-theme-helper/changelog/fix-audit_json_encode_flags @@ -0,0 +1,4 @@ +Significance: patch +Type: fixed + +Ensure proper flags are used with `json_encode()`. diff --git a/projects/packages/classic-theme-helper/src/custom-content-types.php b/projects/packages/classic-theme-helper/src/custom-content-types.php index 05c570906466..877c0bdefd2a 100644 --- a/projects/packages/classic-theme-helper/src/custom-content-types.php +++ b/projects/packages/classic-theme-helper/src/custom-content-types.php @@ -54,16 +54,15 @@ function jetpack_custom_post_types_loaded() { if ( ! isset( $_GET['page'] ) || 'jetpack' !== $_GET['page'] ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- We are not processing any data here. return; } - $initial_state = 'var CUSTOM_CONTENT_TYPE__INITIAL_STATE; typeof CUSTOM_CONTENT_TYPE__INITIAL_STATE === "object" || (CUSTOM_CONTENT_TYPE__INITIAL_STATE = JSON.parse(decodeURIComponent("' . rawurlencode( - wp_json_encode( - array( - 'active' => classic_theme_helper_cpt_should_be_active(), - 'over_ride' => false, - 'should_show_testimonials' => Jetpack_Testimonial::site_should_display_testimonials() ? true : false, - 'should_show_portfolios' => Jetpack_Portfolio::site_should_display_portfolios() ? true : false, - ) - ) - ) . '")));'; + $initial_state = 'var CUSTOM_CONTENT_TYPE__INITIAL_STATE; typeof CUSTOM_CONTENT_TYPE__INITIAL_STATE === "object" || (CUSTOM_CONTENT_TYPE__INITIAL_STATE = ' . wp_json_encode( + array( + 'active' => classic_theme_helper_cpt_should_be_active(), + 'over_ride' => false, + 'should_show_testimonials' => Jetpack_Testimonial::site_should_display_testimonials() ? true : false, + 'should_show_portfolios' => Jetpack_Portfolio::site_should_display_portfolios() ? true : false, + ), + JSON_UNESCAPED_SLASHES | JSON_HEX_TAG | JSON_HEX_AMP + ) . ');'; // Create a global variable with the custom content type feature status so that the value is available // earlier than the API method above allows, preventing delayed loading of the settings card. diff --git a/projects/packages/codesniffer/Jetpack/Sniffs/PHPUnit/AttributesSniff/CoverageHandler.php b/projects/packages/codesniffer/Jetpack/Sniffs/PHPUnit/AttributesSniff/CoverageHandler.php index 896641e7489f..92840b5a6ef6 100644 --- a/projects/packages/codesniffer/Jetpack/Sniffs/PHPUnit/AttributesSniff/CoverageHandler.php +++ b/projects/packages/codesniffer/Jetpack/Sniffs/PHPUnit/AttributesSniff/CoverageHandler.php @@ -184,7 +184,8 @@ public function process( File $phpcsFile, $stackPtr, array $attributes, array $a 'type' => 'class', 'class' => $d->class, 'alias' => $d->alias, - ) + ), + JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE ); $ktrait = json_encode( array( @@ -192,7 +193,8 @@ public function process( File $phpcsFile, $stackPtr, array $attributes, array $a 'type' => 'trait', 'class' => $d->class, 'alias' => $d->alias, - ) + ), + JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE ); if ( isset( $attributes[ $kclass ] ) ) { $annotations[ $kclass ] = $annotations[ $k ]; @@ -219,7 +221,8 @@ public function process( File $phpcsFile, $stackPtr, array $attributes, array $a 'type' => 'class', 'class' => $d->class, 'alias' => $d->alias, - ) + ), + JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE ); if ( isset( $attributes[ $kclass ] ) ) { unset( $attributes[ $k ] ); @@ -253,13 +256,14 @@ public function process( File $phpcsFile, $stackPtr, array $attributes, array $a if ( isset( $annotationsByType[ $which ]['function'] ) ) { foreach ( $annotationsByType[ $which ]['function'] as $k => $d ) { $k2 = json_encode( - (object) array( + array( 'which' => $d->which, 'type' => 'method', 'class' => $dc->class, 'alias' => $dc->alias, 'method' => $d->function, - ) + ), + JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE ); $annotations[ $k2 ] = $annotations[ $k ]; unset( $annotations[ $k ] ); diff --git a/projects/packages/codesniffer/Jetpack/Sniffs/PHPUnit/AttributesSniff/DependsHandler.php b/projects/packages/codesniffer/Jetpack/Sniffs/PHPUnit/AttributesSniff/DependsHandler.php index 292a0782dde4..ea6358bc7791 100644 --- a/projects/packages/codesniffer/Jetpack/Sniffs/PHPUnit/AttributesSniff/DependsHandler.php +++ b/projects/packages/codesniffer/Jetpack/Sniffs/PHPUnit/AttributesSniff/DependsHandler.php @@ -140,7 +140,7 @@ public function parseAnnotation( File $phpcsFile, array $data, $applies ) { // p } } - return json_encode( $ret ); + return json_encode( $ret, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE ); } /** {@inheritdoc} */ diff --git a/projects/packages/codesniffer/Jetpack/Sniffs/PHPUnit/AttributesSniff/ExcludeThingFromBackupHandler.php b/projects/packages/codesniffer/Jetpack/Sniffs/PHPUnit/AttributesSniff/ExcludeThingFromBackupHandler.php index ad9b2b75956d..7a1412b2719e 100644 --- a/projects/packages/codesniffer/Jetpack/Sniffs/PHPUnit/AttributesSniff/ExcludeThingFromBackupHandler.php +++ b/projects/packages/codesniffer/Jetpack/Sniffs/PHPUnit/AttributesSniff/ExcludeThingFromBackupHandler.php @@ -68,7 +68,7 @@ public function parseAttribute( File $phpcsFile, array $data, $applies ) { // ph throw new InvalidArgumentException( "Unrecognized attribute {$data['name']}" ); // @codeCoverageIgnore } - return json_encode( $ret ); + return json_encode( $ret, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE ); } /** @@ -111,7 +111,7 @@ public function parseAnnotation( File $phpcsFile, array $data, $applies ) { // p throw new InvalidArgumentException( "Unrecognized attribute {$data['name']}" ); // @codeCoverageIgnore } - return json_encode( $ret ); + return json_encode( $ret, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE ); } /** {@inheritdoc} */ diff --git a/projects/packages/codesniffer/Jetpack/Sniffs/PHPUnit/AttributesSniff/Handler.php b/projects/packages/codesniffer/Jetpack/Sniffs/PHPUnit/AttributesSniff/Handler.php index 023b9112df03..8811b1bdf0e9 100644 --- a/projects/packages/codesniffer/Jetpack/Sniffs/PHPUnit/AttributesSniff/Handler.php +++ b/projects/packages/codesniffer/Jetpack/Sniffs/PHPUnit/AttributesSniff/Handler.php @@ -415,6 +415,6 @@ protected static function json_encode_no_nulls( $obj ) { return null; } } - return json_encode( $obj ); + return json_encode( $obj, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE ); } } diff --git a/projects/packages/codesniffer/Jetpack/Sniffs/PHPUnit/AttributesSniff/RequiresHandler.php b/projects/packages/codesniffer/Jetpack/Sniffs/PHPUnit/AttributesSniff/RequiresHandler.php index c8bb7d8b21fe..091ffe41b92a 100644 --- a/projects/packages/codesniffer/Jetpack/Sniffs/PHPUnit/AttributesSniff/RequiresHandler.php +++ b/projects/packages/codesniffer/Jetpack/Sniffs/PHPUnit/AttributesSniff/RequiresHandler.php @@ -151,7 +151,7 @@ public function parseAnnotation( File $phpcsFile, array $data, $applies ) { // p return null; } - return json_encode( $ret ); + return json_encode( $ret, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE ); } /** diff --git a/projects/packages/codesniffer/changelog/fix-audit_json_encode_flags b/projects/packages/codesniffer/changelog/fix-audit_json_encode_flags new file mode 100644 index 000000000000..f140a52a9274 --- /dev/null +++ b/projects/packages/codesniffer/changelog/fix-audit_json_encode_flags @@ -0,0 +1,4 @@ +Significance: patch +Type: fixed + +Ensure proper flags are used with `json_encode()`. diff --git a/projects/packages/connection/changelog/fix-audit_json_encode_flags b/projects/packages/connection/changelog/fix-audit_json_encode_flags new file mode 100644 index 000000000000..f140a52a9274 --- /dev/null +++ b/projects/packages/connection/changelog/fix-audit_json_encode_flags @@ -0,0 +1,4 @@ +Significance: patch +Type: fixed + +Ensure proper flags are used with `json_encode()`. diff --git a/projects/packages/connection/legacy/class-jetpack-signature.php b/projects/packages/connection/legacy/class-jetpack-signature.php index 645db600d2e9..0ed4b8864c9d 100644 --- a/projects/packages/connection/legacy/class-jetpack-signature.php +++ b/projects/packages/connection/legacy/class-jetpack-signature.php @@ -168,7 +168,10 @@ public function sign_request( $token = '', $timestamp = 0, $nonce = '', $body_ha if ( is_array( $body ) ) { if ( $body !== array() ) { // phpcs:ignore WordPress.WP.AlternativeFunctions.json_encode_json_encode - $body = json_encode( $body ); + $body = json_encode( + $body, + 0 // No `json_encode()` flags because this needs to match whatever is calculating the hash on the other end. + ); } else { $body = ''; diff --git a/projects/packages/connection/legacy/class-jetpack-xmlrpc-server.php b/projects/packages/connection/legacy/class-jetpack-xmlrpc-server.php index 5dc5733e1148..a63fb714d1a5 100644 --- a/projects/packages/connection/legacy/class-jetpack-xmlrpc-server.php +++ b/projects/packages/connection/legacy/class-jetpack-xmlrpc-server.php @@ -720,7 +720,8 @@ public function test_api_user_code( $args ) { 'user_id' => $user_id, 'nonce' => $nonce, 'code' => (string) $api_user_code, - ) + ), + 0 // No `json_encode()` flags because this needs to match whatever is calculating the hash on the other end. ), $jetpack_token->secret ); diff --git a/projects/packages/connection/src/class-client.php b/projects/packages/connection/src/class-client.php index 0ba9c4820801..d5a6bcfac6c5 100644 --- a/projects/packages/connection/src/class-client.php +++ b/projects/packages/connection/src/class-client.php @@ -164,7 +164,10 @@ public static function build_signed_request( $args, $body = null ) { // We cast this to a new variable, because the array form of $body needs to be // maintained so it can be passed into the request later on in the code. if ( array() !== $body_to_hash ) { - $body_to_hash = wp_json_encode( self::_stringify_data( $body_to_hash ) ); + $body_to_hash = wp_json_encode( + self::_stringify_data( $body_to_hash ), + 0 // No `json_encode()` flags because this needs to match whatever is calculating the hash on the other end. + ); } else { $body_to_hash = ''; } @@ -417,7 +420,7 @@ public static function validate_args_for_wpcom_json_api_request( * @param string $path REST API path. * @param string $version REST API version. Default is `2`. * @param array $args Arguments to {@see WP_Http}. Default is `array()`. - * @param null|string|array $body Body passed to {@see WP_Http}. Default is `null`. + * @param null|string|array $body Body passed to {@see WP_Http}. Default is `null`. * @param string $base_api_path REST API root. Default is `wpcom`. * * @return array|WP_Error $response Response data, else {@see WP_Error} on failure. @@ -438,7 +441,7 @@ public static function wpcom_json_api_request_as_user( } if ( isset( $body ) && ! is_string( $body ) ) { - $body = wp_json_encode( $body ); + $body = wp_json_encode( $body, JSON_UNESCAPED_SLASHES ); } return self::remote_request( $args, $body ); diff --git a/projects/packages/connection/src/class-connection-notice.php b/projects/packages/connection/src/class-connection-notice.php index c49c5c3da942..ceca340d7aa6 100644 --- a/projects/packages/connection/src/class-connection-notice.php +++ b/projects/packages/connection/src/class-connection-notice.php @@ -169,11 +169,11 @@ function ( $connected_admin ) { } fetch( - , + , { method: 'POST', headers: { - 'X-WP-Nonce': , + 'X-WP-Nonce': , }, body: new URLSearchParams( new FormData( this ) ), } @@ -182,7 +182,7 @@ function ( $connected_admin ) { .then( data => { if ( data.hasOwnProperty( 'code' ) && data.code === 'success' ) { // Owner successfully changed. - results.innerHTML = ; + results.innerHTML = ; setTimeout(function () { document.getElementById( 'jetpack-notice-switch-connection-owner' ).style.display = 'none'; }, 1000); diff --git a/projects/packages/connection/src/class-error-handler.php b/projects/packages/connection/src/class-error-handler.php index 3ab326dc43f8..5fb89b801514 100644 --- a/projects/packages/connection/src/class-error-handler.php +++ b/projects/packages/connection/src/class-error-handler.php @@ -665,7 +665,7 @@ public function encrypt_data_to_wpcom( $data ) { try { // phpcs:disable WordPress.PHP.DiscouragedPHPFunctions.obfuscation_base64_decode // phpcs:disable WordPress.PHP.DiscouragedPHPFunctions.obfuscation_base64_encode - $encrypted_data = base64_encode( sodium_crypto_box_seal( wp_json_encode( $data ), base64_decode( JETPACK__ERRORS_PUBLIC_KEY ) ) ); + $encrypted_data = base64_encode( sodium_crypto_box_seal( wp_json_encode( $data, JSON_UNESCAPED_SLASHES ), base64_decode( JETPACK__ERRORS_PUBLIC_KEY ) ) ); // phpcs:enable WordPress.PHP.DiscouragedPHPFunctions.obfuscation_base64_decode // phpcs:enable WordPress.PHP.DiscouragedPHPFunctions.obfuscation_base64_encode } catch ( \SodiumException $e ) { diff --git a/projects/packages/connection/src/class-initial-state.php b/projects/packages/connection/src/class-initial-state.php index e2545b84fe75..4840ad4b3a73 100644 --- a/projects/packages/connection/src/class-initial-state.php +++ b/projects/packages/connection/src/class-initial-state.php @@ -57,7 +57,7 @@ public static function set_connection_script_data( $data ) { * @return string */ public static function render() { - return 'var JP_CONNECTION_INITIAL_STATE; typeof JP_CONNECTION_INITIAL_STATE === "object" || (JP_CONNECTION_INITIAL_STATE = JSON.parse(decodeURIComponent("' . rawurlencode( wp_json_encode( self::get_data() ) ) . '")));'; + return 'var JP_CONNECTION_INITIAL_STATE; typeof JP_CONNECTION_INITIAL_STATE === "object" || (JP_CONNECTION_INITIAL_STATE = ' . wp_json_encode( self::get_data(), JSON_UNESCAPED_SLASHES | JSON_HEX_TAG | JSON_HEX_AMP ) . ');'; } /** diff --git a/projects/packages/connection/src/class-package-version-tracker.php b/projects/packages/connection/src/class-package-version-tracker.php index d4fed474486e..6044265d0827 100644 --- a/projects/packages/connection/src/class-package-version-tracker.php +++ b/projects/packages/connection/src/class-package-version-tracker.php @@ -152,7 +152,8 @@ protected function update_package_versions_via_remote_request( $package_versions $body = wp_json_encode( array( 'package_versions' => $package_versions, - ) + ), + JSON_UNESCAPED_SLASHES ); $response = Client::wpcom_json_api_request_as_blog( diff --git a/projects/packages/connection/src/class-plugin-storage.php b/projects/packages/connection/src/class-plugin-storage.php index c6a73c3c3483..a8a4a158cad3 100644 --- a/projects/packages/connection/src/class-plugin-storage.php +++ b/projects/packages/connection/src/class-plugin-storage.php @@ -243,7 +243,8 @@ private static function update_active_plugins_wpcom_no_sync_fallback() { $body = wp_json_encode( array( 'active_connected_plugins' => self::$plugins, - ) + ), + JSON_UNESCAPED_SLASHES ); Client::wpcom_json_api_request_as_blog( diff --git a/projects/packages/connection/src/class-rest-connector.php b/projects/packages/connection/src/class-rest-connector.php index 18ac894d5585..6285f58ee883 100644 --- a/projects/packages/connection/src/class-rest-connector.php +++ b/projects/packages/connection/src/class-rest-connector.php @@ -1103,7 +1103,8 @@ public static function is_request_signed_by_jetpack_debugger( $pub_key = null ) 'rest_route' => filter_var( wp_unslash( $_GET['rest_route'] ) ), 'timestamp' => (int) $_GET['timestamp'], 'url' => filter_var( wp_unslash( $_GET['url'] ) ), - ) + ), + 0 // No `json_encode()` flags because this needs to match whatever is calculating the hash on the other end. ); if ( diff --git a/projects/packages/connection/src/identity-crisis/class-ui.php b/projects/packages/connection/src/identity-crisis/class-ui.php index da8e908d77eb..0e85a019a84a 100644 --- a/projects/packages/connection/src/identity-crisis/class-ui.php +++ b/projects/packages/connection/src/identity-crisis/class-ui.php @@ -89,7 +89,7 @@ public static function render_container() { * @return string */ private static function get_initial_state() { - return 'var JP_IDENTITY_CRISIS__INITIAL_STATE=JSON.parse(decodeURIComponent("' . rawurlencode( wp_json_encode( static::get_initial_state_data() ) ) . '"));'; + return 'var JP_IDENTITY_CRISIS__INITIAL_STATE=' . wp_json_encode( static::get_initial_state_data(), JSON_UNESCAPED_SLASHES | JSON_HEX_TAG | JSON_HEX_AMP ) . ';'; } /** diff --git a/projects/packages/connection/tests/php/Connection_Notice_Test.php b/projects/packages/connection/tests/php/Connection_Notice_Test.php index 41edd3385eef..10090e5c1ff6 100644 --- a/projects/packages/connection/tests/php/Connection_Notice_Test.php +++ b/projects/packages/connection/tests/php/Connection_Notice_Test.php @@ -69,7 +69,7 @@ public function test_delete_user_change_owner_notice() { $notice = new Connection_Notice(); $this->expectOutputRegex( '#Set new connection owner#i' ); - $this->expectOutputRegex( '#' . preg_quote( 'http:\/\/example.org\/index.php?rest_route=\/jetpack\/v4\/connection\/owner', '#' ) . '#i' ); + $this->expectOutputRegex( '#' . preg_quote( 'http://example.org/index.php?rest_route=/jetpack/v4/connection/owner', '#' ) . '#i' ); $notice->delete_user_update_connection_owner_notice(); } diff --git a/projects/packages/connection/tests/php/Initial_State_Test.php b/projects/packages/connection/tests/php/Initial_State_Test.php index f925cafac6d0..a2b0ecbdafc4 100644 --- a/projects/packages/connection/tests/php/Initial_State_Test.php +++ b/projects/packages/connection/tests/php/Initial_State_Test.php @@ -49,7 +49,7 @@ function () { 'isOfflineMode' => ( new Status() )->is_offline_mode(), 'calypsoEnv' => 'wpcalypso', ); - $expected_value = 'var JP_CONNECTION_INITIAL_STATE; typeof JP_CONNECTION_INITIAL_STATE === "object" || (JP_CONNECTION_INITIAL_STATE = JSON.parse(decodeURIComponent("' . rawurlencode( wp_json_encode( $expected_state ) ) . '")));'; + $expected_value = 'var JP_CONNECTION_INITIAL_STATE; typeof JP_CONNECTION_INITIAL_STATE === "object" || (JP_CONNECTION_INITIAL_STATE = ' . wp_json_encode( $expected_state, JSON_UNESCAPED_SLASHES | JSON_HEX_TAG | JSON_HEX_AMP ) . ');'; $actual_value = Initial_State::render(); diff --git a/projects/packages/connection/tests/php/Partner_Coupon_Test.php b/projects/packages/connection/tests/php/Partner_Coupon_Test.php index 32d89bd2b556..67ca6971c8c8 100644 --- a/projects/packages/connection/tests/php/Partner_Coupon_Test.php +++ b/projects/packages/connection/tests/php/Partner_Coupon_Test.php @@ -270,7 +270,7 @@ public function test_maybe_purge_coupon_by_availability_check( $mock_response, $ ); if ( isset( $mock_response['body'] ) ) { - $mock_response['body'] = wp_json_encode( $mock_response['body'] ); + $mock_response['body'] = wp_json_encode( $mock_response['body'], JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE ); } $callback = $this->getMockBuilder( \CallableMock::class )->getMock(); diff --git a/projects/packages/connection/tests/php/REST_Endpoints_Test.php b/projects/packages/connection/tests/php/REST_Endpoints_Test.php index 870c9e8e156b..54b079914745 100644 --- a/projects/packages/connection/tests/php/REST_Endpoints_Test.php +++ b/projects/packages/connection/tests/php/REST_Endpoints_Test.php @@ -460,7 +460,7 @@ public function test_connection_register() { $request = new WP_REST_Request( 'POST', '/jetpack/v4/connection/register' ); $request->set_header( 'Content-Type', 'application/json' ); - $request->set_body( wp_json_encode( array( 'registration_nonce' => wp_create_nonce( 'jetpack-registration-nonce' ) ) ) ); + $request->set_body( wp_json_encode( array( 'registration_nonce' => wp_create_nonce( 'jetpack-registration-nonce' ) ), JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE ) ); $response = $this->server->dispatch( $request ); $data = $response->get_data(); @@ -486,7 +486,7 @@ public function test_connection_register_with_alternate_auth_url() { $request = new WP_REST_Request( 'POST', '/jetpack/v4/connection/register' ); $request->set_header( 'Content-Type', 'application/json' ); - $request->set_body( wp_json_encode( array( 'registration_nonce' => wp_create_nonce( 'jetpack-registration-nonce' ) ) ) ); + $request->set_body( wp_json_encode( array( 'registration_nonce' => wp_create_nonce( 'jetpack-registration-nonce' ) ), JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE ) ); $response = $this->server->dispatch( $request ); $data = $response->get_data(); @@ -509,7 +509,7 @@ public function test_set_user_token_unauthenticated() { $request = new WP_REST_Request( 'POST', '/jetpack/v4/user-token' ); $request->set_header( 'Content-Type', 'application/json' ); - $request->set_body( wp_json_encode( array( 'user_token' => 'test.test.1' ) ) ); + $request->set_body( wp_json_encode( array( 'user_token' => 'test.test.1' ), JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE ) ); $response = $this->server->dispatch( $request ); $data = $response->get_data(); @@ -526,7 +526,7 @@ public function test_set_user_token_with_admin_user_fails_auth() { $request = new WP_REST_Request( 'POST', '/jetpack/v4/user-token' ); $request->set_header( 'Content-Type', 'application/json' ); - $request->set_body( wp_json_encode( array( 'user_token' => 'test.test.1' ) ) ); + $request->set_body( wp_json_encode( array( 'user_token' => 'test.test.1' ), JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE ) ); $response = $this->server->dispatch( $request ); $data = $response->get_data(); @@ -567,7 +567,7 @@ public function test_set_user_token_success() { $user_token = 'test.test.1'; - $request->set_body( wp_json_encode( array( 'user_token' => $user_token ) ) ); + $request->set_body( wp_json_encode( array( 'user_token' => $user_token ), JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE ) ); $response = $this->server->dispatch( $request ); $data = $response->get_data(); @@ -599,7 +599,7 @@ public function test_update_connection_owner_failures() { $this->assertEquals( 'Missing parameter(s): owner', $response->get_data()['message'] ); // Attempt owner change with bad user. - $request->set_body( wp_json_encode( array( 'owner' => 999 ) ) ); + $request->set_body( wp_json_encode( array( 'owner' => 999 ), JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE ) ); $response = $this->server->dispatch( $request ); $this->assertEquals( 400, $response->get_status() ); $this->assertEquals( 'New owner is not admin', $response->get_data()['message'] ); @@ -607,7 +607,7 @@ public function test_update_connection_owner_failures() { // Change owner to valid user but XML-RPC request to WPCOM failed. add_filter( 'pre_http_request', array( $this, 'mock_xmlrpc_failure' ), 10, 3 ); - $request->set_body( wp_json_encode( array( 'owner' => self::$secondary_user_id ) ) ); + $request->set_body( wp_json_encode( array( 'owner' => self::$secondary_user_id ), JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE ) ); $response = $this->server->dispatch( $request ); remove_filter( 'pre_http_request', array( $this, 'mock_xmlrpc_failure' ), 10 ); @@ -624,7 +624,7 @@ public function test_update_connection_owner_success() { // Change owner to valid user. $request = new WP_REST_Request( 'POST', '/jetpack/v4/connection/owner' ); $request->set_header( 'Content-Type', 'application/json' ); - $request->set_body( wp_json_encode( array( 'owner' => self::$secondary_user_id ) ) ); + $request->set_body( wp_json_encode( array( 'owner' => self::$secondary_user_id ), JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE ) ); // Mock full connection established. add_filter( 'jetpack_options', array( $this, 'mock_jetpack_options' ), 10, 2 ); @@ -659,7 +659,7 @@ public function test_disconnect_site_with_missing_param() { public function test_disconnect_site_with_invalid_param() { $request = new WP_REST_Request( 'POST', '/jetpack/v4/connection' ); $request->set_header( 'Content-Type', 'application/json' ); - $request->set_body( wp_json_encode( array( 'isActive' => 'should_be_bool_false' ) ) ); + $request->set_body( wp_json_encode( array( 'isActive' => 'should_be_bool_false' ), JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE ) ); $response = $this->server->dispatch( $request ); $response_data = $response->get_data(); @@ -678,7 +678,7 @@ public function test_disconnect_site_with_invalid_user_permissions() { $request = new WP_REST_Request( 'POST', '/jetpack/v4/connection' ); $request->set_header( 'Content-Type', 'application/json' ); - $request->set_body( wp_json_encode( array( 'isActive' => false ) ) ); + $request->set_body( wp_json_encode( array( 'isActive' => false ), JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE ) ); $response = $this->server->dispatch( $request ); @@ -692,7 +692,7 @@ public function test_disconnect_site_site_not_connected() { $request = new WP_REST_Request( 'POST', '/jetpack/v4/connection' ); $request->set_header( 'Content-Type', 'application/json' ); - $request->set_body( wp_json_encode( array( 'isActive' => false ) ) ); + $request->set_body( wp_json_encode( array( 'isActive' => false ), JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE ) ); $response = $this->server->dispatch( $request ); $response_data = $response->get_data(); @@ -707,7 +707,7 @@ public function test_disconnect_site_site_not_connected() { public function test_disconnect_site_success() { $request = new WP_REST_Request( 'POST', '/jetpack/v4/connection' ); $request->set_header( 'Content-Type', 'application/json' ); - $request->set_body( wp_json_encode( array( 'isActive' => false ) ) ); + $request->set_body( wp_json_encode( array( 'isActive' => false ), JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE ) ); // Mock full connection established. add_filter( 'jetpack_options', array( $this, 'mock_jetpack_options' ), 10, 2 ); @@ -739,7 +739,7 @@ public function test_disconnect_site_site_connection_success() { $request = new WP_REST_Request( 'POST', '/jetpack/v4/connection' ); $request->set_header( 'Content-Type', 'application/json' ); - $request->set_body( wp_json_encode( array( 'isActive' => false ) ) ); + $request->set_body( wp_json_encode( array( 'isActive' => false ), JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE ) ); $response = $this->server->dispatch( $request ); $response_data = $response->get_data(); @@ -765,7 +765,8 @@ public function test_unlink_user_success() { 'linked' => false, 'force' => true, 'disconnect-all-users' => true, - ) + ), + JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE ) ); @@ -793,7 +794,7 @@ public function test_unlink_user_success_when_non_admin_and_no_connection_owner( $request = new WP_REST_Request( 'POST', '/jetpack/v4/connection/user' ); $request->set_header( 'Content-Type', 'application/json' ); - $request->set_body( wp_json_encode( array( 'linked' => false ) ) ); + $request->set_body( wp_json_encode( array( 'linked' => false ), JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE ) ); // Mock non-admin user connected with no connection owner. add_filter( 'jetpack_options', array( $this, 'mock_jetpack_options_no_connection_owner' ), 10, 2 ); @@ -1040,7 +1041,7 @@ public function test_remote_register_connected_unauthenticated() { 'local_user' => static::$user_id, 'nonce' => 'foobar', ); - $request->set_body( wp_json_encode( $body ) ); + $request->set_body( wp_json_encode( $body, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE ) ); // Mock full connection established. add_filter( 'jetpack_options', array( $this, 'mock_jetpack_options' ), 10, 2 ); @@ -1068,7 +1069,7 @@ public function test_remote_register_not_connected_unauthenticated() { 'local_user' => -1, 'nonce' => 'foobar', ); - $request->set_body( wp_json_encode( $body ) ); + $request->set_body( wp_json_encode( $body, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE ) ); $response = $this->server->dispatch( $request ); $response_data = $response->get_data(); @@ -1097,7 +1098,7 @@ public function test_remote_register_connected_authenticated() { 'local_user' => -1, 'nonce' => 'foobar', ); - $request->set_body( wp_json_encode( $body ) ); + $request->set_body( wp_json_encode( $body, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE ) ); $response = $this->server->dispatch( $request ); $response_data = $response->get_data(); @@ -1118,7 +1119,7 @@ public function test_remote_provision_unauthenticated() { $request->set_header( 'Content-Type', 'application/json' ); $body = array( 'local_user' => static::$user_id ); - $request->set_body( wp_json_encode( $body ) ); + $request->set_body( wp_json_encode( $body, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE ) ); // Mock full connection established. add_filter( 'jetpack_options', array( $this, 'mock_jetpack_options' ), 10, 2 ); @@ -1149,7 +1150,7 @@ public function test_remote_provision_authenticated() { $request->set_header( 'Content-Type', 'application/json' ); $body = array( 'local_user' => -1 ); - $request->set_body( wp_json_encode( $body ) ); + $request->set_body( wp_json_encode( $body, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE ) ); $response = $this->server->dispatch( $request ); $response_data = $response->get_data(); @@ -1170,7 +1171,7 @@ public function test_remote_connect_unauthenticated() { $request->set_header( 'Content-Type', 'application/json' ); $body = array( 'local_user' => static::$user_id ); - $request->set_body( wp_json_encode( $body ) ); + $request->set_body( wp_json_encode( $body, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE ) ); // Mock full connection established. add_filter( 'jetpack_options', array( $this, 'mock_jetpack_options' ), 10, 2 ); @@ -1200,7 +1201,7 @@ public function test_remote_connect_authenticated() { $request->set_header( 'Content-Type', 'application/json' ); $body = array( 'local_user' => -1 ); - $request->set_body( wp_json_encode( $body ) ); + $request->set_body( wp_json_encode( $body, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE ) ); $response = $this->server->dispatch( $request ); $response_data = $response->get_data(); @@ -1388,7 +1389,8 @@ private static function get_register_request_mock_response( $allow_inplace_autho 'jetpack_secret' => 'sample_secret', 'allow_inplace_authorization' => $allow_inplace_authorization, 'alternate_authorization_url' => $alternate_authorization_url, - ) + ), + JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE ), 'response' => array( 'code' => 200, @@ -1464,7 +1466,7 @@ public function intercept_validate_tokens_request_failed( $response, $args, $url return array( 'headers' => new CaseInsensitiveDictionary( array( 'content-type' => 'application/json' ) ), - 'body' => wp_json_encode( array( 'dummy_error' => true ) ), + 'body' => wp_json_encode( array( 'dummy_error' => true ), JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE ), 'response' => array( 'code' => 500, 'message' => 'failed', @@ -1507,7 +1509,7 @@ private function build_validate_tokens_response( $invalid_token ) { return array( 'headers' => new CaseInsensitiveDictionary( array( 'content-type' => 'application/json' ) ), - 'body' => wp_json_encode( $body ), + 'body' => wp_json_encode( $body, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE ), 'response' => array( 'code' => 200, 'message' => 'OK', @@ -1531,7 +1533,7 @@ public function intercept_refresh_blog_token_request( $response, $args, $url ) { return array( 'headers' => new CaseInsensitiveDictionary( array( 'content-type' => 'application/json' ) ), - 'body' => wp_json_encode( array( 'jetpack_secret' => self::BLOG_TOKEN ) ), + 'body' => wp_json_encode( array( 'jetpack_secret' => self::BLOG_TOKEN ), JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE ), 'response' => array( 'code' => 200, 'message' => 'OK', @@ -1555,7 +1557,7 @@ public function intercept_refresh_blog_token_request_fail( $response, $args, $ur return array( 'headers' => new CaseInsensitiveDictionary( array( 'content-type' => 'application/json' ) ), - 'body' => wp_json_encode( array( 'jetpack_secret_missing' => true ) ), // Meaningless body. + 'body' => wp_json_encode( array( 'jetpack_secret_missing' => true ), JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE ), // Meaningless body. 'response' => array( 'code' => 200, 'message' => 'OK', @@ -1584,7 +1586,8 @@ public function intercept_auth_token_request( $response, $args, $url ) { 'access_token' => 'mock.token', 'token_type' => 'X_JETPACK', 'scope' => ( new Manager() )->sign_role( 'administrator' ), - ) + ), + JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE ), 'response' => array( 'code' => 200, diff --git a/projects/packages/connection/tests/php/TokensTest.php b/projects/packages/connection/tests/php/TokensTest.php index b7d57f8a0984..daf80c614640 100644 --- a/projects/packages/connection/tests/php/TokensTest.php +++ b/projects/packages/connection/tests/php/TokensTest.php @@ -207,7 +207,7 @@ public function intercept_jetpack_token_health_request_failed( $response, $args, return array( 'headers' => new CaseInsensitiveDictionary( array( 'content-type' => 'application/json' ) ), - 'body' => wp_json_encode( array( 'dummy_error' => true ) ), + 'body' => wp_json_encode( array( 'dummy_error' => true ), JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE ), 'response' => array( 'code' => 500, 'message' => 'failed', @@ -241,7 +241,7 @@ public function intercept_jetpack_token_health_request_success( $response, $args return array( 'headers' => new CaseInsensitiveDictionary( array( 'content-type' => 'application/json' ) ), - 'body' => wp_json_encode( $body ), + 'body' => wp_json_encode( $body, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE ), 'response' => array( 'code' => 200, 'message' => 'OK', diff --git a/projects/packages/connection/tests/php/XMLRPC_Connector_Test.php b/projects/packages/connection/tests/php/XMLRPC_Connector_Test.php index ad8f5792df3e..896936f8311a 100644 --- a/projects/packages/connection/tests/php/XMLRPC_Connector_Test.php +++ b/projects/packages/connection/tests/php/XMLRPC_Connector_Test.php @@ -56,7 +56,14 @@ public static function setUpBeforeClass(): void { 'url' => 'https://example.com', ); - openssl_sign( wp_json_encode( $url_parameters ), $signature, $private_key ); + openssl_sign( + wp_json_encode( + $url_parameters, + 0 // No `json_encode()` flags because this needs to match whatever is calculating the hash on the other end. + ), + $signature, + $private_key + ); self::$signature = ( base64_encode( $signature ) ); } diff --git a/projects/packages/connection/tests/php/identity-crisis/Identity_Crisis_Test.php b/projects/packages/connection/tests/php/identity-crisis/Identity_Crisis_Test.php index a5b04f627f20..6271873632e3 100644 --- a/projects/packages/connection/tests/php/identity-crisis/Identity_Crisis_Test.php +++ b/projects/packages/connection/tests/php/identity-crisis/Identity_Crisis_Test.php @@ -656,7 +656,8 @@ public static function data_provider_test_check_http_response_for_idc_detected_i array( 'test1' => 'test 1', 'test2' => 'test 2', - ) + ), + JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE ); return array( @@ -705,7 +706,8 @@ public static function data_provider_test_check_http_response_for_idc_detected_i 'wpcom_home' => 'example.com/', ), 'test' => 'test value', - ) + ), + JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE ); $matching_error_code_body = wp_json_encode( @@ -718,7 +720,8 @@ public static function data_provider_test_check_http_response_for_idc_detected_i 'wpcom_home' => 'example.com/', ), 'test' => 'test value', - ) + ), + JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE ); return array( @@ -745,7 +748,8 @@ public function test_check_http_response_for_idc_detected_migrated_for_idc() { 'body' => wp_json_encode( array( 'migrated_for_idc' => true, - ) + ), + JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE ), ); diff --git a/projects/packages/connection/tests/php/identity-crisis/REST_Endpoints_Test.php b/projects/packages/connection/tests/php/identity-crisis/REST_Endpoints_Test.php index e7924b5fa176..ee4af6ac9f91 100644 --- a/projects/packages/connection/tests/php/identity-crisis/REST_Endpoints_Test.php +++ b/projects/packages/connection/tests/php/identity-crisis/REST_Endpoints_Test.php @@ -253,7 +253,7 @@ public function test_compare_url_secret_match() { $request = new WP_REST_Request( 'POST', '/jetpack/v4/identity-crisis/compare-url-secret' ); $request->set_header( 'Content-Type', 'application/json' ); - $request->set_body( wp_json_encode( array( 'secret' => $secret_data['secret'] ) ) ); + $request->set_body( wp_json_encode( array( 'secret' => $secret_data['secret'] ), JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE ) ); $response = $this->server->dispatch( $request ); $data = $response->get_data(); @@ -274,7 +274,7 @@ public function test_compare_url_secret_no_match() { $request = new WP_REST_Request( 'POST', '/jetpack/v4/identity-crisis/compare-url-secret' ); $request->set_header( 'Content-Type', 'application/json' ); - $request->set_body( wp_json_encode( array( 'secret' => '54321fdsa' ) ) ); + $request->set_body( wp_json_encode( array( 'secret' => '54321fdsa' ), JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE ) ); $response = $this->server->dispatch( $request ); $data = $response->get_data(); @@ -292,7 +292,7 @@ public function test_compare_url_secret_no_access() { $request = new WP_REST_Request( 'POST', '/jetpack/v4/identity-crisis/compare-url-secret' ); $request->set_header( 'Content-Type', 'application/json' ); - $request->set_body( wp_json_encode( array( 'secret' => '54321fdsa' ) ) ); + $request->set_body( wp_json_encode( array( 'secret' => '54321fdsa' ), JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE ) ); $response = $this->server->dispatch( $request ); $data = $response->get_data(); diff --git a/projects/packages/external-connections/changelog/fix-audit_json_encode_flags b/projects/packages/external-connections/changelog/fix-audit_json_encode_flags new file mode 100644 index 000000000000..f140a52a9274 --- /dev/null +++ b/projects/packages/external-connections/changelog/fix-audit_json_encode_flags @@ -0,0 +1,4 @@ +Significance: patch +Type: fixed + +Ensure proper flags are used with `json_encode()`. diff --git a/projects/packages/external-connections/src/class-external-connections.php b/projects/packages/external-connections/src/class-external-connections.php index 5b8a55ecc0dc..37c2071646c1 100644 --- a/projects/packages/external-connections/src/class-external-connections.php +++ b/projects/packages/external-connections/src/class-external-connections.php @@ -274,7 +274,7 @@ function () use ( $service, $support_link ) { wp_add_inline_script( $asset_name, - 'const jetpackExternalConnectionsData = ' . wp_json_encode( $script_data ) . ';', + 'const jetpackExternalConnectionsData = ' . wp_json_encode( $script_data, JSON_UNESCAPED_SLASHES | JSON_HEX_TAG | JSON_HEX_AMP ) . ';', 'before' ); } diff --git a/projects/packages/external-media/changelog/add-extra-media-sources-filter b/projects/packages/external-media/changelog/add-extra-media-sources-filter new file mode 100644 index 000000000000..7f7570df281b --- /dev/null +++ b/projects/packages/external-media/changelog/add-extra-media-sources-filter @@ -0,0 +1,4 @@ +Significance: minor +Type: added + +External Media: add filter for adding custom sources to the media sources dropdown. diff --git a/projects/packages/external-media/changelog/fix-audit_json_encode_flags b/projects/packages/external-media/changelog/fix-audit_json_encode_flags new file mode 100644 index 000000000000..f140a52a9274 --- /dev/null +++ b/projects/packages/external-media/changelog/fix-audit_json_encode_flags @@ -0,0 +1,4 @@ +Significance: patch +Type: fixed + +Ensure proper flags are used with `json_encode()`. diff --git a/projects/packages/external-media/src/class-external-media.php b/projects/packages/external-media/src/class-external-media.php index b91116c22a7b..77b35b90b85c 100644 --- a/projects/packages/external-media/src/class-external-media.php +++ b/projects/packages/external-media/src/class-external-media.php @@ -70,7 +70,7 @@ public static function enqueue_block_editor_assets() { wp_add_inline_script( $asset_name, - sprintf( 'var JetpackExternalMediaData = %s;', wp_json_encode( self::get_data() ) ), + sprintf( 'var JetpackExternalMediaData = %s;', wp_json_encode( self::get_data(), JSON_UNESCAPED_SLASHES | JSON_HEX_TAG | JSON_HEX_AMP ) ), 'before' ); diff --git a/projects/packages/external-media/src/shared/media-button/media-menu.js b/projects/packages/external-media/src/shared/media-button/media-menu.js index 3fb30cb3de3d..cb1e1c144680 100644 --- a/projects/packages/external-media/src/shared/media-button/media-menu.js +++ b/projects/packages/external-media/src/shared/media-button/media-menu.js @@ -88,6 +88,7 @@ function MediaButtonMenu( props ) { { + return ( + { + onClick(); + setSource( id ); + } ) + } + > + { label } + + ); + }; + return ( { originalButton && originalButton( { open } ) } - { internalMediaSources.map( ( { icon, id, label } ) => ( - { - onClick(); - setSource( id ); - } } - > - { label } - - ) ) } + { internalMediaSources.map( renderMenuItem ) } { isFeatured && - featuredImageExclusiveMediaSources.map( ( { icon, id, label } ) => ( - { - onClick(); - setSource( id ); - } } - > - { label } - - ) ) } + isFeaturedImageGeneratorEnabled() && + featuredImageExclusiveMediaSources.map( renderMenuItem ) } { ! isFeatured && isGeneralPurposeImageGeneratorBetaEnabled() && - generalPurposeImageExclusiveMediaSources.map( ( { icon, id, label } ) => ( - { - onClick(); - setSource( id ); - } } - > - { label } - - ) ) } + generalPurposeImageExclusiveMediaSources.map( renderMenuItem ) } + + { extraMediaSources.map( renderMenuItem ) }
- { externalMediaSources.map( ( { icon, id, label } ) => ( - { - onClick(); - setSource( id ); - } } - > - { label } - - ) ) } + { externalMediaSources.map( renderMenuItem ) }
); } diff --git a/projects/packages/external-media/src/shared/utils/is-featured-image-generator-enabled.js b/projects/packages/external-media/src/shared/utils/is-featured-image-generator-enabled.js new file mode 100644 index 000000000000..f43eac11f040 --- /dev/null +++ b/projects/packages/external-media/src/shared/utils/is-featured-image-generator-enabled.js @@ -0,0 +1,14 @@ +export const isFeaturedImageGeneratorEnabled = () => { + if ( window?.Jetpack_Editor_Initial_State ) { + return ( + window?.Jetpack_Editor_Initial_State?.available_blocks?.[ 'ai-featured-image-generator' ] + ?.available === true + ); + } + + if ( window?.JetpackExternalMediaData ) { + return window?.JetpackExternalMediaData?.[ 'ai-assistant' ]?.[ 'is-enabled' ]; + } + + return false; +}; diff --git a/projects/packages/forms/.phan/baseline.php b/projects/packages/forms/.phan/baseline.php index 51cec46cb58b..30a571dc80d2 100644 --- a/projects/packages/forms/.phan/baseline.php +++ b/projects/packages/forms/.phan/baseline.php @@ -20,14 +20,12 @@ // PhanDeprecatedClass : 1 occurrence // PhanPluginMixedKeyNoKey : 1 occurrence // PhanPossiblyNullTypeMismatchProperty : 1 occurrence - // PhanTypeArraySuspiciousNullable : 1 occurrence // PhanTypeMismatchReturnNullable : 1 occurrence // PhanUnreferencedUseNormal : 1 occurrence // Currently, file_suppressions and directory_suppressions are the only supported suppressions 'file_suppressions' => [ 'src/abilities/class-forms-abilities.php' => ['PhanUndeclaredFunction'], - 'src/contact-form/class-admin.php' => ['PhanPluginDuplicateConditionalNullCoalescing', 'PhanTypeArraySuspiciousNullable', 'PhanTypeMismatchArgument', 'PhanTypeMismatchArgumentProbablyReal', 'PhanTypeMismatchReturn'], 'src/contact-form/class-contact-form-field.php' => ['PhanPluginDuplicateConditionalNullCoalescing', 'PhanPossiblyNullTypeMismatchProperty', 'PhanTypeConversionFromArray', 'PhanTypeMismatchArgument', 'PhanTypeMismatchReturnProbablyReal'], 'src/contact-form/class-contact-form-plugin.php' => ['PhanPluginDuplicateAdjacentStatement', 'PhanPluginDuplicateConditionalNullCoalescing', 'PhanTypeMismatchArgument', 'PhanTypeMismatchArgumentProbablyReal', 'PhanTypeMismatchReturnProbablyReal'], 'src/contact-form/class-contact-form-shortcode.php' => ['PhanPluginDuplicateConditionalNullCoalescing', 'PhanTypeMismatchReturnProbablyReal'], diff --git a/projects/packages/forms/CHANGELOG.md b/projects/packages/forms/CHANGELOG.md index 3ef8e1e7c239..94ad1e237a85 100644 --- a/projects/packages/forms/CHANGELOG.md +++ b/projects/packages/forms/CHANGELOG.md @@ -5,6 +5,14 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [6.21.2] - 2025-12-04 +### Fixed +- Forms: Use the correct case on cipher names [#46189] + +## [6.21.1] - 2025-12-03 +### Fixed +- Fix the flickering between the sidebar loading on different browser widths. + ## [6.21.0] - 2025-12-01 ### Added - Add form response webhook support. [#46059] @@ -1934,6 +1942,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Added a new jetpack/forms package [#28409] - Added a public load_contact_form method for initializing the contact form module. [#28416] +[6.21.2]: https://github.com/automattic/jetpack-forms/compare/v6.21.1...v6.21.2 +[6.21.1]: https://github.com/automattic/jetpack-forms/compare/v6.21.0...v6.21.1 [6.21.0]: https://github.com/automattic/jetpack-forms/compare/v6.20.0...v6.21.0 [6.20.0]: https://github.com/automattic/jetpack-forms/compare/v6.19.0...v6.20.0 [6.19.0]: https://github.com/automattic/jetpack-forms/compare/v6.18.0...v6.19.0 diff --git a/projects/packages/forms/assets/images/integrations/akismet.svg b/projects/packages/forms/assets/images/integrations/akismet.svg new file mode 100644 index 000000000000..b1adce8fd9d0 --- /dev/null +++ b/projects/packages/forms/assets/images/integrations/akismet.svg @@ -0,0 +1,14 @@ + + diff --git a/projects/packages/forms/assets/images/integrations/google-drive.svg b/projects/packages/forms/assets/images/integrations/google-drive.svg new file mode 100644 index 000000000000..8c20c8f59e32 --- /dev/null +++ b/projects/packages/forms/assets/images/integrations/google-drive.svg @@ -0,0 +1,6 @@ + + diff --git a/projects/packages/forms/assets/images/integrations/hostinger-reach.svg b/projects/packages/forms/assets/images/integrations/hostinger-reach.svg new file mode 100644 index 000000000000..e230ec9a5fa5 --- /dev/null +++ b/projects/packages/forms/assets/images/integrations/hostinger-reach.svg @@ -0,0 +1,4 @@ + + diff --git a/projects/packages/forms/assets/images/integrations/mailpoet.svg b/projects/packages/forms/assets/images/integrations/mailpoet.svg new file mode 100644 index 000000000000..70fffd2b03a7 --- /dev/null +++ b/projects/packages/forms/assets/images/integrations/mailpoet.svg @@ -0,0 +1,5 @@ + + diff --git a/projects/packages/forms/assets/images/integrations/salesforce.svg b/projects/packages/forms/assets/images/integrations/salesforce.svg new file mode 100644 index 000000000000..d0a764069d50 --- /dev/null +++ b/projects/packages/forms/assets/images/integrations/salesforce.svg @@ -0,0 +1,13 @@ + + diff --git a/projects/packages/forms/assets/images/integrations/zero-bs-crm.svg b/projects/packages/forms/assets/images/integrations/zero-bs-crm.svg new file mode 100644 index 000000000000..10038e5aea70 --- /dev/null +++ b/projects/packages/forms/assets/images/integrations/zero-bs-crm.svg @@ -0,0 +1,4 @@ + + diff --git a/projects/packages/forms/changelog/add-forms-icons-filter b/projects/packages/forms/changelog/add-forms-icons-filter new file mode 100644 index 000000000000..4ca230e6ad2e --- /dev/null +++ b/projects/packages/forms/changelog/add-forms-icons-filter @@ -0,0 +1,4 @@ +Significance: minor +Type: added + +Forms: add filter to hide integration icons. diff --git a/projects/packages/forms/changelog/add-forms-integrations-display-filters b/projects/packages/forms/changelog/add-forms-integrations-display-filters new file mode 100644 index 000000000000..44d20918cff6 --- /dev/null +++ b/projects/packages/forms/changelog/add-forms-integrations-display-filters @@ -0,0 +1,4 @@ +Significance: minor +Type: added + +Forms: add integrations display filters. diff --git a/projects/packages/forms/changelog/fix-audit_json_encode_flags b/projects/packages/forms/changelog/fix-audit_json_encode_flags new file mode 100644 index 000000000000..f140a52a9274 --- /dev/null +++ b/projects/packages/forms/changelog/fix-audit_json_encode_flags @@ -0,0 +1,4 @@ +Significance: patch +Type: fixed + +Ensure proper flags are used with `json_encode()`. diff --git a/projects/packages/forms/changelog/fix-forms-buttons-mobile-behavior b/projects/packages/forms/changelog/fix-forms-buttons-mobile-behavior new file mode 100644 index 000000000000..74dec27e46e1 --- /dev/null +++ b/projects/packages/forms/changelog/fix-forms-buttons-mobile-behavior @@ -0,0 +1,4 @@ +Significance: patch +Type: fixed + +Make form buttons take full width on mobile devices diff --git a/projects/packages/forms/changelog/fix-forms-dashboard-background b/projects/packages/forms/changelog/fix-forms-dashboard-background new file mode 100644 index 000000000000..4b1adbb8f6ad --- /dev/null +++ b/projects/packages/forms/changelog/fix-forms-dashboard-background @@ -0,0 +1,5 @@ +Significance: patch +Type: fixed +Comment: Just a background color for compatibility with an incoming dependency update + + diff --git a/projects/packages/forms/changelog/fix-forms-dashboard-primary-field b/projects/packages/forms/changelog/fix-forms-dashboard-primary-field new file mode 100644 index 000000000000..1f2751b68bdd --- /dev/null +++ b/projects/packages/forms/changelog/fix-forms-dashboard-primary-field @@ -0,0 +1,4 @@ +Significance: patch +Type: fixed + +Forms: Set "from" field as primary on dashboard diff --git a/projects/packages/forms/changelog/fix-forms-html-entities-csv-export b/projects/packages/forms/changelog/fix-forms-html-entities-csv-export new file mode 100644 index 000000000000..6b5e7034bf9a --- /dev/null +++ b/projects/packages/forms/changelog/fix-forms-html-entities-csv-export @@ -0,0 +1,4 @@ +Significance: patch +Type: fixed + +Forms: Decode HTML entities in exported form names to prevent codes like – appearing in CSV exports diff --git a/projects/packages/forms/changelog/fix-php-warning-on-forms b/projects/packages/forms/changelog/fix-php-warning-on-forms new file mode 100644 index 000000000000..b68eddb8c208 --- /dev/null +++ b/projects/packages/forms/changelog/fix-php-warning-on-forms @@ -0,0 +1,4 @@ +Significance: patch +Type: fixed + + Forms: fix PHP warning when global gets overwritten diff --git a/projects/packages/forms/changelog/remove-contact-form-legacy-admin-files b/projects/packages/forms/changelog/remove-contact-form-legacy-admin-files new file mode 100644 index 000000000000..fb662a20fa10 --- /dev/null +++ b/projects/packages/forms/changelog/remove-contact-form-legacy-admin-files @@ -0,0 +1,4 @@ +Significance: minor +Type: removed + +Forms: remove admin class files diff --git a/projects/packages/forms/changelog/renovate-@wordpressdataviews b/projects/packages/forms/changelog/renovate-@wordpressdataviews new file mode 100644 index 000000000000..45028352a802 --- /dev/null +++ b/projects/packages/forms/changelog/renovate-@wordpressdataviews @@ -0,0 +1,4 @@ +Significance: patch +Type: changed + +Update package dependencies. diff --git a/projects/packages/forms/changelog/renovate-major-eslint-packages b/projects/packages/forms/changelog/renovate-major-eslint-packages new file mode 100644 index 000000000000..7a568881a52e --- /dev/null +++ b/projects/packages/forms/changelog/renovate-major-eslint-packages @@ -0,0 +1,5 @@ +Significance: patch +Type: changed +Comment: Fix new lints in jsdoc comments. Should be no changes to functionality. + + diff --git a/projects/packages/forms/docs/README.md b/projects/packages/forms/docs/README.md index e3f7b586e3c5..14983dfabd04 100644 --- a/projects/packages/forms/docs/README.md +++ b/projects/packages/forms/docs/README.md @@ -34,12 +34,8 @@ Classes that handle form rendering and processing: Classes for admin and user-facing interfaces: -- **Admin** - Admin interface for viewing and managing form submissions. Provides list tables and detail views for feedback posts. - - **Editor_View** - Handles form display in the block editor. Provides live previews and editing capabilities. -- **Form_View** - Renders forms on the frontend. Handles HTML generation, validation display, and success messages. - ### Utilities Helper classes: diff --git a/projects/packages/forms/package.json b/projects/packages/forms/package.json index 21d282fb323a..41a447d28ea9 100644 --- a/projects/packages/forms/package.json +++ b/projects/packages/forms/package.json @@ -1,6 +1,6 @@ { "name": "@automattic/jetpack-forms", - "version": "6.21.0", + "version": "6.21.2", "private": true, "description": "Jetpack Forms", "homepage": "https://github.com/Automattic/jetpack/tree/HEAD/projects/packages/forms/#readme", @@ -53,7 +53,7 @@ "@wordpress/compose": "7.36.0", "@wordpress/core-data": "7.36.0", "@wordpress/data": "10.36.0", - "@wordpress/dataviews": "10.2.0", + "@wordpress/dataviews": "11.0.0", "@wordpress/dom-ready": "4.36.0", "@wordpress/editor": "14.36.0", "@wordpress/element": "6.36.0", diff --git a/projects/packages/forms/src/blocks/contact-form/class-contact-form-block.php b/projects/packages/forms/src/blocks/contact-form/class-contact-form-block.php index 006b80cbe31a..81b90d613a8f 100644 --- a/projects/packages/forms/src/blocks/contact-form/class-contact-form-block.php +++ b/projects/packages/forms/src/blocks/contact-form/class-contact-form-block.php @@ -794,7 +794,7 @@ public static function load_editor_scripts() { ), ); - wp_add_inline_script( $handle, 'window.jpFormsBlocks = ' . wp_json_encode( $data ) . ';', 'before' ); + wp_add_inline_script( $handle, 'window.jpFormsBlocks = ' . wp_json_encode( $data, JSON_UNESCAPED_SLASHES | JSON_HEX_TAG | JSON_HEX_AMP ) . ';', 'before' ); } /** diff --git a/projects/packages/forms/src/blocks/contact-form/components/jetpack-integration-controls.js b/projects/packages/forms/src/blocks/contact-form/components/jetpack-integration-controls.js index 6656b1ce7f7b..7acdb996b202 100644 --- a/projects/packages/forms/src/blocks/contact-form/components/jetpack-integration-controls.js +++ b/projects/packages/forms/src/blocks/contact-form/components/jetpack-integration-controls.js @@ -5,6 +5,7 @@ import { useSelect, useDispatch } from '@wordpress/data'; import { useState } from '@wordpress/element'; import { __ } from '@wordpress/i18n'; import { plugins } from '@wordpress/icons'; +import useConfigValue from '../../../hooks/use-config-value.ts'; import { INTEGRATIONS_STORE } from '../../../store/integrations/index.ts'; import ActiveIntegrations from './jetpack-integrations-modal/active-integrations/index.js'; import IntegrationsModal from './jetpack-integrations-modal/index.tsx'; @@ -26,6 +27,7 @@ export default function IntegrationControls( { attributes, setAttributes } ) { const isLoading = useSelect( select => select( INTEGRATIONS_STORE ).isIntegrationsLoading(), [] ); const { refreshIntegrations } = useDispatch( INTEGRATIONS_STORE ); const { tracks } = useAnalytics(); + const showIntegrationIcons = useConfigValue( 'showIntegrationIcons' ); const handleOpenModal = entry_point => { tracks.recordEvent( 'jetpack_forms_block_modal_view', { entry_point } ); @@ -39,11 +41,13 @@ export default function IntegrationControls( { attributes, setAttributes } ) { className="jetpack-contact-form__panel jetpack-contact-form__integrations-panel" initialOpen={ false } > - + { showIntegrationIcons !== false && ( + + ) }