a tool for shared writing and social publishing
at feature/reader 1859 lines 51 kB view raw
1/** 2 * GENERATED CODE - DO NOT MODIFY 3 */ 4import { 5 type LexiconDoc, 6 Lexicons, 7 ValidationError, 8 type ValidationResult, 9} from '@atproto/lexicon' 10import { type $Typed, is$typed, maybe$typed } from './util' 11 12export const schemaDict = { 13 AppBskyActorProfile: { 14 lexicon: 1, 15 id: 'app.bsky.actor.profile', 16 defs: { 17 main: { 18 type: 'record', 19 description: 'A declaration of a Bluesky account profile.', 20 key: 'literal:self', 21 record: { 22 type: 'object', 23 properties: { 24 displayName: { 25 type: 'string', 26 maxGraphemes: 64, 27 maxLength: 640, 28 }, 29 description: { 30 type: 'string', 31 description: 'Free-form profile description text.', 32 maxGraphemes: 256, 33 maxLength: 2560, 34 }, 35 avatar: { 36 type: 'blob', 37 description: 38 "Small image to be displayed next to posts from account. AKA, 'profile picture'", 39 accept: ['image/png', 'image/jpeg'], 40 maxSize: 1000000, 41 }, 42 banner: { 43 type: 'blob', 44 description: 45 'Larger horizontal image to display behind profile view.', 46 accept: ['image/png', 'image/jpeg'], 47 maxSize: 1000000, 48 }, 49 labels: { 50 type: 'union', 51 description: 52 'Self-label values, specific to the Bluesky application, on the overall account.', 53 refs: ['lex:com.atproto.label.defs#selfLabels'], 54 }, 55 joinedViaStarterPack: { 56 type: 'ref', 57 ref: 'lex:com.atproto.repo.strongRef', 58 }, 59 pinnedPost: { 60 type: 'ref', 61 ref: 'lex:com.atproto.repo.strongRef', 62 }, 63 createdAt: { 64 type: 'string', 65 format: 'datetime', 66 }, 67 }, 68 }, 69 }, 70 }, 71 }, 72 ComAtprotoLabelDefs: { 73 lexicon: 1, 74 id: 'com.atproto.label.defs', 75 defs: { 76 label: { 77 type: 'object', 78 description: 79 'Metadata tag on an atproto resource (eg, repo or record).', 80 required: ['src', 'uri', 'val', 'cts'], 81 properties: { 82 ver: { 83 type: 'integer', 84 description: 'The AT Protocol version of the label object.', 85 }, 86 src: { 87 type: 'string', 88 format: 'did', 89 description: 'DID of the actor who created this label.', 90 }, 91 uri: { 92 type: 'string', 93 format: 'uri', 94 description: 95 'AT URI of the record, repository (account), or other resource that this label applies to.', 96 }, 97 cid: { 98 type: 'string', 99 format: 'cid', 100 description: 101 "Optionally, CID specifying the specific version of 'uri' resource this label applies to.", 102 }, 103 val: { 104 type: 'string', 105 maxLength: 128, 106 description: 107 'The short string name of the value or type of this label.', 108 }, 109 neg: { 110 type: 'boolean', 111 description: 112 'If true, this is a negation label, overwriting a previous label.', 113 }, 114 cts: { 115 type: 'string', 116 format: 'datetime', 117 description: 'Timestamp when this label was created.', 118 }, 119 exp: { 120 type: 'string', 121 format: 'datetime', 122 description: 123 'Timestamp at which this label expires (no longer applies).', 124 }, 125 sig: { 126 type: 'bytes', 127 description: 'Signature of dag-cbor encoded label.', 128 }, 129 }, 130 }, 131 selfLabels: { 132 type: 'object', 133 description: 134 'Metadata tags on an atproto record, published by the author within the record.', 135 required: ['values'], 136 properties: { 137 values: { 138 type: 'array', 139 items: { 140 type: 'ref', 141 ref: 'lex:com.atproto.label.defs#selfLabel', 142 }, 143 maxLength: 10, 144 }, 145 }, 146 }, 147 selfLabel: { 148 type: 'object', 149 description: 150 'Metadata tag on an atproto record, published by the author within the record. Note that schemas should use #selfLabels, not #selfLabel.', 151 required: ['val'], 152 properties: { 153 val: { 154 type: 'string', 155 maxLength: 128, 156 description: 157 'The short string name of the value or type of this label.', 158 }, 159 }, 160 }, 161 labelValueDefinition: { 162 type: 'object', 163 description: 164 'Declares a label value and its expected interpretations and behaviors.', 165 required: ['identifier', 'severity', 'blurs', 'locales'], 166 properties: { 167 identifier: { 168 type: 'string', 169 description: 170 "The value of the label being defined. Must only include lowercase ascii and the '-' character ([a-z-]+).", 171 maxLength: 100, 172 maxGraphemes: 100, 173 }, 174 severity: { 175 type: 'string', 176 description: 177 "How should a client visually convey this label? 'inform' means neutral and informational; 'alert' means negative and warning; 'none' means show nothing.", 178 knownValues: ['inform', 'alert', 'none'], 179 }, 180 blurs: { 181 type: 'string', 182 description: 183 "What should this label hide in the UI, if applied? 'content' hides all of the target; 'media' hides the images/video/audio; 'none' hides nothing.", 184 knownValues: ['content', 'media', 'none'], 185 }, 186 defaultSetting: { 187 type: 'string', 188 description: 'The default setting for this label.', 189 knownValues: ['ignore', 'warn', 'hide'], 190 default: 'warn', 191 }, 192 adultOnly: { 193 type: 'boolean', 194 description: 195 'Does the user need to have adult content enabled in order to configure this label?', 196 }, 197 locales: { 198 type: 'array', 199 items: { 200 type: 'ref', 201 ref: 'lex:com.atproto.label.defs#labelValueDefinitionStrings', 202 }, 203 }, 204 }, 205 }, 206 labelValueDefinitionStrings: { 207 type: 'object', 208 description: 209 'Strings which describe the label in the UI, localized into a specific language.', 210 required: ['lang', 'name', 'description'], 211 properties: { 212 lang: { 213 type: 'string', 214 description: 215 'The code of the language these strings are written in.', 216 format: 'language', 217 }, 218 name: { 219 type: 'string', 220 description: 'A short human-readable name for the label.', 221 maxGraphemes: 64, 222 maxLength: 640, 223 }, 224 description: { 225 type: 'string', 226 description: 227 'A longer description of what the label means and why it might be applied.', 228 maxGraphemes: 10000, 229 maxLength: 100000, 230 }, 231 }, 232 }, 233 labelValue: { 234 type: 'string', 235 knownValues: [ 236 '!hide', 237 '!no-promote', 238 '!warn', 239 '!no-unauthenticated', 240 'dmca-violation', 241 'doxxing', 242 'porn', 243 'sexual', 244 'nudity', 245 'nsfl', 246 'gore', 247 ], 248 }, 249 }, 250 }, 251 ComAtprotoRepoApplyWrites: { 252 lexicon: 1, 253 id: 'com.atproto.repo.applyWrites', 254 defs: { 255 main: { 256 type: 'procedure', 257 description: 258 'Apply a batch transaction of repository creates, updates, and deletes. Requires auth, implemented by PDS.', 259 input: { 260 encoding: 'application/json', 261 schema: { 262 type: 'object', 263 required: ['repo', 'writes'], 264 properties: { 265 repo: { 266 type: 'string', 267 format: 'at-identifier', 268 description: 269 'The handle or DID of the repo (aka, current account).', 270 }, 271 validate: { 272 type: 'boolean', 273 description: 274 "Can be set to 'false' to skip Lexicon schema validation of record data across all operations, 'true' to require it, or leave unset to validate only for known Lexicons.", 275 }, 276 writes: { 277 type: 'array', 278 items: { 279 type: 'union', 280 refs: [ 281 'lex:com.atproto.repo.applyWrites#create', 282 'lex:com.atproto.repo.applyWrites#update', 283 'lex:com.atproto.repo.applyWrites#delete', 284 ], 285 closed: true, 286 }, 287 }, 288 swapCommit: { 289 type: 'string', 290 description: 291 'If provided, the entire operation will fail if the current repo commit CID does not match this value. Used to prevent conflicting repo mutations.', 292 format: 'cid', 293 }, 294 }, 295 }, 296 }, 297 output: { 298 encoding: 'application/json', 299 schema: { 300 type: 'object', 301 required: [], 302 properties: { 303 commit: { 304 type: 'ref', 305 ref: 'lex:com.atproto.repo.defs#commitMeta', 306 }, 307 results: { 308 type: 'array', 309 items: { 310 type: 'union', 311 refs: [ 312 'lex:com.atproto.repo.applyWrites#createResult', 313 'lex:com.atproto.repo.applyWrites#updateResult', 314 'lex:com.atproto.repo.applyWrites#deleteResult', 315 ], 316 closed: true, 317 }, 318 }, 319 }, 320 }, 321 }, 322 errors: [ 323 { 324 name: 'InvalidSwap', 325 description: 326 "Indicates that the 'swapCommit' parameter did not match current commit.", 327 }, 328 ], 329 }, 330 create: { 331 type: 'object', 332 description: 'Operation which creates a new record.', 333 required: ['collection', 'value'], 334 properties: { 335 collection: { 336 type: 'string', 337 format: 'nsid', 338 }, 339 rkey: { 340 type: 'string', 341 maxLength: 512, 342 format: 'record-key', 343 description: 344 'NOTE: maxLength is redundant with record-key format. Keeping it temporarily to ensure backwards compatibility.', 345 }, 346 value: { 347 type: 'unknown', 348 }, 349 }, 350 }, 351 update: { 352 type: 'object', 353 description: 'Operation which updates an existing record.', 354 required: ['collection', 'rkey', 'value'], 355 properties: { 356 collection: { 357 type: 'string', 358 format: 'nsid', 359 }, 360 rkey: { 361 type: 'string', 362 format: 'record-key', 363 }, 364 value: { 365 type: 'unknown', 366 }, 367 }, 368 }, 369 delete: { 370 type: 'object', 371 description: 'Operation which deletes an existing record.', 372 required: ['collection', 'rkey'], 373 properties: { 374 collection: { 375 type: 'string', 376 format: 'nsid', 377 }, 378 rkey: { 379 type: 'string', 380 format: 'record-key', 381 }, 382 }, 383 }, 384 createResult: { 385 type: 'object', 386 required: ['uri', 'cid'], 387 properties: { 388 uri: { 389 type: 'string', 390 format: 'at-uri', 391 }, 392 cid: { 393 type: 'string', 394 format: 'cid', 395 }, 396 validationStatus: { 397 type: 'string', 398 knownValues: ['valid', 'unknown'], 399 }, 400 }, 401 }, 402 updateResult: { 403 type: 'object', 404 required: ['uri', 'cid'], 405 properties: { 406 uri: { 407 type: 'string', 408 format: 'at-uri', 409 }, 410 cid: { 411 type: 'string', 412 format: 'cid', 413 }, 414 validationStatus: { 415 type: 'string', 416 knownValues: ['valid', 'unknown'], 417 }, 418 }, 419 }, 420 deleteResult: { 421 type: 'object', 422 required: [], 423 properties: {}, 424 }, 425 }, 426 }, 427 ComAtprotoRepoCreateRecord: { 428 lexicon: 1, 429 id: 'com.atproto.repo.createRecord', 430 defs: { 431 main: { 432 type: 'procedure', 433 description: 434 'Create a single new repository record. Requires auth, implemented by PDS.', 435 input: { 436 encoding: 'application/json', 437 schema: { 438 type: 'object', 439 required: ['repo', 'collection', 'record'], 440 properties: { 441 repo: { 442 type: 'string', 443 format: 'at-identifier', 444 description: 445 'The handle or DID of the repo (aka, current account).', 446 }, 447 collection: { 448 type: 'string', 449 format: 'nsid', 450 description: 'The NSID of the record collection.', 451 }, 452 rkey: { 453 type: 'string', 454 format: 'record-key', 455 description: 'The Record Key.', 456 maxLength: 512, 457 }, 458 validate: { 459 type: 'boolean', 460 description: 461 "Can be set to 'false' to skip Lexicon schema validation of record data, 'true' to require it, or leave unset to validate only for known Lexicons.", 462 }, 463 record: { 464 type: 'unknown', 465 description: 'The record itself. Must contain a $type field.', 466 }, 467 swapCommit: { 468 type: 'string', 469 format: 'cid', 470 description: 471 'Compare and swap with the previous commit by CID.', 472 }, 473 }, 474 }, 475 }, 476 output: { 477 encoding: 'application/json', 478 schema: { 479 type: 'object', 480 required: ['uri', 'cid'], 481 properties: { 482 uri: { 483 type: 'string', 484 format: 'at-uri', 485 }, 486 cid: { 487 type: 'string', 488 format: 'cid', 489 }, 490 commit: { 491 type: 'ref', 492 ref: 'lex:com.atproto.repo.defs#commitMeta', 493 }, 494 validationStatus: { 495 type: 'string', 496 knownValues: ['valid', 'unknown'], 497 }, 498 }, 499 }, 500 }, 501 errors: [ 502 { 503 name: 'InvalidSwap', 504 description: 505 "Indicates that 'swapCommit' didn't match current repo commit.", 506 }, 507 ], 508 }, 509 }, 510 }, 511 ComAtprotoRepoDefs: { 512 lexicon: 1, 513 id: 'com.atproto.repo.defs', 514 defs: { 515 commitMeta: { 516 type: 'object', 517 required: ['cid', 'rev'], 518 properties: { 519 cid: { 520 type: 'string', 521 format: 'cid', 522 }, 523 rev: { 524 type: 'string', 525 format: 'tid', 526 }, 527 }, 528 }, 529 }, 530 }, 531 ComAtprotoRepoDeleteRecord: { 532 lexicon: 1, 533 id: 'com.atproto.repo.deleteRecord', 534 defs: { 535 main: { 536 type: 'procedure', 537 description: 538 "Delete a repository record, or ensure it doesn't exist. Requires auth, implemented by PDS.", 539 input: { 540 encoding: 'application/json', 541 schema: { 542 type: 'object', 543 required: ['repo', 'collection', 'rkey'], 544 properties: { 545 repo: { 546 type: 'string', 547 format: 'at-identifier', 548 description: 549 'The handle or DID of the repo (aka, current account).', 550 }, 551 collection: { 552 type: 'string', 553 format: 'nsid', 554 description: 'The NSID of the record collection.', 555 }, 556 rkey: { 557 type: 'string', 558 format: 'record-key', 559 description: 'The Record Key.', 560 }, 561 swapRecord: { 562 type: 'string', 563 format: 'cid', 564 description: 565 'Compare and swap with the previous record by CID.', 566 }, 567 swapCommit: { 568 type: 'string', 569 format: 'cid', 570 description: 571 'Compare and swap with the previous commit by CID.', 572 }, 573 }, 574 }, 575 }, 576 output: { 577 encoding: 'application/json', 578 schema: { 579 type: 'object', 580 properties: { 581 commit: { 582 type: 'ref', 583 ref: 'lex:com.atproto.repo.defs#commitMeta', 584 }, 585 }, 586 }, 587 }, 588 errors: [ 589 { 590 name: 'InvalidSwap', 591 }, 592 ], 593 }, 594 }, 595 }, 596 ComAtprotoRepoDescribeRepo: { 597 lexicon: 1, 598 id: 'com.atproto.repo.describeRepo', 599 defs: { 600 main: { 601 type: 'query', 602 description: 603 'Get information about an account and repository, including the list of collections. Does not require auth.', 604 parameters: { 605 type: 'params', 606 required: ['repo'], 607 properties: { 608 repo: { 609 type: 'string', 610 format: 'at-identifier', 611 description: 'The handle or DID of the repo.', 612 }, 613 }, 614 }, 615 output: { 616 encoding: 'application/json', 617 schema: { 618 type: 'object', 619 required: [ 620 'handle', 621 'did', 622 'didDoc', 623 'collections', 624 'handleIsCorrect', 625 ], 626 properties: { 627 handle: { 628 type: 'string', 629 format: 'handle', 630 }, 631 did: { 632 type: 'string', 633 format: 'did', 634 }, 635 didDoc: { 636 type: 'unknown', 637 description: 'The complete DID document for this account.', 638 }, 639 collections: { 640 type: 'array', 641 description: 642 'List of all the collections (NSIDs) for which this repo contains at least one record.', 643 items: { 644 type: 'string', 645 format: 'nsid', 646 }, 647 }, 648 handleIsCorrect: { 649 type: 'boolean', 650 description: 651 'Indicates if handle is currently valid (resolves bi-directionally)', 652 }, 653 }, 654 }, 655 }, 656 }, 657 }, 658 }, 659 ComAtprotoRepoGetRecord: { 660 lexicon: 1, 661 id: 'com.atproto.repo.getRecord', 662 defs: { 663 main: { 664 type: 'query', 665 description: 666 'Get a single record from a repository. Does not require auth.', 667 parameters: { 668 type: 'params', 669 required: ['repo', 'collection', 'rkey'], 670 properties: { 671 repo: { 672 type: 'string', 673 format: 'at-identifier', 674 description: 'The handle or DID of the repo.', 675 }, 676 collection: { 677 type: 'string', 678 format: 'nsid', 679 description: 'The NSID of the record collection.', 680 }, 681 rkey: { 682 type: 'string', 683 description: 'The Record Key.', 684 format: 'record-key', 685 }, 686 cid: { 687 type: 'string', 688 format: 'cid', 689 description: 690 'The CID of the version of the record. If not specified, then return the most recent version.', 691 }, 692 }, 693 }, 694 output: { 695 encoding: 'application/json', 696 schema: { 697 type: 'object', 698 required: ['uri', 'value'], 699 properties: { 700 uri: { 701 type: 'string', 702 format: 'at-uri', 703 }, 704 cid: { 705 type: 'string', 706 format: 'cid', 707 }, 708 value: { 709 type: 'unknown', 710 }, 711 }, 712 }, 713 }, 714 errors: [ 715 { 716 name: 'RecordNotFound', 717 }, 718 ], 719 }, 720 }, 721 }, 722 ComAtprotoRepoImportRepo: { 723 lexicon: 1, 724 id: 'com.atproto.repo.importRepo', 725 defs: { 726 main: { 727 type: 'procedure', 728 description: 729 'Import a repo in the form of a CAR file. Requires Content-Length HTTP header to be set.', 730 input: { 731 encoding: 'application/vnd.ipld.car', 732 }, 733 }, 734 }, 735 }, 736 ComAtprotoRepoListMissingBlobs: { 737 lexicon: 1, 738 id: 'com.atproto.repo.listMissingBlobs', 739 defs: { 740 main: { 741 type: 'query', 742 description: 743 'Returns a list of missing blobs for the requesting account. Intended to be used in the account migration flow.', 744 parameters: { 745 type: 'params', 746 properties: { 747 limit: { 748 type: 'integer', 749 minimum: 1, 750 maximum: 1000, 751 default: 500, 752 }, 753 cursor: { 754 type: 'string', 755 }, 756 }, 757 }, 758 output: { 759 encoding: 'application/json', 760 schema: { 761 type: 'object', 762 required: ['blobs'], 763 properties: { 764 cursor: { 765 type: 'string', 766 }, 767 blobs: { 768 type: 'array', 769 items: { 770 type: 'ref', 771 ref: 'lex:com.atproto.repo.listMissingBlobs#recordBlob', 772 }, 773 }, 774 }, 775 }, 776 }, 777 }, 778 recordBlob: { 779 type: 'object', 780 required: ['cid', 'recordUri'], 781 properties: { 782 cid: { 783 type: 'string', 784 format: 'cid', 785 }, 786 recordUri: { 787 type: 'string', 788 format: 'at-uri', 789 }, 790 }, 791 }, 792 }, 793 }, 794 ComAtprotoRepoListRecords: { 795 lexicon: 1, 796 id: 'com.atproto.repo.listRecords', 797 defs: { 798 main: { 799 type: 'query', 800 description: 801 'List a range of records in a repository, matching a specific collection. Does not require auth.', 802 parameters: { 803 type: 'params', 804 required: ['repo', 'collection'], 805 properties: { 806 repo: { 807 type: 'string', 808 format: 'at-identifier', 809 description: 'The handle or DID of the repo.', 810 }, 811 collection: { 812 type: 'string', 813 format: 'nsid', 814 description: 'The NSID of the record type.', 815 }, 816 limit: { 817 type: 'integer', 818 minimum: 1, 819 maximum: 100, 820 default: 50, 821 description: 'The number of records to return.', 822 }, 823 cursor: { 824 type: 'string', 825 }, 826 rkeyStart: { 827 type: 'string', 828 description: 829 'DEPRECATED: The lowest sort-ordered rkey to start from (exclusive)', 830 }, 831 rkeyEnd: { 832 type: 'string', 833 description: 834 'DEPRECATED: The highest sort-ordered rkey to stop at (exclusive)', 835 }, 836 reverse: { 837 type: 'boolean', 838 description: 'Flag to reverse the order of the returned records.', 839 }, 840 }, 841 }, 842 output: { 843 encoding: 'application/json', 844 schema: { 845 type: 'object', 846 required: ['records'], 847 properties: { 848 cursor: { 849 type: 'string', 850 }, 851 records: { 852 type: 'array', 853 items: { 854 type: 'ref', 855 ref: 'lex:com.atproto.repo.listRecords#record', 856 }, 857 }, 858 }, 859 }, 860 }, 861 }, 862 record: { 863 type: 'object', 864 required: ['uri', 'cid', 'value'], 865 properties: { 866 uri: { 867 type: 'string', 868 format: 'at-uri', 869 }, 870 cid: { 871 type: 'string', 872 format: 'cid', 873 }, 874 value: { 875 type: 'unknown', 876 }, 877 }, 878 }, 879 }, 880 }, 881 ComAtprotoRepoPutRecord: { 882 lexicon: 1, 883 id: 'com.atproto.repo.putRecord', 884 defs: { 885 main: { 886 type: 'procedure', 887 description: 888 'Write a repository record, creating or updating it as needed. Requires auth, implemented by PDS.', 889 input: { 890 encoding: 'application/json', 891 schema: { 892 type: 'object', 893 required: ['repo', 'collection', 'rkey', 'record'], 894 nullable: ['swapRecord'], 895 properties: { 896 repo: { 897 type: 'string', 898 format: 'at-identifier', 899 description: 900 'The handle or DID of the repo (aka, current account).', 901 }, 902 collection: { 903 type: 'string', 904 format: 'nsid', 905 description: 'The NSID of the record collection.', 906 }, 907 rkey: { 908 type: 'string', 909 format: 'record-key', 910 description: 'The Record Key.', 911 maxLength: 512, 912 }, 913 validate: { 914 type: 'boolean', 915 description: 916 "Can be set to 'false' to skip Lexicon schema validation of record data, 'true' to require it, or leave unset to validate only for known Lexicons.", 917 }, 918 record: { 919 type: 'unknown', 920 description: 'The record to write.', 921 }, 922 swapRecord: { 923 type: 'string', 924 format: 'cid', 925 description: 926 'Compare and swap with the previous record by CID. WARNING: nullable and optional field; may cause problems with golang implementation', 927 }, 928 swapCommit: { 929 type: 'string', 930 format: 'cid', 931 description: 932 'Compare and swap with the previous commit by CID.', 933 }, 934 }, 935 }, 936 }, 937 output: { 938 encoding: 'application/json', 939 schema: { 940 type: 'object', 941 required: ['uri', 'cid'], 942 properties: { 943 uri: { 944 type: 'string', 945 format: 'at-uri', 946 }, 947 cid: { 948 type: 'string', 949 format: 'cid', 950 }, 951 commit: { 952 type: 'ref', 953 ref: 'lex:com.atproto.repo.defs#commitMeta', 954 }, 955 validationStatus: { 956 type: 'string', 957 knownValues: ['valid', 'unknown'], 958 }, 959 }, 960 }, 961 }, 962 errors: [ 963 { 964 name: 'InvalidSwap', 965 }, 966 ], 967 }, 968 }, 969 }, 970 ComAtprotoRepoStrongRef: { 971 lexicon: 1, 972 id: 'com.atproto.repo.strongRef', 973 description: 'A URI with a content-hash fingerprint.', 974 defs: { 975 main: { 976 type: 'object', 977 required: ['uri', 'cid'], 978 properties: { 979 uri: { 980 type: 'string', 981 format: 'at-uri', 982 }, 983 cid: { 984 type: 'string', 985 format: 'cid', 986 }, 987 }, 988 }, 989 }, 990 }, 991 ComAtprotoRepoUploadBlob: { 992 lexicon: 1, 993 id: 'com.atproto.repo.uploadBlob', 994 defs: { 995 main: { 996 type: 'procedure', 997 description: 998 'Upload a new blob, to be referenced from a repository record. The blob will be deleted if it is not referenced within a time window (eg, minutes). Blob restrictions (mimetype, size, etc) are enforced when the reference is created. Requires auth, implemented by PDS.', 999 input: { 1000 encoding: '*/*', 1001 }, 1002 output: { 1003 encoding: 'application/json', 1004 schema: { 1005 type: 'object', 1006 required: ['blob'], 1007 properties: { 1008 blob: { 1009 type: 'blob', 1010 }, 1011 }, 1012 }, 1013 }, 1014 }, 1015 }, 1016 }, 1017 PubLeafletBlocksBlockquote: { 1018 lexicon: 1, 1019 id: 'pub.leaflet.blocks.blockquote', 1020 defs: { 1021 main: { 1022 type: 'object', 1023 required: ['plaintext'], 1024 properties: { 1025 plaintext: { 1026 type: 'string', 1027 }, 1028 facets: { 1029 type: 'array', 1030 items: { 1031 type: 'ref', 1032 ref: 'lex:pub.leaflet.richtext.facet', 1033 }, 1034 }, 1035 }, 1036 }, 1037 }, 1038 }, 1039 PubLeafletBlocksBskyPost: { 1040 lexicon: 1, 1041 id: 'pub.leaflet.blocks.bskyPost', 1042 defs: { 1043 main: { 1044 type: 'object', 1045 required: ['postRef'], 1046 properties: { 1047 postRef: { 1048 type: 'ref', 1049 ref: 'lex:com.atproto.repo.strongRef', 1050 }, 1051 }, 1052 }, 1053 }, 1054 }, 1055 PubLeafletBlocksCode: { 1056 lexicon: 1, 1057 id: 'pub.leaflet.blocks.code', 1058 defs: { 1059 main: { 1060 type: 'object', 1061 required: ['plaintext'], 1062 properties: { 1063 plaintext: { 1064 type: 'string', 1065 }, 1066 language: { 1067 type: 'string', 1068 }, 1069 syntaxHighlightingTheme: { 1070 type: 'string', 1071 }, 1072 }, 1073 }, 1074 }, 1075 }, 1076 PubLeafletBlocksHeader: { 1077 lexicon: 1, 1078 id: 'pub.leaflet.blocks.header', 1079 defs: { 1080 main: { 1081 type: 'object', 1082 required: ['plaintext'], 1083 properties: { 1084 level: { 1085 type: 'integer', 1086 minimum: 1, 1087 maximum: 6, 1088 }, 1089 plaintext: { 1090 type: 'string', 1091 }, 1092 facets: { 1093 type: 'array', 1094 items: { 1095 type: 'ref', 1096 ref: 'lex:pub.leaflet.richtext.facet', 1097 }, 1098 }, 1099 }, 1100 }, 1101 }, 1102 }, 1103 PubLeafletBlocksHorizontalRule: { 1104 lexicon: 1, 1105 id: 'pub.leaflet.blocks.horizontalRule', 1106 defs: { 1107 main: { 1108 type: 'object', 1109 required: [], 1110 properties: {}, 1111 }, 1112 }, 1113 }, 1114 PubLeafletBlocksIframe: { 1115 lexicon: 1, 1116 id: 'pub.leaflet.blocks.iframe', 1117 defs: { 1118 main: { 1119 type: 'object', 1120 required: ['url'], 1121 properties: { 1122 url: { 1123 type: 'string', 1124 format: 'uri', 1125 }, 1126 height: { 1127 type: 'integer', 1128 minimum: 16, 1129 maximum: 1600, 1130 }, 1131 }, 1132 }, 1133 }, 1134 }, 1135 PubLeafletBlocksImage: { 1136 lexicon: 1, 1137 id: 'pub.leaflet.blocks.image', 1138 defs: { 1139 main: { 1140 type: 'object', 1141 required: ['image', 'aspectRatio'], 1142 properties: { 1143 image: { 1144 type: 'blob', 1145 accept: ['image/*'], 1146 maxSize: 1000000, 1147 }, 1148 alt: { 1149 type: 'string', 1150 description: 1151 'Alt text description of the image, for accessibility.', 1152 }, 1153 aspectRatio: { 1154 type: 'ref', 1155 ref: 'lex:pub.leaflet.blocks.image#aspectRatio', 1156 }, 1157 }, 1158 }, 1159 aspectRatio: { 1160 type: 'object', 1161 required: ['width', 'height'], 1162 properties: { 1163 width: { 1164 type: 'integer', 1165 }, 1166 height: { 1167 type: 'integer', 1168 }, 1169 }, 1170 }, 1171 }, 1172 }, 1173 PubLeafletBlocksMath: { 1174 lexicon: 1, 1175 id: 'pub.leaflet.blocks.math', 1176 defs: { 1177 main: { 1178 type: 'object', 1179 required: ['tex'], 1180 properties: { 1181 tex: { 1182 type: 'string', 1183 }, 1184 }, 1185 }, 1186 }, 1187 }, 1188 PubLeafletBlocksText: { 1189 lexicon: 1, 1190 id: 'pub.leaflet.blocks.text', 1191 defs: { 1192 main: { 1193 type: 'object', 1194 required: ['plaintext'], 1195 properties: { 1196 plaintext: { 1197 type: 'string', 1198 }, 1199 facets: { 1200 type: 'array', 1201 items: { 1202 type: 'ref', 1203 ref: 'lex:pub.leaflet.richtext.facet', 1204 }, 1205 }, 1206 }, 1207 }, 1208 }, 1209 }, 1210 PubLeafletBlocksUnorderedList: { 1211 lexicon: 1, 1212 id: 'pub.leaflet.blocks.unorderedList', 1213 defs: { 1214 main: { 1215 type: 'object', 1216 required: ['children'], 1217 properties: { 1218 children: { 1219 type: 'array', 1220 items: { 1221 type: 'ref', 1222 ref: 'lex:pub.leaflet.blocks.unorderedList#listItem', 1223 }, 1224 }, 1225 }, 1226 }, 1227 listItem: { 1228 type: 'object', 1229 required: ['content'], 1230 properties: { 1231 content: { 1232 type: 'union', 1233 refs: [ 1234 'lex:pub.leaflet.blocks.text', 1235 'lex:pub.leaflet.blocks.header', 1236 'lex:pub.leaflet.blocks.image', 1237 ], 1238 }, 1239 children: { 1240 type: 'array', 1241 items: { 1242 type: 'ref', 1243 ref: 'lex:pub.leaflet.blocks.unorderedList#listItem', 1244 }, 1245 }, 1246 }, 1247 }, 1248 }, 1249 }, 1250 PubLeafletBlocksWebsite: { 1251 lexicon: 1, 1252 id: 'pub.leaflet.blocks.website', 1253 defs: { 1254 main: { 1255 type: 'object', 1256 required: ['src'], 1257 properties: { 1258 previewImage: { 1259 type: 'blob', 1260 accept: ['image/*'], 1261 maxSize: 1000000, 1262 }, 1263 title: { 1264 type: 'string', 1265 }, 1266 description: { 1267 type: 'string', 1268 }, 1269 src: { 1270 type: 'string', 1271 format: 'uri', 1272 }, 1273 }, 1274 }, 1275 }, 1276 }, 1277 PubLeafletComment: { 1278 lexicon: 1, 1279 id: 'pub.leaflet.comment', 1280 revision: 1, 1281 description: 'A lexicon for comments on documents', 1282 defs: { 1283 main: { 1284 type: 'record', 1285 key: 'tid', 1286 description: 'Record containing a comment', 1287 record: { 1288 type: 'object', 1289 required: ['subject', 'plaintext', 'createdAt'], 1290 properties: { 1291 subject: { 1292 type: 'string', 1293 format: 'at-uri', 1294 }, 1295 createdAt: { 1296 type: 'string', 1297 format: 'datetime', 1298 }, 1299 reply: { 1300 type: 'ref', 1301 ref: 'lex:pub.leaflet.comment#replyRef', 1302 }, 1303 plaintext: { 1304 type: 'string', 1305 }, 1306 facets: { 1307 type: 'array', 1308 items: { 1309 type: 'ref', 1310 ref: 'lex:pub.leaflet.richtext.facet', 1311 }, 1312 }, 1313 attachment: { 1314 type: 'union', 1315 refs: ['lex:pub.leaflet.comment#linearDocumentQuote'], 1316 }, 1317 }, 1318 }, 1319 }, 1320 linearDocumentQuote: { 1321 type: 'object', 1322 required: ['document', 'quote'], 1323 properties: { 1324 document: { 1325 type: 'string', 1326 format: 'at-uri', 1327 }, 1328 quote: { 1329 type: 'ref', 1330 ref: 'lex:pub.leaflet.pages.linearDocument#quote', 1331 }, 1332 }, 1333 }, 1334 replyRef: { 1335 type: 'object', 1336 required: ['parent'], 1337 properties: { 1338 parent: { 1339 type: 'string', 1340 format: 'at-uri', 1341 }, 1342 }, 1343 }, 1344 }, 1345 }, 1346 PubLeafletDocument: { 1347 lexicon: 1, 1348 id: 'pub.leaflet.document', 1349 revision: 1, 1350 description: 'A lexicon for long form rich media documents', 1351 defs: { 1352 main: { 1353 type: 'record', 1354 key: 'tid', 1355 description: 'Record containing a document', 1356 record: { 1357 type: 'object', 1358 required: ['pages', 'author', 'title', 'publication'], 1359 properties: { 1360 title: { 1361 type: 'string', 1362 maxLength: 1280, 1363 maxGraphemes: 128, 1364 }, 1365 postRef: { 1366 type: 'ref', 1367 ref: 'lex:com.atproto.repo.strongRef', 1368 }, 1369 description: { 1370 type: 'string', 1371 maxLength: 3000, 1372 maxGraphemes: 300, 1373 }, 1374 publishedAt: { 1375 type: 'string', 1376 format: 'datetime', 1377 }, 1378 publication: { 1379 type: 'string', 1380 format: 'at-uri', 1381 }, 1382 author: { 1383 type: 'string', 1384 format: 'at-identifier', 1385 }, 1386 pages: { 1387 type: 'array', 1388 items: { 1389 type: 'union', 1390 refs: ['lex:pub.leaflet.pages.linearDocument'], 1391 }, 1392 }, 1393 }, 1394 }, 1395 }, 1396 }, 1397 }, 1398 PubLeafletGraphSubscription: { 1399 lexicon: 1, 1400 id: 'pub.leaflet.graph.subscription', 1401 defs: { 1402 main: { 1403 type: 'record', 1404 key: 'tid', 1405 description: 'Record declaring a subscription to a publication', 1406 record: { 1407 type: 'object', 1408 required: ['publication'], 1409 properties: { 1410 publication: { 1411 type: 'string', 1412 format: 'at-uri', 1413 }, 1414 }, 1415 }, 1416 }, 1417 }, 1418 }, 1419 PubLeafletPagesLinearDocument: { 1420 lexicon: 1, 1421 id: 'pub.leaflet.pages.linearDocument', 1422 defs: { 1423 main: { 1424 type: 'object', 1425 properties: { 1426 blocks: { 1427 type: 'array', 1428 items: { 1429 type: 'ref', 1430 ref: 'lex:pub.leaflet.pages.linearDocument#block', 1431 }, 1432 }, 1433 }, 1434 }, 1435 block: { 1436 type: 'object', 1437 required: ['block'], 1438 properties: { 1439 block: { 1440 type: 'union', 1441 refs: [ 1442 'lex:pub.leaflet.blocks.iframe', 1443 'lex:pub.leaflet.blocks.text', 1444 'lex:pub.leaflet.blocks.blockquote', 1445 'lex:pub.leaflet.blocks.header', 1446 'lex:pub.leaflet.blocks.image', 1447 'lex:pub.leaflet.blocks.unorderedList', 1448 'lex:pub.leaflet.blocks.website', 1449 'lex:pub.leaflet.blocks.math', 1450 'lex:pub.leaflet.blocks.code', 1451 'lex:pub.leaflet.blocks.horizontalRule', 1452 'lex:pub.leaflet.blocks.bskyPost', 1453 ], 1454 }, 1455 alignment: { 1456 type: 'string', 1457 knownValues: [ 1458 'lex:pub.leaflet.pages.linearDocument#textAlignLeft', 1459 'lex:pub.leaflet.pages.linearDocument#textAlignCenter', 1460 'lex:pub.leaflet.pages.linearDocument#textAlignRight', 1461 'lex:pub.leaflet.pages.linearDocument#textAlignJustify', 1462 ], 1463 }, 1464 }, 1465 }, 1466 textAlignLeft: { 1467 type: 'token', 1468 }, 1469 textAlignCenter: { 1470 type: 'token', 1471 }, 1472 textAlignRight: { 1473 type: 'token', 1474 }, 1475 quote: { 1476 type: 'object', 1477 required: ['start', 'end'], 1478 properties: { 1479 start: { 1480 type: 'ref', 1481 ref: 'lex:pub.leaflet.pages.linearDocument#position', 1482 }, 1483 end: { 1484 type: 'ref', 1485 ref: 'lex:pub.leaflet.pages.linearDocument#position', 1486 }, 1487 }, 1488 }, 1489 position: { 1490 type: 'object', 1491 required: ['block', 'offset'], 1492 properties: { 1493 block: { 1494 type: 'array', 1495 items: { 1496 type: 'integer', 1497 }, 1498 }, 1499 offset: { 1500 type: 'integer', 1501 }, 1502 }, 1503 }, 1504 }, 1505 }, 1506 PubLeafletPublication: { 1507 lexicon: 1, 1508 id: 'pub.leaflet.publication', 1509 defs: { 1510 main: { 1511 type: 'record', 1512 key: 'tid', 1513 description: 'Record declaring a publication', 1514 record: { 1515 type: 'object', 1516 required: ['name'], 1517 properties: { 1518 name: { 1519 type: 'string', 1520 maxLength: 2000, 1521 }, 1522 base_path: { 1523 type: 'string', 1524 format: 'uri', 1525 }, 1526 description: { 1527 type: 'string', 1528 maxLength: 2000, 1529 }, 1530 icon: { 1531 type: 'blob', 1532 accept: ['image/*'], 1533 maxSize: 1000000, 1534 }, 1535 theme: { 1536 type: 'ref', 1537 ref: 'lex:pub.leaflet.publication#theme', 1538 }, 1539 preferences: { 1540 type: 'ref', 1541 ref: 'lex:pub.leaflet.publication#preferences', 1542 }, 1543 }, 1544 }, 1545 }, 1546 preferences: { 1547 type: 'object', 1548 properties: { 1549 showInDiscover: { 1550 type: 'boolean', 1551 default: true, 1552 }, 1553 showComments: { 1554 type: 'boolean', 1555 default: true, 1556 }, 1557 }, 1558 }, 1559 theme: { 1560 type: 'object', 1561 properties: { 1562 backgroundColor: { 1563 type: 'union', 1564 refs: [ 1565 'lex:pub.leaflet.theme.color#rgba', 1566 'lex:pub.leaflet.theme.color#rgb', 1567 ], 1568 }, 1569 backgroundImage: { 1570 type: 'ref', 1571 ref: 'lex:pub.leaflet.theme.backgroundImage', 1572 }, 1573 primary: { 1574 type: 'union', 1575 refs: [ 1576 'lex:pub.leaflet.theme.color#rgba', 1577 'lex:pub.leaflet.theme.color#rgb', 1578 ], 1579 }, 1580 pageBackground: { 1581 type: 'union', 1582 refs: [ 1583 'lex:pub.leaflet.theme.color#rgba', 1584 'lex:pub.leaflet.theme.color#rgb', 1585 ], 1586 }, 1587 showPageBackground: { 1588 type: 'boolean', 1589 default: false, 1590 }, 1591 accentBackground: { 1592 type: 'union', 1593 refs: [ 1594 'lex:pub.leaflet.theme.color#rgba', 1595 'lex:pub.leaflet.theme.color#rgb', 1596 ], 1597 }, 1598 accentText: { 1599 type: 'union', 1600 refs: [ 1601 'lex:pub.leaflet.theme.color#rgba', 1602 'lex:pub.leaflet.theme.color#rgb', 1603 ], 1604 }, 1605 }, 1606 }, 1607 }, 1608 }, 1609 PubLeafletRichtextFacet: { 1610 lexicon: 1, 1611 id: 'pub.leaflet.richtext.facet', 1612 defs: { 1613 main: { 1614 type: 'object', 1615 description: 'Annotation of a sub-string within rich text.', 1616 required: ['index', 'features'], 1617 properties: { 1618 index: { 1619 type: 'ref', 1620 ref: 'lex:pub.leaflet.richtext.facet#byteSlice', 1621 }, 1622 features: { 1623 type: 'array', 1624 items: { 1625 type: 'union', 1626 refs: [ 1627 'lex:pub.leaflet.richtext.facet#link', 1628 'lex:pub.leaflet.richtext.facet#code', 1629 'lex:pub.leaflet.richtext.facet#highlight', 1630 'lex:pub.leaflet.richtext.facet#underline', 1631 'lex:pub.leaflet.richtext.facet#strikethrough', 1632 'lex:pub.leaflet.richtext.facet#id', 1633 'lex:pub.leaflet.richtext.facet#bold', 1634 'lex:pub.leaflet.richtext.facet#italic', 1635 ], 1636 }, 1637 }, 1638 }, 1639 }, 1640 byteSlice: { 1641 type: 'object', 1642 description: 1643 'Specifies the sub-string range a facet feature applies to. Start index is inclusive, end index is exclusive. Indices are zero-indexed, counting bytes of the UTF-8 encoded text. NOTE: some languages, like Javascript, use UTF-16 or Unicode codepoints for string slice indexing; in these languages, convert to byte arrays before working with facets.', 1644 required: ['byteStart', 'byteEnd'], 1645 properties: { 1646 byteStart: { 1647 type: 'integer', 1648 minimum: 0, 1649 }, 1650 byteEnd: { 1651 type: 'integer', 1652 minimum: 0, 1653 }, 1654 }, 1655 }, 1656 link: { 1657 type: 'object', 1658 description: 1659 'Facet feature for a URL. The text URL may have been simplified or truncated, but the facet reference should be a complete URL.', 1660 required: ['uri'], 1661 properties: { 1662 uri: { 1663 type: 'string', 1664 format: 'uri', 1665 }, 1666 }, 1667 }, 1668 code: { 1669 type: 'object', 1670 description: 'Facet feature for inline code.', 1671 required: [], 1672 properties: {}, 1673 }, 1674 highlight: { 1675 type: 'object', 1676 description: 'Facet feature for highlighted text.', 1677 required: [], 1678 properties: {}, 1679 }, 1680 underline: { 1681 type: 'object', 1682 description: 'Facet feature for underline markup', 1683 required: [], 1684 properties: {}, 1685 }, 1686 strikethrough: { 1687 type: 'object', 1688 description: 'Facet feature for strikethrough markup', 1689 required: [], 1690 properties: {}, 1691 }, 1692 id: { 1693 type: 'object', 1694 description: 1695 'Facet feature for an identifier. Used for linking to a segment', 1696 required: [], 1697 properties: { 1698 id: { 1699 type: 'string', 1700 }, 1701 }, 1702 }, 1703 bold: { 1704 type: 'object', 1705 description: 'Facet feature for bold text', 1706 required: [], 1707 properties: {}, 1708 }, 1709 italic: { 1710 type: 'object', 1711 description: 'Facet feature for italic text', 1712 required: [], 1713 properties: {}, 1714 }, 1715 }, 1716 }, 1717 PubLeafletThemeBackgroundImage: { 1718 lexicon: 1, 1719 id: 'pub.leaflet.theme.backgroundImage', 1720 defs: { 1721 main: { 1722 type: 'object', 1723 required: ['image'], 1724 properties: { 1725 image: { 1726 type: 'blob', 1727 accept: ['image/*'], 1728 maxSize: 1000000, 1729 }, 1730 width: { 1731 type: 'integer', 1732 }, 1733 repeat: { 1734 type: 'boolean', 1735 }, 1736 }, 1737 }, 1738 }, 1739 }, 1740 PubLeafletThemeColor: { 1741 lexicon: 1, 1742 id: 'pub.leaflet.theme.color', 1743 defs: { 1744 rgba: { 1745 type: 'object', 1746 required: ['r', 'g', 'b', 'a'], 1747 properties: { 1748 r: { 1749 type: 'integer', 1750 maximum: 255, 1751 minimum: 0, 1752 }, 1753 g: { 1754 type: 'integer', 1755 maximum: 255, 1756 minimum: 0, 1757 }, 1758 b: { 1759 type: 'integer', 1760 maximum: 255, 1761 minimum: 0, 1762 }, 1763 a: { 1764 type: 'integer', 1765 maximum: 100, 1766 minimum: 0, 1767 }, 1768 }, 1769 }, 1770 rgb: { 1771 type: 'object', 1772 required: ['r', 'g', 'b'], 1773 properties: { 1774 r: { 1775 type: 'integer', 1776 maximum: 255, 1777 minimum: 0, 1778 }, 1779 g: { 1780 type: 'integer', 1781 maximum: 255, 1782 minimum: 0, 1783 }, 1784 b: { 1785 type: 'integer', 1786 maximum: 255, 1787 minimum: 0, 1788 }, 1789 }, 1790 }, 1791 }, 1792 }, 1793} as const satisfies Record<string, LexiconDoc> 1794export const schemas = Object.values(schemaDict) satisfies LexiconDoc[] 1795export const lexicons: Lexicons = new Lexicons(schemas) 1796 1797export function validate<T extends { $type: string }>( 1798 v: unknown, 1799 id: string, 1800 hash: string, 1801 requiredType: true, 1802): ValidationResult<T> 1803export function validate<T extends { $type?: string }>( 1804 v: unknown, 1805 id: string, 1806 hash: string, 1807 requiredType?: false, 1808): ValidationResult<T> 1809export function validate( 1810 v: unknown, 1811 id: string, 1812 hash: string, 1813 requiredType?: boolean, 1814): ValidationResult { 1815 return (requiredType ? is$typed : maybe$typed)(v, id, hash) 1816 ? lexicons.validate(`${id}#${hash}`, v) 1817 : { 1818 success: false, 1819 error: new ValidationError( 1820 `Must be an object with "${hash === 'main' ? id : `${id}#${hash}`}" $type property`, 1821 ), 1822 } 1823} 1824 1825export const ids = { 1826 AppBskyActorProfile: 'app.bsky.actor.profile', 1827 ComAtprotoLabelDefs: 'com.atproto.label.defs', 1828 ComAtprotoRepoApplyWrites: 'com.atproto.repo.applyWrites', 1829 ComAtprotoRepoCreateRecord: 'com.atproto.repo.createRecord', 1830 ComAtprotoRepoDefs: 'com.atproto.repo.defs', 1831 ComAtprotoRepoDeleteRecord: 'com.atproto.repo.deleteRecord', 1832 ComAtprotoRepoDescribeRepo: 'com.atproto.repo.describeRepo', 1833 ComAtprotoRepoGetRecord: 'com.atproto.repo.getRecord', 1834 ComAtprotoRepoImportRepo: 'com.atproto.repo.importRepo', 1835 ComAtprotoRepoListMissingBlobs: 'com.atproto.repo.listMissingBlobs', 1836 ComAtprotoRepoListRecords: 'com.atproto.repo.listRecords', 1837 ComAtprotoRepoPutRecord: 'com.atproto.repo.putRecord', 1838 ComAtprotoRepoStrongRef: 'com.atproto.repo.strongRef', 1839 ComAtprotoRepoUploadBlob: 'com.atproto.repo.uploadBlob', 1840 PubLeafletBlocksBlockquote: 'pub.leaflet.blocks.blockquote', 1841 PubLeafletBlocksBskyPost: 'pub.leaflet.blocks.bskyPost', 1842 PubLeafletBlocksCode: 'pub.leaflet.blocks.code', 1843 PubLeafletBlocksHeader: 'pub.leaflet.blocks.header', 1844 PubLeafletBlocksHorizontalRule: 'pub.leaflet.blocks.horizontalRule', 1845 PubLeafletBlocksIframe: 'pub.leaflet.blocks.iframe', 1846 PubLeafletBlocksImage: 'pub.leaflet.blocks.image', 1847 PubLeafletBlocksMath: 'pub.leaflet.blocks.math', 1848 PubLeafletBlocksText: 'pub.leaflet.blocks.text', 1849 PubLeafletBlocksUnorderedList: 'pub.leaflet.blocks.unorderedList', 1850 PubLeafletBlocksWebsite: 'pub.leaflet.blocks.website', 1851 PubLeafletComment: 'pub.leaflet.comment', 1852 PubLeafletDocument: 'pub.leaflet.document', 1853 PubLeafletGraphSubscription: 'pub.leaflet.graph.subscription', 1854 PubLeafletPagesLinearDocument: 'pub.leaflet.pages.linearDocument', 1855 PubLeafletPublication: 'pub.leaflet.publication', 1856 PubLeafletRichtextFacet: 'pub.leaflet.richtext.facet', 1857 PubLeafletThemeBackgroundImage: 'pub.leaflet.theme.backgroundImage', 1858 PubLeafletThemeColor: 'pub.leaflet.theme.color', 1859} as const