Skip to content
Merged

3.3.8 #1273

Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
98 commits
Select commit Hold shift + click to select a range
04c3fbe
Bump webpack-cli from 6.0.1 to 7.2.2
dependabot[bot] Aug 25, 2026
efbe612
Bump eslint from 10.8.0 to 10.9.0
dependabot[bot] Aug 25, 2026
29d13a9
Bump globals from 16.5.0 to 17.11.0
dependabot[bot] Aug 25, 2026
d573094
Merge branch 'master' into develop
gabriel-detassigny Aug 25, 2026
d09494f
test: add WordPress unit testing with PHPUnit via wp-env
PatelUtkarsh Aug 25, 2026
7c03f36
Merge pull request #1251 from cloudinary/feature/wp-unit-testing
gabrielcld2 Aug 26, 2026
352138a
Bump dealerdirect/phpcodesniffer-composer-installer from 0.7.2 to 1.2.1
dependabot[bot] Aug 26, 2026
d23b52e
fix: only overwrite an existing Cloudinary asset when it's this attac…
gabriel-detassigny Aug 26, 2026
9187312
fix: address review feedback on the existing-asset overwrite check
gabriel-detassigny Aug 27, 2026
e6e7bfe
Upgrade WP core and PHP versions in wp-env config
gabriel-detassigny Aug 27, 2026
c62852f
Increase PHP version in GH workflow to 8.5
gabriel-detassigny Aug 27, 2026
71e91c7
Read node version from .nvmrc file in CI
gabriel-detassigny Aug 27, 2026
095647f
Update node version mention in README
gabriel-detassigny Aug 27, 2026
7ee0718
Merge pull request #1249 from cloudinary/dependabot/npm_and_yarn/deve…
gabrielcld2 Aug 27, 2026
bc0965f
Merge pull request #1248 from cloudinary/dependabot/npm_and_yarn/deve…
gabrielcld2 Aug 27, 2026
89511c4
Merge pull request #1247 from cloudinary/dependabot/npm_and_yarn/deve…
gabrielcld2 Aug 27, 2026
c1e882c
Merge pull request #1245 from cloudinary/dependabot/composer/develop/…
gabrielcld2 Aug 27, 2026
0329d0f
Bump php-stubs/woocommerce-stubs from 9.9.5 to 11.0.0
dependabot[bot] Aug 27, 2026
3582a5a
Merge pull request #1253 from cloudinary/feature/upgrade-local-env
gabrielcld2 Aug 27, 2026
7421102
Merge pull request #1243 from cloudinary/dependabot/composer/develop/…
gabrielcld2 Aug 27, 2026
c6884e8
Upgrade package-lock.json
gabriel-detassigny Aug 27, 2026
9e9f112
chore(deps-dev): bump eslint-plugin-jest from 29.15.2 to 29.16.1
dependabot[bot] Aug 28, 2026
f42abb9
chore(deps-dev): bump lint-staged from 16.4.0 to 17.3.0
dependabot[bot] Aug 28, 2026
200022e
chore(deps-dev): bump npm-run-all2 from 9.0.2 to 9.0.3
dependabot[bot] Aug 28, 2026
916fb49
chore(deps-dev): bump yoast/phpunit-polyfills from 1.1.5 to 4.0.0
dependabot[bot] Aug 28, 2026
e6f80aa
chore(deps-dev): bump the wordpress group across 1 directory with 13 …
dependabot[bot] Aug 28, 2026
b4c0e25
Merge branch 'master' into develop
gabriel-detassigny Aug 28, 2026
55cb077
Merge branch 'master' into uat
gabriel-detassigny Aug 28, 2026
7a3c443
fix: close remaining gaps in the existing-asset overwrite check
gabriel-detassigny Sep 1, 2026
1905034
Merge pull request #1252 from cloudinary/fix/1241-public-id-collision…
gabrielcld2 Sep 2, 2026
ed85046
Merge pull request #1246 from cloudinary/dependabot/npm_and_yarn/deve…
gabrielcld2 Sep 2, 2026
ce28e41
Merge pull request #1257 from cloudinary/dependabot/npm_and_yarn/deve…
gabrielcld2 Sep 2, 2026
704001b
Merge pull request #1258 from cloudinary/dependabot/npm_and_yarn/deve…
gabrielcld2 Sep 2, 2026
c360c0f
Merge pull request #1260 from cloudinary/dependabot/npm_and_yarn/deve…
gabrielcld2 Sep 2, 2026
ba0f886
Merge pull request #1261 from cloudinary/dependabot/composer/develop/…
gabrielcld2 Sep 2, 2026
a7ba21c
Upgrade node packages
gabriel-detassigny Sep 2, 2026
777a490
Update composer packages
gabriel-detassigny Sep 2, 2026
8624d1a
Update packages & fix linting issues
gabriel-detassigny Sep 2, 2026
910872b
TEMP DEBUG: instrument failing e2e analytics tests
gabriel-detassigny Sep 3, 2026
ec27cc6
Fix deactivation_modal_viewed analytics event never firing
gabriel-detassigny Sep 3, 2026
9085b1f
Fix bulk_sync_started asset_count race with autosync
gabriel-detassigny Sep 3, 2026
04014b0
TEMP DEBUG: inspect attachment/meta state before manual sync REST call
gabriel-detassigny Sep 3, 2026
fe7dcba
Fix bulk_sync_started asset_count race with its own background threads
gabriel-detassigny Sep 3, 2026
7189ead
Merge pull request #1263 from cloudinary/feature/upgrade-dependencies
gabrielcld2 Sep 3, 2026
5d0740a
chore(deps-dev): bump the wordpress group with 5 updates
dependabot[bot] Sep 4, 2026
6eb5f2e
chore(deps-dev): bump css-loader from 7.1.4 to 7.1.5
dependabot[bot] Sep 4, 2026
2700647
chore(deps-dev): bump eslint-plugin-jest from 29.16.1 to 29.16.6
dependabot[bot] Sep 4, 2026
e2ad68c
chore(deps-dev): bump webpack-cli from 7.2.2 to 7.2.3
dependabot[bot] Sep 4, 2026
a9cf43f
perf(e2e): Run specs in parallel workers and overlap CI setup
PatelUtkarsh Sep 4, 2026
9dca8d3
ci(e2e): Drop --ignore-scripts from npm ci
PatelUtkarsh Sep 4, 2026
cb9483b
ci(unit): Install only wp-env and drop wp-env sources cache
PatelUtkarsh Sep 4, 2026
6401f2c
test(e2e): Carry worker marker in a cookie, not a header
PatelUtkarsh Sep 4, 2026
258b76e
ci(e2e): Add Setup PHP and Composer cache before npm ci
PatelUtkarsh Sep 4, 2026
a6f3b13
Merge pull request #1269 from cloudinary/perf/e2e-parallel-workers
gabrielcld2 Sep 7, 2026
5f135ca
Merge pull request #1265 from cloudinary/dependabot/npm_and_yarn/deve…
gabrielcld2 Sep 8, 2026
97542e7
Merge pull request #1266 from cloudinary/dependabot/npm_and_yarn/deve…
gabrielcld2 Sep 8, 2026
6e9f261
Merge pull request #1267 from cloudinary/dependabot/npm_and_yarn/deve…
gabrielcld2 Sep 8, 2026
e906a5b
Merge pull request #1268 from cloudinary/dependabot/npm_and_yarn/deve…
gabrielcld2 Sep 8, 2026
71fb0bc
chore(deps-dev): bump eslint from 10.9.0 to 10.10.0
dependabot[bot] Sep 8, 2026
52df886
Merge pull request #1259 from cloudinary/dependabot/npm_and_yarn/deve…
gabrielcld2 Sep 8, 2026
2417a22
Update i18n
gabriel-detassigny Sep 10, 2026
e458e62
Build assets
gabriel-detassigny Sep 10, 2026
80ee084
Merge pull request #1272 from cloudinary/develop
gabrielcld2 Sep 10, 2026
993d429
chore(deps-dev): bump globals from 17.11.0 to 17.12.0
dependabot[bot] Sep 11, 2026
4d71190
chore(deps): bump @codemirror/state from 6.7.1 to 6.7.4
dependabot[bot] Sep 11, 2026
b5c08a1
chore(deps-dev): bump lint-staged from 17.3.0 to 17.5.0
dependabot[bot] Sep 11, 2026
233d0e0
Fix media uploaded in a non-default WPML language never finishing sync
gabriel-detassigny Sep 15, 2026
382dc40
chore(deps-dev): bump @playwright/test from 1.61.0 to 1.63.0
dependabot[bot] Sep 15, 2026
dd29364
Re-apply the language via wpml_permalink after cleaning the REST URL
gabriel-detassigny Sep 15, 2026
f238710
chore(deps-dev): bump php-stubs/woocommerce-stubs from 11.0.0 to 11.1.0
dependabot[bot] Sep 15, 2026
f3faa09
chore(deps-dev): bump phpstan/phpstan from 2.2.12 to 2.2.13
dependabot[bot] Sep 15, 2026
b472240
Trim rest_url() docblock
gabriel-detassigny Sep 15, 2026
3890055
feat(env): Serve local wp-env over HTTPS
PatelUtkarsh Sep 15, 2026
3fc6cc8
Merge pull request #1281 from cloudinary/bugfix/wpml-rest-loopback-url
gabrielcld2 Sep 17, 2026
da7e7a9
Merge pull request #1274 from cloudinary/dependabot/npm_and_yarn/deve…
gabrielcld2 Sep 17, 2026
92551cc
Merge pull request #1275 from cloudinary/dependabot/npm_and_yarn/deve…
gabrielcld2 Sep 17, 2026
af6a98e
Merge pull request #1276 from cloudinary/dependabot/npm_and_yarn/deve…
gabrielcld2 Sep 17, 2026
c818d5f
Merge pull request #1278 from cloudinary/dependabot/npm_and_yarn/deve…
gabrielcld2 Sep 17, 2026
a3102f4
Merge pull request #1279 from cloudinary/dependabot/composer/develop/…
gabrielcld2 Sep 17, 2026
6655e65
Merge pull request #1280 from cloudinary/dependabot/composer/develop/…
gabrielcld2 Sep 17, 2026
3c91c85
Update assets
gabriel-detassigny Sep 17, 2026
f12a8a2
chore(deps-dev): bump phpstan/phpstan from 2.2.13 to 2.2.14
dependabot[bot] Sep 18, 2026
83d4a51
chore(deps-dev): bump the wordpress group with 13 updates
dependabot[bot] Sep 18, 2026
500bd08
chore(deps-dev): bump lint-staged from 17.5.0 to 17.5.1
dependabot[bot] Sep 18, 2026
447a8a7
chore(deps-dev): bump cssnano from 7.1.9 to 9.0.4
dependabot[bot] Sep 18, 2026
c111fec
fix(env): Scope proxy scripts to this project and its ports
PatelUtkarsh Sep 21, 2026
dc3c977
fix(ci): Install unit job dependencies from the lockfile
PatelUtkarsh Sep 21, 2026
8b922b0
Merge pull request #1282 from cloudinary/dependabot/composer/develop/…
gabrielcld2 Sep 22, 2026
cb972e7
Merge pull request #1283 from cloudinary/dependabot/npm_and_yarn/deve…
gabrielcld2 Sep 22, 2026
03e5454
Merge pull request #1284 from cloudinary/dependabot/npm_and_yarn/deve…
gabrielcld2 Sep 22, 2026
5b0e140
Merge pull request #1286 from cloudinary/dependabot/npm_and_yarn/deve…
gabrielcld2 Sep 22, 2026
6c150bf
chore(deps-dev): bump webpack from 5.109.0 to 5.111.1
dependabot[bot] Sep 22, 2026
3d3bcda
Merge pull request #1285 from cloudinary/dependabot/npm_and_yarn/deve…
gabrielcld2 Sep 22, 2026
1484b73
fix(env): Respect custom wp-env ports in loopback and URL rewrite
PatelUtkarsh Sep 22, 2026
45987e5
Merge pull request #1287 from cloudinary/feature/local-https-proxy
gabrielcld2 Sep 22, 2026
88f7690
Update build assets
gabriel-detassigny Sep 22, 2026
e4076b0
Merge pull request #1289 from cloudinary/develop
gabrielcld2 Sep 22, 2026
56c17b8
version bump
bruckercloud Sep 23, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/build-docs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ jobs:
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '22'
node-version-file: '.nvmrc'
cache: 'npm'

