• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

rtCamp / snapwp-helper / 13606802535

01 Mar 2025 04:43PM UTC coverage: 82.359% (+0.07%) from 82.291%
13606802535

push

github

web-flow
chore: Remove unnecessary WP version checks (#92)

* chore: Remove unnecessary version checks

* feat: Add changelog entry

1564 of 1899 relevant lines covered (82.36%)

13.04 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

92.5
/src/Modules/GraphQL/Utils/ScriptModuleUtils.php
1
<?php
2
/**
3
 * Methods for interacting with WordPress Script Modules.
4
 *
5
 * Workaround until WP provides a public API.
6
 *
7
 * @see https://core.trac.wordpress.org/ticket/60597
8
 *
9
 * @package SnapWP\Helper\Modules\GraphQL\Utils
10
 */
11

12
declare( strict_types = 1 );
13

14
namespace SnapWP\Helper\Modules\GraphQL\Utils;
15

16
/**
17
 * Class - ScriptModuleUtils
18
 *
19
 * @phpstan-type ScriptModuleData array{
20
 *  id: string,
21
 *  src: string,
22
 *  dependencies: array<string,mixed>,
23
 *  extraData: string|null,
24
 *  version: string|false|null,
25
 * }
26
 */
27
final class ScriptModuleUtils {
28
        /**
29
         * Get the registered script modules and their associated script module data.
30
         *
31
         * Inspired by https://github.com/johnbillion/query-monitor/blob/6b66f6513580023415fe21e6f0218bd256b3c59a/classes/Collector_Assets.php#L271
32
         *
33
         * Workaround until WP provides a public API.
34
         *
35
         * @see https://core.trac.wordpress.org/ticket/60597
36
         * @see https://github.com/WordPress/wordpress-develop/blob/86f31c81668c0a680b6db275b41298f7e8513389/src/wp-includes/class-wp-script-modules.php#L380
37
         *
38
         * @return array<string,ScriptModuleData>
39
         */
40
        public static function get_enqueued_script_modules(): array {
3✔
41
                $modules = wp_script_modules();
3✔
42

43
                $reflector = new \ReflectionClass( $modules );
3✔
44

45
                // Get required methods.
46
                $get_marked_for_enqueue = self::get_accessible_method( $reflector, 'get_marked_for_enqueue' );
3✔
47
                $get_dependencies       = self::get_accessible_method( $reflector, 'get_dependencies' );
3✔
48
                $get_import_map         = self::get_accessible_method( $reflector, 'get_import_map' );
3✔
49

50
                // Expose required props.
51
                $a11y_available = $reflector->getProperty( 'a11y_available' );
3✔
52
                $a11y_available->setAccessible( true );
3✔
53

54
                // Get enqueued modules.
55
                $enqueued = $get_marked_for_enqueue->invoke( $modules );
3✔
56

57
                // Restore a11y availability.
58
                $a11y_available->setValue( $modules, false );
3✔
59

60
                // Get dependencies for enqueued modules.
61
                $enqueued_dependencies = $get_dependencies->invoke( $modules, array_keys( $enqueued ) );
3✔
62

63
                // Merge enqueued modules and their dependencies.
64
                $all_modules = array_merge( $enqueued, $enqueued_dependencies );
3✔
65

66
                /**
67
                 * Check if a11y is available.
68
                 *
69
                 * This traditionally runs as part of WP_Script_Modules::print_script_module_data(), so we prime it before we call our
70
                 */
71
                foreach ( array_keys( $enqueued ) as $id ) {
3✔
72
                        if ( '@wordpress/a11y' === $id ) {
3✔
73
                                $a11y_available->setValue( $modules, true );
×
74
                        }
75
                }
76

77
                foreach ( array_keys( $get_import_map->invoke( $modules ) ) as $id ) {
3✔
78
                        if ( '@wordpress/a11y' === $id ) {
3✔
79
                                $a11y_available->setValue( $modules, true );
×
80
                        }
81
                }
82

83
                $sources = [];
3✔
84
                foreach ( $all_modules as $id => $module ) {
3✔
85
                        $sources[ $id ] = [
3✔
86
                                'id'           => $id,
3✔
87
                                'src'          => $module['src'] ?? null,
3✔
88
                                'version'      => $module['version'] ?? null,
3✔
89
                                'dependencies' => $module['dependencies'] ?? [],
3✔
90
                                'extraData'    => self::get_script_module_data( $id ),
3✔
91
                        ];
3✔
92
                }
93

94
                return $sources;
3✔
95
        }
96

97
        /**
98
         * Gets formatted array of script module data.
99
         *
100
         * @see https://github.com/WordPress/wordpress-develop/blob/86f31c81668c0a680b6db275b41298f7e8513389/src/wp-includes/class-wp-script-modules.php#L380
101
         *
102
         * @param string $module_id The module ID.
103
         */
104
        private static function get_script_module_data( $module_id ): ?string {
3✔
105
                /**
106
                 * This filter is documented in wp-includes/class-wp-script-modules.php
107
                 */
108
                $data = apply_filters( "script_module_data_{$module_id}", [] ); // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedHooknameFound
3✔
109

110
                if ( ! is_array( $data ) || empty( $data ) ) {
3✔
111
                        return null;
3✔
112
                }
113

114
                $json_encode_flags = JSON_HEX_TAG | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_LINE_TERMINATORS;
1✔
115
                if ( ! is_utf8_charset() ) {
1✔
116
                        $json_encode_flags = JSON_HEX_TAG | JSON_UNESCAPED_SLASHES;
×
117
                }
118

119
                return wp_json_encode( $data, $json_encode_flags ) ?: null;
1✔
120
        }
121

122
        /**
123
         * Get an accessible method from a reflector.
124
         *
125
         * @param \ReflectionClass<\WP_Script_Modules> $reflector The reflector.
126
         * @param string                               $methodName The method name.
127
         *
128
         * @throws \ReflectionException
129
         */
130
        private static function get_accessible_method( \ReflectionClass $reflector, string $methodName ): \ReflectionMethod {
3✔
131
                $method = $reflector->getMethod( $methodName );
3✔
132
                $method->setAccessible( true );
3✔
133
                return $method;
3✔
134
        }
135
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc