• Stars
    star
    172
  • Rank 221,201 (Top 5 %)
  • Language
    PHP
  • License
    BSD 3-Clause "New...
  • Created about 4 years ago
  • Updated 2 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Set of polyfills for changed PHPUnit functionality to allow for creating PHPUnit cross-version compatible tests

PHPUnit Polyfills

Version CS Build Status Lint Build Status Test Build Status Coverage Status

Minimum PHP Version License: BSD3

Set of polyfills for changed PHPUnit functionality to allow for creating PHPUnit cross-version compatible tests.

Requirements

  • PHP 5.6 or higher.
  • PHPUnit 5.7 - 9.x (automatically required via Composer).

Installation

To install this package, run:

composer require --dev yoast/phpunit-polyfills:"^1.0"

To update this package, run:

composer update --dev yoast/phpunit-polyfills --with-dependencies

Autoloading

Make sure to:

  • Either use the Composer vendor/autoload.php file as your test bootstrap file;
  • Or require the vendor/yoast/phpunit-polyfills/phpunitpolyfills-autoload.php file in your test bootstrap.

Why use the PHPUnit Polyfills?

This library is set up to allow for creating PHPUnit cross-version compatible tests by offering a number of polyfills for functionality which was introduced, split up or renamed in PHPUnit.

Write your tests for PHPUnit 9.x and run them on PHPUnit 5.7 - 9.x

The polyfills have been setup to allow tests to be forward-compatible. What that means is, that your tests can use the assertions supported by the latest PHPUnit version, even when running on older PHPUnit versions.

This puts the burden of upgrading to use the syntax of newer PHPUnit versions at the point when you want to start running your tests on a newer version. By doing so, dropping support for an older PHPUnit version becomes as straight-forward as removing it from the version constraint in your composer.json file.

PHPUnit support

  • Releases in the 1.x series of the PHPUnit Polyfills support PHPUnit 4.8 - 9.x.
  • Releases in the 2.x series of the PHPUnit Polyfills support PHPUnit 5.7 - 10.x.

Please keep in mind that the PHPUnit Polyfills provide forward-compatibility. This means that features which PHPUnit no longer supports in PHPUnit 10.x, like expecting PHP deprecation notices or warnings, will not be supported in the PHPUnit Polyfills 2.x series.

Please refer to the PHPUnit 10 release notification and PHPUnit 10 changelog to inform your decision on whether or not to upgrade (yet).

Using this library

Each of the polyfills and helpers has been setup as a trait and can be imported and used in any test file which extends the PHPUnit native TestCase class.

If the polyfill is not needed for the particular PHPUnit version on which the tests are being run, the autoloader will automatically load an empty trait with that same name, so you can safely use these traits in tests which need to be PHPUnit cross-version compatible.

<?php

namespace Vendor\YourPackage\Tests;

use PHPUnit\Framework\TestCase;
use Yoast\PHPUnitPolyfills\Polyfills\AssertIsType;

class FooTest extends TestCase
{
    use AssertIsType;

    public function testSomething()
    {
        $this->assertIsBool( $maybeBool );
        self::assertIsNotIterable( $maybeIterable );
    }
}

Alternatively, you can use one of the TestCase classes provided by this library instead of using the PHPUnit native TestCase class.

In that case, all polyfills and helpers will be available whenever needed.

<?php

namespace Vendor\YourPackage\Tests;

use Yoast\PHPUnitPolyfills\TestCases\TestCase;

class FooTest extends TestCase
{
    public function testSomething()
    {
        $this->assertIsBool( $maybeBool );
        self::assertMatchesRegularExpression( $pattern, $string, $message );
    }
}

Supported ways of calling the assertions

By default, PHPUnit supports four ways of calling assertions:

  1. As a method in the TestCase class - $this->assertSomething().
  2. Statically as a method in the TestCase class - self/static/parent::assertSomething().
  3. Statically as a method of the Assert class - Assert::assertSomething().
  4. As a global function - assertSomething().

The polyfills in this library support the first two ways of calling the assertions as those are the most commonly used type of assertion calls.

For the polyfills to work, a test class is required to be a (grand-)child of the PHPUnit native TestCase class.

Use with PHPUnit < 7.5.0

If your library still needs to support PHP < 7.1 and therefore needs PHPUnit < 7 for testing, there are a few caveats when using the traits stand-alone as we then enter "double-polyfill" territory.

To prevent "conflicting method names" errors when a trait is used multiple times in a class, the traits offered here do not attempt to solve this.

You will need to make sure to use any additional traits needed for the polyfills to work.

PHPUnit When use-ing this trait You also need to use this trait
5.7 < 7.5 AssertIgnoringLineEndings AssertStringContains

Note: this only applies to the stand-alone use of the traits. The TestCase classes provided by this library already take care of this automatically.

Code example for a test using the AssertIgnoringLineEndings trait, which needs to be able to run on PHPUnit 5.7:

<?php

namespace Vendor\YourPackage\Tests;

use PHPUnit\Framework\TestCase;
use Yoast\PHPUnitPolyfills\Polyfills\AssertIgnoringLineEndings;
use Yoast\PHPUnitPolyfills\Polyfills\AssertStringContains;

class FooTest extends TestCase
{
    use AssertIgnoringLineEndings;
    use AssertStringContains;

    public function testSomething()
    {
        $this->assertStringContainsStringIgnoringLineEndings(
            "something\nelse",
            "this is something\r\nelse"
        );
    }
}

Features

Polyfill traits

PHPUnit < 6.4.0: Yoast\PHPUnitPolyfills\Polyfills\ExpectExceptionObject

Polyfills the TestCase::expectExceptionObject() method to test all aspects of an Exception by passing an object to the method.

This method was introduced in PHPUnit 6.4.0.

PHPUnit < 7.5.0: Yoast\PHPUnitPolyfills\Polyfills\AssertIsType

Polyfills the following methods:

Assert::assertIsArray() Assert::assertIsBool() Assert::assertIsFloat()
Assert::assertIsInt() Assert::assertIsNumeric() Assert::assertIsObject()
Assert::assertIsResource() Assert::assertIsString() Assert::assertIsScalar()
Assert::assertIsCallable() Assert::assertIsIterable()
Assert::assertIsNotArray() Assert::assertIsNotBool() Assert::assertIsNotFloat()
Assert::assertIsNotInt() Assert::assertIsNotNumeric() Assert::assertIsNotObject()
Assert::assertIsNotResource() Assert::assertIsNotString() Assert::assertIsNotScalar()
Assert::assertIsNotCallable() Assert::assertIsNotIterable()

These methods were introduced in PHPUnit 7.5.0 as alternatives to the Assert::assertInternalType() and Assert::assertNotInternalType() methods, which were soft deprecated in PHPUnit 7.5.0, hard deprecated (warning) in PHPUnit 8.0.0 and removed in PHPUnit 9.0.0.

PHPUnit < 7.5.0: Yoast\PHPUnitPolyfills\Polyfills\AssertStringContains

Polyfills the following methods:

Assert::assertStringContainsString() Assert::assertStringNotContainsString()
Assert::assertStringContainsStringIgnoringCase() Assert::assertStringNotContainsStringIgnoringCase()

These methods were introduced in PHPUnit 7.5.0 as alternatives to using Assert::assertContains() and Assert::assertNotContains() with string haystacks. Passing string haystacks to these methods was soft deprecated in PHPUnit 7.5.0, hard deprecated (warning) in PHPUnit 8.0.0 and removed in PHPUnit 9.0.0.

PHPUnit < 7.5.0: Yoast\PHPUnitPolyfills\Polyfills\AssertEqualsSpecializations

Polyfills the following methods:

Assert::assertEqualsCanonicalizing() Assert::assertNotEqualsCanonicalizing()
Assert::assertEqualsIgnoringCase() Assert::assertNotEqualsIgnoringCase()
Assert::assertEqualsWithDelta() Assert::assertNotEqualsWithDelta()

These methods were introduced in PHPUnit 7.5.0 as alternatives to using Assert::assertEquals() and Assert::assertNotEquals() with these optional parameters. Passing the respective optional parameters to these methods was soft deprecated in PHPUnit 7.5.0, hard deprecated (warning) in PHPUnit 8.0.0 and removed in PHPUnit 9.0.0.

PHPUnit < 8.4.0: Yoast\PHPUnitPolyfills\Polyfills\ExpectExceptionMessageMatches

Polyfills the TestCase::expectExceptionMessageMatches() method.

