@wordpress/abilities 0.1.1-next.dc3f6d3c1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +9 -0
- package/LICENSE.md +788 -0
- package/README.md +302 -0
- package/build/api.js +189 -0
- package/build/api.js.map +7 -0
- package/build/index.js +53 -0
- package/build/index.js.map +7 -0
- package/build/store/actions.js +183 -0
- package/build/store/actions.js.map +7 -0
- package/build/store/constants.js +58 -0
- package/build/store/constants.js.map +7 -0
- package/build/store/index.js +77 -0
- package/build/store/index.js.map +7 -0
- package/build/store/reducer.js +126 -0
- package/build/store/reducer.js.map +7 -0
- package/build/store/resolvers.js +107 -0
- package/build/store/resolvers.js.map +7 -0
- package/build/store/selectors.js +64 -0
- package/build/store/selectors.js.map +7 -0
- package/build/store/tests/actions.test.js +792 -0
- package/build/store/tests/actions.test.js.map +7 -0
- package/build/store/tests/reducer.test.js +743 -0
- package/build/store/tests/reducer.test.js.map +7 -0
- package/build/store/tests/resolvers.test.js +520 -0
- package/build/store/tests/resolvers.test.js.map +7 -0
- package/build/store/tests/selectors.test.js +349 -0
- package/build/store/tests/selectors.test.js.map +7 -0
- package/build/tests/api.test.js +546 -0
- package/build/tests/api.test.js.map +7 -0
- package/build/tests/validation.test.js +453 -0
- package/build/tests/validation.test.js.map +7 -0
- package/build/types.js +19 -0
- package/build/types.js.map +7 -0
- package/build/validation.js +144 -0
- package/build/validation.js.map +7 -0
- package/build-module/api.js +146 -0
- package/build-module/api.js.map +7 -0
- package/build-module/index.js +28 -0
- package/build-module/index.js.map +7 -0
- package/build-module/store/actions.js +161 -0
- package/build-module/store/actions.js.map +7 -0
- package/build-module/store/constants.js +24 -0
- package/build-module/store/constants.js.map +7 -0
- package/build-module/store/index.js +47 -0
- package/build-module/store/index.js.map +7 -0
- package/build-module/store/reducer.js +112 -0
- package/build-module/store/reducer.js.map +7 -0
- package/build-module/store/resolvers.js +84 -0
- package/build-module/store/resolvers.js.map +7 -0
- package/build-module/store/selectors.js +36 -0
- package/build-module/store/selectors.js.map +7 -0
- package/build-module/store/tests/actions.test.js +804 -0
- package/build-module/store/tests/actions.test.js.map +7 -0
- package/build-module/store/tests/reducer.test.js +726 -0
- package/build-module/store/tests/reducer.test.js.map +7 -0
- package/build-module/store/tests/resolvers.test.js +523 -0
- package/build-module/store/tests/resolvers.test.js.map +7 -0
- package/build-module/store/tests/selectors.test.js +352 -0
- package/build-module/store/tests/selectors.test.js.map +7 -0
- package/build-module/tests/api.test.js +530 -0
- package/build-module/tests/api.test.js.map +7 -0
- package/build-module/tests/validation.test.js +451 -0
- package/build-module/tests/validation.test.js.map +7 -0
- package/build-module/types.js +1 -0
- package/build-module/types.js.map +7 -0
- package/build-module/validation.js +109 -0
- package/build-module/validation.js.map +7 -0
- package/build-types/api.d.ts +138 -0
- package/build-types/api.d.ts.map +1 -0
- package/build-types/index.d.ts +41 -0
- package/build-types/index.d.ts.map +1 -0
- package/build-types/store/actions.d.ts +76 -0
- package/build-types/store/actions.d.ts.map +1 -0
- package/build-types/store/constants.d.ts +14 -0
- package/build-types/store/constants.d.ts.map +1 -0
- package/build-types/store/index.d.ts +7 -0
- package/build-types/store/index.d.ts.map +1 -0
- package/build-types/store/reducer.d.ts +22 -0
- package/build-types/store/reducer.d.ts.map +1 -0
- package/build-types/store/resolvers.d.ts +47 -0
- package/build-types/store/resolvers.d.ts.map +1 -0
- package/build-types/store/selectors.d.ts +37 -0
- package/build-types/store/selectors.d.ts.map +1 -0
- package/build-types/types.d.ts +163 -0
- package/build-types/types.d.ts.map +1 -0
- package/build-types/validation.d.ts +23 -0
- package/build-types/validation.d.ts.map +1 -0
- package/package.json +52 -0
- package/src/api.ts +339 -0
- package/src/index.ts +65 -0
- package/src/store/actions.ts +247 -0
- package/src/store/constants.ts +15 -0
- package/src/store/index.ts +55 -0
- package/src/store/reducer.ts +184 -0
- package/src/store/resolvers.ts +151 -0
- package/src/store/selectors.ts +82 -0
- package/src/store/tests/actions.test.ts +950 -0
- package/src/store/tests/reducer.test.ts +861 -0
- package/src/store/tests/resolvers.test.ts +642 -0
- package/src/store/tests/selectors.test.ts +412 -0
- package/src/tests/api.test.ts +655 -0
- package/src/tests/validation.test.ts +532 -0
- package/src/types.ts +190 -0
- package/src/validation.ts +207 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/store/index.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * WordPress dependencies\n */\nimport { createReduxStore, register, dispatch } from '@wordpress/data';\nimport { store as coreStore } from '@wordpress/core-data';\nimport { __ } from '@wordpress/i18n';\n\n/**\n * Internal dependencies\n */\nimport reducer from './reducer';\nimport * as actions from './actions';\nimport * as selectors from './selectors';\nimport * as resolvers from './resolvers';\nimport {\n\tSTORE_NAME,\n\tENTITY_KIND,\n\tENTITY_NAME,\n\tENTITY_NAME_CATEGORIES,\n} from './constants';\n\n/**\n * The abilities store definition.\n */\nexport const store = createReduxStore( STORE_NAME, {\n\treducer,\n\tactions,\n\tselectors,\n\tresolvers,\n} );\n\nregister( store );\n\ndispatch( coreStore ).addEntities( [\n\t{\n\t\tname: ENTITY_NAME,\n\t\tkind: ENTITY_KIND,\n\t\tkey: 'name',\n\t\tbaseURL: '/wp-abilities/v1/abilities',\n\t\tbaseURLParams: { context: 'edit' },\n\t\tplural: 'abilities',\n\t\tlabel: __( 'Abilities' ),\n\t\tsupportsPagination: true,\n\t},\n\t{\n\t\tname: ENTITY_NAME_CATEGORIES,\n\t\tkind: ENTITY_KIND,\n\t\tkey: 'slug',\n\t\tbaseURL: '/wp-abilities/v1/categories',\n\t\tbaseURLParams: { context: 'edit' },\n\t\tplural: 'ability-categories',\n\t\tlabel: __( 'Ability Categories' ),\n\t\tsupportsPagination: true,\n\t},\n] );\n"],
|
|
5
|
+
"mappings": ";AAGA,SAAS,kBAAkB,UAAU,gBAAgB;AACrD,SAAS,SAAS,iBAAiB;AACnC,SAAS,UAAU;AAKnB,OAAO,aAAa;AACpB,YAAY,aAAa;AACzB,YAAY,eAAe;AAC3B,YAAY,eAAe;AAC3B;AAAA,EACC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACM;AAKA,IAAM,QAAQ,iBAAkB,YAAY;AAAA,EAClD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD,CAAE;AAEF,SAAU,KAAM;AAEhB,SAAU,SAAU,EAAE,YAAa;AAAA,EAClC;AAAA,IACC,MAAM;AAAA,IACN,MAAM;AAAA,IACN,KAAK;AAAA,IACL,SAAS;AAAA,IACT,eAAe,EAAE,SAAS,OAAO;AAAA,IACjC,QAAQ;AAAA,IACR,OAAO,GAAI,WAAY;AAAA,IACvB,oBAAoB;AAAA,EACrB;AAAA,EACA;AAAA,IACC,MAAM;AAAA,IACN,MAAM;AAAA,IACN,KAAK;AAAA,IACL,SAAS;AAAA,IACT,eAAe,EAAE,SAAS,OAAO;AAAA,IACjC,QAAQ;AAAA,IACR,OAAO,GAAI,oBAAqB;AAAA,IAChC,oBAAoB;AAAA,EACrB;AACD,CAAE;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
// packages/abilities/src/store/reducer.ts
|
|
2
|
+
import { combineReducers } from "@wordpress/data";
|
|
3
|
+
import {
|
|
4
|
+
RECEIVE_ABILITIES,
|
|
5
|
+
REGISTER_ABILITY,
|
|
6
|
+
UNREGISTER_ABILITY,
|
|
7
|
+
RECEIVE_CATEGORIES,
|
|
8
|
+
REGISTER_ABILITY_CATEGORY,
|
|
9
|
+
UNREGISTER_ABILITY_CATEGORY
|
|
10
|
+
} from "./constants";
|
|
11
|
+
var ABILITY_KEYS = [
|
|
12
|
+
"name",
|
|
13
|
+
"label",
|
|
14
|
+
"description",
|
|
15
|
+
"category",
|
|
16
|
+
"input_schema",
|
|
17
|
+
"output_schema",
|
|
18
|
+
"meta",
|
|
19
|
+
"callback",
|
|
20
|
+
"permissionCallback"
|
|
21
|
+
];
|
|
22
|
+
var CATEGORY_KEYS = ["slug", "label", "description", "meta"];
|
|
23
|
+
function sanitizeAbility(ability) {
|
|
24
|
+
return Object.keys(ability).filter(
|
|
25
|
+
(key) => ABILITY_KEYS.includes(key) && ability[key] !== void 0
|
|
26
|
+
).reduce(
|
|
27
|
+
(obj, key) => ({ ...obj, [key]: ability[key] }),
|
|
28
|
+
{}
|
|
29
|
+
);
|
|
30
|
+
}
|
|
31
|
+
function sanitizeCategory(category) {
|
|
32
|
+
return Object.keys(category).filter(
|
|
33
|
+
(key) => CATEGORY_KEYS.includes(key) && category[key] !== void 0
|
|
34
|
+
).reduce(
|
|
35
|
+
(obj, key) => ({ ...obj, [key]: category[key] }),
|
|
36
|
+
{}
|
|
37
|
+
);
|
|
38
|
+
}
|
|
39
|
+
var DEFAULT_STATE = {};
|
|
40
|
+
function abilitiesByName(state = DEFAULT_STATE, action) {
|
|
41
|
+
switch (action.type) {
|
|
42
|
+
case RECEIVE_ABILITIES: {
|
|
43
|
+
if (!action.abilities) {
|
|
44
|
+
return state;
|
|
45
|
+
}
|
|
46
|
+
const newState = {};
|
|
47
|
+
action.abilities.forEach((ability) => {
|
|
48
|
+
newState[ability.name] = sanitizeAbility(ability);
|
|
49
|
+
});
|
|
50
|
+
return newState;
|
|
51
|
+
}
|
|
52
|
+
case REGISTER_ABILITY: {
|
|
53
|
+
if (!action.ability) {
|
|
54
|
+
return state;
|
|
55
|
+
}
|
|
56
|
+
return {
|
|
57
|
+
...state,
|
|
58
|
+
[action.ability.name]: sanitizeAbility(action.ability)
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
case UNREGISTER_ABILITY: {
|
|
62
|
+
if (!action.name || !state[action.name]) {
|
|
63
|
+
return state;
|
|
64
|
+
}
|
|
65
|
+
const { [action.name]: _, ...newState } = state;
|
|
66
|
+
return newState;
|
|
67
|
+
}
|
|
68
|
+
default:
|
|
69
|
+
return state;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
var DEFAULT_CATEGORIES_STATE = {};
|
|
73
|
+
function categoriesBySlug(state = DEFAULT_CATEGORIES_STATE, action) {
|
|
74
|
+
switch (action.type) {
|
|
75
|
+
case RECEIVE_CATEGORIES: {
|
|
76
|
+
if (!action.categories) {
|
|
77
|
+
return state;
|
|
78
|
+
}
|
|
79
|
+
const newState = {};
|
|
80
|
+
action.categories.forEach((category) => {
|
|
81
|
+
newState[category.slug] = sanitizeCategory(category);
|
|
82
|
+
});
|
|
83
|
+
return newState;
|
|
84
|
+
}
|
|
85
|
+
case REGISTER_ABILITY_CATEGORY: {
|
|
86
|
+
if (!action.category) {
|
|
87
|
+
return state;
|
|
88
|
+
}
|
|
89
|
+
return {
|
|
90
|
+
...state,
|
|
91
|
+
[action.category.slug]: sanitizeCategory(action.category)
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
case UNREGISTER_ABILITY_CATEGORY: {
|
|
95
|
+
if (!action.slug || !state[action.slug]) {
|
|
96
|
+
return state;
|
|
97
|
+
}
|
|
98
|
+
const { [action.slug]: _, ...newState } = state;
|
|
99
|
+
return newState;
|
|
100
|
+
}
|
|
101
|
+
default:
|
|
102
|
+
return state;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
var reducer_default = combineReducers({
|
|
106
|
+
abilitiesByName,
|
|
107
|
+
categoriesBySlug
|
|
108
|
+
});
|
|
109
|
+
export {
|
|
110
|
+
reducer_default as default
|
|
111
|
+
};
|
|
112
|
+
//# sourceMappingURL=reducer.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/store/reducer.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * WordPress dependencies\n */\nimport { combineReducers } from '@wordpress/data';\n\n/**\n * Internal dependencies\n */\nimport type { Ability, AbilityCategory } from '../types';\nimport {\n\tRECEIVE_ABILITIES,\n\tREGISTER_ABILITY,\n\tUNREGISTER_ABILITY,\n\tRECEIVE_CATEGORIES,\n\tREGISTER_ABILITY_CATEGORY,\n\tUNREGISTER_ABILITY_CATEGORY,\n} from './constants';\n\n/**\n * Valid keys for an Ability object.\n * Used to filter out non-standard properties from server responses.\n */\nconst ABILITY_KEYS = [\n\t'name',\n\t'label',\n\t'description',\n\t'category',\n\t'input_schema',\n\t'output_schema',\n\t'meta',\n\t'callback',\n\t'permissionCallback',\n] as const;\n\n/**\n * Valid keys for an AbilityCategory object.\n * Used to filter out non-standard properties from server responses.\n */\nconst CATEGORY_KEYS = [ 'slug', 'label', 'description', 'meta' ] as const;\n\n/**\n * Sanitizes an ability object to only include valid properties.\n * This ensures consistent shape regardless of source (server/client).\n *\n * @param ability Raw ability object that may contain extra properties.\n * @return Sanitized ability with only valid properties.\n */\nfunction sanitizeAbility( ability: any ): Ability {\n\treturn Object.keys( ability )\n\t\t.filter(\n\t\t\t( key ) =>\n\t\t\t\tABILITY_KEYS.includes( key as any ) &&\n\t\t\t\tability[ key ] !== undefined\n\t\t)\n\t\t.reduce(\n\t\t\t( obj, key ) => ( { ...obj, [ key ]: ability[ key ] } ),\n\t\t\t{} as Ability\n\t\t);\n}\n\n/**\n * Sanitizes a category object to only include valid properties.\n * This ensures consistent shape regardless of source.\n *\n * @param category Raw category object that may contain extra properties.\n * @return Sanitized category with only valid properties.\n */\nfunction sanitizeCategory( category: any ): AbilityCategory {\n\treturn Object.keys( category )\n\t\t.filter(\n\t\t\t( key ) =>\n\t\t\t\tCATEGORY_KEYS.includes( key as any ) &&\n\t\t\t\tcategory[ key ] !== undefined\n\t\t)\n\t\t.reduce(\n\t\t\t( obj, key ) => ( { ...obj, [ key ]: category[ key ] } ),\n\t\t\t{} as AbilityCategory\n\t\t);\n}\n\ninterface AbilitiesAction {\n\ttype: string;\n\tabilities?: Ability[];\n\tability?: Ability;\n\tcategories?: AbilityCategory[];\n\tcategory?: AbilityCategory;\n\tname?: string;\n\tslug?: string;\n}\n\nconst DEFAULT_STATE: Record< string, Ability > = {};\n\n/**\n * Reducer managing the abilities by name.\n *\n * @param state Current state.\n * @param action Dispatched action.\n * @return New state.\n */\nfunction abilitiesByName(\n\tstate: Record< string, Ability > = DEFAULT_STATE,\n\taction: AbilitiesAction\n): Record< string, Ability > {\n\tswitch ( action.type ) {\n\t\tcase RECEIVE_ABILITIES: {\n\t\t\tif ( ! action.abilities ) {\n\t\t\t\treturn state;\n\t\t\t}\n\t\t\tconst newState: Record< string, Ability > = {};\n\t\t\taction.abilities.forEach( ( ability ) => {\n\t\t\t\tnewState[ ability.name ] = sanitizeAbility( ability );\n\t\t\t} );\n\t\t\treturn newState;\n\t\t}\n\t\tcase REGISTER_ABILITY: {\n\t\t\tif ( ! action.ability ) {\n\t\t\t\treturn state;\n\t\t\t}\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\t[ action.ability.name ]: sanitizeAbility( action.ability ),\n\t\t\t};\n\t\t}\n\t\tcase UNREGISTER_ABILITY: {\n\t\t\tif ( ! action.name || ! state[ action.name ] ) {\n\t\t\t\treturn state;\n\t\t\t}\n\t\t\tconst { [ action.name ]: _, ...newState } = state;\n\t\t\treturn newState;\n\t\t}\n\t\tdefault:\n\t\t\treturn state;\n\t}\n}\n\nconst DEFAULT_CATEGORIES_STATE: Record< string, AbilityCategory > = {};\n\n/**\n * Reducer managing the categories by slug.\n *\n * @param state Current state.\n * @param action Dispatched action.\n * @return New state.\n */\nfunction categoriesBySlug(\n\tstate: Record< string, AbilityCategory > = DEFAULT_CATEGORIES_STATE,\n\taction: AbilitiesAction\n): Record< string, AbilityCategory > {\n\tswitch ( action.type ) {\n\t\tcase RECEIVE_CATEGORIES: {\n\t\t\tif ( ! action.categories ) {\n\t\t\t\treturn state;\n\t\t\t}\n\t\t\tconst newState: Record< string, AbilityCategory > = {};\n\t\t\taction.categories.forEach( ( category ) => {\n\t\t\t\tnewState[ category.slug ] = sanitizeCategory( category );\n\t\t\t} );\n\t\t\treturn newState;\n\t\t}\n\t\tcase REGISTER_ABILITY_CATEGORY: {\n\t\t\tif ( ! action.category ) {\n\t\t\t\treturn state;\n\t\t\t}\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\t[ action.category.slug ]: sanitizeCategory( action.category ),\n\t\t\t};\n\t\t}\n\t\tcase UNREGISTER_ABILITY_CATEGORY: {\n\t\t\tif ( ! action.slug || ! state[ action.slug ] ) {\n\t\t\t\treturn state;\n\t\t\t}\n\t\t\tconst { [ action.slug ]: _, ...newState } = state;\n\t\t\treturn newState;\n\t\t}\n\t\tdefault:\n\t\t\treturn state;\n\t}\n}\n\nexport default combineReducers( {\n\tabilitiesByName,\n\tcategoriesBySlug,\n} );\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
// packages/abilities/src/store/resolvers.ts
|
|
2
|
+
import { store as coreStore } from "@wordpress/core-data";
|
|
3
|
+
import { ENTITY_KIND, ENTITY_NAME, ENTITY_NAME_CATEGORIES } from "./constants";
|
|
4
|
+
import {
|
|
5
|
+
receiveAbilities,
|
|
6
|
+
receiveCategories,
|
|
7
|
+
registerAbility,
|
|
8
|
+
registerAbilityCategory
|
|
9
|
+
} from "./actions";
|
|
10
|
+
function getAbilities() {
|
|
11
|
+
return async ({ dispatch, registry, select }) => {
|
|
12
|
+
const existingAbilities = select.getAbilities();
|
|
13
|
+
const hasServerAbilities = existingAbilities.some(
|
|
14
|
+
(ability) => !ability.callback
|
|
15
|
+
);
|
|
16
|
+
if (hasServerAbilities) {
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
const abilities = await registry.resolveSelect(coreStore).getEntityRecords(ENTITY_KIND, ENTITY_NAME, {
|
|
20
|
+
per_page: -1
|
|
21
|
+
});
|
|
22
|
+
dispatch(receiveAbilities(abilities || []));
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
function getAbility(name) {
|
|
26
|
+
return async ({ dispatch, registry, select }) => {
|
|
27
|
+
const existingAbility = select.getAbility(name);
|
|
28
|
+
if (existingAbility) {
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
try {
|
|
32
|
+
const ability = await registry.resolveSelect(coreStore).getEntityRecord(ENTITY_KIND, ENTITY_NAME, name);
|
|
33
|
+
if (ability) {
|
|
34
|
+
await dispatch(registerAbility(ability));
|
|
35
|
+
}
|
|
36
|
+
} catch (error) {
|
|
37
|
+
console.debug(`Ability not found: ${name}`);
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
function getAbilityCategories() {
|
|
42
|
+
return async ({ dispatch, registry, select }) => {
|
|
43
|
+
const existingCategories = select.getAbilityCategories();
|
|
44
|
+
const hasServerCategories = existingCategories.some(
|
|
45
|
+
(category) => !category.meta?._clientRegistered
|
|
46
|
+
);
|
|
47
|
+
if (hasServerCategories) {
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
const categories = await registry.resolveSelect(coreStore).getEntityRecords(ENTITY_KIND, ENTITY_NAME_CATEGORIES, {
|
|
51
|
+
per_page: -1
|
|
52
|
+
});
|
|
53
|
+
dispatch(receiveCategories(categories || []));
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
function getAbilityCategory(slug) {
|
|
57
|
+
return async ({ dispatch, registry, select }) => {
|
|
58
|
+
const existingCategory = select.getAbilityCategory(slug);
|
|
59
|
+
if (existingCategory) {
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
try {
|
|
63
|
+
const category = await registry.resolveSelect(coreStore).getEntityRecord(ENTITY_KIND, ENTITY_NAME_CATEGORIES, slug);
|
|
64
|
+
if (category) {
|
|
65
|
+
await dispatch(
|
|
66
|
+
registerAbilityCategory(category.slug, {
|
|
67
|
+
label: category.label,
|
|
68
|
+
description: category.description,
|
|
69
|
+
meta: category.meta
|
|
70
|
+
})
|
|
71
|
+
);
|
|
72
|
+
}
|
|
73
|
+
} catch (error) {
|
|
74
|
+
console.debug(`Category not found: ${slug}`);
|
|
75
|
+
}
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
export {
|
|
79
|
+
getAbilities,
|
|
80
|
+
getAbility,
|
|
81
|
+
getAbilityCategories,
|
|
82
|
+
getAbilityCategory
|
|
83
|
+
};
|
|
84
|
+
//# sourceMappingURL=resolvers.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/store/resolvers.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * WordPress dependencies\n */\nimport { store as coreStore } from '@wordpress/core-data';\n\n/**\n * Internal dependencies\n */\nimport type { Ability, AbilityCategory } from '../types';\nimport { ENTITY_KIND, ENTITY_NAME, ENTITY_NAME_CATEGORIES } from './constants';\nimport {\n\treceiveAbilities,\n\treceiveCategories,\n\tregisterAbility,\n\tregisterAbilityCategory,\n} from './actions';\n\n/**\n * Resolver for getAbilities selector.\n * Fetches all abilities from the server.\n *\n * The resolver only fetches once (without query args filter) and stores all abilities.\n * Query args filtering handled client-side by the selector for better performance\n * and to avoid multiple API requests when filtering by different categories.\n */\nexport function getAbilities() {\n\t// @ts-expect-error - registry types are not yet available\n\treturn async ( { dispatch, registry, select } ) => {\n\t\tconst existingAbilities = select.getAbilities();\n\n\t\t// Check if we have any server-side abilities (abilities without callbacks)\n\t\t// Client abilities have callbacks and are registered immediately on page load\n\t\t// We only want to skip fetching if we've already fetched server abilities\n\t\tconst hasServerAbilities = existingAbilities.some(\n\t\t\t( ability: Ability ) => ! ability.callback\n\t\t);\n\n\t\tif ( hasServerAbilities ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst abilities = await registry\n\t\t\t.resolveSelect( coreStore )\n\t\t\t.getEntityRecords( ENTITY_KIND, ENTITY_NAME, {\n\t\t\t\tper_page: -1,\n\t\t\t} );\n\n\t\tdispatch( receiveAbilities( abilities || [] ) );\n\t};\n}\n\n/**\n * Resolver for getAbility selector.\n * Fetches a specific ability from the server if not already in store.\n *\n * @param name Ability name.\n */\nexport function getAbility( name: string ) {\n\t// @ts-expect-error - registry types are not yet available\n\treturn async ( { dispatch, registry, select } ) => {\n\t\t// Check if ability already exists in store (i.e. client ability or already fetched)\n\t\tconst existingAbility = select.getAbility( name );\n\t\tif ( existingAbility ) {\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tconst ability = await registry\n\t\t\t\t.resolveSelect( coreStore )\n\t\t\t\t.getEntityRecord( ENTITY_KIND, ENTITY_NAME, name );\n\n\t\t\tif ( ability ) {\n\t\t\t\tawait dispatch( registerAbility( ability ) );\n\t\t\t}\n\t\t} catch ( error ) {\n\t\t\t// If ability doesn't exist or error, we'll return undefined from the selector\n\t\t\t// eslint-disable-next-line no-console\n\t\t\tconsole.debug( `Ability not found: ${ name }` );\n\t\t}\n\t};\n}\n\n/**\n * Resolver for getAbilityCategories selector.\n * Fetches all categories from the server.\n *\n * The resolver only fetches once and stores all categories.\n */\nexport function getAbilityCategories() {\n\t// @ts-expect-error - registry types are not yet available\n\treturn async ( { dispatch, registry, select } ) => {\n\t\tconst existingCategories = select.getAbilityCategories();\n\n\t\t// Check if we have any server-side categories (categories without meta._clientRegistered flag)\n\t\t// Client categories have meta._clientRegistered=true and might be registered immediately\n\t\t// We only want to skip fetching if we've already fetched server categories\n\t\tconst hasServerCategories = existingCategories.some(\n\t\t\t( category: AbilityCategory ) => ! category.meta?._clientRegistered\n\t\t);\n\n\t\tif ( hasServerCategories ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst categories = await registry\n\t\t\t.resolveSelect( coreStore )\n\t\t\t.getEntityRecords( ENTITY_KIND, ENTITY_NAME_CATEGORIES, {\n\t\t\t\tper_page: -1,\n\t\t\t} );\n\n\t\tdispatch( receiveCategories( categories || [] ) );\n\t};\n}\n\n/**\n * Resolver for getAbilityCategory selector.\n * Fetches a specific category from the server if not already in store.\n *\n * @param slug Category slug.\n */\nexport function getAbilityCategory( slug: string ) {\n\t// @ts-expect-error - registry types are not yet available\n\treturn async ( { dispatch, registry, select } ) => {\n\t\t// Check if category already exists in store (either client-registered or server-fetched).\n\t\t// This prevents unnecessary network requests while allowing client-side categories\n\t\t// to be retrieved immediately without hitting the API.\n\t\tconst existingCategory = select.getAbilityCategory( slug );\n\t\tif ( existingCategory ) {\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tconst category = await registry\n\t\t\t\t.resolveSelect( coreStore )\n\t\t\t\t.getEntityRecord( ENTITY_KIND, ENTITY_NAME_CATEGORIES, slug );\n\n\t\t\tif ( category ) {\n\t\t\t\tawait dispatch(\n\t\t\t\t\tregisterAbilityCategory( category.slug, {\n\t\t\t\t\t\tlabel: category.label,\n\t\t\t\t\t\tdescription: category.description,\n\t\t\t\t\t\tmeta: category.meta,\n\t\t\t\t\t} )\n\t\t\t\t);\n\t\t\t}\n\t\t} catch ( error ) {\n\t\t\t// eslint-disable-next-line no-console\n\t\t\tconsole.debug( `Category not found: ${ slug }` );\n\t\t}\n\t};\n}\n"],
|
|
5
|
+
"mappings": ";AAGA,SAAS,SAAS,iBAAiB;AAMnC,SAAS,aAAa,aAAa,8BAA8B;AACjE;AAAA,EACC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACM;AAUA,SAAS,eAAe;AAE9B,SAAO,OAAQ,EAAE,UAAU,UAAU,OAAO,MAAO;AAClD,UAAM,oBAAoB,OAAO,aAAa;AAK9C,UAAM,qBAAqB,kBAAkB;AAAA,MAC5C,CAAE,YAAsB,CAAE,QAAQ;AAAA,IACnC;AAEA,QAAK,oBAAqB;AACzB;AAAA,IACD;AAEA,UAAM,YAAY,MAAM,SACtB,cAAe,SAAU,EACzB,iBAAkB,aAAa,aAAa;AAAA,MAC5C,UAAU;AAAA,IACX,CAAE;AAEH,aAAU,iBAAkB,aAAa,CAAC,CAAE,CAAE;AAAA,EAC/C;AACD;AAQO,SAAS,WAAY,MAAe;AAE1C,SAAO,OAAQ,EAAE,UAAU,UAAU,OAAO,MAAO;AAElD,UAAM,kBAAkB,OAAO,WAAY,IAAK;AAChD,QAAK,iBAAkB;AACtB;AAAA,IACD;AAEA,QAAI;AACH,YAAM,UAAU,MAAM,SACpB,cAAe,SAAU,EACzB,gBAAiB,aAAa,aAAa,IAAK;AAElD,UAAK,SAAU;AACd,cAAM,SAAU,gBAAiB,OAAQ,CAAE;AAAA,MAC5C;AAAA,IACD,SAAU,OAAQ;AAGjB,cAAQ,MAAO,sBAAuB,IAAK,EAAG;AAAA,IAC/C;AAAA,EACD;AACD;AAQO,SAAS,uBAAuB;AAEtC,SAAO,OAAQ,EAAE,UAAU,UAAU,OAAO,MAAO;AAClD,UAAM,qBAAqB,OAAO,qBAAqB;AAKvD,UAAM,sBAAsB,mBAAmB;AAAA,MAC9C,CAAE,aAA+B,CAAE,SAAS,MAAM;AAAA,IACnD;AAEA,QAAK,qBAAsB;AAC1B;AAAA,IACD;AAEA,UAAM,aAAa,MAAM,SACvB,cAAe,SAAU,EACzB,iBAAkB,aAAa,wBAAwB;AAAA,MACvD,UAAU;AAAA,IACX,CAAE;AAEH,aAAU,kBAAmB,cAAc,CAAC,CAAE,CAAE;AAAA,EACjD;AACD;AAQO,SAAS,mBAAoB,MAAe;AAElD,SAAO,OAAQ,EAAE,UAAU,UAAU,OAAO,MAAO;AAIlD,UAAM,mBAAmB,OAAO,mBAAoB,IAAK;AACzD,QAAK,kBAAmB;AACvB;AAAA,IACD;AAEA,QAAI;AACH,YAAM,WAAW,MAAM,SACrB,cAAe,SAAU,EACzB,gBAAiB,aAAa,wBAAwB,IAAK;AAE7D,UAAK,UAAW;AACf,cAAM;AAAA,UACL,wBAAyB,SAAS,MAAM;AAAA,YACvC,OAAO,SAAS;AAAA,YAChB,aAAa,SAAS;AAAA,YACtB,MAAM,SAAS;AAAA,UAChB,CAAE;AAAA,QACH;AAAA,MACD;AAAA,IACD,SAAU,OAAQ;AAEjB,cAAQ,MAAO,uBAAwB,IAAK,EAAG;AAAA,IAChD;AAAA,EACD;AACD;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
// packages/abilities/src/store/selectors.ts
|
|
2
|
+
import { createSelector } from "@wordpress/data";
|
|
3
|
+
var getAbilities = createSelector(
|
|
4
|
+
(state, { category } = {}) => {
|
|
5
|
+
const abilities = Object.values(state.abilitiesByName);
|
|
6
|
+
if (category) {
|
|
7
|
+
return abilities.filter(
|
|
8
|
+
(ability) => ability.category === category
|
|
9
|
+
);
|
|
10
|
+
}
|
|
11
|
+
return abilities;
|
|
12
|
+
},
|
|
13
|
+
(state, category) => [
|
|
14
|
+
state.abilitiesByName,
|
|
15
|
+
category
|
|
16
|
+
]
|
|
17
|
+
);
|
|
18
|
+
function getAbility(state, name) {
|
|
19
|
+
return state.abilitiesByName[name];
|
|
20
|
+
}
|
|
21
|
+
var getAbilityCategories = createSelector(
|
|
22
|
+
(state) => {
|
|
23
|
+
return Object.values(state.categoriesBySlug);
|
|
24
|
+
},
|
|
25
|
+
(state) => [state.categoriesBySlug]
|
|
26
|
+
);
|
|
27
|
+
function getAbilityCategory(state, slug) {
|
|
28
|
+
return state.categoriesBySlug[slug];
|
|
29
|
+
}
|
|
30
|
+
export {
|
|
31
|
+
getAbilities,
|
|
32
|
+
getAbility,
|
|
33
|
+
getAbilityCategories,
|
|
34
|
+
getAbilityCategory
|
|
35
|
+
};
|
|
36
|
+
//# sourceMappingURL=selectors.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/store/selectors.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * WordPress dependencies\n */\nimport { createSelector } from '@wordpress/data';\n\n/**\n * Internal dependencies\n */\nimport type {\n\tAbility,\n\tAbilityCategory,\n\tAbilitiesQueryArgs,\n\tAbilitiesState,\n} from '../types';\n\n/**\n * Returns all registered abilities.\n * Optionally filters by query arguments.\n *\n * @param state Store state.\n * @param args Optional query arguments to filter. Defaults to empty object.\n * @return Array of abilities.\n */\nexport const getAbilities = createSelector(\n\t(\n\t\tstate: AbilitiesState,\n\t\t{ category }: AbilitiesQueryArgs = {}\n\t): Ability[] => {\n\t\tconst abilities = Object.values( state.abilitiesByName );\n\t\tif ( category ) {\n\t\t\treturn abilities.filter(\n\t\t\t\t( ability ) => ability.category === category\n\t\t\t);\n\t\t}\n\t\treturn abilities;\n\t},\n\t( state: AbilitiesState, category?: string ) => [\n\t\tstate.abilitiesByName,\n\t\tcategory,\n\t]\n);\n\n/**\n * Returns a specific ability by name.\n *\n * @param state Store state.\n * @param name Ability name.\n * @return Ability object or undefined if not found.\n */\nexport function getAbility(\n\tstate: AbilitiesState,\n\tname: string\n): Ability | undefined {\n\treturn state.abilitiesByName[ name ];\n}\n\n/**\n * Returns all registered ability categories.\n *\n * @param state Store state.\n * @return Array of categories.\n */\nexport const getAbilityCategories = createSelector(\n\t( state: AbilitiesState ): AbilityCategory[] => {\n\t\treturn Object.values( state.categoriesBySlug );\n\t},\n\t( state: AbilitiesState ) => [ state.categoriesBySlug ]\n);\n\n/**\n * Returns a specific ability category by slug.\n *\n * @param state Store state.\n * @param slug Category slug.\n * @return Category object or undefined if not found.\n */\nexport function getAbilityCategory(\n\tstate: AbilitiesState,\n\tslug: string\n): AbilityCategory | undefined {\n\treturn state.categoriesBySlug[ slug ];\n}\n"],
|
|
5
|
+
"mappings": ";AAGA,SAAS,sBAAsB;AAoBxB,IAAM,eAAe;AAAA,EAC3B,CACC,OACA,EAAE,SAAS,IAAwB,CAAC,MACrB;AACf,UAAM,YAAY,OAAO,OAAQ,MAAM,eAAgB;AACvD,QAAK,UAAW;AACf,aAAO,UAAU;AAAA,QAChB,CAAE,YAAa,QAAQ,aAAa;AAAA,MACrC;AAAA,IACD;AACA,WAAO;AAAA,EACR;AAAA,EACA,CAAE,OAAuB,aAAuB;AAAA,IAC/C,MAAM;AAAA,IACN;AAAA,EACD;AACD;AASO,SAAS,WACf,OACA,MACsB;AACtB,SAAO,MAAM,gBAAiB,IAAK;AACpC;AAQO,IAAM,uBAAuB;AAAA,EACnC,CAAE,UAA8C;AAC/C,WAAO,OAAO,OAAQ,MAAM,gBAAiB;AAAA,EAC9C;AAAA,EACA,CAAE,UAA2B,CAAE,MAAM,gBAAiB;AACvD;AASO,SAAS,mBACf,OACA,MAC8B;AAC9B,SAAO,MAAM,iBAAkB,IAAK;AACrC;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|