Skip to content

Commit bbce0ee

Browse files
committed
Script Loader: Emit notices when enqueueing a script, style, or script module with missing dependencies.
Developed in WordPress/wordpress-develop#10545 Follow-up to [60999]. Props deepakprajapati, westonruter. See #63486. Fixes #64229. Built from https://develop.svn.wordpress.org/trunk@61323 git-svn-id: https://core.svn.wordpress.org/trunk@60635 1a063a9b-81f0-0310-95a4-ce76da25c4cd
1 parent 08e1acd commit bbce0ee

File tree

5 files changed

+108
-4
lines changed

5 files changed

+108
-4
lines changed

wp-includes/class-wp-dependencies.php

Lines changed: 44 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,18 @@ class WP_Dependencies {
104104
*/
105105
private $queued_before_register = array();
106106

107+
/**
108+
* List of handles for dependencies encountered which themselves have missing dependencies.
109+
*
110+
* A dependency handle is added to this list when it is discovered to have missing dependencies. At this time, a
111+
* warning is emitted with {@see _doing_it_wrong()}. The handle is then added to this list, so that duplicate
112+
* warnings don't occur.
113+
*
114+
* @since 7.0.0
115+
* @var string[]
116+
*/
117+
private $dependencies_with_missing_dependencies = array();
118+
107119
/**
108120
* Processes the items and dependencies.
109121
*
@@ -199,10 +211,22 @@ public function all_deps( $handles, $recursion = false, $group = false ) {
199211
continue;
200212
}
201213

202-
$keep_going = true;
214+
$keep_going = true;
215+
$missing_dependencies = array();
216+
if ( isset( $this->registered[ $handle ] ) && count( $this->registered[ $handle ]->deps ) > 0 ) {
217+
$missing_dependencies = array_diff( $this->registered[ $handle ]->deps, array_keys( $this->registered ) );
218+
}
203219
if ( ! isset( $this->registered[ $handle ] ) ) {
204220
$keep_going = false; // Item doesn't exist.
205-
} elseif ( $this->registered[ $handle ]->deps && array_diff( $this->registered[ $handle ]->deps, array_keys( $this->registered ) ) ) {
221+
} elseif ( count( $missing_dependencies ) > 0 ) {
222+
if ( ! in_array( $handle, $this->dependencies_with_missing_dependencies, true ) ) {
223+
_doing_it_wrong(
224+
get_class( $this ) . '::add',
225+
$this->get_dependency_warning_message( $handle, $missing_dependencies ),
226+
'7.0.0'
227+
);
228+
$this->dependencies_with_missing_dependencies[] = $handle;
229+
}
206230
$keep_going = false; // Item requires dependencies that don't exist.
207231
} elseif ( $this->registered[ $handle ]->deps && ! $this->all_deps( $this->registered[ $handle ]->deps, true, $new_group ) ) {
208232
$keep_going = false; // Item requires dependencies that don't exist.
@@ -535,4 +559,22 @@ public function get_etag( $load ) {
535559
*/
536560
return 'W/"' . md5( $etag ) . '"';
537561
}
562+
563+
/**
564+
* Gets a dependency warning message for a handle.
565+
*
566+
* @since 7.0.0
567+
*
568+
* @param string $handle Handle with missing dependencies.
569+
* @param string[] $missing_dependency_handles Missing dependency handles.
570+
* @return string Formatted, localized warning message.
571+
*/
572+
protected function get_dependency_warning_message( $handle, $missing_dependency_handles ) {
573+
return sprintf(
574+
/* translators: 1: Handle, 2: Comma-separated list of missing dependency handles. */
575+
__( 'The handle "%1$s" was enqueued with dependencies that are not registered: %2$s.' ),
576+
$handle,
577+
implode( ', ', $missing_dependency_handles )
578+
);
579+
}
538580
}

wp-includes/class-wp-script-modules.php

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,17 @@ class WP_Script_Modules {
7070
'high',
7171
);
7272