This method was introduced in PHPUnit 8.4.0 to improve the name of the TestCase::expectExceptionMessageRegExp() method. The TestCase::expectExceptionMessageRegExp() method was soft deprecated in PHPUnit 8.4.0, hard deprecated (warning) in PHPUnit 8.5.3 and removed in PHPUnit 9.0.0.

PHPUnit < 8.5.0: Yoast\PHPUnitPolyfills\Polyfills\AssertFileEqualsSpecializations

Polyfills the following methods:

Assert::assertFileEqualsCanonicalizing() Assert::assertFileNotEqualsCanonicalizing()
Assert::assertFileEqualsIgnoringCase() Assert::assertFileNotEqualsIgnoringCase()
Assert::assertStringEqualsFileCanonicalizing() Assert::assertStringNotEqualsFileCanonicalizing()
Assert::assertStringEqualsFileIgnoringCase() Assert::assertStringNotEqualsFileIgnoringCase()

These methods were introduced in PHPUnit 8.5.0 as alternatives to using Assert::assertFileEquals() and Assert::assertFileNotEquals() with these optional parameters. Passing the respective optional parameters to these methods was hard deprecated in PHPUnit 8.5.0 and removed in PHPUnit 9.0.0.

PHPUnit < 9.0.0: Yoast\PHPUnitPolyfills\Polyfills\EqualToSpecializations

Polyfills the following methods:

Assert::equalToCanonicalizing() Assert::equalToIgnoringCase()
Assert::equalToWithDelta()

These methods, which are typically used to verify parameters passed to Mock Objects, were introduced in PHPUnit 9.0.0 as alternatives to using Assert::EqualTo() with these optional parameters. Support for passing the respective optional parameters to Assert::EqualTo() was removed in PHPUnit 9.0.0.

PHPUnit < 9.1.0: Yoast\PHPUnitPolyfills\Polyfills\AssertionRenames

Polyfills the following renamed methods:

These methods were introduced in PHPUnit 9.1.0. The original methods these new methods replace were hard deprecated in PHPUnit 9.1.0 and (will be) removed in PHPUnit 10.0.0.

PHPUnit < 9.3.0: Yoast\PHPUnitPolyfills\Polyfills\AssertClosedResource

Polyfills the following methods:

Assert::assertIsClosedResource() Assert::assertIsNotClosedResource()

These methods were introduced in PHPUnit 9.3.0.

Additionally, this trait contains a helper method shouldClosedResourceAssertionBeSkipped().

Due to some bugs in PHP itself, the "is closed resource" determination cannot always be done reliably, most notably for the libxml extension.

This helper function can determine whether or not the current "value under test" in combination with the PHP version on which the test is being run is affected by these bugs.

⚠️ The PHPUnit native implementation of these assertions is also affected by these bugs! The shouldClosedResourceAssertionBeSkipped() helper method is therefore available cross-version.

Usage examples:

// Example: skipping the test completely.
if ( $this->shouldClosedResourceAssertionBeSkipped( $actual ) === true ) {
    $this->markTestSkipped('assertIs[Not]ClosedResource() cannot determine whether this resource is'
        . ' open or closed due to bugs in PHP (PHP ' . \PHP_VERSION . ').');
}

// Example: selectively skipping the assertion.
if ( self::shouldClosedResourceAssertionBeSkipped( $actual ) === false ) {
    $this->assertIsClosedResource( $actual );
}

πŸ‘‰ While this polyfill is tested extensively, testing for these kind of bugs exhaustively is hard. Please report any bugs found and include a clear code sample to reproduce the issue.

PHPUnit < 9.4.0: Yoast\PHPUnitPolyfills\Polyfills\AssertObjectEquals

Polyfills the Assert::assertObjectEquals() method to verify two (value) objects are considered equal. This assertion expects an object to contain a comparator method in the object itself. This comparator method is subsequently called to verify the "equalness" of the objects.

The assertObjectEquals() assertion was introduced in PHPUnit 9.4.0.

ℹ️ Due to limitations in how this assertion is implemented in PHPUnit itself, it is currently not possible to create a single comparator method which will be compatible with both PHP < 7.0 and PHP 7.0 or higher.

In effect two declarations of the same object would be needed to be compatible with PHP < 7.0 and PHP 7.0 and higher and still allow for testing the object using the assertObjectEquals() assertion.

Due to this limitation, it is recommended to only use this assertion if the minimum supported PHP version of a project is PHP 7.0 or higher; or if the project does not run its tests on PHPUnit >= 9.4.0.

