From 5509f2cf1735917db8bcfec7bd2a93b6c879d996 Mon Sep 17 00:00:00 2001 From: Weston Ruter Date: Tue, 19 Nov 2024 17:22:49 -0800 Subject: [PATCH] Update other plugins to warn when minified asset is missing --- plugins/embed-optimizer/hooks.php | 40 ++++++++++++++++++- plugins/image-prioritizer/helper.php | 36 +++++++++++++++++ plugins/image-prioritizer/hooks.php | 3 +- plugins/optimization-detective/detection.php | 2 +- plugins/optimization-detective/helper.php | 36 +++++++++++++++++ .../performance-lab/includes/admin/load.php | 2 +- tools/phpstan/constants.php | 2 + 7 files changed, 116 insertions(+), 5 deletions(-) diff --git a/plugins/embed-optimizer/hooks.php b/plugins/embed-optimizer/hooks.php index 452794d030..99c8225961 100644 --- a/plugins/embed-optimizer/hooks.php +++ b/plugins/embed-optimizer/hooks.php @@ -121,7 +121,7 @@ function embed_optimizer_filter_extension_module_urls( $extension_module_urls ): if ( ! is_array( $extension_module_urls ) ) { $extension_module_urls = array(); } - $extension_module_urls[] = add_query_arg( 'ver', EMBED_OPTIMIZER_VERSION, plugin_dir_url( __FILE__ ) . sprintf( 'detect%s.js', wp_scripts_get_suffix() ) ); + $extension_module_urls[] = add_query_arg( 'ver', EMBED_OPTIMIZER_VERSION, plugin_dir_url( __FILE__ ) . embed_optimizer_get_asset_path( 'detect.js' ) ); return $extension_module_urls; } @@ -326,7 +326,7 @@ function embed_optimizer_lazy_load_scripts(): void { * @since 0.2.0 */ function embed_optimizer_get_lazy_load_script(): string { - $script = file_get_contents( __DIR__ . sprintf( '/lazy-load%s.js', wp_scripts_get_suffix() ) ); // phpcs:ignore WordPress.WP.AlternativeFunctions.file_get_contents_file_get_contents -- It's a local filesystem path not a remote request. + $script = file_get_contents( __DIR__ . '/' . embed_optimizer_get_asset_path( 'lazy-load.js' ) ); // phpcs:ignore WordPress.WP.AlternativeFunctions.file_get_contents_file_get_contents -- It's a local filesystem path not a remote request. if ( false === $script ) { return ''; @@ -424,3 +424,39 @@ function embed_optimizer_render_generator(): void { // Use the plugin slug as it is immutable. echo '' . "\n"; } + +/** + * Gets the path to a script or stylesheet. + * + * @since n.e.x.t + * + * @param string $src_path Source path, relative to plugin root. + * @param string|null $min_path Minified path. If not supplied, then '.min' is injected before the file extension in the source path. + * @return string URL to script or stylesheet. + */ +function embed_optimizer_get_asset_path( string $src_path, ?string $min_path = null ): string { + if ( null === $min_path ) { + // Note: wp_scripts_get_suffix() is not used here because we need access to both the source and minified paths. + $min_path = (string) preg_replace( '/(?=\.\w+$)/', '.min', $src_path ); + } + + $force_src = false; + if ( WP_DEBUG && ! file_exists( trailingslashit( __DIR__ ) . $min_path ) ) { + $force_src = true; + wp_trigger_error( + __FUNCTION__, + sprintf( + /* translators: %s is the minified asset path */ + __( 'Minified asset has not been built: %s', 'embed-optimizer' ), + $min_path + ), + E_USER_WARNING + ); + } + + if ( SCRIPT_DEBUG || $force_src ) { + return $src_path; + } + + return $min_path; +} diff --git a/plugins/image-prioritizer/helper.php b/plugins/image-prioritizer/helper.php index 9096fac63b..025e07d4c6 100644 --- a/plugins/image-prioritizer/helper.php +++ b/plugins/image-prioritizer/helper.php @@ -76,3 +76,39 @@ function image_prioritizer_register_tag_visitors( OD_Tag_Visitor_Registry $regis $video_visitor = new Image_Prioritizer_Video_Tag_Visitor(); $registry->register( 'image-prioritizer/video', $video_visitor ); } + +/** + * Gets the path to a script or stylesheet. + * + * @since n.e.x.t + * + * @param string $src_path Source path, relative to plugin root. + * @param string|null $min_path Minified path. If not supplied, then '.min' is injected before the file extension in the source path. + * @return string URL to script or stylesheet. + */ +function image_prioritizer_get_asset_path( string $src_path, ?string $min_path = null ): string { + if ( null === $min_path ) { + // Note: wp_scripts_get_suffix() is not used here because we need access to both the source and minified paths. + $min_path = (string) preg_replace( '/(?=\.\w+$)/', '.min', $src_path ); + } + + $force_src = false; + if ( WP_DEBUG && ! file_exists( trailingslashit( __DIR__ ) . $min_path ) ) { + $force_src = true; + wp_trigger_error( + __FUNCTION__, + sprintf( + /* translators: %s is the minified asset path */ + __( 'Minified asset has not been built: %s', 'image-prioritizer' ), + $min_path + ), + E_USER_WARNING + ); + } + + if ( SCRIPT_DEBUG || $force_src ) { + return $src_path; + } + + return $min_path; +} diff --git a/plugins/image-prioritizer/hooks.php b/plugins/image-prioritizer/hooks.php index 9e962ce8f1..3e16f3e9ae 100644 --- a/plugins/image-prioritizer/hooks.php +++ b/plugins/image-prioritizer/hooks.php @@ -22,7 +22,8 @@ * @since 0.2.0 */ function image_prioritizer_get_lazy_load_script(): string { - $script = file_get_contents( __DIR__ . sprintf( '/lazy-load%s.js', wp_scripts_get_suffix() ) ); // phpcs:ignore WordPress.WP.AlternativeFunctions.file_get_contents_file_get_contents -- It's a local filesystem path not a remote request. + $path = image_prioritizer_get_asset_path( 'lazy-load.js' ); + $script = file_get_contents( __DIR__ . '/' . $path ); // phpcs:ignore WordPress.WP.AlternativeFunctions.file_get_contents_file_get_contents -- It's a local filesystem path not a remote request. if ( false === $script ) { return ''; diff --git a/plugins/optimization-detective/detection.php b/plugins/optimization-detective/detection.php index b52f407deb..63d06d2be3 100644 --- a/plugins/optimization-detective/detection.php +++ b/plugins/optimization-detective/detection.php @@ -112,7 +112,7 @@ static function ( OD_URL_Metric_Group $group ): array { return wp_get_inline_script_tag( sprintf( 'import detect from %s; detect( %s );', - wp_json_encode( add_query_arg( 'ver', OPTIMIZATION_DETECTIVE_VERSION, plugin_dir_url( __FILE__ ) . sprintf( 'detect%s.js', wp_scripts_get_suffix() ) ) ), + wp_json_encode( add_query_arg( 'ver', OPTIMIZATION_DETECTIVE_VERSION, plugin_dir_url( __FILE__ ) . od_get_asset_path( 'detect.js' ) ) ), wp_json_encode( $detect_args ) ), array( 'type' => 'module' ) diff --git a/plugins/optimization-detective/helper.php b/plugins/optimization-detective/helper.php index 3573d150fe..2920ad50cb 100644 --- a/plugins/optimization-detective/helper.php +++ b/plugins/optimization-detective/helper.php @@ -64,3 +64,39 @@ function od_render_generator_meta_tag(): void { // Use the plugin slug as it is immutable. echo '' . "\n"; } + +/** + * Gets the path to a script or stylesheet. + * + * @since n.e.x.t + * + * @param string $src_path Source path, relative to plugin root. + * @param string|null $min_path Minified path. If not supplied, then '.min' is injected before the file extension in the source path. + * @return string URL to script or stylesheet. + */ +function od_get_asset_path( string $src_path, ?string $min_path = null ): string { + if ( null === $min_path ) { + // Note: wp_scripts_get_suffix() is not used here because we need access to both the source and minified paths. + $min_path = (string) preg_replace( '/(?=\.\w+$)/', '.min', $src_path ); + } + + $force_src = false; + if ( WP_DEBUG && ! file_exists( trailingslashit( __DIR__ ) . $min_path ) ) { + $force_src = true; + wp_trigger_error( + __FUNCTION__, + sprintf( + /* translators: %s is the minified asset path */ + __( 'Minified asset has not been built: %s', 'optimization-detective' ), + $min_path + ), + E_USER_WARNING + ); + } + + if ( SCRIPT_DEBUG || $force_src ) { + return $src_path; + } + + return $min_path; +} diff --git a/plugins/performance-lab/includes/admin/load.php b/plugins/performance-lab/includes/admin/load.php index 0f0fb3992b..8416f3e74a 100644 --- a/plugins/performance-lab/includes/admin/load.php +++ b/plugins/performance-lab/includes/admin/load.php @@ -229,7 +229,7 @@ function perflab_get_asset_path( string $src_path, ?string $min_path = null ): s } $force_src = false; - if ( WP_DEBUG && ! file_exists( PERFLAB_PLUGIN_DIR_PATH . $min_path ) ) { + if ( WP_DEBUG && ! file_exists( trailingslashit( PERFLAB_PLUGIN_DIR_PATH ) . $min_path ) ) { $force_src = true; wp_trigger_error( __FUNCTION__, diff --git a/tools/phpstan/constants.php b/tools/phpstan/constants.php index d740676c88..ae469bf4dc 100644 --- a/tools/phpstan/constants.php +++ b/tools/phpstan/constants.php @@ -17,3 +17,5 @@ define( 'IMAGE_PRIORITIZER_VERSION', '0.0.0' ); define( 'EMBED_OPTIMIZER_VERSION', '0.0.0' ); + +define( 'PERFLAB_PLUGIN_DIR_PATH', __DIR__ . '/../../plugins/performance-lab/' );