@bridgething/catalog 0.1.0 → 0.12.1

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.
@@ -2,7 +2,7 @@
2
2
  var __commonJS = (cb, mod) => () => (mod || cb((mod = { exports: {} }).exports, mod), mod.exports);
3
3
 
4
4
  // ../../node_modules/.bun/ajv-formats@3.0.1/node_modules/ajv-formats/dist/formats.js
5
- var require_formats = __commonJS(function(exports) {
5
+ var require_formats = __commonJS((exports) => {
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
7
  exports.formatNames = exports.fastFormats = exports.fullFormats = undefined;
8
8
  function fmtDef(validate, compare) {
@@ -179,7 +179,7 @@ var require_formats = __commonJS(function(exports) {
179
179
  });
180
180
 
181
181
  // ../../node_modules/.bun/ajv@8.20.0/node_modules/ajv/dist/runtime/ucs2length.js
182
- var require_ucs2length = __commonJS(function(exports) {
182
+ var require_ucs2length = __commonJS((exports) => {
183
183
  Object.defineProperty(exports, "__esModule", { value: true });
184
184
  function ucs2length(str) {
185
185
  const len = str.length;
@@ -202,17 +202,17 @@ var require_ucs2length = __commonJS(function(exports) {
202
202
  });
203
203
 
204
204
  // scripts/.compile-validator/validator.cjs
205
- var require_validator = __commonJS(function(exports, module) {
205
+ var require_validator = __commonJS((exports, module) => {
206
206
  module.exports = validate20;
207
207
  module.exports.default = validate20;
208
208
  var schema32 = { type: "object", additionalProperties: false, required: ["name", "description", "homepage", "icon"], properties: { name: { type: "string", minLength: 1, maxLength: 100, description: "Display name of this catalog source." }, description: { type: "string", minLength: 1, maxLength: 300 }, homepage: { type: ["string", "null"], format: "uri" }, icon: { type: ["string", "null"], format: "uri", description: "Square source icon for the companion's source list." } } };
209
- var schema40 = { type: "object", additionalProperties: false, required: ["name", "url", "description", "attested"], properties: { name: { type: "string", minLength: 1, maxLength: 100 }, url: { type: "string", format: "uri", description: "A catalog.v1 manifest URL the companion can subscribe to." }, description: { type: ["string", "null"], maxLength: 300 }, attested: { type: "boolean", description: "True if the publishing source vouches for this URL. Editorial signal, not a trust boundary." } } };
209
+ var schema41 = { type: "object", additionalProperties: false, required: ["name", "url", "description", "attested"], properties: { name: { type: "string", minLength: 1, maxLength: 100 }, url: { type: "string", format: "uri", description: "A catalog.v1 manifest URL the companion can subscribe to." }, description: { type: ["string", "null"], maxLength: 300 }, attested: { type: "boolean", description: "True if the publishing source vouches for this URL. Editorial signal, not a trust boundary." } } };
210
210
  var formats0 = require_formats().fullFormats.uri;
211
211
  var formats2 = require_formats().fullFormats["date-time"];
212
212
  var func1 = require_ucs2length().default;
213
- var schema33 = { type: "object", additionalProperties: false, required: ["id", "name", "description", "author", "icon", "homepage", "source", "versions"], properties: { id: { $ref: "#/$defs/Uuid" }, name: { type: "string", minLength: 1, maxLength: 100, description: "Display name." }, description: { type: "string", minLength: 1, maxLength: 300, description: "One-line tagline for store cards." }, author: { type: "string", minLength: 1, maxLength: 100 }, icon: { type: ["string", "null"], format: "uri", description: "Hosted square icon. The publish step extracts the bundle's icon and uploads it; null until then." }, homepage: { type: ["string", "null"], format: "uri" }, source: { type: ["string", "null"], format: "uri", description: "Repository or source URL, for users who want to check it themselves." }, versions: { type: "array", minItems: 1, items: { $ref: "#/$defs/AppVersion" }, description: "Published versions, newest-first. The companion installs the newest version compatible with the connected device." } } };
213
+ var schema33 = { type: "object", additionalProperties: true, description: "One installable webapp. Unknown keys are tolerated so a catalog that carries a property added after a client shipped still validates; every key defined here is still checked strictly.", required: ["id", "name", "description", "author", "icon", "homepage", "source", "versions"], properties: { id: { $ref: "#/$defs/Uuid" }, name: { type: "string", minLength: 1, maxLength: 100, description: "Display name." }, description: { type: "string", minLength: 1, maxLength: 300, description: "One-line tagline for store cards." }, author: { type: "string", minLength: 1, maxLength: 100 }, icon: { type: ["string", "null"], format: "uri", description: "Hosted square icon. The publish step extracts the bundle's icon and uploads it; null until then." }, screenshots: { type: "array", minItems: 1, maxItems: 6, items: { type: "string", format: "uri" }, description: "Captures of the app running on a device, 800x480 landscape. The store shows the first one on the listing. Omit the key entirely rather than sending an empty array." }, homepage: { type: ["string", "null"], format: "uri" }, source: { type: ["string", "null"], format: "uri", description: "Repository or source URL, for users who want to check it themselves." }, versions: { type: "array", minItems: 1, items: { $ref: "#/$defs/AppVersion" }, description: "Published versions, newest-first. The companion installs the newest version compatible with the connected device." } } };
214
214
  var formats8 = /^(?:urn:uuid:)?[0-9a-f]{8}-(?:[0-9a-f]{4}-){3}[0-9a-f]{12}$/i;
215
- var schema35 = { type: "object", additionalProperties: false, required: ["version", "released_at", "download", "permissions", "min_libbridgething_version", "changelog"], properties: { version: { $ref: "#/$defs/Version" }, released_at: { type: "string", format: "date-time" }, download: { $ref: "#/$defs/Download" }, permissions: { type: "array", items: { type: "string", minLength: 1 }, uniqueItems: true, description: "Permission catalog keys this version requests (net.fetch, geo, ...). Shown at install, informational, never a gate." }, role: { enum: ["standard", "launcher"], description: "Mirrors the bundle manifest's role. A launcher can take the device's launcher slot and replace the built-in hub. Absent means standard." }, provides_overlay: { type: "boolean", description: "Whether this version ships an overlay the device can inject over every webapp. Absent means it does not." }, min_libbridgething_version: { $ref: "#/$defs/Semver" }, changelog: { type: ["string", "null"], description: "Markdown changelog for this version." } } };
215
+ var schema35 = { type: "object", additionalProperties: true, description: "One published version. Unknown keys are tolerated so a catalog that carries a property added after a client shipped still validates; every key defined here is still checked strictly.", required: ["version", "released_at", "download", "permissions", "min_libbridgething_version", "changelog"], properties: { version: { $ref: "#/$defs/Version" }, released_at: { type: "string", format: "date-time" }, download: { $ref: "#/$defs/Download" }, settings: { $ref: "#/$defs/Download", description: "The bundle's settings page, hosted separately so a companion can fetch it over the internet instead of pulling it off the device over Bluetooth. Its sha256 MUST be the digest of the same bytes the bundle ships, which is what the device reports as settings_hash; a client verifies against the device's hash and falls back to the device when they disagree. Absent when the version ships no settings page." }, permissions: { type: "array", items: { type: "string", minLength: 1 }, uniqueItems: true, description: "Permission catalog keys this version requests (net.fetch, geo, ...). Shown at install, informational, never a gate." }, role: { enum: ["standard", "launcher"], description: "Mirrors the bundle manifest's role. A launcher can take the device's launcher slot and replace the built-in hub. Absent means standard." }, provides_overlay: { type: "boolean", description: "Whether this version ships an overlay the device can inject over every webapp. Absent means it does not." }, extension: { $ref: "#/$defs/Extension" }, min_libbridgething_version: { $ref: "#/$defs/Semver" }, changelog: { type: ["string", "null"], description: "Markdown changelog for this version." } } };
216
216
  var pattern4 = new RegExp("^[A-Za-z0-9](?:[A-Za-z0-9.+\\-]*[A-Za-z0-9])?$", "u");
217
217
  var pattern6 = new RegExp("^[0-9]+\\.[0-9]+\\.[0-9]+(?:[.+\\-][0-9A-Za-z.\\-]+)?$", "u");
218
218
  var pattern5 = new RegExp("^[a-f0-9]{64}$", "u");
@@ -410,53 +410,42 @@ var require_validator = __commonJS(function(exports, module) {
410
410
  }
411
411
  errors++;
412
412
  }
413
- for (const key0 in data) {
414
- if (!(key0 === "version" || key0 === "released_at" || key0 === "download" || key0 === "permissions" || key0 === "role" || key0 === "provides_overlay" || key0 === "min_libbridgething_version" || key0 === "changelog")) {
415
- const err6 = { instancePath, schemaPath: "#/additionalProperties", keyword: "additionalProperties", params: { additionalProperty: key0 }, message: "must NOT have additional properties" };
416
- if (vErrors === null) {
417
- vErrors = [err6];
418
- } else {
419
- vErrors.push(err6);
420
- }
421
- errors++;
422
- }
423
- }
424
413
  if (data.version !== undefined) {
425
414
  let data0 = data.version;
426
415
  if (typeof data0 === "string") {
427
416
  if (func1(data0) > 100) {
428
- const err7 = { instancePath: instancePath + "/version", schemaPath: "#/$defs/Version/maxLength", keyword: "maxLength", params: { limit: 100 }, message: "must NOT have more than 100 characters" };
417
+ const err6 = { instancePath: instancePath + "/version", schemaPath: "#/$defs/Version/maxLength", keyword: "maxLength", params: { limit: 100 }, message: "must NOT have more than 100 characters" };
429
418
  if (vErrors === null) {
430
- vErrors = [err7];
419
+ vErrors = [err6];
431
420
  } else {
432
- vErrors.push(err7);
421
+ vErrors.push(err6);
433
422
  }
434
423
  errors++;
435
424
  }
436
425
  if (func1(data0) < 1) {
437
- const err8 = { instancePath: instancePath + "/version", schemaPath: "#/$defs/Version/minLength", keyword: "minLength", params: { limit: 1 }, message: "must NOT have fewer than 1 characters" };
426
+ const err7 = { instancePath: instancePath + "/version", schemaPath: "#/$defs/Version/minLength", keyword: "minLength", params: { limit: 1 }, message: "must NOT have fewer than 1 characters" };
438
427
  if (vErrors === null) {
439
- vErrors = [err8];
428
+ vErrors = [err7];
440
429
  } else {
441
- vErrors.push(err8);
430
+ vErrors.push(err7);
442
431
  }
443
432
  errors++;
444
433
  }
445
434
  if (!pattern4.test(data0)) {
446
- const err9 = { instancePath: instancePath + "/version", schemaPath: "#/$defs/Version/pattern", keyword: "pattern", params: { pattern: "^[A-Za-z0-9](?:[A-Za-z0-9.+\\-]*[A-Za-z0-9])?$" }, message: 'must match pattern "' + "^[A-Za-z0-9](?:[A-Za-z0-9.+\\-]*[A-Za-z0-9])?$" + '"' };
435
+ const err8 = { instancePath: instancePath + "/version", schemaPath: "#/$defs/Version/pattern", keyword: "pattern", params: { pattern: "^[A-Za-z0-9](?:[A-Za-z0-9.+\\-]*[A-Za-z0-9])?$" }, message: 'must match pattern "' + "^[A-Za-z0-9](?:[A-Za-z0-9.+\\-]*[A-Za-z0-9])?$" + '"' };
447
436
  if (vErrors === null) {
448
- vErrors = [err9];
437
+ vErrors = [err8];
449
438
  } else {
450
- vErrors.push(err9);
439
+ vErrors.push(err8);
451
440
  }
452
441
  errors++;
453
442
  }
454
443
  } else {
455
- const err10 = { instancePath: instancePath + "/version", schemaPath: "#/$defs/Version/type", keyword: "type", params: { type: "string" }, message: "must be string" };
444
+ const err9 = { instancePath: instancePath + "/version", schemaPath: "#/$defs/Version/type", keyword: "type", params: { type: "string" }, message: "must be string" };
456
445
  if (vErrors === null) {
457
- vErrors = [err10];
446
+ vErrors = [err9];
458
447
  } else {
459
- vErrors.push(err10);
448
+ vErrors.push(err9);
460
449
  }
461
450
  errors++;
462
451
  }
@@ -465,20 +454,20 @@ var require_validator = __commonJS(function(exports, module) {
465
454
  let data1 = data.released_at;
466
455
  if (typeof data1 === "string") {
467
456
  if (!formats2.validate(data1)) {
468
- const err11 = { instancePath: instancePath + "/released_at", schemaPath: "#/properties/released_at/format", keyword: "format", params: { format: "date-time" }, message: 'must match format "' + "date-time" + '"' };
457
+ const err10 = { instancePath: instancePath + "/released_at", schemaPath: "#/properties/released_at/format", keyword: "format", params: { format: "date-time" }, message: 'must match format "' + "date-time" + '"' };
469
458
  if (vErrors === null) {
470
- vErrors = [err11];
459
+ vErrors = [err10];
471
460
  } else {
472
- vErrors.push(err11);
461
+ vErrors.push(err10);
473
462
  }
474
463
  errors++;
475
464
  }
476
465
  } else {
477
- const err12 = { instancePath: instancePath + "/released_at", schemaPath: "#/properties/released_at/type", keyword: "type", params: { type: "string" }, message: "must be string" };
466
+ const err11 = { instancePath: instancePath + "/released_at", schemaPath: "#/properties/released_at/type", keyword: "type", params: { type: "string" }, message: "must be string" };
478
467
  if (vErrors === null) {
479
- vErrors = [err12];
468
+ vErrors = [err11];
480
469
  } else {
481
- vErrors.push(err12);
470
+ vErrors.push(err11);
482
471
  }
483
472
  errors++;
484
473
  }
@@ -489,48 +478,54 @@ var require_validator = __commonJS(function(exports, module) {
489
478
  errors = vErrors.length;
490
479
  }
491
480
  }
481
+ if (data.settings !== undefined) {
482
+ if (!validate23(data.settings, { instancePath: instancePath + "/settings", parentData: data, parentDataProperty: "settings", rootData, dynamicAnchors })) {
483
+ vErrors = vErrors === null ? validate23.errors : vErrors.concat(validate23.errors);
484
+ errors = vErrors.length;
485
+ }
486
+ }
492
487
  if (data.permissions !== undefined) {
493
- let data3 = data.permissions;
494
- if (Array.isArray(data3)) {
495
- const len0 = data3.length;
488
+ let data4 = data.permissions;
489
+ if (Array.isArray(data4)) {
490
+ const len0 = data4.length;
496
491
  for (let i0 = 0;i0 < len0; i0++) {
497
- let data4 = data3[i0];
498
- if (typeof data4 === "string") {
499
- if (func1(data4) < 1) {
500
- const err13 = { instancePath: instancePath + "/permissions/" + i0, schemaPath: "#/properties/permissions/items/minLength", keyword: "minLength", params: { limit: 1 }, message: "must NOT have fewer than 1 characters" };
492
+ let data5 = data4[i0];
493
+ if (typeof data5 === "string") {
494
+ if (func1(data5) < 1) {
495
+ const err12 = { instancePath: instancePath + "/permissions/" + i0, schemaPath: "#/properties/permissions/items/minLength", keyword: "minLength", params: { limit: 1 }, message: "must NOT have fewer than 1 characters" };
501
496
  if (vErrors === null) {
502
- vErrors = [err13];
497
+ vErrors = [err12];
503
498
  } else {
504
- vErrors.push(err13);
499
+ vErrors.push(err12);
505
500
  }
506
501
  errors++;
507
502
  }
508
503
  } else {
509
- const err14 = { instancePath: instancePath + "/permissions/" + i0, schemaPath: "#/properties/permissions/items/type", keyword: "type", params: { type: "string" }, message: "must be string" };
504
+ const err13 = { instancePath: instancePath + "/permissions/" + i0, schemaPath: "#/properties/permissions/items/type", keyword: "type", params: { type: "string" }, message: "must be string" };
510
505
  if (vErrors === null) {
511
- vErrors = [err14];
506
+ vErrors = [err13];
512
507
  } else {
513
- vErrors.push(err14);
508
+ vErrors.push(err13);
514
509
  }
515
510
  errors++;
516
511
  }
517
512
  }
518
- let i1 = data3.length;
513
+ let i1 = data4.length;
519
514
  let j0;
520
515
  if (i1 > 1) {
521
516
  const indices0 = {};
522
517
  for (;i1--; ) {
523
- let item0 = data3[i1];
518
+ let item0 = data4[i1];
524
519
  if (typeof item0 !== "string") {
525
520
  continue;
526
521
  }
527
522
  if (typeof indices0[item0] == "number") {
528
523
  j0 = indices0[item0];
529
- const err15 = { instancePath: instancePath + "/permissions", schemaPath: "#/properties/permissions/uniqueItems", keyword: "uniqueItems", params: { i: i1, j: j0 }, message: "must NOT have duplicate items (items ## " + j0 + " and " + i1 + " are identical)" };
524
+ const err14 = { instancePath: instancePath + "/permissions", schemaPath: "#/properties/permissions/uniqueItems", keyword: "uniqueItems", params: { i: i1, j: j0 }, message: "must NOT have duplicate items (items ## " + j0 + " and " + i1 + " are identical)" };
530
525
  if (vErrors === null) {
531
- vErrors = [err15];
526
+ vErrors = [err14];
532
527
  } else {
533
- vErrors.push(err15);
528
+ vErrors.push(err14);
534
529
  }
535
530
  errors++;
536
531
  break;
@@ -539,43 +534,52 @@ var require_validator = __commonJS(function(exports, module) {
539
534
  }
540
535
  }
541
536
  } else {
542
- const err16 = { instancePath: instancePath + "/permissions", schemaPath: "#/properties/permissions/type", keyword: "type", params: { type: "array" }, message: "must be array" };
537
+ const err15 = { instancePath: instancePath + "/permissions", schemaPath: "#/properties/permissions/type", keyword: "type", params: { type: "array" }, message: "must be array" };
543
538
  if (vErrors === null) {
544
- vErrors = [err16];
539
+ vErrors = [err15];
545
540
  } else {
546
- vErrors.push(err16);
541
+ vErrors.push(err15);
547
542
  }
548
543
  errors++;
549
544
  }
550
545
  }
551
546
  if (data.role !== undefined) {
552
- let data5 = data.role;
553
- if (!(data5 === "standard" || data5 === "launcher")) {
554
- const err17 = { instancePath: instancePath + "/role", schemaPath: "#/properties/role/enum", keyword: "enum", params: { allowedValues: schema35.properties.role.enum }, message: "must be equal to one of the allowed values" };
547
+ let data6 = data.role;
548
+ if (!(data6 === "standard" || data6 === "launcher")) {
549
+ const err16 = { instancePath: instancePath + "/role", schemaPath: "#/properties/role/enum", keyword: "enum", params: { allowedValues: schema35.properties.role.enum }, message: "must be equal to one of the allowed values" };
555
550
  if (vErrors === null) {
556
- vErrors = [err17];
551
+ vErrors = [err16];
557
552
  } else {
558
- vErrors.push(err17);
553
+ vErrors.push(err16);
559
554
  }
560
555
  errors++;
561
556
  }
562
557
  }
563
558
  if (data.provides_overlay !== undefined) {
564
559
  if (typeof data.provides_overlay !== "boolean") {
565
- const err18 = { instancePath: instancePath + "/provides_overlay", schemaPath: "#/properties/provides_overlay/type", keyword: "type", params: { type: "boolean" }, message: "must be boolean" };
560
+ const err17 = { instancePath: instancePath + "/provides_overlay", schemaPath: "#/properties/provides_overlay/type", keyword: "type", params: { type: "boolean" }, message: "must be boolean" };
566
561
  if (vErrors === null) {
567
- vErrors = [err18];
562
+ vErrors = [err17];
568
563
  } else {
569
- vErrors.push(err18);
564
+ vErrors.push(err17);
570
565
  }
571
566
  errors++;
572
567
  }
573
568
  }
574
- if (data.min_libbridgething_version !== undefined) {
575
- let data7 = data.min_libbridgething_version;
576
- if (typeof data7 === "string") {
577
- if (!pattern6.test(data7)) {
578
- const err19 = { instancePath: instancePath + "/min_libbridgething_version", schemaPath: "#/$defs/Semver/pattern", keyword: "pattern", params: { pattern: "^[0-9]+\\.[0-9]+\\.[0-9]+(?:[.+\\-][0-9A-Za-z.\\-]+)?$" }, message: 'must match pattern "' + "^[0-9]+\\.[0-9]+\\.[0-9]+(?:[.+\\-][0-9A-Za-z.\\-]+)?$" + '"' };
569
+ if (data.extension !== undefined) {
570
+ let data8 = data.extension;
571
+ if (data8 && typeof data8 == "object" && !Array.isArray(data8)) {
572
+ if (data8.desktop === undefined) {
573
+ const err18 = { instancePath: instancePath + "/extension", schemaPath: "#/$defs/Extension/required", keyword: "required", params: { missingProperty: "desktop" }, message: "must have required property '" + "desktop" + "'" };
574
+ if (vErrors === null) {
575
+ vErrors = [err18];
576
+ } else {
577
+ vErrors.push(err18);
578
+ }
579
+ errors++;
580
+ }
581
+ if (data8.permissions === undefined) {
582
+ const err19 = { instancePath: instancePath + "/extension", schemaPath: "#/$defs/Extension/required", keyword: "required", params: { missingProperty: "permissions" }, message: "must have required property '" + "permissions" + "'" };
579
583
  if (vErrors === null) {
580
584
  vErrors = [err19];
581
585
  } else {
@@ -583,34 +587,137 @@ var require_validator = __commonJS(function(exports, module) {
583
587
  }
584
588
  errors++;
585
589
  }
590
+ for (const key0 in data8) {
591
+ if (!(key0 === "desktop" || key0 === "permissions")) {
592
+ const err20 = { instancePath: instancePath + "/extension", schemaPath: "#/$defs/Extension/additionalProperties", keyword: "additionalProperties", params: { additionalProperty: key0 }, message: "must NOT have additional properties" };
593
+ if (vErrors === null) {
594
+ vErrors = [err20];
595
+ } else {
596
+ vErrors.push(err20);
597
+ }
598
+ errors++;
599
+ }
600
+ }
601
+ if (data8.desktop !== undefined) {
602
+ if (data8.desktop !== true) {
603
+ const err21 = { instancePath: instancePath + "/extension/desktop", schemaPath: "#/$defs/Extension/properties/desktop/const", keyword: "const", params: { allowedValue: true }, message: "must be equal to constant" };
604
+ if (vErrors === null) {
605
+ vErrors = [err21];
606
+ } else {
607
+ vErrors.push(err21);
608
+ }
609
+ errors++;
610
+ }
611
+ }
612
+ if (data8.permissions !== undefined) {
613
+ let data10 = data8.permissions;
614
+ if (Array.isArray(data10)) {
615
+ const len1 = data10.length;
616
+ for (let i2 = 0;i2 < len1; i2++) {
617
+ let data11 = data10[i2];
618
+ if (typeof data11 === "string") {
619
+ if (func1(data11) < 1) {
620
+ const err22 = { instancePath: instancePath + "/extension/permissions/" + i2, schemaPath: "#/$defs/Extension/properties/permissions/items/minLength", keyword: "minLength", params: { limit: 1 }, message: "must NOT have fewer than 1 characters" };
621
+ if (vErrors === null) {
622
+ vErrors = [err22];
623
+ } else {
624
+ vErrors.push(err22);
625
+ }
626
+ errors++;
627
+ }
628
+ } else {
629
+ const err23 = { instancePath: instancePath + "/extension/permissions/" + i2, schemaPath: "#/$defs/Extension/properties/permissions/items/type", keyword: "type", params: { type: "string" }, message: "must be string" };
630
+ if (vErrors === null) {
631
+ vErrors = [err23];
632
+ } else {
633
+ vErrors.push(err23);
634
+ }
635
+ errors++;
636
+ }
637
+ }
638
+ let i3 = data10.length;
639
+ let j1;
640
+ if (i3 > 1) {
641
+ const indices1 = {};
642
+ for (;i3--; ) {
643
+ let item1 = data10[i3];
644
+ if (typeof item1 !== "string") {
645
+ continue;
646
+ }
647
+ if (typeof indices1[item1] == "number") {
648
+ j1 = indices1[item1];
649
+ const err24 = { instancePath: instancePath + "/extension/permissions", schemaPath: "#/$defs/Extension/properties/permissions/uniqueItems", keyword: "uniqueItems", params: { i: i3, j: j1 }, message: "must NOT have duplicate items (items ## " + j1 + " and " + i3 + " are identical)" };
650
+ if (vErrors === null) {
651
+ vErrors = [err24];
652
+ } else {
653
+ vErrors.push(err24);
654
+ }
655
+ errors++;
656
+ break;
657
+ }
658
+ indices1[item1] = i3;
659
+ }
660
+ }
661
+ } else {
662
+ const err25 = { instancePath: instancePath + "/extension/permissions", schemaPath: "#/$defs/Extension/properties/permissions/type", keyword: "type", params: { type: "array" }, message: "must be array" };
663
+ if (vErrors === null) {
664
+ vErrors = [err25];
665
+ } else {
666
+ vErrors.push(err25);
667
+ }
668
+ errors++;
669
+ }
670
+ }
671
+ } else {
672
+ const err26 = { instancePath: instancePath + "/extension", schemaPath: "#/$defs/Extension/type", keyword: "type", params: { type: "object" }, message: "must be object" };
673
+ if (vErrors === null) {
674
+ vErrors = [err26];
675
+ } else {
676
+ vErrors.push(err26);
677
+ }
678
+ errors++;
679
+ }
680
+ }
681
+ if (data.min_libbridgething_version !== undefined) {
682
+ let data12 = data.min_libbridgething_version;
683
+ if (typeof data12 === "string") {
684
+ if (!pattern6.test(data12)) {
685
+ const err27 = { instancePath: instancePath + "/min_libbridgething_version", schemaPath: "#/$defs/Semver/pattern", keyword: "pattern", params: { pattern: "^[0-9]+\\.[0-9]+\\.[0-9]+(?:[.+\\-][0-9A-Za-z.\\-]+)?$" }, message: 'must match pattern "' + "^[0-9]+\\.[0-9]+\\.[0-9]+(?:[.+\\-][0-9A-Za-z.\\-]+)?$" + '"' };
686
+ if (vErrors === null) {
687
+ vErrors = [err27];
688
+ } else {
689
+ vErrors.push(err27);
690
+ }
691
+ errors++;
692
+ }
586
693
  } else {
587
- const err20 = { instancePath: instancePath + "/min_libbridgething_version", schemaPath: "#/$defs/Semver/type", keyword: "type", params: { type: "string" }, message: "must be string" };
694
+ const err28 = { instancePath: instancePath + "/min_libbridgething_version", schemaPath: "#/$defs/Semver/type", keyword: "type", params: { type: "string" }, message: "must be string" };
588
695
  if (vErrors === null) {
589
- vErrors = [err20];
696
+ vErrors = [err28];
590
697
  } else {
591
- vErrors.push(err20);
698
+ vErrors.push(err28);
592
699
  }
593
700
  errors++;
594
701
  }
595
702
  }
596
703
  if (data.changelog !== undefined) {
597
- let data8 = data.changelog;
598
- if (typeof data8 !== "string" && data8 !== null) {
599
- const err21 = { instancePath: instancePath + "/changelog", schemaPath: "#/properties/changelog/type", keyword: "type", params: { type: schema35.properties.changelog.type }, message: "must be string,null" };
704
+ let data13 = data.changelog;
705
+ if (typeof data13 !== "string" && data13 !== null) {
706
+ const err29 = { instancePath: instancePath + "/changelog", schemaPath: "#/properties/changelog/type", keyword: "type", params: { type: schema35.properties.changelog.type }, message: "must be string,null" };
600
707
  if (vErrors === null) {
601
- vErrors = [err21];
708
+ vErrors = [err29];
602
709
  } else {
603
- vErrors.push(err21);
710
+ vErrors.push(err29);
604
711
  }
605
712
  errors++;
606
713
  }
607
714
  }
608
715
  } else {
609
- const err22 = { instancePath, schemaPath: "#/type", keyword: "type", params: { type: "object" }, message: "must be object" };
716
+ const err30 = { instancePath, schemaPath: "#/type", keyword: "type", params: { type: "object" }, message: "must be object" };
610
717
  if (vErrors === null) {
611
- vErrors = [err22];
718
+ vErrors = [err30];
612
719
  } else {
613
- vErrors.push(err22);
720
+ vErrors.push(err30);
614
721
  }
615
722
  errors++;
616
723
  }
@@ -701,35 +808,24 @@ var require_validator = __commonJS(function(exports, module) {
701
808
  }
702
809
  errors++;
703
810
  }
704
- for (const key0 in data) {
705
- if (!(key0 === "id" || key0 === "name" || key0 === "description" || key0 === "author" || key0 === "icon" || key0 === "homepage" || key0 === "source" || key0 === "versions")) {
706
- const err8 = { instancePath, schemaPath: "#/additionalProperties", keyword: "additionalProperties", params: { additionalProperty: key0 }, message: "must NOT have additional properties" };
707
- if (vErrors === null) {
708
- vErrors = [err8];
709
- } else {
710
- vErrors.push(err8);
711
- }
712
- errors++;
713
- }
714
- }
715
811
  if (data.id !== undefined) {
716
812
  let data0 = data.id;
717
813
  if (typeof data0 === "string") {
718
814
  if (!formats8.test(data0)) {
719
- const err9 = { instancePath: instancePath + "/id", schemaPath: "#/$defs/Uuid/format", keyword: "format", params: { format: "uuid" }, message: 'must match format "' + "uuid" + '"' };
815
+ const err8 = { instancePath: instancePath + "/id", schemaPath: "#/$defs/Uuid/format", keyword: "format", params: { format: "uuid" }, message: 'must match format "' + "uuid" + '"' };
720
816
  if (vErrors === null) {
721
- vErrors = [err9];
817
+ vErrors = [err8];
722
818
  } else {
723
- vErrors.push(err9);
819
+ vErrors.push(err8);
724
820
  }
725
821
  errors++;
726
822
  }
727
823
  } else {
728
- const err10 = { instancePath: instancePath + "/id", schemaPath: "#/$defs/Uuid/type", keyword: "type", params: { type: "string" }, message: "must be string" };
824
+ const err9 = { instancePath: instancePath + "/id", schemaPath: "#/$defs/Uuid/type", keyword: "type", params: { type: "string" }, message: "must be string" };
729
825
  if (vErrors === null) {
730
- vErrors = [err10];
826
+ vErrors = [err9];
731
827
  } else {
732
- vErrors.push(err10);
828
+ vErrors.push(err9);
733
829
  }
734
830
  errors++;
735
831
  }
@@ -738,29 +834,29 @@ var require_validator = __commonJS(function(exports, module) {
738
834
  let data1 = data.name;
739
835
  if (typeof data1 === "string") {
740
836
  if (func1(data1) > 100) {
741
- const err11 = { instancePath: instancePath + "/name", schemaPath: "#/properties/name/maxLength", keyword: "maxLength", params: { limit: 100 }, message: "must NOT have more than 100 characters" };
837
+ const err10 = { instancePath: instancePath + "/name", schemaPath: "#/properties/name/maxLength", keyword: "maxLength", params: { limit: 100 }, message: "must NOT have more than 100 characters" };
742
838
  if (vErrors === null) {
743
- vErrors = [err11];
839
+ vErrors = [err10];
744
840
  } else {
745
- vErrors.push(err11);
841
+ vErrors.push(err10);
746
842
  }
747
843
  errors++;
748
844
  }
749
845
  if (func1(data1) < 1) {
750
- const err12 = { instancePath: instancePath + "/name", schemaPath: "#/properties/name/minLength", keyword: "minLength", params: { limit: 1 }, message: "must NOT have fewer than 1 characters" };
846
+ const err11 = { instancePath: instancePath + "/name", schemaPath: "#/properties/name/minLength", keyword: "minLength", params: { limit: 1 }, message: "must NOT have fewer than 1 characters" };
751
847
  if (vErrors === null) {
752
- vErrors = [err12];
848
+ vErrors = [err11];
753
849
  } else {
754
- vErrors.push(err12);
850
+ vErrors.push(err11);
755
851
  }
756
852
  errors++;
757
853
  }
758
854
  } else {
759
- const err13 = { instancePath: instancePath + "/name", schemaPath: "#/properties/name/type", keyword: "type", params: { type: "string" }, message: "must be string" };
855
+ const err12 = { instancePath: instancePath + "/name", schemaPath: "#/properties/name/type", keyword: "type", params: { type: "string" }, message: "must be string" };
760
856
  if (vErrors === null) {
761
- vErrors = [err13];
857
+ vErrors = [err12];
762
858
  } else {
763
- vErrors.push(err13);
859
+ vErrors.push(err12);
764
860
  }
765
861
  errors++;
766
862
  }
@@ -769,29 +865,29 @@ var require_validator = __commonJS(function(exports, module) {
769
865
  let data2 = data.description;
770
866
  if (typeof data2 === "string") {
771
867
  if (func1(data2) > 300) {
772
- const err14 = { instancePath: instancePath + "/description", schemaPath: "#/properties/description/maxLength", keyword: "maxLength", params: { limit: 300 }, message: "must NOT have more than 300 characters" };
868
+ const err13 = { instancePath: instancePath + "/description", schemaPath: "#/properties/description/maxLength", keyword: "maxLength", params: { limit: 300 }, message: "must NOT have more than 300 characters" };
773
869
  if (vErrors === null) {
774
- vErrors = [err14];
870
+ vErrors = [err13];
775
871
  } else {
776
- vErrors.push(err14);
872
+ vErrors.push(err13);
777
873
  }
778
874
  errors++;
779
875
  }
780
876
  if (func1(data2) < 1) {
781
- const err15 = { instancePath: instancePath + "/description", schemaPath: "#/properties/description/minLength", keyword: "minLength", params: { limit: 1 }, message: "must NOT have fewer than 1 characters" };
877
+ const err14 = { instancePath: instancePath + "/description", schemaPath: "#/properties/description/minLength", keyword: "minLength", params: { limit: 1 }, message: "must NOT have fewer than 1 characters" };
782
878
  if (vErrors === null) {
783
- vErrors = [err15];
879
+ vErrors = [err14];
784
880
  } else {
785
- vErrors.push(err15);
881
+ vErrors.push(err14);
786
882
  }
787
883
  errors++;
788
884
  }
789
885
  } else {
790
- const err16 = { instancePath: instancePath + "/description", schemaPath: "#/properties/description/type", keyword: "type", params: { type: "string" }, message: "must be string" };
886
+ const err15 = { instancePath: instancePath + "/description", schemaPath: "#/properties/description/type", keyword: "type", params: { type: "string" }, message: "must be string" };
791
887
  if (vErrors === null) {
792
- vErrors = [err16];
888
+ vErrors = [err15];
793
889
  } else {
794
- vErrors.push(err16);
890
+ vErrors.push(err15);
795
891
  }
796
892
  errors++;
797
893
  }
@@ -800,29 +896,29 @@ var require_validator = __commonJS(function(exports, module) {
800
896
  let data3 = data.author;
801
897
  if (typeof data3 === "string") {
802
898
  if (func1(data3) > 100) {
803
- const err17 = { instancePath: instancePath + "/author", schemaPath: "#/properties/author/maxLength", keyword: "maxLength", params: { limit: 100 }, message: "must NOT have more than 100 characters" };
899
+ const err16 = { instancePath: instancePath + "/author", schemaPath: "#/properties/author/maxLength", keyword: "maxLength", params: { limit: 100 }, message: "must NOT have more than 100 characters" };
804
900
  if (vErrors === null) {
805
- vErrors = [err17];
901
+ vErrors = [err16];
806
902
  } else {
807
- vErrors.push(err17);
903
+ vErrors.push(err16);
808
904
  }
809
905
  errors++;
810
906
  }
811
907
  if (func1(data3) < 1) {
812
- const err18 = { instancePath: instancePath + "/author", schemaPath: "#/properties/author/minLength", keyword: "minLength", params: { limit: 1 }, message: "must NOT have fewer than 1 characters" };
908
+ const err17 = { instancePath: instancePath + "/author", schemaPath: "#/properties/author/minLength", keyword: "minLength", params: { limit: 1 }, message: "must NOT have fewer than 1 characters" };
813
909
  if (vErrors === null) {
814
- vErrors = [err18];
910
+ vErrors = [err17];
815
911
  } else {
816
- vErrors.push(err18);
912
+ vErrors.push(err17);
817
913
  }
818
914
  errors++;
819
915
  }
820
916
  } else {
821
- const err19 = { instancePath: instancePath + "/author", schemaPath: "#/properties/author/type", keyword: "type", params: { type: "string" }, message: "must be string" };
917
+ const err18 = { instancePath: instancePath + "/author", schemaPath: "#/properties/author/type", keyword: "type", params: { type: "string" }, message: "must be string" };
822
918
  if (vErrors === null) {
823
- vErrors = [err19];
919
+ vErrors = [err18];
824
920
  } else {
825
- vErrors.push(err19);
921
+ vErrors.push(err18);
826
922
  }
827
923
  errors++;
828
924
  }
@@ -830,17 +926,31 @@ var require_validator = __commonJS(function(exports, module) {
830
926
  if (data.icon !== undefined) {
831
927
  let data4 = data.icon;
832
928
  if (typeof data4 !== "string" && data4 !== null) {
833
- const err20 = { instancePath: instancePath + "/icon", schemaPath: "#/properties/icon/type", keyword: "type", params: { type: schema33.properties.icon.type }, message: "must be string,null" };
929
+ const err19 = { instancePath: instancePath + "/icon", schemaPath: "#/properties/icon/type", keyword: "type", params: { type: schema33.properties.icon.type }, message: "must be string,null" };
834
930
  if (vErrors === null) {
835
- vErrors = [err20];
931
+ vErrors = [err19];
836
932
  } else {
837
- vErrors.push(err20);
933
+ vErrors.push(err19);
838
934
  }
839
935
  errors++;
840
936
  }
841
937
  if (typeof data4 === "string") {
842
938
  if (!formats0(data4)) {
843
- const err21 = { instancePath: instancePath + "/icon", schemaPath: "#/properties/icon/format", keyword: "format", params: { format: "uri" }, message: 'must match format "' + "uri" + '"' };
939
+ const err20 = { instancePath: instancePath + "/icon", schemaPath: "#/properties/icon/format", keyword: "format", params: { format: "uri" }, message: 'must match format "' + "uri" + '"' };
940
+ if (vErrors === null) {
941
+ vErrors = [err20];
942
+ } else {
943
+ vErrors.push(err20);
944
+ }
945
+ errors++;
946
+ }
947
+ }
948
+ }
949
+ if (data.screenshots !== undefined) {
950
+ let data5 = data.screenshots;
951
+ if (Array.isArray(data5)) {
952
+ if (data5.length > 6) {
953
+ const err21 = { instancePath: instancePath + "/screenshots", schemaPath: "#/properties/screenshots/maxItems", keyword: "maxItems", params: { limit: 6 }, message: "must NOT have more than 6 items" };
844
954
  if (vErrors === null) {
845
955
  vErrors = [err21];
846
956
  } else {
@@ -848,89 +958,129 @@ var require_validator = __commonJS(function(exports, module) {
848
958
  }
849
959
  errors++;
850
960
  }
961
+ if (data5.length < 1) {
962
+ const err22 = { instancePath: instancePath + "/screenshots", schemaPath: "#/properties/screenshots/minItems", keyword: "minItems", params: { limit: 1 }, message: "must NOT have fewer than 1 items" };
963
+ if (vErrors === null) {
964
+ vErrors = [err22];
965
+ } else {
966
+ vErrors.push(err22);
967
+ }
968
+ errors++;
969
+ }
970
+ const len0 = data5.length;
971
+ for (let i0 = 0;i0 < len0; i0++) {
972
+ let data6 = data5[i0];
973
+ if (typeof data6 === "string") {
974
+ if (!formats0(data6)) {
975
+ const err23 = { instancePath: instancePath + "/screenshots/" + i0, schemaPath: "#/properties/screenshots/items/format", keyword: "format", params: { format: "uri" }, message: 'must match format "' + "uri" + '"' };
976
+ if (vErrors === null) {
977
+ vErrors = [err23];
978
+ } else {
979
+ vErrors.push(err23);
980
+ }
981
+ errors++;
982
+ }
983
+ } else {
984
+ const err24 = { instancePath: instancePath + "/screenshots/" + i0, schemaPath: "#/properties/screenshots/items/type", keyword: "type", params: { type: "string" }, message: "must be string" };
985
+ if (vErrors === null) {
986
+ vErrors = [err24];
987
+ } else {
988
+ vErrors.push(err24);
989
+ }
990
+ errors++;
991
+ }
992
+ }
993
+ } else {
994
+ const err25 = { instancePath: instancePath + "/screenshots", schemaPath: "#/properties/screenshots/type", keyword: "type", params: { type: "array" }, message: "must be array" };
995
+ if (vErrors === null) {
996
+ vErrors = [err25];
997
+ } else {
998
+ vErrors.push(err25);
999
+ }
1000
+ errors++;
851
1001
  }
852
1002
  }
853
1003
  if (data.homepage !== undefined) {
854
- let data5 = data.homepage;
855
- if (typeof data5 !== "string" && data5 !== null) {
856
- const err22 = { instancePath: instancePath + "/homepage", schemaPath: "#/properties/homepage/type", keyword: "type", params: { type: schema33.properties.homepage.type }, message: "must be string,null" };
1004
+ let data7 = data.homepage;
1005
+ if (typeof data7 !== "string" && data7 !== null) {
1006
+ const err26 = { instancePath: instancePath + "/homepage", schemaPath: "#/properties/homepage/type", keyword: "type", params: { type: schema33.properties.homepage.type }, message: "must be string,null" };
857
1007
  if (vErrors === null) {
858
- vErrors = [err22];
1008
+ vErrors = [err26];
859
1009
  } else {
860
- vErrors.push(err22);
1010
+ vErrors.push(err26);
861
1011
  }
862
1012
  errors++;
863
1013
  }
864
- if (typeof data5 === "string") {
865
- if (!formats0(data5)) {
866
- const err23 = { instancePath: instancePath + "/homepage", schemaPath: "#/properties/homepage/format", keyword: "format", params: { format: "uri" }, message: 'must match format "' + "uri" + '"' };
1014
+ if (typeof data7 === "string") {
1015
+ if (!formats0(data7)) {
1016
+ const err27 = { instancePath: instancePath + "/homepage", schemaPath: "#/properties/homepage/format", keyword: "format", params: { format: "uri" }, message: 'must match format "' + "uri" + '"' };
867
1017
  if (vErrors === null) {
868
- vErrors = [err23];
1018
+ vErrors = [err27];
869
1019
  } else {
870
- vErrors.push(err23);
1020
+ vErrors.push(err27);
871
1021
  }
872
1022
  errors++;
873
1023
  }
874
1024
  }
875
1025
  }
876
1026
  if (data.source !== undefined) {
877
- let data6 = data.source;
878
- if (typeof data6 !== "string" && data6 !== null) {
879
- const err24 = { instancePath: instancePath + "/source", schemaPath: "#/properties/source/type", keyword: "type", params: { type: schema33.properties.source.type }, message: "must be string,null" };
1027
+ let data8 = data.source;
1028
+ if (typeof data8 !== "string" && data8 !== null) {
1029
+ const err28 = { instancePath: instancePath + "/source", schemaPath: "#/properties/source/type", keyword: "type", params: { type: schema33.properties.source.type }, message: "must be string,null" };
880
1030
  if (vErrors === null) {
881
- vErrors = [err24];
1031
+ vErrors = [err28];
882
1032
  } else {
883
- vErrors.push(err24);
1033
+ vErrors.push(err28);
884
1034
  }
885
1035
  errors++;
886
1036
  }
887
- if (typeof data6 === "string") {
888
- if (!formats0(data6)) {
889
- const err25 = { instancePath: instancePath + "/source", schemaPath: "#/properties/source/format", keyword: "format", params: { format: "uri" }, message: 'must match format "' + "uri" + '"' };
1037
+ if (typeof data8 === "string") {
1038
+ if (!formats0(data8)) {
1039
+ const err29 = { instancePath: instancePath + "/source", schemaPath: "#/properties/source/format", keyword: "format", params: { format: "uri" }, message: 'must match format "' + "uri" + '"' };
890
1040
  if (vErrors === null) {
891
- vErrors = [err25];
1041
+ vErrors = [err29];
892
1042
  } else {
893
- vErrors.push(err25);
1043
+ vErrors.push(err29);
894
1044
  }
895
1045
  errors++;
896
1046
  }
897
1047
  }
898
1048
  }
899
1049
  if (data.versions !== undefined) {
900
- let data7 = data.versions;
901
- if (Array.isArray(data7)) {
902
- if (data7.length < 1) {
903
- const err26 = { instancePath: instancePath + "/versions", schemaPath: "#/properties/versions/minItems", keyword: "minItems", params: { limit: 1 }, message: "must NOT have fewer than 1 items" };
1050
+ let data9 = data.versions;
1051
+ if (Array.isArray(data9)) {
1052
+ if (data9.length < 1) {
1053
+ const err30 = { instancePath: instancePath + "/versions", schemaPath: "#/properties/versions/minItems", keyword: "minItems", params: { limit: 1 }, message: "must NOT have fewer than 1 items" };
904
1054
  if (vErrors === null) {
905
- vErrors = [err26];
1055
+ vErrors = [err30];
906
1056
  } else {
907
- vErrors.push(err26);
1057
+ vErrors.push(err30);
908
1058
  }
909
1059
  errors++;
910
1060
  }
911
- const len0 = data7.length;
912
- for (let i0 = 0;i0 < len0; i0++) {
913
- if (!validate22(data7[i0], { instancePath: instancePath + "/versions/" + i0, parentData: data7, parentDataProperty: i0, rootData, dynamicAnchors })) {
1061
+ const len1 = data9.length;
1062
+ for (let i1 = 0;i1 < len1; i1++) {
1063
+ if (!validate22(data9[i1], { instancePath: instancePath + "/versions/" + i1, parentData: data9, parentDataProperty: i1, rootData, dynamicAnchors })) {
914
1064
  vErrors = vErrors === null ? validate22.errors : vErrors.concat(validate22.errors);
915
1065
  errors = vErrors.length;
916
1066
  }
917
1067
  }
918
1068
  } else {
919
- const err27 = { instancePath: instancePath + "/versions", schemaPath: "#/properties/versions/type", keyword: "type", params: { type: "array" }, message: "must be array" };
1069
+ const err31 = { instancePath: instancePath + "/versions", schemaPath: "#/properties/versions/type", keyword: "type", params: { type: "array" }, message: "must be array" };
920
1070
  if (vErrors === null) {
921
- vErrors = [err27];
1071
+ vErrors = [err31];
922
1072
  } else {
923
- vErrors.push(err27);
1073
+ vErrors.push(err31);
924
1074
  }
925
1075
  errors++;
926
1076
  }
927
1077
  }
928
1078
  } else {
929
- const err28 = { instancePath, schemaPath: "#/type", keyword: "type", params: { type: "object" }, message: "must be object" };
1079
+ const err32 = { instancePath, schemaPath: "#/type", keyword: "type", params: { type: "object" }, message: "must be object" };
930
1080
  if (vErrors === null) {
931
- vErrors = [err28];
1081
+ vErrors = [err32];
932
1082
  } else {
933
- vErrors.push(err28);
1083
+ vErrors.push(err32);
934
1084
  }
935
1085
  errors++;
936
1086
  }
@@ -1368,7 +1518,7 @@ var require_validator = __commonJS(function(exports, module) {
1368
1518
  if (data11.description !== undefined) {
1369
1519
  let data14 = data11.description;
1370
1520
  if (typeof data14 !== "string" && data14 !== null) {
1371
- const err39 = { instancePath: instancePath + "/recommended_sources/" + i1 + "/description", schemaPath: "#/$defs/RecommendedSource/properties/description/type", keyword: "type", params: { type: schema40.properties.description.type }, message: "must be string,null" };
1521
+ const err39 = { instancePath: instancePath + "/recommended_sources/" + i1 + "/description", schemaPath: "#/$defs/RecommendedSource/properties/description/type", keyword: "type", params: { type: schema41.properties.description.type }, message: "must be string,null" };
1372
1522
  if (vErrors === null) {
1373
1523
  vErrors = [err39];
1374
1524
  } else {