From 94f8b2e91b2e89b4496ce548e50d92152235aa11 Mon Sep 17 00:00:00 2001 From: Jason Bahl Date: Thu, 11 Dec 2025 11:05:54 -0700 Subject: [PATCH 1/9] fix: prevent authenticated user data from leaking into object cache This fixes a security vulnerability where authenticated user data could leak to public users through the object cache. The issue stemmed from WPGraphQL core calling wp_set_current_user(0) in has_authentication_errors() AFTER query execution but BEFORE the cache save hook fires. This caused is_user_logged_in() to return false even for authenticated requests. The fix: - Use AppContext->viewer instead of is_user_logged_in() to check auth state - AppContext->viewer is set at Request creation and doesn't change mid-request - Cache the is_object_cache_enabled() result per-request for consistency - Add Cache-Control: no-store header for authenticated requests See: https://github.com/wp-graphql/wp-graphql-jwt-authentication/issues/38 --- src/Cache/Results.php | 59 ++- tests/wpunit/AuthenticatedCacheLeakTest.php | 495 ++++++++++++++++++++ 2 files changed, 551 insertions(+), 3 deletions(-) create mode 100644 tests/wpunit/AuthenticatedCacheLeakTest.php diff --git a/src/Cache/Results.php b/src/Cache/Results.php index 27b2e850..1faf9714 100644 --- a/src/Cache/Results.php +++ b/src/Cache/Results.php @@ -26,6 +26,16 @@ class Results extends Query { */ protected $request; + /** + * Stores whether the object cache is enabled. + * + * This is cached after first determination to ensure consistent behavior + * throughout the request lifecycle, even if WordPress auth state changes. + * + * @var bool|null + */ + protected $is_object_cache_enabled = null; + /** * @return void */ @@ -36,9 +46,35 @@ public function init() { add_action( 'wpgraphql_cache_purge_all', [ $this, 'purge_all_cb' ], 10, 0 ); add_filter( 'graphql_request_results', [ $this, 'add_cache_key_to_response_extensions' ], 10, 7 ); + // Set Cache-Control: no-store for authenticated requests to prevent network/CDN caching + add_filter( 'graphql_response_headers_to_send', [ $this, 'add_no_cache_headers_for_authenticated_requests' ], PHP_INT_MAX ); + parent::init(); } + /** + * Add Cache-Control: no-store header for authenticated requests. + * + * This prevents network caches (Varnish, CDN, etc.) from caching responses + * that were made by authenticated users, which could contain sensitive data. + * + * Uses AppContext->viewer which is set at Request creation and doesn't change + * even if wp_set_current_user(0) is called later. + * + * @param array $headers The headers to be sent with the response. + * + * @return array The modified headers. + */ + public function add_no_cache_headers_for_authenticated_requests( $headers ) { + // Use the viewer from AppContext, which is set at Request creation + // and doesn't change even if wp_set_current_user(0) is called later + if ( $this->request && isset( $this->request->app_context->viewer ) && $this->request->app_context->viewer->exists() ) { + $headers['Cache-Control'] = 'no-store'; + } + + return $headers; + } + /** * Unique identifier for this request is normalized query string, operation and variables * @@ -111,6 +147,10 @@ public function add_cache_key_to_response_extensions( public function get_query_results_from_cache_cb( $result, Request $request ) { $this->request = $request; + // Reset the cached is_object_cache_enabled value for each new request + // This ensures we re-evaluate based on the current request's auth state + $this->is_object_cache_enabled = null; + // if caching is not enabled or the request is authenticated, bail early // right now we're not supporting GraphQL cache for authenticated requests. // Possibly in the future. @@ -177,6 +217,12 @@ public function get_result( $query_id, $query_string, $variables, $operation_nam */ protected function is_object_cache_enabled() { + // Return cached value if already determined for this request. + // This ensures consistent behavior even if WordPress auth state changes mid-request. + if ( null !== $this->is_object_cache_enabled ) { + return (bool) $this->is_object_cache_enabled; + } + // default to disabled $enabled = false; @@ -185,13 +231,20 @@ protected function is_object_cache_enabled() { $enabled = true; } - // however, if the user is logged in, we should bypass the cache - if ( is_user_logged_in() ) { + // Check if the user is authenticated using AppContext->viewer. + // This is more reliable than is_user_logged_in() because: + // 1. AppContext->viewer is set once at Request creation and doesn't change + // 2. WPGraphQL core may call wp_set_current_user(0) mid-request in has_authentication_errors() + // which would cause is_user_logged_in() to return false even for authenticated requests + // 3. Using AppContext is more "GraphQL-native" and consistent with how WPGraphQL handles auth + if ( $this->request && isset( $this->request->app_context->viewer ) && $this->request->app_context->viewer->exists() ) { $enabled = false; } // @phpcs:ignore - return (bool) apply_filters( 'graphql_cache_is_object_cache_enabled', $enabled, $this->request ); + $this->is_object_cache_enabled = (bool) apply_filters( 'graphql_cache_is_object_cache_enabled', $enabled, $this->request ); + + return $this->is_object_cache_enabled; } /** diff --git a/tests/wpunit/AuthenticatedCacheLeakTest.php b/tests/wpunit/AuthenticatedCacheLeakTest.php new file mode 100644 index 00000000..b7f9aec8 --- /dev/null +++ b/tests/wpunit/AuthenticatedCacheLeakTest.php @@ -0,0 +1,495 @@ +viewer is set to current user (e.g., admin with ID 123) + * 2. before_execute() runs - stores globals, handles batch setup (NO auth checks here!) + * 3. Query executes, returning data based on admin's permissions (e.g., draft posts) + * 4. after_execute() is called + * 5. has_authentication_errors() is called which does: + * - Checks if nonce is present + * - If NO nonce: calls wp_set_current_user(0) to treat as unauthenticated + * - This has been the behavior since 2019 (see Request.php lines 355-361) + * 6. after_execute_actions() runs (lines 420-427) + * 7. 'graphql_return_response' action fires - THIS IS WHERE SMART CACHE SAVES TO CACHE + * + * ## The Problem + * + * At step 7, if we check is_user_logged_in(), it returns FALSE because wp_set_current_user(0) + * was called in step 5. But the query results from step 3 contain authenticated data! + * + * So we would: + * - See is_user_logged_in() === false + * - Think "this is an unauthenticated request, safe to cache" + * - Cache authenticated data (draft posts, private content, etc.) + * - Public users then get this cached authenticated data + * + * ## Historical Context + * + * The comment in WPGraphQL core at line 408-409 says "prevent execution" but + * has_authentication_errors() runs in after_execute() - AFTER the query has already executed! + * + * GitHub Issue #38 (wp-graphql-jwt-authentication, July 2019, still open as of 2024) + * discusses this exact problem - authentication errors should halt execution BEFORE + * the query runs, not after. The issue suggests using the rest_authentication_errors + * hook pattern to abort processing early. + * + * @see https://github.com/wp-graphql/wp-graphql-jwt-authentication/issues/38 + * + * ## Real-World Attack Scenario + * + * 1. Authenticated admin makes GET request: + * /graphql/?query={posts(where:{status:DRAFT}){nodes{title status}}} + * + * 2. Admin sees draft posts in response (correct - they have permission) + * + * 3. Public user in incognito window makes the SAME GET request + * + * 4. WITHOUT THE FIX: Public user sees the cached draft posts (SECURITY VULNERABILITY!) + * + * 5. WITH THE FIX: Public user gets fresh query results with no draft posts + * + * ## The Fix + * + * Instead of checking is_user_logged_in() (which changes mid-request), we check + * AppContext->viewer which is set once at Request creation and never changes. + * + * - AppContext->viewer is set in Request constructor via WPGraphQL::get_app_context() + * - This captures the REAL user at request start, before any nonce checks + * - Even after wp_set_current_user(0) is called, AppContext->viewer still reflects + * the original authenticated user + * + * Additionally, we cache the result of is_object_cache_enabled() per-request to ensure + * consistent behavior throughout the entire request lifecycle. + * + * @see vendor/wp-graphql/wp-graphql/src/Request.php lines 355-361 (wp_set_current_user(0)) + * @see vendor/wp-graphql/wp-graphql/src/Request.php lines 408-427 (execution order) + * @see vendor/wp-graphql/wp-graphql/src/WPGraphQL.php line 950 (AppContext->viewer set) + */ +class AuthenticatedCacheLeakTest extends \Codeception\TestCase\WPTestCase { + + /** + * @var \WP_User + */ + protected $admin_user; + + /** + * @var int + */ + protected $draft_post_id; + + /** + * @var int + */ + protected $published_post_id; + + public function setUp(): void { + parent::setUp(); + + // Enable object caching + add_option( 'graphql_cache_section', [ 'cache_toggle' => 'on' ] ); + + // Create an admin user + $this->admin_user = self::factory()->user->create_and_get( [ + 'role' => 'administrator', + ] ); + + // Create a draft post (only visible to authenticated users with proper capabilities) + $this->draft_post_id = self::factory()->post->create( [ + 'post_type' => 'post', + 'post_status' => 'draft', + 'post_title' => 'Secret Draft Post', + 'post_author' => $this->admin_user->ID, + ] ); + + // Create a published post + $this->published_post_id = self::factory()->post->create( [ + 'post_type' => 'post', + 'post_status' => 'publish', + 'post_title' => 'Public Published Post', + ] ); + } + + public function tearDown(): void { + delete_option( 'graphql_cache_section' ); + wp_delete_post( $this->draft_post_id, true ); + wp_delete_post( $this->published_post_id, true ); + wp_delete_user( $this->admin_user->ID ); + + parent::tearDown(); + } + + /** + * Test that is_object_cache_enabled returns false when AppContext viewer exists (authenticated), + * even if wp_set_current_user(0) was called later. + * + * This is the core of the security fix - using AppContext->viewer instead of + * is_user_logged_in() which can change mid-request. + */ + public function testCacheIsDisabledWhenAppContextViewerExists() { + // Log in as admin before creating the GraphQL request + wp_set_current_user( $this->admin_user->ID ); + + // Execute a simple query - this creates a Request with AppContext->viewer set to admin + $query = '{ __typename }'; + $response = graphql( [ 'query' => $query ] ); + + // The cache should have been disabled for this authenticated request + $this->assertEmpty( + $response['extensions']['graphqlSmartCache']['graphqlObjectCache'] ?? [], + 'Authenticated request should not be cached' + ); + } + + /** + * Test that cache IS enabled for truly unauthenticated requests. + */ + public function testCacheIsEnabledForUnauthenticatedRequests() { + // Ensure no user is logged in + wp_set_current_user( 0 ); + + // Execute a simple query twice + $query = '{ __typename }'; + + // First request - should execute and cache + $response1 = graphql( [ 'query' => $query ] ); + $this->assertArrayHasKey( 'data', $response1 ); + + // Second request - should be served from cache + $response2 = graphql( [ 'query' => $query ] ); + + // The second response should indicate it came from cache + $this->assertNotEmpty( + $response2['extensions']['graphqlSmartCache']['graphqlObjectCache'] ?? [], + 'Second unauthenticated request should be served from cache' + ); + } + + /** + * Test the EXACT real-world vulnerability scenario with draft posts. + * + * This test replicates the exact attack scenario: + * + * 1. Admin user is logged in (authenticated via WordPress session/cookie) + * 2. Admin makes request: /graphql/?query={posts(where:{status:DRAFT}){nodes{title status}}} + * 3. Admin sees draft posts in response (expected - they have permission) + * 4. WPGraphQL core calls wp_set_current_user(0) because no nonce was provided + * 5. Smart cache attempts to save results - should be BLOCKED because user WAS authenticated + * 6. Public user makes the same request + * 7. Public user should NOT see the draft posts + * + * WITHOUT THE FIX: At step 5, is_user_logged_in() returns FALSE (because of step 4), + * so the cache thinks it's safe to save, and public users get cached draft posts. + * + * WITH THE FIX: At step 5, we check AppContext->viewer which still reflects the admin + * user from step 1, so we correctly block caching. + */ + public function testDraftPostsDoNotLeakFromAuthenticatedToPublicUsers() { + // ===================================================================== + // STEP 1: Admin user is logged in + // ===================================================================== + wp_set_current_user( $this->admin_user->ID ); + + // This is the exact query from the real-world scenario + // /graphql/?query={posts(where:{status:DRAFT}){nodes{title status}}} + $query = '{ + posts(where: {status: DRAFT}) { + nodes { + title + status + } + } + }'; + + // ===================================================================== + // STEP 2-3: Admin executes query and sees draft posts + // ===================================================================== + $admin_response = graphql( [ 'query' => $query ] ); + + // Verify admin can see the draft post + $this->assertArrayHasKey( 'data', $admin_response ); + $this->assertArrayHasKey( 'posts', $admin_response['data'] ); + + $admin_posts = $admin_response['data']['posts']['nodes']; + $found_draft = false; + foreach ( $admin_posts as $post ) { + if ( 'Secret Draft Post' === $post['title'] ) { + $found_draft = true; + // GraphQL returns status in lowercase + $this->assertEquals( 'draft', strtolower( $post['status'] ) ); + } + } + $this->assertTrue( $found_draft, 'Admin should see the draft post' ); + + // ===================================================================== + // STEP 4-5: Verify the response was NOT cached + // (This is where the fix prevents the vulnerability) + // ===================================================================== + $this->assertEmpty( + $admin_response['extensions']['graphqlSmartCache']['graphqlObjectCache'] ?? [], + 'Admin request should NOT be served from cache' + ); + + // ===================================================================== + // STEP 6: Public user (incognito window) makes the same request + // ===================================================================== + wp_set_current_user( 0 ); // Simulate unauthenticated user + + $public_response = graphql( [ 'query' => $query ] ); + + // ===================================================================== + // STEP 7: Verify public user does NOT see draft posts + // ===================================================================== + $this->assertArrayHasKey( 'data', $public_response ); + $public_posts = $public_response['data']['posts']['nodes'] ?? []; + + // Public user should NOT see the draft post - this is the critical security check + foreach ( $public_posts as $post ) { + $this->assertNotEquals( + 'Secret Draft Post', + $post['title'], + 'SECURITY VULNERABILITY: Public user can see draft post that was visible to admin! ' . + 'This indicates authenticated data leaked into the cache.' + ); + $this->assertNotEquals( + 'draft', + strtolower( $post['status'] ), + 'SECURITY VULNERABILITY: Public user can see draft content!' + ); + } + + // Also verify the public response was NOT served from a polluted cache + $this->assertEmpty( + $public_response['extensions']['graphqlSmartCache']['graphqlObjectCache'] ?? [], + 'Public request should not be served from a cache that was potentially populated by authenticated user' + ); + } + + /** + * Test that authenticated query results are NOT cached and don't leak to public users. + * + * This simulates the full flow: + * 1. Admin user is logged in + * 2. Request is created with AppContext->viewer set to admin + * 3. Query executes and returns draft posts + * 4. Cache save is attempted but should be blocked + * 5. Public user makes same query + * 6. Verify: Public user should NOT see cached authenticated data + */ + public function testAuthenticatedQueryResultsAreNotCached() { + // Log in as admin + wp_set_current_user( $this->admin_user->ID ); + + $query = ' + query GetDraftPosts { + posts(where: {status: DRAFT}) { + nodes { + id + title + status + } + } + } + '; + + // Execute the query as authenticated user + $response = graphql( [ 'query' => $query ] ); + + // Verify we got the draft post in the response + $this->assertArrayHasKey( 'data', $response ); + $this->assertArrayHasKey( 'posts', $response['data'] ); + + // Now check that the result was NOT cached + $this->assertEmpty( + $response['extensions']['graphqlSmartCache']['graphqlObjectCache'] ?? [], + 'Authenticated request should not be from cache' + ); + + // Now log out and make the same request + wp_set_current_user( 0 ); + + $public_response = graphql( [ 'query' => $query ] ); + + // The public response should also NOT be from cache (because the authenticated + // user's response should not have been cached in the first place) + $this->assertEmpty( + $public_response['extensions']['graphqlSmartCache']['graphqlObjectCache'] ?? [], + 'Public request should not be served from a cache that was populated by authenticated user' + ); + + // And the public response should NOT contain the draft post + // (this would be a security leak if it did) + $public_posts = $public_response['data']['posts']['nodes'] ?? []; + foreach ( $public_posts as $post ) { + $this->assertNotEquals( + 'Secret Draft Post', + $post['title'], + 'Public user should NOT see draft posts that were visible to authenticated user' + ); + } + } + + /** + * Test that the Cache-Control header method correctly identifies authenticated requests. + * + * This ensures that network caches (Varnish, CDN) also don't cache authenticated responses. + * The Cache-Control: no-store header tells upstream caches not to store the response. + * + * Note: The graphql_response_headers_to_send filter only fires for HTTP requests, + * not internal graphql() calls. So we test the method directly. + */ + public function testCacheControlHeaderSetForAuthenticatedRequests() { + // Log in as admin + wp_set_current_user( $this->admin_user->ID ); + + // Execute a query to set up the request on the Results instance + $query = '{ __typename }'; + graphql( [ 'query' => $query ] ); + + // Get the Results instance and test the header method directly + $results = new Results(); + $results->init(); + + // We need to set the request on the Results instance + // Use reflection to set the request property + $reflection = new \ReflectionClass( $results ); + $request_property = $reflection->getProperty( 'request' ); + $request_property->setAccessible( true ); + + // Create a mock request with an authenticated viewer + $mock_request = new \stdClass(); + $mock_request->app_context = new \stdClass(); + $mock_request->app_context->viewer = wp_get_current_user(); + + $request_property->setValue( $results, $mock_request ); + + // Test the header filter method directly + $headers = [ 'Content-Type' => 'application/json' ]; + $filtered_headers = $results->add_no_cache_headers_for_authenticated_requests( $headers ); + + $this->assertArrayHasKey( 'Cache-Control', $filtered_headers, 'Cache-Control header should be set for authenticated requests' ); + $this->assertEquals( 'no-store', $filtered_headers['Cache-Control'], 'Cache-Control should be no-store for authenticated requests' ); + } + + /** + * Test that Cache-Control header is NOT set to no-store for unauthenticated requests. + * + * Unauthenticated requests CAN be cached by network caches, so we should not set + * Cache-Control: no-store for them. + */ + public function testCacheControlHeaderNotSetForUnauthenticatedRequests() { + // Ensure no user is logged in + wp_set_current_user( 0 ); + + // Get the Results instance and test the header method directly + $results = new Results(); + $results->init(); + + // Use reflection to set the request property + $reflection = new \ReflectionClass( $results ); + $request_property = $reflection->getProperty( 'request' ); + $request_property->setAccessible( true ); + + // Create a mock request with an unauthenticated viewer + $mock_request = new \stdClass(); + $mock_request->app_context = new \stdClass(); + $mock_request->app_context->viewer = wp_get_current_user(); // Returns user with ID 0 + + $request_property->setValue( $results, $mock_request ); + + // Test the header filter method directly + $headers = [ 'Content-Type' => 'application/json' ]; + $filtered_headers = $results->add_no_cache_headers_for_authenticated_requests( $headers ); + + // Cache-Control should NOT be set to no-store + $this->assertNotEquals( + 'no-store', + $filtered_headers['Cache-Control'] ?? '', + 'Cache-Control should not be no-store for unauthenticated requests' + ); + } + + /** + * Test that the is_object_cache_enabled result is cached after first determination. + * + * This ensures consistent behavior throughout the request even if something + * tries to change the auth state mid-request. + * + * The property is reset at the start of each new request (in get_query_results_from_cache_cb) + * to ensure each request gets a fresh evaluation based on its own auth state. + */ + public function testIsObjectCacheEnabledResultIsCached() { + $results = new Results(); + $results->init(); + + // Ensure no user is logged in + wp_set_current_user( 0 ); + + // We need to set a mock request on the Results object + // Since we can't easily create a full Request object, we'll test via graphql() + $query = '{ __typename }'; + + // First request as unauthenticated - should enable cache + $response1 = graphql( [ 'query' => $query ] ); + + // Second identical request should come from cache + $response2 = graphql( [ 'query' => $query ] ); + + $this->assertNotEmpty( + $response2['extensions']['graphqlSmartCache']['graphqlObjectCache'] ?? [], + 'Second request should be served from cache, proving cache is enabled' + ); + } + + /** + * Test that multiple sequential requests with different auth states are handled correctly. + * + * This ensures the per-request reset of is_object_cache_enabled works correctly. + */ + public function testSequentialRequestsWithDifferentAuthStates() { + $query = '{ __typename }'; + + // Request 1: Unauthenticated - should cache + wp_set_current_user( 0 ); + $response1 = graphql( [ 'query' => $query ] ); + $this->assertArrayHasKey( 'data', $response1 ); + + // Request 2: Unauthenticated again - should be from cache + $response2 = graphql( [ 'query' => $query ] ); + $this->assertNotEmpty( + $response2['extensions']['graphqlSmartCache']['graphqlObjectCache'] ?? [], + 'Second unauthenticated request should be from cache' + ); + + // Request 3: Authenticated - should NOT use cache and NOT cache result + wp_set_current_user( $this->admin_user->ID ); + $response3 = graphql( [ 'query' => $query ] ); + $this->assertEmpty( + $response3['extensions']['graphqlSmartCache']['graphqlObjectCache'] ?? [], + 'Authenticated request should not be from cache' + ); + + // Request 4: Back to unauthenticated - cache should still work + // (the authenticated request should not have polluted the cache) + wp_set_current_user( 0 ); + $response4 = graphql( [ 'query' => $query ] ); + $this->assertNotEmpty( + $response4['extensions']['graphqlSmartCache']['graphqlObjectCache'] ?? [], + 'Unauthenticated request after authenticated request should still use cache' + ); + } + +} + From 8d181b5f2b7dc1a97a4e08ae61f213028af7a7a0 Mon Sep 17 00:00:00 2001 From: Jason Bahl Date: Thu, 11 Dec 2025 11:27:48 -0700 Subject: [PATCH 2/9] fix: prevent authenticated user data from leaking into object cache This fixes a security vulnerability where authenticated user data could leak to public users through the object cache. The issue stemmed from WPGraphQL core calling wp_set_current_user(0) in has_authentication_errors() AFTER query execution but BEFORE the cache save hook fires. This caused is_user_logged_in() to return false even for authenticated requests. The fix: - Use AppContext->viewer instead of is_user_logged_in() to check auth state - AppContext->viewer is set at Request creation and doesn't change mid-request - Cache the is_object_cache_enabled() result per-request for consistency - Add Cache-Control: no-store header for authenticated requests See: https://github.com/wp-graphql/wp-graphql-jwt-authentication/issues/38 --- src/Cache/Results.php | 5 +- ....php => AuthenticatedRequestCacheTest.php} | 49 +++++++------------ 2 files changed, 20 insertions(+), 34 deletions(-) rename tests/wpunit/{AuthenticatedCacheLeakTest.php => AuthenticatedRequestCacheTest.php} (91%) diff --git a/src/Cache/Results.php b/src/Cache/Results.php index 1faf9714..9246a464 100644 --- a/src/Cache/Results.php +++ b/src/Cache/Results.php @@ -234,8 +234,9 @@ protected function is_object_cache_enabled() { // Check if the user is authenticated using AppContext->viewer. // This is more reliable than is_user_logged_in() because: // 1. AppContext->viewer is set once at Request creation and doesn't change - // 2. WPGraphQL core may call wp_set_current_user(0) mid-request in has_authentication_errors() - // which would cause is_user_logged_in() to return false even for authenticated requests + // 2. WPGraphQL core may call wp_set_current_user(0) mid-request in has_authentication_errors(), + // or even within individual resolvers, etc which would cause is_user_logged_in() + // to return false even for authenticated requests // 3. Using AppContext is more "GraphQL-native" and consistent with how WPGraphQL handles auth if ( $this->request && isset( $this->request->app_context->viewer ) && $this->request->app_context->viewer->exists() ) { $enabled = false; diff --git a/tests/wpunit/AuthenticatedCacheLeakTest.php b/tests/wpunit/AuthenticatedRequestCacheTest.php similarity index 91% rename from tests/wpunit/AuthenticatedCacheLeakTest.php rename to tests/wpunit/AuthenticatedRequestCacheTest.php index b7f9aec8..fa55c3cc 100644 --- a/tests/wpunit/AuthenticatedCacheLeakTest.php +++ b/tests/wpunit/AuthenticatedRequestCacheTest.php @@ -5,12 +5,13 @@ use WPGraphQL\SmartCache\Cache\Results; /** - * Test that authenticated user data does not leak into the cache. + * Test that authenticated requests are handled correctly by the object cache. * - * ## The Vulnerability + * ## Background * - * This tests a security vulnerability where authenticated user data could leak to public users - * through the object cache. The issue stems from the order of operations in WPGraphQL core: + * This tests the caching behavior for authenticated vs unauthenticated requests. + * The object cache should only store results from unauthenticated requests to ensure + * that authenticated user data is not inadvertently served to public users. * * ## Request Execution Order in WPGraphQL\Request * @@ -25,7 +26,7 @@ * 6. after_execute_actions() runs (lines 420-427) * 7. 'graphql_return_response' action fires - THIS IS WHERE SMART CACHE SAVES TO CACHE * - * ## The Problem + * ## The Challenge * * At step 7, if we check is_user_logged_in(), it returns FALSE because wp_set_current_user(0) * was called in step 5. But the query results from step 3 contain authenticated data! @@ -41,27 +42,14 @@ * The comment in WPGraphQL core at line 408-409 says "prevent execution" but * has_authentication_errors() runs in after_execute() - AFTER the query has already executed! * - * GitHub Issue #38 (wp-graphql-jwt-authentication, July 2019, still open as of 2024) + * GitHub Issue #38 (wp-graphql-jwt-authentication, July 2019) * discusses this exact problem - authentication errors should halt execution BEFORE * the query runs, not after. The issue suggests using the rest_authentication_errors - * hook pattern to abort processing early. + * hook pattern to abort processing early. While the issue is closed it seems it might not be fully addressed. * * @see https://github.com/wp-graphql/wp-graphql-jwt-authentication/issues/38 * - * ## Real-World Attack Scenario - * - * 1. Authenticated admin makes GET request: - * /graphql/?query={posts(where:{status:DRAFT}){nodes{title status}}} - * - * 2. Admin sees draft posts in response (correct - they have permission) - * - * 3. Public user in incognito window makes the SAME GET request - * - * 4. WITHOUT THE FIX: Public user sees the cached draft posts (SECURITY VULNERABILITY!) - * - * 5. WITH THE FIX: Public user gets fresh query results with no draft posts - * - * ## The Fix + * ## The Solution * * Instead of checking is_user_logged_in() (which changes mid-request), we check * AppContext->viewer which is set once at Request creation and never changes. @@ -78,7 +66,7 @@ * @see vendor/wp-graphql/wp-graphql/src/Request.php lines 408-427 (execution order) * @see vendor/wp-graphql/wp-graphql/src/WPGraphQL.php line 950 (AppContext->viewer set) */ -class AuthenticatedCacheLeakTest extends \Codeception\TestCase\WPTestCase { +class AuthenticatedRequestCacheTest extends \Codeception\TestCase\WPTestCase { /** * @var \WP_User @@ -135,7 +123,7 @@ public function tearDown(): void { * Test that is_object_cache_enabled returns false when AppContext viewer exists (authenticated), * even if wp_set_current_user(0) was called later. * - * This is the core of the security fix - using AppContext->viewer instead of + * This is the core of the fix - using AppContext->viewer instead of * is_user_logged_in() which can change mid-request. */ public function testCacheIsDisabledWhenAppContextViewerExists() { @@ -178,9 +166,9 @@ public function testCacheIsEnabledForUnauthenticatedRequests() { } /** - * Test the EXACT real-world vulnerability scenario with draft posts. + * Test the real-world scenario with draft posts. * - * This test replicates the exact attack scenario: + * This test replicates the scenario: * * 1. Admin user is logged in (authenticated via WordPress session/cookie) * 2. Admin makes request: /graphql/?query={posts(where:{status:DRAFT}){nodes{title status}}} @@ -235,7 +223,7 @@ public function testDraftPostsDoNotLeakFromAuthenticatedToPublicUsers() { // ===================================================================== // STEP 4-5: Verify the response was NOT cached - // (This is where the fix prevents the vulnerability) + // (This is where the fix prevents the issue) // ===================================================================== $this->assertEmpty( $admin_response['extensions']['graphqlSmartCache']['graphqlObjectCache'] ?? [], @@ -255,18 +243,17 @@ public function testDraftPostsDoNotLeakFromAuthenticatedToPublicUsers() { $this->assertArrayHasKey( 'data', $public_response ); $public_posts = $public_response['data']['posts']['nodes'] ?? []; - // Public user should NOT see the draft post - this is the critical security check + // Public user should NOT see the draft post - this is the critical check foreach ( $public_posts as $post ) { $this->assertNotEquals( 'Secret Draft Post', $post['title'], - 'SECURITY VULNERABILITY: Public user can see draft post that was visible to admin! ' . - 'This indicates authenticated data leaked into the cache.' + 'Public user should not see draft post that was visible to admin.' ); $this->assertNotEquals( 'draft', strtolower( $post['status'] ), - 'SECURITY VULNERABILITY: Public user can see draft content!' + 'Public user should not see draft content.' ); } @@ -330,7 +317,6 @@ public function testAuthenticatedQueryResultsAreNotCached() { ); // And the public response should NOT contain the draft post - // (this would be a security leak if it did) $public_posts = $public_response['data']['posts']['nodes'] ?? []; foreach ( $public_posts as $post ) { $this->assertNotEquals( @@ -492,4 +478,3 @@ public function testSequentialRequestsWithDifferentAuthStates() { } } - From 2188fd5db8eb084b8cc980e5fb63fb26cb1714b8 Mon Sep 17 00:00:00 2001 From: Jason Bahl Date: Thu, 11 Dec 2025 12:50:02 -0700 Subject: [PATCH 3/9] fix: prevent authenticated request data from leaking to public cache WPGraphQL core calls wp_set_current_user(0) mid-request when no nonce is present (in has_authentication_errors), which caused is_user_logged_in() to return false even for authenticated requests. This allowed sensitive data (e.g., draft posts) to be cached and subsequently served to unauthenticated users. The fix: - Use AppContext->viewer->exists() instead of is_user_logged_in() to determine authentication state. AppContext->viewer is set once at Request creation and remains stable throughout the request lifecycle. - Include user ID in cache keys to ensure authenticated and unauthenticated requests produce separate cache entries. - Add Cache-Control: no-store header for authenticated requests to prevent network caches (CDN, Varnish) from caching sensitive responses. Includes wpunit and acceptance tests to prevent regression. --- src/Cache/Query.php | 14 +- src/Cache/Results.php | 9 +- tests/_support/Helper/Functional.php | 1 - tests/acceptance.suite.yml | 8 + .../AuthenticatedRequestCacheCest.php | 173 ++++++++++++++++++ 5 files changed, 194 insertions(+), 11 deletions(-) create mode 100644 tests/acceptance/AuthenticatedRequestCacheCest.php diff --git a/src/Cache/Query.php b/src/Cache/Query.php index ec5cfdca..3435ac0e 100644 --- a/src/Cache/Query.php +++ b/src/Cache/Query.php @@ -22,6 +22,13 @@ class Query { **/ public static $storage = null; + /** + * The current GraphQL request. + * + * @var \WPGraphQL\Request|null + */ + protected $request; + /** * @return void */ @@ -60,14 +67,15 @@ public function build_key( $query_id, $query, $variables = null, $operation = nu return false; } - // WP_User - $user = wp_get_current_user(); + // Get user ID from AppContext->viewer which is set at Request creation + // and doesn't change even if wp_set_current_user(0) is called later + $user_id = $this->request->app_context->viewer->ID ?? null; $parts = [ 'query' => $query, 'variables' => $variables ?: null, 'operation' => $operation ?: null, - 'user' => $user->ID, + 'user' => $user_id, ]; $parts_string = wp_json_encode( $parts ); diff --git a/src/Cache/Results.php b/src/Cache/Results.php index 9246a464..163e559a 100644 --- a/src/Cache/Results.php +++ b/src/Cache/Results.php @@ -21,11 +21,6 @@ class Results extends Query { */ protected $is_cached = []; - /** - * @var \WPGraphQL\Request - */ - protected $request; - /** * Stores whether the object cache is enabled. * @@ -235,8 +230,8 @@ protected function is_object_cache_enabled() { // This is more reliable than is_user_logged_in() because: // 1. AppContext->viewer is set once at Request creation and doesn't change // 2. WPGraphQL core may call wp_set_current_user(0) mid-request in has_authentication_errors(), - // or even within individual resolvers, etc which would cause is_user_logged_in() - // to return false even for authenticated requests + // or even within individual resolvers, etc which would cause is_user_logged_in() + // to return false even for authenticated requests // 3. Using AppContext is more "GraphQL-native" and consistent with how WPGraphQL handles auth if ( $this->request && isset( $this->request->app_context->viewer ) && $this->request->app_context->viewer->exists() ) { $enabled = false; diff --git a/tests/_support/Helper/Functional.php b/tests/_support/Helper/Functional.php index 4183cb0a..fcb68b2d 100644 --- a/tests/_support/Helper/Functional.php +++ b/tests/_support/Helper/Functional.php @@ -6,5 +6,4 @@ class Functional extends \Codeception\Module { - } diff --git a/tests/acceptance.suite.yml b/tests/acceptance.suite.yml index e030d031..d016a05c 100644 --- a/tests/acceptance.suite.yml +++ b/tests/acceptance.suite.yml @@ -10,6 +10,7 @@ modules: enabled: - Asserts - WPBrowser + - WPDb - REST: depends: PhpBrowser part: Json @@ -24,3 +25,10 @@ modules: adminUsername: '%TEST_SITE_ADMIN_USERNAME%' adminPassword: '%TEST_SITE_ADMIN_PASSWORD%' adminPath: '/wp-admin' + WPDb: + dsn: 'mysql:host=%TEST_SITE_DB_HOST%;dbname=%TEST_SITE_DB_NAME%' + user: '%TEST_SITE_DB_USER%' + password: '%TEST_SITE_DB_PASSWORD%' + url: '%WP_URL%' + tablePrefix: '%TEST_SITE_TABLE_PREFIX%' + urlReplacement: false diff --git a/tests/acceptance/AuthenticatedRequestCacheCest.php b/tests/acceptance/AuthenticatedRequestCacheCest.php new file mode 100644 index 00000000..1feb55b0 --- /dev/null +++ b/tests/acceptance/AuthenticatedRequestCacheCest.php @@ -0,0 +1,173 @@ +viewer (set early, stable) instead of is_user_logged_in(). + */ +class AuthenticatedRequestCacheCest { + + /** + * @var int + */ + protected $draft_post_id; + + /** + * @var string + */ + protected $draft_post_title; + + /** + * @var string + */ + protected $test_run_id; + + public function _before( AcceptanceTester $I ) { + $this->test_run_id = uniqid( 'test_', true ); + $this->draft_post_title = 'Secret Draft ' . $this->test_run_id; + } + + /** + * Test that draft posts visible to admin don't leak to public users via cache. + * + * This test: + * 1. Logs in as admin via browser + * 2. Makes GraphQL request for drafts via browser URL (same session) + * 3. Verifies admin sees the draft + * 4. Makes same request via REST module (clean session, no cookies) + * 5. Verifies public user does NOT see the draft + */ + public function testDraftContentDoesNotLeakToPublicUsers( AcceptanceTester $I ) { + // Enable object cache + $I->haveOptionInDatabase( 'graphql_cache_section', [ 'cache_toggle' => 'on' ] ); + + // Create draft post + $this->draft_post_id = $I->havePostInDatabase( [ + 'post_type' => 'post', + 'post_status' => 'draft', + 'post_title' => $this->draft_post_title, + 'post_content' => 'Secret content', + ] ); + + // Build unique query + $operation_name = 'TestDraft_' . str_replace( '.', '_', $this->test_run_id ); + $query = "query {$operation_name} { posts(where: {status: DRAFT}) { nodes { title status } } }"; + $query_encoded = urlencode( $query ); + $graphql_url = "/graphql?query={$query_encoded}"; + + // ===================================================== + // STEP 1: Admin logs in and makes GraphQL request + // ===================================================== + $I->loginAsAdmin(); + $I->amOnPage( $graphql_url ); + + // Grab the raw page source (JSON response) + $auth_body = $I->grabPageSource(); + codecept_debug( 'Authenticated response: ' . $auth_body ); + + $auth_response = json_decode( $auth_body, true ); + $I->assertIsArray( $auth_response, 'Response should be valid JSON' ); + $I->assertArrayHasKey( 'data', $auth_response, 'Response should have data key' ); + + // Admin should see the draft post + $auth_posts = $auth_response['data']['posts']['nodes'] ?? []; + $found_draft = false; + foreach ( $auth_posts as $post ) { + if ( $post['title'] === $this->draft_post_title ) { + $found_draft = true; + break; + } + } + $I->assertTrue( $found_draft, 'Authenticated admin should see the draft post' ); + + // Verify it was NOT served from cache (first request) + $auth_cache_info = $auth_response['extensions']['graphqlSmartCache']['graphqlObjectCache'] ?? []; + codecept_debug( 'Auth cache info: ' . json_encode( $auth_cache_info ) ); + $I->assertEquals( [], $auth_cache_info, 'Auth request should NOT be from cache' ); + + // ===================================================== + // STEP 2: Make same request as public user via REST (clean session) + // ===================================================== + // Use sendGet from REST module - this doesn't share cookies with WPBrowser + $I->deleteHeader( 'Authorization' ); + $I->sendGet( 'graphql', [ 'query' => $query ] ); + $I->seeResponseCodeIs( 200 ); + + $public_body = $I->grabResponse(); + codecept_debug( 'Public response: ' . $public_body ); + + $public_response = json_decode( $public_body, true ); + $I->assertIsArray( $public_response, 'Response should be valid JSON' ); + + // Check cache status + $public_cache_info = $public_response['extensions']['graphqlSmartCache']['graphqlObjectCache'] ?? []; + codecept_debug( 'Public cache info: ' . json_encode( $public_cache_info ) ); + + // CRITICAL SECURITY CHECK: Public user should NOT see draft posts + $public_posts = $public_response['data']['posts']['nodes'] ?? []; + codecept_debug( 'Public posts count: ' . count( $public_posts ) ); + + foreach ( $public_posts as $post ) { + $I->assertNotEquals( + $this->draft_post_title, + $post['title'], + 'SECURITY VULNERABILITY: Public user can see draft posts!' + ); + } + + // Public request should NOT come from cache (auth didn't cache it) + $I->assertEquals( + [], + $public_cache_info, + 'Public request should NOT be from cache - auth request should not have cached' + ); + + // Cleanup + $I->dontHavePostInDatabase( [ 'ID' => $this->draft_post_id ] ); + $I->dontHaveOptionInDatabase( 'graphql_cache_section' ); + } + + /** + * Test that public requests ARE properly cached. + */ + public function testPublicRequestsAreCached( AcceptanceTester $I ) { + // Enable object cache + $I->haveOptionInDatabase( 'graphql_cache_section', [ 'cache_toggle' => 'on' ] ); + + $operation_name = 'TestPublic_' . str_replace( '.', '_', $this->test_run_id ); + $query = urlencode( "query {$operation_name} { __typename }" ); + $graphql_url = "/graphql?query={$query}"; + + // First request - NOT from cache + $I->amOnPage( $graphql_url ); + $body1 = $I->grabPageSource(); + codecept_debug( 'First response: ' . $body1 ); + + $response1 = json_decode( $body1, true ); + $I->assertIsArray( $response1, 'Response should be valid JSON' ); + + $cache1 = $response1['extensions']['graphqlSmartCache']['graphqlObjectCache'] ?? []; + $I->assertEquals( [], $cache1, 'First request should NOT be from cache' ); + + // Second request - SHOULD be from cache + $I->amOnPage( $graphql_url ); + $body2 = $I->grabPageSource(); + codecept_debug( 'Second response: ' . $body2 ); + + $response2 = json_decode( $body2, true ); + $I->assertIsArray( $response2, 'Response should be valid JSON' ); + + $cache2 = $response2['extensions']['graphqlSmartCache']['graphqlObjectCache'] ?? []; + $I->assertNotEmpty( $cache2, 'Second request SHOULD be from cache' ); + + // Cleanup + $I->dontHaveOptionInDatabase( 'graphql_cache_section' ); + } +} From 2d490634695d6c2f00ad78e38f25af3057ff7fec Mon Sep 17 00:00:00 2001 From: Jason Bahl Date: Thu, 11 Dec 2025 16:58:32 -0700 Subject: [PATCH 4/9] test: enhance acceptance tests for authenticated cache bypass - Add second authenticated request to verify cache remains unpopulated across multiple auth requests - Add test step to verify authenticated users bypass existing cache entries populated by public requests - Improve test documentation with step-by-step comments These tests comprehensively validate that: 1. Authenticated requests never populate the object cache 2. Authenticated requests never read from the object cache 3. Public requests correctly use the cache 4. Complete isolation exists between auth and public caching --- src/Cache/Collection.php | 3 + src/Cache/Query.php | 12 ++- src/Cache/Results.php | 6 +- .../AuthenticatedRequestCacheCest.php | 84 +++++++++++++++---- 4 files changed, 86 insertions(+), 19 deletions(-) diff --git a/src/Cache/Collection.php b/src/Cache/Collection.php index 815fcf19..0be0eda3 100644 --- a/src/Cache/Collection.php +++ b/src/Cache/Collection.php @@ -73,6 +73,9 @@ public function save_query_mapping_cb( return; } + // Set the request so build_key() can access AppContext->viewer for the user ID + $this->request = $request; + $request_key = $this->build_key( $query_id, $query, $variables, $operation ); if ( false === $request_key ) { diff --git a/src/Cache/Query.php b/src/Cache/Query.php index 3435ac0e..51e41787 100644 --- a/src/Cache/Query.php +++ b/src/Cache/Query.php @@ -68,8 +68,16 @@ public function build_key( $query_id, $query, $variables = null, $operation = nu } // Get user ID from AppContext->viewer which is set at Request creation - // and doesn't change even if wp_set_current_user(0) is called later - $user_id = $this->request->app_context->viewer->ID ?? null; + // and doesn't change even if wp_set_current_user(0) is called later. + // We intentionally do NOT fall back to wp_get_current_user() because that + // function's return value can change mid-request (e.g., when WPGraphQL calls + // wp_set_current_user(0) in has_authentication_errors()). Using 0 as fallback + // treats the request as unauthenticated, which is the safe default. + if ( $this->request ) { + $user_id = $this->request->app_context->viewer->ID; + } else { + $user_id = 0; + } $parts = [ 'query' => $query, diff --git a/src/Cache/Results.php b/src/Cache/Results.php index 163e559a..36c3db27 100644 --- a/src/Cache/Results.php +++ b/src/Cache/Results.php @@ -63,7 +63,7 @@ public function init() { public function add_no_cache_headers_for_authenticated_requests( $headers ) { // Use the viewer from AppContext, which is set at Request creation // and doesn't change even if wp_set_current_user(0) is called later - if ( $this->request && isset( $this->request->app_context->viewer ) && $this->request->app_context->viewer->exists() ) { + if ( $this->request && $this->request->app_context->viewer->exists() ) { $headers['Cache-Control'] = 'no-store'; } @@ -230,10 +230,10 @@ protected function is_object_cache_enabled() { // This is more reliable than is_user_logged_in() because: // 1. AppContext->viewer is set once at Request creation and doesn't change // 2. WPGraphQL core may call wp_set_current_user(0) mid-request in has_authentication_errors(), - // or even within individual resolvers, etc which would cause is_user_logged_in() + // or even within individual resolvers, etc which would cause is_user_logged_in() // to return false even for authenticated requests // 3. Using AppContext is more "GraphQL-native" and consistent with how WPGraphQL handles auth - if ( $this->request && isset( $this->request->app_context->viewer ) && $this->request->app_context->viewer->exists() ) { + if ( $this->request && $this->request->app_context->viewer->exists() ) { $enabled = false; } diff --git a/tests/acceptance/AuthenticatedRequestCacheCest.php b/tests/acceptance/AuthenticatedRequestCacheCest.php index 1feb55b0..b08916a0 100644 --- a/tests/acceptance/AuthenticatedRequestCacheCest.php +++ b/tests/acceptance/AuthenticatedRequestCacheCest.php @@ -40,9 +40,10 @@ public function _before( AcceptanceTester $I ) { * This test: * 1. Logs in as admin via browser * 2. Makes GraphQL request for drafts via browser URL (same session) - * 3. Verifies admin sees the draft - * 4. Makes same request via REST module (clean session, no cookies) - * 5. Verifies public user does NOT see the draft + * 3. Verifies admin sees the draft and response is NOT from cache + * 4. Makes SECOND authenticated request to verify cache is still not populated + * 5. Makes same request via REST module (clean session, no cookies) + * 6. Verifies public user does NOT see the draft */ public function testDraftContentDoesNotLeakToPublicUsers( AcceptanceTester $I ) { // Enable object cache @@ -89,11 +90,40 @@ public function testDraftContentDoesNotLeakToPublicUsers( AcceptanceTester $I ) // Verify it was NOT served from cache (first request) $auth_cache_info = $auth_response['extensions']['graphqlSmartCache']['graphqlObjectCache'] ?? []; - codecept_debug( 'Auth cache info: ' . json_encode( $auth_cache_info ) ); - $I->assertEquals( [], $auth_cache_info, 'Auth request should NOT be from cache' ); + codecept_debug( 'Auth cache info (1st request): ' . json_encode( $auth_cache_info ) ); + $I->assertEquals( [], $auth_cache_info, 'First auth request should NOT be from cache' ); // ===================================================== - // STEP 2: Make same request as public user via REST (clean session) + // STEP 2: Make SECOND authenticated request to verify cache is still not populated + // ===================================================== + $I->amOnPage( $graphql_url ); + + $auth_body_2 = $I->grabPageSource(); + codecept_debug( 'Second authenticated response: ' . $auth_body_2 ); + + $auth_response_2 = json_decode( $auth_body_2, true ); + $I->assertIsArray( $auth_response_2, 'Second auth response should be valid JSON' ); + $I->assertArrayHasKey( 'data', $auth_response_2, 'Second auth response should have data key' ); + + // Admin should still see the draft post + $auth_posts_2 = $auth_response_2['data']['posts']['nodes'] ?? []; + $found_draft_2 = false; + foreach ( $auth_posts_2 as $post ) { + if ( $post['title'] === $this->draft_post_title ) { + $found_draft_2 = true; + break; + } + } + $I->assertTrue( $found_draft_2, 'Second authenticated request should still see the draft post' ); + + // CRITICAL: Second auth request should ALSO not be from cache + // This proves authenticated requests never populate or use the object cache + $auth_cache_info_2 = $auth_response_2['extensions']['graphqlSmartCache']['graphqlObjectCache'] ?? []; + codecept_debug( 'Auth cache info (2nd request): ' . json_encode( $auth_cache_info_2 ) ); + $I->assertEquals( [], $auth_cache_info_2, 'Second auth request should ALSO NOT be from cache - authenticated requests should never cache' ); + + // ===================================================== + // STEP 3: Make same request as public user via REST (clean session) // ===================================================== // Use sendGet from REST module - this doesn't share cookies with WPBrowser $I->deleteHeader( 'Authorization' ); @@ -135,37 +165,63 @@ public function testDraftContentDoesNotLeakToPublicUsers( AcceptanceTester $I ) } /** - * Test that public requests ARE properly cached. + * Test that public requests ARE properly cached, but authenticated requests bypass the cache. + * + * This test: + * 1. Makes first public request - NOT from cache (populates cache) + * 2. Makes second public request - SHOULD be from cache + * 3. Logs in as admin and makes same request - should NOT be from cache */ public function testPublicRequestsAreCached( AcceptanceTester $I ) { // Enable object cache $I->haveOptionInDatabase( 'graphql_cache_section', [ 'cache_toggle' => 'on' ] ); $operation_name = 'TestPublic_' . str_replace( '.', '_', $this->test_run_id ); - $query = urlencode( "query {$operation_name} { __typename }" ); + $query_string = "query {$operation_name} { __typename }"; + $query = urlencode( $query_string ); $graphql_url = "/graphql?query={$query}"; - // First request - NOT from cache + // ===================================================== + // STEP 1: First public request - NOT from cache (populates cache) + // ===================================================== $I->amOnPage( $graphql_url ); $body1 = $I->grabPageSource(); - codecept_debug( 'First response: ' . $body1 ); + codecept_debug( 'First public response: ' . $body1 ); $response1 = json_decode( $body1, true ); $I->assertIsArray( $response1, 'Response should be valid JSON' ); $cache1 = $response1['extensions']['graphqlSmartCache']['graphqlObjectCache'] ?? []; - $I->assertEquals( [], $cache1, 'First request should NOT be from cache' ); + $I->assertEquals( [], $cache1, 'First public request should NOT be from cache' ); - // Second request - SHOULD be from cache + // ===================================================== + // STEP 2: Second public request - SHOULD be from cache + // ===================================================== $I->amOnPage( $graphql_url ); $body2 = $I->grabPageSource(); - codecept_debug( 'Second response: ' . $body2 ); + codecept_debug( 'Second public response: ' . $body2 ); $response2 = json_decode( $body2, true ); $I->assertIsArray( $response2, 'Response should be valid JSON' ); $cache2 = $response2['extensions']['graphqlSmartCache']['graphqlObjectCache'] ?? []; - $I->assertNotEmpty( $cache2, 'Second request SHOULD be from cache' ); + $I->assertNotEmpty( $cache2, 'Second public request SHOULD be from cache' ); + + // ===================================================== + // STEP 3: Authenticated request - should NOT use cache + // Even though there's a cached entry, authenticated users bypass it entirely + // ===================================================== + $I->loginAsAdmin(); + $I->amOnPage( $graphql_url ); + $body3 = $I->grabPageSource(); + codecept_debug( 'Authenticated response: ' . $body3 ); + + $response3 = json_decode( $body3, true ); + $I->assertIsArray( $response3, 'Authenticated response should be valid JSON' ); + $I->assertArrayHasKey( 'data', $response3, 'Authenticated response should have data key' ); + + $cache3 = $response3['extensions']['graphqlSmartCache']['graphqlObjectCache'] ?? []; + $I->assertEquals( [], $cache3, 'Authenticated request should NOT be from cache - auth users bypass cache entirely' ); // Cleanup $I->dontHaveOptionInDatabase( 'graphql_cache_section' ); From d70ff1931075f0a2bc5617ae5a4d52cd0cb3be75 Mon Sep 17 00:00:00 2001 From: Jason Bahl Date: Thu, 11 Dec 2025 17:19:07 -0700 Subject: [PATCH 5/9] ci: update deprecated GitHub Actions to v4 --- .github/workflows/tests-wordpress.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/tests-wordpress.yml b/.github/workflows/tests-wordpress.yml index 148ebeef..c8c72cff 100644 --- a/.github/workflows/tests-wordpress.yml +++ b/.github/workflows/tests-wordpress.yml @@ -31,7 +31,7 @@ jobs: wordpress: '6.2' steps: - name: Checkout - uses: actions/checkout@v2 + uses: actions/checkout@v4 - name: Build container image env: @@ -51,10 +51,10 @@ jobs: - name: Get Composer Cache Directory id: composercache - run: echo "::set-output name=dir::$(composer config cache-files-dir)" + run: echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT - name: Cache dependencies - uses: actions/cache@v2 + uses: actions/cache@v4 with: path: ${{ steps.composercache.outputs.dir }} key: php-${{ matrix.php }}-${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} From 501735fecc236b6f62cf71e840a1b38fce081841 Mon Sep 17 00:00:00 2001 From: Jason Bahl Date: Thu, 11 Dec 2025 17:20:51 -0700 Subject: [PATCH 6/9] ci: update all deprecated GitHub Actions to latest versions --- .github/workflows/code-quality.yml | 4 ++-- .github/workflows/update-wordpress-assets.yml | 2 +- .github/workflows/upload-plugin-zip.yml | 2 +- .github/workflows/wordpress-coding-standards.yml | 6 +++--- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/code-quality.yml b/.github/workflows/code-quality.yml index 4c17357a..b1797cde 100644 --- a/.github/workflows/code-quality.yml +++ b/.github/workflows/code-quality.yml @@ -21,12 +21,12 @@ jobs: steps: - name: Cancel previous runs of this workflow (pull requests only) if: ${{ github.event_name == 'pull_request' }} - uses: styfle/cancel-workflow-action@0.5.0 + uses: styfle/cancel-workflow-action@0.12.1 with: access_token: ${{ github.token }} - name: Checkout - uses: actions/checkout@v2 + uses: actions/checkout@v4 - name: Setup PHP uses: shivammathur/setup-php@v2 diff --git a/.github/workflows/update-wordpress-assets.yml b/.github/workflows/update-wordpress-assets.yml index 4f78cb74..fa069a4e 100644 --- a/.github/workflows/update-wordpress-assets.yml +++ b/.github/workflows/update-wordpress-assets.yml @@ -11,7 +11,7 @@ jobs: - name: Install Subversion run: sudo apt-get update && sudo apt-get install -y subversion - - uses: actions/checkout@master + - uses: actions/checkout@v4 - name: Setup PHP uses: shivammathur/setup-php@v2 diff --git a/.github/workflows/upload-plugin-zip.yml b/.github/workflows/upload-plugin-zip.yml index db685051..f229f38c 100644 --- a/.github/workflows/upload-plugin-zip.yml +++ b/.github/workflows/upload-plugin-zip.yml @@ -7,7 +7,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v2 + uses: actions/checkout@v4 - name: Setup PHP uses: shivammathur/setup-php@v2 with: diff --git a/.github/workflows/wordpress-coding-standards.yml b/.github/workflows/wordpress-coding-standards.yml index 880a788f..a8f5d04b 100644 --- a/.github/workflows/wordpress-coding-standards.yml +++ b/.github/workflows/wordpress-coding-standards.yml @@ -19,7 +19,7 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v2 + uses: actions/checkout@v4 - name: Setup PHP uses: shivammathur/setup-php@v2 @@ -30,10 +30,10 @@ jobs: - name: Get Composer Cache Directory id: composer-cache - run: echo "::set-output name=dir::$(composer config cache-files-dir)" + run: echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT - name: Cache dependencies - uses: actions/cache@v2 + uses: actions/cache@v4 with: path: ${{ steps.composer-cache.outputs.dir }} key: php-${{ matrix.php }}-${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} From 1394637bfe55cb1edd1585c510497322b9048cad Mon Sep 17 00:00:00 2001 From: Jason Bahl Date: Thu, 11 Dec 2025 17:22:46 -0700 Subject: [PATCH 7/9] - update composer.lock --- composer.lock | 1711 ++++++++++++++++++++++++++++++------------------- 1 file changed, 1040 insertions(+), 671 deletions(-) diff --git a/composer.lock b/composer.lock index 690a6e8e..750b2c59 100644 --- a/composer.lock +++ b/composer.lock @@ -64,16 +64,16 @@ "packages-dev": [ { "name": "antecedent/patchwork", - "version": "2.2.1", + "version": "2.2.3", "source": { "type": "git", "url": "https://github.com/antecedent/patchwork.git", - "reference": "1bf183a3e1bd094f231a2128b9ecc5363c269245" + "reference": "8b6b235f405af175259c8f56aea5fc23ab9f03ce" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/antecedent/patchwork/zipball/1bf183a3e1bd094f231a2128b9ecc5363c269245", - "reference": "1bf183a3e1bd094f231a2128b9ecc5363c269245", + "url": "https://api.github.com/repos/antecedent/patchwork/zipball/8b6b235f405af175259c8f56aea5fc23ab9f03ce", + "reference": "8b6b235f405af175259c8f56aea5fc23ab9f03ce", "shasum": "" }, "require": { @@ -106,9 +106,9 @@ ], "support": { "issues": "https://github.com/antecedent/patchwork/issues", - "source": "https://github.com/antecedent/patchwork/tree/2.2.1" + "source": "https://github.com/antecedent/patchwork/tree/2.2.3" }, - "time": "2024-12-11T10:19:54+00:00" + "time": "2025-09-17T09:00:56+00:00" }, { "name": "automattic/vipwpcs", @@ -217,24 +217,30 @@ }, { "name": "behat/gherkin", - "version": "v4.11.0", + "version": "v4.16.1", "source": { "type": "git", "url": "https://github.com/Behat/Gherkin.git", - "reference": "32821a17b12620951e755b5d49328a6421a5b5b5" + "reference": "e26037937dfd48528746764dd870bc5d0836665f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Behat/Gherkin/zipball/32821a17b12620951e755b5d49328a6421a5b5b5", - "reference": "32821a17b12620951e755b5d49328a6421a5b5b5", + "url": "https://api.github.com/repos/Behat/Gherkin/zipball/e26037937dfd48528746764dd870bc5d0836665f", + "reference": "e26037937dfd48528746764dd870bc5d0836665f", "shasum": "" }, "require": { - "php": "8.1.* || 8.2.* || 8.3.* || 8.4.*" + "composer-runtime-api": "^2.2", + "php": ">=8.1 <8.6" }, "require-dev": { - "cucumber/cucumber": "dev-gherkin-24.1.0", - "phpunit/phpunit": "^9.6", + "cucumber/gherkin-monorepo": "dev-gherkin-v37.0.0", + "friendsofphp/php-cs-fixer": "^3.77", + "mikey179/vfsstream": "^1.6", + "phpstan/extension-installer": "^1", + "phpstan/phpstan": "^2", + "phpstan/phpstan-phpunit": "^2", + "phpunit/phpunit": "^10.5", "symfony/yaml": "^5.4 || ^6.4 || ^7.0" }, "suggest": { @@ -247,8 +253,8 @@ } }, "autoload": { - "psr-0": { - "Behat\\Gherkin": "src/" + "psr-4": { + "Behat\\Gherkin\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -259,11 +265,11 @@ { "name": "Konstantin Kudryashov", "email": "ever.zet@gmail.com", - "homepage": "http://everzet.com" + "homepage": "https://everzet.com" } ], "description": "Gherkin DSL parser for PHP", - "homepage": "http://behat.org/", + "homepage": "https://behat.org/", "keywords": [ "BDD", "Behat", @@ -274,9 +280,23 @@ ], "support": { "issues": "https://github.com/Behat/Gherkin/issues", - "source": "https://github.com/Behat/Gherkin/tree/v4.11.0" + "source": "https://github.com/Behat/Gherkin/tree/v4.16.1" }, - "time": "2024-12-06T10:07:25+00:00" + "funding": [ + { + "url": "https://github.com/acoulton", + "type": "github" + }, + { + "url": "https://github.com/carlos-granados", + "type": "github" + }, + { + "url": "https://github.com/stof", + "type": "github" + } + ], + "time": "2025-12-08T16:12:58+00:00" }, { "name": "bordoni/phpass", @@ -1040,6 +1060,7 @@ "issues": "https://github.com/Codeception/phpunit-wrapper/issues", "source": "https://github.com/Codeception/phpunit-wrapper/tree/9.0.9" }, + "abandoned": true, "time": "2022-05-23T06:24:11+00:00" }, { @@ -1119,16 +1140,16 @@ }, { "name": "composer/ca-bundle", - "version": "1.5.5", + "version": "1.5.10", "source": { "type": "git", "url": "https://github.com/composer/ca-bundle.git", - "reference": "08c50d5ec4c6ced7d0271d2862dec8c1033283e6" + "reference": "961a5e4056dd2e4a2eedcac7576075947c28bf63" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/ca-bundle/zipball/08c50d5ec4c6ced7d0271d2862dec8c1033283e6", - "reference": "08c50d5ec4c6ced7d0271d2862dec8c1033283e6", + "url": "https://api.github.com/repos/composer/ca-bundle/zipball/961a5e4056dd2e4a2eedcac7576075947c28bf63", + "reference": "961a5e4056dd2e4a2eedcac7576075947c28bf63", "shasum": "" }, "require": { @@ -1175,7 +1196,7 @@ "support": { "irc": "irc://irc.freenode.org/composer", "issues": "https://github.com/composer/ca-bundle/issues", - "source": "https://github.com/composer/ca-bundle/tree/1.5.5" + "source": "https://github.com/composer/ca-bundle/tree/1.5.10" }, "funding": [ { @@ -1185,32 +1206,28 @@ { "url": "https://github.com/composer", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" } ], - "time": "2025-01-08T16:17:16+00:00" + "time": "2025-12-08T15:06:51+00:00" }, { "name": "composer/class-map-generator", - "version": "1.6.0", + "version": "1.7.0", "source": { "type": "git", "url": "https://github.com/composer/class-map-generator.git", - "reference": "ffe442c5974c44a9343e37a0abcb1cc37319f5b9" + "reference": "2373419b7709815ed323ebf18c3c72d03ff4a8a6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/class-map-generator/zipball/ffe442c5974c44a9343e37a0abcb1cc37319f5b9", - "reference": "ffe442c5974c44a9343e37a0abcb1cc37319f5b9", + "url": "https://api.github.com/repos/composer/class-map-generator/zipball/2373419b7709815ed323ebf18c3c72d03ff4a8a6", + "reference": "2373419b7709815ed323ebf18c3c72d03ff4a8a6", "shasum": "" }, "require": { "composer/pcre": "^2.1 || ^3.1", "php": "^7.2 || ^8.0", - "symfony/finder": "^4.4 || ^5.3 || ^6 || ^7" + "symfony/finder": "^4.4 || ^5.3 || ^6 || ^7 || ^8" }, "require-dev": { "phpstan/phpstan": "^1.12 || ^2", @@ -1218,7 +1235,7 @@ "phpstan/phpstan-phpunit": "^1 || ^2", "phpstan/phpstan-strict-rules": "^1.1 || ^2", "phpunit/phpunit": "^8", - "symfony/filesystem": "^5.4 || ^6" + "symfony/filesystem": "^5.4 || ^6 || ^7 || ^8" }, "type": "library", "extra": { @@ -1248,7 +1265,7 @@ ], "support": { "issues": "https://github.com/composer/class-map-generator/issues", - "source": "https://github.com/composer/class-map-generator/tree/1.6.0" + "source": "https://github.com/composer/class-map-generator/tree/1.7.0" }, "funding": [ { @@ -1258,13 +1275,9 @@ { "url": "https://github.com/composer", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" } ], - "time": "2025-02-05T10:05:34+00:00" + "time": "2025-11-19T10:41:15+00:00" }, { "name": "composer/composer", @@ -1530,16 +1543,16 @@ }, { "name": "composer/semver", - "version": "3.4.3", + "version": "3.4.4", "source": { "type": "git", "url": "https://github.com/composer/semver.git", - "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12" + "reference": "198166618906cb2de69b95d7d47e5fa8aa1b2b95" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/semver/zipball/4313d26ada5e0c4edfbd1dc481a92ff7bff91f12", - "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12", + "url": "https://api.github.com/repos/composer/semver/zipball/198166618906cb2de69b95d7d47e5fa8aa1b2b95", + "reference": "198166618906cb2de69b95d7d47e5fa8aa1b2b95", "shasum": "" }, "require": { @@ -1591,7 +1604,7 @@ "support": { "irc": "ircs://irc.libera.chat:6697/composer", "issues": "https://github.com/composer/semver/issues", - "source": "https://github.com/composer/semver/tree/3.4.3" + "source": "https://github.com/composer/semver/tree/3.4.4" }, "funding": [ { @@ -1601,34 +1614,30 @@ { "url": "https://github.com/composer", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" } ], - "time": "2024-09-19T14:15:21+00:00" + "time": "2025-08-20T19:15:30+00:00" }, { "name": "composer/spdx-licenses", - "version": "1.5.8", + "version": "1.5.9", "source": { "type": "git", "url": "https://github.com/composer/spdx-licenses.git", - "reference": "560bdcf8deb88ae5d611c80a2de8ea9d0358cc0a" + "reference": "edf364cefe8c43501e21e88110aac10b284c3c9f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/560bdcf8deb88ae5d611c80a2de8ea9d0358cc0a", - "reference": "560bdcf8deb88ae5d611c80a2de8ea9d0358cc0a", + "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/edf364cefe8c43501e21e88110aac10b284c3c9f", + "reference": "edf364cefe8c43501e21e88110aac10b284c3c9f", "shasum": "" }, "require": { "php": "^5.3.2 || ^7.0 || ^8.0" }, "require-dev": { - "phpstan/phpstan": "^0.12.55", - "symfony/phpunit-bridge": "^4.2 || ^5" + "phpstan/phpstan": "^1.11", + "symfony/phpunit-bridge": "^3 || ^7" }, "type": "library", "extra": { @@ -1671,7 +1680,7 @@ "support": { "irc": "ircs://irc.libera.chat:6697/composer", "issues": "https://github.com/composer/spdx-licenses/issues", - "source": "https://github.com/composer/spdx-licenses/tree/1.5.8" + "source": "https://github.com/composer/spdx-licenses/tree/1.5.9" }, "funding": [ { @@ -1687,7 +1696,7 @@ "type": "tidelift" } ], - "time": "2023-11-20T07:44:33+00:00" + "time": "2025-05-12T21:07:07+00:00" }, { "name": "composer/xdebug-handler", @@ -1757,29 +1766,29 @@ }, { "name": "dealerdirect/phpcodesniffer-composer-installer", - "version": "v1.0.0", + "version": "v1.2.0", "source": { "type": "git", "url": "https://github.com/PHPCSStandards/composer-installer.git", - "reference": "4be43904336affa5c2f70744a348312336afd0da" + "reference": "845eb62303d2ca9b289ef216356568ccc075ffd1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHPCSStandards/composer-installer/zipball/4be43904336affa5c2f70744a348312336afd0da", - "reference": "4be43904336affa5c2f70744a348312336afd0da", + "url": "https://api.github.com/repos/PHPCSStandards/composer-installer/zipball/845eb62303d2ca9b289ef216356568ccc075ffd1", + "reference": "845eb62303d2ca9b289ef216356568ccc075ffd1", "shasum": "" }, "require": { - "composer-plugin-api": "^1.0 || ^2.0", + "composer-plugin-api": "^2.2", "php": ">=5.4", - "squizlabs/php_codesniffer": "^2.0 || ^3.1.0 || ^4.0" + "squizlabs/php_codesniffer": "^3.1.0 || ^4.0" }, "require-dev": { - "composer/composer": "*", + "composer/composer": "^2.2", "ext-json": "*", "ext-zip": "*", - "php-parallel-lint/php-parallel-lint": "^1.3.1", - "phpcompatibility/php-compatibility": "^9.0", + "php-parallel-lint/php-parallel-lint": "^1.4.0", + "phpcompatibility/php-compatibility": "^9.0 || ^10.0.0@dev", "yoast/phpunit-polyfills": "^1.0" }, "type": "composer-plugin", @@ -1798,9 +1807,9 @@ "authors": [ { "name": "Franck Nijhof", - "email": "franck.nijhof@dealerdirect.com", - "homepage": "http://www.frenck.nl", - "role": "Developer / IT Manager" + "email": "opensource@frenck.dev", + "homepage": "https://frenck.dev", + "role": "Open source developer" }, { "name": "Contributors", @@ -1808,7 +1817,6 @@ } ], "description": "PHP_CodeSniffer Standards Composer Installer Plugin", - "homepage": "http://www.dealerdirect.com", "keywords": [ "PHPCodeSniffer", "PHP_CodeSniffer", @@ -1829,9 +1837,28 @@ ], "support": { "issues": "https://github.com/PHPCSStandards/composer-installer/issues", + "security": "https://github.com/PHPCSStandards/composer-installer/security/policy", "source": "https://github.com/PHPCSStandards/composer-installer" }, - "time": "2023-01-05T11:28:13+00:00" + "funding": [ + { + "url": "https://github.com/PHPCSStandards", + "type": "github" + }, + { + "url": "https://github.com/jrfnl", + "type": "github" + }, + { + "url": "https://opencollective.com/php_codesniffer", + "type": "open_collective" + }, + { + "url": "https://thanks.dev/u/gh/phpcsstandards", + "type": "thanks_dev" + } + ], + "time": "2025-11-11T04:32:07+00:00" }, { "name": "dg/mysql-dump", @@ -1878,33 +1905,32 @@ }, { "name": "doctrine/inflector", - "version": "2.0.10", + "version": "2.1.0", "source": { "type": "git", "url": "https://github.com/doctrine/inflector.git", - "reference": "5817d0659c5b50c9b950feb9af7b9668e2c436bc" + "reference": "6d6c96277ea252fc1304627204c3d5e6e15faa3b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/inflector/zipball/5817d0659c5b50c9b950feb9af7b9668e2c436bc", - "reference": "5817d0659c5b50c9b950feb9af7b9668e2c436bc", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/6d6c96277ea252fc1304627204c3d5e6e15faa3b", + "reference": "6d6c96277ea252fc1304627204c3d5e6e15faa3b", "shasum": "" }, "require": { "php": "^7.2 || ^8.0" }, "require-dev": { - "doctrine/coding-standard": "^11.0", - "phpstan/phpstan": "^1.8", - "phpstan/phpstan-phpunit": "^1.1", - "phpstan/phpstan-strict-rules": "^1.3", - "phpunit/phpunit": "^8.5 || ^9.5", - "vimeo/psalm": "^4.25 || ^5.4" + "doctrine/coding-standard": "^12.0 || ^13.0", + "phpstan/phpstan": "^1.12 || ^2.0", + "phpstan/phpstan-phpunit": "^1.4 || ^2.0", + "phpstan/phpstan-strict-rules": "^1.6 || ^2.0", + "phpunit/phpunit": "^8.5 || ^12.2" }, "type": "library", "autoload": { "psr-4": { - "Doctrine\\Inflector\\": "lib/Doctrine/Inflector" + "Doctrine\\Inflector\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -1949,7 +1975,7 @@ ], "support": { "issues": "https://github.com/doctrine/inflector/issues", - "source": "https://github.com/doctrine/inflector/tree/2.0.10" + "source": "https://github.com/doctrine/inflector/tree/2.1.0" }, "funding": [ { @@ -1965,7 +1991,7 @@ "type": "tidelift" } ], - "time": "2024-02-18T20:23:39+00:00" + "time": "2025-08-10T19:31:58+00:00" }, { "name": "doctrine/instantiator", @@ -2178,16 +2204,16 @@ }, { "name": "gettext/languages", - "version": "2.10.0", + "version": "2.12.1", "source": { "type": "git", "url": "https://github.com/php-gettext/Languages.git", - "reference": "4d61d67fe83a2ad85959fe6133d6d9ba7dddd1ab" + "reference": "0b0b0851c55168e1dfb14305735c64019732b5f1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-gettext/Languages/zipball/4d61d67fe83a2ad85959fe6133d6d9ba7dddd1ab", - "reference": "4d61d67fe83a2ad85959fe6133d6d9ba7dddd1ab", + "url": "https://api.github.com/repos/php-gettext/Languages/zipball/0b0b0851c55168e1dfb14305735c64019732b5f1", + "reference": "0b0b0851c55168e1dfb14305735c64019732b5f1", "shasum": "" }, "require": { @@ -2197,7 +2223,8 @@ "phpunit/phpunit": "^4.8 || ^5.7 || ^6.5 || ^7.5 || ^8.4" }, "bin": [ - "bin/export-plural-rules" + "bin/export-plural-rules", + "bin/import-cldr-data" ], "type": "library", "autoload": { @@ -2236,7 +2263,7 @@ ], "support": { "issues": "https://github.com/php-gettext/Languages/issues", - "source": "https://github.com/php-gettext/Languages/tree/2.10.0" + "source": "https://github.com/php-gettext/Languages/tree/2.12.1" }, "funding": [ { @@ -2248,26 +2275,26 @@ "type": "github" } ], - "time": "2022-10-18T15:00:10+00:00" + "time": "2025-03-19T11:14:02+00:00" }, { "name": "guzzlehttp/guzzle", - "version": "7.9.2", + "version": "7.10.0", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "d281ed313b989f213357e3be1a179f02196ac99b" + "reference": "b51ac707cfa420b7bfd4e4d5e510ba8008e822b4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/d281ed313b989f213357e3be1a179f02196ac99b", - "reference": "d281ed313b989f213357e3be1a179f02196ac99b", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/b51ac707cfa420b7bfd4e4d5e510ba8008e822b4", + "reference": "b51ac707cfa420b7bfd4e4d5e510ba8008e822b4", "shasum": "" }, "require": { "ext-json": "*", - "guzzlehttp/promises": "^1.5.3 || ^2.0.3", - "guzzlehttp/psr7": "^2.7.0", + "guzzlehttp/promises": "^2.3", + "guzzlehttp/psr7": "^2.8", "php": "^7.2.5 || ^8.0", "psr/http-client": "^1.0", "symfony/deprecation-contracts": "^2.2 || ^3.0" @@ -2358,7 +2385,7 @@ ], "support": { "issues": "https://github.com/guzzle/guzzle/issues", - "source": "https://github.com/guzzle/guzzle/tree/7.9.2" + "source": "https://github.com/guzzle/guzzle/tree/7.10.0" }, "funding": [ { @@ -2374,20 +2401,20 @@ "type": "tidelift" } ], - "time": "2024-07-24T11:22:20+00:00" + "time": "2025-08-23T22:36:01+00:00" }, { "name": "guzzlehttp/promises", - "version": "2.0.4", + "version": "2.3.0", "source": { "type": "git", "url": "https://github.com/guzzle/promises.git", - "reference": "f9c436286ab2892c7db7be8c8da4ef61ccf7b455" + "reference": "481557b130ef3790cf82b713667b43030dc9c957" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/f9c436286ab2892c7db7be8c8da4ef61ccf7b455", - "reference": "f9c436286ab2892c7db7be8c8da4ef61ccf7b455", + "url": "https://api.github.com/repos/guzzle/promises/zipball/481557b130ef3790cf82b713667b43030dc9c957", + "reference": "481557b130ef3790cf82b713667b43030dc9c957", "shasum": "" }, "require": { @@ -2395,7 +2422,7 @@ }, "require-dev": { "bamarni/composer-bin-plugin": "^1.8.2", - "phpunit/phpunit": "^8.5.39 || ^9.6.20" + "phpunit/phpunit": "^8.5.44 || ^9.6.25" }, "type": "library", "extra": { @@ -2441,7 +2468,7 @@ ], "support": { "issues": "https://github.com/guzzle/promises/issues", - "source": "https://github.com/guzzle/promises/tree/2.0.4" + "source": "https://github.com/guzzle/promises/tree/2.3.0" }, "funding": [ { @@ -2457,20 +2484,20 @@ "type": "tidelift" } ], - "time": "2024-10-17T10:06:22+00:00" + "time": "2025-08-22T14:34:08+00:00" }, { "name": "guzzlehttp/psr7", - "version": "2.7.0", + "version": "2.8.0", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "a70f5c95fb43bc83f07c9c948baa0dc1829bf201" + "reference": "21dc724a0583619cd1652f673303492272778051" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/a70f5c95fb43bc83f07c9c948baa0dc1829bf201", - "reference": "a70f5c95fb43bc83f07c9c948baa0dc1829bf201", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/21dc724a0583619cd1652f673303492272778051", + "reference": "21dc724a0583619cd1652f673303492272778051", "shasum": "" }, "require": { @@ -2486,7 +2513,7 @@ "require-dev": { "bamarni/composer-bin-plugin": "^1.8.2", "http-interop/http-factory-tests": "0.9.0", - "phpunit/phpunit": "^8.5.39 || ^9.6.20" + "phpunit/phpunit": "^8.5.44 || ^9.6.25" }, "suggest": { "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" @@ -2557,7 +2584,7 @@ ], "support": { "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/2.7.0" + "source": "https://github.com/guzzle/psr7/tree/2.8.0" }, "funding": [ { @@ -2573,35 +2600,38 @@ "type": "tidelift" } ], - "time": "2024-07-18T11:15:46+00:00" + "time": "2025-08-23T21:21:41+00:00" }, { "name": "illuminate/collections", - "version": "v11.42.1", + "version": "v12.42.0", "source": { "type": "git", "url": "https://github.com/illuminate/collections.git", - "reference": "6fd628d32a0989211c4f2829bf0a6a6175b2f3fd" + "reference": "16657effa6a5a4e728f9aeb3e38fb4fa9ba70e7d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/illuminate/collections/zipball/6fd628d32a0989211c4f2829bf0a6a6175b2f3fd", - "reference": "6fd628d32a0989211c4f2829bf0a6a6175b2f3fd", + "url": "https://api.github.com/repos/illuminate/collections/zipball/16657effa6a5a4e728f9aeb3e38fb4fa9ba70e7d", + "reference": "16657effa6a5a4e728f9aeb3e38fb4fa9ba70e7d", "shasum": "" }, "require": { - "illuminate/conditionable": "^11.0", - "illuminate/contracts": "^11.0", - "illuminate/macroable": "^11.0", - "php": "^8.2" + "illuminate/conditionable": "^12.0", + "illuminate/contracts": "^12.0", + "illuminate/macroable": "^12.0", + "php": "^8.2", + "symfony/polyfill-php84": "^1.33", + "symfony/polyfill-php85": "^1.33" }, "suggest": { - "symfony/var-dumper": "Required to use the dump method (^7.0)." + "illuminate/http": "Required to convert collections to API resources (^12.0).", + "symfony/var-dumper": "Required to use the dump method (^7.2)." }, "type": "library", "extra": { "branch-alias": { - "dev-master": "11.x-dev" + "dev-master": "12.x-dev" } }, "autoload": { @@ -2629,29 +2659,29 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2025-02-05T10:23:21+00:00" + "time": "2025-12-06T18:08:25+00:00" }, { "name": "illuminate/conditionable", - "version": "v11.42.1", + "version": "v12.42.0", "source": { "type": "git", "url": "https://github.com/illuminate/conditionable.git", - "reference": "911df1bda950a3b799cf80671764e34eede131c6" + "reference": "ec677967c1f2faf90b8428919124d2184a4c9b49" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/illuminate/conditionable/zipball/911df1bda950a3b799cf80671764e34eede131c6", - "reference": "911df1bda950a3b799cf80671764e34eede131c6", + "url": "https://api.github.com/repos/illuminate/conditionable/zipball/ec677967c1f2faf90b8428919124d2184a4c9b49", + "reference": "ec677967c1f2faf90b8428919124d2184a4c9b49", "shasum": "" }, "require": { - "php": "^8.0.2" + "php": "^8.2" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "11.x-dev" + "dev-master": "12.x-dev" } }, "autoload": { @@ -2675,20 +2705,20 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2024-11-21T16:28:56+00:00" + "time": "2025-05-13T15:08:45+00:00" }, { "name": "illuminate/contracts", - "version": "v11.42.1", + "version": "v12.42.0", "source": { "type": "git", "url": "https://github.com/illuminate/contracts.git", - "reference": "b350a3cd8450846325cb49e1cbc1293598b18898" + "reference": "19e8938edb73047017cfbd443b96844b86da4a59" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/illuminate/contracts/zipball/b350a3cd8450846325cb49e1cbc1293598b18898", - "reference": "b350a3cd8450846325cb49e1cbc1293598b18898", + "url": "https://api.github.com/repos/illuminate/contracts/zipball/19e8938edb73047017cfbd443b96844b86da4a59", + "reference": "19e8938edb73047017cfbd443b96844b86da4a59", "shasum": "" }, "require": { @@ -2699,7 +2729,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "11.x-dev" + "dev-master": "12.x-dev" } }, "autoload": { @@ -2723,20 +2753,20 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2025-02-10T14:20:57+00:00" + "time": "2025-11-26T21:36:01+00:00" }, { "name": "illuminate/macroable", - "version": "v11.42.1", + "version": "v12.42.0", "source": { "type": "git", "url": "https://github.com/illuminate/macroable.git", - "reference": "e1cb9e51b9ed5d3c9bc1ab431d0a52fe42a990ed" + "reference": "e862e5648ee34004fa56046b746f490dfa86c613" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/illuminate/macroable/zipball/e1cb9e51b9ed5d3c9bc1ab431d0a52fe42a990ed", - "reference": "e1cb9e51b9ed5d3c9bc1ab431d0a52fe42a990ed", + "url": "https://api.github.com/repos/illuminate/macroable/zipball/e862e5648ee34004fa56046b746f490dfa86c613", + "reference": "e862e5648ee34004fa56046b746f490dfa86c613", "shasum": "" }, "require": { @@ -2745,7 +2775,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "11.x-dev" + "dev-master": "12.x-dev" } }, "autoload": { @@ -2769,20 +2799,71 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2024-06-28T20:10:30+00:00" + "time": "2024-07-23T16:31:01+00:00" + }, + { + "name": "illuminate/reflection", + "version": "v12.42.0", + "source": { + "type": "git", + "url": "https://github.com/illuminate/reflection.git", + "reference": "7b86bc570d5b75e4a3ad79f8cca1491ba24b7c75" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/reflection/zipball/7b86bc570d5b75e4a3ad79f8cca1491ba24b7c75", + "reference": "7b86bc570d5b75e4a3ad79f8cca1491ba24b7c75", + "shasum": "" + }, + "require": { + "illuminate/collections": "^12.0", + "illuminate/contracts": "^12.0", + "php": "^8.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "12.x-dev" + } + }, + "autoload": { + "files": [ + "helpers.php" + ], + "psr-4": { + "Illuminate\\Support\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Reflection package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2025-12-09T15:11:22+00:00" }, { "name": "illuminate/support", - "version": "v11.42.1", + "version": "v12.42.0", "source": { "type": "git", "url": "https://github.com/illuminate/support.git", - "reference": "047a52ac6464f7861ff05e00464fe41ed2117e9a" + "reference": "d35411be5657e0b5560a5885f3c9140e4cbe0be5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/illuminate/support/zipball/047a52ac6464f7861ff05e00464fe41ed2117e9a", - "reference": "047a52ac6464f7861ff05e00464fe41ed2117e9a", + "url": "https://api.github.com/repos/illuminate/support/zipball/d35411be5657e0b5560a5885f3c9140e4cbe0be5", + "reference": "d35411be5657e0b5560a5885f3c9140e4cbe0be5", "shasum": "" }, "require": { @@ -2790,12 +2871,15 @@ "ext-ctype": "*", "ext-filter": "*", "ext-mbstring": "*", - "illuminate/collections": "^11.0", - "illuminate/conditionable": "^11.0", - "illuminate/contracts": "^11.0", - "illuminate/macroable": "^11.0", - "nesbot/carbon": "^2.72.6|^3.8.4", + "illuminate/collections": "^12.0", + "illuminate/conditionable": "^12.0", + "illuminate/contracts": "^12.0", + "illuminate/macroable": "^12.0", + "illuminate/reflection": "^12.0", + "nesbot/carbon": "^3.8.4", "php": "^8.2", + "symfony/polyfill-php83": "^1.33", + "symfony/polyfill-php85": "^1.33", "voku/portable-ascii": "^2.0.2" }, "conflict": { @@ -2805,20 +2889,20 @@ "spatie/once": "*" }, "suggest": { - "illuminate/filesystem": "Required to use the Composer class (^11.0).", + "illuminate/filesystem": "Required to use the Composer class (^12.0).", "laravel/serializable-closure": "Required to use the once function (^1.3|^2.0).", - "league/commonmark": "Required to use Str::markdown() and Stringable::markdown() (^2.6).", + "league/commonmark": "Required to use Str::markdown() and Stringable::markdown() (^2.7).", "league/uri": "Required to use the Uri class (^7.5.1).", "ramsey/uuid": "Required to use Str::uuid() (^4.7).", - "symfony/process": "Required to use the Composer class (^7.0).", - "symfony/uid": "Required to use Str::ulid() (^7.0).", - "symfony/var-dumper": "Required to use the dd function (^7.0).", + "symfony/process": "Required to use the Composer class (^7.2).", + "symfony/uid": "Required to use Str::ulid() (^7.2).", + "symfony/var-dumper": "Required to use the dd function (^7.2).", "vlucas/phpdotenv": "Required to use the Env class and env helper (^5.6.1)." }, "type": "library", "extra": { "branch-alias": { - "dev-master": "11.x-dev" + "dev-master": "12.x-dev" } }, "autoload": { @@ -2846,7 +2930,7 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2025-02-11T21:36:04+00:00" + "time": "2025-12-09T15:26:52+00:00" }, { "name": "ivome/graphql-relay-php", @@ -3076,16 +3160,16 @@ }, { "name": "mck89/peast", - "version": "v1.16.3", + "version": "v1.17.4", "source": { "type": "git", "url": "https://github.com/mck89/peast.git", - "reference": "645ec21b650bc2aced18285c85f220d22afc1430" + "reference": "c6a63f32410d2e4ee2cd20fe94b35af147fb852d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/mck89/peast/zipball/645ec21b650bc2aced18285c85f220d22afc1430", - "reference": "645ec21b650bc2aced18285c85f220d22afc1430", + "url": "https://api.github.com/repos/mck89/peast/zipball/c6a63f32410d2e4ee2cd20fe94b35af147fb852d", + "reference": "c6a63f32410d2e4ee2cd20fe94b35af147fb852d", "shasum": "" }, "require": { @@ -3098,7 +3182,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.16.3-dev" + "dev-master": "1.17.4-dev" } }, "autoload": { @@ -3119,9 +3203,9 @@ "description": "Peast is PHP library that generates AST for JavaScript code", "support": { "issues": "https://github.com/mck89/peast/issues", - "source": "https://github.com/mck89/peast/tree/v1.16.3" + "source": "https://github.com/mck89/peast/tree/v1.17.4" }, - "time": "2024-07-23T14:00:32+00:00" + "time": "2025-10-10T12:53:17+00:00" }, { "name": "mikehaertl/php-shellcommand", @@ -3234,68 +3318,18 @@ }, "time": "2021-09-30T13:48:57+00:00" }, - { - "name": "mustache/mustache", - "version": "v2.14.2", - "source": { - "type": "git", - "url": "https://github.com/bobthecow/mustache.php.git", - "reference": "e62b7c3849d22ec55f3ec425507bf7968193a6cb" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/bobthecow/mustache.php/zipball/e62b7c3849d22ec55f3ec425507bf7968193a6cb", - "reference": "e62b7c3849d22ec55f3ec425507bf7968193a6cb", - "shasum": "" - }, - "require": { - "php": ">=5.2.4" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "~1.11", - "phpunit/phpunit": "~3.7|~4.0|~5.0" - }, - "type": "library", - "autoload": { - "psr-0": { - "Mustache": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Justin Hileman", - "email": "justin@justinhileman.info", - "homepage": "http://justinhileman.com" - } - ], - "description": "A Mustache implementation in PHP.", - "homepage": "https://github.com/bobthecow/mustache.php", - "keywords": [ - "mustache", - "templating" - ], - "support": { - "issues": "https://github.com/bobthecow/mustache.php/issues", - "source": "https://github.com/bobthecow/mustache.php/tree/v2.14.2" - }, - "time": "2022-08-23T13:07:01+00:00" - }, { "name": "myclabs/deep-copy", - "version": "1.13.0", + "version": "1.13.4", "source": { "type": "git", "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "024473a478be9df5fdaca2c793f2232fe788e414" + "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/024473a478be9df5fdaca2c793f2232fe788e414", - "reference": "024473a478be9df5fdaca2c793f2232fe788e414", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/07d290f0c47959fd5eed98c95ee5602db07e0b6a", + "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a", "shasum": "" }, "require": { @@ -3334,7 +3368,7 @@ ], "support": { "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.13.0" + "source": "https://github.com/myclabs/DeepCopy/tree/1.13.4" }, "funding": [ { @@ -3342,7 +3376,7 @@ "type": "tidelift" } ], - "time": "2025-02-12T12:17:51+00:00" + "time": "2025-08-01T08:46:24+00:00" }, { "name": "nb/oxymel", @@ -3391,16 +3425,16 @@ }, { "name": "nesbot/carbon", - "version": "3.8.5", + "version": "3.11.0", "source": { "type": "git", "url": "https://github.com/CarbonPHP/carbon.git", - "reference": "b1a53a27898639579a67de42e8ced5d5386aa9a4" + "reference": "bdb375400dcd162624531666db4799b36b64e4a1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/b1a53a27898639579a67de42e8ced5d5386aa9a4", - "reference": "b1a53a27898639579a67de42e8ced5d5386aa9a4", + "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/bdb375400dcd162624531666db4799b36b64e4a1", + "reference": "bdb375400dcd162624531666db4799b36b64e4a1", "shasum": "" }, "require": { @@ -3408,9 +3442,9 @@ "ext-json": "*", "php": "^8.1", "psr/clock": "^1.0", - "symfony/clock": "^6.3 || ^7.0", + "symfony/clock": "^6.3.12 || ^7.0 || ^8.0", "symfony/polyfill-mbstring": "^1.0", - "symfony/translation": "^4.4.18 || ^5.2.1|| ^6.0 || ^7.0" + "symfony/translation": "^4.4.18 || ^5.2.1 || ^6.0 || ^7.0 || ^8.0" }, "provide": { "psr/clock-implementation": "1.0" @@ -3418,14 +3452,13 @@ "require-dev": { "doctrine/dbal": "^3.6.3 || ^4.0", "doctrine/orm": "^2.15.2 || ^3.0", - "friendsofphp/php-cs-fixer": "^3.57.2", + "friendsofphp/php-cs-fixer": "^v3.87.1", "kylekatarnls/multi-tester": "^2.5.3", - "ondrejmirtes/better-reflection": "^6.25.0.4", "phpmd/phpmd": "^2.15.0", - "phpstan/extension-installer": "^1.3.1", - "phpstan/phpstan": "^1.11.2", - "phpunit/phpunit": "^10.5.20", - "squizlabs/php_codesniffer": "^3.9.0" + "phpstan/extension-installer": "^1.4.3", + "phpstan/phpstan": "^2.1.22", + "phpunit/phpunit": "^10.5.53", + "squizlabs/php_codesniffer": "^3.13.4" }, "bin": [ "bin/carbon" @@ -3493,20 +3526,20 @@ "type": "tidelift" } ], - "time": "2025-02-11T16:28:45+00:00" + "time": "2025-12-02T21:04:28+00:00" }, { "name": "nikic/php-parser", - "version": "v5.4.0", + "version": "v5.7.0", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "447a020a1f875a434d62f2a401f53b82a396e494" + "reference": "dca41cd15c2ac9d055ad70dbfd011130757d1f82" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/447a020a1f875a434d62f2a401f53b82a396e494", - "reference": "447a020a1f875a434d62f2a401f53b82a396e494", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/dca41cd15c2ac9d055ad70dbfd011130757d1f82", + "reference": "dca41cd15c2ac9d055ad70dbfd011130757d1f82", "shasum": "" }, "require": { @@ -3525,7 +3558,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "5.0-dev" + "dev-master": "5.x-dev" } }, "autoload": { @@ -3549,9 +3582,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v5.4.0" + "source": "https://github.com/nikic/PHP-Parser/tree/v5.7.0" }, - "time": "2024-12-30T11:07:19+00:00" + "time": "2025-12-06T11:56:16+00:00" }, { "name": "phar-io/manifest", @@ -3731,25 +3764,28 @@ }, { "name": "php-stubs/wordpress-stubs", - "version": "v6.7.2", + "version": "v6.9.0", "source": { "type": "git", "url": "https://github.com/php-stubs/wordpress-stubs.git", - "reference": "c04f96cb232fab12a3cbcccf5a47767f0665c3f4" + "reference": "5171cb6650e6c583a96943fd6ea0dfa3e1089a8a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-stubs/wordpress-stubs/zipball/c04f96cb232fab12a3cbcccf5a47767f0665c3f4", - "reference": "c04f96cb232fab12a3cbcccf5a47767f0665c3f4", + "url": "https://api.github.com/repos/php-stubs/wordpress-stubs/zipball/5171cb6650e6c583a96943fd6ea0dfa3e1089a8a", + "reference": "5171cb6650e6c583a96943fd6ea0dfa3e1089a8a", "shasum": "" }, + "conflict": { + "phpdocumentor/reflection-docblock": "5.6.1" + }, "require-dev": { "dealerdirect/phpcodesniffer-composer-installer": "^1.0", - "nikic/php-parser": "^4.13", + "nikic/php-parser": "^5.5", "php": "^7.4 || ^8.0", "php-stubs/generator": "^0.8.3", "phpdocumentor/reflection-docblock": "^5.4.1", - "phpstan/phpstan": "^1.11", + "phpstan/phpstan": "^2.1", "phpunit/phpunit": "^9.5", "szepeviktor/phpcs-psr-12-neutron-hybrid-ruleset": "^1.1.1", "wp-coding-standards/wpcs": "3.1.0 as 2.3.0" @@ -3773,9 +3809,9 @@ ], "support": { "issues": "https://github.com/php-stubs/wordpress-stubs/issues", - "source": "https://github.com/php-stubs/wordpress-stubs/tree/v6.7.2" + "source": "https://github.com/php-stubs/wordpress-stubs/tree/v6.9.0" }, - "time": "2025-02-12T04:51:58+00:00" + "time": "2025-12-03T23:06:24+00:00" }, { "name": "php-webdriver/webdriver", @@ -3907,16 +3943,16 @@ }, { "name": "phpcompatibility/phpcompatibility-paragonie", - "version": "1.3.3", + "version": "1.3.4", "source": { "type": "git", "url": "https://github.com/PHPCompatibility/PHPCompatibilityParagonie.git", - "reference": "293975b465e0e709b571cbf0c957c6c0a7b9a2ac" + "reference": "244d7b04fc4bc2117c15f5abe23eb933b5f02bbf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHPCompatibility/PHPCompatibilityParagonie/zipball/293975b465e0e709b571cbf0c957c6c0a7b9a2ac", - "reference": "293975b465e0e709b571cbf0c957c6c0a7b9a2ac", + "url": "https://api.github.com/repos/PHPCompatibility/PHPCompatibilityParagonie/zipball/244d7b04fc4bc2117c15f5abe23eb933b5f02bbf", + "reference": "244d7b04fc4bc2117c15f5abe23eb933b5f02bbf", "shasum": "" }, "require": { @@ -3973,27 +4009,32 @@ { "url": "https://opencollective.com/php_codesniffer", "type": "open_collective" + }, + { + "url": "https://thanks.dev/u/gh/phpcompatibility", + "type": "thanks_dev" } ], - "time": "2024-04-24T21:30:46+00:00" + "time": "2025-09-19T17:43:28+00:00" }, { "name": "phpcompatibility/phpcompatibility-wp", - "version": "2.1.6", + "version": "2.1.8", "source": { "type": "git", "url": "https://github.com/PHPCompatibility/PHPCompatibilityWP.git", - "reference": "80ccb1a7640995edf1b87a4409fa584cd5869469" + "reference": "7c8d18b4d90dac9e86b0869a608fa09158e168fa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHPCompatibility/PHPCompatibilityWP/zipball/80ccb1a7640995edf1b87a4409fa584cd5869469", - "reference": "80ccb1a7640995edf1b87a4409fa584cd5869469", + "url": "https://api.github.com/repos/PHPCompatibility/PHPCompatibilityWP/zipball/7c8d18b4d90dac9e86b0869a608fa09158e168fa", + "reference": "7c8d18b4d90dac9e86b0869a608fa09158e168fa", "shasum": "" }, "require": { "phpcompatibility/php-compatibility": "^9.0", - "phpcompatibility/phpcompatibility-paragonie": "^1.0" + "phpcompatibility/phpcompatibility-paragonie": "^1.0", + "squizlabs/php_codesniffer": "^3.3" }, "require-dev": { "dealerdirect/phpcodesniffer-composer-installer": "^1.0" @@ -4043,9 +4084,13 @@ { "url": "https://opencollective.com/php_codesniffer", "type": "open_collective" + }, + { + "url": "https://thanks.dev/u/gh/phpcompatibility", + "type": "thanks_dev" } ], - "time": "2025-01-16T22:34:19+00:00" + "time": "2025-10-18T00:05:59+00:00" }, { "name": "phpstan/extension-installer", @@ -4097,16 +4142,11 @@ }, { "name": "phpstan/phpstan", - "version": "1.12.18", - "source": { - "type": "git", - "url": "https://github.com/phpstan/phpstan.git", - "reference": "fef9f07814a573399229304bb0046affdf558812" - }, + "version": "1.12.32", "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/fef9f07814a573399229304bb0046affdf558812", - "reference": "fef9f07814a573399229304bb0046affdf558812", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/2770dcdf5078d0b0d53f94317e06affe88419aa8", + "reference": "2770dcdf5078d0b0d53f94317e06affe88419aa8", "shasum": "" }, "require": { @@ -4151,7 +4191,7 @@ "type": "github" } ], - "time": "2025-02-13T12:44:44+00:00" + "time": "2025-09-30T10:16:31+00:00" }, { "name": "phpunit/php-code-coverage", @@ -4474,16 +4514,16 @@ }, { "name": "phpunit/phpunit", - "version": "9.6.22", + "version": "9.6.31", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "f80235cb4d3caa59ae09be3adf1ded27521d1a9c" + "reference": "945d0b7f346a084ce5549e95289962972c4272e5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/f80235cb4d3caa59ae09be3adf1ded27521d1a9c", - "reference": "f80235cb4d3caa59ae09be3adf1ded27521d1a9c", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/945d0b7f346a084ce5549e95289962972c4272e5", + "reference": "945d0b7f346a084ce5549e95289962972c4272e5", "shasum": "" }, "require": { @@ -4494,7 +4534,7 @@ "ext-mbstring": "*", "ext-xml": "*", "ext-xmlwriter": "*", - "myclabs/deep-copy": "^1.12.1", + "myclabs/deep-copy": "^1.13.4", "phar-io/manifest": "^2.0.4", "phar-io/version": "^3.2.1", "php": ">=7.3", @@ -4505,11 +4545,11 @@ "phpunit/php-timer": "^5.0.3", "sebastian/cli-parser": "^1.0.2", "sebastian/code-unit": "^1.0.8", - "sebastian/comparator": "^4.0.8", + "sebastian/comparator": "^4.0.9", "sebastian/diff": "^4.0.6", "sebastian/environment": "^5.1.5", - "sebastian/exporter": "^4.0.6", - "sebastian/global-state": "^5.0.7", + "sebastian/exporter": "^4.0.8", + "sebastian/global-state": "^5.0.8", "sebastian/object-enumerator": "^4.0.4", "sebastian/resource-operations": "^3.0.4", "sebastian/type": "^3.2.1", @@ -4557,7 +4597,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.22" + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.31" }, "funding": [ { @@ -4568,12 +4608,20 @@ "url": "https://github.com/sebastianbergmann", "type": "github" }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, { "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", "type": "tidelift" } ], - "time": "2024-12-05T13:48:26+00:00" + "time": "2025-12-06T07:45:52+00:00" }, { "name": "psr/clock", @@ -5033,23 +5081,23 @@ }, { "name": "react/promise", - "version": "v3.2.0", + "version": "v3.3.0", "source": { "type": "git", "url": "https://github.com/reactphp/promise.git", - "reference": "8a164643313c71354582dc850b42b33fa12a4b63" + "reference": "23444f53a813a3296c1368bb104793ce8d88f04a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/promise/zipball/8a164643313c71354582dc850b42b33fa12a4b63", - "reference": "8a164643313c71354582dc850b42b33fa12a4b63", + "url": "https://api.github.com/repos/reactphp/promise/zipball/23444f53a813a3296c1368bb104793ce8d88f04a", + "reference": "23444f53a813a3296c1368bb104793ce8d88f04a", "shasum": "" }, "require": { "php": ">=7.1.0" }, "require-dev": { - "phpstan/phpstan": "1.10.39 || 1.4.10", + "phpstan/phpstan": "1.12.28 || 1.4.10", "phpunit/phpunit": "^9.6 || ^7.5" }, "type": "library", @@ -5094,7 +5142,7 @@ ], "support": { "issues": "https://github.com/reactphp/promise/issues", - "source": "https://github.com/reactphp/promise/tree/v3.2.0" + "source": "https://github.com/reactphp/promise/tree/v3.3.0" }, "funding": [ { @@ -5102,7 +5150,7 @@ "type": "open_collective" } ], - "time": "2024-05-24T10:39:05+00:00" + "time": "2025-08-19T18:57:03+00:00" }, { "name": "sebastian/cli-parser", @@ -5273,16 +5321,16 @@ }, { "name": "sebastian/comparator", - "version": "4.0.8", + "version": "4.0.9", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "fa0f136dd2334583309d32b62544682ee972b51a" + "reference": "67a2df3a62639eab2cc5906065e9805d4fd5dfc5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/fa0f136dd2334583309d32b62544682ee972b51a", - "reference": "fa0f136dd2334583309d32b62544682ee972b51a", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/67a2df3a62639eab2cc5906065e9805d4fd5dfc5", + "reference": "67a2df3a62639eab2cc5906065e9805d4fd5dfc5", "shasum": "" }, "require": { @@ -5335,15 +5383,27 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/comparator/issues", - "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.8" + "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.9" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/comparator", + "type": "tidelift" } ], - "time": "2022-09-14T12:41:17+00:00" + "time": "2025-08-10T06:51:50+00:00" }, { "name": "sebastian/complexity", @@ -5533,16 +5593,16 @@ }, { "name": "sebastian/exporter", - "version": "4.0.6", + "version": "4.0.8", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "78c00df8f170e02473b682df15bfcdacc3d32d72" + "reference": "14c6ba52f95a36c3d27c835d65efc7123c446e8c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/78c00df8f170e02473b682df15bfcdacc3d32d72", - "reference": "78c00df8f170e02473b682df15bfcdacc3d32d72", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/14c6ba52f95a36c3d27c835d65efc7123c446e8c", + "reference": "14c6ba52f95a36c3d27c835d65efc7123c446e8c", "shasum": "" }, "require": { @@ -5598,28 +5658,40 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/exporter/issues", - "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.6" + "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.8" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/exporter", + "type": "tidelift" } ], - "time": "2024-03-02T06:33:00+00:00" + "time": "2025-09-24T06:03:27+00:00" }, { "name": "sebastian/global-state", - "version": "5.0.7", + "version": "5.0.8", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9" + "reference": "b6781316bdcd28260904e7cc18ec983d0d2ef4f6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9", - "reference": "bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/b6781316bdcd28260904e7cc18ec983d0d2ef4f6", + "reference": "b6781316bdcd28260904e7cc18ec983d0d2ef4f6", "shasum": "" }, "require": { @@ -5662,15 +5734,27 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/global-state/issues", - "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.7" + "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.8" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/global-state", + "type": "tidelift" } ], - "time": "2024-03-02T06:35:11+00:00" + "time": "2025-08-10T07:10:35+00:00" }, { "name": "sebastian/lines-of-code", @@ -5843,16 +5927,16 @@ }, { "name": "sebastian/recursion-context", - "version": "4.0.5", + "version": "4.0.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1" + "reference": "539c6691e0623af6dc6f9c20384c120f963465a0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1", - "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/539c6691e0623af6dc6f9c20384c120f963465a0", + "reference": "539c6691e0623af6dc6f9c20384c120f963465a0", "shasum": "" }, "require": { @@ -5894,15 +5978,27 @@ "homepage": "https://github.com/sebastianbergmann/recursion-context", "support": { "issues": "https://github.com/sebastianbergmann/recursion-context/issues", - "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.5" + "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.6" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/recursion-context", + "type": "tidelift" } ], - "time": "2023-02-03T06:07:39+00:00" + "time": "2025-08-10T06:57:39+00:00" }, { "name": "sebastian/resource-operations", @@ -6242,28 +6338,27 @@ }, { "name": "sirbrillig/phpcs-variable-analysis", - "version": "v2.11.22", + "version": "v2.13.0", "source": { "type": "git", "url": "https://github.com/sirbrillig/phpcs-variable-analysis.git", - "reference": "ffb6f16c6033ec61ed84446b479a31d6529f0eb7" + "reference": "a15e970b8a0bf64cfa5e86d941f5e6b08855f369" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sirbrillig/phpcs-variable-analysis/zipball/ffb6f16c6033ec61ed84446b479a31d6529f0eb7", - "reference": "ffb6f16c6033ec61ed84446b479a31d6529f0eb7", + "url": "https://api.github.com/repos/sirbrillig/phpcs-variable-analysis/zipball/a15e970b8a0bf64cfa5e86d941f5e6b08855f369", + "reference": "a15e970b8a0bf64cfa5e86d941f5e6b08855f369", "shasum": "" }, "require": { "php": ">=5.4.0", - "squizlabs/php_codesniffer": "^3.5.6" + "squizlabs/php_codesniffer": "^3.5.7 || ^4.0.0" }, "require-dev": { "dealerdirect/phpcodesniffer-composer-installer": "^0.7 || ^1.0", - "phpcsstandards/phpcsdevcs": "^1.1", - "phpstan/phpstan": "^1.7", + "phpstan/phpstan": "^1.7 || ^2.0", "phpunit/phpunit": "^4.8.36 || ^5.7.21 || ^6.5 || ^7.0 || ^8.0 || ^9.0 || ^10.5.32 || ^11.3.3", - "vimeo/psalm": "^0.2 || ^0.3 || ^1.1 || ^4.24 || ^5.0" + "vimeo/psalm": "^0.2 || ^0.3 || ^1.1 || ^4.24 || ^5.0 || ^6.0 || ^7.0" }, "type": "phpcodesniffer-standard", "autoload": { @@ -6295,7 +6390,7 @@ "source": "https://github.com/sirbrillig/phpcs-variable-analysis", "wiki": "https://github.com/sirbrillig/phpcs-variable-analysis/wiki" }, - "time": "2025-01-06T17:54:24+00:00" + "time": "2025-09-30T22:22:48+00:00" }, { "name": "softcreatr/jsonpath", @@ -6364,16 +6459,16 @@ }, { "name": "squizlabs/php_codesniffer", - "version": "3.11.3", + "version": "3.13.5", "source": { "type": "git", "url": "https://github.com/PHPCSStandards/PHP_CodeSniffer.git", - "reference": "ba05f990e79cbe69b9f35c8c1ac8dca7eecc3a10" + "reference": "0ca86845ce43291e8f5692c7356fccf3bcf02bf4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/ba05f990e79cbe69b9f35c8c1ac8dca7eecc3a10", - "reference": "ba05f990e79cbe69b9f35c8c1ac8dca7eecc3a10", + "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/0ca86845ce43291e8f5692c7356fccf3bcf02bf4", + "reference": "0ca86845ce43291e8f5692c7356fccf3bcf02bf4", "shasum": "" }, "require": { @@ -6390,11 +6485,6 @@ "bin/phpcs" ], "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.x-dev" - } - }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" @@ -6440,11 +6530,11 @@ "type": "open_collective" }, { - "url": "https://thanks.dev/phpcsstandards", + "url": "https://thanks.dev/u/gh/phpcsstandards", "type": "thanks_dev" } ], - "time": "2025-01-23T17:04:15+00:00" + "time": "2025-11-04T16:30:35+00:00" }, { "name": "symfony/browser-kit", @@ -6520,16 +6610,16 @@ }, { "name": "symfony/clock", - "version": "v7.2.0", + "version": "v7.4.0", "source": { "type": "git", "url": "https://github.com/symfony/clock.git", - "reference": "b81435fbd6648ea425d1ee96a2d8e68f4ceacd24" + "reference": "9169f24776edde469914c1e7a1442a50f7a4e110" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/clock/zipball/b81435fbd6648ea425d1ee96a2d8e68f4ceacd24", - "reference": "b81435fbd6648ea425d1ee96a2d8e68f4ceacd24", + "url": "https://api.github.com/repos/symfony/clock/zipball/9169f24776edde469914c1e7a1442a50f7a4e110", + "reference": "9169f24776edde469914c1e7a1442a50f7a4e110", "shasum": "" }, "require": { @@ -6574,7 +6664,7 @@ "time" ], "support": { - "source": "https://github.com/symfony/clock/tree/v7.2.0" + "source": "https://github.com/symfony/clock/tree/v7.4.0" }, "funding": [ { @@ -6585,12 +6675,16 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-09-25T14:21:43+00:00" + "time": "2025-11-12T15:39:26+00:00" }, { "name": "symfony/console", @@ -6759,16 +6853,16 @@ }, { "name": "symfony/deprecation-contracts", - "version": "v3.5.1", + "version": "v3.6.0", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6" + "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6", - "reference": "74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/63afe740e99a13ba87ec199bb07bbdee937a5b62", + "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62", "shasum": "" }, "require": { @@ -6781,7 +6875,7 @@ "name": "symfony/contracts" }, "branch-alias": { - "dev-main": "3.5-dev" + "dev-main": "3.6-dev" } }, "autoload": { @@ -6806,7 +6900,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.1" + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.6.0" }, "funding": [ { @@ -6822,7 +6916,7 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:20:29+00:00" + "time": "2024-09-25T14:21:43+00:00" }, { "name": "symfony/dom-crawler", @@ -6986,16 +7080,16 @@ }, { "name": "symfony/event-dispatcher-contracts", - "version": "v3.5.1", + "version": "v3.6.0", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "7642f5e970b672283b7823222ae8ef8bbc160b9f" + "reference": "59eb412e93815df44f05f342958efa9f46b1e586" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/7642f5e970b672283b7823222ae8ef8bbc160b9f", - "reference": "7642f5e970b672283b7823222ae8ef8bbc160b9f", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/59eb412e93815df44f05f342958efa9f46b1e586", + "reference": "59eb412e93815df44f05f342958efa9f46b1e586", "shasum": "" }, "require": { @@ -7009,7 +7103,7 @@ "name": "symfony/contracts" }, "branch-alias": { - "dev-main": "3.5-dev" + "dev-main": "3.6-dev" } }, "autoload": { @@ -7042,7 +7136,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.5.1" + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.6.0" }, "funding": [ { @@ -7058,20 +7152,20 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:20:29+00:00" + "time": "2024-09-25T14:21:43+00:00" }, { "name": "symfony/filesystem", - "version": "v7.2.0", + "version": "v7.4.0", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "b8dce482de9d7c9fe2891155035a7248ab5c7fdb" + "reference": "d551b38811096d0be9c4691d406991b47c0c630a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/b8dce482de9d7c9fe2891155035a7248ab5c7fdb", - "reference": "b8dce482de9d7c9fe2891155035a7248ab5c7fdb", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/d551b38811096d0be9c4691d406991b47c0c630a", + "reference": "d551b38811096d0be9c4691d406991b47c0c630a", "shasum": "" }, "require": { @@ -7080,7 +7174,7 @@ "symfony/polyfill-mbstring": "~1.8" }, "require-dev": { - "symfony/process": "^6.4|^7.0" + "symfony/process": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { @@ -7108,7 +7202,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v7.2.0" + "source": "https://github.com/symfony/filesystem/tree/v7.4.0" }, "funding": [ { @@ -7119,12 +7213,16 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-10-25T15:15:23+00:00" + "time": "2025-11-27T13:27:24+00:00" }, { "name": "symfony/finder", @@ -7191,7 +7289,7 @@ }, { "name": "symfony/polyfill-ctype", - "version": "v1.31.0", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", @@ -7250,7 +7348,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.33.0" }, "funding": [ { @@ -7261,6 +7359,10 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" @@ -7270,16 +7372,16 @@ }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.31.0", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe" + "reference": "380872130d3a5dd3ace2f4010d95125fde5d5c70" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", - "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/380872130d3a5dd3ace2f4010d95125fde5d5c70", + "reference": "380872130d3a5dd3ace2f4010d95125fde5d5c70", "shasum": "" }, "require": { @@ -7328,7 +7430,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.33.0" }, "funding": [ { @@ -7339,16 +7441,20 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2025-06-27T09:58:17+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.31.0", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", @@ -7409,7 +7515,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.33.0" }, "funding": [ { @@ -7420,6 +7526,10 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" @@ -7429,19 +7539,20 @@ }, { "name": "symfony/polyfill-mbstring", - "version": "v1.31.0", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341" + "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/85181ba99b2345b0ef10ce42ecac37612d9fd341", - "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/6d857f4d76bd4b343eac26d6b539585d2bc56493", + "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493", "shasum": "" }, "require": { + "ext-iconv": "*", "php": ">=7.2" }, "provide": { @@ -7489,7 +7600,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.33.0" }, "funding": [ { @@ -7500,16 +7611,20 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2024-12-23T08:48:59+00:00" }, { "name": "symfony/polyfill-php73", - "version": "v1.31.0", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php73.git", @@ -7565,7 +7680,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-php73/tree/v1.33.0" }, "funding": [ { @@ -7576,6 +7691,10 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" @@ -7585,16 +7704,16 @@ }, { "name": "symfony/polyfill-php80", - "version": "v1.31.0", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8" + "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", - "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/0cc9dd0f17f61d8131e7df6b84bd344899fe2608", + "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608", "shasum": "" }, "require": { @@ -7645,7 +7764,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.33.0" }, "funding": [ { @@ -7656,16 +7775,20 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2025-01-02T08:10:11+00:00" }, { "name": "symfony/polyfill-php81", - "version": "v1.31.0", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php81.git", @@ -7721,7 +7844,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php81/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-php81/tree/v1.33.0" }, "funding": [ { @@ -7732,6 +7855,10 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" @@ -7741,16 +7868,16 @@ }, { "name": "symfony/polyfill-php83", - "version": "v1.31.0", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php83.git", - "reference": "2fb86d65e2d424369ad2905e83b236a8805ba491" + "reference": "17f6f9a6b1735c0f163024d959f700cfbc5155e5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/2fb86d65e2d424369ad2905e83b236a8805ba491", - "reference": "2fb86d65e2d424369ad2905e83b236a8805ba491", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/17f6f9a6b1735c0f163024d959f700cfbc5155e5", + "reference": "17f6f9a6b1735c0f163024d959f700cfbc5155e5", "shasum": "" }, "require": { @@ -7797,7 +7924,87 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php83/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-php83/tree/v1.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-07-08T02:45:35+00:00" + }, + { + "name": "symfony/polyfill-php84", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php84.git", + "reference": "d8ced4d875142b6a7426000426b8abc631d6b191" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/d8ced4d875142b6a7426000426b8abc631d6b191", + "reference": "d8ced4d875142b6a7426000426b8abc631d6b191", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php84\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.4+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php84/tree/v1.33.0" }, "funding": [ { @@ -7808,25 +8015,109 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2025-06-24T13:30:11+00:00" + }, + { + "name": "symfony/polyfill-php85", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php85.git", + "reference": "d4e5fcd4ab3d998ab16c0db48e6cbb9a01993f91" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php85/zipball/d4e5fcd4ab3d998ab16c0db48e6cbb9a01993f91", + "reference": "d4e5fcd4ab3d998ab16c0db48e6cbb9a01993f91", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php85\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.5+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php85/tree/v1.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-06-23T16:12:55+00:00" }, { "name": "symfony/process", - "version": "v7.2.0", + "version": "v7.4.0", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "d34b22ba9390ec19d2dd966c40aa9e8462f27a7e" + "reference": "7ca8dc2d0dcf4882658313aba8be5d9fd01026c8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/d34b22ba9390ec19d2dd966c40aa9e8462f27a7e", - "reference": "d34b22ba9390ec19d2dd966c40aa9e8462f27a7e", + "url": "https://api.github.com/repos/symfony/process/zipball/7ca8dc2d0dcf4882658313aba8be5d9fd01026c8", + "reference": "7ca8dc2d0dcf4882658313aba8be5d9fd01026c8", "shasum": "" }, "require": { @@ -7858,7 +8149,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v7.2.0" + "source": "https://github.com/symfony/process/tree/v7.4.0" }, "funding": [ { @@ -7869,25 +8160,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-11-06T14:24:19+00:00" + "time": "2025-10-16T11:21:06+00:00" }, { "name": "symfony/service-contracts", - "version": "v3.5.1", + "version": "v3.6.1", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "e53260aabf78fb3d63f8d79d69ece59f80d5eda0" + "reference": "45112560a3ba2d715666a509a0bc9521d10b6c43" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/e53260aabf78fb3d63f8d79d69ece59f80d5eda0", - "reference": "e53260aabf78fb3d63f8d79d69ece59f80d5eda0", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/45112560a3ba2d715666a509a0bc9521d10b6c43", + "reference": "45112560a3ba2d715666a509a0bc9521d10b6c43", "shasum": "" }, "require": { @@ -7905,7 +8200,7 @@ "name": "symfony/contracts" }, "branch-alias": { - "dev-main": "3.5-dev" + "dev-main": "3.6-dev" } }, "autoload": { @@ -7941,7 +8236,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v3.5.1" + "source": "https://github.com/symfony/service-contracts/tree/v3.6.1" }, "funding": [ { @@ -7952,25 +8247,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-09-25T14:20:29+00:00" + "time": "2025-07-15T11:30:57+00:00" }, { "name": "symfony/string", - "version": "v6.4.15", + "version": "v6.4.30", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "73a5e66ea2e1677c98d4449177c5a9cf9d8b4c6f" + "reference": "50590a057841fa6bf69d12eceffce3465b9e32cb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/73a5e66ea2e1677c98d4449177c5a9cf9d8b4c6f", - "reference": "73a5e66ea2e1677c98d4449177c5a9cf9d8b4c6f", + "url": "https://api.github.com/repos/symfony/string/zipball/50590a057841fa6bf69d12eceffce3465b9e32cb", + "reference": "50590a057841fa6bf69d12eceffce3465b9e32cb", "shasum": "" }, "require": { @@ -7984,7 +8283,6 @@ "symfony/translation-contracts": "<2.5" }, "require-dev": { - "symfony/error-handler": "^5.4|^6.0|^7.0", "symfony/http-client": "^5.4|^6.0|^7.0", "symfony/intl": "^6.2|^7.0", "symfony/translation-contracts": "^2.5|^3.0", @@ -8027,7 +8325,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v6.4.15" + "source": "https://github.com/symfony/string/tree/v6.4.30" }, "funding": [ { @@ -8038,25 +8336,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-11-13T13:31:12+00:00" + "time": "2025-11-21T18:03:05+00:00" }, { "name": "symfony/translation", - "version": "v6.4.13", + "version": "v6.4.30", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "bee9bfabfa8b4045a66bf82520e492cddbaffa66" + "reference": "d1fdeefd0707d15eb150c04e8837bf0b15ebea39" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/bee9bfabfa8b4045a66bf82520e492cddbaffa66", - "reference": "bee9bfabfa8b4045a66bf82520e492cddbaffa66", + "url": "https://api.github.com/repos/symfony/translation/zipball/d1fdeefd0707d15eb150c04e8837bf0b15ebea39", + "reference": "d1fdeefd0707d15eb150c04e8837bf0b15ebea39", "shasum": "" }, "require": { @@ -8122,7 +8424,7 @@ "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/translation/tree/v6.4.13" + "source": "https://github.com/symfony/translation/tree/v6.4.30" }, "funding": [ { @@ -8133,25 +8435,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-09-27T18:14:25+00:00" + "time": "2025-11-24T13:57:00+00:00" }, { "name": "symfony/translation-contracts", - "version": "v3.5.1", + "version": "v3.6.1", "source": { "type": "git", "url": "https://github.com/symfony/translation-contracts.git", - "reference": "4667ff3bd513750603a09c8dedbea942487fb07c" + "reference": "65a8bc82080447fae78373aa10f8d13b38338977" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/4667ff3bd513750603a09c8dedbea942487fb07c", - "reference": "4667ff3bd513750603a09c8dedbea942487fb07c", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/65a8bc82080447fae78373aa10f8d13b38338977", + "reference": "65a8bc82080447fae78373aa10f8d13b38338977", "shasum": "" }, "require": { @@ -8164,7 +8470,7 @@ "name": "symfony/contracts" }, "branch-alias": { - "dev-main": "3.5-dev" + "dev-main": "3.6-dev" } }, "autoload": { @@ -8200,7 +8506,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/translation-contracts/tree/v3.5.1" + "source": "https://github.com/symfony/translation-contracts/tree/v3.6.1" }, "funding": [ { @@ -8211,12 +8517,16 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-09-25T14:20:29+00:00" + "time": "2025-07-15T13:41:35+00:00" }, { "name": "symfony/yaml", @@ -8358,16 +8668,16 @@ }, { "name": "theseer/tokenizer", - "version": "1.2.3", + "version": "1.3.1", "source": { "type": "git", "url": "https://github.com/theseer/tokenizer.git", - "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2" + "reference": "b7489ce515e168639d17feec34b8847c326b0b3c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", - "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/b7489ce515e168639d17feec34b8847c326b0b3c", + "reference": "b7489ce515e168639d17feec34b8847c326b0b3c", "shasum": "" }, "require": { @@ -8396,7 +8706,7 @@ "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", "support": { "issues": "https://github.com/theseer/tokenizer/issues", - "source": "https://github.com/theseer/tokenizer/tree/1.2.3" + "source": "https://github.com/theseer/tokenizer/tree/1.3.1" }, "funding": [ { @@ -8404,7 +8714,7 @@ "type": "github" } ], - "time": "2024-03-03T12:36:25+00:00" + "time": "2025-11-17T20:03:58+00:00" }, { "name": "voku/portable-ascii", @@ -8535,16 +8845,16 @@ }, { "name": "webonyx/graphql-php", - "version": "v15.19.1", + "version": "v15.24.0", "source": { "type": "git", "url": "https://github.com/webonyx/graphql-php.git", - "reference": "fa01712b1a170ddc1d92047011b2f4c2bdfa8234" + "reference": "030a04d22d52d7fc07049d0e3b683d2b40f90457" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/webonyx/graphql-php/zipball/fa01712b1a170ddc1d92047011b2f4c2bdfa8234", - "reference": "fa01712b1a170ddc1d92047011b2f4c2bdfa8234", + "url": "https://api.github.com/repos/webonyx/graphql-php/zipball/030a04d22d52d7fc07049d0e3b683d2b40f90457", + "reference": "030a04d22d52d7fc07049d0e3b683d2b40f90457", "shasum": "" }, "require": { @@ -8557,22 +8867,22 @@ "amphp/http-server": "^2.1", "dms/phpunit-arraysubset-asserts": "dev-master", "ergebnis/composer-normalize": "^2.28", - "friendsofphp/php-cs-fixer": "3.65.0", - "mll-lab/php-cs-fixer-config": "^5.9.2", + "friendsofphp/php-cs-fixer": "3.86.0", + "mll-lab/php-cs-fixer-config": "5.11.0", "nyholm/psr7": "^1.5", "phpbench/phpbench": "^1.2", "phpstan/extension-installer": "^1.1", - "phpstan/phpstan": "1.12.12", - "phpstan/phpstan-phpunit": "1.4.1", - "phpstan/phpstan-strict-rules": "1.6.1", + "phpstan/phpstan": "2.1.22", + "phpstan/phpstan-phpunit": "2.0.7", + "phpstan/phpstan-strict-rules": "2.0.6", "phpunit/phpunit": "^9.5 || ^10.5.21 || ^11", "psr/http-message": "^1 || ^2", "react/http": "^1.6", "react/promise": "^2.0 || ^3.0", - "rector/rector": "^1.0", + "rector/rector": "^2.0", "symfony/polyfill-php81": "^1.23", "symfony/var-exporter": "^5 || ^6 || ^7", - "thecodingmachine/safe": "^1.3 || ^2" + "thecodingmachine/safe": "^1.3 || ^2 || ^3" }, "suggest": { "amphp/http-server": "To leverage async resolving with webserver on AMPHP platform", @@ -8597,7 +8907,7 @@ ], "support": { "issues": "https://github.com/webonyx/graphql-php/issues", - "source": "https://github.com/webonyx/graphql-php/tree/v15.19.1" + "source": "https://github.com/webonyx/graphql-php/tree/v15.24.0" }, "funding": [ { @@ -8605,28 +8915,28 @@ "type": "open_collective" } ], - "time": "2024-12-19T10:52:18+00:00" + "time": "2025-08-20T10:09:37+00:00" }, { "name": "wp-cli/cache-command", - "version": "v2.1.3", + "version": "v2.2.1", "source": { "type": "git", "url": "https://github.com/wp-cli/cache-command.git", - "reference": "1dbb59e5ed126b9a2fa9d521d29910f3f4eb0f97" + "reference": "408bde47b7c19d5701d9cb3c3b1ec90fb70295cd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wp-cli/cache-command/zipball/1dbb59e5ed126b9a2fa9d521d29910f3f4eb0f97", - "reference": "1dbb59e5ed126b9a2fa9d521d29910f3f4eb0f97", + "url": "https://api.github.com/repos/wp-cli/cache-command/zipball/408bde47b7c19d5701d9cb3c3b1ec90fb70295cd", + "reference": "408bde47b7c19d5701d9cb3c3b1ec90fb70295cd", "shasum": "" }, "require": { - "wp-cli/wp-cli": "^2.5" + "wp-cli/wp-cli": "^2.12" }, "require-dev": { "wp-cli/entity-command": "^1.3 || ^2", - "wp-cli/wp-cli-tests": "^4" + "wp-cli/wp-cli-tests": "^5" }, "type": "wp-cli-package", "extra": { @@ -8640,6 +8950,8 @@ "cache flush-group", "cache get", "cache incr", + "cache patch", + "cache pluck", "cache replace", "cache set", "cache supports", @@ -8647,9 +8959,11 @@ "transient", "transient delete", "transient get", + "transient list", + "transient patch", + "transient pluck", "transient set", - "transient type", - "transient list" + "transient type" ], "branch-alias": { "dev-main": "2.x-dev" @@ -8678,30 +8992,30 @@ "homepage": "https://github.com/wp-cli/cache-command", "support": { "issues": "https://github.com/wp-cli/cache-command/issues", - "source": "https://github.com/wp-cli/cache-command/tree/v2.1.3" + "source": "https://github.com/wp-cli/cache-command/tree/v2.2.1" }, - "time": "2024-04-26T14:54:22+00:00" + "time": "2025-11-11T13:30:39+00:00" }, { "name": "wp-cli/checksum-command", - "version": "v2.3.0", + "version": "v2.3.2", "source": { "type": "git", "url": "https://github.com/wp-cli/checksum-command.git", - "reference": "bc82cfb0b1e24eec99cd1bfa515a62c63bd46936" + "reference": "c1b245fde354a05d8f329ce30d580f8d91ab83ef" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wp-cli/checksum-command/zipball/bc82cfb0b1e24eec99cd1bfa515a62c63bd46936", - "reference": "bc82cfb0b1e24eec99cd1bfa515a62c63bd46936", + "url": "https://api.github.com/repos/wp-cli/checksum-command/zipball/c1b245fde354a05d8f329ce30d580f8d91ab83ef", + "reference": "c1b245fde354a05d8f329ce30d580f8d91ab83ef", "shasum": "" }, "require": { - "wp-cli/wp-cli": "^2.5" + "wp-cli/wp-cli": "^2.12" }, "require-dev": { "wp-cli/extension-command": "^1.2 || ^2", - "wp-cli/wp-cli-tests": "^4" + "wp-cli/wp-cli-tests": "^5" }, "type": "wp-cli-package", "extra": { @@ -8737,31 +9051,31 @@ "homepage": "https://github.com/wp-cli/checksum-command", "support": { "issues": "https://github.com/wp-cli/checksum-command/issues", - "source": "https://github.com/wp-cli/checksum-command/tree/v2.3.0" + "source": "https://github.com/wp-cli/checksum-command/tree/v2.3.2" }, - "time": "2024-10-01T21:53:46+00:00" + "time": "2025-11-11T13:30:40+00:00" }, { "name": "wp-cli/config-command", - "version": "v2.3.7", + "version": "v2.4.0", "source": { "type": "git", "url": "https://github.com/wp-cli/config-command.git", - "reference": "effb7898bc6ffdaf8a0666432f3c8e35b715858e" + "reference": "a17b0459c3564903ee2b7cd05df2ee372a13ae82" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wp-cli/config-command/zipball/effb7898bc6ffdaf8a0666432f3c8e35b715858e", - "reference": "effb7898bc6ffdaf8a0666432f3c8e35b715858e", + "url": "https://api.github.com/repos/wp-cli/config-command/zipball/a17b0459c3564903ee2b7cd05df2ee372a13ae82", + "reference": "a17b0459c3564903ee2b7cd05df2ee372a13ae82", "shasum": "" }, "require": { - "wp-cli/wp-cli": "^2.5", + "wp-cli/wp-cli": "^2.12", "wp-cli/wp-config-transformer": "^1.4.0" }, "require-dev": { "wp-cli/db-command": "^1.3 || ^2", - "wp-cli/wp-cli-tests": "^4.2.8" + "wp-cli/wp-cli-tests": "^5" }, "type": "wp-cli-package", "extra": { @@ -8811,34 +9125,34 @@ "homepage": "https://github.com/wp-cli/config-command", "support": { "issues": "https://github.com/wp-cli/config-command/issues", - "source": "https://github.com/wp-cli/config-command/tree/v2.3.7" + "source": "https://github.com/wp-cli/config-command/tree/v2.4.0" }, - "time": "2024-10-01T10:19:18+00:00" + "time": "2025-11-11T13:30:41+00:00" }, { "name": "wp-cli/core-command", - "version": "v2.1.18", + "version": "v2.1.22", "source": { "type": "git", "url": "https://github.com/wp-cli/core-command.git", - "reference": "f7580f93fe66a5584fa7b7c42bd2c0c1435c9d2e" + "reference": "ac6f8d742808e11e349ce099c7de2fc3c7009b84" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wp-cli/core-command/zipball/f7580f93fe66a5584fa7b7c42bd2c0c1435c9d2e", - "reference": "f7580f93fe66a5584fa7b7c42bd2c0c1435c9d2e", + "url": "https://api.github.com/repos/wp-cli/core-command/zipball/ac6f8d742808e11e349ce099c7de2fc3c7009b84", + "reference": "ac6f8d742808e11e349ce099c7de2fc3c7009b84", "shasum": "" }, "require": { "composer/semver": "^1.4 || ^2 || ^3", - "wp-cli/wp-cli": "^2.5.1" + "wp-cli/wp-cli": "^2.12" }, "require-dev": { "wp-cli/checksum-command": "^1 || ^2", "wp-cli/db-command": "^1.3 || ^2", "wp-cli/entity-command": "^1.3 || ^2", "wp-cli/extension-command": "^1.2 || ^2", - "wp-cli/wp-cli-tests": "^4" + "wp-cli/wp-cli-tests": "^5" }, "type": "wp-cli-package", "extra": { @@ -8882,26 +9196,26 @@ "homepage": "https://github.com/wp-cli/core-command", "support": { "issues": "https://github.com/wp-cli/core-command/issues", - "source": "https://github.com/wp-cli/core-command/tree/v2.1.18" + "source": "https://github.com/wp-cli/core-command/tree/v2.1.22" }, - "time": "2024-04-12T09:36:36+00:00" + "time": "2025-09-04T08:14:53+00:00" }, { "name": "wp-cli/cron-command", - "version": "v2.3.1", + "version": "v2.3.2", "source": { "type": "git", "url": "https://github.com/wp-cli/cron-command.git", - "reference": "46f849f2f0ba859c6acd356eefc76769c8381ae5" + "reference": "6f450028a75ebd275f12cad62959a0709bf3e7c1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wp-cli/cron-command/zipball/46f849f2f0ba859c6acd356eefc76769c8381ae5", - "reference": "46f849f2f0ba859c6acd356eefc76769c8381ae5", + "url": "https://api.github.com/repos/wp-cli/cron-command/zipball/6f450028a75ebd275f12cad62959a0709bf3e7c1", + "reference": "6f450028a75ebd275f12cad62959a0709bf3e7c1", "shasum": "" }, "require": { - "wp-cli/wp-cli": "^2.5" + "wp-cli/wp-cli": "^2.12" }, "require-dev": { "wp-cli/entity-command": "^1.3 || ^2", @@ -8951,26 +9265,26 @@ "homepage": "https://github.com/wp-cli/cron-command", "support": { "issues": "https://github.com/wp-cli/cron-command/issues", - "source": "https://github.com/wp-cli/cron-command/tree/v2.3.1" + "source": "https://github.com/wp-cli/cron-command/tree/v2.3.2" }, - "time": "2024-10-01T10:30:28+00:00" + "time": "2025-04-02T11:55:20+00:00" }, { "name": "wp-cli/db-command", - "version": "v2.1.2", + "version": "v2.1.3", "source": { "type": "git", "url": "https://github.com/wp-cli/db-command.git", - "reference": "d4c0dd25ec8b3d0118a2400cf6b87e8d08b77c43" + "reference": "f857c91454d7092fa672bc388512a51752d9264a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wp-cli/db-command/zipball/d4c0dd25ec8b3d0118a2400cf6b87e8d08b77c43", - "reference": "d4c0dd25ec8b3d0118a2400cf6b87e8d08b77c43", + "url": "https://api.github.com/repos/wp-cli/db-command/zipball/f857c91454d7092fa672bc388512a51752d9264a", + "reference": "f857c91454d7092fa672bc388512a51752d9264a", "shasum": "" }, "require": { - "wp-cli/wp-cli": "^2.5" + "wp-cli/wp-cli": "^2.12" }, "require-dev": { "wp-cli/entity-command": "^1.3 || ^2", @@ -9025,30 +9339,30 @@ "homepage": "https://github.com/wp-cli/db-command", "support": { "issues": "https://github.com/wp-cli/db-command/issues", - "source": "https://github.com/wp-cli/db-command/tree/v2.1.2" + "source": "https://github.com/wp-cli/db-command/tree/v2.1.3" }, - "time": "2024-10-01T10:48:48+00:00" + "time": "2025-04-10T11:02:04+00:00" }, { "name": "wp-cli/embed-command", - "version": "v2.0.17", + "version": "v2.1.0", "source": { "type": "git", "url": "https://github.com/wp-cli/embed-command.git", - "reference": "ece56cafcb8ef0a05dac9e41b5ab852ecd57b02c" + "reference": "c95faa486bda28883fd9f0b4702ded2b064061b6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wp-cli/embed-command/zipball/ece56cafcb8ef0a05dac9e41b5ab852ecd57b02c", - "reference": "ece56cafcb8ef0a05dac9e41b5ab852ecd57b02c", + "url": "https://api.github.com/repos/wp-cli/embed-command/zipball/c95faa486bda28883fd9f0b4702ded2b064061b6", + "reference": "c95faa486bda28883fd9f0b4702ded2b064061b6", "shasum": "" }, "require": { - "wp-cli/wp-cli": "^2.5" + "wp-cli/wp-cli": "^2.12" }, "require-dev": { "wp-cli/entity-command": "^1.3 || ^2", - "wp-cli/wp-cli-tests": "^4" + "wp-cli/wp-cli-tests": "^5" }, "type": "wp-cli-package", "extra": { @@ -9092,26 +9406,26 @@ "homepage": "https://github.com/wp-cli/embed-command", "support": { "issues": "https://github.com/wp-cli/embed-command/issues", - "source": "https://github.com/wp-cli/embed-command/tree/v2.0.17" + "source": "https://github.com/wp-cli/embed-command/tree/v2.1.0" }, - "time": "2024-10-01T10:30:42+00:00" + "time": "2025-11-11T13:30:46+00:00" }, { "name": "wp-cli/entity-command", - "version": "v2.8.2", + "version": "v2.8.4", "source": { "type": "git", "url": "https://github.com/wp-cli/entity-command.git", - "reference": "9dad0753ecba347d5fbdb6b80d01e38768bca4ea" + "reference": "213611f8ab619ca137d983e9b987f7fbf1ac21d4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wp-cli/entity-command/zipball/9dad0753ecba347d5fbdb6b80d01e38768bca4ea", - "reference": "9dad0753ecba347d5fbdb6b80d01e38768bca4ea", + "url": "https://api.github.com/repos/wp-cli/entity-command/zipball/213611f8ab619ca137d983e9b987f7fbf1ac21d4", + "reference": "213611f8ab619ca137d983e9b987f7fbf1ac21d4", "shasum": "" }, "require": { - "wp-cli/wp-cli": "^2.11" + "wp-cli/wp-cli": "^2.12" }, "require-dev": { "wp-cli/cache-command": "^1 || ^2", @@ -9329,29 +9643,29 @@ "homepage": "https://github.com/wp-cli/entity-command", "support": { "issues": "https://github.com/wp-cli/entity-command/issues", - "source": "https://github.com/wp-cli/entity-command/tree/v2.8.2" + "source": "https://github.com/wp-cli/entity-command/tree/v2.8.4" }, - "time": "2024-10-01T10:44:33+00:00" + "time": "2025-05-06T16:12:49+00:00" }, { "name": "wp-cli/eval-command", - "version": "v2.2.5", + "version": "v2.2.7", "source": { "type": "git", "url": "https://github.com/wp-cli/eval-command.git", - "reference": "1fd2dc9ae74f5fcde7a9b861a1073d6f19952b74" + "reference": "2fb2a9d40861741eafaa1df86ed0dbd62de6e5ca" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wp-cli/eval-command/zipball/1fd2dc9ae74f5fcde7a9b861a1073d6f19952b74", - "reference": "1fd2dc9ae74f5fcde7a9b861a1073d6f19952b74", + "url": "https://api.github.com/repos/wp-cli/eval-command/zipball/2fb2a9d40861741eafaa1df86ed0dbd62de6e5ca", + "reference": "2fb2a9d40861741eafaa1df86ed0dbd62de6e5ca", "shasum": "" }, "require": { - "wp-cli/wp-cli": "^2.5" + "wp-cli/wp-cli": "^2.12" }, "require-dev": { - "wp-cli/wp-cli-tests": "^4" + "wp-cli/wp-cli-tests": "^5" }, "type": "wp-cli-package", "extra": { @@ -9387,27 +9701,27 @@ "homepage": "https://github.com/wp-cli/eval-command", "support": { "issues": "https://github.com/wp-cli/eval-command/issues", - "source": "https://github.com/wp-cli/eval-command/tree/v2.2.5" + "source": "https://github.com/wp-cli/eval-command/tree/v2.2.7" }, - "time": "2024-10-01T10:30:51+00:00" + "time": "2025-12-02T18:17:50+00:00" }, { "name": "wp-cli/export-command", - "version": "v2.1.13", + "version": "v2.1.14", "source": { "type": "git", "url": "https://github.com/wp-cli/export-command.git", - "reference": "eeafa03095b80d2648d1a67b00c688be9d418aff" + "reference": "2af32bf12c1bccd6561a215dbbafc2f272647ee8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wp-cli/export-command/zipball/eeafa03095b80d2648d1a67b00c688be9d418aff", - "reference": "eeafa03095b80d2648d1a67b00c688be9d418aff", + "url": "https://api.github.com/repos/wp-cli/export-command/zipball/2af32bf12c1bccd6561a215dbbafc2f272647ee8", + "reference": "2af32bf12c1bccd6561a215dbbafc2f272647ee8", "shasum": "" }, "require": { "nb/oxymel": "~0.1.0", - "wp-cli/wp-cli": "^2.5" + "wp-cli/wp-cli": "^2.12" }, "require-dev": { "wp-cli/db-command": "^1.3 || ^2", @@ -9450,34 +9764,34 @@ "homepage": "https://github.com/wp-cli/export-command", "support": { "issues": "https://github.com/wp-cli/export-command/issues", - "source": "https://github.com/wp-cli/export-command/tree/v2.1.13" + "source": "https://github.com/wp-cli/export-command/tree/v2.1.14" }, - "time": "2024-10-01T10:31:03+00:00" + "time": "2025-04-02T15:29:08+00:00" }, { "name": "wp-cli/extension-command", - "version": "v2.1.23", + "version": "v2.1.24", "source": { "type": "git", "url": "https://github.com/wp-cli/extension-command.git", - "reference": "c307a11e7ea078cfd52177eefeef9906aa69edcd" + "reference": "d21a2f504ac43a86b6b08697669b5b0844748133" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wp-cli/extension-command/zipball/c307a11e7ea078cfd52177eefeef9906aa69edcd", - "reference": "c307a11e7ea078cfd52177eefeef9906aa69edcd", + "url": "https://api.github.com/repos/wp-cli/extension-command/zipball/d21a2f504ac43a86b6b08697669b5b0844748133", + "reference": "d21a2f504ac43a86b6b08697669b5b0844748133", "shasum": "" }, "require": { "composer/semver": "^1.4 || ^2 || ^3", - "wp-cli/wp-cli": "^2.10" + "wp-cli/wp-cli": "^2.12" }, "require-dev": { "wp-cli/cache-command": "^2.0", "wp-cli/entity-command": "^1.3 || ^2", "wp-cli/language-command": "^2.0", "wp-cli/scaffold-command": "^1.2 || ^2", - "wp-cli/wp-cli-tests": "^4" + "wp-cli/wp-cli-tests": "^4.3.7" }, "type": "wp-cli-package", "extra": { @@ -9548,33 +9862,33 @@ "homepage": "https://github.com/wp-cli/extension-command", "support": { "issues": "https://github.com/wp-cli/extension-command/issues", - "source": "https://github.com/wp-cli/extension-command/tree/v2.1.23" + "source": "https://github.com/wp-cli/extension-command/tree/v2.1.24" }, - "time": "2024-10-01T10:44:18+00:00" + "time": "2025-05-06T19:17:53+00:00" }, { "name": "wp-cli/i18n-command", - "version": "v2.6.3", + "version": "v2.6.6", "source": { "type": "git", "url": "https://github.com/wp-cli/i18n-command.git", - "reference": "065bb3758fcbff922f1b7a01ab702aab0da79803" + "reference": "94f72ddc4be8919f2cea181ba39cd140dd480d64" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wp-cli/i18n-command/zipball/065bb3758fcbff922f1b7a01ab702aab0da79803", - "reference": "065bb3758fcbff922f1b7a01ab702aab0da79803", + "url": "https://api.github.com/repos/wp-cli/i18n-command/zipball/94f72ddc4be8919f2cea181ba39cd140dd480d64", + "reference": "94f72ddc4be8919f2cea181ba39cd140dd480d64", "shasum": "" }, "require": { "eftec/bladeone": "3.52", "gettext/gettext": "^4.8", "mck89/peast": "^1.13.11", - "wp-cli/wp-cli": "^2.5" + "wp-cli/wp-cli": "^2.12" }, "require-dev": { "wp-cli/scaffold-command": "^1.2 || ^2", - "wp-cli/wp-cli-tests": "^4" + "wp-cli/wp-cli-tests": "^5.0.0" }, "suggest": { "ext-json": "Used for reading and generating JSON translation files", @@ -9617,32 +9931,33 @@ "homepage": "https://github.com/wp-cli/i18n-command", "support": { "issues": "https://github.com/wp-cli/i18n-command/issues", - "source": "https://github.com/wp-cli/i18n-command/tree/v2.6.3" + "source": "https://github.com/wp-cli/i18n-command/tree/v2.6.6" }, - "time": "2024-10-01T11:16:25+00:00" + "time": "2025-11-21T04:23:34+00:00" }, { "name": "wp-cli/import-command", - "version": "v2.0.13", + "version": "v2.0.15", "source": { "type": "git", "url": "https://github.com/wp-cli/import-command.git", - "reference": "22f32451046c1d8e7963ff96d95942af14fbb4e9" + "reference": "277de5a245cbf846ec822e23067703c7e3b9cb48" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wp-cli/import-command/zipball/22f32451046c1d8e7963ff96d95942af14fbb4e9", - "reference": "22f32451046c1d8e7963ff96d95942af14fbb4e9", + "url": "https://api.github.com/repos/wp-cli/import-command/zipball/277de5a245cbf846ec822e23067703c7e3b9cb48", + "reference": "277de5a245cbf846ec822e23067703c7e3b9cb48", "shasum": "" }, "require": { - "wp-cli/wp-cli": "^2.5" + "wp-cli/wp-cli": "^2.12" }, "require-dev": { + "wordpress/wordpress-importer": "^0.9", "wp-cli/entity-command": "^1.3 || ^2", "wp-cli/export-command": "^1 || ^2", "wp-cli/extension-command": "^1.2 || ^2", - "wp-cli/wp-cli-tests": "^4" + "wp-cli/wp-cli-tests": "^5" }, "type": "wp-cli-package", "extra": { @@ -9677,32 +9992,32 @@ "homepage": "https://github.com/wp-cli/import-command", "support": { "issues": "https://github.com/wp-cli/import-command/issues", - "source": "https://github.com/wp-cli/import-command/tree/v2.0.13" + "source": "https://github.com/wp-cli/import-command/tree/v2.0.15" }, - "time": "2024-10-01T10:44:58+00:00" + "time": "2025-12-09T15:41:55+00:00" }, { "name": "wp-cli/language-command", - "version": "v2.0.22", + "version": "v2.0.25", "source": { "type": "git", "url": "https://github.com/wp-cli/language-command.git", - "reference": "27db28eca5f7627c7fbd8da82c6c51eb05e7858e" + "reference": "ad1bbfbf2699eff415436a00bb4195900fa1cfe5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wp-cli/language-command/zipball/27db28eca5f7627c7fbd8da82c6c51eb05e7858e", - "reference": "27db28eca5f7627c7fbd8da82c6c51eb05e7858e", + "url": "https://api.github.com/repos/wp-cli/language-command/zipball/ad1bbfbf2699eff415436a00bb4195900fa1cfe5", + "reference": "ad1bbfbf2699eff415436a00bb4195900fa1cfe5", "shasum": "" }, "require": { - "wp-cli/wp-cli": "^2.5" + "wp-cli/wp-cli": "^2.12" }, "require-dev": { "wp-cli/db-command": "^1.3 || ^2", "wp-cli/entity-command": "^1.3 || ^2", "wp-cli/extension-command": "^1.2 || ^2", - "wp-cli/wp-cli-tests": "^4" + "wp-cli/wp-cli-tests": "^5" }, "type": "wp-cli-package", "extra": { @@ -9757,26 +10072,26 @@ "homepage": "https://github.com/wp-cli/language-command", "support": { "issues": "https://github.com/wp-cli/language-command/issues", - "source": "https://github.com/wp-cli/language-command/tree/v2.0.22" + "source": "https://github.com/wp-cli/language-command/tree/v2.0.25" }, - "time": "2024-10-01T10:45:06+00:00" + "time": "2025-09-04T10:30:12+00:00" }, { "name": "wp-cli/maintenance-mode-command", - "version": "v2.1.2", + "version": "v2.1.3", "source": { "type": "git", "url": "https://github.com/wp-cli/maintenance-mode-command.git", - "reference": "d560d7f42fb21e1fc182d69e0cdf06c69891791d" + "reference": "b947e094e00b7b68c6376ec9bd03303515864062" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wp-cli/maintenance-mode-command/zipball/d560d7f42fb21e1fc182d69e0cdf06c69891791d", - "reference": "d560d7f42fb21e1fc182d69e0cdf06c69891791d", + "url": "https://api.github.com/repos/wp-cli/maintenance-mode-command/zipball/b947e094e00b7b68c6376ec9bd03303515864062", + "reference": "b947e094e00b7b68c6376ec9bd03303515864062", "shasum": "" }, "require": { - "wp-cli/wp-cli": "^2.5" + "wp-cli/wp-cli": "^2.12" }, "require-dev": { "wp-cli/wp-cli-tests": "^4" @@ -9818,26 +10133,26 @@ "homepage": "https://github.com/wp-cli/maintenance-mode-command", "support": { "issues": "https://github.com/wp-cli/maintenance-mode-command/issues", - "source": "https://github.com/wp-cli/maintenance-mode-command/tree/v2.1.2" + "source": "https://github.com/wp-cli/maintenance-mode-command/tree/v2.1.3" }, - "time": "2024-10-01T10:45:18+00:00" + "time": "2024-11-24T17:26:30+00:00" }, { "name": "wp-cli/media-command", - "version": "v2.2.1", + "version": "v2.2.2", "source": { "type": "git", "url": "https://github.com/wp-cli/media-command.git", - "reference": "5e2d34d7d01c87d1f50b4838512b3501f5ca6f9a" + "reference": "a810ea0e68473fce6a234e67c6c5f19bb820a753" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wp-cli/media-command/zipball/5e2d34d7d01c87d1f50b4838512b3501f5ca6f9a", - "reference": "5e2d34d7d01c87d1f50b4838512b3501f5ca6f9a", + "url": "https://api.github.com/repos/wp-cli/media-command/zipball/a810ea0e68473fce6a234e67c6c5f19bb820a753", + "reference": "a810ea0e68473fce6a234e67c6c5f19bb820a753", "shasum": "" }, "require": { - "wp-cli/wp-cli": "^2.5" + "wp-cli/wp-cli": "^2.12" }, "require-dev": { "wp-cli/entity-command": "^1.3 || ^2", @@ -9880,9 +10195,61 @@ "homepage": "https://github.com/wp-cli/media-command", "support": { "issues": "https://github.com/wp-cli/media-command/issues", - "source": "https://github.com/wp-cli/media-command/tree/v2.2.1" + "source": "https://github.com/wp-cli/media-command/tree/v2.2.2" + }, + "time": "2025-04-11T09:28:29+00:00" + }, + { + "name": "wp-cli/mustache", + "version": "v2.14.99", + "source": { + "type": "git", + "url": "https://github.com/wp-cli/mustache.php.git", + "reference": "ca23b97ac35fbe01c160549eb634396183d04a59" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-cli/mustache.php/zipball/ca23b97ac35fbe01c160549eb634396183d04a59", + "reference": "ca23b97ac35fbe01c160549eb634396183d04a59", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "replace": { + "mustache/mustache": "^2.14.2" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "~2.19.3", + "yoast/phpunit-polyfills": "^2.0" }, - "time": "2024-10-01T10:45:30+00:00" + "type": "library", + "autoload": { + "psr-0": { + "Mustache": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Justin Hileman", + "email": "justin@justinhileman.info", + "homepage": "http://justinhileman.com" + } + ], + "description": "A Mustache implementation in PHP.", + "homepage": "https://github.com/bobthecow/mustache.php", + "keywords": [ + "mustache", + "templating" + ], + "support": { + "source": "https://github.com/wp-cli/mustache.php/tree/v2.14.99" + }, + "time": "2025-05-06T16:15:37+00:00" }, { "name": "wp-cli/mustangostang-spyc", @@ -9937,26 +10304,26 @@ }, { "name": "wp-cli/package-command", - "version": "v2.5.3", + "version": "v2.6.1", "source": { "type": "git", "url": "https://github.com/wp-cli/package-command.git", - "reference": "9dc4084c66547049ab863e293f427f8c0d099b18" + "reference": "17ede348446844c20da199683e96f7a3e70c5559" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wp-cli/package-command/zipball/9dc4084c66547049ab863e293f427f8c0d099b18", - "reference": "9dc4084c66547049ab863e293f427f8c0d099b18", + "url": "https://api.github.com/repos/wp-cli/package-command/zipball/17ede348446844c20da199683e96f7a3e70c5559", + "reference": "17ede348446844c20da199683e96f7a3e70c5559", "shasum": "" }, "require": { - "composer/composer": "^1.10.23 || ^2.2.17", + "composer/composer": "^2.2.25", "ext-json": "*", - "wp-cli/wp-cli": "^2.8" + "wp-cli/wp-cli": "^2.12" }, "require-dev": { "wp-cli/scaffold-command": "^1 || ^2", - "wp-cli/wp-cli-tests": "^4" + "wp-cli/wp-cli-tests": "^5" }, "type": "wp-cli-package", "extra": { @@ -9996,35 +10363,35 @@ "homepage": "https://github.com/wp-cli/package-command", "support": { "issues": "https://github.com/wp-cli/package-command/issues", - "source": "https://github.com/wp-cli/package-command/tree/v2.5.3" + "source": "https://github.com/wp-cli/package-command/tree/v2.6.1" }, - "time": "2024-10-01T11:13:44+00:00" + "time": "2025-08-25T13:32:31+00:00" }, { "name": "wp-cli/php-cli-tools", - "version": "v0.11.22", + "version": "v0.12.6", "source": { "type": "git", "url": "https://github.com/wp-cli/php-cli-tools.git", - "reference": "a6bb94664ca36d0962f9c2ff25591c315a550c51" + "reference": "f12b650d3738e471baed6dd47982d53c5c0ab1c3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wp-cli/php-cli-tools/zipball/a6bb94664ca36d0962f9c2ff25591c315a550c51", - "reference": "a6bb94664ca36d0962f9c2ff25591c315a550c51", + "url": "https://api.github.com/repos/wp-cli/php-cli-tools/zipball/f12b650d3738e471baed6dd47982d53c5c0ab1c3", + "reference": "f12b650d3738e471baed6dd47982d53c5c0ab1c3", "shasum": "" }, "require": { - "php": ">= 5.3.0" + "php": ">= 7.2.24" }, "require-dev": { "roave/security-advisories": "dev-latest", - "wp-cli/wp-cli-tests": "^4" + "wp-cli/wp-cli-tests": "^5" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "0.11.x-dev" + "dev-master": "0.12.x-dev" } }, "autoload": { @@ -10059,30 +10426,30 @@ ], "support": { "issues": "https://github.com/wp-cli/php-cli-tools/issues", - "source": "https://github.com/wp-cli/php-cli-tools/tree/v0.11.22" + "source": "https://github.com/wp-cli/php-cli-tools/tree/v0.12.6" }, - "time": "2023-12-03T19:25:05+00:00" + "time": "2025-09-11T12:43:04+00:00" }, { "name": "wp-cli/rewrite-command", - "version": "v2.0.14", + "version": "v2.0.16", "source": { "type": "git", "url": "https://github.com/wp-cli/rewrite-command.git", - "reference": "0dd0d11918eaaf2fcad5bc13646ecf266ffa83e9" + "reference": "84004ff4d14038d06c6fe489807eb09739e62b94" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wp-cli/rewrite-command/zipball/0dd0d11918eaaf2fcad5bc13646ecf266ffa83e9", - "reference": "0dd0d11918eaaf2fcad5bc13646ecf266ffa83e9", + "url": "https://api.github.com/repos/wp-cli/rewrite-command/zipball/84004ff4d14038d06c6fe489807eb09739e62b94", + "reference": "84004ff4d14038d06c6fe489807eb09739e62b94", "shasum": "" }, "require": { - "wp-cli/wp-cli": "^2.5" + "wp-cli/wp-cli": "^2.12" }, "require-dev": { "wp-cli/entity-command": "^1.3 || ^2", - "wp-cli/wp-cli-tests": "^4" + "wp-cli/wp-cli-tests": "^5" }, "type": "wp-cli-package", "extra": { @@ -10120,26 +10487,26 @@ "homepage": "https://github.com/wp-cli/rewrite-command", "support": { "issues": "https://github.com/wp-cli/rewrite-command/issues", - "source": "https://github.com/wp-cli/rewrite-command/tree/v2.0.14" + "source": "https://github.com/wp-cli/rewrite-command/tree/v2.0.16" }, - "time": "2024-10-01T10:45:45+00:00" + "time": "2025-11-11T13:30:58+00:00" }, { "name": "wp-cli/role-command", - "version": "v2.0.15", + "version": "v2.0.16", "source": { "type": "git", "url": "https://github.com/wp-cli/role-command.git", - "reference": "f92efbf92a0bb4b34e1de9523d9cbd393d406ba2" + "reference": "ed57fb5436b4d47954b07e56c734d19deb4fc491" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wp-cli/role-command/zipball/f92efbf92a0bb4b34e1de9523d9cbd393d406ba2", - "reference": "f92efbf92a0bb4b34e1de9523d9cbd393d406ba2", + "url": "https://api.github.com/repos/wp-cli/role-command/zipball/ed57fb5436b4d47954b07e56c734d19deb4fc491", + "reference": "ed57fb5436b4d47954b07e56c734d19deb4fc491", "shasum": "" }, "require": { - "wp-cli/wp-cli": "^2.5" + "wp-cli/wp-cli": "^2.12" }, "require-dev": { "wp-cli/wp-cli-tests": "^4" @@ -10186,30 +10553,30 @@ "homepage": "https://github.com/wp-cli/role-command", "support": { "issues": "https://github.com/wp-cli/role-command/issues", - "source": "https://github.com/wp-cli/role-command/tree/v2.0.15" + "source": "https://github.com/wp-cli/role-command/tree/v2.0.16" }, - "time": "2024-10-01T10:46:02+00:00" + "time": "2025-04-02T12:24:15+00:00" }, { "name": "wp-cli/scaffold-command", - "version": "v2.4.0", + "version": "v2.5.1", "source": { "type": "git", "url": "https://github.com/wp-cli/scaffold-command.git", - "reference": "d67d8348f653d00438535ec4389ab9259ef6fb8f" + "reference": "cd1e49a393b1af4eee4f5ccc3ac562862c65ccdf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wp-cli/scaffold-command/zipball/d67d8348f653d00438535ec4389ab9259ef6fb8f", - "reference": "d67d8348f653d00438535ec4389ab9259ef6fb8f", + "url": "https://api.github.com/repos/wp-cli/scaffold-command/zipball/cd1e49a393b1af4eee4f5ccc3ac562862c65ccdf", + "reference": "cd1e49a393b1af4eee4f5ccc3ac562862c65ccdf", "shasum": "" }, "require": { - "wp-cli/wp-cli": "^2.5" + "wp-cli/wp-cli": "^2.12" }, "require-dev": { "wp-cli/extension-command": "^1.2 || ^2", - "wp-cli/wp-cli-tests": "^4" + "wp-cli/wp-cli-tests": "^5" }, "type": "wp-cli-package", "extra": { @@ -10252,32 +10619,32 @@ "homepage": "https://github.com/wp-cli/scaffold-command", "support": { "issues": "https://github.com/wp-cli/scaffold-command/issues", - "source": "https://github.com/wp-cli/scaffold-command/tree/v2.4.0" + "source": "https://github.com/wp-cli/scaffold-command/tree/v2.5.1" }, - "time": "2024-10-01T11:13:37+00:00" + "time": "2025-09-05T04:13:09+00:00" }, { "name": "wp-cli/search-replace-command", - "version": "v2.1.7", + "version": "v2.1.9", "source": { "type": "git", "url": "https://github.com/wp-cli/search-replace-command.git", - "reference": "89e1653c9b888179a121a8354c75fc5e8ca7931d" + "reference": "14aea81eca68effbc651d5fca4891a89c0667b2e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wp-cli/search-replace-command/zipball/89e1653c9b888179a121a8354c75fc5e8ca7931d", - "reference": "89e1653c9b888179a121a8354c75fc5e8ca7931d", + "url": "https://api.github.com/repos/wp-cli/search-replace-command/zipball/14aea81eca68effbc651d5fca4891a89c0667b2e", + "reference": "14aea81eca68effbc651d5fca4891a89c0667b2e", "shasum": "" }, "require": { - "wp-cli/wp-cli": "^2.5" + "wp-cli/wp-cli": "^2.12" }, "require-dev": { "wp-cli/db-command": "^1.3 || ^2", "wp-cli/entity-command": "^1.3 || ^2", "wp-cli/extension-command": "^1.2 || ^2", - "wp-cli/wp-cli-tests": "^4" + "wp-cli/wp-cli-tests": "^5" }, "type": "wp-cli-package", "extra": { @@ -10312,26 +10679,26 @@ "homepage": "https://github.com/wp-cli/search-replace-command", "support": { "issues": "https://github.com/wp-cli/search-replace-command/issues", - "source": "https://github.com/wp-cli/search-replace-command/tree/v2.1.7" + "source": "https://github.com/wp-cli/search-replace-command/tree/v2.1.9" }, - "time": "2024-06-28T09:30:38+00:00" + "time": "2025-11-11T13:31:01+00:00" }, { "name": "wp-cli/server-command", - "version": "v2.0.14", + "version": "v2.0.15", "source": { "type": "git", "url": "https://github.com/wp-cli/server-command.git", - "reference": "012e10d3281866235cbf626f38a27169d6c6e13b" + "reference": "80a9243f94e0ac073f9bfdb516d2ac7e1fa01a71" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wp-cli/server-command/zipball/012e10d3281866235cbf626f38a27169d6c6e13b", - "reference": "012e10d3281866235cbf626f38a27169d6c6e13b", + "url": "https://api.github.com/repos/wp-cli/server-command/zipball/80a9243f94e0ac073f9bfdb516d2ac7e1fa01a71", + "reference": "80a9243f94e0ac073f9bfdb516d2ac7e1fa01a71", "shasum": "" }, "require": { - "wp-cli/wp-cli": "^2.5" + "wp-cli/wp-cli": "^2.12" }, "require-dev": { "wp-cli/entity-command": "^2", @@ -10370,26 +10737,26 @@ "homepage": "https://github.com/wp-cli/server-command", "support": { "issues": "https://github.com/wp-cli/server-command/issues", - "source": "https://github.com/wp-cli/server-command/tree/v2.0.14" + "source": "https://github.com/wp-cli/server-command/tree/v2.0.15" }, - "time": "2024-10-01T10:46:38+00:00" + "time": "2025-04-10T11:03:13+00:00" }, { "name": "wp-cli/shell-command", - "version": "v2.0.15", + "version": "v2.0.16", "source": { "type": "git", "url": "https://github.com/wp-cli/shell-command.git", - "reference": "2c38ef12a912b23224c7f2abd5bc716a889340fb" + "reference": "3af53a9f4b240e03e77e815b2ee10f229f1aa591" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wp-cli/shell-command/zipball/2c38ef12a912b23224c7f2abd5bc716a889340fb", - "reference": "2c38ef12a912b23224c7f2abd5bc716a889340fb", + "url": "https://api.github.com/repos/wp-cli/shell-command/zipball/3af53a9f4b240e03e77e815b2ee10f229f1aa591", + "reference": "3af53a9f4b240e03e77e815b2ee10f229f1aa591", "shasum": "" }, "require": { - "wp-cli/wp-cli": "^2.5" + "wp-cli/wp-cli": "^2.12" }, "require-dev": { "wp-cli/wp-cli-tests": "^4" @@ -10427,26 +10794,26 @@ "homepage": "https://github.com/wp-cli/shell-command", "support": { "issues": "https://github.com/wp-cli/shell-command/issues", - "source": "https://github.com/wp-cli/shell-command/tree/v2.0.15" + "source": "https://github.com/wp-cli/shell-command/tree/v2.0.16" }, - "time": "2024-10-01T10:46:50+00:00" + "time": "2025-04-11T09:39:33+00:00" }, { "name": "wp-cli/super-admin-command", - "version": "v2.0.15", + "version": "v2.0.16", "source": { "type": "git", "url": "https://github.com/wp-cli/super-admin-command.git", - "reference": "ecd9cee09918eb34f60c05944cc188f4916cb026" + "reference": "54ac063c384743ee414806d42cb8c61c6aa1fa8e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wp-cli/super-admin-command/zipball/ecd9cee09918eb34f60c05944cc188f4916cb026", - "reference": "ecd9cee09918eb34f60c05944cc188f4916cb026", + "url": "https://api.github.com/repos/wp-cli/super-admin-command/zipball/54ac063c384743ee414806d42cb8c61c6aa1fa8e", + "reference": "54ac063c384743ee414806d42cb8c61c6aa1fa8e", "shasum": "" }, "require": { - "wp-cli/wp-cli": "^2.5" + "wp-cli/wp-cli": "^2.12" }, "require-dev": { "wp-cli/entity-command": "^1.3 || ^2", @@ -10488,26 +10855,26 @@ "homepage": "https://github.com/wp-cli/super-admin-command", "support": { "issues": "https://github.com/wp-cli/super-admin-command/issues", - "source": "https://github.com/wp-cli/super-admin-command/tree/v2.0.15" + "source": "https://github.com/wp-cli/super-admin-command/tree/v2.0.16" }, - "time": "2024-10-01T10:48:29+00:00" + "time": "2025-04-02T13:07:32+00:00" }, { "name": "wp-cli/widget-command", - "version": "v2.1.11", + "version": "v2.1.12", "source": { "type": "git", "url": "https://github.com/wp-cli/widget-command.git", - "reference": "c50cd32e4e3d16bf29821ae0208b7154ef6f9031" + "reference": "73084053f7b32d92583e44d870b81f287beea6a9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wp-cli/widget-command/zipball/c50cd32e4e3d16bf29821ae0208b7154ef6f9031", - "reference": "c50cd32e4e3d16bf29821ae0208b7154ef6f9031", + "url": "https://api.github.com/repos/wp-cli/widget-command/zipball/73084053f7b32d92583e44d870b81f287beea6a9", + "reference": "73084053f7b32d92583e44d870b81f287beea6a9", "shasum": "" }, "require": { - "wp-cli/wp-cli": "^2.5" + "wp-cli/wp-cli": "^2.12" }, "require-dev": { "wp-cli/extension-command": "^1.2 || ^2", @@ -10555,39 +10922,38 @@ "homepage": "https://github.com/wp-cli/widget-command", "support": { "issues": "https://github.com/wp-cli/widget-command/issues", - "source": "https://github.com/wp-cli/widget-command/tree/v2.1.11" + "source": "https://github.com/wp-cli/widget-command/tree/v2.1.12" }, - "time": "2024-10-01T10:48:21+00:00" + "time": "2025-04-11T09:29:37+00:00" }, { "name": "wp-cli/wp-cli", - "version": "v2.11.0", + "version": "v2.12.0", "source": { "type": "git", "url": "https://github.com/wp-cli/wp-cli.git", - "reference": "53f0df112901fcf95099d0f501912a209429b6a9" + "reference": "03d30d4138d12b4bffd8b507b82e56e129e0523f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wp-cli/wp-cli/zipball/53f0df112901fcf95099d0f501912a209429b6a9", - "reference": "53f0df112901fcf95099d0f501912a209429b6a9", + "url": "https://api.github.com/repos/wp-cli/wp-cli/zipball/03d30d4138d12b4bffd8b507b82e56e129e0523f", + "reference": "03d30d4138d12b4bffd8b507b82e56e129e0523f", "shasum": "" }, "require": { "ext-curl": "*", - "mustache/mustache": "^2.14.1", "php": "^5.6 || ^7.0 || ^8.0", "symfony/finder": ">2.7", + "wp-cli/mustache": "^2.14.99", "wp-cli/mustangostang-spyc": "^0.6.3", - "wp-cli/php-cli-tools": "~0.11.2" + "wp-cli/php-cli-tools": "~0.12.4" }, "require-dev": { - "roave/security-advisories": "dev-latest", "wp-cli/db-command": "^1.3 || ^2", "wp-cli/entity-command": "^1.2 || ^2", "wp-cli/extension-command": "^1.1 || ^2", "wp-cli/package-command": "^1 || ^2", - "wp-cli/wp-cli-tests": "^4.0.1" + "wp-cli/wp-cli-tests": "^4.3.10" }, "suggest": { "ext-readline": "Include for a better --prompt implementation", @@ -10600,7 +10966,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "2.11.x-dev" + "dev-main": "2.12.x-dev" } }, "autoload": { @@ -10627,7 +10993,7 @@ "issues": "https://github.com/wp-cli/wp-cli/issues", "source": "https://github.com/wp-cli/wp-cli" }, - "time": "2024-08-08T03:04:55+00:00" + "time": "2025-05-07T01:16:12+00:00" }, { "name": "wp-cli/wp-cli-bundle", @@ -10704,23 +11070,23 @@ }, { "name": "wp-cli/wp-config-transformer", - "version": "v1.4.1", + "version": "v1.4.3", "source": { "type": "git", "url": "https://github.com/wp-cli/wp-config-transformer.git", - "reference": "9da378b5a4e28bba3bce4ff4ff04a54d8c9f1a01" + "reference": "5ade4e70349a1d5cd07efc33880ceb5eebb9e9fa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wp-cli/wp-config-transformer/zipball/9da378b5a4e28bba3bce4ff4ff04a54d8c9f1a01", - "reference": "9da378b5a4e28bba3bce4ff4ff04a54d8c9f1a01", + "url": "https://api.github.com/repos/wp-cli/wp-config-transformer/zipball/5ade4e70349a1d5cd07efc33880ceb5eebb9e9fa", + "reference": "5ade4e70349a1d5cd07efc33880ceb5eebb9e9fa", "shasum": "" }, "require": { - "php": "^5.6 || ^7.0 || ^8.0" + "php": ">=7.2.24" }, "require-dev": { - "wp-cli/wp-cli-tests": "^4.0" + "wp-cli/wp-cli-tests": "^4.0 || ^5.0" }, "type": "library", "extra": { @@ -10747,9 +11113,9 @@ "homepage": "https://github.com/wp-cli/wp-config-transformer", "support": { "issues": "https://github.com/wp-cli/wp-config-transformer/issues", - "source": "https://github.com/wp-cli/wp-config-transformer/tree/v1.4.1" + "source": "https://github.com/wp-cli/wp-config-transformer/tree/v1.4.3" }, - "time": "2024-10-16T12:50:47+00:00" + "time": "2025-11-11T13:31:09+00:00" }, { "name": "wp-coding-standards/wpcs", @@ -10804,23 +11170,23 @@ }, { "name": "wp-graphql/wp-graphql", - "version": "v2.0.0", + "version": "v2.5.3", "source": { "type": "git", "url": "https://github.com/wp-graphql/wp-graphql.git", - "reference": "a2e5d6838af8731b19efb4709e4490720ce47595" + "reference": "5b7e6886fd1cd8b447792a109c31bfbca87eafa3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wp-graphql/wp-graphql/zipball/a2e5d6838af8731b19efb4709e4490720ce47595", - "reference": "a2e5d6838af8731b19efb4709e4490720ce47595", + "url": "https://api.github.com/repos/wp-graphql/wp-graphql/zipball/5b7e6886fd1cd8b447792a109c31bfbca87eafa3", + "reference": "5b7e6886fd1cd8b447792a109c31bfbca87eafa3", "shasum": "" }, "require": { "appsero/client": "2.0.4", "ivome/graphql-relay-php": "0.7.0", "php": "^7.4 || ^8.0", - "webonyx/graphql-php": "15.19.1" + "webonyx/graphql-php": "15.24.0" }, "require-dev": { "automattic/vipwpcs": "^3.0", @@ -10832,6 +11198,8 @@ "codeception/module-rest": "^1.2", "codeception/module-webdriver": "^1.0", "codeception/util-universalframework": "^1.0", + "composer/semver": "^3.0", + "dealerdirect/phpcodesniffer-composer-installer": "^1.0", "lucatume/wp-browser": "<3.5", "phpcompatibility/php-compatibility": "dev-develop as 9.9.9", "phpcompatibility/phpcompatibility-wp": "^2.1", @@ -10851,6 +11219,7 @@ "WPGraphQL\\": "src/" }, "classmap": [ + "deprecated/", "src/WPGraphQL.php" ] }, @@ -10879,9 +11248,9 @@ "description": "GraphQL API for WordPress", "support": { "issues": "https://github.com/wp-graphql/wp-graphql/issues", - "source": "https://github.com/wp-graphql/wp-graphql/tree/v2.0.0" + "source": "https://github.com/wp-graphql/wp-graphql/tree/v2.5.3" }, - "time": "2025-02-13T20:45:59+00:00" + "time": "2025-11-24T22:39:53+00:00" }, { "name": "wp-graphql/wp-graphql-testcase", @@ -11016,5 +11385,5 @@ "prefer-lowest": false, "platform": {}, "platform-dev": {}, - "plugin-api-version": "2.6.0" + "plugin-api-version": "2.9.0" } From 6d72aa181d26de0a1c17a0014937e11e156cc637 Mon Sep 17 00:00:00 2001 From: Jason Bahl Date: Thu, 11 Dec 2025 17:25:42 -0700 Subject: [PATCH 8/9] ci: disable Gherkin and update deprecated GitHub Actions --- codeception.dist.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/codeception.dist.yml b/codeception.dist.yml index 7ed957e2..158f5950 100644 --- a/codeception.dist.yml +++ b/codeception.dist.yml @@ -5,6 +5,7 @@ paths: support: tests/_support envs: tests/_envs actor_suffix: Tester +gherkin: [] extensions: enabled: - Codeception\Extension\RunFailed From 7d8f951bd0b8b98f9bf447c11ac34471d75ad56f Mon Sep 17 00:00:00 2001 From: Jason Bahl Date: Thu, 11 Dec 2025 17:47:20 -0700 Subject: [PATCH 9/9] ci: fix Gherkin compatibility by pinning behat/gherkin < 4.9 - Pin behat/gherkin to < 4.9 to fix i18n.php path issue with Codeception 4.x - Add gherkin: [] to codeception.dist.yml as extra safeguard - Update deprecated GitHub Actions to v4 - Fix deprecated set-output syntax --- composer.json | 1 + composer.lock | 55 +++++++++++++++++---------------------------------- 2 files changed, 19 insertions(+), 37 deletions(-) diff --git a/composer.json b/composer.json index eef184a0..04366fde 100644 --- a/composer.json +++ b/composer.json @@ -17,6 +17,7 @@ } }, "require-dev": { + "behat/gherkin": "<4.9", "wp-graphql/wp-graphql-testcase": "*", "squizlabs/php_codesniffer": "^3.6", "phpcompatibility/phpcompatibility-wp": "*", diff --git a/composer.lock b/composer.lock index 750b2c59..7270ab17 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "e4509b5e06fcb4c745a6a025e60de93a", + "content-hash": "bda963e63dc7a9859951e905c5e45612", "packages": [ { "name": "appsero/client", @@ -217,31 +217,26 @@ }, { "name": "behat/gherkin", - "version": "v4.16.1", + "version": "v4.8.0", "source": { "type": "git", "url": "https://github.com/Behat/Gherkin.git", - "reference": "e26037937dfd48528746764dd870bc5d0836665f" + "reference": "2391482cd003dfdc36b679b27e9f5326bd656acd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Behat/Gherkin/zipball/e26037937dfd48528746764dd870bc5d0836665f", - "reference": "e26037937dfd48528746764dd870bc5d0836665f", + "url": "https://api.github.com/repos/Behat/Gherkin/zipball/2391482cd003dfdc36b679b27e9f5326bd656acd", + "reference": "2391482cd003dfdc36b679b27e9f5326bd656acd", "shasum": "" }, "require": { - "composer-runtime-api": "^2.2", - "php": ">=8.1 <8.6" + "php": "~7.2|~8.0" }, "require-dev": { - "cucumber/gherkin-monorepo": "dev-gherkin-v37.0.0", - "friendsofphp/php-cs-fixer": "^3.77", - "mikey179/vfsstream": "^1.6", - "phpstan/extension-installer": "^1", - "phpstan/phpstan": "^2", - "phpstan/phpstan-phpunit": "^2", - "phpunit/phpunit": "^10.5", - "symfony/yaml": "^5.4 || ^6.4 || ^7.0" + "cucumber/cucumber": "dev-gherkin-16.0.0", + "phpunit/phpunit": "~8|~9", + "symfony/phpunit-bridge": "~3|~4|~5", + "symfony/yaml": "~3|~4|~5" }, "suggest": { "symfony/yaml": "If you want to parse features, represented in YAML files" @@ -249,12 +244,12 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.x-dev" + "dev-master": "4.4-dev" } }, "autoload": { - "psr-4": { - "Behat\\Gherkin\\": "src/" + "psr-0": { + "Behat\\Gherkin": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -265,11 +260,11 @@ { "name": "Konstantin Kudryashov", "email": "ever.zet@gmail.com", - "homepage": "https://everzet.com" + "homepage": "http://everzet.com" } ], "description": "Gherkin DSL parser for PHP", - "homepage": "https://behat.org/", + "homepage": "http://behat.org/", "keywords": [ "BDD", "Behat", @@ -280,23 +275,9 @@ ], "support": { "issues": "https://github.com/Behat/Gherkin/issues", - "source": "https://github.com/Behat/Gherkin/tree/v4.16.1" + "source": "https://github.com/Behat/Gherkin/tree/v4.8.0" }, - "funding": [ - { - "url": "https://github.com/acoulton", - "type": "github" - }, - { - "url": "https://github.com/carlos-granados", - "type": "github" - }, - { - "url": "https://github.com/stof", - "type": "github" - } - ], - "time": "2025-12-08T16:12:58+00:00" + "time": "2021-02-04T12:44:21+00:00" }, { "name": "bordoni/phpass", @@ -11385,5 +11366,5 @@ "prefer-lowest": false, "platform": {}, "platform-dev": {}, - "plugin-api-version": "2.9.0" + "plugin-api-version": "2.6.0" }