@pc-nexus/manifest 0.8.0-next.11

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.
@@ -0,0 +1,3664 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2019-09/schema",
3
+ "type": "object",
4
+ "required": ["app", "permissions"],
5
+ "properties": {
6
+ "app": {
7
+ "type": "object",
8
+ "required": ["id", "version"],
9
+ "properties": {
10
+ "id": {
11
+ "type": "string",
12
+ "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$",
13
+ "examples": ["123e4567-e89b-12d3-a456-426614174000"]
14
+ },
15
+ "version": { "type": "string", "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)$" },
16
+ "name": { "type": "string", "minLength": 1, "maxLength": 64 },
17
+ "publisher": {
18
+ "type": "object",
19
+ "properties": {
20
+ "name": { "type": "string", "minLength": 1, "maxLength": 64 },
21
+ "site": { "type": "string", "pattern": "^https?:\\/\\/[^\\/\\s]+(?:\\/[^\\s?#]*)?$", "maxLength": 2048 },
22
+ "phone": { "type": "string", "pattern": "^\\+?[0-9][0-9\\s\\-().]{0,30}[0-9]$", "maxLength": 32 },
23
+ "email": { "type": "string", "pattern": "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$", "maxLength": 256 }
24
+ },
25
+ "additionalProperties": false
26
+ },
27
+ "description": { "type": "string", "maxLength": 1024 },
28
+ "avatar": { "type": "string" },
29
+ "links": {
30
+ "type": "array",
31
+ "items": {
32
+ "type": "object",
33
+ "properties": {
34
+ "title": { "type": "string" },
35
+ "url": { "type": "string", "pattern": "^https?:\\/\\/[^\\/\\s]+(?:\\/[^\\s?#]*)?$", "maxLength": 2048 }
36
+ },
37
+ "additionalProperties": false
38
+ },
39
+ "maxItems": 8
40
+ },
41
+ "licensing": {
42
+ "type": "object",
43
+ "required": ["enabled"],
44
+ "properties": { "enabled": { "type": "boolean" } },
45
+ "additionalProperties": false
46
+ }
47
+ },
48
+ "additionalProperties": false
49
+ },
50
+ "permissions": {
51
+ "type": "object",
52
+ "required": ["scopes"],
53
+ "properties": {
54
+ "scopes": { "type": "array", "items": { "type": "string" } },
55
+ "external": {
56
+ "type": "object",
57
+ "properties": {
58
+ "fetch": {
59
+ "type": "object",
60
+ "properties": {
61
+ "backend": {
62
+ "type": "array",
63
+ "items": {
64
+ "anyOf": [
65
+ { "type": "string", "domainFormat": true, "maxLength": 2048 },
66
+ {
67
+ "type": "object",
68
+ "required": ["address"],
69
+ "properties": { "address": { "type": "string", "domainFormat": true, "maxLength": 2048 } },
70
+ "additionalProperties": false
71
+ },
72
+ {
73
+ "type": "object",
74
+ "required": ["remote"],
75
+ "properties": { "remote": { "type": "string", "mustBeInField": { "fieldName": "remotes", "path": "key" } } },
76
+ "additionalProperties": false
77
+ }
78
+ ]
79
+ }
80
+ },
81
+ "client": {
82
+ "type": "array",
83
+ "items": {
84
+ "anyOf": [
85
+ { "type": "string", "domainFormat": true, "maxLength": 2048 },
86
+ {
87
+ "type": "object",
88
+ "required": ["address"],
89
+ "properties": { "address": { "type": "string", "domainFormat": true, "maxLength": 2048 } },
90
+ "additionalProperties": false
91
+ },
92
+ {
93
+ "type": "object",
94
+ "required": ["remote"],
95
+ "properties": { "remote": { "type": "string", "mustBeInField": { "fieldName": "remotes", "path": "key" } } },
96
+ "additionalProperties": false
97
+ }
98
+ ]
99
+ }
100
+ }
101
+ },
102
+ "additionalProperties": false
103
+ },
104
+ "fonts": {
105
+ "type": "array",
106
+ "items": {
107
+ "anyOf": [
108
+ { "type": "string", "domainFormat": true, "maxLength": 2048 },
109
+ {
110
+ "type": "object",
111
+ "required": ["address"],
112
+ "properties": { "address": { "type": "string", "domainFormat": true, "maxLength": 2048 } },
113
+ "additionalProperties": false
114
+ }
115
+ ]
116
+ }
117
+ },
118
+ "styles": {
119
+ "type": "array",
120
+ "items": {
121
+ "anyOf": [
122
+ { "type": "string", "domainFormat": true, "maxLength": 2048 },
123
+ {
124
+ "type": "object",
125
+ "required": ["address"],
126
+ "properties": { "address": { "type": "string", "domainFormat": true, "maxLength": 2048 } },
127
+ "additionalProperties": false
128
+ }
129
+ ]
130
+ }
131
+ },
132
+ "frames": {
133
+ "type": "array",
134
+ "items": {
135
+ "anyOf": [
136
+ { "type": "string", "domainFormat": true, "maxLength": 2048 },
137
+ {
138
+ "type": "object",
139
+ "required": ["address"],
140
+ "properties": { "address": { "type": "string", "domainFormat": true, "maxLength": 2048 } },
141
+ "additionalProperties": false
142
+ }
143
+ ]
144
+ }
145
+ },
146
+ "images": {
147
+ "type": "array",
148
+ "items": {
149
+ "anyOf": [
150
+ { "type": "string", "domainFormat": true, "maxLength": 2048 },
151
+ {
152
+ "type": "object",
153
+ "required": ["address"],
154
+ "properties": { "address": { "type": "string", "domainFormat": true, "maxLength": 2048 } },
155
+ "additionalProperties": false
156
+ }
157
+ ]
158
+ }
159
+ },
160
+ "media": {
161
+ "type": "array",
162
+ "items": {
163
+ "anyOf": [
164
+ { "type": "string", "domainFormat": true, "maxLength": 2048 },
165
+ {
166
+ "type": "object",
167
+ "required": ["address"],
168
+ "properties": { "address": { "type": "string", "domainFormat": true, "maxLength": 2048 } },
169
+ "additionalProperties": false
170
+ }
171
+ ]
172
+ }
173
+ },
174
+ "scripts": {
175
+ "type": "array",
176
+ "items": {
177
+ "anyOf": [
178
+ { "type": "string", "domainFormat": true, "maxLength": 2048 },
179
+ {
180
+ "type": "object",
181
+ "required": ["address"],
182
+ "properties": { "address": { "type": "string", "domainFormat": true, "maxLength": 2048 } },
183
+ "additionalProperties": false
184
+ }
185
+ ]
186
+ }
187
+ }
188
+ },
189
+ "additionalProperties": false
190
+ },
191
+ "content": {
192
+ "type": "object",
193
+ "properties": {
194
+ "scripts": {
195
+ "type": "array",
196
+ "items": {
197
+ "type": "string",
198
+ "pattern": "^(unsafe-inline|unsafe-hashes|unsafe-eval|blob:|sha256-[A-Za-z0-9+/]+=*|sha384-[A-Za-z0-9+/]+=*|sha512-[A-Za-z0-9+/]+=*)$"
199
+ }
200
+ },
201
+ "styles": { "type": "array", "items": { "type": "string", "const": "unsafe-inline" } }
202
+ },
203
+ "additionalProperties": false
204
+ }
205
+ },
206
+ "additionalProperties": false
207
+ },
208
+ "extensions": {
209
+ "type": "array",
210
+ "items": {
211
+ "anyOf": [
212
+ {
213
+ "type": "object",
214
+ "required": ["key", "title", "target"],
215
+ "properties": {
216
+ "key": { "type": "string" },
217
+ "title": {
218
+ "anyOf": [
219
+ { "type": "string", "maxLength": 256 },
220
+ { "type": "object", "required": ["i18n"], "properties": { "i18n": { "type": "string", "maxLength": 256 } } }
221
+ ]
222
+ },
223
+ "target": { "type": "string", "const": "pcm:global:app:hub" },
224
+ "resource": { "type": "string", "mustBeInField": { "fieldName": "resources", "path": "key" } },
225
+ "resolver": {
226
+ "anyOf": [
227
+ {
228
+ "type": "object",
229
+ "required": ["function"],
230
+ "properties": { "function": { "type": "string", "mustBeInField": { "fieldName": "functions", "path": "key" } } },
231
+ "additionalProperties": false
232
+ },
233
+ {
234
+ "type": "object",
235
+ "required": ["endpoint"],
236
+ "properties": { "endpoint": { "type": "string", "mustBeInField": { "fieldName": "endpoints", "path": "key" } } },
237
+ "additionalProperties": false
238
+ }
239
+ ]
240
+ },
241
+ "display": { "$ref": "ExtensionDisplayConditionsSchemaId" },
242
+ "icon": {
243
+ "anyOf": [
244
+ {
245
+ "type": "string",
246
+ "pattern": "^resource:[a-zA-Z0-9_-]+/.+",
247
+ "mustBeInField": { "fieldName": "resources", "path": "key", "extractPattern": {} }
248
+ },
249
+ { "type": "string", "pattern": "^icons/[a-zA-Z0-9_-]+(?::(#?[a-fA-F0-9]{3,8}|rgba\\([^)]+\\)))?$" },
250
+ { "type": "string", "pattern": "^https?:\\/\\/.*" }
251
+ ],
252
+ "errorMessage": "must be one of: resource:<resource key>/<path>, icons/<icon key>[:<color>], or https://... URL"
253
+ }
254
+ },
255
+ "additionalProperties": false
256
+ },
257
+ {
258
+ "type": "object",
259
+ "required": ["key", "title", "target"],
260
+ "properties": {
261
+ "key": { "type": "string" },
262
+ "title": {
263
+ "anyOf": [
264
+ { "type": "string", "maxLength": 256 },
265
+ { "type": "object", "required": ["i18n"], "properties": { "i18n": { "type": "string", "maxLength": 256 } } }
266
+ ]
267
+ },
268
+ "target": { "type": "string", "const": "pcm:global:app:setting" },
269
+ "resource": { "type": "string", "mustBeInField": { "fieldName": "resources", "path": "key" } },
270
+ "resolver": {
271
+ "anyOf": [
272
+ {
273
+ "type": "object",
274
+ "required": ["function"],
275
+ "properties": { "function": { "type": "string", "mustBeInField": { "fieldName": "functions", "path": "key" } } },
276
+ "additionalProperties": false
277
+ },
278
+ {
279
+ "type": "object",
280
+ "required": ["endpoint"],
281
+ "properties": { "endpoint": { "type": "string", "mustBeInField": { "fieldName": "endpoints", "path": "key" } } },
282
+ "additionalProperties": false
283
+ }
284
+ ]
285
+ },
286
+ "display": { "$ref": "ExtensionDisplayConditionsSchemaId" }
287
+ },
288
+ "additionalProperties": false
289
+ },
290
+ {
291
+ "type": "object",
292
+ "required": ["key", "title", "target", "behavior", "viewport"],
293
+ "properties": {
294
+ "key": { "type": "string" },
295
+ "title": {
296
+ "anyOf": [
297
+ { "type": "string", "maxLength": 256 },
298
+ { "type": "object", "required": ["i18n"], "properties": { "i18n": { "type": "string", "maxLength": 256 } } }
299
+ ]
300
+ },
301
+ "target": { "type": "string", "const": "pcm:global:create:action" },
302
+ "resource": { "type": "string", "mustBeInField": { "fieldName": "resources", "path": "key" } },
303
+ "resolver": {
304
+ "anyOf": [
305
+ {
306
+ "type": "object",
307
+ "required": ["function"],
308
+ "properties": { "function": { "type": "string", "mustBeInField": { "fieldName": "functions", "path": "key" } } },
309
+ "additionalProperties": false
310
+ },
311
+ {
312
+ "type": "object",
313
+ "required": ["endpoint"],
314
+ "properties": { "endpoint": { "type": "string", "mustBeInField": { "fieldName": "endpoints", "path": "key" } } },
315
+ "additionalProperties": false
316
+ }
317
+ ]
318
+ },
319
+ "display": { "$ref": "ExtensionDisplayConditionsSchemaId" },
320
+ "icon": {
321
+ "anyOf": [
322
+ {
323
+ "type": "string",
324
+ "pattern": "^resource:[a-zA-Z0-9_-]+/.+",
325
+ "mustBeInField": { "fieldName": "resources", "path": "key", "extractPattern": {} }
326
+ },
327
+ { "type": "string", "pattern": "^icons/[a-zA-Z0-9_-]+(?::(#?[a-fA-F0-9]{3,8}|rgba\\([^)]+\\)))?$" },
328
+ { "type": "string", "pattern": "^https?:\\/\\/.*" }
329
+ ],
330
+ "errorMessage": "must be one of: resource:<resource key>/<path>, icons/<icon key>[:<color>], or https://... URL"
331
+ },
332
+ "behavior": { "enum": ["modal", "dynamic"] },
333
+ "viewport": {
334
+ "type": "object",
335
+ "required": ["size"],
336
+ "properties": { "size": { "enum": ["small", "medium", "large", "xlarge", "max", "fullscreen"] } }
337
+ }
338
+ },
339
+ "additionalProperties": false
340
+ },
341
+ {
342
+ "type": "object",
343
+ "required": ["key", "title", "target", "layout", "view", "edit"],
344
+ "properties": {
345
+ "key": { "type": "string" },
346
+ "title": {
347
+ "anyOf": [
348
+ { "type": "string", "maxLength": 256 },
349
+ { "type": "object", "required": ["i18n"], "properties": { "i18n": { "type": "string", "maxLength": 256 } } }
350
+ ]
351
+ },
352
+ "target": { "type": "string", "const": "pcm:global:dashboard:widget" },
353
+ "resource": { "type": "string", "mustBeInField": { "fieldName": "resources", "path": "key" } },
354
+ "resolver": {
355
+ "anyOf": [
356
+ {
357
+ "type": "object",
358
+ "required": ["function"],
359
+ "properties": { "function": { "type": "string", "mustBeInField": { "fieldName": "functions", "path": "key" } } },
360
+ "additionalProperties": false
361
+ },
362
+ {
363
+ "type": "object",
364
+ "required": ["endpoint"],
365
+ "properties": { "endpoint": { "type": "string", "mustBeInField": { "fieldName": "endpoints", "path": "key" } } },
366
+ "additionalProperties": false
367
+ }
368
+ ]
369
+ },
370
+ "display": { "$ref": "ExtensionDisplayConditionsSchemaId" },
371
+ "description": { "type": "string" },
372
+ "thumbnail": {
373
+ "anyOf": [
374
+ {
375
+ "type": "string",
376
+ "pattern": "^resource:[a-zA-Z0-9_-]+/.+",
377
+ "mustBeInField": { "fieldName": "resources", "path": "key", "extractPattern": {} }
378
+ },
379
+ { "type": "string", "pattern": "^icons/[a-zA-Z0-9_-]+(?::(#?[a-fA-F0-9]{3,8}|rgba\\([^)]+\\)))?$" },
380
+ { "type": "string", "pattern": "^https?:\\/\\/.*" }
381
+ ],
382
+ "errorMessage": "must be one of: resource:<resource key>/<path>, icons/<icon key>[:<color>], or https://... URL"
383
+ },
384
+ "layout": {
385
+ "type": "object",
386
+ "properties": {
387
+ "min": { "type": "string", "pattern": "^\\d+\\s*\\*\\s*\\d+$" },
388
+ "max": { "type": "string", "pattern": "^\\d+\\s*\\*\\s*\\d+$" },
389
+ "default": { "type": "string", "pattern": "^\\d+\\s*\\*\\s*\\d+$" }
390
+ }
391
+ },
392
+ "view": {
393
+ "type": "object",
394
+ "required": ["resource"],
395
+ "properties": { "resource": { "type": "string", "mustBeInField": { "fieldName": "resources", "path": "key" } } }
396
+ },
397
+ "edit": {
398
+ "type": "object",
399
+ "required": ["resource"],
400
+ "properties": { "resource": { "type": "string", "mustBeInField": { "fieldName": "resources", "path": "key" } } }
401
+ }
402
+ },
403
+ "additionalProperties": false
404
+ },
405
+ {
406
+ "type": "object",
407
+ "required": ["key", "target"],
408
+ "properties": {
409
+ "key": { "type": "string" },
410
+ "title": {
411
+ "anyOf": [
412
+ { "type": "string", "maxLength": 256 },
413
+ { "type": "object", "required": ["i18n"], "properties": { "i18n": { "type": "string", "maxLength": 256 } } }
414
+ ]
415
+ },
416
+ "target": { "type": "string", "const": "pcm:global:header:banner" },
417
+ "resource": { "type": "string", "mustBeInField": { "fieldName": "resources", "path": "key" } },
418
+ "resolver": {
419
+ "anyOf": [
420
+ {
421
+ "type": "object",
422
+ "required": ["function"],
423
+ "properties": { "function": { "type": "string", "mustBeInField": { "fieldName": "functions", "path": "key" } } },
424
+ "additionalProperties": false
425
+ },
426
+ {
427
+ "type": "object",
428
+ "required": ["endpoint"],
429
+ "properties": { "endpoint": { "type": "string", "mustBeInField": { "fieldName": "endpoints", "path": "key" } } },
430
+ "additionalProperties": false
431
+ }
432
+ ]
433
+ },
434
+ "display": { "$ref": "ExtensionDisplayConditionsSchemaId" },
435
+ "dismissible": { "type": "boolean" }
436
+ },
437
+ "additionalProperties": false
438
+ },
439
+ {
440
+ "type": "object",
441
+ "required": ["key", "target", "pages"],
442
+ "properties": {
443
+ "key": { "type": "string" },
444
+ "title": {
445
+ "anyOf": [
446
+ { "type": "string", "maxLength": 256 },
447
+ { "type": "object", "required": ["i18n"], "properties": { "i18n": { "type": "string", "maxLength": 256 } } }
448
+ ]
449
+ },
450
+ "target": { "type": "string", "const": "pcm:global:personal:setting" },
451
+ "resource": { "type": "string", "mustBeInField": { "fieldName": "resources", "path": "key" } },
452
+ "resolver": {
453
+ "anyOf": [
454
+ {
455
+ "type": "object",
456
+ "required": ["function"],
457
+ "properties": { "function": { "type": "string", "mustBeInField": { "fieldName": "functions", "path": "key" } } },
458
+ "additionalProperties": false
459
+ },
460
+ {
461
+ "type": "object",
462
+ "required": ["endpoint"],
463
+ "properties": { "endpoint": { "type": "string", "mustBeInField": { "fieldName": "endpoints", "path": "key" } } },
464
+ "additionalProperties": false
465
+ }
466
+ ]
467
+ },
468
+ "display": { "$ref": "ExtensionDisplayConditionsSchemaId" },
469
+ "pages": {
470
+ "type": "array",
471
+ "items": {
472
+ "type": "object",
473
+ "required": ["key", "title", "resource"],
474
+ "properties": {
475
+ "key": { "type": "string" },
476
+ "title": {
477
+ "anyOf": [
478
+ { "type": "string", "maxLength": 256 },
479
+ { "type": "object", "required": ["i18n"], "properties": { "i18n": { "type": "string", "maxLength": 256 } } }
480
+ ]
481
+ },
482
+ "resource": { "type": "string", "mustBeInField": { "fieldName": "resources", "path": "key" } },
483
+ "route": { "type": "string", "pattern": "^$|^(?!\\.{1,2}$)[a-z0-9-]{1,64}$" }
484
+ }
485
+ },
486
+ "minItems": 1,
487
+ "maxItems": 8,
488
+ "uniqueItemProperty": ["key", "route"],
489
+ "pageRouteValidate": true
490
+ },
491
+ "section": {
492
+ "type": "object",
493
+ "required": ["header", "enabled"],
494
+ "properties": {
495
+ "header": {
496
+ "anyOf": [
497
+ { "type": "string", "maxLength": 256 },
498
+ { "type": "object", "required": ["i18n"], "properties": { "i18n": { "type": "string", "maxLength": 256 } } }
499
+ ]
500
+ },
501
+ "enabled": { "type": "boolean" }
502
+ }
503
+ }
504
+ },
505
+ "additionalProperties": false
506
+ },
507
+ {
508
+ "type": "object",
509
+ "required": ["key", "title", "target"],
510
+ "properties": {
511
+ "key": { "type": "string" },
512
+ "title": {
513
+ "anyOf": [
514
+ { "type": "string", "maxLength": 256 },
515
+ { "type": "object", "required": ["i18n"], "properties": { "i18n": { "type": "string", "maxLength": 256 } } }
516
+ ]
517
+ },
518
+ "target": { "type": "string", "const": "pcm:global:workspace:page" },
519
+ "resource": { "type": "string", "mustBeInField": { "fieldName": "resources", "path": "key" } },
520
+ "resolver": {
521
+ "anyOf": [
522
+ {
523
+ "type": "object",
524
+ "required": ["function"],
525
+ "properties": { "function": { "type": "string", "mustBeInField": { "fieldName": "functions", "path": "key" } } },
526
+ "additionalProperties": false
527
+ },
528
+ {
529
+ "type": "object",
530
+ "required": ["endpoint"],
531
+ "properties": { "endpoint": { "type": "string", "mustBeInField": { "fieldName": "endpoints", "path": "key" } } },
532
+ "additionalProperties": false
533
+ }
534
+ ]
535
+ },
536
+ "display": { "$ref": "ExtensionDisplayConditionsSchemaId" },
537
+ "route": { "type": "string", "pattern": "^$|^(?!\\.{1,2}$)[a-z0-9-]{1,64}$" }
538
+ },
539
+ "additionalProperties": false
540
+ },
541
+ {
542
+ "type": "object",
543
+ "required": ["key", "title", "target", "type", "behavior"],
544
+ "properties": {
545
+ "key": { "type": "string" },
546
+ "title": {
547
+ "anyOf": [
548
+ { "type": "string", "maxLength": 256 },
549
+ { "type": "object", "required": ["i18n"], "properties": { "i18n": { "type": "string", "maxLength": 256 } } }
550
+ ]
551
+ },
552
+ "target": { "type": "string", "const": "pcm:pjm:baseline:action" },
553
+ "resource": { "type": "string", "mustBeInField": { "fieldName": "resources", "path": "key" } },
554
+ "resolver": {
555
+ "anyOf": [
556
+ {
557
+ "type": "object",
558
+ "required": ["function"],
559
+ "properties": { "function": { "type": "string", "mustBeInField": { "fieldName": "functions", "path": "key" } } },
560
+ "additionalProperties": false
561
+ },
562
+ {
563
+ "type": "object",
564
+ "required": ["endpoint"],
565
+ "properties": { "endpoint": { "type": "string", "mustBeInField": { "fieldName": "endpoints", "path": "key" } } },
566
+ "additionalProperties": false
567
+ }
568
+ ]
569
+ },
570
+ "display": { "$ref": "ExtensionDisplayConditionsSchemaId" },
571
+ "icon": {
572
+ "anyOf": [
573
+ {
574
+ "type": "string",
575
+ "pattern": "^resource:[a-zA-Z0-9_-]+/.+",
576
+ "mustBeInField": { "fieldName": "resources", "path": "key", "extractPattern": {} }
577
+ },
578
+ { "type": "string", "pattern": "^icons/[a-zA-Z0-9_-]+(?::(#?[a-fA-F0-9]{3,8}|rgba\\([^)]+\\)))?$" },
579
+ { "type": "string", "pattern": "^https?:\\/\\/.*" }
580
+ ],
581
+ "errorMessage": "must be one of: resource:<resource key>/<path>, icons/<icon key>[:<color>], or https://... URL"
582
+ },
583
+ "type": { "enum": ["normal", "danger"] },
584
+ "behavior": { "enum": ["modal", "dynamic"] },
585
+ "viewport": {
586
+ "type": "object",
587
+ "required": ["size"],
588
+ "properties": { "size": { "enum": ["small", "medium", "large", "xlarge", "max", "fullscreen"] } }
589
+ }
590
+ },
591
+ "additionalProperties": false
592
+ },
593
+ {
594
+ "type": "object",
595
+ "required": ["key", "title", "target"],
596
+ "properties": {
597
+ "key": { "type": "string" },
598
+ "title": {
599
+ "anyOf": [
600
+ { "type": "string", "maxLength": 256 },
601
+ { "type": "object", "required": ["i18n"], "properties": { "i18n": { "type": "string", "maxLength": 256 } } }
602
+ ]
603
+ },
604
+ "target": { "type": "string", "const": "pcm:pjm:baseline:page" },
605
+ "resource": { "type": "string", "mustBeInField": { "fieldName": "resources", "path": "key" } },
606
+ "resolver": {
607
+ "anyOf": [
608
+ {
609
+ "type": "object",
610
+ "required": ["function"],
611
+ "properties": { "function": { "type": "string", "mustBeInField": { "fieldName": "functions", "path": "key" } } },
612
+ "additionalProperties": false
613
+ },
614
+ {
615
+ "type": "object",
616
+ "required": ["endpoint"],
617
+ "properties": { "endpoint": { "type": "string", "mustBeInField": { "fieldName": "endpoints", "path": "key" } } },
618
+ "additionalProperties": false
619
+ }
620
+ ]
621
+ },
622
+ "display": { "$ref": "ExtensionDisplayConditionsSchemaId" },
623
+ "route": { "type": "string", "pattern": "^$|^(?!\\.{1,2}$)[a-z0-9-]{1,64}$" }
624
+ },
625
+ "additionalProperties": false
626
+ },
627
+ {
628
+ "type": "object",
629
+ "required": ["key", "title", "target", "type", "behavior"],
630
+ "properties": {
631
+ "key": { "type": "string" },
632
+ "title": {
633
+ "anyOf": [
634
+ { "type": "string", "maxLength": 256 },
635
+ { "type": "object", "required": ["i18n"], "properties": { "i18n": { "type": "string", "maxLength": 256 } } }
636
+ ]
637
+ },
638
+ "target": { "type": "string", "const": "pcm:pjm:iteration:action" },
639
+ "resource": { "type": "string", "mustBeInField": { "fieldName": "resources", "path": "key" } },
640
+ "resolver": {
641
+ "anyOf": [
642
+ {
643
+ "type": "object",
644
+ "required": ["function"],
645
+ "properties": { "function": { "type": "string", "mustBeInField": { "fieldName": "functions", "path": "key" } } },
646
+ "additionalProperties": false
647
+ },
648
+ {
649
+ "type": "object",
650
+ "required": ["endpoint"],
651
+ "properties": { "endpoint": { "type": "string", "mustBeInField": { "fieldName": "endpoints", "path": "key" } } },
652
+ "additionalProperties": false
653
+ }
654
+ ]
655
+ },
656
+ "display": { "$ref": "ExtensionDisplayConditionsSchemaId" },
657
+ "icon": {
658
+ "anyOf": [
659
+ {
660
+ "type": "string",
661
+ "pattern": "^resource:[a-zA-Z0-9_-]+/.+",
662
+ "mustBeInField": { "fieldName": "resources", "path": "key", "extractPattern": {} }
663
+ },
664
+ { "type": "string", "pattern": "^icons/[a-zA-Z0-9_-]+(?::(#?[a-fA-F0-9]{3,8}|rgba\\([^)]+\\)))?$" },
665
+ { "type": "string", "pattern": "^https?:\\/\\/.*" }
666
+ ],
667
+ "errorMessage": "must be one of: resource:<resource key>/<path>, icons/<icon key>[:<color>], or https://... URL"
668
+ },
669
+ "type": { "enum": ["normal", "danger"] },
670
+ "behavior": { "enum": ["modal", "dynamic"] },
671
+ "viewport": {
672
+ "type": "object",
673
+ "required": ["size"],
674
+ "properties": { "size": { "enum": ["small", "medium", "large", "xlarge", "max", "fullscreen"] } }
675
+ }
676
+ },
677
+ "additionalProperties": false
678
+ },
679
+ {
680
+ "type": "object",
681
+ "required": ["key", "title", "target"],
682
+ "properties": {
683
+ "key": { "type": "string" },
684
+ "title": {
685
+ "anyOf": [
686
+ { "type": "string", "maxLength": 256 },
687
+ { "type": "object", "required": ["i18n"], "properties": { "i18n": { "type": "string", "maxLength": 256 } } }
688
+ ]
689
+ },
690
+ "target": { "type": "string", "const": "pcm:pjm:iteration:page" },
691
+ "resource": { "type": "string", "mustBeInField": { "fieldName": "resources", "path": "key" } },
692
+ "resolver": {
693
+ "anyOf": [
694
+ {
695
+ "type": "object",
696
+ "required": ["function"],
697
+ "properties": { "function": { "type": "string", "mustBeInField": { "fieldName": "functions", "path": "key" } } },
698
+ "additionalProperties": false
699
+ },
700
+ {
701
+ "type": "object",
702
+ "required": ["endpoint"],
703
+ "properties": { "endpoint": { "type": "string", "mustBeInField": { "fieldName": "endpoints", "path": "key" } } },
704
+ "additionalProperties": false
705
+ }
706
+ ]
707
+ },
708
+ "display": { "$ref": "ExtensionDisplayConditionsSchemaId" },
709
+ "route": { "type": "string", "pattern": "^$|^(?!\\.{1,2}$)[a-z0-9-]{1,64}$" }
710
+ },
711
+ "additionalProperties": false
712
+ },
713
+ {
714
+ "type": "object",
715
+ "required": ["key", "target"],
716
+ "properties": {
717
+ "key": { "type": "string" },
718
+ "title": {
719
+ "anyOf": [
720
+ { "type": "string", "maxLength": 256 },
721
+ { "type": "object", "required": ["i18n"], "properties": { "i18n": { "type": "string", "maxLength": 256 } } }
722
+ ]
723
+ },
724
+ "target": { "type": "string", "const": "pcm:pjm:project:background" },
725
+ "resource": { "type": "string", "mustBeInField": { "fieldName": "resources", "path": "key" } },
726
+ "resolver": {
727
+ "anyOf": [
728
+ {
729
+ "type": "object",
730
+ "required": ["function"],
731
+ "properties": { "function": { "type": "string", "mustBeInField": { "fieldName": "functions", "path": "key" } } },
732
+ "additionalProperties": false
733
+ },
734
+ {
735
+ "type": "object",
736
+ "required": ["endpoint"],
737
+ "properties": { "endpoint": { "type": "string", "mustBeInField": { "fieldName": "endpoints", "path": "key" } } },
738
+ "additionalProperties": false
739
+ }
740
+ ]
741
+ },
742
+ "display": { "$ref": "ExtensionDisplayConditionsSchemaId" }
743
+ },
744
+ "additionalProperties": false
745
+ },
746
+ {
747
+ "type": "object",
748
+ "required": ["key", "target", "pages"],
749
+ "properties": {
750
+ "key": { "type": "string" },
751
+ "title": {
752
+ "anyOf": [
753
+ { "type": "string", "maxLength": 256 },
754
+ { "type": "object", "required": ["i18n"], "properties": { "i18n": { "type": "string", "maxLength": 256 } } }
755
+ ]
756
+ },
757
+ "target": { "type": "string", "const": "pcm:pjm:project:hub" },
758
+ "resource": { "type": "string", "mustBeInField": { "fieldName": "resources", "path": "key" } },
759
+ "resolver": {
760
+ "anyOf": [
761
+ {
762
+ "type": "object",
763
+ "required": ["function"],
764
+ "properties": { "function": { "type": "string", "mustBeInField": { "fieldName": "functions", "path": "key" } } },
765
+ "additionalProperties": false
766
+ },
767
+ {
768
+ "type": "object",
769
+ "required": ["endpoint"],
770
+ "properties": { "endpoint": { "type": "string", "mustBeInField": { "fieldName": "endpoints", "path": "key" } } },
771
+ "additionalProperties": false
772
+ }
773
+ ]
774
+ },
775
+ "display": { "$ref": "ExtensionDisplayConditionsSchemaId" },
776
+ "pages": {
777
+ "type": "array",
778
+ "items": {
779
+ "type": "object",
780
+ "required": ["key", "title", "resource"],
781
+ "properties": {
782
+ "key": { "type": "string" },
783
+ "title": {
784
+ "anyOf": [
785
+ { "type": "string", "maxLength": 256 },
786
+ { "type": "object", "required": ["i18n"], "properties": { "i18n": { "type": "string", "maxLength": 256 } } }
787
+ ]
788
+ },
789
+ "resource": { "type": "string", "mustBeInField": { "fieldName": "resources", "path": "key" } },
790
+ "route": { "type": "string", "pattern": "^$|^(?!\\.{1,2}$)[a-z0-9-]{1,64}$" },
791
+ "icon": {
792
+ "anyOf": [
793
+ {
794
+ "type": "string",
795
+ "pattern": "^resource:[a-zA-Z0-9_-]+/.+",
796
+ "mustBeInField": { "fieldName": "resources", "path": "key", "extractPattern": {} }
797
+ },
798
+ { "type": "string", "pattern": "^icons/[a-zA-Z0-9_-]+(?::(#?[a-fA-F0-9]{3,8}|rgba\\([^)]+\\)))?$" },
799
+ { "type": "string", "pattern": "^https?:\\/\\/.*" }
800
+ ],
801
+ "errorMessage": "must be one of: resource:<resource key>/<path>, icons/<icon key>[:<color>], or https://... URL"
802
+ }
803
+ }
804
+ },
805
+ "minItems": 1,
806
+ "maxItems": 8,
807
+ "uniqueItemProperty": ["key", "route"],
808
+ "pageRouteValidate": true
809
+ },
810
+ "section": {
811
+ "type": "object",
812
+ "required": ["header", "enabled"],
813
+ "properties": {
814
+ "header": {
815
+ "anyOf": [
816
+ { "type": "string", "maxLength": 256 },
817
+ { "type": "object", "required": ["i18n"], "properties": { "i18n": { "type": "string", "maxLength": 256 } } }
818
+ ]
819
+ },
820
+ "enabled": { "type": "boolean" }
821
+ }
822
+ }
823
+ },
824
+ "additionalProperties": false
825
+ },
826
+ {
827
+ "type": "object",
828
+ "required": ["key", "title", "target"],
829
+ "properties": {
830
+ "key": { "type": "string" },
831
+ "title": {
832
+ "anyOf": [
833
+ { "type": "string", "maxLength": 256 },
834
+ { "type": "object", "required": ["i18n"], "properties": { "i18n": { "type": "string", "maxLength": 256 } } }
835
+ ]
836
+ },
837
+ "target": { "type": "string", "const": "pcm:pjm:project:page" },
838
+ "resource": { "type": "string", "mustBeInField": { "fieldName": "resources", "path": "key" } },
839
+ "resolver": {
840
+ "anyOf": [
841
+ {
842
+ "type": "object",
843
+ "required": ["function"],
844
+ "properties": { "function": { "type": "string", "mustBeInField": { "fieldName": "functions", "path": "key" } } },
845
+ "additionalProperties": false
846
+ },
847
+ {
848
+ "type": "object",
849
+ "required": ["endpoint"],
850
+ "properties": { "endpoint": { "type": "string", "mustBeInField": { "fieldName": "endpoints", "path": "key" } } },
851
+ "additionalProperties": false
852
+ }
853
+ ]
854
+ },
855
+ "display": { "$ref": "ExtensionDisplayConditionsSchemaId" },
856
+ "route": { "type": "string", "pattern": "^$|^(?!\\.{1,2}$)[a-z0-9-]{1,64}$" }
857
+ },
858
+ "additionalProperties": false
859
+ },
860
+ {
861
+ "type": "object",
862
+ "required": ["key", "target", "pages"],
863
+ "properties": {
864
+ "key": { "type": "string" },
865
+ "title": {
866
+ "anyOf": [
867
+ { "type": "string", "maxLength": 256 },
868
+ { "type": "object", "required": ["i18n"], "properties": { "i18n": { "type": "string", "maxLength": 256 } } }
869
+ ]
870
+ },
871
+ "target": { "type": "string", "const": "pcm:pjm:project:setting" },
872
+ "resource": { "type": "string", "mustBeInField": { "fieldName": "resources", "path": "key" } },
873
+ "resolver": {
874
+ "anyOf": [
875
+ {
876
+ "type": "object",
877
+ "required": ["function"],
878
+ "properties": { "function": { "type": "string", "mustBeInField": { "fieldName": "functions", "path": "key" } } },
879
+ "additionalProperties": false
880
+ },
881
+ {
882
+ "type": "object",
883
+ "required": ["endpoint"],
884
+ "properties": { "endpoint": { "type": "string", "mustBeInField": { "fieldName": "endpoints", "path": "key" } } },
885
+ "additionalProperties": false
886
+ }
887
+ ]
888
+ },
889
+ "display": { "$ref": "ExtensionDisplayConditionsSchemaId" },
890
+ "pages": {
891
+ "type": "array",
892
+ "items": {
893
+ "type": "object",
894
+ "required": ["key", "title", "resource"],
895
+ "properties": {
896
+ "key": { "type": "string" },
897
+ "title": {
898
+ "anyOf": [
899
+ { "type": "string", "maxLength": 256 },
900
+ { "type": "object", "required": ["i18n"], "properties": { "i18n": { "type": "string", "maxLength": 256 } } }
901
+ ]
902
+ },
903
+ "resource": { "type": "string", "mustBeInField": { "fieldName": "resources", "path": "key" } },
904
+ "route": { "type": "string", "pattern": "^$|^(?!\\.{1,2}$)[a-z0-9-]{1,64}$" }
905
+ }
906
+ },
907
+ "minItems": 1,
908
+ "maxItems": 8,
909
+ "uniqueItemProperty": ["key", "route"],
910
+ "pageRouteValidate": true
911
+ },
912
+ "section": {
913
+ "type": "object",
914
+ "required": ["header", "enabled"],
915
+ "properties": {
916
+ "header": {
917
+ "anyOf": [
918
+ { "type": "string", "maxLength": 256 },
919
+ { "type": "object", "required": ["i18n"], "properties": { "i18n": { "type": "string", "maxLength": 256 } } }
920
+ ]
921
+ },
922
+ "enabled": { "type": "boolean" }
923
+ }
924
+ }
925
+ },
926
+ "additionalProperties": false
927
+ },
928
+ {
929
+ "type": "object",
930
+ "required": ["key", "title", "target", "type", "behavior"],
931
+ "properties": {
932
+ "key": { "type": "string" },
933
+ "title": {
934
+ "anyOf": [
935
+ { "type": "string", "maxLength": 256 },
936
+ { "type": "object", "required": ["i18n"], "properties": { "i18n": { "type": "string", "maxLength": 256 } } }
937
+ ]
938
+ },
939
+ "target": { "type": "string", "const": "pcm:pjm:release:action" },
940
+ "resource": { "type": "string", "mustBeInField": { "fieldName": "resources", "path": "key" } },
941
+ "resolver": {
942
+ "anyOf": [
943
+ {
944
+ "type": "object",
945
+ "required": ["function"],
946
+ "properties": { "function": { "type": "string", "mustBeInField": { "fieldName": "functions", "path": "key" } } },
947
+ "additionalProperties": false
948
+ },
949
+ {
950
+ "type": "object",
951
+ "required": ["endpoint"],
952
+ "properties": { "endpoint": { "type": "string", "mustBeInField": { "fieldName": "endpoints", "path": "key" } } },
953
+ "additionalProperties": false
954
+ }
955
+ ]
956
+ },
957
+ "display": { "$ref": "ExtensionDisplayConditionsSchemaId" },
958
+ "icon": {
959
+ "anyOf": [
960
+ {
961
+ "type": "string",
962
+ "pattern": "^resource:[a-zA-Z0-9_-]+/.+",
963
+ "mustBeInField": { "fieldName": "resources", "path": "key", "extractPattern": {} }
964
+ },
965
+ { "type": "string", "pattern": "^icons/[a-zA-Z0-9_-]+(?::(#?[a-fA-F0-9]{3,8}|rgba\\([^)]+\\)))?$" },
966
+ { "type": "string", "pattern": "^https?:\\/\\/.*" }
967
+ ],
968
+ "errorMessage": "must be one of: resource:<resource key>/<path>, icons/<icon key>[:<color>], or https://... URL"
969
+ },
970
+ "type": { "enum": ["normal", "danger"] },
971
+ "behavior": { "enum": ["modal", "dynamic"] },
972
+ "viewport": {
973
+ "type": "object",
974
+ "required": ["size"],
975
+ "properties": { "size": { "enum": ["small", "medium", "large", "xlarge", "max", "fullscreen"] } }
976
+ }
977
+ },
978
+ "additionalProperties": false
979
+ },
980
+ {
981
+ "type": "object",
982
+ "required": ["key", "title", "target"],
983
+ "properties": {
984
+ "key": { "type": "string" },
985
+ "title": {
986
+ "anyOf": [
987
+ { "type": "string", "maxLength": 256 },
988
+ { "type": "object", "required": ["i18n"], "properties": { "i18n": { "type": "string", "maxLength": 256 } } }
989
+ ]
990
+ },
991
+ "target": { "type": "string", "const": "pcm:pjm:release:page" },
992
+ "resource": { "type": "string", "mustBeInField": { "fieldName": "resources", "path": "key" } },
993
+ "resolver": {
994
+ "anyOf": [
995
+ {
996
+ "type": "object",
997
+ "required": ["function"],
998
+ "properties": { "function": { "type": "string", "mustBeInField": { "fieldName": "functions", "path": "key" } } },
999
+ "additionalProperties": false
1000
+ },
1001
+ {
1002
+ "type": "object",
1003
+ "required": ["endpoint"],
1004
+ "properties": { "endpoint": { "type": "string", "mustBeInField": { "fieldName": "endpoints", "path": "key" } } },
1005
+ "additionalProperties": false
1006
+ }
1007
+ ]
1008
+ },
1009
+ "display": { "$ref": "ExtensionDisplayConditionsSchemaId" },
1010
+ "route": { "type": "string", "pattern": "^$|^(?!\\.{1,2}$)[a-z0-9-]{1,64}$" }
1011
+ },
1012
+ "additionalProperties": false
1013
+ },
1014
+ {
1015
+ "type": "object",
1016
+ "required": ["key", "title", "target", "type", "behavior"],
1017
+ "properties": {
1018
+ "key": { "type": "string" },
1019
+ "title": {
1020
+ "anyOf": [
1021
+ { "type": "string", "maxLength": 256 },
1022
+ { "type": "object", "required": ["i18n"], "properties": { "i18n": { "type": "string", "maxLength": 256 } } }
1023
+ ]
1024
+ },
1025
+ "target": { "type": "string", "const": "pcm:pjm:workitem:action" },
1026
+ "resource": { "type": "string", "mustBeInField": { "fieldName": "resources", "path": "key" } },
1027
+ "resolver": {
1028
+ "anyOf": [
1029
+ {
1030
+ "type": "object",
1031
+ "required": ["function"],
1032
+ "properties": { "function": { "type": "string", "mustBeInField": { "fieldName": "functions", "path": "key" } } },
1033
+ "additionalProperties": false
1034
+ },
1035
+ {
1036
+ "type": "object",
1037
+ "required": ["endpoint"],
1038
+ "properties": { "endpoint": { "type": "string", "mustBeInField": { "fieldName": "endpoints", "path": "key" } } },
1039
+ "additionalProperties": false
1040
+ }
1041
+ ]
1042
+ },
1043
+ "display": { "$ref": "ExtensionDisplayConditionsSchemaId" },
1044
+ "icon": {
1045
+ "anyOf": [
1046
+ {
1047
+ "type": "string",
1048
+ "pattern": "^resource:[a-zA-Z0-9_-]+/.+",
1049
+ "mustBeInField": { "fieldName": "resources", "path": "key", "extractPattern": {} }
1050
+ },
1051
+ { "type": "string", "pattern": "^icons/[a-zA-Z0-9_-]+(?::(#?[a-fA-F0-9]{3,8}|rgba\\([^)]+\\)))?$" },
1052
+ { "type": "string", "pattern": "^https?:\\/\\/.*" }
1053
+ ],
1054
+ "errorMessage": "must be one of: resource:<resource key>/<path>, icons/<icon key>[:<color>], or https://... URL"
1055
+ },
1056
+ "type": { "enum": ["normal", "danger"] },
1057
+ "behavior": { "enum": ["modal", "dynamic"] },
1058
+ "viewport": {
1059
+ "type": "object",
1060
+ "required": ["size"],
1061
+ "properties": { "size": { "enum": ["small", "medium", "large", "xlarge", "max", "fullscreen"] } }
1062
+ }
1063
+ },
1064
+ "additionalProperties": false
1065
+ },
1066
+ {
1067
+ "type": "object",
1068
+ "required": ["key", "title", "target"],
1069
+ "properties": {
1070
+ "key": { "type": "string" },
1071
+ "title": {
1072
+ "anyOf": [
1073
+ { "type": "string", "maxLength": 256 },
1074
+ { "type": "object", "required": ["i18n"], "properties": { "i18n": { "type": "string", "maxLength": 256 } } }
1075
+ ]
1076
+ },
1077
+ "target": { "type": "string", "const": "pcm:pjm:workitem:area" },
1078
+ "resource": { "type": "string", "mustBeInField": { "fieldName": "resources", "path": "key" } },
1079
+ "resolver": {
1080
+ "anyOf": [
1081
+ {
1082
+ "type": "object",
1083
+ "required": ["function"],
1084
+ "properties": { "function": { "type": "string", "mustBeInField": { "fieldName": "functions", "path": "key" } } },
1085
+ "additionalProperties": false
1086
+ },
1087
+ {
1088
+ "type": "object",
1089
+ "required": ["endpoint"],
1090
+ "properties": { "endpoint": { "type": "string", "mustBeInField": { "fieldName": "endpoints", "path": "key" } } },
1091
+ "additionalProperties": false
1092
+ }
1093
+ ]
1094
+ },
1095
+ "display": { "$ref": "ExtensionDisplayConditionsSchemaId" }
1096
+ },
1097
+ "additionalProperties": false
1098
+ },
1099
+ {
1100
+ "type": "object",
1101
+ "required": ["key", "target"],
1102
+ "properties": {
1103
+ "key": { "type": "string" },
1104
+ "title": {
1105
+ "anyOf": [
1106
+ { "type": "string", "maxLength": 256 },
1107
+ { "type": "object", "required": ["i18n"], "properties": { "i18n": { "type": "string", "maxLength": 256 } } }
1108
+ ]
1109
+ },
1110
+ "target": { "type": "string", "const": "pcm:pjm:workitem:background" },
1111
+ "resource": { "type": "string", "mustBeInField": { "fieldName": "resources", "path": "key" } },
1112
+ "resolver": {
1113
+ "anyOf": [
1114
+ {
1115
+ "type": "object",
1116
+ "required": ["function"],
1117
+ "properties": { "function": { "type": "string", "mustBeInField": { "fieldName": "functions", "path": "key" } } },
1118
+ "additionalProperties": false
1119
+ },
1120
+ {
1121
+ "type": "object",
1122
+ "required": ["endpoint"],
1123
+ "properties": { "endpoint": { "type": "string", "mustBeInField": { "fieldName": "endpoints", "path": "key" } } },
1124
+ "additionalProperties": false
1125
+ }
1126
+ ]
1127
+ },
1128
+ "display": { "$ref": "ExtensionDisplayConditionsSchemaId" }
1129
+ },
1130
+ "additionalProperties": false
1131
+ },
1132
+ {
1133
+ "type": "object",
1134
+ "required": ["key", "title", "target"],
1135
+ "properties": {
1136
+ "key": { "type": "string" },
1137
+ "title": {
1138
+ "anyOf": [
1139
+ { "type": "string", "maxLength": 256 },
1140
+ { "type": "object", "required": ["i18n"], "properties": { "i18n": { "type": "string", "maxLength": 256 } } }
1141
+ ]
1142
+ },
1143
+ "target": { "type": "string", "const": "pcm:pjm:workitem:context" },
1144
+ "resource": { "type": "string", "mustBeInField": { "fieldName": "resources", "path": "key" } },
1145
+ "resolver": {
1146
+ "anyOf": [
1147
+ {
1148
+ "type": "object",
1149
+ "required": ["function"],
1150
+ "properties": { "function": { "type": "string", "mustBeInField": { "fieldName": "functions", "path": "key" } } },
1151
+ "additionalProperties": false
1152
+ },
1153
+ {
1154
+ "type": "object",
1155
+ "required": ["endpoint"],
1156
+ "properties": { "endpoint": { "type": "string", "mustBeInField": { "fieldName": "endpoints", "path": "key" } } },
1157
+ "additionalProperties": false
1158
+ }
1159
+ ]
1160
+ },
1161
+ "display": { "$ref": "ExtensionDisplayConditionsSchemaId" },
1162
+ "viewport": {
1163
+ "type": "object",
1164
+ "required": ["size"],
1165
+ "properties": { "size": { "enum": ["small", "medium", "large", "xlarge", "max"] } }
1166
+ }
1167
+ },
1168
+ "additionalProperties": false
1169
+ },
1170
+ {
1171
+ "type": "object",
1172
+ "required": ["key", "target", "entries"],
1173
+ "properties": {
1174
+ "key": { "type": "string" },
1175
+ "title": {
1176
+ "anyOf": [
1177
+ { "type": "string", "maxLength": 256 },
1178
+ { "type": "object", "required": ["i18n"], "properties": { "i18n": { "type": "string", "maxLength": 256 } } }
1179
+ ]
1180
+ },
1181
+ "target": { "type": "string", "const": "pcm:pjm:workitem:panel" },
1182
+ "resource": { "type": "string", "mustBeInField": { "fieldName": "resources", "path": "key" } },
1183
+ "resolver": {
1184
+ "anyOf": [
1185
+ {
1186
+ "type": "object",
1187
+ "required": ["function"],
1188
+ "properties": { "function": { "type": "string", "mustBeInField": { "fieldName": "functions", "path": "key" } } },
1189
+ "additionalProperties": false
1190
+ },
1191
+ {
1192
+ "type": "object",
1193
+ "required": ["endpoint"],
1194
+ "properties": { "endpoint": { "type": "string", "mustBeInField": { "fieldName": "endpoints", "path": "key" } } },
1195
+ "additionalProperties": false
1196
+ }
1197
+ ]
1198
+ },
1199
+ "display": { "$ref": "ExtensionDisplayConditionsSchemaId" },
1200
+ "entries": {
1201
+ "type": "array",
1202
+ "items": {
1203
+ "type": "object",
1204
+ "required": ["key", "title", "panel"],
1205
+ "properties": {
1206
+ "key": { "type": "string" },
1207
+ "title": {
1208
+ "anyOf": [
1209
+ { "type": "string", "maxLength": 256 },
1210
+ { "type": "object", "required": ["i18n"], "properties": { "i18n": { "type": "string", "maxLength": 256 } } }
1211
+ ]
1212
+ },
1213
+ "panel": {
1214
+ "type": "object",
1215
+ "required": ["resource"],
1216
+ "properties": { "resource": { "type": "string", "mustBeInField": { "fieldName": "resources", "path": "key" } } }
1217
+ }
1218
+ }
1219
+ },
1220
+ "minItems": 1,
1221
+ "maxItems": 8,
1222
+ "uniqueItemProperty": "key"
1223
+ },
1224
+ "section": {
1225
+ "type": "object",
1226
+ "required": ["header", "enabled"],
1227
+ "properties": {
1228
+ "header": {
1229
+ "anyOf": [
1230
+ { "type": "string", "maxLength": 256 },
1231
+ { "type": "object", "required": ["i18n"], "properties": { "i18n": { "type": "string", "maxLength": 256 } } }
1232
+ ]
1233
+ },
1234
+ "enabled": { "type": "boolean" }
1235
+ }
1236
+ }
1237
+ },
1238
+ "additionalProperties": false
1239
+ },
1240
+ {
1241
+ "type": "object",
1242
+ "required": ["key", "title", "target", "type", "behavior"],
1243
+ "properties": {
1244
+ "key": { "type": "string" },
1245
+ "title": {
1246
+ "anyOf": [
1247
+ { "type": "string", "maxLength": 256 },
1248
+ { "type": "object", "required": ["i18n"], "properties": { "i18n": { "type": "string", "maxLength": 256 } } }
1249
+ ]
1250
+ },
1251
+ "target": { "type": "string", "const": "pcm:ship:baseline:action" },
1252
+ "resource": { "type": "string", "mustBeInField": { "fieldName": "resources", "path": "key" } },
1253
+ "resolver": {
1254
+ "anyOf": [
1255
+ {
1256
+ "type": "object",
1257
+ "required": ["function"],
1258
+ "properties": { "function": { "type": "string", "mustBeInField": { "fieldName": "functions", "path": "key" } } },
1259
+ "additionalProperties": false
1260
+ },
1261
+ {
1262
+ "type": "object",
1263
+ "required": ["endpoint"],
1264
+ "properties": { "endpoint": { "type": "string", "mustBeInField": { "fieldName": "endpoints", "path": "key" } } },
1265
+ "additionalProperties": false
1266
+ }
1267
+ ]
1268
+ },
1269
+ "display": { "$ref": "ExtensionDisplayConditionsSchemaId" },
1270
+ "icon": {
1271
+ "anyOf": [
1272
+ {
1273
+ "type": "string",
1274
+ "pattern": "^resource:[a-zA-Z0-9_-]+/.+",
1275
+ "mustBeInField": { "fieldName": "resources", "path": "key", "extractPattern": {} }
1276
+ },
1277
+ { "type": "string", "pattern": "^icons/[a-zA-Z0-9_-]+(?::(#?[a-fA-F0-9]{3,8}|rgba\\([^)]+\\)))?$" },
1278
+ { "type": "string", "pattern": "^https?:\\/\\/.*" }
1279
+ ],
1280
+ "errorMessage": "must be one of: resource:<resource key>/<path>, icons/<icon key>[:<color>], or https://... URL"
1281
+ },
1282
+ "type": { "enum": ["normal", "danger"] },
1283
+ "behavior": { "enum": ["modal", "dynamic"] },
1284
+ "viewport": {
1285
+ "type": "object",
1286
+ "required": ["size"],
1287
+ "properties": { "size": { "enum": ["small", "medium", "large", "xlarge", "max", "fullscreen"] } }
1288
+ }
1289
+ },
1290
+ "additionalProperties": false
1291
+ },
1292
+ {
1293
+ "type": "object",
1294
+ "required": ["key", "title", "target"],
1295
+ "properties": {
1296
+ "key": { "type": "string" },
1297
+ "title": {
1298
+ "anyOf": [
1299
+ { "type": "string", "maxLength": 256 },
1300
+ { "type": "object", "required": ["i18n"], "properties": { "i18n": { "type": "string", "maxLength": 256 } } }
1301
+ ]
1302
+ },
1303
+ "target": { "type": "string", "const": "pcm:ship:baseline:page" },
1304
+ "resource": { "type": "string", "mustBeInField": { "fieldName": "resources", "path": "key" } },
1305
+ "resolver": {
1306
+ "anyOf": [
1307
+ {
1308
+ "type": "object",
1309
+ "required": ["function"],
1310
+ "properties": { "function": { "type": "string", "mustBeInField": { "fieldName": "functions", "path": "key" } } },
1311
+ "additionalProperties": false
1312
+ },
1313
+ {
1314
+ "type": "object",
1315
+ "required": ["endpoint"],
1316
+ "properties": { "endpoint": { "type": "string", "mustBeInField": { "fieldName": "endpoints", "path": "key" } } },
1317
+ "additionalProperties": false
1318
+ }
1319
+ ]
1320
+ },
1321
+ "display": { "$ref": "ExtensionDisplayConditionsSchemaId" },
1322
+ "route": { "type": "string", "pattern": "^$|^(?!\\.{1,2}$)[a-z0-9-]{1,64}$" }
1323
+ },
1324
+ "additionalProperties": false
1325
+ },
1326
+ {
1327
+ "type": "object",
1328
+ "required": ["key", "title", "target", "type", "behavior"],
1329
+ "properties": {
1330
+ "key": { "type": "string" },
1331
+ "title": {
1332
+ "anyOf": [
1333
+ { "type": "string", "maxLength": 256 },
1334
+ { "type": "object", "required": ["i18n"], "properties": { "i18n": { "type": "string", "maxLength": 256 } } }
1335
+ ]
1336
+ },
1337
+ "target": { "type": "string", "const": "pcm:ship:idea:action" },
1338
+ "resource": { "type": "string", "mustBeInField": { "fieldName": "resources", "path": "key" } },
1339
+ "resolver": {
1340
+ "anyOf": [
1341
+ {
1342
+ "type": "object",
1343
+ "required": ["function"],
1344
+ "properties": { "function": { "type": "string", "mustBeInField": { "fieldName": "functions", "path": "key" } } },
1345
+ "additionalProperties": false
1346
+ },
1347
+ {
1348
+ "type": "object",
1349
+ "required": ["endpoint"],
1350
+ "properties": { "endpoint": { "type": "string", "mustBeInField": { "fieldName": "endpoints", "path": "key" } } },
1351
+ "additionalProperties": false
1352
+ }
1353
+ ]
1354
+ },
1355
+ "display": { "$ref": "ExtensionDisplayConditionsSchemaId" },
1356
+ "icon": {
1357
+ "anyOf": [
1358
+ {
1359
+ "type": "string",
1360
+ "pattern": "^resource:[a-zA-Z0-9_-]+/.+",
1361
+ "mustBeInField": { "fieldName": "resources", "path": "key", "extractPattern": {} }
1362
+ },
1363
+ { "type": "string", "pattern": "^icons/[a-zA-Z0-9_-]+(?::(#?[a-fA-F0-9]{3,8}|rgba\\([^)]+\\)))?$" },
1364
+ { "type": "string", "pattern": "^https?:\\/\\/.*" }
1365
+ ],
1366
+ "errorMessage": "must be one of: resource:<resource key>/<path>, icons/<icon key>[:<color>], or https://... URL"
1367
+ },
1368
+ "type": { "enum": ["normal", "danger"] },
1369
+ "behavior": { "enum": ["modal", "dynamic"] },
1370
+ "viewport": {
1371
+ "type": "object",
1372
+ "required": ["size"],
1373
+ "properties": { "size": { "enum": ["small", "medium", "large", "xlarge", "max", "fullscreen"] } }
1374
+ }
1375
+ },
1376
+ "additionalProperties": false
1377
+ },
1378
+ {
1379
+ "type": "object",
1380
+ "required": ["key", "title", "target"],
1381
+ "properties": {
1382
+ "key": { "type": "string" },
1383
+ "title": {
1384
+ "anyOf": [
1385
+ { "type": "string", "maxLength": 256 },
1386
+ { "type": "object", "required": ["i18n"], "properties": { "i18n": { "type": "string", "maxLength": 256 } } }
1387
+ ]
1388
+ },
1389
+ "target": { "type": "string", "const": "pcm:ship:idea:area" },
1390
+ "resource": { "type": "string", "mustBeInField": { "fieldName": "resources", "path": "key" } },
1391
+ "resolver": {
1392
+ "anyOf": [
1393
+ {
1394
+ "type": "object",
1395
+ "required": ["function"],
1396
+ "properties": { "function": { "type": "string", "mustBeInField": { "fieldName": "functions", "path": "key" } } },
1397
+ "additionalProperties": false
1398
+ },
1399
+ {
1400
+ "type": "object",
1401
+ "required": ["endpoint"],
1402
+ "properties": { "endpoint": { "type": "string", "mustBeInField": { "fieldName": "endpoints", "path": "key" } } },
1403
+ "additionalProperties": false
1404
+ }
1405
+ ]
1406
+ },
1407
+ "display": { "$ref": "ExtensionDisplayConditionsSchemaId" }
1408
+ },
1409
+ "additionalProperties": false
1410
+ },
1411
+ {
1412
+ "type": "object",
1413
+ "required": ["key", "target"],
1414
+ "properties": {
1415
+ "key": { "type": "string" },
1416
+ "title": {
1417
+ "anyOf": [
1418
+ { "type": "string", "maxLength": 256 },
1419
+ { "type": "object", "required": ["i18n"], "properties": { "i18n": { "type": "string", "maxLength": 256 } } }
1420
+ ]
1421
+ },
1422
+ "target": { "type": "string", "const": "pcm:ship:idea:background" },
1423
+ "resource": { "type": "string", "mustBeInField": { "fieldName": "resources", "path": "key" } },
1424
+ "resolver": {
1425
+ "anyOf": [
1426
+ {
1427
+ "type": "object",
1428
+ "required": ["function"],
1429
+ "properties": { "function": { "type": "string", "mustBeInField": { "fieldName": "functions", "path": "key" } } },
1430
+ "additionalProperties": false
1431
+ },
1432
+ {
1433
+ "type": "object",
1434
+ "required": ["endpoint"],
1435
+ "properties": { "endpoint": { "type": "string", "mustBeInField": { "fieldName": "endpoints", "path": "key" } } },
1436
+ "additionalProperties": false
1437
+ }
1438
+ ]
1439
+ },
1440
+ "display": { "$ref": "ExtensionDisplayConditionsSchemaId" }
1441
+ },
1442
+ "additionalProperties": false
1443
+ },
1444
+ {
1445
+ "type": "object",
1446
+ "required": ["key", "title", "target"],
1447
+ "properties": {
1448
+ "key": { "type": "string" },
1449
+ "title": {
1450
+ "anyOf": [
1451
+ { "type": "string", "maxLength": 256 },
1452
+ { "type": "object", "required": ["i18n"], "properties": { "i18n": { "type": "string", "maxLength": 256 } } }
1453
+ ]
1454
+ },
1455
+ "target": { "type": "string", "const": "pcm:ship:idea:context" },
1456
+ "resource": { "type": "string", "mustBeInField": { "fieldName": "resources", "path": "key" } },
1457
+ "resolver": {
1458
+ "anyOf": [
1459
+ {
1460
+ "type": "object",
1461
+ "required": ["function"],
1462
+ "properties": { "function": { "type": "string", "mustBeInField": { "fieldName": "functions", "path": "key" } } },
1463
+ "additionalProperties": false
1464
+ },
1465
+ {
1466
+ "type": "object",
1467
+ "required": ["endpoint"],
1468
+ "properties": { "endpoint": { "type": "string", "mustBeInField": { "fieldName": "endpoints", "path": "key" } } },
1469
+ "additionalProperties": false
1470
+ }
1471
+ ]
1472
+ },
1473
+ "display": { "$ref": "ExtensionDisplayConditionsSchemaId" },
1474
+ "viewport": {
1475
+ "type": "object",
1476
+ "required": ["size"],
1477
+ "properties": { "size": { "enum": ["small", "medium", "large", "xlarge", "max"] } }
1478
+ }
1479
+ },
1480
+ "additionalProperties": false
1481
+ },
1482
+ {
1483
+ "type": "object",
1484
+ "required": ["key", "target", "entries"],
1485
+ "properties": {
1486
+ "key": { "type": "string" },
1487
+ "title": {
1488
+ "anyOf": [
1489
+ { "type": "string", "maxLength": 256 },
1490
+ { "type": "object", "required": ["i18n"], "properties": { "i18n": { "type": "string", "maxLength": 256 } } }
1491
+ ]
1492
+ },
1493
+ "target": { "type": "string", "const": "pcm:ship:idea:panel" },
1494
+ "resource": { "type": "string", "mustBeInField": { "fieldName": "resources", "path": "key" } },
1495
+ "resolver": {
1496
+ "anyOf": [
1497
+ {
1498
+ "type": "object",
1499
+ "required": ["function"],
1500
+ "properties": { "function": { "type": "string", "mustBeInField": { "fieldName": "functions", "path": "key" } } },
1501
+ "additionalProperties": false
1502
+ },
1503
+ {
1504
+ "type": "object",
1505
+ "required": ["endpoint"],
1506
+ "properties": { "endpoint": { "type": "string", "mustBeInField": { "fieldName": "endpoints", "path": "key" } } },
1507
+ "additionalProperties": false
1508
+ }
1509
+ ]
1510
+ },
1511
+ "display": { "$ref": "ExtensionDisplayConditionsSchemaId" },
1512
+ "entries": {
1513
+ "type": "array",
1514
+ "items": {
1515
+ "type": "object",
1516
+ "required": ["key", "title", "panel"],
1517
+ "properties": {
1518
+ "key": { "type": "string" },
1519
+ "title": {
1520
+ "anyOf": [
1521
+ { "type": "string", "maxLength": 256 },
1522
+ { "type": "object", "required": ["i18n"], "properties": { "i18n": { "type": "string", "maxLength": 256 } } }
1523
+ ]
1524
+ },
1525
+ "panel": {
1526
+ "type": "object",
1527
+ "required": ["resource"],
1528
+ "properties": { "resource": { "type": "string", "mustBeInField": { "fieldName": "resources", "path": "key" } } }
1529
+ }
1530
+ }
1531
+ },
1532
+ "minItems": 1,
1533
+ "maxItems": 8,
1534
+ "uniqueItemProperty": "key"
1535
+ },
1536
+ "section": {
1537
+ "type": "object",
1538
+ "required": ["header", "enabled"],
1539
+ "properties": {
1540
+ "header": {
1541
+ "anyOf": [
1542
+ { "type": "string", "maxLength": 256 },
1543
+ { "type": "object", "required": ["i18n"], "properties": { "i18n": { "type": "string", "maxLength": 256 } } }
1544
+ ]
1545
+ },
1546
+ "enabled": { "type": "boolean" }
1547
+ }
1548
+ }
1549
+ },
1550
+ "additionalProperties": false
1551
+ },
1552
+ {
1553
+ "type": "object",
1554
+ "required": ["key", "target"],
1555
+ "properties": {
1556
+ "key": { "type": "string" },
1557
+ "title": {
1558
+ "anyOf": [
1559
+ { "type": "string", "maxLength": 256 },
1560
+ { "type": "object", "required": ["i18n"], "properties": { "i18n": { "type": "string", "maxLength": 256 } } }
1561
+ ]
1562
+ },
1563
+ "target": { "type": "string", "const": "pcm:ship:product:background" },
1564
+ "resource": { "type": "string", "mustBeInField": { "fieldName": "resources", "path": "key" } },
1565
+ "resolver": {
1566
+ "anyOf": [
1567
+ {
1568
+ "type": "object",
1569
+ "required": ["function"],
1570
+ "properties": { "function": { "type": "string", "mustBeInField": { "fieldName": "functions", "path": "key" } } },
1571
+ "additionalProperties": false
1572
+ },
1573
+ {
1574
+ "type": "object",
1575
+ "required": ["endpoint"],
1576
+ "properties": { "endpoint": { "type": "string", "mustBeInField": { "fieldName": "endpoints", "path": "key" } } },
1577
+ "additionalProperties": false
1578
+ }
1579
+ ]
1580
+ },
1581
+ "display": { "$ref": "ExtensionDisplayConditionsSchemaId" }
1582
+ },
1583
+ "additionalProperties": false
1584
+ },
1585
+ {
1586
+ "type": "object",
1587
+ "required": ["key", "target", "pages"],
1588
+ "properties": {
1589
+ "key": { "type": "string" },
1590
+ "title": {
1591
+ "anyOf": [
1592
+ { "type": "string", "maxLength": 256 },
1593
+ { "type": "object", "required": ["i18n"], "properties": { "i18n": { "type": "string", "maxLength": 256 } } }
1594
+ ]
1595
+ },
1596
+ "target": { "type": "string", "const": "pcm:ship:product:hub" },
1597
+ "resource": { "type": "string", "mustBeInField": { "fieldName": "resources", "path": "key" } },
1598
+ "resolver": {
1599
+ "anyOf": [
1600
+ {
1601
+ "type": "object",
1602
+ "required": ["function"],
1603
+ "properties": { "function": { "type": "string", "mustBeInField": { "fieldName": "functions", "path": "key" } } },
1604
+ "additionalProperties": false
1605
+ },
1606
+ {
1607
+ "type": "object",
1608
+ "required": ["endpoint"],
1609
+ "properties": { "endpoint": { "type": "string", "mustBeInField": { "fieldName": "endpoints", "path": "key" } } },
1610
+ "additionalProperties": false
1611
+ }
1612
+ ]
1613
+ },
1614
+ "display": { "$ref": "ExtensionDisplayConditionsSchemaId" },
1615
+ "pages": {
1616
+ "type": "array",
1617
+ "items": {
1618
+ "type": "object",
1619
+ "required": ["key", "title", "resource"],
1620
+ "properties": {
1621
+ "key": { "type": "string" },
1622
+ "title": {
1623
+ "anyOf": [
1624
+ { "type": "string", "maxLength": 256 },
1625
+ { "type": "object", "required": ["i18n"], "properties": { "i18n": { "type": "string", "maxLength": 256 } } }
1626
+ ]
1627
+ },
1628
+ "resource": { "type": "string", "mustBeInField": { "fieldName": "resources", "path": "key" } },
1629
+ "route": { "type": "string", "pattern": "^$|^(?!\\.{1,2}$)[a-z0-9-]{1,64}$" },
1630
+ "icon": {
1631
+ "anyOf": [
1632
+ {
1633
+ "type": "string",
1634
+ "pattern": "^resource:[a-zA-Z0-9_-]+/.+",
1635
+ "mustBeInField": { "fieldName": "resources", "path": "key", "extractPattern": {} }
1636
+ },
1637
+ { "type": "string", "pattern": "^icons/[a-zA-Z0-9_-]+(?::(#?[a-fA-F0-9]{3,8}|rgba\\([^)]+\\)))?$" },
1638
+ { "type": "string", "pattern": "^https?:\\/\\/.*" }
1639
+ ],
1640
+ "errorMessage": "must be one of: resource:<resource key>/<path>, icons/<icon key>[:<color>], or https://... URL"
1641
+ }
1642
+ }
1643
+ },
1644
+ "minItems": 1,
1645
+ "maxItems": 8,
1646
+ "uniqueItemProperty": ["key", "route"],
1647
+ "pageRouteValidate": true
1648
+ },
1649
+ "section": {
1650
+ "type": "object",
1651
+ "required": ["header", "enabled"],
1652
+ "properties": {
1653
+ "header": {
1654
+ "anyOf": [
1655
+ { "type": "string", "maxLength": 256 },
1656
+ { "type": "object", "required": ["i18n"], "properties": { "i18n": { "type": "string", "maxLength": 256 } } }
1657
+ ]
1658
+ },
1659
+ "enabled": { "type": "boolean" }
1660
+ }
1661
+ }
1662
+ },
1663
+ "additionalProperties": false
1664
+ },
1665
+ {
1666
+ "type": "object",
1667
+ "required": ["key", "title", "target"],
1668
+ "properties": {
1669
+ "key": { "type": "string" },
1670
+ "title": {
1671
+ "anyOf": [
1672
+ { "type": "string", "maxLength": 256 },
1673
+ { "type": "object", "required": ["i18n"], "properties": { "i18n": { "type": "string", "maxLength": 256 } } }
1674
+ ]
1675
+ },
1676
+ "target": { "type": "string", "const": "pcm:ship:product:page" },
1677
+ "resource": { "type": "string", "mustBeInField": { "fieldName": "resources", "path": "key" } },
1678
+ "resolver": {
1679
+ "anyOf": [
1680
+ {
1681
+ "type": "object",
1682
+ "required": ["function"],
1683
+ "properties": { "function": { "type": "string", "mustBeInField": { "fieldName": "functions", "path": "key" } } },
1684
+ "additionalProperties": false
1685
+ },
1686
+ {
1687
+ "type": "object",
1688
+ "required": ["endpoint"],
1689
+ "properties": { "endpoint": { "type": "string", "mustBeInField": { "fieldName": "endpoints", "path": "key" } } },
1690
+ "additionalProperties": false
1691
+ }
1692
+ ]
1693
+ },
1694
+ "display": { "$ref": "ExtensionDisplayConditionsSchemaId" },
1695
+ "route": { "type": "string", "pattern": "^$|^(?!\\.{1,2}$)[a-z0-9-]{1,64}$" }
1696
+ },
1697
+ "additionalProperties": false
1698
+ },
1699
+ {
1700
+ "type": "object",
1701
+ "required": ["key", "target", "pages"],
1702
+ "properties": {
1703
+ "key": { "type": "string" },
1704
+ "title": {
1705
+ "anyOf": [
1706
+ { "type": "string", "maxLength": 256 },
1707
+ { "type": "object", "required": ["i18n"], "properties": { "i18n": { "type": "string", "maxLength": 256 } } }
1708
+ ]
1709
+ },
1710
+ "target": { "type": "string", "const": "pcm:ship:product:setting" },
1711
+ "resource": { "type": "string", "mustBeInField": { "fieldName": "resources", "path": "key" } },
1712
+ "resolver": {
1713
+ "anyOf": [
1714
+ {
1715
+ "type": "object",
1716
+ "required": ["function"],
1717
+ "properties": { "function": { "type": "string", "mustBeInField": { "fieldName": "functions", "path": "key" } } },
1718
+ "additionalProperties": false
1719
+ },
1720
+ {
1721
+ "type": "object",
1722
+ "required": ["endpoint"],
1723
+ "properties": { "endpoint": { "type": "string", "mustBeInField": { "fieldName": "endpoints", "path": "key" } } },
1724
+ "additionalProperties": false
1725
+ }
1726
+ ]
1727
+ },
1728
+ "display": { "$ref": "ExtensionDisplayConditionsSchemaId" },
1729
+ "pages": {
1730
+ "type": "array",
1731
+ "items": {
1732
+ "type": "object",
1733
+ "required": ["key", "title", "resource"],
1734
+ "properties": {
1735
+ "key": { "type": "string" },
1736
+ "title": {
1737
+ "anyOf": [
1738
+ { "type": "string", "maxLength": 256 },
1739
+ { "type": "object", "required": ["i18n"], "properties": { "i18n": { "type": "string", "maxLength": 256 } } }
1740
+ ]
1741
+ },
1742
+ "resource": { "type": "string", "mustBeInField": { "fieldName": "resources", "path": "key" } },
1743
+ "route": { "type": "string", "pattern": "^$|^(?!\\.{1,2}$)[a-z0-9-]{1,64}$" }
1744
+ }
1745
+ },
1746
+ "minItems": 1,
1747
+ "maxItems": 8,
1748
+ "uniqueItemProperty": ["key", "route"],
1749
+ "pageRouteValidate": true
1750
+ },
1751
+ "section": {
1752
+ "type": "object",
1753
+ "required": ["header", "enabled"],
1754
+ "properties": {
1755
+ "header": {
1756
+ "anyOf": [
1757
+ { "type": "string", "maxLength": 256 },
1758
+ { "type": "object", "required": ["i18n"], "properties": { "i18n": { "type": "string", "maxLength": 256 } } }
1759
+ ]
1760
+ },
1761
+ "enabled": { "type": "boolean" }
1762
+ }
1763
+ }
1764
+ },
1765
+ "additionalProperties": false
1766
+ },
1767
+ {
1768
+ "type": "object",
1769
+ "required": ["key", "title", "target", "type", "behavior"],
1770
+ "properties": {
1771
+ "key": { "type": "string" },
1772
+ "title": {
1773
+ "anyOf": [
1774
+ { "type": "string", "maxLength": 256 },
1775
+ { "type": "object", "required": ["i18n"], "properties": { "i18n": { "type": "string", "maxLength": 256 } } }
1776
+ ]
1777
+ },
1778
+ "target": { "type": "string", "const": "pcm:ship:ticket:action" },
1779
+ "resource": { "type": "string", "mustBeInField": { "fieldName": "resources", "path": "key" } },
1780
+ "resolver": {
1781
+ "anyOf": [
1782
+ {
1783
+ "type": "object",
1784
+ "required": ["function"],
1785
+ "properties": { "function": { "type": "string", "mustBeInField": { "fieldName": "functions", "path": "key" } } },
1786
+ "additionalProperties": false
1787
+ },
1788
+ {
1789
+ "type": "object",
1790
+ "required": ["endpoint"],
1791
+ "properties": { "endpoint": { "type": "string", "mustBeInField": { "fieldName": "endpoints", "path": "key" } } },
1792
+ "additionalProperties": false
1793
+ }
1794
+ ]
1795
+ },
1796
+ "display": { "$ref": "ExtensionDisplayConditionsSchemaId" },
1797
+ "icon": {
1798
+ "anyOf": [
1799
+ {
1800
+ "type": "string",
1801
+ "pattern": "^resource:[a-zA-Z0-9_-]+/.+",
1802
+ "mustBeInField": { "fieldName": "resources", "path": "key", "extractPattern": {} }
1803
+ },
1804
+ { "type": "string", "pattern": "^icons/[a-zA-Z0-9_-]+(?::(#?[a-fA-F0-9]{3,8}|rgba\\([^)]+\\)))?$" },
1805
+ { "type": "string", "pattern": "^https?:\\/\\/.*" }
1806
+ ],
1807
+ "errorMessage": "must be one of: resource:<resource key>/<path>, icons/<icon key>[:<color>], or https://... URL"
1808
+ },
1809
+ "type": { "enum": ["normal", "danger"] },
1810
+ "behavior": { "enum": ["modal", "dynamic"] },
1811
+ "viewport": {
1812
+ "type": "object",
1813
+ "required": ["size"],
1814
+ "properties": { "size": { "enum": ["small", "medium", "large", "xlarge", "max", "fullscreen"] } }
1815
+ }
1816
+ },
1817
+ "additionalProperties": false
1818
+ },
1819
+ {
1820
+ "type": "object",
1821
+ "required": ["key", "title", "target"],
1822
+ "properties": {
1823
+ "key": { "type": "string" },
1824
+ "title": {
1825
+ "anyOf": [
1826
+ { "type": "string", "maxLength": 256 },
1827
+ { "type": "object", "required": ["i18n"], "properties": { "i18n": { "type": "string", "maxLength": 256 } } }
1828
+ ]
1829
+ },
1830
+ "target": { "type": "string", "const": "pcm:ship:ticket:area" },
1831
+ "resource": { "type": "string", "mustBeInField": { "fieldName": "resources", "path": "key" } },
1832
+ "resolver": {
1833
+ "anyOf": [
1834
+ {
1835
+ "type": "object",
1836
+ "required": ["function"],
1837
+ "properties": { "function": { "type": "string", "mustBeInField": { "fieldName": "functions", "path": "key" } } },
1838
+ "additionalProperties": false
1839
+ },
1840
+ {
1841
+ "type": "object",
1842
+ "required": ["endpoint"],
1843
+ "properties": { "endpoint": { "type": "string", "mustBeInField": { "fieldName": "endpoints", "path": "key" } } },
1844
+ "additionalProperties": false
1845
+ }
1846
+ ]
1847
+ },
1848
+ "display": { "$ref": "ExtensionDisplayConditionsSchemaId" }
1849
+ },
1850
+ "additionalProperties": false
1851
+ },
1852
+ {
1853
+ "type": "object",
1854
+ "required": ["key", "target"],
1855
+ "properties": {
1856
+ "key": { "type": "string" },
1857
+ "title": {
1858
+ "anyOf": [
1859
+ { "type": "string", "maxLength": 256 },
1860
+ { "type": "object", "required": ["i18n"], "properties": { "i18n": { "type": "string", "maxLength": 256 } } }
1861
+ ]
1862
+ },
1863
+ "target": { "type": "string", "const": "pcm:ship:ticket:background" },
1864
+ "resource": { "type": "string", "mustBeInField": { "fieldName": "resources", "path": "key" } },
1865
+ "resolver": {
1866
+ "anyOf": [
1867
+ {
1868
+ "type": "object",
1869
+ "required": ["function"],
1870
+ "properties": { "function": { "type": "string", "mustBeInField": { "fieldName": "functions", "path": "key" } } },
1871
+ "additionalProperties": false
1872
+ },
1873
+ {
1874
+ "type": "object",
1875
+ "required": ["endpoint"],
1876
+ "properties": { "endpoint": { "type": "string", "mustBeInField": { "fieldName": "endpoints", "path": "key" } } },
1877
+ "additionalProperties": false
1878
+ }
1879
+ ]
1880
+ },
1881
+ "display": { "$ref": "ExtensionDisplayConditionsSchemaId" }
1882
+ },
1883
+ "additionalProperties": false
1884
+ },
1885
+ {
1886
+ "type": "object",
1887
+ "required": ["key", "title", "target"],
1888
+ "properties": {
1889
+ "key": { "type": "string" },
1890
+ "title": {
1891
+ "anyOf": [
1892
+ { "type": "string", "maxLength": 256 },
1893
+ { "type": "object", "required": ["i18n"], "properties": { "i18n": { "type": "string", "maxLength": 256 } } }
1894
+ ]
1895
+ },
1896
+ "target": { "type": "string", "const": "pcm:ship:ticket:context" },
1897
+ "resource": { "type": "string", "mustBeInField": { "fieldName": "resources", "path": "key" } },
1898
+ "resolver": {
1899
+ "anyOf": [
1900
+ {
1901
+ "type": "object",
1902
+ "required": ["function"],
1903
+ "properties": { "function": { "type": "string", "mustBeInField": { "fieldName": "functions", "path": "key" } } },
1904
+ "additionalProperties": false
1905
+ },
1906
+ {
1907
+ "type": "object",
1908
+ "required": ["endpoint"],
1909
+ "properties": { "endpoint": { "type": "string", "mustBeInField": { "fieldName": "endpoints", "path": "key" } } },
1910
+ "additionalProperties": false
1911
+ }
1912
+ ]
1913
+ },
1914
+ "display": { "$ref": "ExtensionDisplayConditionsSchemaId" },
1915
+ "viewport": {
1916
+ "type": "object",
1917
+ "required": ["size"],
1918
+ "properties": { "size": { "enum": ["small", "medium", "large", "xlarge", "max"] } }
1919
+ }
1920
+ },
1921
+ "additionalProperties": false
1922
+ },
1923
+ {
1924
+ "type": "object",
1925
+ "required": ["key", "target", "entries"],
1926
+ "properties": {
1927
+ "key": { "type": "string" },
1928
+ "title": {
1929
+ "anyOf": [
1930
+ { "type": "string", "maxLength": 256 },
1931
+ { "type": "object", "required": ["i18n"], "properties": { "i18n": { "type": "string", "maxLength": 256 } } }
1932
+ ]
1933
+ },
1934
+ "target": { "type": "string", "const": "pcm:ship:ticket:panel" },
1935
+ "resource": { "type": "string", "mustBeInField": { "fieldName": "resources", "path": "key" } },
1936
+ "resolver": {
1937
+ "anyOf": [
1938
+ {
1939
+ "type": "object",
1940
+ "required": ["function"],
1941
+ "properties": { "function": { "type": "string", "mustBeInField": { "fieldName": "functions", "path": "key" } } },
1942
+ "additionalProperties": false
1943
+ },
1944
+ {
1945
+ "type": "object",
1946
+ "required": ["endpoint"],
1947
+ "properties": { "endpoint": { "type": "string", "mustBeInField": { "fieldName": "endpoints", "path": "key" } } },
1948
+ "additionalProperties": false
1949
+ }
1950
+ ]
1951
+ },
1952
+ "display": { "$ref": "ExtensionDisplayConditionsSchemaId" },
1953
+ "entries": {
1954
+ "type": "array",
1955
+ "items": {
1956
+ "type": "object",
1957
+ "required": ["key", "title", "panel"],
1958
+ "properties": {
1959
+ "key": { "type": "string" },
1960
+ "title": {
1961
+ "anyOf": [
1962
+ { "type": "string", "maxLength": 256 },
1963
+ { "type": "object", "required": ["i18n"], "properties": { "i18n": { "type": "string", "maxLength": 256 } } }
1964
+ ]
1965
+ },
1966
+ "panel": {
1967
+ "type": "object",
1968
+ "required": ["resource"],
1969
+ "properties": { "resource": { "type": "string", "mustBeInField": { "fieldName": "resources", "path": "key" } } }
1970
+ }
1971
+ }
1972
+ },
1973
+ "minItems": 1,
1974
+ "maxItems": 8,
1975
+ "uniqueItemProperty": "key"
1976
+ },
1977
+ "section": {
1978
+ "type": "object",
1979
+ "required": ["header", "enabled"],
1980
+ "properties": {
1981
+ "header": {
1982
+ "anyOf": [
1983
+ { "type": "string", "maxLength": 256 },
1984
+ { "type": "object", "required": ["i18n"], "properties": { "i18n": { "type": "string", "maxLength": 256 } } }
1985
+ ]
1986
+ },
1987
+ "enabled": { "type": "boolean" }
1988
+ }
1989
+ }
1990
+ },
1991
+ "additionalProperties": false
1992
+ },
1993
+ {
1994
+ "type": "object",
1995
+ "required": ["key", "title", "target", "type", "behavior"],
1996
+ "properties": {
1997
+ "key": { "type": "string" },
1998
+ "title": {
1999
+ "anyOf": [
2000
+ { "type": "string", "maxLength": 256 },
2001
+ { "type": "object", "required": ["i18n"], "properties": { "i18n": { "type": "string", "maxLength": 256 } } }
2002
+ ]
2003
+ },
2004
+ "target": { "type": "string", "const": "pcm:testhub:baseline:action" },
2005
+ "resource": { "type": "string", "mustBeInField": { "fieldName": "resources", "path": "key" } },
2006
+ "resolver": {
2007
+ "anyOf": [
2008
+ {
2009
+ "type": "object",
2010
+ "required": ["function"],
2011
+ "properties": { "function": { "type": "string", "mustBeInField": { "fieldName": "functions", "path": "key" } } },
2012
+ "additionalProperties": false
2013
+ },
2014
+ {
2015
+ "type": "object",
2016
+ "required": ["endpoint"],
2017
+ "properties": { "endpoint": { "type": "string", "mustBeInField": { "fieldName": "endpoints", "path": "key" } } },
2018
+ "additionalProperties": false
2019
+ }
2020
+ ]
2021
+ },
2022
+ "display": { "$ref": "ExtensionDisplayConditionsSchemaId" },
2023
+ "icon": {
2024
+ "anyOf": [
2025
+ {
2026
+ "type": "string",
2027
+ "pattern": "^resource:[a-zA-Z0-9_-]+/.+",
2028
+ "mustBeInField": { "fieldName": "resources", "path": "key", "extractPattern": {} }
2029
+ },
2030
+ { "type": "string", "pattern": "^icons/[a-zA-Z0-9_-]+(?::(#?[a-fA-F0-9]{3,8}|rgba\\([^)]+\\)))?$" },
2031
+ { "type": "string", "pattern": "^https?:\\/\\/.*" }
2032
+ ],
2033
+ "errorMessage": "must be one of: resource:<resource key>/<path>, icons/<icon key>[:<color>], or https://... URL"
2034
+ },
2035
+ "type": { "enum": ["normal", "danger"] },
2036
+ "behavior": { "enum": ["modal", "dynamic"] },
2037
+ "viewport": {
2038
+ "type": "object",
2039
+ "required": ["size"],
2040
+ "properties": { "size": { "enum": ["small", "medium", "large", "xlarge", "max", "fullscreen"] } }
2041
+ }
2042
+ },
2043
+ "additionalProperties": false
2044
+ },
2045
+ {
2046
+ "type": "object",
2047
+ "required": ["key", "title", "target"],
2048
+ "properties": {
2049
+ "key": { "type": "string" },
2050
+ "title": {
2051
+ "anyOf": [
2052
+ { "type": "string", "maxLength": 256 },
2053
+ { "type": "object", "required": ["i18n"], "properties": { "i18n": { "type": "string", "maxLength": 256 } } }
2054
+ ]
2055
+ },
2056
+ "target": { "type": "string", "const": "pcm:testhub:baseline:page" },
2057
+ "resource": { "type": "string", "mustBeInField": { "fieldName": "resources", "path": "key" } },
2058
+ "resolver": {
2059
+ "anyOf": [
2060
+ {
2061
+ "type": "object",
2062
+ "required": ["function"],
2063
+ "properties": { "function": { "type": "string", "mustBeInField": { "fieldName": "functions", "path": "key" } } },
2064
+ "additionalProperties": false
2065
+ },
2066
+ {
2067
+ "type": "object",
2068
+ "required": ["endpoint"],
2069
+ "properties": { "endpoint": { "type": "string", "mustBeInField": { "fieldName": "endpoints", "path": "key" } } },
2070
+ "additionalProperties": false
2071
+ }
2072
+ ]
2073
+ },
2074
+ "display": { "$ref": "ExtensionDisplayConditionsSchemaId" },
2075
+ "route": { "type": "string", "pattern": "^$|^(?!\\.{1,2}$)[a-z0-9-]{1,64}$" }
2076
+ },
2077
+ "additionalProperties": false
2078
+ },
2079
+ {
2080
+ "type": "object",
2081
+ "required": ["key", "target"],
2082
+ "properties": {
2083
+ "key": { "type": "string" },
2084
+ "title": {
2085
+ "anyOf": [
2086
+ { "type": "string", "maxLength": 256 },
2087
+ { "type": "object", "required": ["i18n"], "properties": { "i18n": { "type": "string", "maxLength": 256 } } }
2088
+ ]
2089
+ },
2090
+ "target": { "type": "string", "const": "pcm:testhub:library:background" },
2091
+ "resource": { "type": "string", "mustBeInField": { "fieldName": "resources", "path": "key" } },
2092
+ "resolver": {
2093
+ "anyOf": [
2094
+ {
2095
+ "type": "object",
2096
+ "required": ["function"],
2097
+ "properties": { "function": { "type": "string", "mustBeInField": { "fieldName": "functions", "path": "key" } } },
2098
+ "additionalProperties": false
2099
+ },
2100
+ {
2101
+ "type": "object",
2102
+ "required": ["endpoint"],
2103
+ "properties": { "endpoint": { "type": "string", "mustBeInField": { "fieldName": "endpoints", "path": "key" } } },
2104
+ "additionalProperties": false
2105
+ }
2106
+ ]
2107
+ },
2108
+ "display": { "$ref": "ExtensionDisplayConditionsSchemaId" }
2109
+ },
2110
+ "additionalProperties": false
2111
+ },
2112
+ {
2113
+ "type": "object",
2114
+ "required": ["key", "target", "pages"],
2115
+ "properties": {
2116
+ "key": { "type": "string" },
2117
+ "title": {
2118
+ "anyOf": [
2119
+ { "type": "string", "maxLength": 256 },
2120
+ { "type": "object", "required": ["i18n"], "properties": { "i18n": { "type": "string", "maxLength": 256 } } }
2121
+ ]
2122
+ },
2123
+ "target": { "type": "string", "const": "pcm:testhub:library:hub" },
2124
+ "resource": { "type": "string", "mustBeInField": { "fieldName": "resources", "path": "key" } },
2125
+ "resolver": {
2126
+ "anyOf": [
2127
+ {
2128
+ "type": "object",
2129
+ "required": ["function"],
2130
+ "properties": { "function": { "type": "string", "mustBeInField": { "fieldName": "functions", "path": "key" } } },
2131
+ "additionalProperties": false
2132
+ },
2133
+ {
2134
+ "type": "object",
2135
+ "required": ["endpoint"],
2136
+ "properties": { "endpoint": { "type": "string", "mustBeInField": { "fieldName": "endpoints", "path": "key" } } },
2137
+ "additionalProperties": false
2138
+ }
2139
+ ]
2140
+ },
2141
+ "display": { "$ref": "ExtensionDisplayConditionsSchemaId" },
2142
+ "pages": {
2143
+ "type": "array",
2144
+ "items": {
2145
+ "type": "object",
2146
+ "required": ["key", "title", "resource"],
2147
+ "properties": {
2148
+ "key": { "type": "string" },
2149
+ "title": {
2150
+ "anyOf": [
2151
+ { "type": "string", "maxLength": 256 },
2152
+ { "type": "object", "required": ["i18n"], "properties": { "i18n": { "type": "string", "maxLength": 256 } } }
2153
+ ]
2154
+ },
2155
+ "resource": { "type": "string", "mustBeInField": { "fieldName": "resources", "path": "key" } },
2156
+ "route": { "type": "string", "pattern": "^$|^(?!\\.{1,2}$)[a-z0-9-]{1,64}$" },
2157
+ "icon": {
2158
+ "anyOf": [
2159
+ {
2160
+ "type": "string",
2161
+ "pattern": "^resource:[a-zA-Z0-9_-]+/.+",
2162
+ "mustBeInField": { "fieldName": "resources", "path": "key", "extractPattern": {} }
2163
+ },
2164
+ { "type": "string", "pattern": "^icons/[a-zA-Z0-9_-]+(?::(#?[a-fA-F0-9]{3,8}|rgba\\([^)]+\\)))?$" },
2165
+ { "type": "string", "pattern": "^https?:\\/\\/.*" }
2166
+ ],
2167
+ "errorMessage": "must be one of: resource:<resource key>/<path>, icons/<icon key>[:<color>], or https://... URL"
2168
+ }
2169
+ }
2170
+ },
2171
+ "minItems": 1,
2172
+ "maxItems": 8,
2173
+ "uniqueItemProperty": ["key", "route"],
2174
+ "pageRouteValidate": true
2175
+ },
2176
+ "section": {
2177
+ "type": "object",
2178
+ "required": ["header", "enabled"],
2179
+ "properties": {
2180
+ "header": {
2181
+ "anyOf": [
2182
+ { "type": "string", "maxLength": 256 },
2183
+ { "type": "object", "required": ["i18n"], "properties": { "i18n": { "type": "string", "maxLength": 256 } } }
2184
+ ]
2185
+ },
2186
+ "enabled": { "type": "boolean" }
2187
+ }
2188
+ }
2189
+ },
2190
+ "additionalProperties": false
2191
+ },
2192
+ {
2193
+ "type": "object",
2194
+ "required": ["key", "title", "target"],
2195
+ "properties": {
2196
+ "key": { "type": "string" },
2197
+ "title": {
2198
+ "anyOf": [
2199
+ { "type": "string", "maxLength": 256 },
2200
+ { "type": "object", "required": ["i18n"], "properties": { "i18n": { "type": "string", "maxLength": 256 } } }
2201
+ ]
2202
+ },
2203
+ "target": { "type": "string", "const": "pcm:testhub:library:page" },
2204
+ "resource": { "type": "string", "mustBeInField": { "fieldName": "resources", "path": "key" } },
2205
+ "resolver": {
2206
+ "anyOf": [
2207
+ {
2208
+ "type": "object",
2209
+ "required": ["function"],
2210
+ "properties": { "function": { "type": "string", "mustBeInField": { "fieldName": "functions", "path": "key" } } },
2211
+ "additionalProperties": false
2212
+ },
2213
+ {
2214
+ "type": "object",
2215
+ "required": ["endpoint"],
2216
+ "properties": { "endpoint": { "type": "string", "mustBeInField": { "fieldName": "endpoints", "path": "key" } } },
2217
+ "additionalProperties": false
2218
+ }
2219
+ ]
2220
+ },
2221
+ "display": { "$ref": "ExtensionDisplayConditionsSchemaId" },
2222
+ "route": { "type": "string", "pattern": "^$|^(?!\\.{1,2}$)[a-z0-9-]{1,64}$" }
2223
+ },
2224
+ "additionalProperties": false
2225
+ },
2226
+ {
2227
+ "type": "object",
2228
+ "required": ["key", "target", "pages"],
2229
+ "properties": {
2230
+ "key": { "type": "string" },
2231
+ "title": {
2232
+ "anyOf": [
2233
+ { "type": "string", "maxLength": 256 },
2234
+ { "type": "object", "required": ["i18n"], "properties": { "i18n": { "type": "string", "maxLength": 256 } } }
2235
+ ]
2236
+ },
2237
+ "target": { "type": "string", "const": "pcm:testhub:library:setting" },
2238
+ "resource": { "type": "string", "mustBeInField": { "fieldName": "resources", "path": "key" } },
2239
+ "resolver": {
2240
+ "anyOf": [
2241
+ {
2242
+ "type": "object",
2243
+ "required": ["function"],
2244
+ "properties": { "function": { "type": "string", "mustBeInField": { "fieldName": "functions", "path": "key" } } },
2245
+ "additionalProperties": false
2246
+ },
2247
+ {
2248
+ "type": "object",
2249
+ "required": ["endpoint"],
2250
+ "properties": { "endpoint": { "type": "string", "mustBeInField": { "fieldName": "endpoints", "path": "key" } } },
2251
+ "additionalProperties": false
2252
+ }
2253
+ ]
2254
+ },
2255
+ "display": { "$ref": "ExtensionDisplayConditionsSchemaId" },
2256
+ "pages": {
2257
+ "type": "array",
2258
+ "items": {
2259
+ "type": "object",
2260
+ "required": ["key", "title", "resource"],
2261
+ "properties": {
2262
+ "key": { "type": "string" },
2263
+ "title": {
2264
+ "anyOf": [
2265
+ { "type": "string", "maxLength": 256 },
2266
+ { "type": "object", "required": ["i18n"], "properties": { "i18n": { "type": "string", "maxLength": 256 } } }
2267
+ ]
2268
+ },
2269
+ "resource": { "type": "string", "mustBeInField": { "fieldName": "resources", "path": "key" } },
2270
+ "route": { "type": "string", "pattern": "^$|^(?!\\.{1,2}$)[a-z0-9-]{1,64}$" }
2271
+ }
2272
+ },
2273
+ "minItems": 1,
2274
+ "maxItems": 8,
2275
+ "uniqueItemProperty": ["key", "route"],
2276
+ "pageRouteValidate": true
2277
+ },
2278
+ "section": {
2279
+ "type": "object",
2280
+ "required": ["header", "enabled"],
2281
+ "properties": {
2282
+ "header": {
2283
+ "anyOf": [
2284
+ { "type": "string", "maxLength": 256 },
2285
+ { "type": "object", "required": ["i18n"], "properties": { "i18n": { "type": "string", "maxLength": 256 } } }
2286
+ ]
2287
+ },
2288
+ "enabled": { "type": "boolean" }
2289
+ }
2290
+ }
2291
+ },
2292
+ "additionalProperties": false
2293
+ },
2294
+ {
2295
+ "type": "object",
2296
+ "required": ["key", "title", "target", "type", "behavior"],
2297
+ "properties": {
2298
+ "key": { "type": "string" },
2299
+ "title": {
2300
+ "anyOf": [
2301
+ { "type": "string", "maxLength": 256 },
2302
+ { "type": "object", "required": ["i18n"], "properties": { "i18n": { "type": "string", "maxLength": 256 } } }
2303
+ ]
2304
+ },
2305
+ "target": { "type": "string", "const": "pcm:testhub:plan:action" },
2306
+ "resource": { "type": "string", "mustBeInField": { "fieldName": "resources", "path": "key" } },
2307
+ "resolver": {
2308
+ "anyOf": [
2309
+ {
2310
+ "type": "object",
2311
+ "required": ["function"],
2312
+ "properties": { "function": { "type": "string", "mustBeInField": { "fieldName": "functions", "path": "key" } } },
2313
+ "additionalProperties": false
2314
+ },
2315
+ {
2316
+ "type": "object",
2317
+ "required": ["endpoint"],
2318
+ "properties": { "endpoint": { "type": "string", "mustBeInField": { "fieldName": "endpoints", "path": "key" } } },
2319
+ "additionalProperties": false
2320
+ }
2321
+ ]
2322
+ },
2323
+ "display": { "$ref": "ExtensionDisplayConditionsSchemaId" },
2324
+ "icon": {
2325
+ "anyOf": [
2326
+ {
2327
+ "type": "string",
2328
+ "pattern": "^resource:[a-zA-Z0-9_-]+/.+",
2329
+ "mustBeInField": { "fieldName": "resources", "path": "key", "extractPattern": {} }
2330
+ },
2331
+ { "type": "string", "pattern": "^icons/[a-zA-Z0-9_-]+(?::(#?[a-fA-F0-9]{3,8}|rgba\\([^)]+\\)))?$" },
2332
+ { "type": "string", "pattern": "^https?:\\/\\/.*" }
2333
+ ],
2334
+ "errorMessage": "must be one of: resource:<resource key>/<path>, icons/<icon key>[:<color>], or https://... URL"
2335
+ },
2336
+ "type": { "enum": ["normal", "danger"] },
2337
+ "behavior": { "enum": ["modal", "dynamic"] },
2338
+ "viewport": {
2339
+ "type": "object",
2340
+ "required": ["size"],
2341
+ "properties": { "size": { "enum": ["small", "medium", "large", "xlarge", "max", "fullscreen"] } }
2342
+ }
2343
+ },
2344
+ "additionalProperties": false
2345
+ },
2346
+ {
2347
+ "type": "object",
2348
+ "required": ["key", "title", "target"],
2349
+ "properties": {
2350
+ "key": { "type": "string" },
2351
+ "title": {
2352
+ "anyOf": [
2353
+ { "type": "string", "maxLength": 256 },
2354
+ { "type": "object", "required": ["i18n"], "properties": { "i18n": { "type": "string", "maxLength": 256 } } }
2355
+ ]
2356
+ },
2357
+ "target": { "type": "string", "const": "pcm:testhub:plan:page" },
2358
+ "resource": { "type": "string", "mustBeInField": { "fieldName": "resources", "path": "key" } },
2359
+ "resolver": {
2360
+ "anyOf": [
2361
+ {
2362
+ "type": "object",
2363
+ "required": ["function"],
2364
+ "properties": { "function": { "type": "string", "mustBeInField": { "fieldName": "functions", "path": "key" } } },
2365
+ "additionalProperties": false
2366
+ },
2367
+ {
2368
+ "type": "object",
2369
+ "required": ["endpoint"],
2370
+ "properties": { "endpoint": { "type": "string", "mustBeInField": { "fieldName": "endpoints", "path": "key" } } },
2371
+ "additionalProperties": false
2372
+ }
2373
+ ]
2374
+ },
2375
+ "display": { "$ref": "ExtensionDisplayConditionsSchemaId" },
2376
+ "route": { "type": "string", "pattern": "^$|^(?!\\.{1,2}$)[a-z0-9-]{1,64}$" }
2377
+ },
2378
+ "additionalProperties": false
2379
+ },
2380
+ {
2381
+ "type": "object",
2382
+ "required": ["key", "title", "target", "type", "behavior"],
2383
+ "properties": {
2384
+ "key": { "type": "string" },
2385
+ "title": {
2386
+ "anyOf": [
2387
+ { "type": "string", "maxLength": 256 },
2388
+ { "type": "object", "required": ["i18n"], "properties": { "i18n": { "type": "string", "maxLength": 256 } } }
2389
+ ]
2390
+ },
2391
+ "target": { "type": "string", "const": "pcm:testhub:testcase:action" },
2392
+ "resource": { "type": "string", "mustBeInField": { "fieldName": "resources", "path": "key" } },
2393
+ "resolver": {
2394
+ "anyOf": [
2395
+ {
2396
+ "type": "object",
2397
+ "required": ["function"],
2398
+ "properties": { "function": { "type": "string", "mustBeInField": { "fieldName": "functions", "path": "key" } } },
2399
+ "additionalProperties": false
2400
+ },
2401
+ {
2402
+ "type": "object",
2403
+ "required": ["endpoint"],
2404
+ "properties": { "endpoint": { "type": "string", "mustBeInField": { "fieldName": "endpoints", "path": "key" } } },
2405
+ "additionalProperties": false
2406
+ }
2407
+ ]
2408
+ },
2409
+ "display": { "$ref": "ExtensionDisplayConditionsSchemaId" },
2410
+ "icon": {
2411
+ "anyOf": [
2412
+ {
2413
+ "type": "string",
2414
+ "pattern": "^resource:[a-zA-Z0-9_-]+/.+",
2415
+ "mustBeInField": { "fieldName": "resources", "path": "key", "extractPattern": {} }
2416
+ },
2417
+ { "type": "string", "pattern": "^icons/[a-zA-Z0-9_-]+(?::(#?[a-fA-F0-9]{3,8}|rgba\\([^)]+\\)))?$" },
2418
+ { "type": "string", "pattern": "^https?:\\/\\/.*" }
2419
+ ],
2420
+ "errorMessage": "must be one of: resource:<resource key>/<path>, icons/<icon key>[:<color>], or https://... URL"
2421
+ },
2422
+ "type": { "enum": ["normal", "danger"] },
2423
+ "behavior": { "enum": ["modal", "dynamic"] },
2424
+ "viewport": {
2425
+ "type": "object",
2426
+ "required": ["size"],
2427
+ "properties": { "size": { "enum": ["small", "medium", "large", "xlarge", "max", "fullscreen"] } }
2428
+ }
2429
+ },
2430
+ "additionalProperties": false
2431
+ },
2432
+ {
2433
+ "type": "object",
2434
+ "required": ["key", "title", "target"],
2435
+ "properties": {
2436
+ "key": { "type": "string" },
2437
+ "title": {
2438
+ "anyOf": [
2439
+ { "type": "string", "maxLength": 256 },
2440
+ { "type": "object", "required": ["i18n"], "properties": { "i18n": { "type": "string", "maxLength": 256 } } }
2441
+ ]
2442
+ },
2443
+ "target": { "type": "string", "const": "pcm:testhub:testcase:area" },
2444
+ "resource": { "type": "string", "mustBeInField": { "fieldName": "resources", "path": "key" } },
2445
+ "resolver": {
2446
+ "anyOf": [
2447
+ {
2448
+ "type": "object",
2449
+ "required": ["function"],
2450
+ "properties": { "function": { "type": "string", "mustBeInField": { "fieldName": "functions", "path": "key" } } },
2451
+ "additionalProperties": false
2452
+ },
2453
+ {
2454
+ "type": "object",
2455
+ "required": ["endpoint"],
2456
+ "properties": { "endpoint": { "type": "string", "mustBeInField": { "fieldName": "endpoints", "path": "key" } } },
2457
+ "additionalProperties": false
2458
+ }
2459
+ ]
2460
+ },
2461
+ "display": { "$ref": "ExtensionDisplayConditionsSchemaId" }
2462
+ },
2463
+ "additionalProperties": false
2464
+ },
2465
+ {
2466
+ "type": "object",
2467
+ "required": ["key", "target"],
2468
+ "properties": {
2469
+ "key": { "type": "string" },
2470
+ "title": {
2471
+ "anyOf": [
2472
+ { "type": "string", "maxLength": 256 },
2473
+ { "type": "object", "required": ["i18n"], "properties": { "i18n": { "type": "string", "maxLength": 256 } } }
2474
+ ]
2475
+ },
2476
+ "target": { "type": "string", "const": "pcm:testhub:testcase:background" },
2477
+ "resource": { "type": "string", "mustBeInField": { "fieldName": "resources", "path": "key" } },
2478
+ "resolver": {
2479
+ "anyOf": [
2480
+ {
2481
+ "type": "object",
2482
+ "required": ["function"],
2483
+ "properties": { "function": { "type": "string", "mustBeInField": { "fieldName": "functions", "path": "key" } } },
2484
+ "additionalProperties": false
2485
+ },
2486
+ {
2487
+ "type": "object",
2488
+ "required": ["endpoint"],
2489
+ "properties": { "endpoint": { "type": "string", "mustBeInField": { "fieldName": "endpoints", "path": "key" } } },
2490
+ "additionalProperties": false
2491
+ }
2492
+ ]
2493
+ },
2494
+ "display": { "$ref": "ExtensionDisplayConditionsSchemaId" }
2495
+ },
2496
+ "additionalProperties": false
2497
+ },
2498
+ {
2499
+ "type": "object",
2500
+ "required": ["key", "title", "target"],
2501
+ "properties": {
2502
+ "key": { "type": "string" },
2503
+ "title": {
2504
+ "anyOf": [
2505
+ { "type": "string", "maxLength": 256 },
2506
+ { "type": "object", "required": ["i18n"], "properties": { "i18n": { "type": "string", "maxLength": 256 } } }
2507
+ ]
2508
+ },
2509
+ "target": { "type": "string", "const": "pcm:testhub:testcase:context" },
2510
+ "resource": { "type": "string", "mustBeInField": { "fieldName": "resources", "path": "key" } },
2511
+ "resolver": {
2512
+ "anyOf": [
2513
+ {
2514
+ "type": "object",
2515
+ "required": ["function"],
2516
+ "properties": { "function": { "type": "string", "mustBeInField": { "fieldName": "functions", "path": "key" } } },
2517
+ "additionalProperties": false
2518
+ },
2519
+ {
2520
+ "type": "object",
2521
+ "required": ["endpoint"],
2522
+ "properties": { "endpoint": { "type": "string", "mustBeInField": { "fieldName": "endpoints", "path": "key" } } },
2523
+ "additionalProperties": false
2524
+ }
2525
+ ]
2526
+ },
2527
+ "display": { "$ref": "ExtensionDisplayConditionsSchemaId" },
2528
+ "viewport": {
2529
+ "type": "object",
2530
+ "required": ["size"],
2531
+ "properties": { "size": { "enum": ["small", "medium", "large", "xlarge", "max"] } }
2532
+ }
2533
+ },
2534
+ "additionalProperties": false
2535
+ },
2536
+ {
2537
+ "type": "object",
2538
+ "required": ["key", "target", "entries"],
2539
+ "properties": {
2540
+ "key": { "type": "string" },
2541
+ "title": {
2542
+ "anyOf": [
2543
+ { "type": "string", "maxLength": 256 },
2544
+ { "type": "object", "required": ["i18n"], "properties": { "i18n": { "type": "string", "maxLength": 256 } } }
2545
+ ]
2546
+ },
2547
+ "target": { "type": "string", "const": "pcm:testhub:testcase:panel" },
2548
+ "resource": { "type": "string", "mustBeInField": { "fieldName": "resources", "path": "key" } },
2549
+ "resolver": {
2550
+ "anyOf": [
2551
+ {
2552
+ "type": "object",
2553
+ "required": ["function"],
2554
+ "properties": { "function": { "type": "string", "mustBeInField": { "fieldName": "functions", "path": "key" } } },
2555
+ "additionalProperties": false
2556
+ },
2557
+ {
2558
+ "type": "object",
2559
+ "required": ["endpoint"],
2560
+ "properties": { "endpoint": { "type": "string", "mustBeInField": { "fieldName": "endpoints", "path": "key" } } },
2561
+ "additionalProperties": false
2562
+ }
2563
+ ]
2564
+ },
2565
+ "display": { "$ref": "ExtensionDisplayConditionsSchemaId" },
2566
+ "entries": {
2567
+ "type": "array",
2568
+ "items": {
2569
+ "type": "object",
2570
+ "required": ["key", "title", "panel"],
2571
+ "properties": {
2572
+ "key": { "type": "string" },
2573
+ "title": {
2574
+ "anyOf": [
2575
+ { "type": "string", "maxLength": 256 },
2576
+ { "type": "object", "required": ["i18n"], "properties": { "i18n": { "type": "string", "maxLength": 256 } } }
2577
+ ]
2578
+ },
2579
+ "panel": {
2580
+ "type": "object",
2581
+ "required": ["resource"],
2582
+ "properties": { "resource": { "type": "string", "mustBeInField": { "fieldName": "resources", "path": "key" } } }
2583
+ }
2584
+ }
2585
+ },
2586
+ "minItems": 1,
2587
+ "maxItems": 8,
2588
+ "uniqueItemProperty": "key"
2589
+ },
2590
+ "section": {
2591
+ "type": "object",
2592
+ "required": ["header", "enabled"],
2593
+ "properties": {
2594
+ "header": {
2595
+ "anyOf": [
2596
+ { "type": "string", "maxLength": 256 },
2597
+ { "type": "object", "required": ["i18n"], "properties": { "i18n": { "type": "string", "maxLength": 256 } } }
2598
+ ]
2599
+ },
2600
+ "enabled": { "type": "boolean" }
2601
+ }
2602
+ }
2603
+ },
2604
+ "additionalProperties": false
2605
+ },
2606
+ {
2607
+ "type": "object",
2608
+ "required": ["key", "title", "target", "type", "behavior"],
2609
+ "properties": {
2610
+ "key": { "type": "string" },
2611
+ "title": {
2612
+ "anyOf": [
2613
+ { "type": "string", "maxLength": 256 },
2614
+ { "type": "object", "required": ["i18n"], "properties": { "i18n": { "type": "string", "maxLength": 256 } } }
2615
+ ]
2616
+ },
2617
+ "target": { "type": "string", "const": "pcm:wiki:baseline:action" },
2618
+ "resource": { "type": "string", "mustBeInField": { "fieldName": "resources", "path": "key" } },
2619
+ "resolver": {
2620
+ "anyOf": [
2621
+ {
2622
+ "type": "object",
2623
+ "required": ["function"],
2624
+ "properties": { "function": { "type": "string", "mustBeInField": { "fieldName": "functions", "path": "key" } } },
2625
+ "additionalProperties": false
2626
+ },
2627
+ {
2628
+ "type": "object",
2629
+ "required": ["endpoint"],
2630
+ "properties": { "endpoint": { "type": "string", "mustBeInField": { "fieldName": "endpoints", "path": "key" } } },
2631
+ "additionalProperties": false
2632
+ }
2633
+ ]
2634
+ },
2635
+ "display": { "$ref": "ExtensionDisplayConditionsSchemaId" },
2636
+ "icon": {
2637
+ "anyOf": [
2638
+ {
2639
+ "type": "string",
2640
+ "pattern": "^resource:[a-zA-Z0-9_-]+/.+",
2641
+ "mustBeInField": { "fieldName": "resources", "path": "key", "extractPattern": {} }
2642
+ },
2643
+ { "type": "string", "pattern": "^icons/[a-zA-Z0-9_-]+(?::(#?[a-fA-F0-9]{3,8}|rgba\\([^)]+\\)))?$" },
2644
+ { "type": "string", "pattern": "^https?:\\/\\/.*" }
2645
+ ],
2646
+ "errorMessage": "must be one of: resource:<resource key>/<path>, icons/<icon key>[:<color>], or https://... URL"
2647
+ },
2648
+ "type": { "enum": ["normal", "danger"] },
2649
+ "behavior": { "enum": ["modal", "dynamic"] },
2650
+ "viewport": {
2651
+ "type": "object",
2652
+ "required": ["size"],
2653
+ "properties": { "size": { "enum": ["small", "medium", "large", "xlarge", "max", "fullscreen"] } }
2654
+ }
2655
+ },
2656
+ "additionalProperties": false
2657
+ },
2658
+ {
2659
+ "type": "object",
2660
+ "required": ["key", "title", "target"],
2661
+ "properties": {
2662
+ "key": { "type": "string" },
2663
+ "title": {
2664
+ "anyOf": [
2665
+ { "type": "string", "maxLength": 256 },
2666
+ { "type": "object", "required": ["i18n"], "properties": { "i18n": { "type": "string", "maxLength": 256 } } }
2667
+ ]
2668
+ },
2669
+ "target": { "type": "string", "const": "pcm:wiki:baseline:page" },
2670
+ "resource": { "type": "string", "mustBeInField": { "fieldName": "resources", "path": "key" } },
2671
+ "resolver": {
2672
+ "anyOf": [
2673
+ {
2674
+ "type": "object",
2675
+ "required": ["function"],
2676
+ "properties": { "function": { "type": "string", "mustBeInField": { "fieldName": "functions", "path": "key" } } },
2677
+ "additionalProperties": false
2678
+ },
2679
+ {
2680
+ "type": "object",
2681
+ "required": ["endpoint"],
2682
+ "properties": { "endpoint": { "type": "string", "mustBeInField": { "fieldName": "endpoints", "path": "key" } } },
2683
+ "additionalProperties": false
2684
+ }
2685
+ ]
2686
+ },
2687
+ "display": { "$ref": "ExtensionDisplayConditionsSchemaId" },
2688
+ "route": { "type": "string", "pattern": "^$|^(?!\\.{1,2}$)[a-z0-9-]{1,64}$" }
2689
+ },
2690
+ "additionalProperties": false
2691
+ },
2692
+ {
2693
+ "type": "object",
2694
+ "required": ["key", "target", "behavior"],
2695
+ "properties": {
2696
+ "key": { "type": "string" },
2697
+ "title": {
2698
+ "anyOf": [
2699
+ { "type": "string", "maxLength": 256 },
2700
+ { "type": "object", "required": ["i18n"], "properties": { "i18n": { "type": "string", "maxLength": 256 } } }
2701
+ ]
2702
+ },
2703
+ "target": { "type": "string", "const": "pcm:wiki:context:action" },
2704
+ "resource": { "type": "string", "mustBeInField": { "fieldName": "resources", "path": "key" } },
2705
+ "resolver": {
2706
+ "anyOf": [
2707
+ {
2708
+ "type": "object",
2709
+ "required": ["function"],
2710
+ "properties": { "function": { "type": "string", "mustBeInField": { "fieldName": "functions", "path": "key" } } },
2711
+ "additionalProperties": false
2712
+ },
2713
+ {
2714
+ "type": "object",
2715
+ "required": ["endpoint"],
2716
+ "properties": { "endpoint": { "type": "string", "mustBeInField": { "fieldName": "endpoints", "path": "key" } } },
2717
+ "additionalProperties": false
2718
+ }
2719
+ ]
2720
+ },
2721
+ "display": { "$ref": "ExtensionDisplayConditionsSchemaId" },
2722
+ "icon": {
2723
+ "anyOf": [
2724
+ {
2725
+ "type": "string",
2726
+ "pattern": "^resource:[a-zA-Z0-9_-]+/.+",
2727
+ "mustBeInField": { "fieldName": "resources", "path": "key", "extractPattern": {} }
2728
+ },
2729
+ { "type": "string", "pattern": "^icons/[a-zA-Z0-9_-]+(?::(#?[a-fA-F0-9]{3,8}|rgba\\([^)]+\\)))?$" },
2730
+ { "type": "string", "pattern": "^https?:\\/\\/.*" }
2731
+ ],
2732
+ "errorMessage": "must be one of: resource:<resource key>/<path>, icons/<icon key>[:<color>], or https://... URL"
2733
+ },
2734
+ "behavior": { "enum": ["modal", "dynamic"] }
2735
+ },
2736
+ "additionalProperties": false
2737
+ },
2738
+ {
2739
+ "type": "object",
2740
+ "required": ["key", "title", "target", "behavior"],
2741
+ "properties": {
2742
+ "key": { "type": "string" },
2743
+ "title": {
2744
+ "anyOf": [
2745
+ { "type": "string", "maxLength": 256 },
2746
+ { "type": "object", "required": ["i18n"], "properties": { "i18n": { "type": "string", "maxLength": 256 } } }
2747
+ ]
2748
+ },
2749
+ "target": { "type": "string", "const": "pcm:wiki:document:block" },
2750
+ "resource": { "type": "string", "mustBeInField": { "fieldName": "resources", "path": "key" } },
2751
+ "resolver": {
2752
+ "anyOf": [
2753
+ {
2754
+ "type": "object",
2755
+ "required": ["function"],
2756
+ "properties": { "function": { "type": "string", "mustBeInField": { "fieldName": "functions", "path": "key" } } },
2757
+ "additionalProperties": false
2758
+ },
2759
+ {
2760
+ "type": "object",
2761
+ "required": ["endpoint"],
2762
+ "properties": { "endpoint": { "type": "string", "mustBeInField": { "fieldName": "endpoints", "path": "key" } } },
2763
+ "additionalProperties": false
2764
+ }
2765
+ ]
2766
+ },
2767
+ "display": { "$ref": "ExtensionDisplayConditionsSchemaId" },
2768
+ "icon": {
2769
+ "anyOf": [
2770
+ {
2771
+ "type": "string",
2772
+ "pattern": "^resource:[a-zA-Z0-9_-]+/.+",
2773
+ "mustBeInField": { "fieldName": "resources", "path": "key", "extractPattern": {} }
2774
+ },
2775
+ { "type": "string", "pattern": "^icons/[a-zA-Z0-9_-]+(?::(#?[a-fA-F0-9]{3,8}|rgba\\([^)]+\\)))?$" },
2776
+ { "type": "string", "pattern": "^https?:\\/\\/.*" }
2777
+ ],
2778
+ "errorMessage": "must be one of: resource:<resource key>/<path>, icons/<icon key>[:<color>], or https://... URL"
2779
+ },
2780
+ "behavior": { "enum": ["modal", "dynamic"] },
2781
+ "emitReadyEvent": { "type": "boolean" },
2782
+ "edit": {
2783
+ "type": "object",
2784
+ "required": ["resource"],
2785
+ "properties": {
2786
+ "icon": {
2787
+ "anyOf": [
2788
+ {
2789
+ "type": "string",
2790
+ "pattern": "^resource:[a-zA-Z0-9_-]+/.+",
2791
+ "mustBeInField": { "fieldName": "resources", "path": "key", "extractPattern": {} }
2792
+ },
2793
+ { "type": "string", "pattern": "^icons/[a-zA-Z0-9_-]+(?::(#?[a-fA-F0-9]{3,8}|rgba\\([^)]+\\)))?$" },
2794
+ { "type": "string", "pattern": "^https?:\\/\\/.*" }
2795
+ ],
2796
+ "errorMessage": "must be one of: resource:<resource key>/<path>, icons/<icon key>[:<color>], or https://... URL"
2797
+ },
2798
+ "title": {
2799
+ "anyOf": [
2800
+ { "type": "string", "maxLength": 256 },
2801
+ { "type": "object", "required": ["i18n"], "properties": { "i18n": { "type": "string", "maxLength": 256 } } }
2802
+ ]
2803
+ },
2804
+ "resource": { "type": "string", "mustBeInField": { "fieldName": "resources", "path": "key" } },
2805
+ "viewport": {
2806
+ "type": "object",
2807
+ "required": ["size"],
2808
+ "properties": { "size": { "enum": ["small", "medium", "large", "xlarge", "max", "fullscreen"] } }
2809
+ },
2810
+ "openOnInsert": { "type": "boolean" }
2811
+ }
2812
+ },
2813
+ "fullscreen": {
2814
+ "type": "object",
2815
+ "required": ["resource"],
2816
+ "properties": { "resource": { "type": "string", "mustBeInField": { "fieldName": "resources", "path": "key" } } }
2817
+ }
2818
+ },
2819
+ "additionalProperties": false
2820
+ },
2821
+ {
2822
+ "type": "object",
2823
+ "required": ["key", "title", "target", "type", "behavior"],
2824
+ "properties": {
2825
+ "key": { "type": "string" },
2826
+ "title": {
2827
+ "anyOf": [
2828
+ { "type": "string", "maxLength": 256 },
2829
+ { "type": "object", "required": ["i18n"], "properties": { "i18n": { "type": "string", "maxLength": 256 } } }
2830
+ ]
2831
+ },
2832
+ "target": { "type": "string", "const": "pcm:wiki:page:action" },
2833
+ "resource": { "type": "string", "mustBeInField": { "fieldName": "resources", "path": "key" } },
2834
+ "resolver": {
2835
+ "anyOf": [
2836
+ {
2837
+ "type": "object",
2838
+ "required": ["function"],
2839
+ "properties": { "function": { "type": "string", "mustBeInField": { "fieldName": "functions", "path": "key" } } },
2840
+ "additionalProperties": false
2841
+ },
2842
+ {
2843
+ "type": "object",
2844
+ "required": ["endpoint"],
2845
+ "properties": { "endpoint": { "type": "string", "mustBeInField": { "fieldName": "endpoints", "path": "key" } } },
2846
+ "additionalProperties": false
2847
+ }
2848
+ ]
2849
+ },
2850
+ "display": { "$ref": "ExtensionDisplayConditionsSchemaId" },
2851
+ "icon": {
2852
+ "anyOf": [
2853
+ {
2854
+ "type": "string",
2855
+ "pattern": "^resource:[a-zA-Z0-9_-]+/.+",
2856
+ "mustBeInField": { "fieldName": "resources", "path": "key", "extractPattern": {} }
2857
+ },
2858
+ { "type": "string", "pattern": "^icons/[a-zA-Z0-9_-]+(?::(#?[a-fA-F0-9]{3,8}|rgba\\([^)]+\\)))?$" },
2859
+ { "type": "string", "pattern": "^https?:\\/\\/.*" }
2860
+ ],
2861
+ "errorMessage": "must be one of: resource:<resource key>/<path>, icons/<icon key>[:<color>], or https://... URL"
2862
+ },
2863
+ "type": { "enum": ["normal", "danger"] },
2864
+ "behavior": { "enum": ["modal", "dynamic"] },
2865
+ "viewport": {
2866
+ "type": "object",
2867
+ "required": ["size"],
2868
+ "properties": { "size": { "enum": ["small", "medium", "large", "xlarge", "max", "fullscreen"] } }
2869
+ }
2870
+ },
2871
+ "additionalProperties": false
2872
+ },
2873
+ {
2874
+ "type": "object",
2875
+ "required": ["key", "target"],
2876
+ "properties": {
2877
+ "key": { "type": "string" },
2878
+ "title": {
2879
+ "anyOf": [
2880
+ { "type": "string", "maxLength": 256 },
2881
+ { "type": "object", "required": ["i18n"], "properties": { "i18n": { "type": "string", "maxLength": 256 } } }
2882
+ ]
2883
+ },
2884
+ "target": { "type": "string", "const": "pcm:wiki:page:background" },
2885
+ "resource": { "type": "string", "mustBeInField": { "fieldName": "resources", "path": "key" } },
2886
+ "resolver": {
2887
+ "anyOf": [
2888
+ {
2889
+ "type": "object",
2890
+ "required": ["function"],
2891
+ "properties": { "function": { "type": "string", "mustBeInField": { "fieldName": "functions", "path": "key" } } },
2892
+ "additionalProperties": false
2893
+ },
2894
+ {
2895
+ "type": "object",
2896
+ "required": ["endpoint"],
2897
+ "properties": { "endpoint": { "type": "string", "mustBeInField": { "fieldName": "endpoints", "path": "key" } } },
2898
+ "additionalProperties": false
2899
+ }
2900
+ ]
2901
+ },
2902
+ "display": { "$ref": "ExtensionDisplayConditionsSchemaId" }
2903
+ },
2904
+ "additionalProperties": false
2905
+ },
2906
+ {
2907
+ "type": "object",
2908
+ "required": ["key", "target"],
2909
+ "properties": {
2910
+ "key": { "type": "string" },
2911
+ "title": {
2912
+ "anyOf": [
2913
+ { "type": "string", "maxLength": 256 },
2914
+ { "type": "object", "required": ["i18n"], "properties": { "i18n": { "type": "string", "maxLength": 256 } } }
2915
+ ]
2916
+ },
2917
+ "target": { "type": "string", "const": "pcm:wiki:space:background" },
2918
+ "resource": { "type": "string", "mustBeInField": { "fieldName": "resources", "path": "key" } },
2919
+ "resolver": {
2920
+ "anyOf": [
2921
+ {
2922
+ "type": "object",
2923
+ "required": ["function"],
2924
+ "properties": { "function": { "type": "string", "mustBeInField": { "fieldName": "functions", "path": "key" } } },
2925
+ "additionalProperties": false
2926
+ },
2927
+ {
2928
+ "type": "object",
2929
+ "required": ["endpoint"],
2930
+ "properties": { "endpoint": { "type": "string", "mustBeInField": { "fieldName": "endpoints", "path": "key" } } },
2931
+ "additionalProperties": false
2932
+ }
2933
+ ]
2934
+ },
2935
+ "display": { "$ref": "ExtensionDisplayConditionsSchemaId" }
2936
+ },
2937
+ "additionalProperties": false
2938
+ },
2939
+ {
2940
+ "type": "object",
2941
+ "required": ["key", "target", "pages"],
2942
+ "properties": {
2943
+ "key": { "type": "string" },
2944
+ "title": {
2945
+ "anyOf": [
2946
+ { "type": "string", "maxLength": 256 },
2947
+ { "type": "object", "required": ["i18n"], "properties": { "i18n": { "type": "string", "maxLength": 256 } } }
2948
+ ]
2949
+ },
2950
+ "target": { "type": "string", "const": "pcm:wiki:space:hub" },
2951
+ "resource": { "type": "string", "mustBeInField": { "fieldName": "resources", "path": "key" } },
2952
+ "resolver": {
2953
+ "anyOf": [
2954
+ {
2955
+ "type": "object",
2956
+ "required": ["function"],
2957
+ "properties": { "function": { "type": "string", "mustBeInField": { "fieldName": "functions", "path": "key" } } },
2958
+ "additionalProperties": false
2959
+ },
2960
+ {
2961
+ "type": "object",
2962
+ "required": ["endpoint"],
2963
+ "properties": { "endpoint": { "type": "string", "mustBeInField": { "fieldName": "endpoints", "path": "key" } } },
2964
+ "additionalProperties": false
2965
+ }
2966
+ ]
2967
+ },
2968
+ "display": { "$ref": "ExtensionDisplayConditionsSchemaId" },
2969
+ "pages": {
2970
+ "type": "array",
2971
+ "items": {
2972
+ "type": "object",
2973
+ "required": ["key", "title", "resource"],
2974
+ "properties": {
2975
+ "key": { "type": "string" },
2976
+ "title": {
2977
+ "anyOf": [
2978
+ { "type": "string", "maxLength": 256 },
2979
+ { "type": "object", "required": ["i18n"], "properties": { "i18n": { "type": "string", "maxLength": 256 } } }
2980
+ ]
2981
+ },
2982
+ "resource": { "type": "string", "mustBeInField": { "fieldName": "resources", "path": "key" } },
2983
+ "route": { "type": "string", "pattern": "^$|^(?!\\.{1,2}$)[a-z0-9-]{1,64}$" },
2984
+ "icon": {
2985
+ "anyOf": [
2986
+ {
2987
+ "type": "string",
2988
+ "pattern": "^resource:[a-zA-Z0-9_-]+/.+",
2989
+ "mustBeInField": { "fieldName": "resources", "path": "key", "extractPattern": {} }
2990
+ },
2991
+ { "type": "string", "pattern": "^icons/[a-zA-Z0-9_-]+(?::(#?[a-fA-F0-9]{3,8}|rgba\\([^)]+\\)))?$" },
2992
+ { "type": "string", "pattern": "^https?:\\/\\/.*" }
2993
+ ],
2994
+ "errorMessage": "must be one of: resource:<resource key>/<path>, icons/<icon key>[:<color>], or https://... URL"
2995
+ }
2996
+ }
2997
+ },
2998
+ "minItems": 1,
2999
+ "maxItems": 8,
3000
+ "uniqueItemProperty": ["key", "route"],
3001
+ "pageRouteValidate": true
3002
+ },
3003
+ "section": {
3004
+ "type": "object",
3005
+ "required": ["header", "enabled"],
3006
+ "properties": {
3007
+ "header": {
3008
+ "anyOf": [
3009
+ { "type": "string", "maxLength": 256 },
3010
+ { "type": "object", "required": ["i18n"], "properties": { "i18n": { "type": "string", "maxLength": 256 } } }
3011
+ ]
3012
+ },
3013
+ "enabled": { "type": "boolean" }
3014
+ }
3015
+ }
3016
+ },
3017
+ "additionalProperties": false
3018
+ },
3019
+ {
3020
+ "type": "object",
3021
+ "required": ["key", "title", "target"],
3022
+ "properties": {
3023
+ "key": { "type": "string" },
3024
+ "title": {
3025
+ "anyOf": [
3026
+ { "type": "string", "maxLength": 256 },
3027
+ { "type": "object", "required": ["i18n"], "properties": { "i18n": { "type": "string", "maxLength": 256 } } }
3028
+ ]
3029
+ },
3030
+ "target": { "type": "string", "const": "pcm:wiki:space:page" },
3031
+ "resource": { "type": "string", "mustBeInField": { "fieldName": "resources", "path": "key" } },
3032
+ "resolver": {
3033
+ "anyOf": [
3034
+ {
3035
+ "type": "object",
3036
+ "required": ["function"],
3037
+ "properties": { "function": { "type": "string", "mustBeInField": { "fieldName": "functions", "path": "key" } } },
3038
+ "additionalProperties": false
3039
+ },
3040
+ {
3041
+ "type": "object",
3042
+ "required": ["endpoint"],
3043
+ "properties": { "endpoint": { "type": "string", "mustBeInField": { "fieldName": "endpoints", "path": "key" } } },
3044
+ "additionalProperties": false
3045
+ }
3046
+ ]
3047
+ },
3048
+ "display": { "$ref": "ExtensionDisplayConditionsSchemaId" },
3049
+ "route": { "type": "string", "pattern": "^$|^(?!\\.{1,2}$)[a-z0-9-]{1,64}$" }
3050
+ },
3051
+ "additionalProperties": false
3052
+ },
3053
+ {
3054
+ "type": "object",
3055
+ "required": ["key", "target", "pages"],
3056
+ "properties": {
3057
+ "key": { "type": "string" },
3058
+ "title": {
3059
+ "anyOf": [
3060
+ { "type": "string", "maxLength": 256 },
3061
+ { "type": "object", "required": ["i18n"], "properties": { "i18n": { "type": "string", "maxLength": 256 } } }
3062
+ ]
3063
+ },
3064
+ "target": { "type": "string", "const": "pcm:wiki:space:setting" },
3065
+ "resource": { "type": "string", "mustBeInField": { "fieldName": "resources", "path": "key" } },
3066
+ "resolver": {
3067
+ "anyOf": [
3068
+ {
3069
+ "type": "object",
3070
+ "required": ["function"],
3071
+ "properties": { "function": { "type": "string", "mustBeInField": { "fieldName": "functions", "path": "key" } } },
3072
+ "additionalProperties": false
3073
+ },
3074
+ {
3075
+ "type": "object",
3076
+ "required": ["endpoint"],
3077
+ "properties": { "endpoint": { "type": "string", "mustBeInField": { "fieldName": "endpoints", "path": "key" } } },
3078
+ "additionalProperties": false
3079
+ }
3080
+ ]
3081
+ },
3082
+ "display": { "$ref": "ExtensionDisplayConditionsSchemaId" },
3083
+ "pages": {
3084
+ "type": "array",
3085
+ "items": {
3086
+ "type": "object",
3087
+ "required": ["key", "title", "resource"],
3088
+ "properties": {
3089
+ "key": { "type": "string" },
3090
+ "title": {
3091
+ "anyOf": [
3092
+ { "type": "string", "maxLength": 256 },
3093
+ { "type": "object", "required": ["i18n"], "properties": { "i18n": { "type": "string", "maxLength": 256 } } }
3094
+ ]
3095
+ },
3096
+ "resource": { "type": "string", "mustBeInField": { "fieldName": "resources", "path": "key" } },
3097
+ "route": { "type": "string", "pattern": "^$|^(?!\\.{1,2}$)[a-z0-9-]{1,64}$" }
3098
+ }
3099
+ },
3100
+ "minItems": 1,
3101
+ "maxItems": 8,
3102
+ "uniqueItemProperty": ["key", "route"],
3103
+ "pageRouteValidate": true
3104
+ },
3105
+ "section": {
3106
+ "type": "object",
3107
+ "required": ["header", "enabled"],
3108
+ "properties": {
3109
+ "header": {
3110
+ "anyOf": [
3111
+ { "type": "string", "maxLength": 256 },
3112
+ { "type": "object", "required": ["i18n"], "properties": { "i18n": { "type": "string", "maxLength": 256 } } }
3113
+ ]
3114
+ },
3115
+ "enabled": { "type": "boolean" }
3116
+ }
3117
+ }
3118
+ },
3119
+ "additionalProperties": false
3120
+ }
3121
+ ]
3122
+ },
3123
+ "minItems": 1,
3124
+ "maxItems": 128,
3125
+ "pageExtensionsRouteValidate": true,
3126
+ "uniqueItemProperty": ["key", "route"],
3127
+ "maxItemsByField": { "field": "target", "limits": { "pcm:global:app:hub": 1 }, "defaultLimit": 8 }
3128
+ },
3129
+ "event": {
3130
+ "type": "object",
3131
+ "properties": {
3132
+ "triggers": {
3133
+ "type": "array",
3134
+ "items": {
3135
+ "anyOf": [
3136
+ {
3137
+ "type": "object",
3138
+ "required": ["key", "type", "events", "handler"],
3139
+ "properties": {
3140
+ "key": { "type": "string", "pattern": "^[a-zA-Z][a-zA-Z0-9_-]*$", "minLength": 1, "maxLength": 256 },
3141
+ "type": { "type": "string", "const": "app" },
3142
+ "events": {
3143
+ "type": "array",
3144
+ "items": {
3145
+ "type": "string",
3146
+ "pattern": "^nae:app:([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}):([a-zA-Z][a-zA-Z0-9_-]*)$",
3147
+ "examples": ["nae:app:466d303d-a2c4-4ec4-ad7c-5435be94583b:order-completed"]
3148
+ },
3149
+ "minItems": 1
3150
+ },
3151
+ "handler": {
3152
+ "anyOf": [
3153
+ {
3154
+ "type": "object",
3155
+ "required": ["function"],
3156
+ "properties": { "function": { "type": "string", "mustBeInField": { "fieldName": "functions", "path": "key" } } },
3157
+ "additionalProperties": false
3158
+ },
3159
+ {
3160
+ "type": "object",
3161
+ "required": ["endpoint"],
3162
+ "properties": { "endpoint": { "type": "string", "mustBeInField": { "fieldName": "endpoints", "path": "key" } } },
3163
+ "additionalProperties": false
3164
+ }
3165
+ ]
3166
+ }
3167
+ },
3168
+ "additionalProperties": false
3169
+ },
3170
+ {
3171
+ "type": "object",
3172
+ "required": ["key", "type", "events", "handler"],
3173
+ "properties": {
3174
+ "key": { "type": "string", "pattern": "^[a-zA-Z][a-zA-Z0-9_-]*$", "minLength": 1, "maxLength": 256 },
3175
+ "type": { "type": "string", "const": "lifecycle" },
3176
+ "events": {
3177
+ "type": "array",
3178
+ "items": { "enum": ["pce:nexus:app:install", "pce:nexus:app:upgrade", "pce:nexus:app:uninstall"] },
3179
+ "minItems": 1
3180
+ },
3181
+ "handler": {
3182
+ "anyOf": [
3183
+ {
3184
+ "type": "object",
3185
+ "required": ["function"],
3186
+ "properties": { "function": { "type": "string", "mustBeInField": { "fieldName": "functions", "path": "key" } } },
3187
+ "additionalProperties": false
3188
+ },
3189
+ {
3190
+ "type": "object",
3191
+ "required": ["endpoint"],
3192
+ "properties": { "endpoint": { "type": "string", "mustBeInField": { "fieldName": "endpoints", "path": "key" } } },
3193
+ "additionalProperties": false
3194
+ }
3195
+ ]
3196
+ }
3197
+ },
3198
+ "additionalProperties": false
3199
+ },
3200
+ {
3201
+ "type": "object",
3202
+ "required": ["key", "type", "handler", "interval"],
3203
+ "properties": {
3204
+ "key": { "type": "string", "pattern": "^[a-zA-Z][a-zA-Z0-9_-]*$", "minLength": 1, "maxLength": 256 },
3205
+ "type": { "type": "string", "const": "scheduled" },
3206
+ "handler": {
3207
+ "anyOf": [
3208
+ {
3209
+ "type": "object",
3210
+ "required": ["function"],
3211
+ "properties": { "function": { "type": "string", "mustBeInField": { "fieldName": "functions", "path": "key" } } },
3212
+ "additionalProperties": false
3213
+ },
3214
+ {
3215
+ "type": "object",
3216
+ "required": ["endpoint"],
3217
+ "properties": { "endpoint": { "type": "string", "mustBeInField": { "fieldName": "endpoints", "path": "key" } } },
3218
+ "additionalProperties": false
3219
+ }
3220
+ ]
3221
+ },
3222
+ "interval": { "enum": ["tenMinute", "hour", "day", "week"] },
3223
+ "timeout": { "type": "integer", "minimum": 60 }
3224
+ },
3225
+ "additionalProperties": false
3226
+ },
3227
+ {
3228
+ "type": "object",
3229
+ "required": ["key", "type", "events", "handler"],
3230
+ "properties": {
3231
+ "key": { "type": "string", "pattern": "^[a-zA-Z][a-zA-Z0-9_-]*$", "minLength": 1, "maxLength": 256 },
3232
+ "type": { "type": "string", "const": "system" },
3233
+ "events": {
3234
+ "type": "array",
3235
+ "items": {
3236
+ "enum": [
3237
+ "pce:pjm:workitem:created",
3238
+ "pce:pjm:workitem:viewed",
3239
+ "pce:pjm:workitem:updated",
3240
+ "pce:pjm:workitem:deleted",
3241
+ "pce:pjm:workitem:comment:created",
3242
+ "pce:pjm:workitem:comment:deleted",
3243
+ "pce:pjm:workitem:comment:updated",
3244
+ "pce:pjm:workitem:link:added",
3245
+ "pce:pjm:workitem:link:removed",
3246
+ "pce:pjm:configuration:workitemtype:created",
3247
+ "pce:pjm:project:created",
3248
+ "pce:pjm:project:updated",
3249
+ "pce:pjm:project:deleted",
3250
+ "pce:pjm:configuration:field:created",
3251
+ "pce:testhub:testcase:created",
3252
+ "pce:testhub:testcase:comment:created"
3253
+ ]
3254
+ },
3255
+ "minItems": 1
3256
+ },
3257
+ "handler": {
3258
+ "anyOf": [
3259
+ {
3260
+ "type": "object",
3261
+ "required": ["function"],
3262
+ "properties": { "function": { "type": "string", "mustBeInField": { "fieldName": "functions", "path": "key" } } },
3263
+ "additionalProperties": false
3264
+ },
3265
+ {
3266
+ "type": "object",
3267
+ "required": ["endpoint"],
3268
+ "properties": { "endpoint": { "type": "string", "mustBeInField": { "fieldName": "endpoints", "path": "key" } } },
3269
+ "additionalProperties": false
3270
+ }
3271
+ ]
3272
+ },
3273
+ "filter": { "type": "object", "properties": { "ignoreSelf": { "type": "boolean" }, "expression": { "type": "string" } } }
3274
+ },
3275
+ "additionalProperties": false
3276
+ },
3277
+ {
3278
+ "type": "object",
3279
+ "required": ["key", "type", "handler"],
3280
+ "properties": {
3281
+ "key": { "type": "string", "pattern": "^[a-zA-Z][a-zA-Z0-9_-]*$", "minLength": 1, "maxLength": 256 },
3282
+ "type": { "type": "string", "const": "webhook" },
3283
+ "handler": {
3284
+ "type": "object",
3285
+ "required": ["function"],
3286
+ "properties": { "function": { "type": "string", "mustBeInField": { "fieldName": "functions", "path": "key" } } },
3287
+ "additionalProperties": false
3288
+ }
3289
+ },
3290
+ "additionalProperties": false
3291
+ }
3292
+ ]
3293
+ },
3294
+ "uniqueItemProperty": "key",
3295
+ "maxItems": 128
3296
+ },
3297
+ "registries": {
3298
+ "type": "array",
3299
+ "items": {
3300
+ "type": "object",
3301
+ "required": ["key", "name"],
3302
+ "properties": {
3303
+ "key": { "type": "string", "pattern": "^[a-zA-Z][a-zA-Z0-9_-]*$", "minLength": 1, "maxLength": 256 },
3304
+ "name": { "type": "string", "minLength": 1, "maxLength": 64 },
3305
+ "allowedRecipients": {
3306
+ "type": "array",
3307
+ "items": {
3308
+ "anyOf": [
3309
+ { "type": "string", "const": "*" },
3310
+ {
3311
+ "type": "string",
3312
+ "pattern": "^app:[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$",
3313
+ "examples": ["app:466d303d-a2c4-4ec4-ad7c-5435be94583b"]
3314
+ }
3315
+ ]
3316
+ },
3317
+ "minItems": 1
3318
+ }
3319
+ },
3320
+ "additionalProperties": false
3321
+ },
3322
+ "uniqueItemProperty": "key",
3323
+ "maxItems": 32
3324
+ }
3325
+ },
3326
+ "additionalProperties": false
3327
+ },
3328
+ "async": {
3329
+ "type": "object",
3330
+ "properties": {
3331
+ "queues": {
3332
+ "type": "array",
3333
+ "items": {
3334
+ "type": "object",
3335
+ "required": ["key"],
3336
+ "properties": { "key": { "type": "string", "pattern": "^[a-zA-Z][a-zA-Z0-9_-]*$", "minLength": 1, "maxLength": 256 } },
3337
+ "additionalProperties": false
3338
+ },
3339
+ "uniqueItemProperty": "key",
3340
+ "maxItems": 32
3341
+ },
3342
+ "consumers": {
3343
+ "type": "array",
3344
+ "items": {
3345
+ "type": "object",
3346
+ "required": ["key", "queue", "handler"],
3347
+ "properties": {
3348
+ "key": { "type": "string", "pattern": "^[a-zA-Z][a-zA-Z0-9_-]*$", "minLength": 1, "maxLength": 256 },
3349
+ "queue": { "type": "string", "mustBeInField": { "fieldName": "async.queues", "path": "key" } },
3350
+ "handler": {
3351
+ "type": "object",
3352
+ "required": ["function"],
3353
+ "properties": { "function": { "type": "string", "mustBeInField": { "fieldName": "functions", "path": "key" } } },
3354
+ "additionalProperties": false
3355
+ },
3356
+ "concurrency": { "type": "integer", "minimum": 1, "maximum": 8 }
3357
+ },
3358
+ "additionalProperties": false
3359
+ },
3360
+ "uniqueItemProperty": "key",
3361
+ "maxItemsByField": { "field": "queue", "defaultLimit": 8 }
3362
+ }
3363
+ },
3364
+ "additionalProperties": false
3365
+ },
3366
+ "resources": {
3367
+ "type": "array",
3368
+ "items": {
3369
+ "type": "object",
3370
+ "required": ["key", "path"],
3371
+ "properties": {
3372
+ "key": { "type": "string", "pattern": "^[a-zA-Z][a-zA-Z0-9_-]*$", "minLength": 1, "maxLength": 256 },
3373
+ "path": { "type": "string" },
3374
+ "render": { "type": "string", "const": "native" }
3375
+ },
3376
+ "additionalProperties": true
3377
+ },
3378
+ "minItems": 1,
3379
+ "maxItems": 16,
3380
+ "uniqueItemProperty": "key"
3381
+ },
3382
+ "functions": {
3383
+ "type": "array",
3384
+ "items": {
3385
+ "type": "object",
3386
+ "required": ["key", "handler"],
3387
+ "properties": {
3388
+ "key": { "type": "string", "pattern": "^[a-zA-Z][a-zA-Z0-9_-]*$", "minLength": 1, "maxLength": 256 },
3389
+ "handler": {
3390
+ "type": "string",
3391
+ "maxLength": 1024,
3392
+ "pattern": "^([\\p{Alpha}\\d_-]+(?:\\/[\\p{Alpha}\\d_-]+)*)\\.([\\p{Alpha}\\d_-]+)$"
3393
+ }
3394
+ },
3395
+ "additionalProperties": false
3396
+ },
3397
+ "minItems": 1,
3398
+ "uniqueItemProperty": "key"
3399
+ },
3400
+ "storage": {
3401
+ "type": "object",
3402
+ "required": ["entities"],
3403
+ "properties": {
3404
+ "entities": {
3405
+ "type": "array",
3406
+ "items": {
3407
+ "type": "object",
3408
+ "required": ["name", "attributes"],
3409
+ "properties": {
3410
+ "name": { "type": "string", "pattern": "^[a-z0-9][a-z0-9_-]*(?:\\.[a-z0-9_-]+)*$", "minLength": 3, "maxLength": 64 },
3411
+ "attributes": {
3412
+ "type": "array",
3413
+ "items": {
3414
+ "type": "object",
3415
+ "required": ["name", "type"],
3416
+ "properties": {
3417
+ "name": {
3418
+ "type": "string",
3419
+ "pattern": "^[a-zA-Z][_a-zA-Z0-9-.]*$",
3420
+ "maxLength": 64,
3421
+ "not": {
3422
+ "enum": [
3423
+ "eq",
3424
+ "ne",
3425
+ "gt",
3426
+ "gte",
3427
+ "lt",
3428
+ "lte",
3429
+ "exists",
3430
+ "contains",
3431
+ "notContains",
3432
+ "and",
3433
+ "or",
3434
+ "not",
3435
+ "nor",
3436
+ "all",
3437
+ "any",
3438
+ "length",
3439
+ "in",
3440
+ "nin"
3441
+ ]
3442
+ }
3443
+ },
3444
+ "type": {
3445
+ "anyOf": [
3446
+ { "type": "string", "const": "string" },
3447
+ { "type": "string", "const": "number" },
3448
+ { "type": "string", "const": "boolean" },
3449
+ { "type": "string", "const": "object" },
3450
+ { "type": "string", "const": "array" }
3451
+ ]
3452
+ },
3453
+ "required": { "type": "boolean" },
3454
+ "default": {
3455
+ "anyOf": [
3456
+ { "type": "string" },
3457
+ { "type": "number" },
3458
+ { "type": "array", "items": {} },
3459
+ { "type": "object", "properties": {} },
3460
+ { "type": "boolean" }
3461
+ ]
3462
+ }
3463
+ },
3464
+ "additionalProperties": false
3465
+ },
3466
+ "uniqueItemProperty": "name",
3467
+ "maxItems": 64
3468
+ },
3469
+ "indexes": {
3470
+ "type": "array",
3471
+ "items": {
3472
+ "type": "object",
3473
+ "required": ["keys"],
3474
+ "properties": {
3475
+ "name": { "type": "string", "pattern": "^[a-zA-Z][a-zA-Z0-9_]*$", "minLength": 3, "maxLength": 64 },
3476
+ "keys": {
3477
+ "type": "array",
3478
+ "items": {
3479
+ "type": "object",
3480
+ "propertyNames": { "type": "string" },
3481
+ "minProperties": 1,
3482
+ "maxProperties": 1,
3483
+ "additionalProperties": { "type": "number", "enum": [1, -1] }
3484
+ },
3485
+ "minItems": 1,
3486
+ "maxItems": 4
3487
+ },
3488
+ "options": { "type": "object", "properties": { "unique": { "type": "boolean" } }, "additionalProperties": false }
3489
+ },
3490
+ "additionalProperties": false
3491
+ },
3492
+ "maxItems": 4
3493
+ }
3494
+ },
3495
+ "additionalProperties": false
3496
+ },
3497
+ "uniqueItemProperty": "name",
3498
+ "maxItems": 32
3499
+ }
3500
+ },
3501
+ "additionalProperties": false
3502
+ },
3503
+ "translations": {
3504
+ "type": "object",
3505
+ "required": ["resources", "fallback"],
3506
+ "properties": {
3507
+ "resources": {
3508
+ "type": "array",
3509
+ "items": {
3510
+ "type": "object",
3511
+ "required": ["key", "path"],
3512
+ "properties": { "key": { "enum": ["en-US", "zh-CN"] }, "path": { "type": "string" } }
3513
+ }
3514
+ },
3515
+ "fallback": {
3516
+ "type": "object",
3517
+ "required": ["default"],
3518
+ "properties": {
3519
+ "default": { "enum": ["en-US", "zh-CN"], "mustBeInField": { "fieldName": "translations.resources", "path": "key" } }
3520
+ }
3521
+ }
3522
+ },
3523
+ "additionalProperties": false
3524
+ },
3525
+ "remotes": {
3526
+ "type": "array",
3527
+ "items": {
3528
+ "type": "object",
3529
+ "required": ["key", "baseUrl"],
3530
+ "properties": {
3531
+ "key": { "type": "string", "pattern": "^[a-zA-Z][a-zA-Z0-9_-]*$", "minLength": 1, "maxLength": 256 },
3532
+ "baseUrl": { "type": "string", "pattern": "^https?:\\/\\/[^\\/\\s]+(?:\\/[^\\s?#]*)?$", "maxLength": 2048 },
3533
+ "auth": {
3534
+ "type": "object",
3535
+ "properties": { "appToken": { "type": "boolean" }, "userToken": { "type": "boolean" } },
3536
+ "additionalProperties": false
3537
+ }
3538
+ },
3539
+ "additionalProperties": false
3540
+ },
3541
+ "minItems": 1,
3542
+ "uniqueItemProperty": "key"
3543
+ },
3544
+ "endpoints": {
3545
+ "type": "array",
3546
+ "items": {
3547
+ "type": "object",
3548
+ "required": ["key", "remote"],
3549
+ "properties": {
3550
+ "key": { "type": "string", "pattern": "^[a-zA-Z][a-zA-Z0-9_-]*$", "minLength": 1, "maxLength": 256 },
3551
+ "remote": { "type": "string", "mustBeInField": { "fieldName": "remotes", "path": "key" } },
3552
+ "route": { "type": "string", "pattern": "^/" },
3553
+ "auth": {
3554
+ "type": "object",
3555
+ "properties": { "appToken": { "type": "boolean" }, "userToken": { "type": "boolean" } },
3556
+ "additionalProperties": false
3557
+ }
3558
+ },
3559
+ "additionalProperties": false
3560
+ },
3561
+ "minItems": 1,
3562
+ "uniqueItemProperty": "key"
3563
+ },
3564
+ "exposer": {
3565
+ "type": "object",
3566
+ "required": ["routes", "scopes"],
3567
+ "properties": {
3568
+ "routes": {
3569
+ "type": "array",
3570
+ "items": {
3571
+ "type": "object",
3572
+ "required": ["key", "method", "path", "handler", "scopes"],
3573
+ "properties": {
3574
+ "key": { "type": "string", "pattern": "^[a-zA-Z][a-zA-Z0-9_-]*$", "minLength": 1, "maxLength": 256 },
3575
+ "method": { "enum": ["GET", "POST", "PUT", "DELETE", "PATCH"] },
3576
+ "path": {
3577
+ "type": "string",
3578
+ "minLength": 2,
3579
+ "maxLength": 256,
3580
+ "pattern": "^/[a-zA-Z0-9]+(/[a-zA-Z0-9]+|/\\*)*/\\*\\*$|^/[a-zA-Z0-9]+(/[a-zA-Z0-9]+|/\\*)*$"
3581
+ },
3582
+ "handler": {
3583
+ "type": "object",
3584
+ "required": ["function"],
3585
+ "properties": { "function": { "type": "string", "mustBeInField": { "fieldName": "functions", "path": "key" } } },
3586
+ "additionalProperties": false
3587
+ },
3588
+ "scopes": {
3589
+ "type": "array",
3590
+ "items": { "type": "string", "mustBeInField": { "fieldName": "exposer.scopes", "path": "name" } },
3591
+ "maxItems": 16,
3592
+ "minItems": 1,
3593
+ "uniqueItems": true
3594
+ },
3595
+ "accept": { "type": "array", "items": { "enum": ["application/json"] }, "minItems": 1, "uniqueItems": true }
3596
+ },
3597
+ "additionalProperties": false
3598
+ },
3599
+ "uniqueItemProperty": "key",
3600
+ "maxItems": 32,
3601
+ "minItems": 1
3602
+ },
3603
+ "scopes": {
3604
+ "type": "array",
3605
+ "items": {
3606
+ "type": "object",
3607
+ "required": ["name", "displayName"],
3608
+ "properties": {
3609
+ "name": { "type": "string", "minLength": 5, "maxLength": 256, "pattern": "^ncp:[a-z][-.:_a-z0-9]+$" },
3610
+ "displayName": {
3611
+ "anyOf": [
3612
+ { "type": "string", "minLength": 1, "maxLength": 64 },
3613
+ { "type": "object", "required": ["i18n"], "properties": { "i18n": { "type": "string", "maxLength": 256 } } }
3614
+ ]
3615
+ },
3616
+ "description": {
3617
+ "anyOf": [
3618
+ { "type": "string", "maxLength": 1024 },
3619
+ { "type": "object", "required": ["i18n"], "properties": { "i18n": { "type": "string", "maxLength": 256 } } }
3620
+ ]
3621
+ }
3622
+ },
3623
+ "additionalProperties": false
3624
+ },
3625
+ "uniqueItemProperty": "name",
3626
+ "maxItems": 16,
3627
+ "minItems": 1
3628
+ }
3629
+ },
3630
+ "additionalProperties": false
3631
+ }
3632
+ },
3633
+ "additionalProperties": false,
3634
+ "anyOf": [{ "required": ["extensions"] }, { "required": ["event"] }, { "required": ["async"] }],
3635
+ "$defs": {
3636
+ "ExtensionDisplayConditionsSchemaId": {
3637
+ "type": "object",
3638
+ "properties": {
3639
+ "and": { "$ref": "ExtensionDisplayConditionsSchemaId" },
3640
+ "or": { "$ref": "ExtensionDisplayConditionsSchemaId" },
3641
+ "not": { "$ref": "ExtensionDisplayConditionsSchemaId" },
3642
+ "hasPermission": { "type": "string" },
3643
+ "isTeamOwner": { "type": "boolean" },
3644
+ "isLoggedIn": { "type": "boolean" },
3645
+ "expression": { "type": "string" }
3646
+ },
3647
+ "$id": "ExtensionDisplayConditionsSchemaId",
3648
+ "additionalProperties": false,
3649
+ "patternProperties": {
3650
+ "^[a-zA-Z_][a-zA-Z0-9_]*\\.id$": { "anyOf": [{ "type": "string" }, { "type": "array", "items": { "type": "string" } }] },
3651
+ "^[a-zA-Z_][a-zA-Z0-9_]*\\.identifier$": { "anyOf": [{ "type": "string" }, { "type": "array", "items": { "type": "string" } }] },
3652
+ "^[a-zA-Z_][a-zA-Z0-9_]*\\.name$": { "anyOf": [{ "type": "string" }, { "type": "array", "items": { "type": "string" } }] },
3653
+ "^[a-zA-Z_][a-zA-Z0-9_]*\\.type$": { "anyOf": [{ "type": "string" }, { "type": "array", "items": { "type": "string" } }] },
3654
+ "^[a-zA-Z_][a-zA-Z0-9]*\\.id$": { "anyOf": [{ "type": "string" }, { "type": "array", "items": { "type": "string" } }] },
3655
+ "^[a-zA-Z_][a-zA-Z0-9]*\\.short_id$": { "anyOf": [{ "type": "string" }, { "type": "array", "items": { "type": "string" } }] },
3656
+ "^[a-zA-Z_][a-zA-Z0-9]*\\.identifier$": { "anyOf": [{ "type": "string" }, { "type": "array", "items": { "type": "string" } }] },
3657
+ "^[a-zA-Z_][a-zA-Z0-9]*\\.title$": { "anyOf": [{ "type": "string" }, { "type": "array", "items": { "type": "string" } }] },
3658
+ "^[a-zA-Z_][a-zA-Z0-9]*\\.name$": { "anyOf": [{ "type": "string" }, { "type": "array", "items": { "type": "string" } }] },
3659
+ "^[a-zA-Z_][a-zA-Z0-9]*\\.type_group$": { "anyOf": [{ "type": "number" }, { "type": "array", "items": { "type": "number" } }] },
3660
+ "^[a-zA-Z_][a-zA-Z0-9]*\\.type_id$": { "anyOf": [{ "type": "string" }, { "type": "array", "items": { "type": "string" } }] }
3661
+ }
3662
+ }
3663
+ }
3664
+ }