- name: Install dependencies
Expand Down
146 changes: 133 additions & 13 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ jobs:
runs-on: ubuntu-latest
strategy:
matrix:
php-version: [ '7.4', '8.3' ]
php-version: [ '7.4', '8.5' ]

steps:
- name: Checkout repository
Expand All @@ -25,7 +25,7 @@ jobs:
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '22'
node-version-file: '.nvmrc'
cache: 'npm'

- name: Cache Composer
Expand Down Expand Up @@ -55,7 +55,7 @@ jobs:
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: '8.3'
php-version: '8.5'

- name: Cache Composer
uses: actions/cache@v4
Expand All @@ -80,39 +80,159 @@ jobs:
- name: Run PHPStan
run: composer phpstan

e2e:
name: E2E (Playwright)
unit:
name: Unit (PHPUnit)
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4

- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: '8.2'

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '22'
node-version-file: '.nvmrc'
cache: 'npm'

- name: Cache Composer
uses: actions/cache@v4
with:
path: ~/.composer/cache
key: ${{ runner.os }}-composer-unit-${{ hashFiles('**/composer.lock') }}
restore-keys: |
${{ runner.os }}-composer-unit-

# This job only needs vendor/bin/phpunit and the wp-env CLI, so it used to
# install @wordpress/env on its own into a scratch prefix rather than run
# a full `npm ci`. That install resolved dependency ranges fresh against
# npm instead of obeying package-lock.json, which made the job depend on
# whatever upstream had published that day: a broken @wp-playground/cli
# release, pulled in transitively by @wordpress/env, failed every run
# while the lockfile-based jobs were unaffected.
#
# `npm ci` installs the locked tree, so the job can no longer break
# because of a third-party release. The postinstall hook runs
# `patch-package && composer install`, which is what provides
# vendor/bin/phpunit, so this single step covers both toolchains.
#
# Deliberately not `--ignore-scripts`, for the same reason as the e2e
# job below: besides skipping the Composer install, that flag made this
# step take 1m30s instead of ~36s from a cold cache.
- name: Install dependencies
run: npm ci