The implementation of this assertion in the Polyfills is PHP cross-version compatible.

PHPUnit < 10.0.0: Yoast\PHPUnitPolyfills\Polyfills\AssertIgnoringLineEndings

Polyfills the following methods:

Assert::assertStringEqualsStringIgnoringLineEndings() Assert::assertStringContainsStringIgnoringLineEndings()

These methods were introduced in PHPUnit 10.0.0.

PHPUnit < 10.0.0: Yoast\PHPUnitPolyfills\Polyfills\AssertIsList

Polyfills the following method:

Assert::assertIsList()

This method was introduced in PHPUnit 10.0.0.

PHPUnit < 10.1.0: Yoast\PHPUnitPolyfills\Polyfills\AssertIsList

Polyfills the following method:

Assert::assertObjectHasProperty() Assert::assertObjectNotHasProperty()

These methods were introduced in PHPUnit 10.1.0 as alternatives to the Assert::assertObjectHasAttribute() and Assert::assertObjectNotHasAttribute() methods, which were hard deprecated (warning) in PHPUnit 9.6.1 and removed in PHPUnit 10.0.0.

Helper traits

Yoast\PHPUnitPolyfills\Helpers\AssertAttributeHelper

Helper to work around the removal of the assertAttribute*() methods.

The assertAttribute*() methods were deprecated in PHPUnit 8.0.0 and removed in PHPUnit 9.0.0.

Public properties can still be tested by accessing them directly:

$this->assertSame( 'value', $obj->propertyName );

Protected and private properties can no longer be tested using PHPUnit native functionality. The reasoning for the removal of these assertion methods is that private and protected properties are an implementation detail and should not be tested directly, but via methods in the class.

It is strongly recommended to refactor your tests, and if needs be, your classes to adhere to this.

However, if for some reason the value of protected or private properties still needs to be tested, this helper can be used to get access to their value and attributes.

The trait contains two helper methods:

  • public static getProperty( object $classInstance, string $propertyName ) : ReflectionProperty
  • public static getPropertyValue( object $classInstance, string $propertyName ) : mixed
// Test the value of a protected or private property.
$this->assertSame( 'value', $this->getPropertyValue( $objInstance, $propertyName ) );

// Retrieve a ReflectionProperty object to test other details of the property.
self::assertSame( $propertyName, self::getProperty( $objInstance, $propertyName )->getName() );

TestCases

PHPUnit 8.0.0 introduced a void return type declaration to the "fixture" methods - setUpBeforeClass(), setUp(), tearDown() and tearDownAfterClass(). As the void return type was not introduced until PHP 7.1, this makes it more difficult to create cross-version compatible tests when using fixtures, due to signature mismatches.

This library contains two basic TestCase options to overcome this issue.

Option 1: Yoast\PHPUnitPolyfills\TestCases\TestCase

This TestCase overcomes the signature mismatch by having two versions. The correct one will be loaded depending on the PHPUnit version being used.

When using this TestCase, if an individual test, or another TestCase which extends this TestCase, needs to overload any of the "fixture" methods, it should do so by using a snake_case variant of the original fixture method name, i.e. set_up_before_class(), set_up(), assert_pre_conditions(), assert_post_conditions(), tear_down() and tear_down_after_class().

The snake_case methods will automatically be called by PHPUnit.

IMPORTANT: The snake_case methods should not call the PHPUnit parent, i.e. do not use parent::setUp() from within an overloaded set_up() method. If necessary, DO call parent::set_up().

use Yoast\PHPUnitPolyfills\TestCases\TestCase;

class MyTest extends TestCase {
    public static function set_up_before_class() {
        parent::set_up_before_class();

        // Set up a database connection or other fixture which needs to be available.
    }

    protected function set_up() {
        parent::set_up();

        // Set up function mocks which need to be available for all tests in this class.
    }

    protected function assert_pre_conditions() {
        parent::assert_pre_conditions();

        // Perform assertions shared by all tests of a test case (before the test).
    }

    protected function assert_post_conditions() {
        // Performs assertions shared by all tests of a test case (after the test).

        parent::assert_post_conditions();
    }

    protected function tear_down() {
        // Any clean up needed related to `set_up()`.

        parent::tear_down();
    }

    public static function tear_down_after_class() {
        // Close database connection and other clean up related to `set_up_before_class()`.

        parent::tear_down_after_class();
    }
}

