Skip to content

Releases: drevops/eddy

5.0.0-alpha4

Choose a tag to compare

@github-actions github-actions released this 13 Oct 11:09
26576ef

What's new since 5.0.0-alpha3

  • [#600] Stopped 'eddy-start' and 'eddy-stop' from killing another project's webserver, and capped the 'eddy-start' wait at its timeout. @AlexSkrypnyk (#603)
  • [#601] Removed the WebDriver export, port line, CSpell words and blank lines that deselected tools left behind. @AlexSkrypnyk (#602)
  • [#594] Kept the Mink packages Functional tests need when FunctionalJavascript is deselected and removed its leftovers. @AlexSkrypnyk (#599)
  • [#596] Scoped 'reset' and 'kill_port()' to the project's webserver and polled the port in 'eddy-start' instead of sleeping. @AlexSkrypnyk (#598)
  • [#593] Kept local builds on a stable Drupal major, added a PHP check to 'eddy-assemble' and fixed the other upgrade gaps. @AlexSkrypnyk (#597)

Full Changelog: 5.0.0-alpha3...5.0.0-alpha4

@AlexSkrypnyk

5.0.0-alpha3

Choose a tag to compare

@github-actions github-actions released this 13 Oct 02:32
3dfa503

What's new since 5.0.0-alpha2

  • [#590] [#591] Covered adding a Drupal major in 'update-consumer-eddy' and corrected the 'MIGRATION.md' notes on Drupal 12 and deployment. @AlexSkrypnyk (#592)

Full Changelog: 5.0.0-alpha2...5.0.0-alpha3

@AlexSkrypnyk

5.0.0-alpha2

Choose a tag to compare

@github-actions github-actions released this 12 Oct 22:50
4d775ef

What's new since 5.0.0-alpha1

  • [#581] Rendered the Drupal version and command wrapper text in generated projects from the installer answers. @AlexSkrypnyk (#589)
  • [#580] Scoped 'install.php' to the template when it runs inside an existing project. @AlexSkrypnyk (#588)
  • [#584] Kept project files, local state and newer pins in the 'update-consumer-eddy' skill by merging each release 3 ways. @AlexSkrypnyk (#587)
  • [#583] Removed the CircleCI branch from the JS test base, serialised branch deploys in 'deploy.yml' and corrected 'MIGRATION.md'. @AlexSkrypnyk (#586)
  • [#582] Timed out the version probes in 'eddy-browser-start' and finished the 'eddy-provision' status lines. @AlexSkrypnyk (#585)

Full Changelog: 5.0.0-alpha1...5.0.0-alpha2

@AlexSkrypnyk

5.0.0-alpha1

Choose a tag to compare

@github-actions github-actions released this 12 Oct 07:31
7572b0c

What's new since 4.19.0

Highlights

5.0 is the first release under the Eddy name, and most of it is about where things live: the template has a new home, the build tooling became a Composer package, and GitHub Actions is the only CI left. Drupal 12 joins the CI matrix, and deployments no longer rewind branches. A project created from 4.x needs a one-off upgrade, which MIGRATION.md walks through.

The Drupal Extension Scaffold is now Eddy

The template moved from AlexSkrypnyk/drupal_extension_scaffold to drevops/eddy, next to Vortex, and the README now spells out how the 2 differ: Eddy maintains a contributed Drupal module or theme on GitHub, Vortex builds websites, and a repository uses one or the other.

4.x 5.x
Repository AlexSkrypnyk/drupal_extension_scaffold drevops/eddy
Default branch 1.x main
Template maintenance files .scaffold/ .eddy/
Update skill update-consumer-drupal-extension-scaffold update-consumer-eddy
Installer php init.php, answers from DEX_* php install.php, answers from INSTALL_*

The branch rename only applies to the Eddy repository itself. New projects still build and deploy from 1.x, and when the installer runs during an update, it keeps whatever branches the project's committed test.yml lists.

The build tooling is a Composer package

In 4.x, every project carried its own copy of the build, run and deploy scripts in .devtools/, so a fix reached a project only when its maintainer merged the next release by hand. In 5.x, those scripts ship as the drevops/eddy-tooling package, and every project installs the same one:

4.x: each project carries its own copy       5.x: each project installs the same package

ahoy assemble, make assemble or CI           ahoy assemble, make assemble or CI
               │                                            │
               ▼                                            ▼
.devtools/assemble                           scripts/eddy-tooling
  your copy, fixed only when you merge         installs drevops/eddy-tooling ~1.0.0
  the next release by hand                     into vendor/, and skips Composer
                                               while nothing has changed
                                                            │
                                                            ▼
                                             vendor/bin/eddy-assemble
                                               fixes arrive as patch releases,
                                               your changes as patches or hooks

Each .devtools/<script> is now vendor/bin/eddy-<script>, and .devtools/browser start and stop are eddy-browser-start and eddy-browser-stop, while the ahoy and make commands keep their names. CI picks up tooling fixes on its own, and a local checkout picks them up after ahoy reset or make reset, which now also remove vendor/. A project-specific step goes into a custom lifecycle script, and a change to what a command does becomes a patch for the package in composer.dev.json.

The Cloudflare quick tunnel moved into the package as well: eddy-start, eddy-provision and eddy-stop run it whenever CLOUDFLARE_TUNNEL=1 is set, so projects no longer carry the scripts/*-cloudflared.sh hooks. The default Drupal major for local builds lives in extra.eddy.drupal-version in composer.dev.json, now that there's no script copy to rewrite.

Drupal 12 in CI

Drupal 12 support is opt-in: select 12 when install.php asks for the Drupal versions, or ask Claude to include it when it runs the update skill, and an upgrade keeps the majors your CI tests today. Opting in adds a README badge and 5 CI jobs, all on PHP 8.5, which Drupal 12 requires:

Job DRUPAL_VERSION Builds
lint-d12, test-php-min-d12-stable, test-php-max-d12-stable 12 Newest stable 12.x, or the newest pre-release until 12.0.0 ships
test-php-min-d12-legacy 12.0.0 Newest 12.0.x, the floor a ^12 requirement promises
test-php-max-d12-canary 12@beta Newest beta, release candidate or stable, so the next minor shows up early

The jobs follow Drupal releases with no edits: until 12.0.0 ships they all build the newest Drupal 12 pre-release, and after that canary moves on to the 12.1 pre-releases while legacy stays on 12.0.x. Drupal 12 builds use Drush's 14.x development branch until Drush 14.0.0 is tagged, and they install drupal/core from source, since its packages leave out the tests directories your tests need.

Drupal 12 also needs 3 changes in your own code, which no template merge makes:

  • Add ^12 to core_version_requirement in your *.info.yml.

  • Declare string|false as the return type of getMinkDriverArgs() if your FunctionalJavascript tests extend the base class the template generated.

  • Keep both forms of test metadata: doc-comment annotations for PHPUnit 9.6 on Drupal 10, and PHP attributes for PHPUnit 12 on Drupal 12.

Builds pin Drupal core and apply your patches

Every build now pins Drupal core to 1 exact release and lets each other dependency take its most stable release that fits, so composer.dev.json and your composer.json only say which versions are acceptable:

DRUPAL_VERSION=11
        │
        ▼
drupal/core*          pinned to 1 exact release, the newest stable 11.x,
                      and printed in the build log
        │
        ▼
other dependencies    minimum-stability: dev, prefer-stable: true
                      each takes its most stable release that fits, and falls back
                      to a pre-release or development branch only when nothing
                      stable supports that core; the build log lists every branch
        │
        ▼
extra.patches         applied by cweagans/composer-patches 2.x
                      a patch that no longer applies fails the build

DRUPAL_VERSION takes values such as 11, 11.1.0, 11@beta or 12, but no longer @dev, since a development branch isn't a release.

The build also installs cweagans/composer-patches 2.x. From 4.14.0 to 4.19.0 it didn't, so unless your project required the plugin itself, Composer skipped every patch you declared without a word. Those patches apply now, and a patch that went stale while it was skipped fails the build until you fix or drop it.

Deployments that never rewind a branch

In 4.19.0, pushing a release tag force-pushed the tagged commit over a branch of your Drupal.org repository, so a tag behind that branch's tip rewound it. A late or re-run test run could do the same, the first deployment of a new branch failed, and the Deploy workflow failed on every run until deployment was set up. 5.x fixes all 4:

Event 4.19.0 5.x
Release tag pushed Force-pushes the tagged commit over a branch Pushes the tag only and leaves branches alone
Older commit deployed late or re-run Force-pushes it over the newer branch tip Skipped with a notice
First deployment of a branch Fails Creates the branch
No DEPLOY_REMOTE secret Every Deploy run fails Skipped with a notice

DEPLOY_BRANCH now applies to branch pushes only. If your release process relied on a tag push to update a branch, push the branch as well.

GitHub Actions is the only CI

CircleCI support is gone, along with the installer's CI provider question, so every project gets the same GitHub Actions workflows: test.yml, deploy.yml, draft-release-notes.yml and assign-author.yml. A project already on GitHub Actions has nothing to do. A project on CircleCI moves its settings to GitHub Actions, under Settings -> Secrets and variables -> Actions:

  • The private deployment key becomes the DEPLOY_SSH_KEY secret, and its fingerprint isn't needed anymore.

  • DEPLOY_REMOTE, DEPLOY_USER_NAME, DEPLOY_USER_EMAIL and DEPLOY_PROCEED become secrets, and DEPLOY_BRANCH becomes a repository variable.

  • CODECOV_TOKEN becomes a secret, and each CI_*_IGNORE_FAILURE toggle becomes a repository variable.

  • Each ci/circleci: <job> check in branch protection becomes the GitHub Actions job of the same name.

Then stop building the project in CircleCI, or every push gets a failing "CircleCI Pipeline" check. CircleCI is gone has the details, including which branches deploy from GitHub Actions.

Upgrading a 4.x project

A 4.x project can't update itself to 5.x: its AGENTS.md fetches the update skill from the old .scaffold/ path, which returns 404, and curl -sSL saves that error page as the skill. Fetch the new skill once by hand, from the project root:

rm -rf .claude/skills/update-consumer-drupal-extension-scaffold
mkdir -p .claude/skills/update-consumer-eddy
curl -fsSL -o .claude/skills/update-consumer-eddy/SKILL.md \
  https://raw.githubusercontent.com/drevops/eddy/main/.eddy/skills/update-consumer-eddy/SKILL.md

Commit your work in progress first, since the update replaces most of the project root. Then start Claude Code in the project and run /update-consumer-eddy. The skill opens a pull request with the 5.x files, drops .devtools/ and the Cloudflare hooks, and rewrites AGENTS.md, so every later update works as usual. It leaves 3 things to you: moving your .devtools/ ed...

Read more

4.19.0 - last 4.x release

Choose a tag to compare

@github-actions github-actions released this 03 Oct 02:00
d205000

What's new since 4.18.0

This is the last 4.x release. The next release will be 5.0.0.

Breaking changes

  • Renamed the 'init.php' prompt variables from 'PROMPTY_' to 'DEX_'. @AlexSkrypnyk (#521)
    php init.php now reads pre-filled answers from DEX_* variables instead of the prompt library's default PROMPTY_* prefix, so PROMPTY_* variables are ignored. Rename every PROMPTY_ prefix to DEX_ in any script or CI job that runs init.php, and set the new DEX_EXAMPLES too, since a run with no terminal now cancels when any prompt is left unanswered. php init.php --help lists the full set, and runs that answer the prompts by hand aren't affected.

  • [#510] Renamed the 'QRCODE' login opt-in to 'LOGIN_QRCODE' and made the 'qrcode' command render on invocation. @AlexSkrypnyk (#513)
    make login and ahoy login no longer read QRCODE, so a QRCODE=1 set in .env or your shell stops adding a QR code under the login link after updating. Rename it to LOGIN_QRCODE, and keep in mind the wrappers only check that it's non-empty, so unset it to turn the code off rather than setting it to 0. The ./.devtools/qrcode <url> command itself now renders without any opt-in, and a missing qrencode fails with an install hint instead of being silently skipped.

Highlights

  • [#522] Updated the bundled prompt library to '0.7.0' so unsupported prompt values are rejected. @AlexSkrypnyk (#523)
    Non-interactive init.php runs used to act on any value they were given: an unsupported Drupal version such as 12 left the project with no CI jobs for any Drupal version, and a tools typo such as phpcsx removed all 11 tools, with the run still exiting as a success. Unsupported values are now rejected before anything is written, with an error listing the accepted options. A run with no terminal and an unanswered prompt also cancels in under a second instead of hanging until the job times out.

  • [#517] Added an example scripts prompt to 'init.php' and fixed the Drupal version default. @AlexSkrypnyk (#520)
    Accepting every default in php init.php used to abort with At least one Drupal version is required. because the Target Drupal versions prompt started with nothing checked. Drupal 11 is now pre-selected, so a run on defaults completes. A new Keep example lifecycle scripts prompt (DEX_EXAMPLES when scripted) defaults to No and deletes the 4 scripts/*-example.sh hooks every new project used to inherit, keeping scripts/ itself and the Cloudflare tunnel scripts.

  • [#508] Fixed Selenium pinning port 4444 and 'MINK_DRIVER_ARGS_WEBDRIVER' overriding the environment. @AlexSkrypnyk (#514)
    With WEBDRIVER_BACKEND=selenium, the container now claims the first free port from 4444 and saves it to .env, as the local Chrome backend already did. It's also named after that port (selenium-<port>), so 2 projects can run FunctionalJavascript tests side by side without one removing the other's container. phpunit.xml and phpunit.d10.xml no longer force MINK_DRIVER_ARGS_WEBDRIVER, so a test that doesn't extend the shipped FunctionalJavascript base class can set its own endpoint from the environment.

  • [#509] Deployed the commit that CI tested instead of the default branch. @AlexSkrypnyk (#512)
    The GitHub Actions deploy workflow checked out without a ref, so a successful test run on a non-default branch published the default branch's code under that branch's name. It now checks out the exact commit the test run used, so a release tag deploys the tagged commit, and only push events from your own repository reach the deploy job, which keeps pull request and fork runs away from the deployment key. CircleCI already deployed the right commit and is unchanged.

  • [#506] Stripped the scaffold example extension on update and stopped discarding project lifecycle scripts. @AlexSkrypnyk (#507)
    The update-consumer-drupal-extension-scaffold skill wiped the project root and never put scripts/ back, so every scaffold update deleted the project's own lifecycle hooks. It now restores scripts/ alongside src/, tests/ and config/, then removes the scaffold's example extension (service, form, tests, schema, assets and *-example.sh hooks), deleting only files git doesn't track, so project code that grew out of an example stays put. It also skips draft releases and uses the newest published tag verbatim.

Other changes

  • Update dependency prettier to ^3.9.9 @renovate[bot] (#536)

  • Update selenium/standalone-chromium:latest Docker digest to 08fd293 @renovate[bot] (#534)

  • Update dependency ubuntu to v26 @renovate[bot] (#535)

  • Update dependency prettier to ^3.9.8 @renovate[bot] (#533)

  • Update codecov/codecov-action digest to 303a32d @renovate[bot] (#532)

  • Update dependency prettier to ^3.9.7 @renovate[bot] (#531)

  • Update codecov/codecov-action digest to 0b35c9e @renovate[bot] (#530)

  • Update zizmorcore/zizmor-action action to v0.6.4 @renovate[bot] (#529)

  • Update selenium/standalone-chromium:latest Docker digest to fcf9eef @renovate[bot] (#528)

  • [#524] Declared the CI runner roles centrally so each tool step reads its own flag. @AlexSkrypnyk (#527)
    GitHub Actions and CircleCI now declare CI_RUNNER_INDEX, CI_RUNNER_TOTAL and a CI_IS_<TOOL>_RUNNER flag for Jest and PHPUnit once per job, and each tool's steps read their flag instead of a hand-written condition. Behaviour is unchanged by default, but moving a tool to another runner or sharding it is now 1 edit to its flag, and the README's new "Distributing tools across CI runners" section shows how on both providers.

  • Update zizmorcore/zizmor-action action to v0.6.3 @renovate[bot] (#526)

  • Fixed the update skill's 'init.php' invocation leaving 3 prompts unanswered. @AlexSkrypnyk (#521)
    The update skill's documented init.php command never set the Drupal version, tools or Cloudflare tunnel variables, and with no terminal to answer those prompts the run spun forever instead of failing. It now sets every prompt variable, in the same order the prompts appear.

  • [#511] Stopped 'login' re-inlining the 'drush' invocation in both wrappers. @AlexSkrypnyk (#515)
    ahoy login now calls ahoy drush uli, and the Makefile keeps the whole Drush invocation in a DRUSH variable (replacing DRUSH_URI), so changing how Drush or the site URL is resolved is 1 edit per wrapper. ahoy drush also forwards its arguments quoted, so an argument containing spaces reaches Drush intact, as in ahoy drush php:eval 'print "a b c"'.

Full Changelog: 4.18.0...4.19.0

4.18.0

Choose a tag to compare

@github-actions github-actions released this 15 Aug 02:37
c1f2ac8

What's new since 4.17.0

Breaking changes

  • [#499] Fixed Drupal 10 static analysis rejecting PHPUnit attribute classes. @AlexSkrypnyk (#501)
    Drupal 10 builds failed make lint with nine PHPStan attribute.notFound errors, because PHPUnit\Framework\Attributes\* first exists in PHPUnit 10 and Drupal 10 resolves PHPUnit 9.6 with no path to a newer one. The fix scopes a PHPStan ignore to those attribute classes and splits linting into a per-Drupal-major matrix, which renames the GitHub Actions check from lint to lint-d10 and lint-d11. If lint is a required status check in branch protection, replace it with both new job names, or the rule will wait forever on a check that no longer runs.

  • [#339] Unified 'chromedriver-*' and 'selenium-*' commands into 'browser-start' and 'browser-stop'. @AlexSkrypnyk (#462)
    The four backend-specific commands chromedriver-start, chromedriver-stop, selenium-start and selenium-stop are gone from both make and ahoy, replaced by browser-start and browser-stop, which pick the backend from WEBDRIVER_BACKEND and own the Selenium Docker handling that was previously inlined as shell in both runners. Replace any scripted call to the four old names with browser-start / browser-stop; the backend is now chosen by the environment variable rather than by the command you type.

  • [#339] Made local Chrome via 'chromedriver' the default WebDriver backend for FunctionalJavascript tests. @AlexSkrypnyk (#460)
    FunctionalJavascript tests previously required the Docker Selenium container every time; the default backend is now the locally installed Chrome, driven by a version-matched chromedriver, so a local run needs no Docker and the endpoint port is auto-discovered from 4444 and persisted to .env so several projects can test at once. To keep the container, set WEBDRIVER_BACKEND=selenium - the shipped GitHub Actions and CircleCI configurations already pin it, so only local runs and consumer-authored pipelines change.

  • [#395] Dropped PHP 8.2 support and raised the minimum to 8.3. @AlexSkrypnyk (#455)
    The composer.json floor moves from >=8.2 to >=8.3, with the PHPCS testVersion, the Rector PHP set, the CircleCI default image and the CI matrix all following, so the tested matrix is now PHP 8.3, 8.4 and 8.5. PHP 8.2 is security-support-only upstream and already sat below Drupal 11's own minimum, so move any 8.2 environment to 8.3 or newer before upgrading.

Highlights

  • [#509] Deployed the commit that CI tested instead of the default branch. @AlexSkrypnyk (#512)
    The deploy workflow triggers on workflow_run and checked out without pinning a ref, so it force-pushed the tip of the default branch to a destination branch named after the triggering run - the name and the content described different commits. The checkout is now pinned to the triggering run's head SHA, so a release tag deploys the tagged commit CI actually tested, and the job is gated on same-repository push events so no tree this repository did not produce can reach the deployment key.

  • [#506] Stripped the scaffold example extension on update and stopped discarding project lifecycle scripts. @AlexSkrypnyk (#507)
    The update procedure wiped the project root and restored only src/, tests/ and config/, so a project's own assemble-*.sh / provision-*.sh / start-*.sh / stop-*.sh hooks were destroyed on every scaffold update - scripts/ is now restored with the rest. A new step also deletes the bundled example extension that init.php had merely renamed, guarded so a file goes only when it is both untracked and on the enumerated example list, leaving anything git already tracks untouched.

  • [#432] Added an opt-in login-link QR code and a Cloudflare init opt-out. @AlexSkrypnyk (#459)
    make login and ahoy login can render the one-time login link as a terminal QR code, so it can be scanned straight from a phone instead of retyped; nothing is drawn unless you opt in and qrencode is installed. init.php also gains a Cloudflare tunnel opt-out prompt, so declining strips the scripts/*-cloudflared.sh hooks while the tunnel-agnostic TUNNEL_URL handling stays for ngrok, Tailscale or anything similar.

  • [#456] Suppressed verbose '.devtools' command output unless DEBUG is set. @AlexSkrypnyk (#458)
    A normal ahoy build printed around 540 lines, almost all of it Composer, npm and Drush noise. Tool output is now captured and echoed only when the command fails, dropping a build to roughly 60 clean [TASK]/[ OK ] lines, while your own front-end build and scripts/* lifecycle hooks stay visible because they are meaningful rather than noise. Set DEBUG=1 to stream everything live again.

  • [#384] Made PHPStan config compatible with Drupal.org CI. @AlexSkrypnyk (#453)
    Drupal.org's GitLab CI analyses from inside web/modules/custom/<module>/, a working directory where the scaffold's path-scoped ignoreErrors entry never matched, so every legitimate suppression was skipped and surfaced as a failure. Dropping that path scope lets generated extensions pass PHPStan on Drupal.org CI, and the README documents the one override a consumer needs when wiring up their own .gitlab-ci.yml: _PHPUNIT_EXTRA: '--no-coverage'.

  • [#431] Added start/stop lifecycle hooks and Cloudflare tunnel support. @AlexSkrypnyk (#454)
    Lifecycle hooks now cover all four phases: scripts/start-*.sh runs after the server starts and scripts/stop-*.sh before it stops, joining the existing assemble and provision hooks. A new resolve_site_url() helper prefers a TUNNEL_URL read from .env and falls back to http://host:port, so the local site can be exposed publicly through a tunnel - opt-in Cloudflare quick-tunnel hooks ship as a working reference, and the core stays generic enough for ngrok or Tailscale.

Other changes

  • [#511] Stopped 'login' re-inlining the 'drush' invocation in both wrappers. @AlexSkrypnyk (#515)
    The login command re-inlined the Drush binary path and the site-URL resolution that the drush command sitting directly above it already encapsulated, so the same invocation was written four times across the two wrappers - including a raw build/vendor/bin/drush call in the very files that teach consumers to use the wrappers instead. Each wrapper now spells it once, and ahoy drush forwards its arguments as "$@" rather than unquoted $*, so an argument containing spaces survives as one argument.

  • [#510] Made the 'qrcode' command render on invocation and report a missing 'qrencode'. @AlexSkrypnyk (#513)
    .devtools/qrcode was documented on the command surface but printed nothing on a normal machine, because the opt-in gate lived inside the rendering helper and so silenced the deliberate caller along with the automatic one. Invoking the command now always renders, the login wrappers keep their own gate under the renamed LOGIN_QRCODE variable, and a missing qrencode binary now fails with an install hint instead of returning silently.

  • [#508] Fixed Selenium pinning port 4444 and 'MINK_DRIVER_ARGS_WEBDRIVER' overriding the environment. @AlexSkrypnyk (#514)
    The Selenium backend pinned port 4444 and named its container the fixed string selenium, so a second project's docker rm -f destroyed the first project's still-running container. It now claims a free port from 4444 and names the container selenium-<port>, matching what the chromedriver backend already did. Dropping force="true" on MINK_DRIVER_ARGS_WEBDRIVER also means a test that does not extend the shipped base class can export its own driver args.

  • [#504] Migrated the deprecated 'version-resolver.default' field to a resolver category. @AlexSkrypnyk (#505)
    Release Drafter v7 folded version resolution into categories and warns on every run that the top-level version-resolver block is deprecated. The configuration now declares an unconditional version-resolver category carrying the minor increment, which contributes to the resolved version without rendering a heading, so the published notes stay byte-identical. Without it, the next draft would silently fall back to the built-in patch default once the field is removed upstream - easy to miss, since drafts are created without human involvement.

  • [#500] Fixed the deploy workflow clearing a valid branch name when a tag shares that name. @AlexSkrypnyk (#502)
    The guard that blanks the head branch on a tag push tested whether a tag of that name existed anywhere in the repository, so pushing to a branch that happened to collide with an existing tag name deployed to the default branch instead of the intended one. It now matches by commit identity with git tag --points-at, so the branch is cleared only when a tag of that name sits on the triggering commit; annotated tags are peeled, so both tag kinds are covered.

  • [#492] Unified the spelling of 'JavaScript' across commands, tests and fixtures. @AlexSkrypnyk (#498)
    Js meant two different things depending on context - Jest in test-js, and an abbreviation of FunctionalJavascript in class names such as YourExtensionSmokeJsTest. The language is now spelled out in full in every identifier, with test-javascript canonical and test-js kept as a working alias in both wrappers. Pinning Ahoy to 2.5.0 in CI along the way revived all nine declared aliases, which the previous 2.1.1 pin silently discarded because it predates alias support.

  • [#493, #494] Documented missing '.devtools' entries and corrected PHPUnit README paths. @AlexSkrypnyk (#497)
    .devtools/README.md documented only 6 of its 9 entries, omitting browser, info and qrcode - all three reachable from the public command surface - and `phpuni...

Read more

4.17.0

Choose a tag to compare

@github-actions github-actions released this 13 Jun 09:29
23747c0

What's new since 4.16.4

Full Changelog: 4.16.4...4.17.0

@AlexSkrypnyk

4.16.4

Choose a tag to compare

@github-actions github-actions released this 12 Jun 05:07
6c299fd

What's new since 4.16.3

  • Updated CI to use latest stable and pinned legacy Drupal core versions. @AlexSkrypnyk (#413)

Full Changelog: 4.16.3...4.16.4

@AlexSkrypnyk

4.16.3

Choose a tag to compare

@github-actions github-actions released this 10 Jun 04:36
b627f6a

What's new since 4.16.2

Full Changelog: 4.16.2...4.16.3

@AlexSkrypnyk, @renovate[bot] and renovate[bot]

4.16.2

Choose a tag to compare

@github-actions github-actions released this 09 Jun 08:50
6f6ea03

What's new since 4.16.1

Full Changelog: 4.16.1...4.16.2

@AlexSkrypnyk, @renovate[bot] and renovate[bot]