@wordpress/core-abilities 0.9.0 → 0.10.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/README.md CHANGED
@@ -29,6 +29,18 @@ Simply import the package to initialize the WordPress abilities:
29
29
  import '@wordpress/core-abilities';
30
30
  ```
31
31
 
32
+ Initialization is asynchronous because categories and abilities are fetched from the REST API. To wait for registration to finish before calling `getAbilities()` or `executeAbility()`, await the exported `ready` promise:
33
+
34
+ ```js
35
+ import { ready } from '@wordpress/core-abilities';
36
+ import { getAbilities, executeAbility } from '@wordpress/abilities';
37
+
38
+ await ready;
39
+
40
+ console.log( getAbilities() );
41
+ console.log( await executeAbility( 'core/get-site-info' ) );
42
+ ```
43
+
32
44
  ## Contributing to this package
33
45
 
34
46
  This is an individual package that's part of the Gutenberg project. The project is organized as a monorepo. It's made up of multiple self-contained software packages, each with a specific purpose. The packages in this monorepo are published to [npm](https://www.npmjs.com/) and used by [WordPress](https://make.wordpress.org/core/) as well as other software projects.
package/build/index.cjs CHANGED
@@ -5,6 +5,10 @@ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
5
  var __getOwnPropNames = Object.getOwnPropertyNames;
6
6
  var __getProtoOf = Object.getPrototypeOf;
7
7
  var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
8
12
  var __copyProps = (to, from, except, desc) => {
9
13
  if (from && typeof from === "object" || typeof from === "function") {
10
14
  for (let key of __getOwnPropNames(from))
@@ -21,8 +25,14 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
21
25
  isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
22
26
  mod
23
27
  ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
24
29
 
25
30
  // packages/core-abilities/src/index.ts
31
+ var index_exports = {};
32
+ __export(index_exports, {
33
+ ready: () => ready
34
+ });
35
+ module.exports = __toCommonJS(index_exports);
26
36
  var import_abilities = require("@wordpress/abilities");
27
37
  var import_api_fetch = __toESM(require("@wordpress/api-fetch"));
28
38
  var import_url = require("@wordpress/url");
@@ -105,5 +115,9 @@ async function initialize() {
105
115
  await initializeCategories();
106
116
  await initializeAbilities();
107
117
  }
108
- initialize();
118
+ var ready = initialize();
119
+ // Annotate the CommonJS export names for ESM import in node:
120
+ 0 && (module.exports = {
121
+ ready
122
+ });
109
123
  //# sourceMappingURL=index.cjs.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/index.ts"],
4
- "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport { registerAbility, registerAbilityCategory } from '@wordpress/abilities';\nimport type {\n\tAbility,\n\tAbilityCategory,\n\tAbilityInput,\n\tAbilityOutput,\n} from '@wordpress/abilities';\nimport apiFetch from '@wordpress/api-fetch';\nimport { addQueryArgs } from '@wordpress/url';\n\n/**\n * API endpoint constants.\n */\nconst API_BASE = '/wp-abilities/v1';\nconst ABILITIES_ENDPOINT = `${ API_BASE }/abilities`;\nconst CATEGORIES_ENDPOINT = `${ API_BASE }/categories`;\n\n/**\n * Creates a serverCallback function for a WordPress REST API ability.\n *\n * @param ability The ability to create a callback for.\n * @return The serverCallback function.\n */\nfunction createServerCallback(\n\tability: Ability\n): ( input: AbilityInput ) => Promise< AbilityOutput > {\n\treturn async ( input: AbilityInput ) => {\n\t\t// Determine HTTP method based on ability annotations\n\t\tlet method = 'POST';\n\t\tif ( !! ability.meta?.annotations?.readonly ) {\n\t\t\tmethod = 'GET';\n\t\t} else if (\n\t\t\t!! ability.meta?.annotations?.destructive &&\n\t\t\t!! ability.meta?.annotations?.idempotent\n\t\t) {\n\t\t\tmethod = 'DELETE';\n\t\t}\n\n\t\tlet path = `${ ABILITIES_ENDPOINT }/${ ability.name }/run`;\n\t\tconst options: {\n\t\t\tmethod: string;\n\t\t\tdata?: { input: AbilityInput };\n\t\t} = {\n\t\t\tmethod,\n\t\t};\n\n\t\tif (\n\t\t\t[ 'GET', 'DELETE' ].includes( method ) &&\n\t\t\tinput !== null &&\n\t\t\tinput !== undefined\n\t\t) {\n\t\t\t// For GET and DELETE requests, pass the input as query parameters.\n\t\t\tpath = addQueryArgs( path, { input } );\n\t\t} else if (\n\t\t\tmethod === 'POST' &&\n\t\t\tinput !== null &&\n\t\t\tinput !== undefined\n\t\t) {\n\t\t\toptions.data = { input };\n\t\t}\n\n\t\t// Input and output validation happens on the server side for these abilities.\n\t\treturn apiFetch< AbilityOutput >( {\n\t\t\tpath,\n\t\t\t...options,\n\t\t} );\n\t};\n}\n\n/**\n * Fetches and registers all ability categories from WordPress.\n */\nasync function initializeCategories(): Promise< void > {\n\ttry {\n\t\tconst categories = await apiFetch< AbilityCategory[] >( {\n\t\t\tpath: addQueryArgs( CATEGORIES_ENDPOINT, {\n\t\t\t\tper_page: -1,\n\t\t\t\tcontext: 'edit',\n\t\t\t} ),\n\t\t} );\n\n\t\tif ( categories && Array.isArray( categories ) ) {\n\t\t\tfor ( const category of categories ) {\n\t\t\t\tregisterAbilityCategory( category.slug, {\n\t\t\t\t\tlabel: category.label,\n\t\t\t\t\tdescription: category.description,\n\t\t\t\t\tmeta: {\n\t\t\t\t\t\tannotations: { serverRegistered: true },\n\t\t\t\t\t},\n\t\t\t\t} );\n\t\t\t}\n\t\t}\n\t} catch ( error ) {\n\t\t// eslint-disable-next-line no-console\n\t\tconsole.error( 'Failed to fetch ability categories:', error );\n\t}\n}\n\n/**\n * Fetches and registers all abilities from WordPress.\n */\nasync function initializeAbilities(): Promise< void > {\n\ttry {\n\t\tconst abilities = await apiFetch< Ability[] >( {\n\t\t\tpath: addQueryArgs( ABILITIES_ENDPOINT, {\n\t\t\t\tper_page: -1,\n\t\t\t\tcontext: 'edit',\n\t\t\t} ),\n\t\t} );\n\n\t\tif ( abilities && Array.isArray( abilities ) ) {\n\t\t\tfor ( const ability of abilities ) {\n\t\t\t\t// Register the ability with a callback\n\t\t\t\t// The abilities package filters annotations to allowed keys\n\t\t\t\tregisterAbility( {\n\t\t\t\t\t...ability,\n\t\t\t\t\tcallback: createServerCallback( ability ),\n\t\t\t\t\tmeta: {\n\t\t\t\t\t\tannotations: {\n\t\t\t\t\t\t\t...ability.meta?.annotations,\n\t\t\t\t\t\t\tserverRegistered: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t} );\n\t\t\t}\n\t\t}\n\t} catch ( error ) {\n\t\t// eslint-disable-next-line no-console\n\t\tconsole.error( 'Failed to fetch abilities:', error );\n\t}\n}\n\n/**\n * Initialize WordPress abilities integration.\n */\nasync function initialize(): Promise< void > {\n\t// Fetch and register categories, then abilities\n\tawait initializeCategories();\n\tawait initializeAbilities();\n}\n\n// Auto-initialize on import\ninitialize();\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;AAGA,uBAAyD;AAOzD,uBAAqB;AACrB,iBAA6B;AAK7B,IAAM,WAAW;AACjB,IAAM,qBAAqB,GAAI,QAAS;AACxC,IAAM,sBAAsB,GAAI,QAAS;AAQzC,SAAS,qBACR,SACsD;AACtD,SAAO,OAAQ,UAAyB;AAEvC,QAAI,SAAS;AACb,QAAK,CAAC,CAAE,QAAQ,MAAM,aAAa,UAAW;AAC7C,eAAS;AAAA,IACV,WACC,CAAC,CAAE,QAAQ,MAAM,aAAa,eAC9B,CAAC,CAAE,QAAQ,MAAM,aAAa,YAC7B;AACD,eAAS;AAAA,IACV;AAEA,QAAI,OAAO,GAAI,kBAAmB,IAAK,QAAQ,IAAK;AACpD,UAAM,UAGF;AAAA,MACH;AAAA,IACD;AAEA,QACC,CAAE,OAAO,QAAS,EAAE,SAAU,MAAO,KACrC,UAAU,QACV,UAAU,QACT;AAED,iBAAO,yBAAc,MAAM,EAAE,MAAM,CAAE;AAAA,IACtC,WACC,WAAW,UACX,UAAU,QACV,UAAU,QACT;AACD,cAAQ,OAAO,EAAE,MAAM;AAAA,IACxB;AAGA,eAAO,iBAAAA,SAA2B;AAAA,MACjC;AAAA,MACA,GAAG;AAAA,IACJ,CAAE;AAAA,EACH;AACD;AAKA,eAAe,uBAAwC;AACtD,MAAI;AACH,UAAM,aAAa,UAAM,iBAAAA,SAA+B;AAAA,MACvD,UAAM,yBAAc,qBAAqB;AAAA,QACxC,UAAU;AAAA,QACV,SAAS;AAAA,MACV,CAAE;AAAA,IACH,CAAE;AAEF,QAAK,cAAc,MAAM,QAAS,UAAW,GAAI;AAChD,iBAAY,YAAY,YAAa;AACpC,sDAAyB,SAAS,MAAM;AAAA,UACvC,OAAO,SAAS;AAAA,UAChB,aAAa,SAAS;AAAA,UACtB,MAAM;AAAA,YACL,aAAa,EAAE,kBAAkB,KAAK;AAAA,UACvC;AAAA,QACD,CAAE;AAAA,MACH;AAAA,IACD;AAAA,EACD,SAAU,OAAQ;AAEjB,YAAQ,MAAO,uCAAuC,KAAM;AAAA,EAC7D;AACD;AAKA,eAAe,sBAAuC;AACrD,MAAI;AACH,UAAM,YAAY,UAAM,iBAAAA,SAAuB;AAAA,MAC9C,UAAM,yBAAc,oBAAoB;AAAA,QACvC,UAAU;AAAA,QACV,SAAS;AAAA,MACV,CAAE;AAAA,IACH,CAAE;AAEF,QAAK,aAAa,MAAM,QAAS,SAAU,GAAI;AAC9C,iBAAY,WAAW,WAAY;AAGlC,8CAAiB;AAAA,UAChB,GAAG;AAAA,UACH,UAAU,qBAAsB,OAAQ;AAAA,UACxC,MAAM;AAAA,YACL,aAAa;AAAA,cACZ,GAAG,QAAQ,MAAM;AAAA,cACjB,kBAAkB;AAAA,YACnB;AAAA,UACD;AAAA,QACD,CAAE;AAAA,MACH;AAAA,IACD;AAAA,EACD,SAAU,OAAQ;AAEjB,YAAQ,MAAO,8BAA8B,KAAM;AAAA,EACpD;AACD;AAKA,eAAe,aAA8B;AAE5C,QAAM,qBAAqB;AAC3B,QAAM,oBAAoB;AAC3B;AAGA,WAAW;",
4
+ "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport { registerAbility, registerAbilityCategory } from '@wordpress/abilities';\nimport type {\n\tAbility,\n\tAbilityCategory,\n\tAbilityInput,\n\tAbilityOutput,\n} from '@wordpress/abilities';\nimport apiFetch from '@wordpress/api-fetch';\nimport { addQueryArgs } from '@wordpress/url';\n\n/**\n * API endpoint constants.\n */\nconst API_BASE = '/wp-abilities/v1';\nconst ABILITIES_ENDPOINT = `${ API_BASE }/abilities`;\nconst CATEGORIES_ENDPOINT = `${ API_BASE }/categories`;\n\n/**\n * Creates a serverCallback function for a WordPress REST API ability.\n *\n * @param ability The ability to create a callback for.\n * @return The serverCallback function.\n */\nfunction createServerCallback(\n\tability: Ability\n): ( input: AbilityInput ) => Promise< AbilityOutput > {\n\treturn async ( input: AbilityInput ) => {\n\t\t// Determine HTTP method based on ability annotations\n\t\tlet method = 'POST';\n\t\tif ( !! ability.meta?.annotations?.readonly ) {\n\t\t\tmethod = 'GET';\n\t\t} else if (\n\t\t\t!! ability.meta?.annotations?.destructive &&\n\t\t\t!! ability.meta?.annotations?.idempotent\n\t\t) {\n\t\t\tmethod = 'DELETE';\n\t\t}\n\n\t\tlet path = `${ ABILITIES_ENDPOINT }/${ ability.name }/run`;\n\t\tconst options: {\n\t\t\tmethod: string;\n\t\t\tdata?: { input: AbilityInput };\n\t\t} = {\n\t\t\tmethod,\n\t\t};\n\n\t\tif (\n\t\t\t[ 'GET', 'DELETE' ].includes( method ) &&\n\t\t\tinput !== null &&\n\t\t\tinput !== undefined\n\t\t) {\n\t\t\t// For GET and DELETE requests, pass the input as query parameters.\n\t\t\tpath = addQueryArgs( path, { input } );\n\t\t} else if (\n\t\t\tmethod === 'POST' &&\n\t\t\tinput !== null &&\n\t\t\tinput !== undefined\n\t\t) {\n\t\t\toptions.data = { input };\n\t\t}\n\n\t\t// Input and output validation happens on the server side for these abilities.\n\t\treturn apiFetch< AbilityOutput >( {\n\t\t\tpath,\n\t\t\t...options,\n\t\t} );\n\t};\n}\n\n/**\n * Fetches and registers all ability categories from WordPress.\n */\nasync function initializeCategories(): Promise< void > {\n\ttry {\n\t\tconst categories = await apiFetch< AbilityCategory[] >( {\n\t\t\tpath: addQueryArgs( CATEGORIES_ENDPOINT, {\n\t\t\t\tper_page: -1,\n\t\t\t\tcontext: 'edit',\n\t\t\t} ),\n\t\t} );\n\n\t\tif ( categories && Array.isArray( categories ) ) {\n\t\t\tfor ( const category of categories ) {\n\t\t\t\tregisterAbilityCategory( category.slug, {\n\t\t\t\t\tlabel: category.label,\n\t\t\t\t\tdescription: category.description,\n\t\t\t\t\tmeta: {\n\t\t\t\t\t\tannotations: { serverRegistered: true },\n\t\t\t\t\t},\n\t\t\t\t} );\n\t\t\t}\n\t\t}\n\t} catch ( error ) {\n\t\t// eslint-disable-next-line no-console\n\t\tconsole.error( 'Failed to fetch ability categories:', error );\n\t}\n}\n\n/**\n * Fetches and registers all abilities from WordPress.\n */\nasync function initializeAbilities(): Promise< void > {\n\ttry {\n\t\tconst abilities = await apiFetch< Ability[] >( {\n\t\t\tpath: addQueryArgs( ABILITIES_ENDPOINT, {\n\t\t\t\tper_page: -1,\n\t\t\t\tcontext: 'edit',\n\t\t\t} ),\n\t\t} );\n\n\t\tif ( abilities && Array.isArray( abilities ) ) {\n\t\t\tfor ( const ability of abilities ) {\n\t\t\t\t// Register the ability with a callback\n\t\t\t\t// The abilities package filters annotations to allowed keys\n\t\t\t\tregisterAbility( {\n\t\t\t\t\t...ability,\n\t\t\t\t\tcallback: createServerCallback( ability ),\n\t\t\t\t\tmeta: {\n\t\t\t\t\t\tannotations: {\n\t\t\t\t\t\t\t...ability.meta?.annotations,\n\t\t\t\t\t\t\tserverRegistered: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t} );\n\t\t\t}\n\t\t}\n\t} catch ( error ) {\n\t\t// eslint-disable-next-line no-console\n\t\tconsole.error( 'Failed to fetch abilities:', error );\n\t}\n}\n\n/**\n * Initialize WordPress abilities integration.\n */\nasync function initialize(): Promise< void > {\n\t// Fetch and register categories, then abilities\n\tawait initializeCategories();\n\tawait initializeAbilities();\n}\n\n// Auto-initialize on import.\nexport const ready: Promise< void > = initialize();\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,uBAAyD;AAOzD,uBAAqB;AACrB,iBAA6B;AAK7B,IAAM,WAAW;AACjB,IAAM,qBAAqB,GAAI,QAAS;AACxC,IAAM,sBAAsB,GAAI,QAAS;AAQzC,SAAS,qBACR,SACsD;AACtD,SAAO,OAAQ,UAAyB;AAEvC,QAAI,SAAS;AACb,QAAK,CAAC,CAAE,QAAQ,MAAM,aAAa,UAAW;AAC7C,eAAS;AAAA,IACV,WACC,CAAC,CAAE,QAAQ,MAAM,aAAa,eAC9B,CAAC,CAAE,QAAQ,MAAM,aAAa,YAC7B;AACD,eAAS;AAAA,IACV;AAEA,QAAI,OAAO,GAAI,kBAAmB,IAAK,QAAQ,IAAK;AACpD,UAAM,UAGF;AAAA,MACH;AAAA,IACD;AAEA,QACC,CAAE,OAAO,QAAS,EAAE,SAAU,MAAO,KACrC,UAAU,QACV,UAAU,QACT;AAED,iBAAO,yBAAc,MAAM,EAAE,MAAM,CAAE;AAAA,IACtC,WACC,WAAW,UACX,UAAU,QACV,UAAU,QACT;AACD,cAAQ,OAAO,EAAE,MAAM;AAAA,IACxB;AAGA,eAAO,iBAAAA,SAA2B;AAAA,MACjC;AAAA,MACA,GAAG;AAAA,IACJ,CAAE;AAAA,EACH;AACD;AAKA,eAAe,uBAAwC;AACtD,MAAI;AACH,UAAM,aAAa,UAAM,iBAAAA,SAA+B;AAAA,MACvD,UAAM,yBAAc,qBAAqB;AAAA,QACxC,UAAU;AAAA,QACV,SAAS;AAAA,MACV,CAAE;AAAA,IACH,CAAE;AAEF,QAAK,cAAc,MAAM,QAAS,UAAW,GAAI;AAChD,iBAAY,YAAY,YAAa;AACpC,sDAAyB,SAAS,MAAM;AAAA,UACvC,OAAO,SAAS;AAAA,UAChB,aAAa,SAAS;AAAA,UACtB,MAAM;AAAA,YACL,aAAa,EAAE,kBAAkB,KAAK;AAAA,UACvC;AAAA,QACD,CAAE;AAAA,MACH;AAAA,IACD;AAAA,EACD,SAAU,OAAQ;AAEjB,YAAQ,MAAO,uCAAuC,KAAM;AAAA,EAC7D;AACD;AAKA,eAAe,sBAAuC;AACrD,MAAI;AACH,UAAM,YAAY,UAAM,iBAAAA,SAAuB;AAAA,MAC9C,UAAM,yBAAc,oBAAoB;AAAA,QACvC,UAAU;AAAA,QACV,SAAS;AAAA,MACV,CAAE;AAAA,IACH,CAAE;AAEF,QAAK,aAAa,MAAM,QAAS,SAAU,GAAI;AAC9C,iBAAY,WAAW,WAAY;AAGlC,8CAAiB;AAAA,UAChB,GAAG;AAAA,UACH,UAAU,qBAAsB,OAAQ;AAAA,UACxC,MAAM;AAAA,YACL,aAAa;AAAA,cACZ,GAAG,QAAQ,MAAM;AAAA,cACjB,kBAAkB;AAAA,YACnB;AAAA,UACD;AAAA,QACD,CAAE;AAAA,MACH;AAAA,IACD;AAAA,EACD,SAAU,OAAQ;AAEjB,YAAQ,MAAO,8BAA8B,KAAM;AAAA,EACpD;AACD;AAKA,eAAe,aAA8B;AAE5C,QAAM,qBAAqB;AAC3B,QAAM,oBAAoB;AAC3B;AAGO,IAAM,QAAyB,WAAW;",
6
6
  "names": ["apiFetch"]
7
7
  }
@@ -81,5 +81,8 @@ async function initialize() {
81
81
  await initializeCategories();
82
82
  await initializeAbilities();
83
83
  }
84
- initialize();
84
+ var ready = initialize();
85
+ export {
86
+ ready
87
+ };
85
88
  //# sourceMappingURL=index.mjs.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/index.ts"],
4
- "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport { registerAbility, registerAbilityCategory } from '@wordpress/abilities';\nimport type {\n\tAbility,\n\tAbilityCategory,\n\tAbilityInput,\n\tAbilityOutput,\n} from '@wordpress/abilities';\nimport apiFetch from '@wordpress/api-fetch';\nimport { addQueryArgs } from '@wordpress/url';\n\n/**\n * API endpoint constants.\n */\nconst API_BASE = '/wp-abilities/v1';\nconst ABILITIES_ENDPOINT = `${ API_BASE }/abilities`;\nconst CATEGORIES_ENDPOINT = `${ API_BASE }/categories`;\n\n/**\n * Creates a serverCallback function for a WordPress REST API ability.\n *\n * @param ability The ability to create a callback for.\n * @return The serverCallback function.\n */\nfunction createServerCallback(\n\tability: Ability\n): ( input: AbilityInput ) => Promise< AbilityOutput > {\n\treturn async ( input: AbilityInput ) => {\n\t\t// Determine HTTP method based on ability annotations\n\t\tlet method = 'POST';\n\t\tif ( !! ability.meta?.annotations?.readonly ) {\n\t\t\tmethod = 'GET';\n\t\t} else if (\n\t\t\t!! ability.meta?.annotations?.destructive &&\n\t\t\t!! ability.meta?.annotations?.idempotent\n\t\t) {\n\t\t\tmethod = 'DELETE';\n\t\t}\n\n\t\tlet path = `${ ABILITIES_ENDPOINT }/${ ability.name }/run`;\n\t\tconst options: {\n\t\t\tmethod: string;\n\t\t\tdata?: { input: AbilityInput };\n\t\t} = {\n\t\t\tmethod,\n\t\t};\n\n\t\tif (\n\t\t\t[ 'GET', 'DELETE' ].includes( method ) &&\n\t\t\tinput !== null &&\n\t\t\tinput !== undefined\n\t\t) {\n\t\t\t// For GET and DELETE requests, pass the input as query parameters.\n\t\t\tpath = addQueryArgs( path, { input } );\n\t\t} else if (\n\t\t\tmethod === 'POST' &&\n\t\t\tinput !== null &&\n\t\t\tinput !== undefined\n\t\t) {\n\t\t\toptions.data = { input };\n\t\t}\n\n\t\t// Input and output validation happens on the server side for these abilities.\n\t\treturn apiFetch< AbilityOutput >( {\n\t\t\tpath,\n\t\t\t...options,\n\t\t} );\n\t};\n}\n\n/**\n * Fetches and registers all ability categories from WordPress.\n */\nasync function initializeCategories(): Promise< void > {\n\ttry {\n\t\tconst categories = await apiFetch< AbilityCategory[] >( {\n\t\t\tpath: addQueryArgs( CATEGORIES_ENDPOINT, {\n\t\t\t\tper_page: -1,\n\t\t\t\tcontext: 'edit',\n\t\t\t} ),\n\t\t} );\n\n\t\tif ( categories && Array.isArray( categories ) ) {\n\t\t\tfor ( const category of categories ) {\n\t\t\t\tregisterAbilityCategory( category.slug, {\n\t\t\t\t\tlabel: category.label,\n\t\t\t\t\tdescription: category.description,\n\t\t\t\t\tmeta: {\n\t\t\t\t\t\tannotations: { serverRegistered: true },\n\t\t\t\t\t},\n\t\t\t\t} );\n\t\t\t}\n\t\t}\n\t} catch ( error ) {\n\t\t// eslint-disable-next-line no-console\n\t\tconsole.error( 'Failed to fetch ability categories:', error );\n\t}\n}\n\n/**\n * Fetches and registers all abilities from WordPress.\n */\nasync function initializeAbilities(): Promise< void > {\n\ttry {\n\t\tconst abilities = await apiFetch< Ability[] >( {\n\t\t\tpath: addQueryArgs( ABILITIES_ENDPOINT, {\n\t\t\t\tper_page: -1,\n\t\t\t\tcontext: 'edit',\n\t\t\t} ),\n\t\t} );\n\n\t\tif ( abilities && Array.isArray( abilities ) ) {\n\t\t\tfor ( const ability of abilities ) {\n\t\t\t\t// Register the ability with a callback\n\t\t\t\t// The abilities package filters annotations to allowed keys\n\t\t\t\tregisterAbility( {\n\t\t\t\t\t...ability,\n\t\t\t\t\tcallback: createServerCallback( ability ),\n\t\t\t\t\tmeta: {\n\t\t\t\t\t\tannotations: {\n\t\t\t\t\t\t\t...ability.meta?.annotations,\n\t\t\t\t\t\t\tserverRegistered: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t} );\n\t\t\t}\n\t\t}\n\t} catch ( error ) {\n\t\t// eslint-disable-next-line no-console\n\t\tconsole.error( 'Failed to fetch abilities:', error );\n\t}\n}\n\n/**\n * Initialize WordPress abilities integration.\n */\nasync function initialize(): Promise< void > {\n\t// Fetch and register categories, then abilities\n\tawait initializeCategories();\n\tawait initializeAbilities();\n}\n\n// Auto-initialize on import\ninitialize();\n"],
5
- "mappings": ";AAGA,SAAS,iBAAiB,+BAA+B;AAOzD,OAAO,cAAc;AACrB,SAAS,oBAAoB;AAK7B,IAAM,WAAW;AACjB,IAAM,qBAAqB,GAAI,QAAS;AACxC,IAAM,sBAAsB,GAAI,QAAS;AAQzC,SAAS,qBACR,SACsD;AACtD,SAAO,OAAQ,UAAyB;AAEvC,QAAI,SAAS;AACb,QAAK,CAAC,CAAE,QAAQ,MAAM,aAAa,UAAW;AAC7C,eAAS;AAAA,IACV,WACC,CAAC,CAAE,QAAQ,MAAM,aAAa,eAC9B,CAAC,CAAE,QAAQ,MAAM,aAAa,YAC7B;AACD,eAAS;AAAA,IACV;AAEA,QAAI,OAAO,GAAI,kBAAmB,IAAK,QAAQ,IAAK;AACpD,UAAM,UAGF;AAAA,MACH;AAAA,IACD;AAEA,QACC,CAAE,OAAO,QAAS,EAAE,SAAU,MAAO,KACrC,UAAU,QACV,UAAU,QACT;AAED,aAAO,aAAc,MAAM,EAAE,MAAM,CAAE;AAAA,IACtC,WACC,WAAW,UACX,UAAU,QACV,UAAU,QACT;AACD,cAAQ,OAAO,EAAE,MAAM;AAAA,IACxB;AAGA,WAAO,SAA2B;AAAA,MACjC;AAAA,MACA,GAAG;AAAA,IACJ,CAAE;AAAA,EACH;AACD;AAKA,eAAe,uBAAwC;AACtD,MAAI;AACH,UAAM,aAAa,MAAM,SAA+B;AAAA,MACvD,MAAM,aAAc,qBAAqB;AAAA,QACxC,UAAU;AAAA,QACV,SAAS;AAAA,MACV,CAAE;AAAA,IACH,CAAE;AAEF,QAAK,cAAc,MAAM,QAAS,UAAW,GAAI;AAChD,iBAAY,YAAY,YAAa;AACpC,gCAAyB,SAAS,MAAM;AAAA,UACvC,OAAO,SAAS;AAAA,UAChB,aAAa,SAAS;AAAA,UACtB,MAAM;AAAA,YACL,aAAa,EAAE,kBAAkB,KAAK;AAAA,UACvC;AAAA,QACD,CAAE;AAAA,MACH;AAAA,IACD;AAAA,EACD,SAAU,OAAQ;AAEjB,YAAQ,MAAO,uCAAuC,KAAM;AAAA,EAC7D;AACD;AAKA,eAAe,sBAAuC;AACrD,MAAI;AACH,UAAM,YAAY,MAAM,SAAuB;AAAA,MAC9C,MAAM,aAAc,oBAAoB;AAAA,QACvC,UAAU;AAAA,QACV,SAAS;AAAA,MACV,CAAE;AAAA,IACH,CAAE;AAEF,QAAK,aAAa,MAAM,QAAS,SAAU,GAAI;AAC9C,iBAAY,WAAW,WAAY;AAGlC,wBAAiB;AAAA,UAChB,GAAG;AAAA,UACH,UAAU,qBAAsB,OAAQ;AAAA,UACxC,MAAM;AAAA,YACL,aAAa;AAAA,cACZ,GAAG,QAAQ,MAAM;AAAA,cACjB,kBAAkB;AAAA,YACnB;AAAA,UACD;AAAA,QACD,CAAE;AAAA,MACH;AAAA,IACD;AAAA,EACD,SAAU,OAAQ;AAEjB,YAAQ,MAAO,8BAA8B,KAAM;AAAA,EACpD;AACD;AAKA,eAAe,aAA8B;AAE5C,QAAM,qBAAqB;AAC3B,QAAM,oBAAoB;AAC3B;AAGA,WAAW;",
4
+ "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport { registerAbility, registerAbilityCategory } from '@wordpress/abilities';\nimport type {\n\tAbility,\n\tAbilityCategory,\n\tAbilityInput,\n\tAbilityOutput,\n} from '@wordpress/abilities';\nimport apiFetch from '@wordpress/api-fetch';\nimport { addQueryArgs } from '@wordpress/url';\n\n/**\n * API endpoint constants.\n */\nconst API_BASE = '/wp-abilities/v1';\nconst ABILITIES_ENDPOINT = `${ API_BASE }/abilities`;\nconst CATEGORIES_ENDPOINT = `${ API_BASE }/categories`;\n\n/**\n * Creates a serverCallback function for a WordPress REST API ability.\n *\n * @param ability The ability to create a callback for.\n * @return The serverCallback function.\n */\nfunction createServerCallback(\n\tability: Ability\n): ( input: AbilityInput ) => Promise< AbilityOutput > {\n\treturn async ( input: AbilityInput ) => {\n\t\t// Determine HTTP method based on ability annotations\n\t\tlet method = 'POST';\n\t\tif ( !! ability.meta?.annotations?.readonly ) {\n\t\t\tmethod = 'GET';\n\t\t} else if (\n\t\t\t!! ability.meta?.annotations?.destructive &&\n\t\t\t!! ability.meta?.annotations?.idempotent\n\t\t) {\n\t\t\tmethod = 'DELETE';\n\t\t}\n\n\t\tlet path = `${ ABILITIES_ENDPOINT }/${ ability.name }/run`;\n\t\tconst options: {\n\t\t\tmethod: string;\n\t\t\tdata?: { input: AbilityInput };\n\t\t} = {\n\t\t\tmethod,\n\t\t};\n\n\t\tif (\n\t\t\t[ 'GET', 'DELETE' ].includes( method ) &&\n\t\t\tinput !== null &&\n\t\t\tinput !== undefined\n\t\t) {\n\t\t\t// For GET and DELETE requests, pass the input as query parameters.\n\t\t\tpath = addQueryArgs( path, { input } );\n\t\t} else if (\n\t\t\tmethod === 'POST' &&\n\t\t\tinput !== null &&\n\t\t\tinput !== undefined\n\t\t) {\n\t\t\toptions.data = { input };\n\t\t}\n\n\t\t// Input and output validation happens on the server side for these abilities.\n\t\treturn apiFetch< AbilityOutput >( {\n\t\t\tpath,\n\t\t\t...options,\n\t\t} );\n\t};\n}\n\n/**\n * Fetches and registers all ability categories from WordPress.\n */\nasync function initializeCategories(): Promise< void > {\n\ttry {\n\t\tconst categories = await apiFetch< AbilityCategory[] >( {\n\t\t\tpath: addQueryArgs( CATEGORIES_ENDPOINT, {\n\t\t\t\tper_page: -1,\n\t\t\t\tcontext: 'edit',\n\t\t\t} ),\n\t\t} );\n\n\t\tif ( categories && Array.isArray( categories ) ) {\n\t\t\tfor ( const category of categories ) {\n\t\t\t\tregisterAbilityCategory( category.slug, {\n\t\t\t\t\tlabel: category.label,\n\t\t\t\t\tdescription: category.description,\n\t\t\t\t\tmeta: {\n\t\t\t\t\t\tannotations: { serverRegistered: true },\n\t\t\t\t\t},\n\t\t\t\t} );\n\t\t\t}\n\t\t}\n\t} catch ( error ) {\n\t\t// eslint-disable-next-line no-console\n\t\tconsole.error( 'Failed to fetch ability categories:', error );\n\t}\n}\n\n/**\n * Fetches and registers all abilities from WordPress.\n */\nasync function initializeAbilities(): Promise< void > {\n\ttry {\n\t\tconst abilities = await apiFetch< Ability[] >( {\n\t\t\tpath: addQueryArgs( ABILITIES_ENDPOINT, {\n\t\t\t\tper_page: -1,\n\t\t\t\tcontext: 'edit',\n\t\t\t} ),\n\t\t} );\n\n\t\tif ( abilities && Array.isArray( abilities ) ) {\n\t\t\tfor ( const ability of abilities ) {\n\t\t\t\t// Register the ability with a callback\n\t\t\t\t// The abilities package filters annotations to allowed keys\n\t\t\t\tregisterAbility( {\n\t\t\t\t\t...ability,\n\t\t\t\t\tcallback: createServerCallback( ability ),\n\t\t\t\t\tmeta: {\n\t\t\t\t\t\tannotations: {\n\t\t\t\t\t\t\t...ability.meta?.annotations,\n\t\t\t\t\t\t\tserverRegistered: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t} );\n\t\t\t}\n\t\t}\n\t} catch ( error ) {\n\t\t// eslint-disable-next-line no-console\n\t\tconsole.error( 'Failed to fetch abilities:', error );\n\t}\n}\n\n/**\n * Initialize WordPress abilities integration.\n */\nasync function initialize(): Promise< void > {\n\t// Fetch and register categories, then abilities\n\tawait initializeCategories();\n\tawait initializeAbilities();\n}\n\n// Auto-initialize on import.\nexport const ready: Promise< void > = initialize();\n"],
5
+ "mappings": ";AAGA,SAAS,iBAAiB,+BAA+B;AAOzD,OAAO,cAAc;AACrB,SAAS,oBAAoB;AAK7B,IAAM,WAAW;AACjB,IAAM,qBAAqB,GAAI,QAAS;AACxC,IAAM,sBAAsB,GAAI,QAAS;AAQzC,SAAS,qBACR,SACsD;AACtD,SAAO,OAAQ,UAAyB;AAEvC,QAAI,SAAS;AACb,QAAK,CAAC,CAAE,QAAQ,MAAM,aAAa,UAAW;AAC7C,eAAS;AAAA,IACV,WACC,CAAC,CAAE,QAAQ,MAAM,aAAa,eAC9B,CAAC,CAAE,QAAQ,MAAM,aAAa,YAC7B;AACD,eAAS;AAAA,IACV;AAEA,QAAI,OAAO,GAAI,kBAAmB,IAAK,QAAQ,IAAK;AACpD,UAAM,UAGF;AAAA,MACH;AAAA,IACD;AAEA,QACC,CAAE,OAAO,QAAS,EAAE,SAAU,MAAO,KACrC,UAAU,QACV,UAAU,QACT;AAED,aAAO,aAAc,MAAM,EAAE,MAAM,CAAE;AAAA,IACtC,WACC,WAAW,UACX,UAAU,QACV,UAAU,QACT;AACD,cAAQ,OAAO,EAAE,MAAM;AAAA,IACxB;AAGA,WAAO,SAA2B;AAAA,MACjC;AAAA,MACA,GAAG;AAAA,IACJ,CAAE;AAAA,EACH;AACD;AAKA,eAAe,uBAAwC;AACtD,MAAI;AACH,UAAM,aAAa,MAAM,SAA+B;AAAA,MACvD,MAAM,aAAc,qBAAqB;AAAA,QACxC,UAAU;AAAA,QACV,SAAS;AAAA,MACV,CAAE;AAAA,IACH,CAAE;AAEF,QAAK,cAAc,MAAM,QAAS,UAAW,GAAI;AAChD,iBAAY,YAAY,YAAa;AACpC,gCAAyB,SAAS,MAAM;AAAA,UACvC,OAAO,SAAS;AAAA,UAChB,aAAa,SAAS;AAAA,UACtB,MAAM;AAAA,YACL,aAAa,EAAE,kBAAkB,KAAK;AAAA,UACvC;AAAA,QACD,CAAE;AAAA,MACH;AAAA,IACD;AAAA,EACD,SAAU,OAAQ;AAEjB,YAAQ,MAAO,uCAAuC,KAAM;AAAA,EAC7D;AACD;AAKA,eAAe,sBAAuC;AACrD,MAAI;AACH,UAAM,YAAY,MAAM,SAAuB;AAAA,MAC9C,MAAM,aAAc,oBAAoB;AAAA,QACvC,UAAU;AAAA,QACV,SAAS;AAAA,MACV,CAAE;AAAA,IACH,CAAE;AAEF,QAAK,aAAa,MAAM,QAAS,SAAU,GAAI;AAC9C,iBAAY,WAAW,WAAY;AAGlC,wBAAiB;AAAA,UAChB,GAAG;AAAA,UACH,UAAU,qBAAsB,OAAQ;AAAA,UACxC,MAAM;AAAA,YACL,aAAa;AAAA,cACZ,GAAG,QAAQ,MAAM;AAAA,cACjB,kBAAkB;AAAA,YACnB;AAAA,UACD;AAAA,QACD,CAAE;AAAA,MACH;AAAA,IACD;AAAA,EACD,SAAU,OAAQ;AAEjB,YAAQ,MAAO,8BAA8B,KAAM;AAAA,EACpD;AACD;AAKA,eAAe,aAA8B;AAE5C,QAAM,qBAAqB;AAC3B,QAAM,oBAAoB;AAC3B;AAGO,IAAM,QAAyB,WAAW;",
6
6
  "names": []
7
7
  }
@@ -1,2 +1,2 @@
1
- export {};
1
+ export declare const ready: Promise<void>;
2
2
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAiJA,eAAO,MAAM,KAAK,EAAE,OAAO,CAAE,IAAI,CAAiB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wordpress/core-abilities",
3
- "version": "0.9.0",
3
+ "version": "0.10.0",
4
4
  "description": "WordPress core abilities integration for the Abilities API.",
5
5
  "author": "The WordPress Contributors",
6
6
  "license": "GPL-2.0-or-later",
@@ -46,12 +46,12 @@
46
46
  "types": "build-types",
47
47
  "sideEffects": true,
48
48
  "dependencies": {
49
- "@wordpress/abilities": "^0.10.0",
50
- "@wordpress/api-fetch": "^7.44.0",
51
- "@wordpress/url": "^4.44.0"
49
+ "@wordpress/abilities": "^0.11.0",
50
+ "@wordpress/api-fetch": "^7.45.0",
51
+ "@wordpress/url": "^4.45.0"
52
52
  },
53
53
  "publishConfig": {
54
54
  "access": "public"
55
55
  },
56
- "gitHead": "b862d8c84121a47bbeff882f6c87e61681ce2e0d"
56
+ "gitHead": "8c229eaed0e88c9827e2da3d73a78f9ddd77714b"
57
57
  }
package/src/index.ts CHANGED
@@ -142,5 +142,5 @@ async function initialize(): Promise< void > {
142
142
  await initializeAbilities();
143
143
  }
144
144
 
145
- // Auto-initialize on import
146
- initialize();
145
+ // Auto-initialize on import.
146
+ export const ready: Promise< void > = initialize();