Skip to content

Commit

Permalink
Enable an optional namespace parameter for hasAction & hasFilter (#15362
Browse files Browse the repository at this point in the history
)

* from https://github.com/WordPress/packages/pull/106/files

* Update packages/hooks/src/createHasHook.js

Co-Authored-By: Pascal Birchler <[email protected]>

* clean up docblock spacing

* add changelog entry for new namespace parameter for hasAction & hasFilter

* Update packages/hooks/CHANGELOG.md

Co-Authored-By: Grzegorz (Greg) Ziółkowski <[email protected]>

* break out tests

* update readme

* Apply suggestions from code review

Co-Authored-By: Daniel Richards <[email protected]>

* Update CHANGELOG.md
  • Loading branch information
Adam Silverstein authored and gziolo committed Aug 29, 2019
1 parent 7bc32cc commit da806fd
Show file tree
Hide file tree
Showing 4 changed files with 56 additions and 7 deletions.
8 changes: 7 additions & 1 deletion packages/hooks/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,14 @@
## Master

### New Feature

- Enable an optional namespace parameter for `hasAction` & `hasFilter`. When checking if an action or filter exists, `hasAction` and `hasFilter` now accept an optional paramter to limit matches by namespace.

## 2.4.0 (2019-06-12)

### New Feature

- Enable support for the 'all' hook in non production environments.
- Enable support for the 'all' hook in non production environments.

## 2.0.4 (2019-01-03)

Expand Down
4 changes: 2 additions & 2 deletions packages/hooks/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,8 @@ In the WordPress context, API functions can be called via the global `wp.hooks`
* `doingFilter( 'hookName' )`
* `didAction( 'hookName' )`
* `didFilter( 'hookName' )`
* `hasAction( 'hookName' )`
* `hasFilter( 'hookName' )`
* `hasAction( 'hookName', 'namespace' )`
* `hasFilter( 'hookName', 'namespace' )`
* `actions`
* `filters`

Expand Down
16 changes: 12 additions & 4 deletions packages/hooks/src/createHasHook.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,17 +5,25 @@
* @param {Object} hooks Stored hooks, keyed by hook name.
*
* @return {Function} Function that returns whether any handlers are
* attached to a particular hook.
* attached to a particular hook and optional namespace.
*/
function createHasHook( hooks ) {
/**
* Returns how many handlers are attached for the given hook.
* Returns whether any handlers are attached for the given hookName and optional namespace.
*
* @param {string} hookName The name of the hook to check for.
* @param {string} hookName The name of the hook to check for.
* @param {?string} namespace Optional. The unique namespace identifying the callback
* in the form `vendor/plugin/function`.
*
* @return {boolean} Whether there are handlers that are attached to the given hook.
*/
return function hasHook( hookName ) {
return function hasHook( hookName, namespace ) {
// Use the namespace if provided.
if ( 'undefined' !== typeof namespace ) {
return hookName in hooks &&
hooks[ hookName ].handlers.some( ( hook ) => hook.namespace === namespace );
}

return hookName in hooks;
};
}
Expand Down
35 changes: 35 additions & 0 deletions packages/hooks/src/test/index.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -740,3 +740,38 @@ test( 'add multiple all actions and run it any hook to trigger them by priority'
expect( window.actionValue ).toBe( 'ba' );
} );

test( 'checking hasAction with named callbacks and removing', () => {
addAction( 'test.action', 'my_callback', () => {} );
expect( hasAction( 'test.action', 'not_my_callback' ) ).toBe( false );
expect( hasAction( 'test.action', 'my_callback' ) ).toBe( true );
removeAction( 'test.action', 'my_callback' );
expect( hasAction( 'test.action', 'my_callback' ) ).toBe( false );
} );

test( 'checking hasAction with named callbacks and removeAllActions', () => {
addAction( 'test.action', 'my_callback', () => {} );
addAction( 'test.action', 'my_second_callback', () => {} );
expect( hasAction( 'test.action', 'my_callback' ) ).toBe( true );
expect( hasAction( 'test.action', 'my_callback' ) ).toBe( true );
removeAllActions( 'test.action' );
expect( hasAction( 'test.action', 'my_callback' ) ).toBe( false );
expect( hasAction( 'test.action', 'my_callback' ) ).toBe( false );
} );

test( 'checking hasFilter with named callbacks and removing', () => {
addFilter( 'test.filter', 'my_callback', () => {} );
expect( hasFilter( 'test.filter', 'not_my_callback' ) ).toBe( false );
expect( hasFilter( 'test.filter', 'my_callback' ) ).toBe( true );
removeFilter( 'test.filter', 'my_callback' );
expect( hasFilter( 'test.filter', 'my_callback' ) ).toBe( false );
} );

test( 'checking hasFilter with named callbacks and removeAllActions', () => {
addFilter( 'test.filter', 'my_callback', () => {} );
addFilter( 'test.filter', 'my_second_callback', () => {} );
expect( hasFilter( 'test.filter', 'my_callback' ) ).toBe( true );
expect( hasFilter( 'test.filter', 'my_second_callback' ) ).toBe( true );
removeAllFilters( 'test.filter' );
expect( hasFilter( 'test.filter', 'my_callback' ) ).toBe( false );
expect( hasFilter( 'test.filter', 'my_second_callback' ) ).toBe( false );
} );

0 comments on commit da806fd

Please sign in to comment.