Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
48 commits
Select commit Hold shift + click to select a range
ae7f22d
Add support for AVIF transparency checks during image uploads
b1ink0 Oct 30, 2025
a1aff66
Improve Imagick version string regex validation
b1ink0 Nov 2, 2025
be0817b
Merge branch 'trunk' into fix/imagemagick-old-version-avif-transparen…
b1ink0 Nov 13, 2025
3fe6954
Add site health checks for Imagick AVIF transparency support
b1ink0 Nov 14, 2025
2247b61
Add custom image editor class to help with AVIF transparency detection
b1ink0 Dec 17, 2025
1a58d1c
Move Imagick AVIF transparency support site health test
b1ink0 Dec 26, 2025
fdf65ec
Merge branch 'trunk' into fix/imagemagick-old-version-avif-transparen…
b1ink0 Dec 26, 2025
50f2be1
Merge branch 'trunk' into fix/imagemagick-old-version-avif-transparen…
b1ink0 Jan 13, 2026
f8af1e9
Allow `webp_uploads_get_upload_image_mime_transforms()` to omit the f…
b1ink0 Jan 13, 2026
991d7c9
Add explicit return value check for `getImageAlphaChannel` method
b1ink0 Jan 15, 2026
fece741
Add transparency check caching to custom image editor class
b1ink0 Jan 20, 2026
9020b24
Merge branch 'trunk' into fix/imagemagick-old-version-avif-transparen…
b1ink0 Jan 20, 2026
435f5ff
Refactor to use filename instead of file hash for transparency check
b1ink0 Jan 20, 2026
4da1758
Fix transparency detection to exclude fully opaque pixels
b1ink0 Jan 20, 2026
717e768
Fix image editor confilict with Dominant Color Images
b1ink0 Jan 21, 2026
c033c44
Dynimacally extend the image editor class
b1ink0 Jan 21, 2026
b28885e
Fix parameters order in `is_subclass_of`
b1ink0 Jan 22, 2026
6004d18
Simplify conditional checks
b1ink0 Jan 22, 2026
d218d0f
Fix transparency detection for fully transparent images
b1ink0 Jan 22, 2026
41f94e1
Improve doc comments
b1ink0 Jan 22, 2026
28f2583
Skip unnecessary transparency check when image format is already WebP
b1ink0 Jan 22, 2026
b421017
Improve doc comments
b1ink0 Jan 22, 2026
433ea1c
Merge branch 'trunk' into fix/imagemagick-old-version-avif-transparen…
b1ink0 Jan 29, 2026
b00d2d0
Add unit tests for AVIF transparency detection
adamsilverstein Jan 29, 2026
28d6020
Enhance transparency detection logic
b1ink0 Jan 29, 2026
4cf8302
Improve image editor selection logic
b1ink0 Jan 30, 2026
a28415f
Merge pull request #1 from WordPress/fix/imagemagick-old-version-avif…
b1ink0 Feb 2, 2026
99a2704
Merge branch 'trunk' into fix/imagemagick-old-version-avif-transparen…
b1ink0 Feb 2, 2026
92f6528
Ensure helper class is loaded
b1ink0 Feb 2, 2026
23f528b
Add filter to transparency check function
b1ink0 Feb 9, 2026
06f67f7
Improve test code coverage
b1ink0 Feb 9, 2026
4e1ac64
Update test plugin GitHub action to use `tests-wordpress` instead of …
b1ink0 Feb 12, 2026
fec8109
Update commands to use `tests-wordpress` instead of `tests-cli`
b1ink0 Feb 12, 2026
50e74ad
Update all commands to usee `tests-wordpress`
b1ink0 Feb 12, 2026
d8acc81
Fix failing tests
b1ink0 Feb 12, 2026
0e0ee09
Fix failing tests on PHP 7.2
b1ink0 Feb 13, 2026
23e12d5
Fix failing tests on PHP 8.1
b1ink0 Feb 13, 2026
1045006
Finally fix failing tests on PHP 8.1
b1ink0 Feb 13, 2026
789906c
Use `method_exists` instead of `is_callable`
b1ink0 Feb 16, 2026
8140089
Return null when file property does not exist
b1ink0 Feb 16, 2026
2c50ed7
Improve conditional checks
b1ink0 Feb 16, 2026
d01f2d6
Narrow down types
b1ink0 Feb 16, 2026
315d6c3
Merge branch 'trunk' into fix/imagemagick-old-version-avif-transparen…
b1ink0 Feb 16, 2026
3190c5b
Use fallback for more failure conditions
b1ink0 Feb 17, 2026
f0beb09
Improve test code coverage
b1ink0 Feb 25, 2026
346a61e
Merge branch 'trunk' into fix/imagemagick-old-version-avif-transparen…
b1ink0 Feb 25, 2026
3f55c70
Merge branch 'trunk' into fix/imagemagick-old-version-avif-transparen…
b1ink0 Feb 27, 2026
59d39dc
Only consider default channels for mean calculation
b1ink0 Mar 4, 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/php-test-plugins.yml
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ jobs:
npm run wp-env start
fi
- name: Composer Install
run: npm run wp-env run tests-cli -- --env-cwd="wp-content/plugins/$(basename $(pwd))" composer install --no-interaction --no-progress
run: npm run wp-env run tests-wordpress -- --env-cwd="wp-content/plugins/$(basename $(pwd))" composer install --no-interaction --no-progress
- name: Update Composer Dependencies
run: composer update --with-all-dependencies --no-interaction --no-progress
- name: Install PHPUnit
Expand Down
44 changes: 22 additions & 22 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -63,29 +63,29 @@
"test-e2e:debug": "wp-scripts test-playwright --config tools/e2e/playwright.config.ts --ui",
"test-e2e:auto-sizes": "wp-scripts test-playwright --config tools/e2e/playwright.config.ts --project=auto-sizes",
"lint-php": "composer lint:all",
"test-php": "wp-env run tests-cli --env-cwd=/var/www/html/wp-content/plugins/performance composer test:plugins",
"test-php": "wp-env run tests-wordpress --env-cwd=/var/www/html/wp-content/plugins/performance composer test:plugins",
"test-php-watch": "./bin/test-php-watch.sh",
"test-php-multisite": "wp-env run tests-cli --env-cwd=/var/www/html/wp-content/plugins/performance composer test-multisite:plugins",
"test-php:performance-lab": "wp-env run tests-cli --env-cwd=/var/www/html/wp-content/plugins/performance composer test:performance-lab",
"test-php:auto-sizes": "wp-env run tests-cli --env-cwd=/var/www/html/wp-content/plugins/performance composer test:auto-sizes",
"test-php:dominant-color-images": "wp-env run tests-cli --env-cwd=/var/www/html/wp-content/plugins/performance composer test:dominant-color-images",
"test-php:embed-optimizer": "wp-env run tests-cli --env-cwd=/var/www/html/wp-content/plugins/performance composer test:embed-optimizer",
"test-php:image-prioritizer": "wp-env run tests-cli --env-cwd=/var/www/html/wp-content/plugins/performance composer test:image-prioritizer",
"test-php:optimization-detective": "wp-env run tests-cli --env-cwd=/var/www/html/wp-content/plugins/performance composer test:optimization-detective",
"test-php:speculation-rules": "wp-env run tests-cli --env-cwd=/var/www/html/wp-content/plugins/performance composer test:speculation-rules",
"test-php:view-transitions": "wp-env run tests-cli --env-cwd=/var/www/html/wp-content/plugins/performance composer test:view-transitions",
"test-php:web-worker-offloading": "wp-env run tests-cli --env-cwd=/var/www/html/wp-content/plugins/performance composer test:web-worker-offloading",
"test-php:webp-uploads": "wp-env run tests-cli --env-cwd=/var/www/html/wp-content/plugins/performance composer test:webp-uploads",
"test-php-multisite:performance-lab": "wp-env run tests-cli --env-cwd=/var/www/html/wp-content/plugins/performance composer test-multisite:performance-lab",
"test-php-multisite:auto-sizes": "wp-env run tests-cli --env-cwd=/var/www/html/wp-content/plugins/performance composer test-multisite:auto-sizes",
"test-php-multisite:dominant-color-images": "wp-env run tests-cli --env-cwd=/var/www/html/wp-content/plugins/performance composer test-multisite:dominant-color-images",
"test-php-multisite:embed-optimizer": "wp-env run tests-cli --env-cwd=/var/www/html/wp-content/plugins/performance composer test-multisite:embed-optimizer",
"test-php-multisite:image-prioritizer": "wp-env run tests-cli --env-cwd=/var/www/html/wp-content/plugins/performance composer test-multisite:image-prioritizer",
"test-php-multisite:optimization-detective": "wp-env run tests-cli --env-cwd=/var/www/html/wp-content/plugins/performance composer test-multisite:optimization-detective",
"test-php-multisite:speculation-rules": "wp-env run tests-cli --env-cwd=/var/www/html/wp-content/plugins/performance composer test-multisite:speculation-rules",
"test-php-multisite:view-transitions": "wp-env run tests-cli --env-cwd=/var/www/html/wp-content/plugins/performance composer test-multisite:view-transitions",
"test-php-multisite:web-worker-offloading": "wp-env run tests-cli --env-cwd=/var/www/html/wp-content/plugins/performance composer test-multisite:web-worker-offloading",
"test-php-multisite:webp-uploads": "wp-env run tests-cli --env-cwd=/var/www/html/wp-content/plugins/performance composer test-multisite:webp-uploads",
"test-php-multisite": "wp-env run tests-wordpress --env-cwd=/var/www/html/wp-content/plugins/performance composer test-multisite:plugins",
"test-php:performance-lab": "wp-env run tests-wordpress --env-cwd=/var/www/html/wp-content/plugins/performance composer test:performance-lab",
"test-php:auto-sizes": "wp-env run tests-wordpress --env-cwd=/var/www/html/wp-content/plugins/performance composer test:auto-sizes",
"test-php:dominant-color-images": "wp-env run tests-wordpress --env-cwd=/var/www/html/wp-content/plugins/performance composer test:dominant-color-images",
"test-php:embed-optimizer": "wp-env run tests-wordpress --env-cwd=/var/www/html/wp-content/plugins/performance composer test:embed-optimizer",
"test-php:image-prioritizer": "wp-env run tests-wordpress --env-cwd=/var/www/html/wp-content/plugins/performance composer test:image-prioritizer",
"test-php:optimization-detective": "wp-env run tests-wordpress --env-cwd=/var/www/html/wp-content/plugins/performance composer test:optimization-detective",
"test-php:speculation-rules": "wp-env run tests-wordpress --env-cwd=/var/www/html/wp-content/plugins/performance composer test:speculation-rules",
"test-php:view-transitions": "wp-env run tests-wordpress --env-cwd=/var/www/html/wp-content/plugins/performance composer test:view-transitions",
"test-php:web-worker-offloading": "wp-env run tests-wordpress --env-cwd=/var/www/html/wp-content/plugins/performance composer test:web-worker-offloading",
"test-php:webp-uploads": "wp-env run tests-wordpress --env-cwd=/var/www/html/wp-content/plugins/performance composer test:webp-uploads",
"test-php-multisite:performance-lab": "wp-env run tests-wordpress --env-cwd=/var/www/html/wp-content/plugins/performance composer test-multisite:performance-lab",
"test-php-multisite:auto-sizes": "wp-env run tests-wordpress --env-cwd=/var/www/html/wp-content/plugins/performance composer test-multisite:auto-sizes",
"test-php-multisite:dominant-color-images": "wp-env run tests-wordpress --env-cwd=/var/www/html/wp-content/plugins/performance composer test-multisite:dominant-color-images",
"test-php-multisite:embed-optimizer": "wp-env run tests-wordpress --env-cwd=/var/www/html/wp-content/plugins/performance composer test-multisite:embed-optimizer",
"test-php-multisite:image-prioritizer": "wp-env run tests-wordpress --env-cwd=/var/www/html/wp-content/plugins/performance composer test-multisite:image-prioritizer",
"test-php-multisite:optimization-detective": "wp-env run tests-wordpress --env-cwd=/var/www/html/wp-content/plugins/performance composer test-multisite:optimization-detective",
"test-php-multisite:speculation-rules": "wp-env run tests-wordpress --env-cwd=/var/www/html/wp-content/plugins/performance composer test-multisite:speculation-rules",
"test-php-multisite:view-transitions": "wp-env run tests-wordpress --env-cwd=/var/www/html/wp-content/plugins/performance composer test-multisite:view-transitions",
"test-php-multisite:web-worker-offloading": "wp-env run tests-wordpress --env-cwd=/var/www/html/wp-content/plugins/performance composer test-multisite:web-worker-offloading",
"test-php-multisite:webp-uploads": "wp-env run tests-wordpress --env-cwd=/var/www/html/wp-content/plugins/performance composer test-multisite:webp-uploads",
"update-test-case-snapshots": "bin/update-test-case-snapshots.sh",
"wp-env": "wp-env",
"prepare": "husky"
Expand Down
6 changes: 3 additions & 3 deletions plugins/dominant-color-images/tests/data/class-testcase.php
Original file line number Diff line number Diff line change
Expand Up @@ -122,12 +122,12 @@ public function provider_get_dominant_color(): array {
),
'balloons_webp' => array(
'image_path' => TESTS_PLUGIN_DIR . '/tests/data/images/balloons.webp',
'expected_color' => array( 'c1bbb9', 'c0bbb9', 'c0bab8', 'c3bdbd', 'bfbab8' ),
'expected_color' => array( 'c1bbb9', 'c0bbb9', 'c0bab8', 'c3bdbd', 'bfbab8', 'c2bdbc' ),
'expected_transparency' => false,
),
'half_opaque' => array(
'image_path' => TESTS_PLUGIN_DIR . '/tests/data/images/half-opaque.png',
'expected_color' => array( '7e7e7e' ),
'expected_color' => array( '7e7e7e', 'ffffff' ),
'expected_transparency' => true,
),
);
Expand Down Expand Up @@ -214,7 +214,7 @@ public function test_get_dominant_color_invalid( string $image_path ): void {
$dominant_color_data = dominant_color_get_dominant_color_data( $attachment_id );

$this->assertWPError( $dominant_color_data );
$this->assertStringContainsString( 'image_no_editor', $dominant_color_data->get_error_code() );
$this->assertStringContainsString( 'unsupported_attachment_type', $dominant_color_data->get_error_code() );
}