- name: Install Playwright browsers
run: npx playwright install --with-deps chromium
# The wp-env sources directory is deliberately not cached. A restored
# ~/.wp-env carries the previous run's install state, which skipped the
# plugin's activation hook and left the relationships table missing.
# .wp-env.ci.json omits the HTTPS URLs and the proxy lifecycle script
# that .wp-env.json uses for local development. Runners have no local CA
# and no proxy container, so they serve the site over plain HTTP.
- name: Start wp-env
run: npx wp-env start --config .wp-env.ci.json

- name: Build assets
run: npm run build
- name: Run unit tests
run: npx wp-env run tests-cli --config .wp-env.ci.json --env-cwd="wp-content/plugins/$(basename "$PWD")" vendor/bin/phpunit

- name: Start wp-env
run: npm run env:start
- name: Stop wp-env
if: always()
run: npx wp-env stop --config .wp-env.ci.json

e2e:
name: E2E (Playwright)
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4

# Not needed by Playwright, but every job that has this step completes
# `npm ci` in ~35s while this job, without it, took 2.5 to 4 minutes on
# the same runs (same npm, same cache hit). setup-php also installs
# Composer, which the postinstall hook calls.
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: '8.2'

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version-file: '.nvmrc'
cache: 'npm'

- name: Cache Composer
uses: actions/cache@v4
with:
path: ~/.composer/cache
key: ${{ runner.os }}-composer-e2e-${{ hashFiles('**/composer.lock') }}
restore-keys: |
${{ runner.os }}-composer-e2e-