Option 2: Yoast\PHPUnitPolyfills\TestCases\XTestCase

This TestCase overcomes the signature mismatch by using the PHPUnit @before[Class] and @after[Class] annotations in combination with different methods names, i.e. setUpFixturesBeforeClass(), setUpFixtures(), tearDownFixtures() and tearDownFixturesAfterClass().

When using this TestCase, overloaded fixture methods need to use the @beforeClass, @before, @after and @afterClass annotations. The naming of the overloaded methods is open as long as the method names don't conflict with the PHPUnit native method names.

use Yoast\PHPUnitPolyfills\TestCases\XTestCase;

class MyTest extends XTestCase {
    /**
     * @beforeClass
     */
    public static function setUpFixturesBeforeClass() {
        parent::setUpFixturesBeforeClass();

        // Set up a database connection or other fixture which needs to be available.
    }

    /**
     * @before
     */
    protected function setUpFixtures() {
        parent::setUpFixtures();

        // Set up function mocks which need to be available for all tests in this class.
    }

    /**
     * @after
     */
    protected function tearDownFixtures() {
        // Any clean up needed related to `setUpFixtures()`.

        parent::tearDownFixtures();
    }

    /**
     * @afterClass
     */
    public static function tearDownFixturesAfterClass() {
        // Close database connection and other clean up related to `setUpFixturesBeforeClass()`.

        parent::tearDownFixturesAfterClass();
    }
}

TestListener

The method signatures in the PHPUnit TestListener interface have changed a number of times across versions. Additionally, the use of the TestListener principle has been deprecated in PHPUnit 7 in favour of using the TestRunner hook interfaces.

Note: while deprecated in PHPUnit 7, the TestListener interface has not yet been removed and is still supported in PHPUnit 9.x.

If your test suite does not need to support PHPUnit < 7, it is strongly recommended to use the TestRunner hook interfaces extensions instead.

However, for test suites that still need to support PHPUnit 6 or lower, implementing the TestListener interface is the only viable option.

Yoast\PHPUnitPolyfills\TestListeners\TestListenerDefaultImplementation

This TestListenerDefaultImplementation trait overcomes the signature mismatches by having multiple versions and loading the correct one depending on the PHPUnit version being used.

Similar to the TestCase implementation, snake_case methods without type declarations are used to get round the signature mismatches. The snake_case methods will automatically be called.

PHPUnit native method name Replacement Notes
addError() add_error($test, $e, $time)
addWarning() add_warning($test, $e, $time) Introduced in PHPUnit 6.
addFailure() add_failure($test, $e, $time)
addIncompleteTest() add_incomplete_test($test, $e, $time)
addRiskyTest() add_risky_test($test, $e, $time) Support appears to be flaky on PHPUnit 5.
addSkippedTest() add_skipped_test($test, $e, $time)
startTestSuite() start_test_suite($suite)
endTestSuite() end_test_suite($suite)
startTest() start_test($test)
endTest() end_test($test, $time)

Implementations of the TestListener interface may be using any of the following patterns:

// PHPUnit < 6.
class MyTestListener extends \PHPUnit_Framework_BaseTestListener {}

// PHPUnit 6.
class MyTestListener extends \PHPUnit\Framework\BaseTestListener {}

// PHPUnit 7+.
class MyTestListener implements \PHPUnit\Framework\TestListener {
    use \PHPUnit\Framework\TestListenerDefaultImplementation;
}

Replace these with:

use PHPUnit\Framework\TestListener;
use Yoast\PHPUnitPolyfills\TestListeners\TestListenerDefaultImplementation;

class MyTestListener implements TestListener {
    use TestListenerDefaultImplementation;

    // Implement any of the snakecase methods, for example:
    public function add_error( $test, $e, $time ) {
        // Do something when PHPUnit encounters an error.
    }
}

Frequently Asked Questions

Q: Will this package polyfill functionality which was removed from PHPUnit ?

As a rule of thumb, removed functionality will not be polyfilled in this package.

For frequently used, removed PHPUnit functionality, "helpers" may be provided. These helpers are only intended as an interim solution to allow users of this package more time to refactor their tests away from the removed functionality.

Removed functionality without PHPUnit native replacement