73+
/**
74+
* List of IDs for script modules encountered which have missing dependencies.
75+
*
76+
* An ID is added to this list when it is discovered to have missing dependencies. At this time, a warning is
77+
* emitted with {@see _doing_it_wrong()}. The ID is then added to this list, so that duplicate warnings don't occur.
78+
*
79+
* @since 7.0.0
80+
* @var string[]
81+
*/
82+
private $modules_with_missing_dependencies = array();
83+
7384
/**
7485
* Registers the script module if no script module with that script module
7586
* identifier has already been registered.
@@ -722,7 +733,22 @@ private function sort_item_dependencies( string $id, array $import_types, array
722733
}
723734

724735
// If the item requires dependencies that do not exist, fail.
725-
if ( count( array_diff( $dependency_ids, array_keys( $this->registered ) ) ) > 0 ) {
736+
$missing_dependencies = array_diff( $dependency_ids, array_keys( $this->registered ) );
737+
if ( count( $missing_dependencies ) > 0 ) {
738+
if ( ! in_array( $id, $this->modules_with_missing_dependencies, true ) ) {
739+
_doing_it_wrong(
740+
get_class( $this ) . '::register',
741+
sprintf(
742+
/* translators: 1: Script module ID, 2: Comma-separated list of missing dependency IDs. */
743+
__( 'The script module with the ID "%1$s" was enqueued with dependencies that are not registered: %2$s.' ),
744+
$id,
745+
implode( ', ', $missing_dependencies )
746+
),
747+
'7.0.0'
748+
);
749+
$this->modules_with_missing_dependencies[] = $id;
750+
}
751+
726752
return false;
727753
}
728754

wp-includes/class-wp-scripts.php

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1164,4 +1164,22 @@ public function reset() {
11641164
$this->ext_version = '';
11651165
$this->ext_handles = '';
11661166
}
1167+
1168+
/**
1169+
* Gets a script-specific dependency warning message.
1170+
*
1171+
* @since 7.0.0
1172+
*
1173+
* @param string $handle Script handle with missing dependencies.
1174+
* @param string[] $missing_dependency_handles Missing dependency handles.
1175+
* @return string Formatted, localized warning message.
1176+
*/
1177+
protected function get_dependency_warning_message( $handle, $missing_dependency_handles ) {
1178+
return sprintf(
1179+
/* translators: 1: Script handle, 2: Comma-separated list of missing dependency handles. */
1180+
__( 'The script with the handle "%1$s" was enqueued with dependencies that are not registered: %2$s.' ),
1181+
$handle,
1182+
implode( ', ', $missing_dependency_handles )
1183+
);
1184+
}
11671185
}

wp-includes/class-wp-styles.php

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -493,4 +493,22 @@ public function reset() {
493493
$this->concat_version = '';
494494
$this->print_html = '';
495495
}
496+
497+
/**
498+
* Gets a style-specific dependency warning message.
499+
*
500+
* @since 7.0.0
501+
*
502+
* @param string $handle Style handle with missing dependencies.
503+
* @param string[] $missing_dependency_handles Missing dependency handles.
504+
* @return string Formatted, localized warning message.
505+
*/
506+
protected function get_dependency_warning_message( $handle, $missing_dependency_handles ) {
507+
return sprintf(
508+
/* translators: 1: Style handle, 2: Comma-separated list of missing dependency handles. */
509+
__( 'The style with the handle "%1$s" was enqueued with dependencies that are not registered: %2$s.' ),
510+
$handle,
511+
implode( ', ', $missing_dependency_handles )
512+
);
513+
}
496514
}

wp-includes/version.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
*
1717
* @global string $wp_version
1818
*/
19-
$wp_version = '7.0-alpha-61322';
19+
$wp_version = '7.0-alpha-61323';
2020

2121
/**
2222
* Holds the WordPress DB revision, increments when changes are made to the WordPress DB schema.

0 commit comments

Comments
 (0)