@wordpress/abilities 0.1.1-next.dc3f6d3c1.0 → 0.2.1-next.8b30e05b0.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.
@@ -1,546 +0,0 @@
1
- "use strict";
2
- var __create = Object.create;
3
- var __defProp = Object.defineProperty;
4
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
- var __getOwnPropNames = Object.getOwnPropertyNames;
6
- var __getProtoOf = Object.getPrototypeOf;
7
- var __hasOwnProp = Object.prototype.hasOwnProperty;
8
- var __copyProps = (to, from, except, desc) => {
9
- if (from && typeof from === "object" || typeof from === "function") {
10
- for (let key of __getOwnPropNames(from))
11
- if (!__hasOwnProp.call(to, key) && key !== except)
12
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
13
- }
14
- return to;
15
- };
16
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
17
- // If the importer is in node compatibility mode or this is not an ESM
18
- // file that has been converted to a CommonJS file using a Babel-
19
- // compatible transform (i.e. "__esModule" has not been set), then set
20
- // "default" to the CommonJS "module.exports" for node compatibility.
21
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
22
- mod
23
- ));
24
-
25
- // packages/abilities/src/tests/api.test.ts
26
- var import_data = require("@wordpress/data");
27
- var import_api_fetch = __toESM(require("@wordpress/api-fetch"));
28
- var import_api = require("../api");
29
- var import_store = require("../store");
30
- jest.mock("@wordpress/data", () => ({
31
- dispatch: jest.fn(),
32
- select: jest.fn(),
33
- resolveSelect: jest.fn()
34
- }));
35
- jest.mock("@wordpress/api-fetch");
36
- jest.mock("../store", () => ({
37
- store: "abilities-api/store"
38
- }));
39
- describe("API functions", () => {
40
- beforeEach(() => {
41
- jest.clearAllMocks();
42
- });
43
- describe("getAbilities", () => {
44
- it("should resolve and return all abilities from the store", async () => {
45
- const mockAbilities = [
46
- {
47
- name: "test/ability1",
48
- label: "Test Ability 1",
49
- description: "First test ability",
50
- category: "test-category",
51
- input_schema: { type: "object" },
52
- output_schema: { type: "object" }
53
- },
54
- {
55
- name: "test/ability2",
56
- label: "Test Ability 2",
57
- description: "Second test ability",
58
- category: "test-category",
59
- input_schema: { type: "object" },
60
- output_schema: { type: "object" }
61
- }
62
- ];
63
- const mockGetAbilities = jest.fn().mockResolvedValue(mockAbilities);
64
- import_data.resolveSelect.mockReturnValue({
65
- getAbilities: mockGetAbilities
66
- });
67
- const result = await (0, import_api.getAbilities)();
68
- expect(import_data.resolveSelect).toHaveBeenCalledWith(import_store.store);
69
- expect(mockGetAbilities).toHaveBeenCalled();
70
- expect(result).toEqual(mockAbilities);
71
- });
72
- it("should pass category parameter to store when filtering", async () => {
73
- const mockAbilities = [
74
- {
75
- name: "test/ability1",
76
- label: "Test Ability 1",
77
- description: "First test ability",
78
- category: "data-retrieval",
79
- input_schema: { type: "object" },
80
- output_schema: { type: "object" }
81
- },
82
- {
83
- name: "test/ability2",
84
- label: "Test Ability 2",
85
- description: "Second test ability",
86
- category: "data-retrieval",
87
- input_schema: { type: "object" },
88
- output_schema: { type: "object" }
89
- }
90
- ];
91
- const mockGetAbilities = jest.fn().mockResolvedValue(mockAbilities);
92
- import_data.resolveSelect.mockReturnValue({
93
- getAbilities: mockGetAbilities
94
- });
95
- const result = await (0, import_api.getAbilities)({ category: "data-retrieval" });
96
- expect(import_data.resolveSelect).toHaveBeenCalledWith(import_store.store);
97
- expect(mockGetAbilities).toHaveBeenCalledWith({
98
- category: "data-retrieval"
99
- });
100
- expect(result).toEqual(mockAbilities);
101
- });
102
- });
103
- describe("getAbility", () => {
104
- it("should return a specific ability by name", async () => {
105
- const mockAbility = {
106
- name: "test/ability",
107
- label: "Test Ability",
108
- description: "Test ability description",
109
- category: "test-category",
110
- input_schema: { type: "object" },
111
- output_schema: { type: "object" }
112
- };
113
- const mockGetAbility = jest.fn().mockResolvedValue(mockAbility);
114
- import_data.resolveSelect.mockReturnValue({
115
- getAbility: mockGetAbility
116
- });
117
- const result = await (0, import_api.getAbility)("test/ability");
118
- expect(import_data.resolveSelect).toHaveBeenCalledWith(import_store.store);
119
- expect(mockGetAbility).toHaveBeenCalledWith("test/ability");
120
- expect(result).toEqual(mockAbility);
121
- });
122
- it("should return null if ability not found", async () => {
123
- const mockGetAbility = jest.fn().mockResolvedValue(null);
124
- import_data.resolveSelect.mockReturnValue({
125
- getAbility: mockGetAbility
126
- });
127
- const result = await (0, import_api.getAbility)("non-existent");
128
- expect(mockGetAbility).toHaveBeenCalledWith("non-existent");
129
- expect(result).toBeNull();
130
- });
131
- });
132
- describe("registerAbility", () => {
133
- it("should register a client-side ability with a callback", () => {
134
- const mockRegisterAbility = jest.fn();
135
- import_data.dispatch.mockReturnValue({
136
- registerAbility: mockRegisterAbility
137
- });
138
- import_data.select.mockReturnValue({
139
- getAbility: jest.fn().mockReturnValue(null)
140
- });
141
- const ability = {
142
- name: "test/client-ability",
143
- label: "Client Ability",
144
- description: "Test client ability",
145
- category: "test-category",
146
- input_schema: { type: "object" },
147
- output_schema: { type: "object" },
148
- callback: jest.fn()
149
- };
150
- (0, import_api.registerAbility)(ability);
151
- expect(import_data.dispatch).toHaveBeenCalledWith(import_store.store);
152
- expect(mockRegisterAbility).toHaveBeenCalledWith(ability);
153
- });
154
- });
155
- describe("unregisterAbility", () => {
156
- it("should unregister an ability", () => {
157
- const mockUnregisterAbility = jest.fn();
158
- import_data.dispatch.mockReturnValue({
159
- unregisterAbility: mockUnregisterAbility
160
- });
161
- (0, import_api.unregisterAbility)("test/ability");
162
- expect(import_data.dispatch).toHaveBeenCalledWith(import_store.store);
163
- expect(mockUnregisterAbility).toHaveBeenCalledWith(
164
- "test/ability"
165
- );
166
- });
167
- });
168
- describe("executeAbility", () => {
169
- it("should execute a server-side ability via API", async () => {
170
- const mockAbility = {
171
- name: "test/server-ability",
172
- label: "Server Ability",
173
- description: "Test server ability",
174
- category: "test-category",
175
- input_schema: {
176
- type: "object",
177
- properties: {
178
- message: { type: "string" }
179
- },
180
- required: ["message"]
181
- },
182
- output_schema: { type: "object" }
183
- };
184
- const mockGetAbility = jest.fn().mockResolvedValue(mockAbility);
185
- import_data.resolveSelect.mockReturnValue({
186
- getAbility: mockGetAbility
187
- });
188
- const mockResponse = { success: true, result: "test" };
189
- import_api_fetch.default.mockResolvedValue(
190
- mockResponse
191
- );
192
- const input = { message: "Hello" };
193
- const result = await (0, import_api.executeAbility)("test/server-ability", input);
194
- expect(mockGetAbility).toHaveBeenCalledWith(
195
- "test/server-ability"
196
- );
197
- expect(import_api_fetch.default).toHaveBeenCalledWith({
198
- path: "/wp-abilities/v1/abilities/test/server-ability/run",
199
- method: "POST",
200
- data: { input }
201
- });
202
- expect(result).toEqual(mockResponse);
203
- });
204
- it("should execute a client-side ability locally", async () => {
205
- const mockCallback = jest.fn().mockResolvedValue({ success: true });
206
- const mockAbility = {
207
- name: "test/client-ability",
208
- label: "Client Ability",
209
- description: "Test client ability",
210
- category: "test-category",
211
- input_schema: { type: "object" },
212
- output_schema: { type: "object" },
213
- callback: mockCallback
214
- };
215
- const mockGetAbility = jest.fn().mockResolvedValue(mockAbility);
216
- import_data.resolveSelect.mockReturnValue({
217
- getAbility: mockGetAbility
218
- });
219
- const input = { test: "data" };
220
- const result = await (0, import_api.executeAbility)("test/client-ability", input);
221
- expect(mockGetAbility).toHaveBeenCalledWith(
222
- "test/client-ability"
223
- );
224
- expect(mockCallback).toHaveBeenCalledWith(input);
225
- expect(import_api_fetch.default).not.toHaveBeenCalled();
226
- expect(result).toEqual({ success: true });
227
- });
228
- it("should throw error if ability not found", async () => {
229
- const mockGetAbility = jest.fn().mockResolvedValue(null);
230
- import_data.resolveSelect.mockReturnValue({
231
- getAbility: mockGetAbility
232
- });
233
- await expect(
234
- (0, import_api.executeAbility)("non-existent", {})
235
- ).rejects.toThrow("Ability not found: non-existent");
236
- });
237
- it("should validate input for client abilities", async () => {
238
- const mockCallback = jest.fn();
239
- const mockAbility = {
240
- name: "test/client-ability",
241
- label: "Client Ability",
242
- description: "Test client ability",
243
- category: "test-category",
244
- input_schema: {
245
- type: "object",
246
- properties: {
247
- message: { type: "string" }
248
- },
249
- required: ["message"]
250
- },
251
- output_schema: { type: "object" },
252
- callback: mockCallback
253
- };
254
- const mockGetAbility = jest.fn().mockResolvedValue(mockAbility);
255
- import_data.resolveSelect.mockReturnValue({
256
- getAbility: mockGetAbility
257
- });
258
- await expect(
259
- (0, import_api.executeAbility)("test/client-ability", {})
260
- ).rejects.toThrow("invalid input");
261
- });
262
- it("should execute a read-only ability via GET", async () => {
263
- const mockAbility = {
264
- name: "test/read-only",
265
- label: "Read-only Ability",
266
- description: "Test read-only ability.",
267
- category: "test-category",
268
- input_schema: {
269
- type: "object",
270
- properties: {
271
- id: { type: "string" },
272
- format: { type: "string" }
273
- }
274
- },
275
- output_schema: { type: "object" },
276
- meta: {
277
- annotations: { readonly: true }
278
- }
279
- };
280
- const mockGetAbility = jest.fn().mockResolvedValue(mockAbility);
281
- import_data.resolveSelect.mockReturnValue({
282
- getAbility: mockGetAbility
283
- });
284
- const mockResponse = { data: "read-only data" };
285
- import_api_fetch.default.mockResolvedValue(
286
- mockResponse
287
- );
288
- const input = { id: "123", format: "json" };
289
- const result = await (0, import_api.executeAbility)("test/read-only", input);
290
- expect(import_api_fetch.default).toHaveBeenCalledWith({
291
- path: "/wp-abilities/v1/abilities/test/read-only/run?input%5Bid%5D=123&input%5Bformat%5D=json",
292
- method: "GET"
293
- });
294
- expect(result).toEqual(mockResponse);
295
- });
296
- it("should execute a read-only ability with empty input", async () => {
297
- const mockAbility = {
298
- name: "test/read-only",
299
- label: "Read-only Ability",
300
- description: "Test read-only ability.",
301
- category: "test-category",
302
- input_schema: { type: "object" },
303
- output_schema: { type: "object" },
304
- meta: {
305
- annotations: { readonly: true }
306
- }
307
- };
308
- const mockGetAbility = jest.fn().mockResolvedValue(mockAbility);
309
- import_data.resolveSelect.mockReturnValue({
310
- getAbility: mockGetAbility
311
- });
312
- const mockResponse = { data: "read-only data" };
313
- import_api_fetch.default.mockResolvedValue(
314
- mockResponse
315
- );
316
- const result = await (0, import_api.executeAbility)("test/read-only", {});
317
- expect(import_api_fetch.default).toHaveBeenCalledWith({
318
- path: "/wp-abilities/v1/abilities/test/read-only/run?",
319
- method: "GET"
320
- });
321
- expect(result).toEqual(mockResponse);
322
- });
323
- it("should execute a destructive idempotent ability via DELETE", async () => {
324
- const mockAbility = {
325
- name: "test/destructive",
326
- label: "Destructive Ability",
327
- description: "Test destructive idempotent ability.",
328
- category: "test-category",
329
- input_schema: {
330
- type: "object",
331
- properties: {
332
- id: { type: "string" },
333
- format: { type: "string" }
334
- }
335
- },
336
- output_schema: { type: "string" },
337
- meta: {
338
- annotations: {
339
- destructive: true,
340
- idempotent: true
341
- }
342
- }
343
- };
344
- const mockGetAbility = jest.fn().mockResolvedValue(mockAbility);
345
- import_data.resolveSelect.mockReturnValue({
346
- getAbility: mockGetAbility
347
- });
348
- const mockResponse = "Item deleted successfully.";
349
- import_api_fetch.default.mockResolvedValue(
350
- mockResponse
351
- );
352
- const input = { id: "123", format: "json" };
353
- const result = await (0, import_api.executeAbility)("test/destructive", input);
354
- expect(import_api_fetch.default).toHaveBeenCalledWith({
355
- path: "/wp-abilities/v1/abilities/test/destructive/run?input%5Bid%5D=123&input%5Bformat%5D=json",
356
- method: "DELETE"
357
- });
358
- expect(result).toEqual(mockResponse);
359
- });
360
- it("should handle errors in client ability execution", async () => {
361
- const consoleErrorSpy = jest.spyOn(console, "error").mockImplementation();
362
- const executionError = new Error("Execution failed");
363
- const mockCallback = jest.fn().mockRejectedValue(executionError);
364
- const mockAbility = {
365
- name: "test/client-ability",
366
- label: "Client Ability",
367
- description: "Test client ability",
368
- category: "test-category",
369
- input_schema: { type: "object" },
370
- output_schema: { type: "object" },
371
- callback: mockCallback
372
- };
373
- const mockGetAbility = jest.fn().mockResolvedValue(mockAbility);
374
- import_data.resolveSelect.mockReturnValue({
375
- getAbility: mockGetAbility
376
- });
377
- await expect(
378
- (0, import_api.executeAbility)("test/client-ability", {})
379
- ).rejects.toThrow("Execution failed");
380
- expect(consoleErrorSpy).toHaveBeenCalledWith(
381
- "Error executing client ability test/client-ability:",
382
- executionError
383
- );
384
- consoleErrorSpy.mockRestore();
385
- });
386
- it("should handle errors in server ability execution", async () => {
387
- const consoleErrorSpy = jest.spyOn(console, "error").mockImplementation();
388
- const apiError = new Error("API request failed");
389
- const mockAbility = {
390
- name: "test/server-ability",
391
- label: "Server Ability",
392
- description: "Test server ability",
393
- category: "test-category",
394
- input_schema: { type: "object" },
395
- output_schema: { type: "object" }
396
- };
397
- const mockGetAbility = jest.fn().mockResolvedValue(mockAbility);
398
- import_data.resolveSelect.mockReturnValue({
399
- getAbility: mockGetAbility
400
- });
401
- import_api_fetch.default.mockRejectedValue(apiError);
402
- await expect(
403
- (0, import_api.executeAbility)("test/server-ability", {})
404
- ).rejects.toThrow("API request failed");
405
- expect(consoleErrorSpy).toHaveBeenCalledWith(
406
- "Error executing ability test/server-ability:",
407
- apiError
408
- );
409
- consoleErrorSpy.mockRestore();
410
- });
411
- it("should execute ability without callback as server ability", async () => {
412
- const mockAbility = {
413
- name: "test/ability",
414
- label: "Test Ability",
415
- description: "Test ability without callback",
416
- category: "test-category",
417
- input_schema: { type: "object" },
418
- output_schema: { type: "object" }
419
- // No callback - should execute as server ability
420
- };
421
- const mockGetAbility = jest.fn().mockResolvedValue(mockAbility);
422
- import_data.resolveSelect.mockReturnValue({
423
- getAbility: mockGetAbility
424
- });
425
- const mockResponse = { success: true };
426
- import_api_fetch.default.mockResolvedValue(
427
- mockResponse
428
- );
429
- const result = await (0, import_api.executeAbility)("test/ability", {
430
- data: "test"
431
- });
432
- expect(import_api_fetch.default).toHaveBeenCalledWith({
433
- path: "/wp-abilities/v1/abilities/test/ability/run",
434
- method: "POST",
435
- data: { input: { data: "test" } }
436
- });
437
- expect(result).toEqual(mockResponse);
438
- });
439
- it("should validate output for client abilities", async () => {
440
- const mockCallback = jest.fn().mockResolvedValue({ invalid: "response" });
441
- const mockAbility = {
442
- name: "test/client-ability",
443
- label: "Client Ability",
444
- description: "Test client ability",
445
- category: "test-category",
446
- input_schema: { type: "object" },
447
- output_schema: {
448
- type: "object",
449
- properties: {
450
- result: { type: "string" }
451
- },
452
- required: ["result"]
453
- },
454
- callback: mockCallback
455
- };
456
- const mockGetAbility = jest.fn().mockResolvedValue(mockAbility);
457
- import_data.resolveSelect.mockReturnValue({
458
- getAbility: mockGetAbility
459
- });
460
- await expect(
461
- (0, import_api.executeAbility)("test/client-ability", {})
462
- ).rejects.toThrow("invalid output");
463
- });
464
- });
465
- describe("getAbilityCategories", () => {
466
- it("should resolve and return all categories from the store", async () => {
467
- const mockCategories = [
468
- {
469
- slug: "data-retrieval",
470
- label: "Data Retrieval",
471
- description: "Abilities that retrieve data"
472
- },
473
- {
474
- slug: "user-management",
475
- label: "User Management",
476
- description: "Abilities for managing users"
477
- }
478
- ];
479
- const mockGetAbilityCategories = jest.fn().mockResolvedValue(mockCategories);
480
- import_data.resolveSelect.mockReturnValue({
481
- getAbilityCategories: mockGetAbilityCategories
482
- });
483
- const result = await (0, import_api.getAbilityCategories)();
484
- expect(import_data.resolveSelect).toHaveBeenCalledWith(import_store.store);
485
- expect(mockGetAbilityCategories).toHaveBeenCalled();
486
- expect(result).toEqual(mockCategories);
487
- });
488
- it("should return empty array when no categories exist", async () => {
489
- const mockGetAbilityCategories = jest.fn().mockResolvedValue([]);
490
- import_data.resolveSelect.mockReturnValue({
491
- getAbilityCategories: mockGetAbilityCategories
492
- });
493
- const result = await (0, import_api.getAbilityCategories)();
494
- expect(result).toEqual([]);
495
- });
496
- });
497
- describe("getAbilityCategory", () => {
498
- it("should return a specific category by slug", async () => {
499
- const mockCategory = {
500
- slug: "data-retrieval",
501
- label: "Data Retrieval",
502
- description: "Abilities that retrieve data"
503
- };
504
- const mockGetAbilityCategory = jest.fn().mockResolvedValue(mockCategory);
505
- import_data.resolveSelect.mockReturnValue({
506
- getAbilityCategory: mockGetAbilityCategory
507
- });
508
- const result = await (0, import_api.getAbilityCategory)("data-retrieval");
509
- expect(import_data.resolveSelect).toHaveBeenCalledWith(import_store.store);
510
- expect(mockGetAbilityCategory).toHaveBeenCalledWith(
511
- "data-retrieval"
512
- );
513
- expect(result).toEqual(mockCategory);
514
- });
515
- it("should return null if category not found", async () => {
516
- const mockGetAbilityCategory = jest.fn().mockResolvedValue(null);
517
- import_data.resolveSelect.mockReturnValue({
518
- getAbilityCategory: mockGetAbilityCategory
519
- });
520
- const result = await (0, import_api.getAbilityCategory)("non-existent");
521
- expect(mockGetAbilityCategory).toHaveBeenCalledWith(
522
- "non-existent"
523
- );
524
- expect(result).toBeNull();
525
- });
526
- it("should handle categories with meta", async () => {
527
- const mockCategory = {
528
- slug: "user-management",
529
- label: "User Management",
530
- description: "Abilities for managing users",
531
- meta: {
532
- priority: "high"
533
- }
534
- };
535
- const mockGetAbilityCategory = jest.fn().mockResolvedValue(mockCategory);
536
- import_data.resolveSelect.mockReturnValue({
537
- getAbilityCategory: mockGetAbilityCategory
538
- });
539
- const result = await (0, import_api.getAbilityCategory)("user-management");
540
- expect(result).toEqual(mockCategory);
541
- expect(result?.meta).toBeDefined();
542
- expect(result?.meta?.priority).toBe("high");
543
- });
544
- });
545
- });
546
- //# sourceMappingURL=api.test.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/tests/api.test.ts"],
4
- "sourcesContent": ["/**\n * Tests for API functions.\n */\n\n/**\n * WordPress dependencies\n */\nimport { dispatch, select, resolveSelect } from '@wordpress/data';\nimport apiFetch from '@wordpress/api-fetch';\n\n/**\n * Internal dependencies\n */\nimport {\n\tgetAbilities,\n\tgetAbility,\n\tgetAbilityCategories,\n\tgetAbilityCategory,\n\tregisterAbility,\n\tunregisterAbility,\n\texecuteAbility,\n} from '../api';\nimport { store } from '../store';\nimport type { Ability, AbilityCategory } from '../types';\n\n// Mock WordPress dependencies\njest.mock( '@wordpress/data', () => ( {\n\tdispatch: jest.fn(),\n\tselect: jest.fn(),\n\tresolveSelect: jest.fn(),\n} ) );\n\njest.mock( '@wordpress/api-fetch' );\n\njest.mock( '../store', () => ( {\n\tstore: 'abilities-api/store',\n} ) );\n\ndescribe( 'API functions', () => {\n\tbeforeEach( () => {\n\t\tjest.clearAllMocks();\n\t} );\n\n\tdescribe( 'getAbilities', () => {\n\t\tit( 'should resolve and return all abilities from the store', async () => {\n\t\t\tconst mockAbilities: Ability[] = [\n\t\t\t\t{\n\t\t\t\t\tname: 'test/ability1',\n\t\t\t\t\tlabel: 'Test Ability 1',\n\t\t\t\t\tdescription: 'First test ability',\n\t\t\t\t\tcategory: 'test-category',\n\t\t\t\t\tinput_schema: { type: 'object' },\n\t\t\t\t\toutput_schema: { type: 'object' },\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: 'test/ability2',\n\t\t\t\t\tlabel: 'Test Ability 2',\n\t\t\t\t\tdescription: 'Second test ability',\n\t\t\t\t\tcategory: 'test-category',\n\t\t\t\t\tinput_schema: { type: 'object' },\n\t\t\t\t\toutput_schema: { type: 'object' },\n\t\t\t\t},\n\t\t\t];\n\n\t\t\tconst mockGetAbilities = jest\n\t\t\t\t.fn()\n\t\t\t\t.mockResolvedValue( mockAbilities );\n\t\t\t( resolveSelect as jest.Mock ).mockReturnValue( {\n\t\t\t\tgetAbilities: mockGetAbilities,\n\t\t\t} );\n\n\t\t\tconst result = await getAbilities();\n\n\t\t\texpect( resolveSelect ).toHaveBeenCalledWith( store );\n\t\t\texpect( mockGetAbilities ).toHaveBeenCalled();\n\t\t\texpect( result ).toEqual( mockAbilities );\n\t\t} );\n\n\t\tit( 'should pass category parameter to store when filtering', async () => {\n\t\t\tconst mockAbilities: Ability[] = [\n\t\t\t\t{\n\t\t\t\t\tname: 'test/ability1',\n\t\t\t\t\tlabel: 'Test Ability 1',\n\t\t\t\t\tdescription: 'First test ability',\n\t\t\t\t\tcategory: 'data-retrieval',\n\t\t\t\t\tinput_schema: { type: 'object' },\n\t\t\t\t\toutput_schema: { type: 'object' },\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: 'test/ability2',\n\t\t\t\t\tlabel: 'Test Ability 2',\n\t\t\t\t\tdescription: 'Second test ability',\n\t\t\t\t\tcategory: 'data-retrieval',\n\t\t\t\t\tinput_schema: { type: 'object' },\n\t\t\t\t\toutput_schema: { type: 'object' },\n\t\t\t\t},\n\t\t\t];\n\n\t\t\tconst mockGetAbilities = jest\n\t\t\t\t.fn()\n\t\t\t\t.mockResolvedValue( mockAbilities );\n\t\t\t( resolveSelect as jest.Mock ).mockReturnValue( {\n\t\t\t\tgetAbilities: mockGetAbilities,\n\t\t\t} );\n\n\t\t\tconst result = await getAbilities( { category: 'data-retrieval' } );\n\n\t\t\texpect( resolveSelect ).toHaveBeenCalledWith( store );\n\t\t\texpect( mockGetAbilities ).toHaveBeenCalledWith( {\n\t\t\t\tcategory: 'data-retrieval',\n\t\t\t} );\n\t\t\texpect( result ).toEqual( mockAbilities );\n\t\t} );\n\t} );\n\n\tdescribe( 'getAbility', () => {\n\t\tit( 'should return a specific ability by name', async () => {\n\t\t\tconst mockAbility: Ability = {\n\t\t\t\tname: 'test/ability',\n\t\t\t\tlabel: 'Test Ability',\n\t\t\t\tdescription: 'Test ability description',\n\t\t\t\tcategory: 'test-category',\n\t\t\t\tinput_schema: { type: 'object' },\n\t\t\t\toutput_schema: { type: 'object' },\n\t\t\t};\n\n\t\t\tconst mockGetAbility = jest.fn().mockResolvedValue( mockAbility );\n\t\t\t( resolveSelect as jest.Mock ).mockReturnValue( {\n\t\t\t\tgetAbility: mockGetAbility,\n\t\t\t} );\n\n\t\t\tconst result = await getAbility( 'test/ability' );\n\n\t\t\texpect( resolveSelect ).toHaveBeenCalledWith( store );\n\t\t\texpect( mockGetAbility ).toHaveBeenCalledWith( 'test/ability' );\n\t\t\texpect( result ).toEqual( mockAbility );\n\t\t} );\n\n\t\tit( 'should return null if ability not found', async () => {\n\t\t\tconst mockGetAbility = jest.fn().mockResolvedValue( null );\n\t\t\t( resolveSelect as jest.Mock ).mockReturnValue( {\n\t\t\t\tgetAbility: mockGetAbility,\n\t\t\t} );\n\n\t\t\tconst result = await getAbility( 'non-existent' );\n\n\t\t\texpect( mockGetAbility ).toHaveBeenCalledWith( 'non-existent' );\n\t\t\texpect( result ).toBeNull();\n\t\t} );\n\t} );\n\n\tdescribe( 'registerAbility', () => {\n\t\tit( 'should register a client-side ability with a callback', () => {\n\t\t\tconst mockRegisterAbility = jest.fn();\n\t\t\t( dispatch as jest.Mock ).mockReturnValue( {\n\t\t\t\tregisterAbility: mockRegisterAbility,\n\t\t\t} );\n\n\t\t\t// Mock select to return no existing ability\n\t\t\t( select as jest.Mock ).mockReturnValue( {\n\t\t\t\tgetAbility: jest.fn().mockReturnValue( null ),\n\t\t\t} );\n\n\t\t\tconst ability = {\n\t\t\t\tname: 'test/client-ability',\n\t\t\t\tlabel: 'Client Ability',\n\t\t\t\tdescription: 'Test client ability',\n\t\t\t\tcategory: 'test-category',\n\t\t\t\tinput_schema: { type: 'object' },\n\t\t\t\toutput_schema: { type: 'object' },\n\t\t\t\tcallback: jest.fn(),\n\t\t\t};\n\n\t\t\tregisterAbility( ability );\n\n\t\t\texpect( dispatch ).toHaveBeenCalledWith( store );\n\t\t\texpect( mockRegisterAbility ).toHaveBeenCalledWith( ability );\n\t\t} );\n\t} );\n\n\tdescribe( 'unregisterAbility', () => {\n\t\tit( 'should unregister an ability', () => {\n\t\t\tconst mockUnregisterAbility = jest.fn();\n\t\t\t( dispatch as jest.Mock ).mockReturnValue( {\n\t\t\t\tunregisterAbility: mockUnregisterAbility,\n\t\t\t} );\n\n\t\t\tunregisterAbility( 'test/ability' );\n\n\t\t\texpect( dispatch ).toHaveBeenCalledWith( store );\n\t\t\texpect( mockUnregisterAbility ).toHaveBeenCalledWith(\n\t\t\t\t'test/ability'\n\t\t\t);\n\t\t} );\n\t} );\n\n\tdescribe( 'executeAbility', () => {\n\t\tit( 'should execute a server-side ability via API', async () => {\n\t\t\tconst mockAbility: Ability = {\n\t\t\t\tname: 'test/server-ability',\n\t\t\t\tlabel: 'Server Ability',\n\t\t\t\tdescription: 'Test server ability',\n\t\t\t\tcategory: 'test-category',\n\t\t\t\tinput_schema: {\n\t\t\t\t\ttype: 'object',\n\t\t\t\t\tproperties: {\n\t\t\t\t\t\tmessage: { type: 'string' },\n\t\t\t\t\t},\n\t\t\t\t\trequired: [ 'message' ],\n\t\t\t\t},\n\t\t\t\toutput_schema: { type: 'object' },\n\t\t\t};\n\n\t\t\tconst mockGetAbility = jest.fn().mockResolvedValue( mockAbility );\n\t\t\t( resolveSelect as jest.Mock ).mockReturnValue( {\n\t\t\t\tgetAbility: mockGetAbility,\n\t\t\t} );\n\n\t\t\tconst mockResponse = { success: true, result: 'test' };\n\t\t\t( apiFetch as unknown as jest.Mock ).mockResolvedValue(\n\t\t\t\tmockResponse\n\t\t\t);\n\n\t\t\tconst input = { message: 'Hello' };\n\t\t\tconst result = await executeAbility( 'test/server-ability', input );\n\n\t\t\texpect( mockGetAbility ).toHaveBeenCalledWith(\n\t\t\t\t'test/server-ability'\n\t\t\t);\n\t\t\texpect( apiFetch ).toHaveBeenCalledWith( {\n\t\t\t\tpath: '/wp-abilities/v1/abilities/test/server-ability/run',\n\t\t\t\tmethod: 'POST',\n\t\t\t\tdata: { input },\n\t\t\t} );\n\t\t\texpect( result ).toEqual( mockResponse );\n\t\t} );\n\n\t\tit( 'should execute a client-side ability locally', async () => {\n\t\t\tconst mockCallback = jest\n\t\t\t\t.fn()\n\t\t\t\t.mockResolvedValue( { success: true } );\n\t\t\tconst mockAbility: Ability = {\n\t\t\t\tname: 'test/client-ability',\n\t\t\t\tlabel: 'Client Ability',\n\t\t\t\tdescription: 'Test client ability',\n\t\t\t\tcategory: 'test-category',\n\t\t\t\tinput_schema: { type: 'object' },\n\t\t\t\toutput_schema: { type: 'object' },\n\t\t\t\tcallback: mockCallback,\n\t\t\t};\n\n\t\t\tconst mockGetAbility = jest.fn().mockResolvedValue( mockAbility );\n\t\t\t( resolveSelect as jest.Mock ).mockReturnValue( {\n\t\t\t\tgetAbility: mockGetAbility,\n\t\t\t} );\n\n\t\t\tconst input = { test: 'data' };\n\t\t\tconst result = await executeAbility( 'test/client-ability', input );\n\n\t\t\texpect( mockGetAbility ).toHaveBeenCalledWith(\n\t\t\t\t'test/client-ability'\n\t\t\t);\n\t\t\texpect( mockCallback ).toHaveBeenCalledWith( input );\n\t\t\texpect( apiFetch ).not.toHaveBeenCalled();\n\t\t\texpect( result ).toEqual( { success: true } );\n\t\t} );\n\n\t\tit( 'should throw error if ability not found', async () => {\n\t\t\tconst mockGetAbility = jest.fn().mockResolvedValue( null );\n\t\t\t( resolveSelect as jest.Mock ).mockReturnValue( {\n\t\t\t\tgetAbility: mockGetAbility,\n\t\t\t} );\n\n\t\t\tawait expect(\n\t\t\t\texecuteAbility( 'non-existent', {} )\n\t\t\t).rejects.toThrow( 'Ability not found: non-existent' );\n\t\t} );\n\n\t\tit( 'should validate input for client abilities', async () => {\n\t\t\tconst mockCallback = jest.fn();\n\t\t\tconst mockAbility: Ability = {\n\t\t\t\tname: 'test/client-ability',\n\t\t\t\tlabel: 'Client Ability',\n\t\t\t\tdescription: 'Test client ability',\n\t\t\t\tcategory: 'test-category',\n\t\t\t\tinput_schema: {\n\t\t\t\t\ttype: 'object',\n\t\t\t\t\tproperties: {\n\t\t\t\t\t\tmessage: { type: 'string' },\n\t\t\t\t\t},\n\t\t\t\t\trequired: [ 'message' ],\n\t\t\t\t},\n\t\t\t\toutput_schema: { type: 'object' },\n\t\t\t\tcallback: mockCallback,\n\t\t\t};\n\n\t\t\tconst mockGetAbility = jest.fn().mockResolvedValue( mockAbility );\n\t\t\t( resolveSelect as jest.Mock ).mockReturnValue( {\n\t\t\t\tgetAbility: mockGetAbility,\n\t\t\t} );\n\n\t\t\tawait expect(\n\t\t\t\texecuteAbility( 'test/client-ability', {} )\n\t\t\t).rejects.toThrow( 'invalid input' );\n\t\t} );\n\n\t\tit( 'should execute a read-only ability via GET', async () => {\n\t\t\tconst mockAbility: Ability = {\n\t\t\t\tname: 'test/read-only',\n\t\t\t\tlabel: 'Read-only Ability',\n\t\t\t\tdescription: 'Test read-only ability.',\n\t\t\t\tcategory: 'test-category',\n\t\t\t\tinput_schema: {\n\t\t\t\t\ttype: 'object',\n\t\t\t\t\tproperties: {\n\t\t\t\t\t\tid: { type: 'string' },\n\t\t\t\t\t\tformat: { type: 'string' },\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\toutput_schema: { type: 'object' },\n\t\t\t\tmeta: {\n\t\t\t\t\tannotations: { readonly: true },\n\t\t\t\t},\n\t\t\t};\n\n\t\t\tconst mockGetAbility = jest.fn().mockResolvedValue( mockAbility );\n\t\t\t( resolveSelect as jest.Mock ).mockReturnValue( {\n\t\t\t\tgetAbility: mockGetAbility,\n\t\t\t} );\n\n\t\t\tconst mockResponse = { data: 'read-only data' };\n\t\t\t( apiFetch as unknown as jest.Mock ).mockResolvedValue(\n\t\t\t\tmockResponse\n\t\t\t);\n\n\t\t\tconst input = { id: '123', format: 'json' };\n\t\t\tconst result = await executeAbility( 'test/read-only', input );\n\n\t\t\texpect( apiFetch ).toHaveBeenCalledWith( {\n\t\t\t\tpath: '/wp-abilities/v1/abilities/test/read-only/run?input%5Bid%5D=123&input%5Bformat%5D=json',\n\t\t\t\tmethod: 'GET',\n\t\t\t} );\n\t\t\texpect( result ).toEqual( mockResponse );\n\t\t} );\n\n\t\tit( 'should execute a read-only ability with empty input', async () => {\n\t\t\tconst mockAbility: Ability = {\n\t\t\t\tname: 'test/read-only',\n\t\t\t\tlabel: 'Read-only Ability',\n\t\t\t\tdescription: 'Test read-only ability.',\n\t\t\t\tcategory: 'test-category',\n\t\t\t\tinput_schema: { type: 'object' },\n\t\t\t\toutput_schema: { type: 'object' },\n\t\t\t\tmeta: {\n\t\t\t\t\tannotations: { readonly: true },\n\t\t\t\t},\n\t\t\t};\n\n\t\t\tconst mockGetAbility = jest.fn().mockResolvedValue( mockAbility );\n\t\t\t( resolveSelect as jest.Mock ).mockReturnValue( {\n\t\t\t\tgetAbility: mockGetAbility,\n\t\t\t} );\n\n\t\t\tconst mockResponse = { data: 'read-only data' };\n\t\t\t( apiFetch as unknown as jest.Mock ).mockResolvedValue(\n\t\t\t\tmockResponse\n\t\t\t);\n\n\t\t\tconst result = await executeAbility( 'test/read-only', {} );\n\n\t\t\texpect( apiFetch ).toHaveBeenCalledWith( {\n\t\t\t\tpath: '/wp-abilities/v1/abilities/test/read-only/run?',\n\t\t\t\tmethod: 'GET',\n\t\t\t} );\n\t\t\texpect( result ).toEqual( mockResponse );\n\t\t} );\n\n\t\tit( 'should execute a destructive idempotent ability via DELETE', async () => {\n\t\t\tconst mockAbility: Ability = {\n\t\t\t\tname: 'test/destructive',\n\t\t\t\tlabel: 'Destructive Ability',\n\t\t\t\tdescription: 'Test destructive idempotent ability.',\n\t\t\t\tcategory: 'test-category',\n\t\t\t\tinput_schema: {\n\t\t\t\t\ttype: 'object',\n\t\t\t\t\tproperties: {\n\t\t\t\t\t\tid: { type: 'string' },\n\t\t\t\t\t\tformat: { type: 'string' },\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\toutput_schema: { type: 'string' },\n\t\t\t\tmeta: {\n\t\t\t\t\tannotations: {\n\t\t\t\t\t\tdestructive: true,\n\t\t\t\t\t\tidempotent: true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t};\n\n\t\t\tconst mockGetAbility = jest.fn().mockResolvedValue( mockAbility );\n\t\t\t( resolveSelect as jest.Mock ).mockReturnValue( {\n\t\t\t\tgetAbility: mockGetAbility,\n\t\t\t} );\n\n\t\t\tconst mockResponse = 'Item deleted successfully.';\n\t\t\t( apiFetch as unknown as jest.Mock ).mockResolvedValue(\n\t\t\t\tmockResponse\n\t\t\t);\n\n\t\t\tconst input = { id: '123', format: 'json' };\n\t\t\tconst result = await executeAbility( 'test/destructive', input );\n\n\t\t\texpect( apiFetch ).toHaveBeenCalledWith( {\n\t\t\t\tpath: '/wp-abilities/v1/abilities/test/destructive/run?input%5Bid%5D=123&input%5Bformat%5D=json',\n\t\t\t\tmethod: 'DELETE',\n\t\t\t} );\n\t\t\texpect( result ).toEqual( mockResponse );\n\t\t} );\n\n\t\tit( 'should handle errors in client ability execution', async () => {\n\t\t\tconst consoleErrorSpy = jest\n\t\t\t\t.spyOn( console, 'error' )\n\t\t\t\t.mockImplementation();\n\t\t\tconst executionError = new Error( 'Execution failed' );\n\t\t\tconst mockCallback = jest.fn().mockRejectedValue( executionError );\n\n\t\t\tconst mockAbility: Ability = {\n\t\t\t\tname: 'test/client-ability',\n\t\t\t\tlabel: 'Client Ability',\n\t\t\t\tdescription: 'Test client ability',\n\t\t\t\tcategory: 'test-category',\n\t\t\t\tinput_schema: { type: 'object' },\n\t\t\t\toutput_schema: { type: 'object' },\n\t\t\t\tcallback: mockCallback,\n\t\t\t};\n\n\t\t\tconst mockGetAbility = jest.fn().mockResolvedValue( mockAbility );\n\t\t\t( resolveSelect as jest.Mock ).mockReturnValue( {\n\t\t\t\tgetAbility: mockGetAbility,\n\t\t\t} );\n\n\t\t\tawait expect(\n\t\t\t\texecuteAbility( 'test/client-ability', {} )\n\t\t\t).rejects.toThrow( 'Execution failed' );\n\n\t\t\texpect( consoleErrorSpy ).toHaveBeenCalledWith(\n\t\t\t\t'Error executing client ability test/client-ability:',\n\t\t\t\texecutionError\n\t\t\t);\n\n\t\t\tconsoleErrorSpy.mockRestore();\n\t\t} );\n\n\t\tit( 'should handle errors in server ability execution', async () => {\n\t\t\tconst consoleErrorSpy = jest\n\t\t\t\t.spyOn( console, 'error' )\n\t\t\t\t.mockImplementation();\n\t\t\tconst apiError = new Error( 'API request failed' );\n\n\t\t\tconst mockAbility: Ability = {\n\t\t\t\tname: 'test/server-ability',\n\t\t\t\tlabel: 'Server Ability',\n\t\t\t\tdescription: 'Test server ability',\n\t\t\t\tcategory: 'test-category',\n\t\t\t\tinput_schema: { type: 'object' },\n\t\t\t\toutput_schema: { type: 'object' },\n\t\t\t};\n\n\t\t\tconst mockGetAbility = jest.fn().mockResolvedValue( mockAbility );\n\t\t\t( resolveSelect as jest.Mock ).mockReturnValue( {\n\t\t\t\tgetAbility: mockGetAbility,\n\t\t\t} );\n\n\t\t\t( apiFetch as unknown as jest.Mock ).mockRejectedValue( apiError );\n\n\t\t\tawait expect(\n\t\t\t\texecuteAbility( 'test/server-ability', {} )\n\t\t\t).rejects.toThrow( 'API request failed' );\n\n\t\t\texpect( consoleErrorSpy ).toHaveBeenCalledWith(\n\t\t\t\t'Error executing ability test/server-ability:',\n\t\t\t\tapiError\n\t\t\t);\n\n\t\t\tconsoleErrorSpy.mockRestore();\n\t\t} );\n\n\t\tit( 'should execute ability without callback as server ability', async () => {\n\t\t\tconst mockAbility: Ability = {\n\t\t\t\tname: 'test/ability',\n\t\t\t\tlabel: 'Test Ability',\n\t\t\t\tdescription: 'Test ability without callback',\n\t\t\t\tcategory: 'test-category',\n\t\t\t\tinput_schema: { type: 'object' },\n\t\t\t\toutput_schema: { type: 'object' },\n\t\t\t\t// No callback - should execute as server ability\n\t\t\t};\n\n\t\t\tconst mockGetAbility = jest.fn().mockResolvedValue( mockAbility );\n\t\t\t( resolveSelect as jest.Mock ).mockReturnValue( {\n\t\t\t\tgetAbility: mockGetAbility,\n\t\t\t} );\n\n\t\t\tconst mockResponse = { success: true };\n\t\t\t( apiFetch as unknown as jest.Mock ).mockResolvedValue(\n\t\t\t\tmockResponse\n\t\t\t);\n\n\t\t\tconst result = await executeAbility( 'test/ability', {\n\t\t\t\tdata: 'test',\n\t\t\t} );\n\n\t\t\texpect( apiFetch ).toHaveBeenCalledWith( {\n\t\t\t\tpath: '/wp-abilities/v1/abilities/test/ability/run',\n\t\t\t\tmethod: 'POST',\n\t\t\t\tdata: { input: { data: 'test' } },\n\t\t\t} );\n\t\t\texpect( result ).toEqual( mockResponse );\n\t\t} );\n\n\t\tit( 'should validate output for client abilities', async () => {\n\t\t\tconst mockCallback = jest\n\t\t\t\t.fn()\n\t\t\t\t.mockResolvedValue( { invalid: 'response' } );\n\t\t\tconst mockAbility: Ability = {\n\t\t\t\tname: 'test/client-ability',\n\t\t\t\tlabel: 'Client Ability',\n\t\t\t\tdescription: 'Test client ability',\n\t\t\t\tcategory: 'test-category',\n\t\t\t\tinput_schema: { type: 'object' },\n\t\t\t\toutput_schema: {\n\t\t\t\t\ttype: 'object',\n\t\t\t\t\tproperties: {\n\t\t\t\t\t\tresult: { type: 'string' },\n\t\t\t\t\t},\n\t\t\t\t\trequired: [ 'result' ],\n\t\t\t\t},\n\t\t\t\tcallback: mockCallback,\n\t\t\t};\n\n\t\t\tconst mockGetAbility = jest.fn().mockResolvedValue( mockAbility );\n\t\t\t( resolveSelect as jest.Mock ).mockReturnValue( {\n\t\t\t\tgetAbility: mockGetAbility,\n\t\t\t} );\n\n\t\t\tawait expect(\n\t\t\t\texecuteAbility( 'test/client-ability', {} )\n\t\t\t).rejects.toThrow( 'invalid output' );\n\t\t} );\n\t} );\n\n\tdescribe( 'getAbilityCategories', () => {\n\t\tit( 'should resolve and return all categories from the store', async () => {\n\t\t\tconst mockCategories: AbilityCategory[] = [\n\t\t\t\t{\n\t\t\t\t\tslug: 'data-retrieval',\n\t\t\t\t\tlabel: 'Data Retrieval',\n\t\t\t\t\tdescription: 'Abilities that retrieve data',\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tslug: 'user-management',\n\t\t\t\t\tlabel: 'User Management',\n\t\t\t\t\tdescription: 'Abilities for managing users',\n\t\t\t\t},\n\t\t\t];\n\n\t\t\tconst mockGetAbilityCategories = jest\n\t\t\t\t.fn()\n\t\t\t\t.mockResolvedValue( mockCategories );\n\t\t\t( resolveSelect as jest.Mock ).mockReturnValue( {\n\t\t\t\tgetAbilityCategories: mockGetAbilityCategories,\n\t\t\t} );\n\n\t\t\tconst result = await getAbilityCategories();\n\n\t\t\texpect( resolveSelect ).toHaveBeenCalledWith( store );\n\t\t\texpect( mockGetAbilityCategories ).toHaveBeenCalled();\n\t\t\texpect( result ).toEqual( mockCategories );\n\t\t} );\n\n\t\tit( 'should return empty array when no categories exist', async () => {\n\t\t\tconst mockGetAbilityCategories = jest.fn().mockResolvedValue( [] );\n\t\t\t( resolveSelect as jest.Mock ).mockReturnValue( {\n\t\t\t\tgetAbilityCategories: mockGetAbilityCategories,\n\t\t\t} );\n\n\t\t\tconst result = await getAbilityCategories();\n\n\t\t\texpect( result ).toEqual( [] );\n\t\t} );\n\t} );\n\n\tdescribe( 'getAbilityCategory', () => {\n\t\tit( 'should return a specific category by slug', async () => {\n\t\t\tconst mockCategory: AbilityCategory = {\n\t\t\t\tslug: 'data-retrieval',\n\t\t\t\tlabel: 'Data Retrieval',\n\t\t\t\tdescription: 'Abilities that retrieve data',\n\t\t\t};\n\n\t\t\tconst mockGetAbilityCategory = jest\n\t\t\t\t.fn()\n\t\t\t\t.mockResolvedValue( mockCategory );\n\t\t\t( resolveSelect as jest.Mock ).mockReturnValue( {\n\t\t\t\tgetAbilityCategory: mockGetAbilityCategory,\n\t\t\t} );\n\n\t\t\tconst result = await getAbilityCategory( 'data-retrieval' );\n\n\t\t\texpect( resolveSelect ).toHaveBeenCalledWith( store );\n\t\t\texpect( mockGetAbilityCategory ).toHaveBeenCalledWith(\n\t\t\t\t'data-retrieval'\n\t\t\t);\n\t\t\texpect( result ).toEqual( mockCategory );\n\t\t} );\n\n\t\tit( 'should return null if category not found', async () => {\n\t\t\tconst mockGetAbilityCategory = jest.fn().mockResolvedValue( null );\n\t\t\t( resolveSelect as jest.Mock ).mockReturnValue( {\n\t\t\t\tgetAbilityCategory: mockGetAbilityCategory,\n\t\t\t} );\n\n\t\t\tconst result = await getAbilityCategory( 'non-existent' );\n\n\t\t\texpect( mockGetAbilityCategory ).toHaveBeenCalledWith(\n\t\t\t\t'non-existent'\n\t\t\t);\n\t\t\texpect( result ).toBeNull();\n\t\t} );\n\n\t\tit( 'should handle categories with meta', async () => {\n\t\t\tconst mockCategory: AbilityCategory = {\n\t\t\t\tslug: 'user-management',\n\t\t\t\tlabel: 'User Management',\n\t\t\t\tdescription: 'Abilities for managing users',\n\t\t\t\tmeta: {\n\t\t\t\t\tpriority: 'high',\n\t\t\t\t},\n\t\t\t};\n\n\t\t\tconst mockGetAbilityCategory = jest\n\t\t\t\t.fn()\n\t\t\t\t.mockResolvedValue( mockCategory );\n\t\t\t( resolveSelect as jest.Mock ).mockReturnValue( {\n\t\t\t\tgetAbilityCategory: mockGetAbilityCategory,\n\t\t\t} );\n\n\t\t\tconst result = await getAbilityCategory( 'user-management' );\n\n\t\t\texpect( result ).toEqual( mockCategory );\n\t\t\texpect( result?.meta ).toBeDefined();\n\t\t\texpect( result?.meta?.priority ).toBe( 'high' );\n\t\t} );\n\t} );\n} );\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;AAOA,kBAAgD;AAChD,uBAAqB;AAKrB,iBAQO;AACP,mBAAsB;AAItB,KAAK,KAAM,mBAAmB,OAAQ;AAAA,EACrC,UAAU,KAAK,GAAG;AAAA,EAClB,QAAQ,KAAK,GAAG;AAAA,EAChB,eAAe,KAAK,GAAG;AACxB,EAAI;AAEJ,KAAK,KAAM,sBAAuB;AAElC,KAAK,KAAM,YAAY,OAAQ;AAAA,EAC9B,OAAO;AACR,EAAI;AAEJ,SAAU,iBAAiB,MAAM;AAChC,aAAY,MAAM;AACjB,SAAK,cAAc;AAAA,EACpB,CAAE;AAEF,WAAU,gBAAgB,MAAM;AAC/B,OAAI,0DAA0D,YAAY;AACzE,YAAM,gBAA2B;AAAA,QAChC;AAAA,UACC,MAAM;AAAA,UACN,OAAO;AAAA,UACP,aAAa;AAAA,UACb,UAAU;AAAA,UACV,cAAc,EAAE,MAAM,SAAS;AAAA,UAC/B,eAAe,EAAE,MAAM,SAAS;AAAA,QACjC;AAAA,QACA;AAAA,UACC,MAAM;AAAA,UACN,OAAO;AAAA,UACP,aAAa;AAAA,UACb,UAAU;AAAA,UACV,cAAc,EAAE,MAAM,SAAS;AAAA,UAC/B,eAAe,EAAE,MAAM,SAAS;AAAA,QACjC;AAAA,MACD;AAEA,YAAM,mBAAmB,KACvB,GAAG,EACH,kBAAmB,aAAc;AACnC,MAAE,0BAA6B,gBAAiB;AAAA,QAC/C,cAAc;AAAA,MACf,CAAE;AAEF,YAAM,SAAS,UAAM,yBAAa;AAElC,aAAQ,yBAAc,EAAE,qBAAsB,kBAAM;AACpD,aAAQ,gBAAiB,EAAE,iBAAiB;AAC5C,aAAQ,MAAO,EAAE,QAAS,aAAc;AAAA,IACzC,CAAE;AAEF,OAAI,0DAA0D,YAAY;AACzE,YAAM,gBAA2B;AAAA,QAChC;AAAA,UACC,MAAM;AAAA,UACN,OAAO;AAAA,UACP,aAAa;AAAA,UACb,UAAU;AAAA,UACV,cAAc,EAAE,MAAM,SAAS;AAAA,UAC/B,eAAe,EAAE,MAAM,SAAS;AAAA,QACjC;AAAA,QACA;AAAA,UACC,MAAM;AAAA,UACN,OAAO;AAAA,UACP,aAAa;AAAA,UACb,UAAU;AAAA,UACV,cAAc,EAAE,MAAM,SAAS;AAAA,UAC/B,eAAe,EAAE,MAAM,SAAS;AAAA,QACjC;AAAA,MACD;AAEA,YAAM,mBAAmB,KACvB,GAAG,EACH,kBAAmB,aAAc;AACnC,MAAE,0BAA6B,gBAAiB;AAAA,QAC/C,cAAc;AAAA,MACf,CAAE;AAEF,YAAM,SAAS,UAAM,yBAAc,EAAE,UAAU,iBAAiB,CAAE;AAElE,aAAQ,yBAAc,EAAE,qBAAsB,kBAAM;AACpD,aAAQ,gBAAiB,EAAE,qBAAsB;AAAA,QAChD,UAAU;AAAA,MACX,CAAE;AACF,aAAQ,MAAO,EAAE,QAAS,aAAc;AAAA,IACzC,CAAE;AAAA,EACH,CAAE;AAEF,WAAU,cAAc,MAAM;AAC7B,OAAI,4CAA4C,YAAY;AAC3D,YAAM,cAAuB;AAAA,QAC5B,MAAM;AAAA,QACN,OAAO;AAAA,QACP,aAAa;AAAA,QACb,UAAU;AAAA,QACV,cAAc,EAAE,MAAM,SAAS;AAAA,QAC/B,eAAe,EAAE,MAAM,SAAS;AAAA,MACjC;AAEA,YAAM,iBAAiB,KAAK,GAAG,EAAE,kBAAmB,WAAY;AAChE,MAAE,0BAA6B,gBAAiB;AAAA,QAC/C,YAAY;AAAA,MACb,CAAE;AAEF,YAAM,SAAS,UAAM,uBAAY,cAAe;AAEhD,aAAQ,yBAAc,EAAE,qBAAsB,kBAAM;AACpD,aAAQ,cAAe,EAAE,qBAAsB,cAAe;AAC9D,aAAQ,MAAO,EAAE,QAAS,WAAY;AAAA,IACvC,CAAE;AAEF,OAAI,2CAA2C,YAAY;AAC1D,YAAM,iBAAiB,KAAK,GAAG,EAAE,kBAAmB,IAAK;AACzD,MAAE,0BAA6B,gBAAiB;AAAA,QAC/C,YAAY;AAAA,MACb,CAAE;AAEF,YAAM,SAAS,UAAM,uBAAY,cAAe;AAEhD,aAAQ,cAAe,EAAE,qBAAsB,cAAe;AAC9D,aAAQ,MAAO,EAAE,SAAS;AAAA,IAC3B,CAAE;AAAA,EACH,CAAE;AAEF,WAAU,mBAAmB,MAAM;AAClC,OAAI,yDAAyD,MAAM;AAClE,YAAM,sBAAsB,KAAK,GAAG;AACpC,MAAE,qBAAwB,gBAAiB;AAAA,QAC1C,iBAAiB;AAAA,MAClB,CAAE;AAGF,MAAE,mBAAsB,gBAAiB;AAAA,QACxC,YAAY,KAAK,GAAG,EAAE,gBAAiB,IAAK;AAAA,MAC7C,CAAE;AAEF,YAAM,UAAU;AAAA,QACf,MAAM;AAAA,QACN,OAAO;AAAA,QACP,aAAa;AAAA,QACb,UAAU;AAAA,QACV,cAAc,EAAE,MAAM,SAAS;AAAA,QAC/B,eAAe,EAAE,MAAM,SAAS;AAAA,QAChC,UAAU,KAAK,GAAG;AAAA,MACnB;AAEA,sCAAiB,OAAQ;AAEzB,aAAQ,oBAAS,EAAE,qBAAsB,kBAAM;AAC/C,aAAQ,mBAAoB,EAAE,qBAAsB,OAAQ;AAAA,IAC7D,CAAE;AAAA,EACH,CAAE;AAEF,WAAU,qBAAqB,MAAM;AACpC,OAAI,gCAAgC,MAAM;AACzC,YAAM,wBAAwB,KAAK,GAAG;AACtC,MAAE,qBAAwB,gBAAiB;AAAA,QAC1C,mBAAmB;AAAA,MACpB,CAAE;AAEF,wCAAmB,cAAe;AAElC,aAAQ,oBAAS,EAAE,qBAAsB,kBAAM;AAC/C,aAAQ,qBAAsB,EAAE;AAAA,QAC/B;AAAA,MACD;AAAA,IACD,CAAE;AAAA,EACH,CAAE;AAEF,WAAU,kBAAkB,MAAM;AACjC,OAAI,gDAAgD,YAAY;AAC/D,YAAM,cAAuB;AAAA,QAC5B,MAAM;AAAA,QACN,OAAO;AAAA,QACP,aAAa;AAAA,QACb,UAAU;AAAA,QACV,cAAc;AAAA,UACb,MAAM;AAAA,UACN,YAAY;AAAA,YACX,SAAS,EAAE,MAAM,SAAS;AAAA,UAC3B;AAAA,UACA,UAAU,CAAE,SAAU;AAAA,QACvB;AAAA,QACA,eAAe,EAAE,MAAM,SAAS;AAAA,MACjC;AAEA,YAAM,iBAAiB,KAAK,GAAG,EAAE,kBAAmB,WAAY;AAChE,MAAE,0BAA6B,gBAAiB;AAAA,QAC/C,YAAY;AAAA,MACb,CAAE;AAEF,YAAM,eAAe,EAAE,SAAS,MAAM,QAAQ,OAAO;AACrD,MAAE,iBAAAA,QAAmC;AAAA,QACpC;AAAA,MACD;AAEA,YAAM,QAAQ,EAAE,SAAS,QAAQ;AACjC,YAAM,SAAS,UAAM,2BAAgB,uBAAuB,KAAM;AAElE,aAAQ,cAAe,EAAE;AAAA,QACxB;AAAA,MACD;AACA,aAAQ,iBAAAA,OAAS,EAAE,qBAAsB;AAAA,QACxC,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,MAAM,EAAE,MAAM;AAAA,MACf,CAAE;AACF,aAAQ,MAAO,EAAE,QAAS,YAAa;AAAA,IACxC,CAAE;AAEF,OAAI,gDAAgD,YAAY;AAC/D,YAAM,eAAe,KACnB,GAAG,EACH,kBAAmB,EAAE,SAAS,KAAK,CAAE;AACvC,YAAM,cAAuB;AAAA,QAC5B,MAAM;AAAA,QACN,OAAO;AAAA,QACP,aAAa;AAAA,QACb,UAAU;AAAA,QACV,cAAc,EAAE,MAAM,SAAS;AAAA,QAC/B,eAAe,EAAE,MAAM,SAAS;AAAA,QAChC,UAAU;AAAA,MACX;AAEA,YAAM,iBAAiB,KAAK,GAAG,EAAE,kBAAmB,WAAY;AAChE,MAAE,0BAA6B,gBAAiB;AAAA,QAC/C,YAAY;AAAA,MACb,CAAE;AAEF,YAAM,QAAQ,EAAE,MAAM,OAAO;AAC7B,YAAM,SAAS,UAAM,2BAAgB,uBAAuB,KAAM;AAElE,aAAQ,cAAe,EAAE;AAAA,QACxB;AAAA,MACD;AACA,aAAQ,YAAa,EAAE,qBAAsB,KAAM;AACnD,aAAQ,iBAAAA,OAAS,EAAE,IAAI,iBAAiB;AACxC,aAAQ,MAAO,EAAE,QAAS,EAAE,SAAS,KAAK,CAAE;AAAA,IAC7C,CAAE;AAEF,OAAI,2CAA2C,YAAY;AAC1D,YAAM,iBAAiB,KAAK,GAAG,EAAE,kBAAmB,IAAK;AACzD,MAAE,0BAA6B,gBAAiB;AAAA,QAC/C,YAAY;AAAA,MACb,CAAE;AAEF,YAAM;AAAA,YACL,2BAAgB,gBAAgB,CAAC,CAAE;AAAA,MACpC,EAAE,QAAQ,QAAS,iCAAkC;AAAA,IACtD,CAAE;AAEF,OAAI,8CAA8C,YAAY;AAC7D,YAAM,eAAe,KAAK,GAAG;AAC7B,YAAM,cAAuB;AAAA,QAC5B,MAAM;AAAA,QACN,OAAO;AAAA,QACP,aAAa;AAAA,QACb,UAAU;AAAA,QACV,cAAc;AAAA,UACb,MAAM;AAAA,UACN,YAAY;AAAA,YACX,SAAS,EAAE,MAAM,SAAS;AAAA,UAC3B;AAAA,UACA,UAAU,CAAE,SAAU;AAAA,QACvB;AAAA,QACA,eAAe,EAAE,MAAM,SAAS;AAAA,QAChC,UAAU;AAAA,MACX;AAEA,YAAM,iBAAiB,KAAK,GAAG,EAAE,kBAAmB,WAAY;AAChE,MAAE,0BAA6B,gBAAiB;AAAA,QAC/C,YAAY;AAAA,MACb,CAAE;AAEF,YAAM;AAAA,YACL,2BAAgB,uBAAuB,CAAC,CAAE;AAAA,MAC3C,EAAE,QAAQ,QAAS,eAAgB;AAAA,IACpC,CAAE;AAEF,OAAI,8CAA8C,YAAY;AAC7D,YAAM,cAAuB;AAAA,QAC5B,MAAM;AAAA,QACN,OAAO;AAAA,QACP,aAAa;AAAA,QACb,UAAU;AAAA,QACV,cAAc;AAAA,UACb,MAAM;AAAA,UACN,YAAY;AAAA,YACX,IAAI,EAAE,MAAM,SAAS;AAAA,YACrB,QAAQ,EAAE,MAAM,SAAS;AAAA,UAC1B;AAAA,QACD;AAAA,QACA,eAAe,EAAE,MAAM,SAAS;AAAA,QAChC,MAAM;AAAA,UACL,aAAa,EAAE,UAAU,KAAK;AAAA,QAC/B;AAAA,MACD;AAEA,YAAM,iBAAiB,KAAK,GAAG,EAAE,kBAAmB,WAAY;AAChE,MAAE,0BAA6B,gBAAiB;AAAA,QAC/C,YAAY;AAAA,MACb,CAAE;AAEF,YAAM,eAAe,EAAE,MAAM,iBAAiB;AAC9C,MAAE,iBAAAA,QAAmC;AAAA,QACpC;AAAA,MACD;AAEA,YAAM,QAAQ,EAAE,IAAI,OAAO,QAAQ,OAAO;AAC1C,YAAM,SAAS,UAAM,2BAAgB,kBAAkB,KAAM;AAE7D,aAAQ,iBAAAA,OAAS,EAAE,qBAAsB;AAAA,QACxC,MAAM;AAAA,QACN,QAAQ;AAAA,MACT,CAAE;AACF,aAAQ,MAAO,EAAE,QAAS,YAAa;AAAA,IACxC,CAAE;AAEF,OAAI,uDAAuD,YAAY;AACtE,YAAM,cAAuB;AAAA,QAC5B,MAAM;AAAA,QACN,OAAO;AAAA,QACP,aAAa;AAAA,QACb,UAAU;AAAA,QACV,cAAc,EAAE,MAAM,SAAS;AAAA,QAC/B,eAAe,EAAE,MAAM,SAAS;AAAA,QAChC,MAAM;AAAA,UACL,aAAa,EAAE,UAAU,KAAK;AAAA,QAC/B;AAAA,MACD;AAEA,YAAM,iBAAiB,KAAK,GAAG,EAAE,kBAAmB,WAAY;AAChE,MAAE,0BAA6B,gBAAiB;AAAA,QAC/C,YAAY;AAAA,MACb,CAAE;AAEF,YAAM,eAAe,EAAE,MAAM,iBAAiB;AAC9C,MAAE,iBAAAA,QAAmC;AAAA,QACpC;AAAA,MACD;AAEA,YAAM,SAAS,UAAM,2BAAgB,kBAAkB,CAAC,CAAE;AAE1D,aAAQ,iBAAAA,OAAS,EAAE,qBAAsB;AAAA,QACxC,MAAM;AAAA,QACN,QAAQ;AAAA,MACT,CAAE;AACF,aAAQ,MAAO,EAAE,QAAS,YAAa;AAAA,IACxC,CAAE;AAEF,OAAI,8DAA8D,YAAY;AAC7E,YAAM,cAAuB;AAAA,QAC5B,MAAM;AAAA,QACN,OAAO;AAAA,QACP,aAAa;AAAA,QACb,UAAU;AAAA,QACV,cAAc;AAAA,UACb,MAAM;AAAA,UACN,YAAY;AAAA,YACX,IAAI,EAAE,MAAM,SAAS;AAAA,YACrB,QAAQ,EAAE,MAAM,SAAS;AAAA,UAC1B;AAAA,QACD;AAAA,QACA,eAAe,EAAE,MAAM,SAAS;AAAA,QAChC,MAAM;AAAA,UACL,aAAa;AAAA,YACZ,aAAa;AAAA,YACb,YAAY;AAAA,UACb;AAAA,QACD;AAAA,MACD;AAEA,YAAM,iBAAiB,KAAK,GAAG,EAAE,kBAAmB,WAAY;AAChE,MAAE,0BAA6B,gBAAiB;AAAA,QAC/C,YAAY;AAAA,MACb,CAAE;AAEF,YAAM,eAAe;AACrB,MAAE,iBAAAA,QAAmC;AAAA,QACpC;AAAA,MACD;AAEA,YAAM,QAAQ,EAAE,IAAI,OAAO,QAAQ,OAAO;AAC1C,YAAM,SAAS,UAAM,2BAAgB,oBAAoB,KAAM;AAE/D,aAAQ,iBAAAA,OAAS,EAAE,qBAAsB;AAAA,QACxC,MAAM;AAAA,QACN,QAAQ;AAAA,MACT,CAAE;AACF,aAAQ,MAAO,EAAE,QAAS,YAAa;AAAA,IACxC,CAAE;AAEF,OAAI,oDAAoD,YAAY;AACnE,YAAM,kBAAkB,KACtB,MAAO,SAAS,OAAQ,EACxB,mBAAmB;AACrB,YAAM,iBAAiB,IAAI,MAAO,kBAAmB;AACrD,YAAM,eAAe,KAAK,GAAG,EAAE,kBAAmB,cAAe;AAEjE,YAAM,cAAuB;AAAA,QAC5B,MAAM;AAAA,QACN,OAAO;AAAA,QACP,aAAa;AAAA,QACb,UAAU;AAAA,QACV,cAAc,EAAE,MAAM,SAAS;AAAA,QAC/B,eAAe,EAAE,MAAM,SAAS;AAAA,QAChC,UAAU;AAAA,MACX;AAEA,YAAM,iBAAiB,KAAK,GAAG,EAAE,kBAAmB,WAAY;AAChE,MAAE,0BAA6B,gBAAiB;AAAA,QAC/C,YAAY;AAAA,MACb,CAAE;AAEF,YAAM;AAAA,YACL,2BAAgB,uBAAuB,CAAC,CAAE;AAAA,MAC3C,EAAE,QAAQ,QAAS,kBAAmB;AAEtC,aAAQ,eAAgB,EAAE;AAAA,QACzB;AAAA,QACA;AAAA,MACD;AAEA,sBAAgB,YAAY;AAAA,IAC7B,CAAE;AAEF,OAAI,oDAAoD,YAAY;AACnE,YAAM,kBAAkB,KACtB,MAAO,SAAS,OAAQ,EACxB,mBAAmB;AACrB,YAAM,WAAW,IAAI,MAAO,oBAAqB;AAEjD,YAAM,cAAuB;AAAA,QAC5B,MAAM;AAAA,QACN,OAAO;AAAA,QACP,aAAa;AAAA,QACb,UAAU;AAAA,QACV,cAAc,EAAE,MAAM,SAAS;AAAA,QAC/B,eAAe,EAAE,MAAM,SAAS;AAAA,MACjC;AAEA,YAAM,iBAAiB,KAAK,GAAG,EAAE,kBAAmB,WAAY;AAChE,MAAE,0BAA6B,gBAAiB;AAAA,QAC/C,YAAY;AAAA,MACb,CAAE;AAEF,MAAE,iBAAAA,QAAmC,kBAAmB,QAAS;AAEjE,YAAM;AAAA,YACL,2BAAgB,uBAAuB,CAAC,CAAE;AAAA,MAC3C,EAAE,QAAQ,QAAS,oBAAqB;AAExC,aAAQ,eAAgB,EAAE;AAAA,QACzB;AAAA,QACA;AAAA,MACD;AAEA,sBAAgB,YAAY;AAAA,IAC7B,CAAE;AAEF,OAAI,6DAA6D,YAAY;AAC5E,YAAM,cAAuB;AAAA,QAC5B,MAAM;AAAA,QACN,OAAO;AAAA,QACP,aAAa;AAAA,QACb,UAAU;AAAA,QACV,cAAc,EAAE,MAAM,SAAS;AAAA,QAC/B,eAAe,EAAE,MAAM,SAAS;AAAA;AAAA,MAEjC;AAEA,YAAM,iBAAiB,KAAK,GAAG,EAAE,kBAAmB,WAAY;AAChE,MAAE,0BAA6B,gBAAiB;AAAA,QAC/C,YAAY;AAAA,MACb,CAAE;AAEF,YAAM,eAAe,EAAE,SAAS,KAAK;AACrC,MAAE,iBAAAA,QAAmC;AAAA,QACpC;AAAA,MACD;AAEA,YAAM,SAAS,UAAM,2BAAgB,gBAAgB;AAAA,QACpD,MAAM;AAAA,MACP,CAAE;AAEF,aAAQ,iBAAAA,OAAS,EAAE,qBAAsB;AAAA,QACxC,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,MAAM,EAAE,OAAO,EAAE,MAAM,OAAO,EAAE;AAAA,MACjC,CAAE;AACF,aAAQ,MAAO,EAAE,QAAS,YAAa;AAAA,IACxC,CAAE;AAEF,OAAI,+CAA+C,YAAY;AAC9D,YAAM,eAAe,KACnB,GAAG,EACH,kBAAmB,EAAE,SAAS,WAAW,CAAE;AAC7C,YAAM,cAAuB;AAAA,QAC5B,MAAM;AAAA,QACN,OAAO;AAAA,QACP,aAAa;AAAA,QACb,UAAU;AAAA,QACV,cAAc,EAAE,MAAM,SAAS;AAAA,QAC/B,eAAe;AAAA,UACd,MAAM;AAAA,UACN,YAAY;AAAA,YACX,QAAQ,EAAE,MAAM,SAAS;AAAA,UAC1B;AAAA,UACA,UAAU,CAAE,QAAS;AAAA,QACtB;AAAA,QACA,UAAU;AAAA,MACX;AAEA,YAAM,iBAAiB,KAAK,GAAG,EAAE,kBAAmB,WAAY;AAChE,MAAE,0BAA6B,gBAAiB;AAAA,QAC/C,YAAY;AAAA,MACb,CAAE;AAEF,YAAM;AAAA,YACL,2BAAgB,uBAAuB,CAAC,CAAE;AAAA,MAC3C,EAAE,QAAQ,QAAS,gBAAiB;AAAA,IACrC,CAAE;AAAA,EACH,CAAE;AAEF,WAAU,wBAAwB,MAAM;AACvC,OAAI,2DAA2D,YAAY;AAC1E,YAAM,iBAAoC;AAAA,QACzC;AAAA,UACC,MAAM;AAAA,UACN,OAAO;AAAA,UACP,aAAa;AAAA,QACd;AAAA,QACA;AAAA,UACC,MAAM;AAAA,UACN,OAAO;AAAA,UACP,aAAa;AAAA,QACd;AAAA,MACD;AAEA,YAAM,2BAA2B,KAC/B,GAAG,EACH,kBAAmB,cAAe;AACpC,MAAE,0BAA6B,gBAAiB;AAAA,QAC/C,sBAAsB;AAAA,MACvB,CAAE;AAEF,YAAM,SAAS,UAAM,iCAAqB;AAE1C,aAAQ,yBAAc,EAAE,qBAAsB,kBAAM;AACpD,aAAQ,wBAAyB,EAAE,iBAAiB;AACpD,aAAQ,MAAO,EAAE,QAAS,cAAe;AAAA,IAC1C,CAAE;AAEF,OAAI,sDAAsD,YAAY;AACrE,YAAM,2BAA2B,KAAK,GAAG,EAAE,kBAAmB,CAAC,CAAE;AACjE,MAAE,0BAA6B,gBAAiB;AAAA,QAC/C,sBAAsB;AAAA,MACvB,CAAE;AAEF,YAAM,SAAS,UAAM,iCAAqB;AAE1C,aAAQ,MAAO,EAAE,QAAS,CAAC,CAAE;AAAA,IAC9B,CAAE;AAAA,EACH,CAAE;AAEF,WAAU,sBAAsB,MAAM;AACrC,OAAI,6CAA6C,YAAY;AAC5D,YAAM,eAAgC;AAAA,QACrC,MAAM;AAAA,QACN,OAAO;AAAA,QACP,aAAa;AAAA,MACd;AAEA,YAAM,yBAAyB,KAC7B,GAAG,EACH,kBAAmB,YAAa;AAClC,MAAE,0BAA6B,gBAAiB;AAAA,QAC/C,oBAAoB;AAAA,MACrB,CAAE;AAEF,YAAM,SAAS,UAAM,+BAAoB,gBAAiB;AAE1D,aAAQ,yBAAc,EAAE,qBAAsB,kBAAM;AACpD,aAAQ,sBAAuB,EAAE;AAAA,QAChC;AAAA,MACD;AACA,aAAQ,MAAO,EAAE,QAAS,YAAa;AAAA,IACxC,CAAE;AAEF,OAAI,4CAA4C,YAAY;AAC3D,YAAM,yBAAyB,KAAK,GAAG,EAAE,kBAAmB,IAAK;AACjE,MAAE,0BAA6B,gBAAiB;AAAA,QAC/C,oBAAoB;AAAA,MACrB,CAAE;AAEF,YAAM,SAAS,UAAM,+BAAoB,cAAe;AAExD,aAAQ,sBAAuB,EAAE;AAAA,QAChC;AAAA,MACD;AACA,aAAQ,MAAO,EAAE,SAAS;AAAA,IAC3B,CAAE;AAEF,OAAI,sCAAsC,YAAY;AACrD,YAAM,eAAgC;AAAA,QACrC,MAAM;AAAA,QACN,OAAO;AAAA,QACP,aAAa;AAAA,QACb,MAAM;AAAA,UACL,UAAU;AAAA,QACX;AAAA,MACD;AAEA,YAAM,yBAAyB,KAC7B,GAAG,EACH,kBAAmB,YAAa;AAClC,MAAE,0BAA6B,gBAAiB;AAAA,QAC/C,oBAAoB;AAAA,MACrB,CAAE;AAEF,YAAM,SAAS,UAAM,+BAAoB,iBAAkB;AAE3D,aAAQ,MAAO,EAAE,QAAS,YAAa;AACvC,aAAQ,QAAQ,IAAK,EAAE,YAAY;AACnC,aAAQ,QAAQ,MAAM,QAAS,EAAE,KAAM,MAAO;AAAA,IAC/C,CAAE;AAAA,EACH,CAAE;AACH,CAAE;",
6
- "names": ["apiFetch"]
7
- }