PHPUnit Removed Issue Remarks
9.0.0 assertArraySubset() #1 The dms/phpunit-arraysubset-asserts package polyfills this functionality.
As of version 0.3.0 this package can be installed in combination with PHP 5.4 - current and PHPUnit 4.8.36/5.7.21 - current.
Alternatively, tests can be refactored using the patterns outlined in issue #1.
9.0.0 assertAttribute*() #2 Refactor the tests to not directly test private/protected properties.
As an interim solution, the Yoast\PHPUnitPolyfills\Helpers\AssertAttributeHelper trait is available.

Q: Can this library be used when the tests are being run via a PHPUnit Phar file ?

Yes, this package can also be used when running tests via a PHPUnit Phar file.

In that case, make sure that the phpunitpolyfills-autoload.php file is explicitly required in the test bootstrap file. (Not necessary when the Composer vendor/autoload.php file is used as, or required in, the test bootstrap.)

Q: How do I run my tests when the library is installed via the GitHub Actions setup-php action ?

As of shivammathur/setup-php version 2.15.0, the PHPUnit Polyfills are available as one of the tools which can be installed directly by the Setup-PHP GitHub action runner.

- name: Setup PHP with tools
  uses: shivammathur/setup-php@v2
  with:
    php-version: '8.0'
    tools: phpunit-polyfills

The above step will install both the PHPUnit Polyfills, as well as PHPUnit, as Composer global packages.

After this step has run, you can run PHPUnit, like you would normally, by using phpunit.

- name: Run tests
  run: phpunit

πŸ‘‰ If you rely on Composer for autoloading your project files, you will still need to run composer dump-autoload --dev and include the project local vendor/autoload.php file as/in your test bootstrap.

πŸŽ“ Why this works:

Composer will place all files in the global Composer bin directory in the system path and the Composer installed PHPUnit version will load the Composer global autoload.php file, which will automatically also load the PHPUnit Polyfills.

Now you may wonder, "what about if I explicitly request both phpunit as well as phpunit-polyfills in tools?"

In that case, when you run phpunit, the PHPUnit PHAR will not know how to locate the PHPUnit Polyfills, so you will need to do some wizardry in your test bootstrap to get things working.

Q: How can I verify the version used of the PHPUnit Polyfills library ?

For complex test setups, like when the Polyfills are provided via a test suite dependency, or may already be loaded via an overarching project, it can be useful to be able to check that a version of the package is used which complies with the requirements for your test suite.

As of version 1.0.1, the PHPUnit Polyfills Autoload class contains a version number which can be used for this purpose.

Typically such a check would be done in the test suite bootstrap file and could look something like this:

if ( class_exists( '\Yoast\PHPUnitPolyfills\Autoload' ) === false ) {
    require_once 'vendor/yoast/phpunit-polyfills/phpunitpolyfills-autoload.php';
}

$versionRequirement = '1.0.1';
if ( defined( '\Yoast\PHPUnitPolyfills\Autoload::VERSION' ) === false
    || version_compare( \Yoast\PHPUnitPolyfills\Autoload::VERSION, $versionRequirement, '<' )
) {
    echo 'Error: Version mismatch detected for the PHPUnit Polyfills.',
        ' Please ensure that PHPUnit Polyfills ', $versionRequirement,
        ' or higher is loaded.', PHP_EOL;
    exit(1);
} else {
    echo 'Error: Please run `composer update -W` before running the tests.' . PHP_EOL;
    echo 'You can still use a PHPUnit phar to run them,',
        ' but the dependencies do need to be installed.', PHP_EOL;
    exit(1);
}

Contributing

Contributions to this project are welcome. Clone the repo, branch off from the oldest #.x branch the patch applies to, make your changes, commit them and send in a pull request against the correct #.x branch.

If you are unsure whether the changes you are proposing would be welcome, please open an issue first to discuss your proposal.

License

This code is released under the BSD-3-Clause License.

More Repositories

1

wordpress-seo

Yoast SEO for WordPress
JavaScript
1,734
star
2

YoastSEO.js

Analyze content on a page and give SEO feedback as well as render a snippet preview.
JavaScript
403
star
3

javascript

Monorepo for all the JavaScript within Yoast
JavaScript
131
star
4

wpseo-woocommerce

This extension to WooCommerce and Yoast SEO makes sure there's perfect communication between the two plugins.
PHP
100
star
5

whip

A WordPress package to nudge users to upgrade their software versions (starting with PHP)
PHP
70
star
6