# Deliberately not `--ignore-scripts`: with the npm 10 that ships with
# the pinned Node, that flag made this step take 4 to 7 minutes instead
# of ~36s (a known npm 10 reify stall around lifecycle-script nodes).
- name: Install dependencies
run: npm ci

- name: Get Playwright version
id: playwright-version
run: echo "version=$(node -p "require('@playwright/test/package.json').version")" >> "$GITHUB_OUTPUT"

- name: Cache Playwright browsers
id: playwright-cache
uses: actions/cache@v4
with:
path: ~/.cache/ms-playwright
key: ${{ runner.os }}-playwright-${{ steps.playwright-version.outputs.version }}

# wp-env spends most of its time pulling Docker images and installing
# WordPress, none of which depends on the Node-side steps. Run it in the
# background while the browser install and asset build proceed, then
# wait for it. All of this has to live in one step because `wait` only
# sees children of the same shell. wp-env output goes to a file and is
# printed afterwards so the interleaved log stays readable.
- name: Start wp-env, install browsers, build assets
env:
PLAYWRIGHT_CACHE_HIT: ${{ steps.playwright-cache.outputs.cache-hit }}
run: |
npx wp-env start --config .wp-env.ci.json > wp-env-start.log 2>&1 &
wp_env_pid=$!

if [ "$PLAYWRIGHT_CACHE_HIT" = "true" ]; then
# Browser binaries came from cache; only the apt packages they
# need are missing on a fresh runner.
npx playwright install-deps chromium
else
npx playwright install --with-deps chromium
fi

npm run build

echo "::group::wp-env start"
if wait "$wp_env_pid"; then
cat wp-env-start.log
echo "::endgroup::"
else
cat wp-env-start.log
echo "::endgroup::"
exit 1
fi

