@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.
- package/CHANGELOG.md +2 -0
- package/build-types/store/index.d.ts +1 -1
- package/build-types/store/index.d.ts.map +1 -1
- package/package.json +18 -9
- package/build/store/tests/actions.test.js +0 -792
- package/build/store/tests/actions.test.js.map +0 -7
- package/build/store/tests/reducer.test.js +0 -743
- package/build/store/tests/reducer.test.js.map +0 -7
- package/build/store/tests/resolvers.test.js +0 -520
- package/build/store/tests/resolvers.test.js.map +0 -7
- package/build/store/tests/selectors.test.js +0 -349
- package/build/store/tests/selectors.test.js.map +0 -7
- package/build/tests/api.test.js +0 -546
- package/build/tests/api.test.js.map +0 -7
- package/build/tests/validation.test.js +0 -453
- package/build/tests/validation.test.js.map +0 -7
- package/build-module/store/tests/actions.test.js +0 -804
- package/build-module/store/tests/actions.test.js.map +0 -7
- package/build-module/store/tests/reducer.test.js +0 -726
- package/build-module/store/tests/reducer.test.js.map +0 -7
- package/build-module/store/tests/resolvers.test.js +0 -523
- package/build-module/store/tests/resolvers.test.js.map +0 -7
- package/build-module/store/tests/selectors.test.js +0 -352
- package/build-module/store/tests/selectors.test.js.map +0 -7
- package/build-module/tests/api.test.js +0 -530
- package/build-module/tests/api.test.js.map +0 -7
- package/build-module/tests/validation.test.js +0 -451
- package/build-module/tests/validation.test.js.map +0 -7
|
@@ -1,530 +0,0 @@
|
|
|
1
|
-
// packages/abilities/src/tests/api.test.ts
|
|
2
|
-
import { dispatch, select, resolveSelect } from "@wordpress/data";
|
|
3
|
-
import apiFetch from "@wordpress/api-fetch";
|
|
4
|
-
import {
|
|
5
|
-
getAbilities,
|
|
6
|
-
getAbility,
|
|
7
|
-
getAbilityCategories,
|
|
8
|
-
getAbilityCategory,
|
|
9
|
-
registerAbility,
|
|
10
|
-
unregisterAbility,
|
|
11
|
-
executeAbility
|
|
12
|
-
} from "../api";
|
|
13
|
-
import { store } from "../store";
|
|
14
|
-
jest.mock("@wordpress/data", () => ({
|
|
15
|
-
dispatch: jest.fn(),
|
|
16
|
-
select: jest.fn(),
|
|
17
|
-
resolveSelect: jest.fn()
|
|
18
|
-
}));
|
|
19
|
-
jest.mock("@wordpress/api-fetch");
|
|
20
|
-
jest.mock("../store", () => ({
|
|
21
|
-
store: "abilities-api/store"
|
|
22
|
-
}));
|
|
23
|
-
describe("API functions", () => {
|
|
24
|
-
beforeEach(() => {
|
|
25
|
-
jest.clearAllMocks();
|
|
26
|
-
});
|
|
27
|
-
describe("getAbilities", () => {
|
|
28
|
-
it("should resolve and return all abilities from the store", async () => {
|
|
29
|
-
const mockAbilities = [
|
|
30
|
-
{
|
|
31
|
-
name: "test/ability1",
|
|
32
|
-
label: "Test Ability 1",
|
|
33
|
-
description: "First test ability",
|
|
34
|
-
category: "test-category",
|
|
35
|
-
input_schema: { type: "object" },
|
|
36
|
-
output_schema: { type: "object" }
|
|
37
|
-
},
|
|
38
|
-
{
|
|
39
|
-
name: "test/ability2",
|
|
40
|
-
label: "Test Ability 2",
|
|
41
|
-
description: "Second test ability",
|
|
42
|
-
category: "test-category",
|
|
43
|
-
input_schema: { type: "object" },
|
|
44
|
-
output_schema: { type: "object" }
|
|
45
|
-
}
|
|
46
|
-
];
|
|
47
|
-
const mockGetAbilities = jest.fn().mockResolvedValue(mockAbilities);
|
|
48
|
-
resolveSelect.mockReturnValue({
|
|
49
|
-
getAbilities: mockGetAbilities
|
|
50
|
-
});
|
|
51
|
-
const result = await getAbilities();
|
|
52
|
-
expect(resolveSelect).toHaveBeenCalledWith(store);
|
|
53
|
-
expect(mockGetAbilities).toHaveBeenCalled();
|
|
54
|
-
expect(result).toEqual(mockAbilities);
|
|
55
|
-
});
|
|
56
|
-
it("should pass category parameter to store when filtering", async () => {
|
|
57
|
-
const mockAbilities = [
|
|
58
|
-
{
|
|
59
|
-
name: "test/ability1",
|
|
60
|
-
label: "Test Ability 1",
|
|
61
|
-
description: "First test ability",
|
|
62
|
-
category: "data-retrieval",
|
|
63
|
-
input_schema: { type: "object" },
|
|
64
|
-
output_schema: { type: "object" }
|
|
65
|
-
},
|
|
66
|
-
{
|
|
67
|
-
name: "test/ability2",
|
|
68
|
-
label: "Test Ability 2",
|
|
69
|
-
description: "Second test ability",
|
|
70
|
-
category: "data-retrieval",
|
|
71
|
-
input_schema: { type: "object" },
|
|
72
|
-
output_schema: { type: "object" }
|
|
73
|
-
}
|
|
74
|
-
];
|
|
75
|
-
const mockGetAbilities = jest.fn().mockResolvedValue(mockAbilities);
|
|
76
|
-
resolveSelect.mockReturnValue({
|
|
77
|
-
getAbilities: mockGetAbilities
|
|
78
|
-
});
|
|
79
|
-
const result = await getAbilities({ category: "data-retrieval" });
|
|
80
|
-
expect(resolveSelect).toHaveBeenCalledWith(store);
|
|
81
|
-
expect(mockGetAbilities).toHaveBeenCalledWith({
|
|
82
|
-
category: "data-retrieval"
|
|
83
|
-
});
|
|
84
|
-
expect(result).toEqual(mockAbilities);
|
|
85
|
-
});
|
|
86
|
-
});
|
|
87
|
-
describe("getAbility", () => {
|
|
88
|
-
it("should return a specific ability by name", async () => {
|
|
89
|
-
const mockAbility = {
|
|
90
|
-
name: "test/ability",
|
|
91
|
-
label: "Test Ability",
|
|
92
|
-
description: "Test ability description",
|
|
93
|
-
category: "test-category",
|
|
94
|
-
input_schema: { type: "object" },
|
|
95
|
-
output_schema: { type: "object" }
|
|
96
|
-
};
|
|
97
|
-
const mockGetAbility = jest.fn().mockResolvedValue(mockAbility);
|
|
98
|
-
resolveSelect.mockReturnValue({
|
|
99
|
-
getAbility: mockGetAbility
|
|
100
|
-
});
|
|
101
|
-
const result = await getAbility("test/ability");
|
|
102
|
-
expect(resolveSelect).toHaveBeenCalledWith(store);
|
|
103
|
-
expect(mockGetAbility).toHaveBeenCalledWith("test/ability");
|
|
104
|
-
expect(result).toEqual(mockAbility);
|
|
105
|
-
});
|
|
106
|
-
it("should return null if ability not found", async () => {
|
|
107
|
-
const mockGetAbility = jest.fn().mockResolvedValue(null);
|
|
108
|
-
resolveSelect.mockReturnValue({
|
|
109
|
-
getAbility: mockGetAbility
|
|
110
|
-
});
|
|
111
|
-
const result = await getAbility("non-existent");
|
|
112
|
-
expect(mockGetAbility).toHaveBeenCalledWith("non-existent");
|
|
113
|
-
expect(result).toBeNull();
|
|
114
|
-
});
|
|
115
|
-
});
|
|
116
|
-
describe("registerAbility", () => {
|
|
117
|
-
it("should register a client-side ability with a callback", () => {
|
|
118
|
-
const mockRegisterAbility = jest.fn();
|
|
119
|
-
dispatch.mockReturnValue({
|
|
120
|
-
registerAbility: mockRegisterAbility
|
|
121
|
-
});
|
|
122
|
-
select.mockReturnValue({
|
|
123
|
-
getAbility: jest.fn().mockReturnValue(null)
|
|
124
|
-
});
|
|
125
|
-
const ability = {
|
|
126
|
-
name: "test/client-ability",
|
|
127
|
-
label: "Client Ability",
|
|
128
|
-
description: "Test client ability",
|
|
129
|
-
category: "test-category",
|
|
130
|
-
input_schema: { type: "object" },
|
|
131
|
-
output_schema: { type: "object" },
|
|
132
|
-
callback: jest.fn()
|
|
133
|
-
};
|
|
134
|
-
registerAbility(ability);
|
|
135
|
-
expect(dispatch).toHaveBeenCalledWith(store);
|
|
136
|
-
expect(mockRegisterAbility).toHaveBeenCalledWith(ability);
|
|
137
|
-
});
|
|
138
|
-
});
|
|
139
|
-
describe("unregisterAbility", () => {
|
|
140
|
-
it("should unregister an ability", () => {
|
|
141
|
-
const mockUnregisterAbility = jest.fn();
|
|
142
|
-
dispatch.mockReturnValue({
|
|
143
|
-
unregisterAbility: mockUnregisterAbility
|
|
144
|
-
});
|
|
145
|
-
unregisterAbility("test/ability");
|
|
146
|
-
expect(dispatch).toHaveBeenCalledWith(store);
|
|
147
|
-
expect(mockUnregisterAbility).toHaveBeenCalledWith(
|
|
148
|
-
"test/ability"
|
|
149
|
-
);
|
|
150
|
-
});
|
|
151
|
-
});
|
|
152
|
-
describe("executeAbility", () => {
|
|
153
|
-
it("should execute a server-side ability via API", async () => {
|
|
154
|
-
const mockAbility = {
|
|
155
|
-
name: "test/server-ability",
|
|
156
|
-
label: "Server Ability",
|
|
157
|
-
description: "Test server ability",
|
|
158
|
-
category: "test-category",
|
|
159
|
-
input_schema: {
|
|
160
|
-
type: "object",
|
|
161
|
-
properties: {
|
|
162
|
-
message: { type: "string" }
|
|
163
|
-
},
|
|
164
|
-
required: ["message"]
|
|
165
|
-
},
|
|
166
|
-
output_schema: { type: "object" }
|
|
167
|
-
};
|
|
168
|
-
const mockGetAbility = jest.fn().mockResolvedValue(mockAbility);
|
|
169
|
-
resolveSelect.mockReturnValue({
|
|
170
|
-
getAbility: mockGetAbility
|
|
171
|
-
});
|
|
172
|
-
const mockResponse = { success: true, result: "test" };
|
|
173
|
-
apiFetch.mockResolvedValue(
|
|
174
|
-
mockResponse
|
|
175
|
-
);
|
|
176
|
-
const input = { message: "Hello" };
|
|
177
|
-
const result = await executeAbility("test/server-ability", input);
|
|
178
|
-
expect(mockGetAbility).toHaveBeenCalledWith(
|
|
179
|
-
"test/server-ability"
|
|
180
|
-
);
|
|
181
|
-
expect(apiFetch).toHaveBeenCalledWith({
|
|
182
|
-
path: "/wp-abilities/v1/abilities/test/server-ability/run",
|
|
183
|
-
method: "POST",
|
|
184
|
-
data: { input }
|
|
185
|
-
});
|
|
186
|
-
expect(result).toEqual(mockResponse);
|
|
187
|
-
});
|
|
188
|
-
it("should execute a client-side ability locally", async () => {
|
|
189
|
-
const mockCallback = jest.fn().mockResolvedValue({ success: true });
|
|
190
|
-
const mockAbility = {
|
|
191
|
-
name: "test/client-ability",
|
|
192
|
-
label: "Client Ability",
|
|
193
|
-
description: "Test client ability",
|
|
194
|
-
category: "test-category",
|
|
195
|
-
input_schema: { type: "object" },
|
|
196
|
-
output_schema: { type: "object" },
|
|
197
|
-
callback: mockCallback
|
|
198
|
-
};
|
|
199
|
-
const mockGetAbility = jest.fn().mockResolvedValue(mockAbility);
|
|
200
|
-
resolveSelect.mockReturnValue({
|
|
201
|
-
getAbility: mockGetAbility
|
|
202
|
-
});
|
|
203
|
-
const input = { test: "data" };
|
|
204
|
-
const result = await executeAbility("test/client-ability", input);
|
|
205
|
-
expect(mockGetAbility).toHaveBeenCalledWith(
|
|
206
|
-
"test/client-ability"
|
|
207
|
-
);
|
|
208
|
-
expect(mockCallback).toHaveBeenCalledWith(input);
|
|
209
|
-
expect(apiFetch).not.toHaveBeenCalled();
|
|
210
|
-
expect(result).toEqual({ success: true });
|
|
211
|
-
});
|
|
212
|
-
it("should throw error if ability not found", async () => {
|
|
213
|
-
const mockGetAbility = jest.fn().mockResolvedValue(null);
|
|
214
|
-
resolveSelect.mockReturnValue({
|
|
215
|
-
getAbility: mockGetAbility
|
|
216
|
-
});
|
|
217
|
-
await expect(
|
|
218
|
-
executeAbility("non-existent", {})
|
|
219
|
-
).rejects.toThrow("Ability not found: non-existent");
|
|
220
|
-
});
|
|
221
|
-
it("should validate input for client abilities", async () => {
|
|
222
|
-
const mockCallback = jest.fn();
|
|
223
|
-
const mockAbility = {
|
|
224
|
-
name: "test/client-ability",
|
|
225
|
-
label: "Client Ability",
|
|
226
|
-
description: "Test client ability",
|
|
227
|
-
category: "test-category",
|
|
228
|
-
input_schema: {
|
|
229
|
-
type: "object",
|
|
230
|
-
properties: {
|
|
231
|
-
message: { type: "string" }
|
|
232
|
-
},
|
|
233
|
-
required: ["message"]
|
|
234
|
-
},
|
|
235
|
-
output_schema: { type: "object" },
|
|
236
|
-
callback: mockCallback
|
|
237
|
-
};
|
|
238
|
-
const mockGetAbility = jest.fn().mockResolvedValue(mockAbility);
|
|
239
|
-
resolveSelect.mockReturnValue({
|
|
240
|
-
getAbility: mockGetAbility
|
|
241
|
-
});
|
|
242
|
-
await expect(
|
|
243
|
-
executeAbility("test/client-ability", {})
|
|
244
|
-
).rejects.toThrow("invalid input");
|
|
245
|
-
});
|
|
246
|
-
it("should execute a read-only ability via GET", async () => {
|
|
247
|
-
const mockAbility = {
|
|
248
|
-
name: "test/read-only",
|
|
249
|
-
label: "Read-only Ability",
|
|
250
|
-
description: "Test read-only ability.",
|
|
251
|
-
category: "test-category",
|
|
252
|
-
input_schema: {
|
|
253
|
-
type: "object",
|
|
254
|
-
properties: {
|
|
255
|
-
id: { type: "string" },
|
|
256
|
-
format: { type: "string" }
|
|
257
|
-
}
|
|
258
|
-
},
|
|
259
|
-
output_schema: { type: "object" },
|
|
260
|
-
meta: {
|
|
261
|
-
annotations: { readonly: true }
|
|
262
|
-
}
|
|
263
|
-
};
|
|
264
|
-
const mockGetAbility = jest.fn().mockResolvedValue(mockAbility);
|
|
265
|
-
resolveSelect.mockReturnValue({
|
|
266
|
-
getAbility: mockGetAbility
|
|
267
|
-
});
|
|
268
|
-
const mockResponse = { data: "read-only data" };
|
|
269
|
-
apiFetch.mockResolvedValue(
|
|
270
|
-
mockResponse
|
|
271
|
-
);
|
|
272
|
-
const input = { id: "123", format: "json" };
|
|
273
|
-
const result = await executeAbility("test/read-only", input);
|
|
274
|
-
expect(apiFetch).toHaveBeenCalledWith({
|
|
275
|
-
path: "/wp-abilities/v1/abilities/test/read-only/run?input%5Bid%5D=123&input%5Bformat%5D=json",
|
|
276
|
-
method: "GET"
|
|
277
|
-
});
|
|
278
|
-
expect(result).toEqual(mockResponse);
|
|
279
|
-
});
|
|
280
|
-
it("should execute a read-only ability with empty input", async () => {
|
|
281
|
-
const mockAbility = {
|
|
282
|
-
name: "test/read-only",
|
|
283
|
-
label: "Read-only Ability",
|
|
284
|
-
description: "Test read-only ability.",
|
|
285
|
-
category: "test-category",
|
|
286
|
-
input_schema: { type: "object" },
|
|
287
|
-
output_schema: { type: "object" },
|
|
288
|
-
meta: {
|
|
289
|
-
annotations: { readonly: true }
|
|
290
|
-
}
|
|
291
|
-
};
|
|
292
|
-
const mockGetAbility = jest.fn().mockResolvedValue(mockAbility);
|
|
293
|
-
resolveSelect.mockReturnValue({
|
|
294
|
-
getAbility: mockGetAbility
|
|
295
|
-
});
|
|
296
|
-
const mockResponse = { data: "read-only data" };
|
|
297
|
-
apiFetch.mockResolvedValue(
|
|
298
|
-
mockResponse
|
|
299
|
-
);
|
|
300
|
-
const result = await executeAbility("test/read-only", {});
|
|
301
|
-
expect(apiFetch).toHaveBeenCalledWith({
|
|
302
|
-
path: "/wp-abilities/v1/abilities/test/read-only/run?",
|
|
303
|
-
method: "GET"
|
|
304
|
-
});
|
|
305
|
-
expect(result).toEqual(mockResponse);
|
|
306
|
-
});
|
|
307
|
-
it("should execute a destructive idempotent ability via DELETE", async () => {
|
|
308
|
-
const mockAbility = {
|
|
309
|
-
name: "test/destructive",
|
|
310
|
-
label: "Destructive Ability",
|
|
311
|
-
description: "Test destructive idempotent ability.",
|
|
312
|
-
category: "test-category",
|
|
313
|
-
input_schema: {
|
|
314
|
-
type: "object",
|
|
315
|
-
properties: {
|
|
316
|
-
id: { type: "string" },
|
|
317
|
-
format: { type: "string" }
|
|
318
|
-
}
|
|
319
|
-
},
|
|
320
|
-
output_schema: { type: "string" },
|
|
321
|
-
meta: {
|
|
322
|
-
annotations: {
|
|
323
|
-
destructive: true,
|
|
324
|
-
idempotent: true
|
|
325
|
-
}
|
|
326
|
-
}
|
|
327
|
-
};
|
|
328
|
-
const mockGetAbility = jest.fn().mockResolvedValue(mockAbility);
|
|
329
|
-
resolveSelect.mockReturnValue({
|
|
330
|
-
getAbility: mockGetAbility
|
|
331
|
-
});
|
|
332
|
-
const mockResponse = "Item deleted successfully.";
|
|
333
|
-
apiFetch.mockResolvedValue(
|
|
334
|
-
mockResponse
|
|
335
|
-
);
|
|
336
|
-
const input = { id: "123", format: "json" };
|
|
337
|
-
const result = await executeAbility("test/destructive", input);
|
|
338
|
-
expect(apiFetch).toHaveBeenCalledWith({
|
|
339
|
-
path: "/wp-abilities/v1/abilities/test/destructive/run?input%5Bid%5D=123&input%5Bformat%5D=json",
|
|
340
|
-
method: "DELETE"
|
|
341
|
-
});
|
|
342
|
-
expect(result).toEqual(mockResponse);
|
|
343
|
-
});
|
|
344
|
-
it("should handle errors in client ability execution", async () => {
|
|
345
|
-
const consoleErrorSpy = jest.spyOn(console, "error").mockImplementation();
|
|
346
|
-
const executionError = new Error("Execution failed");
|
|
347
|
-
const mockCallback = jest.fn().mockRejectedValue(executionError);
|
|
348
|
-
const mockAbility = {
|
|
349
|
-
name: "test/client-ability",
|
|
350
|
-
label: "Client Ability",
|
|
351
|
-
description: "Test client ability",
|
|
352
|
-
category: "test-category",
|
|
353
|
-
input_schema: { type: "object" },
|
|
354
|
-
output_schema: { type: "object" },
|
|
355
|
-
callback: mockCallback
|
|
356
|
-
};
|
|
357
|
-
const mockGetAbility = jest.fn().mockResolvedValue(mockAbility);
|
|
358
|
-
resolveSelect.mockReturnValue({
|
|
359
|
-
getAbility: mockGetAbility
|
|
360
|
-
});
|
|
361
|
-
await expect(
|
|
362
|
-
executeAbility("test/client-ability", {})
|
|
363
|
-
).rejects.toThrow("Execution failed");
|
|
364
|
-
expect(consoleErrorSpy).toHaveBeenCalledWith(
|
|
365
|
-
"Error executing client ability test/client-ability:",
|
|
366
|
-
executionError
|
|
367
|
-
);
|
|
368
|
-
consoleErrorSpy.mockRestore();
|
|
369
|
-
});
|
|
370
|
-
it("should handle errors in server ability execution", async () => {
|
|
371
|
-
const consoleErrorSpy = jest.spyOn(console, "error").mockImplementation();
|
|
372
|
-
const apiError = new Error("API request failed");
|
|
373
|
-
const mockAbility = {
|
|
374
|
-
name: "test/server-ability",
|
|
375
|
-
label: "Server Ability",
|
|
376
|
-
description: "Test server ability",
|
|
377
|
-
category: "test-category",
|
|
378
|
-
input_schema: { type: "object" },
|
|
379
|
-
output_schema: { type: "object" }
|
|
380
|
-
};
|
|
381
|
-
const mockGetAbility = jest.fn().mockResolvedValue(mockAbility);
|
|
382
|
-
resolveSelect.mockReturnValue({
|
|
383
|
-
getAbility: mockGetAbility
|
|
384
|
-
});
|
|
385
|
-
apiFetch.mockRejectedValue(apiError);
|
|
386
|
-
await expect(
|
|
387
|
-
executeAbility("test/server-ability", {})
|
|
388
|
-
).rejects.toThrow("API request failed");
|
|
389
|
-
expect(consoleErrorSpy).toHaveBeenCalledWith(
|
|
390
|
-
"Error executing ability test/server-ability:",
|
|
391
|
-
apiError
|
|
392
|
-
);
|
|
393
|
-
consoleErrorSpy.mockRestore();
|
|
394
|
-
});
|
|
395
|
-
it("should execute ability without callback as server ability", async () => {
|
|
396
|
-
const mockAbility = {
|
|
397
|
-
name: "test/ability",
|
|
398
|
-
label: "Test Ability",
|
|
399
|
-
description: "Test ability without callback",
|
|
400
|
-
category: "test-category",
|
|
401
|
-
input_schema: { type: "object" },
|
|
402
|
-
output_schema: { type: "object" }
|
|
403
|
-
// No callback - should execute as server ability
|
|
404
|
-
};
|
|
405
|
-
const mockGetAbility = jest.fn().mockResolvedValue(mockAbility);
|
|
406
|
-
resolveSelect.mockReturnValue({
|
|
407
|
-
getAbility: mockGetAbility
|
|
408
|
-
});
|
|
409
|
-
const mockResponse = { success: true };
|
|
410
|
-
apiFetch.mockResolvedValue(
|
|
411
|
-
mockResponse
|
|
412
|
-
);
|
|
413
|
-
const result = await executeAbility("test/ability", {
|
|
414
|
-
data: "test"
|
|
415
|
-
});
|
|
416
|
-
expect(apiFetch).toHaveBeenCalledWith({
|
|
417
|
-
path: "/wp-abilities/v1/abilities/test/ability/run",
|
|
418
|
-
method: "POST",
|
|
419
|
-
data: { input: { data: "test" } }
|
|
420
|
-
});
|
|
421
|
-
expect(result).toEqual(mockResponse);
|
|
422
|
-
});
|
|
423
|
-
it("should validate output for client abilities", async () => {
|
|
424
|
-
const mockCallback = jest.fn().mockResolvedValue({ invalid: "response" });
|
|
425
|
-
const mockAbility = {
|
|
426
|
-
name: "test/client-ability",
|
|
427
|
-
label: "Client Ability",
|
|
428
|
-
description: "Test client ability",
|
|
429
|
-
category: "test-category",
|
|
430
|
-
input_schema: { type: "object" },
|
|
431
|
-
output_schema: {
|
|
432
|
-
type: "object",
|
|
433
|
-
properties: {
|
|
434
|
-
result: { type: "string" }
|
|
435
|
-
},
|
|
436
|
-
required: ["result"]
|
|
437
|
-
},
|
|
438
|
-
callback: mockCallback
|
|
439
|
-
};
|
|
440
|
-
const mockGetAbility = jest.fn().mockResolvedValue(mockAbility);
|
|
441
|
-
resolveSelect.mockReturnValue({
|
|
442
|
-
getAbility: mockGetAbility
|
|
443
|
-
});
|
|
444
|
-
await expect(
|
|
445
|
-
executeAbility("test/client-ability", {})
|
|
446
|
-
).rejects.toThrow("invalid output");
|
|
447
|
-
});
|
|
448
|
-
});
|
|
449
|
-
describe("getAbilityCategories", () => {
|
|
450
|
-
it("should resolve and return all categories from the store", async () => {
|
|
451
|
-
const mockCategories = [
|
|
452
|
-
{
|
|
453
|
-
slug: "data-retrieval",
|
|
454
|
-
label: "Data Retrieval",
|
|
455
|
-
description: "Abilities that retrieve data"
|
|
456
|
-
},
|
|
457
|
-
{
|
|
458
|
-
slug: "user-management",
|
|
459
|
-
label: "User Management",
|
|
460
|
-
description: "Abilities for managing users"
|
|
461
|
-
}
|
|
462
|
-
];
|
|
463
|
-
const mockGetAbilityCategories = jest.fn().mockResolvedValue(mockCategories);
|
|
464
|
-
resolveSelect.mockReturnValue({
|
|
465
|
-
getAbilityCategories: mockGetAbilityCategories
|
|
466
|
-
});
|
|
467
|
-
const result = await getAbilityCategories();
|
|
468
|
-
expect(resolveSelect).toHaveBeenCalledWith(store);
|
|
469
|
-
expect(mockGetAbilityCategories).toHaveBeenCalled();
|
|
470
|
-
expect(result).toEqual(mockCategories);
|
|
471
|
-
});
|
|
472
|
-
it("should return empty array when no categories exist", async () => {
|
|
473
|
-
const mockGetAbilityCategories = jest.fn().mockResolvedValue([]);
|
|
474
|
-
resolveSelect.mockReturnValue({
|
|
475
|
-
getAbilityCategories: mockGetAbilityCategories
|
|
476
|
-
});
|
|
477
|
-
const result = await getAbilityCategories();
|
|
478
|
-
expect(result).toEqual([]);
|
|
479
|
-
});
|
|
480
|
-
});
|
|
481
|
-
describe("getAbilityCategory", () => {
|
|
482
|
-
it("should return a specific category by slug", async () => {
|
|
483
|
-
const mockCategory = {
|
|
484
|
-
slug: "data-retrieval",
|
|
485
|
-
label: "Data Retrieval",
|
|
486
|
-
description: "Abilities that retrieve data"
|
|
487
|
-
};
|
|
488
|
-
const mockGetAbilityCategory = jest.fn().mockResolvedValue(mockCategory);
|
|
489
|
-
resolveSelect.mockReturnValue({
|
|
490
|
-
getAbilityCategory: mockGetAbilityCategory
|
|
491
|
-
});
|
|
492
|
-
const result = await getAbilityCategory("data-retrieval");
|
|
493
|
-
expect(resolveSelect).toHaveBeenCalledWith(store);
|
|
494
|
-
expect(mockGetAbilityCategory).toHaveBeenCalledWith(
|
|
495
|
-
"data-retrieval"
|
|
496
|
-
);
|
|
497
|
-
expect(result).toEqual(mockCategory);
|
|
498
|
-
});
|
|
499
|
-
it("should return null if category not found", async () => {
|
|
500
|
-
const mockGetAbilityCategory = jest.fn().mockResolvedValue(null);
|
|
501
|
-
resolveSelect.mockReturnValue({
|
|
502
|
-
getAbilityCategory: mockGetAbilityCategory
|
|
503
|
-
});
|
|
504
|
-
const result = await getAbilityCategory("non-existent");
|
|
505
|
-
expect(mockGetAbilityCategory).toHaveBeenCalledWith(
|
|
506
|
-
"non-existent"
|
|
507
|
-
);
|
|
508
|
-
expect(result).toBeNull();
|
|
509
|
-
});
|
|
510
|
-
it("should handle categories with meta", async () => {
|
|
511
|
-
const mockCategory = {
|
|
512
|
-
slug: "user-management",
|
|
513
|
-
label: "User Management",
|
|
514
|
-
description: "Abilities for managing users",
|
|
515
|
-
meta: {
|
|
516
|
-
priority: "high"
|
|
517
|
-
}
|
|
518
|
-
};
|
|
519
|
-
const mockGetAbilityCategory = jest.fn().mockResolvedValue(mockCategory);
|
|
520
|
-
resolveSelect.mockReturnValue({
|
|
521
|
-
getAbilityCategory: mockGetAbilityCategory
|
|
522
|
-
});
|
|
523
|
-
const result = await getAbilityCategory("user-management");
|
|
524
|
-
expect(result).toEqual(mockCategory);
|
|
525
|
-
expect(result?.meta).toBeDefined();
|
|
526
|
-
expect(result?.meta?.priority).toBe("high");
|
|
527
|
-
});
|
|
528
|
-
});
|
|
529
|
-
});
|
|
530
|
-
//# 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,SAAS,UAAU,QAAQ,qBAAqB;AAChD,OAAO,cAAc;AAKrB;AAAA,EACC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACM;AACP,SAAS,aAAa;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,cAA6B,gBAAiB;AAAA,QAC/C,cAAc;AAAA,MACf,CAAE;AAEF,YAAM,SAAS,MAAM,aAAa;AAElC,aAAQ,aAAc,EAAE,qBAAsB,KAAM;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,cAA6B,gBAAiB;AAAA,QAC/C,cAAc;AAAA,MACf,CAAE;AAEF,YAAM,SAAS,MAAM,aAAc,EAAE,UAAU,iBAAiB,CAAE;AAElE,aAAQ,aAAc,EAAE,qBAAsB,KAAM;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,cAA6B,gBAAiB;AAAA,QAC/C,YAAY;AAAA,MACb,CAAE;AAEF,YAAM,SAAS,MAAM,WAAY,cAAe;AAEhD,aAAQ,aAAc,EAAE,qBAAsB,KAAM;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,cAA6B,gBAAiB;AAAA,QAC/C,YAAY;AAAA,MACb,CAAE;AAEF,YAAM,SAAS,MAAM,WAAY,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,SAAwB,gBAAiB;AAAA,QAC1C,iBAAiB;AAAA,MAClB,CAAE;AAGF,MAAE,OAAsB,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,sBAAiB,OAAQ;AAEzB,aAAQ,QAAS,EAAE,qBAAsB,KAAM;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,SAAwB,gBAAiB;AAAA,QAC1C,mBAAmB;AAAA,MACpB,CAAE;AAEF,wBAAmB,cAAe;AAElC,aAAQ,QAAS,EAAE,qBAAsB,KAAM;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,cAA6B,gBAAiB;AAAA,QAC/C,YAAY;AAAA,MACb,CAAE;AAEF,YAAM,eAAe,EAAE,SAAS,MAAM,QAAQ,OAAO;AACrD,MAAE,SAAmC;AAAA,QACpC;AAAA,MACD;AAEA,YAAM,QAAQ,EAAE,SAAS,QAAQ;AACjC,YAAM,SAAS,MAAM,eAAgB,uBAAuB,KAAM;AAElE,aAAQ,cAAe,EAAE;AAAA,QACxB;AAAA,MACD;AACA,aAAQ,QAAS,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,cAA6B,gBAAiB;AAAA,QAC/C,YAAY;AAAA,MACb,CAAE;AAEF,YAAM,QAAQ,EAAE,MAAM,OAAO;AAC7B,YAAM,SAAS,MAAM,eAAgB,uBAAuB,KAAM;AAElE,aAAQ,cAAe,EAAE;AAAA,QACxB;AAAA,MACD;AACA,aAAQ,YAAa,EAAE,qBAAsB,KAAM;AACnD,aAAQ,QAAS,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,cAA6B,gBAAiB;AAAA,QAC/C,YAAY;AAAA,MACb,CAAE;AAEF,YAAM;AAAA,QACL,eAAgB,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,cAA6B,gBAAiB;AAAA,QAC/C,YAAY;AAAA,MACb,CAAE;AAEF,YAAM;AAAA,QACL,eAAgB,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,cAA6B,gBAAiB;AAAA,QAC/C,YAAY;AAAA,MACb,CAAE;AAEF,YAAM,eAAe,EAAE,MAAM,iBAAiB;AAC9C,MAAE,SAAmC;AAAA,QACpC;AAAA,MACD;AAEA,YAAM,QAAQ,EAAE,IAAI,OAAO,QAAQ,OAAO;AAC1C,YAAM,SAAS,MAAM,eAAgB,kBAAkB,KAAM;AAE7D,aAAQ,QAAS,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,cAA6B,gBAAiB;AAAA,QAC/C,YAAY;AAAA,MACb,CAAE;AAEF,YAAM,eAAe,EAAE,MAAM,iBAAiB;AAC9C,MAAE,SAAmC;AAAA,QACpC;AAAA,MACD;AAEA,YAAM,SAAS,MAAM,eAAgB,kBAAkB,CAAC,CAAE;AAE1D,aAAQ,QAAS,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,cAA6B,gBAAiB;AAAA,QAC/C,YAAY;AAAA,MACb,CAAE;AAEF,YAAM,eAAe;AACrB,MAAE,SAAmC;AAAA,QACpC;AAAA,MACD;AAEA,YAAM,QAAQ,EAAE,IAAI,OAAO,QAAQ,OAAO;AAC1C,YAAM,SAAS,MAAM,eAAgB,oBAAoB,KAAM;AAE/D,aAAQ,QAAS,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,cAA6B,gBAAiB;AAAA,QAC/C,YAAY;AAAA,MACb,CAAE;AAEF,YAAM;AAAA,QACL,eAAgB,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,cAA6B,gBAAiB;AAAA,QAC/C,YAAY;AAAA,MACb,CAAE;AAEF,MAAE,SAAmC,kBAAmB,QAAS;AAEjE,YAAM;AAAA,QACL,eAAgB,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,cAA6B,gBAAiB;AAAA,QAC/C,YAAY;AAAA,MACb,CAAE;AAEF,YAAM,eAAe,EAAE,SAAS,KAAK;AACrC,MAAE,SAAmC;AAAA,QACpC;AAAA,MACD;AAEA,YAAM,SAAS,MAAM,eAAgB,gBAAgB;AAAA,QACpD,MAAM;AAAA,MACP,CAAE;AAEF,aAAQ,QAAS,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,cAA6B,gBAAiB;AAAA,QAC/C,YAAY;AAAA,MACb,CAAE;AAEF,YAAM;AAAA,QACL,eAAgB,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,cAA6B,gBAAiB;AAAA,QAC/C,sBAAsB;AAAA,MACvB,CAAE;AAEF,YAAM,SAAS,MAAM,qBAAqB;AAE1C,aAAQ,aAAc,EAAE,qBAAsB,KAAM;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,cAA6B,gBAAiB;AAAA,QAC/C,sBAAsB;AAAA,MACvB,CAAE;AAEF,YAAM,SAAS,MAAM,qBAAqB;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,cAA6B,gBAAiB;AAAA,QAC/C,oBAAoB;AAAA,MACrB,CAAE;AAEF,YAAM,SAAS,MAAM,mBAAoB,gBAAiB;AAE1D,aAAQ,aAAc,EAAE,qBAAsB,KAAM;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,cAA6B,gBAAiB;AAAA,QAC/C,oBAAoB;AAAA,MACrB,CAAE;AAEF,YAAM,SAAS,MAAM,mBAAoB,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,cAA6B,gBAAiB;AAAA,QAC/C,oBAAoB;AAAA,MACrB,CAAE;AAEF,YAAM,SAAS,MAAM,mBAAoB,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": []
|
|
7
|
-
}
|