Yoast-SEO-for-Magento2

Yoast SEO for Magento 2
PHP
70
star
7

wp-cli-faker

Generate fake data using WP CLI
PHP
66
star
8

yoast-acf-analysis

WordPress plugin that adds the content of all ACF fields to the Yoast SEO score analysis.
PHP
62
star
9

wp-test-utils

PHPUnit and WordPress cross-version compatibility layer for testing plugins and themes build for WordPress
PHP
53
star
10

Yoast-SEO-for-TYPO3

Yoast SEO plugin for TYPO3
PHP
51
star
11

duplicate-post

Yoast Duplicate Post plugin for WordPress
PHP
46
star
12

plugin-development-docker

A docker configuration for WordPress plugin development
Shell
42
star
13

helpscout-edd

HelpScout - Easy Digital Downloads integration
PHP
39
star
14

wpseo-news

News XML Sitemap module for the WordPress SEO plugin
PHP
31
star
15

Yoast-SEO-for-Neos

Yoast SEO integration for Neos CMS
JavaScript
23
star
16

i18n-module

Handle i18n for plugins
PHP
22
star
17

yoastcs

Yoast coding standards
PHP
21
star
18

yoast-components

Accessible React components by Yoast
JavaScript
21
star
19

yoast-test-helper

Plugin to make testing Yoast SEO a bit easier
PHP
13
star
20

developer-docs

All the feature and developer documentation that is hosted on developer.yoast.com.
11
star
21

update-updater

Review the existing state of the WordPress.org updaters and propose ways to improve them
10
star
22

glotpress-theme

The GlotPress "theme-plugin" in use on translate.yoast.com
PHP
9
star
23

yoast-debug

Internal Yoast Debug plugin
PHP
8
star
24

WP-JS-API-implementation-examples

JavaScript
7
star
25

developer

The Yoast Developer portal based on Docusaurus
JavaScript
6
star
26

helpscout-docs-api

PHP
6
star
27

glotpress-seo

Small SEO plugin to enable better titles and meta descriptions on your GlotPress install
PHP
6
star
28

wordpress-develop-mirror

WordPress development sync to develop patches against.
PHP
5
star
29

tailwind-block-theme-experiment

HTML
5
star
30

api-libs

PHP
4
star
31

yoast-tailwind-columns-block

A Tailwind columns block for block-based themes
JavaScript
3
star
32

crawl-cleanup

Clean up WordPress' output, feeds and miscellanea to improve crawl efficiency
PHP
3
star
33

a11y-speak

Announce dynamic interface updates to screen readers using ARIA live regions.
JavaScript
3
star
34

sociable

PHP
3
star
35

passport-openid-connect-wordpress

A Passport strategy to connect to a WordPress installation running as an OAuth server
JavaScript
3
star
36

code-documentation-extractor

PHP
2
star
37

visitor-to-currency

Determines the most likely currency a visitor will be wanting to pay in
PHP
2
star
38

wp-l10n-feature

Feature Plugin: Refactoring the way localizations work in WordPress
PHP
2
star
39

yoast-seo-granular-control

This plugin gives you granular control over some of the settings of Yoast SEO. If you want to keep using it, but disagree with how it handles things like canonicalization and pagination, this plugin is for you.
PHP
2
star
40

ui-library-storybook

HTML
1
star
41

singer-tap-shopify-shops

Scrape of publicly available Shopify shop information
Python
1
star
42

singer-tap-exchange-rate-rss

Python
1
star
43

webfonts-api

Plugin version of the webfonts API (https://github.com/WordPress/wordpress-develop/pull/1736) to make testing easier
PHP
1
star
44

singer-tap-open-exchange-rate

Python
1
star
45

yoast-cli

A Yoast development tool
PHP
1
star
46

singer-tap-builtwith

Python
1
star
47

singer-tap-paypal

A singer tap for PayPal
Python
1
star
48

singer-tap-wordpress-plugin-stats

Python
1
star
49

singer-tap-shopify-partners

Python
1
star
50

extensibleReact

An API (PoC) for making React components extensible.
JavaScript
1
star
51

advent-of-code

This repository provides Yoasters a means to share their solutions to the annual advent-of-code puzzles found on https://www.adventofcode.com/
C#
1
star
52

archive

Yoast repository archive
SCSS
1
star
53

cloudflare-tag-purge

PHP
1
star