# Runners have no local CA and no HTTPS proxy, so the suite talks to
# wp-env's published port directly over plain HTTP. WP_BASE_URL is the
# single switch for this; see tests/e2e/playwright.config.js.
- name: Run E2E tests
env:
CLOUDINARY_E2E_URL: ${{ secrets.CLOUDINARY_E2E_URL }}
WP_BASE_URL: http://localhost:8889
run: npm run test:e2e

- name: Stop wp-env
if: always()
run: npm run env:stop
run: npx wp-env stop --config .wp-env.ci.json

- name: Upload Playwright artifacts
if: failure()
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/deploy-to-wp-org.yml
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ jobs:
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: '8.3'
php-version: '8.5'
tools: composer:v2

- name: Get Composer cache directory
Expand Down
7 changes: 7 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,9 @@ coverage/html/
# wp-env personal overrides
.wp-env.override.json

# Locally generated TLS certificates and CA for the wp-env HTTPS proxy
/.wp-env/certs/

# IDE
.vscode

Expand All @@ -62,5 +65,9 @@ package/dist
# PHPStan result cache
/.phpstan-cache/

# PHPUnit
/.phpunit.result.cache
/phpunit.xml

# Generated docs (published to gh-pages by workflow)
/docs/
2 changes: 1 addition & 1 deletion .version
Original file line number Diff line number Diff line change
@@ -1 +1 @@
3.3.7
3.3.8
26 changes: 26 additions & 0 deletions .wp-env.ci.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
{
"core": "WordPress/WordPress#7.1",
"phpVersion": "8.5",
"plugins": ["."],
"config": {
"WP_DEBUG": true,
"WP_DEBUG_LOG": true,
"SCRIPT_DEBUG": true
},
"mappings": {
"wp-content/mu-plugins": "./.wp-env/mu-plugins"
},
"lifecycleScripts": {
"afterStart": "./.wp-env/scripts/fix-loopback.sh"
},
"env": {
"tests": {
"phpVersion": "8.2",
"config": {
"WP_DEBUG": true,
"WP_DEBUG_LOG": true,
"SCRIPT_DEBUG": true
}
}
}
}
20 changes: 15 additions & 5 deletions .wp-env.json
Original file line number Diff line number Diff line change
@@ -1,25 +1,35 @@
{
"core": "WordPress/WordPress#7.0",
"phpVersion": "8.2",
"core": "WordPress/WordPress#7.1",
"phpVersion": "8.5",
"plugins": ["."],
"config": {
"WP_DEBUG": true,
"WP_DEBUG_LOG": true,
"SCRIPT_DEBUG": true
"SCRIPT_DEBUG": true,
"WP_HOME": "https://cloudinary.local.wpenv.net",
"WP_SITEURL": "https://cloudinary.local.wpenv.net",
"FORCE_SSL_ADMIN": true,
"WP_CONTENT_URL": "https://cloudinary.local.wpenv.net/wp-content",
"WP_PLUGIN_URL": "https://cloudinary.local.wpenv.net/wp-content/plugins"
},
"mappings": {
"wp-content/mu-plugins": "./.wp-env/mu-plugins"
},
"lifecycleScripts": {
"afterStart": "./.wp-env/scripts/fix-loopback.sh"
"afterStart": "./.wp-env/scripts/after-start.sh"
},
"env": {
"tests": {
"phpVersion": "8.2",
"config": {
"WP_DEBUG": true,
"WP_DEBUG_LOG": true,
"SCRIPT_DEBUG": true
"SCRIPT_DEBUG": true,
"WP_HOME": "https://tests.cloudinary.local.wpenv.net",
"WP_SITEURL": "https://tests.cloudinary.local.wpenv.net",
"FORCE_SSL_ADMIN": true,
"WP_CONTENT_URL": "https://tests.cloudinary.local.wpenv.net/wp-content",
"WP_PLUGIN_URL": "https://tests.cloudinary.local.wpenv.net/wp-content/plugins"
}
}
}
Expand Down
16 changes: 16 additions & 0 deletions .wp-env/docker/mkcert/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
FROM golang:1.24-alpine

# Set the version tag to build.
ENV MKCERT_VERSION="v1.4.4"

RUN apk add --no-cache git

RUN git clone https://github.com/FiloSottile/mkcert /go/mkcert \
&& cd /go/mkcert \
&& git checkout "tags/$MKCERT_VERSION" -b "build/$MKCERT_VERSION" \
&& go build -ldflags "-X main.Version=$MKCERT_VERSION" -o /bin/mkcert

# mkcert reads and writes its CA here. The compose file mounts the project's
# certificate directory over it, so both the CA and the issued certificates
# stay inside the repository instead of the developer's global mkcert store.
WORKDIR /root/.local/share/mkcert
Loading
Loading