/**
Expand Down
160 changes: 160 additions & 0 deletions plugins/webp-uploads/class-webp-uploads-image-editor-imagick.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,160 @@
<?php
/**
* WordPress Image Editor Class for Image Manipulation through Imagick
* for transparency detection
*
* @package webp-uploads
*
* @since n.e.x.t
*/

// @codeCoverageIgnoreStart
if ( ! defined( 'ABSPATH' ) ) {
exit; // Exit if accessed directly.
}
// @codeCoverageIgnoreEnd

if ( class_exists( 'WebP_Uploads_Image_Editor_Imagick_Base' ) ) {

/**
* WordPress Image Editor Class for Image Manipulation through Imagick
* for transparency detection.
*
* @since n.e.x.t
*
* @see WP_Image_Editor
*/
class WebP_Uploads_Image_Editor_Imagick extends WebP_Uploads_Image_Editor_Imagick_Base {
/**
* The current instance of the image editor.
*
* @since n.e.x.t
*
* @var WebP_Uploads_Image_Editor_Imagick|null $current_instance The current instance.
*/
public static $current_instance = null;

/**
* Stores already checked images for transparency.
*
* @since n.e.x.t
*
* @var array<string, bool> Associative array with file paths as keys and transparency detection results as values.
*/
private static $checked_images = array();

/**
* Load the image and set the current instance.
*
* @since n.e.x.t
*
* @return WP_Error|true True on success, WP_Error on failure.
*/
public function load() {
// @phpstan-ignore-next-line -- Parent class is created via class_alias at runtime.
$result = parent::load();
if ( ! is_wp_error( $result ) ) {
self::$current_instance = $this;
}
return $result;
}

/**
* Get the file path of the image.
*
* @since n.e.x.t
*
* @return string|null The file path of the image, or null if not available.
*/
public function get_file(): ?string {
if ( property_exists( $this, 'file' ) && is_string( $this->file ) ) {
return $this->file;
}
return null;
}

/**
* Looks for transparent pixels in the image.
* If there are none, it returns false.
*
* @since n.e.x.t
*
* @return bool|WP_Error True or false based on whether there are transparent pixels, or an error on failure.
*/
public function has_transparency() {
if ( ! property_exists( $this, 'image' ) || ! $this->image instanceof Imagick ) {
return new WP_Error( 'image_editor_has_transparency_error_no_image', __( 'Transparency detection no image found.', 'webp-uploads' ) );
}

$file_path = $this->get_file();
if ( isset( $file_path, self::$checked_images[ $file_path ] ) ) {
return self::$checked_images[ $file_path ];
}
$transparency = false;
$use_fallback = false;

try {
/*
* Check if the image has an alpha channel if false, then it can't have transparency so return early.
*
* Note that Imagick::getImageAlphaChannel() is only available if Imagick
* has been compiled against ImageMagick version 6.4.0 or newer.
*/
if ( Imagick::ALPHACHANNEL_UNDEFINED === $this->image->getImageAlphaChannel() ) {
self::$checked_images[ $file_path ] = false;
return false;
}

// Use mean and range to determine if there is any transparency more efficiently.
$rgb_mean = $this->image->getImageChannelMean( Imagick::CHANNEL_DEFAULT );
$alpha_range = $this->image->getImageChannelRange( Imagick::CHANNEL_ALPHA );

if ( isset( $rgb_mean['mean'], $alpha_range['maxima'] ) ) {
$maxima = (int) $alpha_range['maxima'];
$mean = (int) $rgb_mean['mean'];

if ( 0 > $maxima || 0 > $mean ) {
// For invalid values use fallback.
$use_fallback = true;
} elseif ( 0 === $maxima && 0 === $mean ) {
// Alpha channel is all zeros AND no RGB content indicates fully transparent image.
$transparency = true;
} elseif ( 0 === $maxima && $mean > 0 ) {
// Alpha maxima of 0 with RGB content present indicates no real alpha channel exists (hence fully opaque).
$transparency = false;
} elseif ( 0 < $maxima && 0 < $mean ) {
// Non-zero alpha values with RGB content present indicates some transparency.
$transparency = true;
} else {
// For any other case use fallback.
$use_fallback = true;
}
} else {
$use_fallback = true;
}

if ( $use_fallback ) {
// Fallback to walk through the pixels and look for transparent pixels.
$w = $this->image->getImageWidth();
$h = $this->image->getImageHeight();
for ( $x = 0; $x < $w; $x++ ) {
for ( $y = 0; $y < $h; $y++ ) {
$pixel = $this->image->getImagePixelColor( $x, $y );
$color = $pixel->getColor( 2 );
if ( $color['a'] < 255 ) {
$transparency = true;
break 2;
}
}
}
}

self::$checked_images[ $file_path ] = $transparency;
return $transparency;
} catch ( Throwable $e ) {
/* translators: %s is the error message */
return new WP_Error( 'image_editor_has_transparency_error', sprintf( __( 'Transparency detection failed: %s', 'webp-uploads' ), $e->getMessage() ) );
}
}
}
}
117 changes: 114 additions & 3 deletions plugins/webp-uploads/helper.php
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,16 @@
* @since 2.0.0 Added support for AVIF.
* @since 2.2.0 Added support for PNG.
*
* @param string|null $filename Optional. The filename. Default null.
* @return array<string, array<string>> An array of valid mime types, where the key is the mime type and the value is the extension type.
*/
function webp_uploads_get_upload_image_mime_transforms(): array {

function webp_uploads_get_upload_image_mime_transforms( ?string $filename = null ): array {
// Check the selected output format.
$output_format = webp_uploads_mime_type_supported( 'image/avif' ) ? webp_uploads_get_image_output_format() : 'webp';
$output_format = webp_uploads_get_image_output_format();

if ( 'avif' === $output_format && ( ! webp_uploads_mime_type_supported( 'image/avif' ) || webp_uploads_check_image_transparency( $filename ) ) ) {
$output_format = 'webp';
}

$default_transforms = array(
'image/jpeg' => array( 'image/' . $output_format ),
Expand Down Expand Up @@ -512,3 +516,110 @@ function webp_uploads_get_attachment_file_mime_type( int $attachment_id, string
$mime_type = $filetype['type'] ?? get_post_mime_type( $attachment_id );
return is_string( $mime_type ) ? $mime_type : '';
}

/**
* Checks if Imagick has AVIF transparency support.
*
* @since n.e.x.t
*
* @param string|null $version Optional Imagick version string. If not provided, the version will be retrieved from the Imagick class.
* @return bool True if Imagick has AVIF transparency support, false otherwise.
*/
function webp_uploads_imagick_avif_transparency_supported( ?string $version = null ): bool {
$supported = false;
$imagick_version = $version;

if ( null === $imagick_version && extension_loaded( 'imagick' ) && class_exists( 'Imagick' ) ) {
$imagick_version = Imagick::getVersion();
$imagick_version = $imagick_version['versionString'];
}

if ( null !== $imagick_version && '' !== $imagick_version && (bool) preg_match( '/\d+(?:\.\d+)+(?:-\d+)?/', $imagick_version, $matches ) ) {
$imagick_version = $matches[0];
}

if ( null === $imagick_version || '' === $imagick_version ) {
return false;
}

$supported = version_compare( $imagick_version, '7.0.25', '>=' );

/**
* Filters whether Imagick has AVIF transparency support.
*
* @since n.e.x.t
*
* @param bool $supported Whether AVIF transparency is supported.
*/
return (bool) apply_filters( 'webp_uploads_imagick_avif_transparency_supported', $supported );
}

/**
* Checks if an image has transparency when AVIF output is configured and AVIF transparency support is missing.
*
* @since n.e.x.t
*
* @param string|null $filename The uploaded file name.
* @return bool Whether the image has transparency.
*/
function webp_uploads_check_image_transparency( ?string $filename ): bool {
static $processed_images = array();

if ( 'avif' !== webp_uploads_get_image_output_format() || webp_uploads_imagick_avif_transparency_supported() ) {
return false;
}

if ( ! class_exists( 'WebP_Uploads_Image_Editor_Imagick' ) ) {
// Calls filter `wp_image_editors` internally which makes sure `webp_uploads_set_image_editors` is called.
wp_image_editor_supports();
}

if ( ! class_exists( 'WebP_Uploads_Image_Editor_Imagick' ) ) {
return false;
}

/*
* When WordPress generates subsizes (thumbnail, medium, large, etc.), the 'image_editor_output_format'
* filter is triggered without a filename parameter. In these cases, we need to retrieve the filename
* from the current editor instance that was used to load the original image. This allows us to perform
* the transparency check on the source file even when generating derivative sizes.
*/
if ( null === $filename ) {
if ( null === WebP_Uploads_Image_Editor_Imagick::$current_instance ) {
return false;
}
$file = WebP_Uploads_Image_Editor_Imagick::$current_instance->get_file();
if ( null === $file ) {
return false;
}
$filename = $file;
}

if ( ! is_string( $filename ) || ! file_exists( $filename ) ) {
return false;
}

if ( isset( $processed_images[ $filename ] ) ) {
return $processed_images[ $filename ];
}
$processed_images[ $filename ] = false;

$editor = wp_get_image_editor(
$filename,
array(
'methods' => array(
'get_file',
'has_transparency',
),
)
);

if ( is_wp_error( $editor ) || ! $editor instanceof WebP_Uploads_Image_Editor_Imagick ) {
return false;
}

$has_transparency = $editor->has_transparency();
$processed_images[ $filename ] = is_wp_error( $has_transparency ) ? false : $has_transparency;

return $processed_images[ $filename ];
}
Comment on lines +520 to +625
Copy link

Copilot AI Jan 22, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The new transparency checking functionality lacks test coverage. The repository has comprehensive test coverage for other functions (test-helper.php, test-load.php, etc.), but no tests are present for webp_uploads_imagick_avif_transparency_supported(), webp_uploads_check_image_transparency(), or the WebP_Uploads_Image_Editor_Imagick::has_transparency() method. Given the complexity and critical nature of this transparency detection logic, unit tests should be added to verify correct behavior.

Copilot uses AI. Check for mistakes.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@copilot open a new pull request to add test coverage based on this feedback

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

hmmm... copilot seems to have ignored me :( I'll give Claude a try locally...

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it's because this PR uses a branch from a fork 🤔.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I’m still working on some feedback from Copilot. Once that’s done, I’ll write the tests.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Here is what Claude came up with: b1ink0#1

Loading
Loading