A CLI for scaffolding ATProto web applications

add svelte template

besaid.zone 02bff11d 803842c0

verified
+365 -3614
+4 -2
src/commands/create.ts
··· 15 15 isCancel, 16 16 cancel as c, 17 17 } from "@clack/prompts"; 18 + import { execSync } from "node:child_process"; 18 19 import { 19 20 copyFileSync, 20 21 existsSync, ··· 32 33 dependencies, 33 34 } from "../../package.json" with { type: "json" }; 34 35 import { FRAMEWORKS } from "../constants.js"; 35 - import { exec, execSync } from "node:child_process"; 36 36 37 37 const DEFAULT_PROJECT_NAME = "my-atproto-app"; 38 38 ··· 42 42 43 43 export const createCommand: CommandDef = { 44 44 meta: { 45 - name: "init", 45 + name: "create", 46 46 description: "Create a new ATProto project", 47 47 }, 48 48 args: { ··· 222 222 switch (templateName) { 223 223 case "react-ts": 224 224 return ["README.md", "eslint.config.js", "public", "src", "package.json"]; 225 + case "svelte-ts": 226 + return ["README.md", "src", "package.json", "svelte.config.js"]; 225 227 default: 226 228 return []; 227 229 }
-2
src/constants.ts
··· 39 39 { 40 40 value: "svelte", 41 41 label: "Svelte", 42 - disabled: true, 43 - hint: "coming soon", 44 42 variants: [ 45 43 { 46 44 value: "svelte-ts",
-957
templates/react-ts/lexicons/app/bsky/actor/defs.json
··· 1 - { 2 - "id": "app.bsky.actor.defs", 3 - "defs": { 4 - "nux": { 5 - "type": "object", 6 - "required": [ 7 - "id", 8 - "completed" 9 - ], 10 - "properties": { 11 - "id": { 12 - "type": "string", 13 - "maxLength": 100 14 - }, 15 - "data": { 16 - "type": "string", 17 - "maxLength": 3000, 18 - "description": "Arbitrary data for the NUX. The structure is defined by the NUX itself. Limited to 300 characters.", 19 - "maxGraphemes": 300 20 - }, 21 - "completed": { 22 - "type": "boolean", 23 - "default": false 24 - }, 25 - "expiresAt": { 26 - "type": "string", 27 - "format": "datetime", 28 - "description": "The date and time at which the NUX will expire and should be considered completed." 29 - } 30 - }, 31 - "description": "A new user experiences (NUX) storage object" 32 - }, 33 - "mutedWord": { 34 - "type": "object", 35 - "required": [ 36 - "value", 37 - "targets" 38 - ], 39 - "properties": { 40 - "id": { 41 - "type": "string" 42 - }, 43 - "value": { 44 - "type": "string", 45 - "maxLength": 10000, 46 - "description": "The muted word itself.", 47 - "maxGraphemes": 1000 48 - }, 49 - "targets": { 50 - "type": "array", 51 - "items": { 52 - "ref": "app.bsky.actor.defs#mutedWordTarget", 53 - "type": "ref" 54 - }, 55 - "description": "The intended targets of the muted word." 56 - }, 57 - "expiresAt": { 58 - "type": "string", 59 - "format": "datetime", 60 - "description": "The date and time at which the muted word will expire and no longer be applied." 61 - }, 62 - "actorTarget": { 63 - "type": "string", 64 - "default": "all", 65 - "description": "Groups of users to apply the muted word to. If undefined, applies to all users.", 66 - "knownValues": [ 67 - "all", 68 - "exclude-following" 69 - ] 70 - } 71 - }, 72 - "description": "A word that the account owner has muted." 73 - }, 74 - "savedFeed": { 75 - "type": "object", 76 - "required": [ 77 - "id", 78 - "type", 79 - "value", 80 - "pinned" 81 - ], 82 - "properties": { 83 - "id": { 84 - "type": "string" 85 - }, 86 - "type": { 87 - "type": "string", 88 - "knownValues": [ 89 - "feed", 90 - "list", 91 - "timeline" 92 - ] 93 - }, 94 - "value": { 95 - "type": "string" 96 - }, 97 - "pinned": { 98 - "type": "boolean" 99 - } 100 - } 101 - }, 102 - "statusView": { 103 - "type": "object", 104 - "required": [ 105 - "status", 106 - "record" 107 - ], 108 - "properties": { 109 - "cid": { 110 - "type": "string", 111 - "format": "cid" 112 - }, 113 - "uri": { 114 - "type": "string", 115 - "format": "at-uri" 116 - }, 117 - "embed": { 118 - "refs": [ 119 - "app.bsky.embed.external#view" 120 - ], 121 - "type": "union", 122 - "description": "An optional embed associated with the status." 123 - }, 124 - "record": { 125 - "type": "unknown" 126 - }, 127 - "status": { 128 - "type": "string", 129 - "description": "The status for the account.", 130 - "knownValues": [ 131 - "app.bsky.actor.status#live" 132 - ] 133 - }, 134 - "isActive": { 135 - "type": "boolean", 136 - "description": "True if the status is not expired, false if it is expired. Only present if expiration was set." 137 - }, 138 - "expiresAt": { 139 - "type": "string", 140 - "format": "datetime", 141 - "description": "The date when this status will expire. The application might choose to no longer return the status after expiration." 142 - }, 143 - "isDisabled": { 144 - "type": "boolean", 145 - "description": "True if the user's go-live access has been disabled by a moderator, false otherwise." 146 - } 147 - } 148 - }, 149 - "preferences": { 150 - "type": "array", 151 - "items": { 152 - "refs": [ 153 - "#adultContentPref", 154 - "#contentLabelPref", 155 - "#savedFeedsPref", 156 - "#savedFeedsPrefV2", 157 - "#personalDetailsPref", 158 - "#declaredAgePref", 159 - "#feedViewPref", 160 - "#threadViewPref", 161 - "#interestsPref", 162 - "#mutedWordsPref", 163 - "#hiddenPostsPref", 164 - "#bskyAppStatePref", 165 - "#labelersPref", 166 - "#postInteractionSettingsPref", 167 - "#verificationPrefs", 168 - "#liveEventPreferences" 169 - ], 170 - "type": "union" 171 - } 172 - }, 173 - "profileView": { 174 - "type": "object", 175 - "required": [ 176 - "did", 177 - "handle" 178 - ], 179 - "properties": { 180 - "did": { 181 - "type": "string", 182 - "format": "did" 183 - }, 184 - "debug": { 185 - "type": "unknown", 186 - "description": "Debug information for internal development" 187 - }, 188 - "avatar": { 189 - "type": "string", 190 - "format": "uri" 191 - }, 192 - "handle": { 193 - "type": "string", 194 - "format": "handle" 195 - }, 196 - "labels": { 197 - "type": "array", 198 - "items": { 199 - "ref": "com.atproto.label.defs#label", 200 - "type": "ref" 201 - } 202 - }, 203 - "status": { 204 - "ref": "#statusView", 205 - "type": "ref" 206 - }, 207 - "viewer": { 208 - "ref": "#viewerState", 209 - "type": "ref" 210 - }, 211 - "pronouns": { 212 - "type": "string" 213 - }, 214 - "createdAt": { 215 - "type": "string", 216 - "format": "datetime" 217 - }, 218 - "indexedAt": { 219 - "type": "string", 220 - "format": "datetime" 221 - }, 222 - "associated": { 223 - "ref": "#profileAssociated", 224 - "type": "ref" 225 - }, 226 - "description": { 227 - "type": "string", 228 - "maxLength": 2560, 229 - "maxGraphemes": 256 230 - }, 231 - "displayName": { 232 - "type": "string", 233 - "maxLength": 640, 234 - "maxGraphemes": 64 235 - }, 236 - "verification": { 237 - "ref": "#verificationState", 238 - "type": "ref" 239 - } 240 - } 241 - }, 242 - "viewerState": { 243 - "type": "object", 244 - "properties": { 245 - "muted": { 246 - "type": "boolean" 247 - }, 248 - "blocking": { 249 - "type": "string", 250 - "format": "at-uri" 251 - }, 252 - "blockedBy": { 253 - "type": "boolean" 254 - }, 255 - "following": { 256 - "type": "string", 257 - "format": "at-uri" 258 - }, 259 - "followedBy": { 260 - "type": "string", 261 - "format": "at-uri" 262 - }, 263 - "mutedByList": { 264 - "ref": "app.bsky.graph.defs#listViewBasic", 265 - "type": "ref" 266 - }, 267 - "blockingByList": { 268 - "ref": "app.bsky.graph.defs#listViewBasic", 269 - "type": "ref" 270 - }, 271 - "knownFollowers": { 272 - "ref": "#knownFollowers", 273 - "type": "ref", 274 - "description": "This property is present only in selected cases, as an optimization." 275 - }, 276 - "activitySubscription": { 277 - "ref": "app.bsky.notification.defs#activitySubscription", 278 - "type": "ref", 279 - "description": "This property is present only in selected cases, as an optimization." 280 - } 281 - }, 282 - "description": "Metadata about the requesting account's relationship with the subject account. Only has meaningful content for authed requests." 283 - }, 284 - "feedViewPref": { 285 - "type": "object", 286 - "required": [ 287 - "feed" 288 - ], 289 - "properties": { 290 - "feed": { 291 - "type": "string", 292 - "description": "The URI of the feed, or an identifier which describes the feed." 293 - }, 294 - "hideReplies": { 295 - "type": "boolean", 296 - "description": "Hide replies in the feed." 297 - }, 298 - "hideReposts": { 299 - "type": "boolean", 300 - "description": "Hide reposts in the feed." 301 - }, 302 - "hideQuotePosts": { 303 - "type": "boolean", 304 - "description": "Hide quote posts in the feed." 305 - }, 306 - "hideRepliesByLikeCount": { 307 - "type": "integer", 308 - "description": "Hide replies in the feed if they do not have this number of likes." 309 - }, 310 - "hideRepliesByUnfollowed": { 311 - "type": "boolean", 312 - "default": true, 313 - "description": "Hide replies in the feed if they are not by followed users." 314 - } 315 - } 316 - }, 317 - "labelersPref": { 318 - "type": "object", 319 - "required": [ 320 - "labelers" 321 - ], 322 - "properties": { 323 - "labelers": { 324 - "type": "array", 325 - "items": { 326 - "ref": "#labelerPrefItem", 327 - "type": "ref" 328 - } 329 - } 330 - } 331 - }, 332 - "interestsPref": { 333 - "type": "object", 334 - "required": [ 335 - "tags" 336 - ], 337 - "properties": { 338 - "tags": { 339 - "type": "array", 340 - "items": { 341 - "type": "string", 342 - "maxLength": 640, 343 - "maxGraphemes": 64 344 - }, 345 - "maxLength": 100, 346 - "description": "A list of tags which describe the account owner's interests gathered during onboarding." 347 - } 348 - } 349 - }, 350 - "knownFollowers": { 351 - "type": "object", 352 - "required": [ 353 - "count", 354 - "followers" 355 - ], 356 - "properties": { 357 - "count": { 358 - "type": "integer" 359 - }, 360 - "followers": { 361 - "type": "array", 362 - "items": { 363 - "ref": "#profileViewBasic", 364 - "type": "ref" 365 - }, 366 - "maxLength": 5, 367 - "minLength": 0 368 - } 369 - }, 370 - "description": "The subject's followers whom you also follow" 371 - }, 372 - "mutedWordsPref": { 373 - "type": "object", 374 - "required": [ 375 - "items" 376 - ], 377 - "properties": { 378 - "items": { 379 - "type": "array", 380 - "items": { 381 - "ref": "app.bsky.actor.defs#mutedWord", 382 - "type": "ref" 383 - }, 384 - "description": "A list of words the account owner has muted." 385 - } 386 - } 387 - }, 388 - "savedFeedsPref": { 389 - "type": "object", 390 - "required": [ 391 - "pinned", 392 - "saved" 393 - ], 394 - "properties": { 395 - "saved": { 396 - "type": "array", 397 - "items": { 398 - "type": "string", 399 - "format": "at-uri" 400 - } 401 - }, 402 - "pinned": { 403 - "type": "array", 404 - "items": { 405 - "type": "string", 406 - "format": "at-uri" 407 - } 408 - }, 409 - "timelineIndex": { 410 - "type": "integer" 411 - } 412 - } 413 - }, 414 - "threadViewPref": { 415 - "type": "object", 416 - "properties": { 417 - "sort": { 418 - "type": "string", 419 - "description": "Sorting mode for threads.", 420 - "knownValues": [ 421 - "oldest", 422 - "newest", 423 - "most-likes", 424 - "random", 425 - "hotness" 426 - ] 427 - } 428 - } 429 - }, 430 - "declaredAgePref": { 431 - "type": "object", 432 - "properties": { 433 - "isOverAge13": { 434 - "type": "boolean", 435 - "description": "Indicates if the user has declared that they are over 13 years of age." 436 - }, 437 - "isOverAge16": { 438 - "type": "boolean", 439 - "description": "Indicates if the user has declared that they are over 16 years of age." 440 - }, 441 - "isOverAge18": { 442 - "type": "boolean", 443 - "description": "Indicates if the user has declared that they are over 18 years of age." 444 - } 445 - }, 446 - "description": "Read-only preference containing value(s) inferred from the user's declared birthdate. Absence of this preference object in the response indicates that the user has not made a declaration." 447 - }, 448 - "hiddenPostsPref": { 449 - "type": "object", 450 - "required": [ 451 - "items" 452 - ], 453 - "properties": { 454 - "items": { 455 - "type": "array", 456 - "items": { 457 - "type": "string", 458 - "format": "at-uri" 459 - }, 460 - "description": "A list of URIs of posts the account owner has hidden." 461 - } 462 - } 463 - }, 464 - "labelerPrefItem": { 465 - "type": "object", 466 - "required": [ 467 - "did" 468 - ], 469 - "properties": { 470 - "did": { 471 - "type": "string", 472 - "format": "did" 473 - } 474 - } 475 - }, 476 - "mutedWordTarget": { 477 - "type": "string", 478 - "maxLength": 640, 479 - "knownValues": [ 480 - "content", 481 - "tag" 482 - ], 483 - "maxGraphemes": 64 484 - }, 485 - "adultContentPref": { 486 - "type": "object", 487 - "required": [ 488 - "enabled" 489 - ], 490 - "properties": { 491 - "enabled": { 492 - "type": "boolean", 493 - "default": false 494 - } 495 - } 496 - }, 497 - "bskyAppStatePref": { 498 - "type": "object", 499 - "properties": { 500 - "nuxs": { 501 - "type": "array", 502 - "items": { 503 - "ref": "app.bsky.actor.defs#nux", 504 - "type": "ref" 505 - }, 506 - "maxLength": 100, 507 - "description": "Storage for NUXs the user has encountered." 508 - }, 509 - "queuedNudges": { 510 - "type": "array", 511 - "items": { 512 - "type": "string", 513 - "maxLength": 100 514 - }, 515 - "maxLength": 1000, 516 - "description": "An array of tokens which identify nudges (modals, popups, tours, highlight dots) that should be shown to the user." 517 - }, 518 - "activeProgressGuide": { 519 - "ref": "#bskyAppProgressGuide", 520 - "type": "ref" 521 - } 522 - }, 523 - "description": "A grab bag of state that's specific to the bsky.app program. Third-party apps shouldn't use this." 524 - }, 525 - "contentLabelPref": { 526 - "type": "object", 527 - "required": [ 528 - "label", 529 - "visibility" 530 - ], 531 - "properties": { 532 - "label": { 533 - "type": "string" 534 - }, 535 - "labelerDid": { 536 - "type": "string", 537 - "format": "did", 538 - "description": "Which labeler does this preference apply to? If undefined, applies globally." 539 - }, 540 - "visibility": { 541 - "type": "string", 542 - "knownValues": [ 543 - "ignore", 544 - "show", 545 - "warn", 546 - "hide" 547 - ] 548 - } 549 - } 550 - }, 551 - "profileViewBasic": { 552 - "type": "object", 553 - "required": [ 554 - "did", 555 - "handle" 556 - ], 557 - "properties": { 558 - "did": { 559 - "type": "string", 560 - "format": "did" 561 - }, 562 - "debug": { 563 - "type": "unknown", 564 - "description": "Debug information for internal development" 565 - }, 566 - "avatar": { 567 - "type": "string", 568 - "format": "uri" 569 - }, 570 - "handle": { 571 - "type": "string", 572 - "format": "handle" 573 - }, 574 - "labels": { 575 - "type": "array", 576 - "items": { 577 - "ref": "com.atproto.label.defs#label", 578 - "type": "ref" 579 - } 580 - }, 581 - "status": { 582 - "ref": "#statusView", 583 - "type": "ref" 584 - }, 585 - "viewer": { 586 - "ref": "#viewerState", 587 - "type": "ref" 588 - }, 589 - "pronouns": { 590 - "type": "string" 591 - }, 592 - "createdAt": { 593 - "type": "string", 594 - "format": "datetime" 595 - }, 596 - "associated": { 597 - "ref": "#profileAssociated", 598 - "type": "ref" 599 - }, 600 - "displayName": { 601 - "type": "string", 602 - "maxLength": 640, 603 - "maxGraphemes": 64 604 - }, 605 - "verification": { 606 - "ref": "#verificationState", 607 - "type": "ref" 608 - } 609 - } 610 - }, 611 - "savedFeedsPrefV2": { 612 - "type": "object", 613 - "required": [ 614 - "items" 615 - ], 616 - "properties": { 617 - "items": { 618 - "type": "array", 619 - "items": { 620 - "ref": "app.bsky.actor.defs#savedFeed", 621 - "type": "ref" 622 - } 623 - } 624 - } 625 - }, 626 - "verificationView": { 627 - "type": "object", 628 - "required": [ 629 - "issuer", 630 - "uri", 631 - "isValid", 632 - "createdAt" 633 - ], 634 - "properties": { 635 - "uri": { 636 - "type": "string", 637 - "format": "at-uri", 638 - "description": "The AT-URI of the verification record." 639 - }, 640 - "issuer": { 641 - "type": "string", 642 - "format": "did", 643 - "description": "The user who issued this verification." 644 - }, 645 - "isValid": { 646 - "type": "boolean", 647 - "description": "True if the verification passes validation, otherwise false." 648 - }, 649 - "createdAt": { 650 - "type": "string", 651 - "format": "datetime", 652 - "description": "Timestamp when the verification was created." 653 - } 654 - }, 655 - "description": "An individual verification for an associated subject." 656 - }, 657 - "profileAssociated": { 658 - "type": "object", 659 - "properties": { 660 - "chat": { 661 - "ref": "#profileAssociatedChat", 662 - "type": "ref" 663 - }, 664 - "germ": { 665 - "ref": "#profileAssociatedGerm", 666 - "type": "ref" 667 - }, 668 - "lists": { 669 - "type": "integer" 670 - }, 671 - "labeler": { 672 - "type": "boolean" 673 - }, 674 - "feedgens": { 675 - "type": "integer" 676 - }, 677 - "starterPacks": { 678 - "type": "integer" 679 - }, 680 - "activitySubscription": { 681 - "ref": "#profileAssociatedActivitySubscription", 682 - "type": "ref" 683 - } 684 - } 685 - }, 686 - "verificationPrefs": { 687 - "type": "object", 688 - "required": [], 689 - "properties": { 690 - "hideBadges": { 691 - "type": "boolean", 692 - "default": false, 693 - "description": "Hide the blue check badges for verified accounts and trusted verifiers." 694 - } 695 - }, 696 - "description": "Preferences for how verified accounts appear in the app." 697 - }, 698 - "verificationState": { 699 - "type": "object", 700 - "required": [ 701 - "verifications", 702 - "verifiedStatus", 703 - "trustedVerifierStatus" 704 - ], 705 - "properties": { 706 - "verifications": { 707 - "type": "array", 708 - "items": { 709 - "ref": "#verificationView", 710 - "type": "ref" 711 - }, 712 - "description": "All verifications issued by trusted verifiers on behalf of this user. Verifications by untrusted verifiers are not included." 713 - }, 714 - "verifiedStatus": { 715 - "type": "string", 716 - "description": "The user's status as a verified account.", 717 - "knownValues": [ 718 - "valid", 719 - "invalid", 720 - "none" 721 - ] 722 - }, 723 - "trustedVerifierStatus": { 724 - "type": "string", 725 - "description": "The user's status as a trusted verifier.", 726 - "knownValues": [ 727 - "valid", 728 - "invalid", 729 - "none" 730 - ] 731 - } 732 - }, 733 - "description": "Represents the verification information about the user this object is attached to." 734 - }, 735 - "personalDetailsPref": { 736 - "type": "object", 737 - "properties": { 738 - "birthDate": { 739 - "type": "string", 740 - "format": "datetime", 741 - "description": "The birth date of account owner." 742 - } 743 - } 744 - }, 745 - "profileViewDetailed": { 746 - "type": "object", 747 - "required": [ 748 - "did", 749 - "handle" 750 - ], 751 - "properties": { 752 - "did": { 753 - "type": "string", 754 - "format": "did" 755 - }, 756 - "debug": { 757 - "type": "unknown", 758 - "description": "Debug information for internal development" 759 - }, 760 - "avatar": { 761 - "type": "string", 762 - "format": "uri" 763 - }, 764 - "banner": { 765 - "type": "string", 766 - "format": "uri" 767 - }, 768 - "handle": { 769 - "type": "string", 770 - "format": "handle" 771 - }, 772 - "labels": { 773 - "type": "array", 774 - "items": { 775 - "ref": "com.atproto.label.defs#label", 776 - "type": "ref" 777 - } 778 - }, 779 - "status": { 780 - "ref": "#statusView", 781 - "type": "ref" 782 - }, 783 - "viewer": { 784 - "ref": "#viewerState", 785 - "type": "ref" 786 - }, 787 - "website": { 788 - "type": "string", 789 - "format": "uri" 790 - }, 791 - "pronouns": { 792 - "type": "string" 793 - }, 794 - "createdAt": { 795 - "type": "string", 796 - "format": "datetime" 797 - }, 798 - "indexedAt": { 799 - "type": "string", 800 - "format": "datetime" 801 - }, 802 - "associated": { 803 - "ref": "#profileAssociated", 804 - "type": "ref" 805 - }, 806 - "pinnedPost": { 807 - "ref": "com.atproto.repo.strongRef", 808 - "type": "ref" 809 - }, 810 - "postsCount": { 811 - "type": "integer" 812 - }, 813 - "description": { 814 - "type": "string", 815 - "maxLength": 2560, 816 - "maxGraphemes": 256 817 - }, 818 - "displayName": { 819 - "type": "string", 820 - "maxLength": 640, 821 - "maxGraphemes": 64 822 - }, 823 - "followsCount": { 824 - "type": "integer" 825 - }, 826 - "verification": { 827 - "ref": "#verificationState", 828 - "type": "ref" 829 - }, 830 - "followersCount": { 831 - "type": "integer" 832 - }, 833 - "joinedViaStarterPack": { 834 - "ref": "app.bsky.graph.defs#starterPackViewBasic", 835 - "type": "ref" 836 - } 837 - } 838 - }, 839 - "bskyAppProgressGuide": { 840 - "type": "object", 841 - "required": [ 842 - "guide" 843 - ], 844 - "properties": { 845 - "guide": { 846 - "type": "string", 847 - "maxLength": 100 848 - } 849 - }, 850 - "description": "If set, an active progress guide. Once completed, can be set to undefined. Should have unspecced fields tracking progress." 851 - }, 852 - "liveEventPreferences": { 853 - "type": "object", 854 - "properties": { 855 - "hideAllFeeds": { 856 - "type": "boolean", 857 - "default": false, 858 - "description": "Whether to hide all feeds from live events." 859 - }, 860 - "hiddenFeedIds": { 861 - "type": "array", 862 - "items": { 863 - "type": "string" 864 - }, 865 - "description": "A list of feed IDs that the user has hidden from live events." 866 - } 867 - }, 868 - "description": "Preferences for live events." 869 - }, 870 - "profileAssociatedChat": { 871 - "type": "object", 872 - "required": [ 873 - "allowIncoming" 874 - ], 875 - "properties": { 876 - "allowIncoming": { 877 - "type": "string", 878 - "knownValues": [ 879 - "all", 880 - "none", 881 - "following" 882 - ] 883 - } 884 - } 885 - }, 886 - "profileAssociatedGerm": { 887 - "type": "object", 888 - "required": [ 889 - "showButtonTo", 890 - "messageMeUrl" 891 - ], 892 - "properties": { 893 - "messageMeUrl": { 894 - "type": "string", 895 - "format": "uri" 896 - }, 897 - "showButtonTo": { 898 - "type": "string", 899 - "knownValues": [ 900 - "usersIFollow", 901 - "everyone" 902 - ] 903 - } 904 - } 905 - }, 906 - "postInteractionSettingsPref": { 907 - "type": "object", 908 - "required": [], 909 - "properties": { 910 - "threadgateAllowRules": { 911 - "type": "array", 912 - "items": { 913 - "refs": [ 914 - "app.bsky.feed.threadgate#mentionRule", 915 - "app.bsky.feed.threadgate#followerRule", 916 - "app.bsky.feed.threadgate#followingRule", 917 - "app.bsky.feed.threadgate#listRule" 918 - ], 919 - "type": "union" 920 - }, 921 - "maxLength": 5, 922 - "description": "Matches threadgate record. List of rules defining who can reply to this users posts. If value is an empty array, no one can reply. If value is undefined, anyone can reply." 923 - }, 924 - "postgateEmbeddingRules": { 925 - "type": "array", 926 - "items": { 927 - "refs": [ 928 - "app.bsky.feed.postgate#disableRule" 929 - ], 930 - "type": "union" 931 - }, 932 - "maxLength": 5, 933 - "description": "Matches postgate record. List of rules defining who can embed this users posts. If value is an empty array or is undefined, no particular rules apply and anyone can embed." 934 - } 935 - }, 936 - "description": "Default post interaction settings for the account. These values should be applied as default values when creating new posts. These refs should mirror the threadgate and postgate records exactly." 937 - }, 938 - "profileAssociatedActivitySubscription": { 939 - "type": "object", 940 - "required": [ 941 - "allowSubscriptions" 942 - ], 943 - "properties": { 944 - "allowSubscriptions": { 945 - "type": "string", 946 - "knownValues": [ 947 - "followers", 948 - "mutuals", 949 - "none" 950 - ] 951 - } 952 - } 953 - } 954 - }, 955 - "$type": "com.atproto.lexicon.schema", 956 - "lexicon": 1 957 - }
-31
templates/react-ts/lexicons/app/bsky/actor/getProfile.json
··· 1 - { 2 - "id": "app.bsky.actor.getProfile", 3 - "defs": { 4 - "main": { 5 - "type": "query", 6 - "output": { 7 - "schema": { 8 - "ref": "app.bsky.actor.defs#profileViewDetailed", 9 - "type": "ref" 10 - }, 11 - "encoding": "application/json" 12 - }, 13 - "parameters": { 14 - "type": "params", 15 - "required": [ 16 - "actor" 17 - ], 18 - "properties": { 19 - "actor": { 20 - "type": "string", 21 - "format": "at-identifier", 22 - "description": "Handle or DID of account to fetch profile of." 23 - } 24 - } 25 - }, 26 - "description": "Get detailed profile view of an actor. Does not require auth, but contains relevant metadata with auth." 27 - } 28 - }, 29 - "$type": "com.atproto.lexicon.schema", 30 - "lexicon": 1 31 - }
-75
templates/react-ts/lexicons/app/bsky/actor/profile.json
··· 1 - { 2 - "id": "app.bsky.actor.profile", 3 - "defs": { 4 - "main": { 5 - "key": "literal:self", 6 - "type": "record", 7 - "record": { 8 - "type": "object", 9 - "properties": { 10 - "avatar": { 11 - "type": "blob", 12 - "accept": [ 13 - "image/png", 14 - "image/jpeg" 15 - ], 16 - "maxSize": 1000000, 17 - "description": "Small image to be displayed next to posts from account. AKA, 'profile picture'" 18 - }, 19 - "banner": { 20 - "type": "blob", 21 - "accept": [ 22 - "image/png", 23 - "image/jpeg" 24 - ], 25 - "maxSize": 1000000, 26 - "description": "Larger horizontal image to display behind profile view." 27 - }, 28 - "labels": { 29 - "refs": [ 30 - "com.atproto.label.defs#selfLabels" 31 - ], 32 - "type": "union", 33 - "description": "Self-label values, specific to the Bluesky application, on the overall account." 34 - }, 35 - "website": { 36 - "type": "string", 37 - "format": "uri" 38 - }, 39 - "pronouns": { 40 - "type": "string", 41 - "maxLength": 200, 42 - "description": "Free-form pronouns text.", 43 - "maxGraphemes": 20 44 - }, 45 - "createdAt": { 46 - "type": "string", 47 - "format": "datetime" 48 - }, 49 - "pinnedPost": { 50 - "ref": "com.atproto.repo.strongRef", 51 - "type": "ref" 52 - }, 53 - "description": { 54 - "type": "string", 55 - "maxLength": 2560, 56 - "description": "Free-form profile description text.", 57 - "maxGraphemes": 256 58 - }, 59 - "displayName": { 60 - "type": "string", 61 - "maxLength": 640, 62 - "maxGraphemes": 64 63 - }, 64 - "joinedViaStarterPack": { 65 - "ref": "com.atproto.repo.strongRef", 66 - "type": "ref" 67 - } 68 - } 69 - }, 70 - "description": "A declaration of a Bluesky account profile." 71 - } 72 - }, 73 - "$type": "com.atproto.lexicon.schema", 74 - "lexicon": 1 75 - }
-48
templates/react-ts/lexicons/app/bsky/actor/status.json
··· 1 - { 2 - "id": "app.bsky.actor.status", 3 - "defs": { 4 - "live": { 5 - "type": "token", 6 - "description": "Advertises an account as currently offering live content." 7 - }, 8 - "main": { 9 - "key": "literal:self", 10 - "type": "record", 11 - "record": { 12 - "type": "object", 13 - "required": [ 14 - "status", 15 - "createdAt" 16 - ], 17 - "properties": { 18 - "embed": { 19 - "refs": [ 20 - "app.bsky.embed.external" 21 - ], 22 - "type": "union", 23 - "description": "An optional embed associated with the status." 24 - }, 25 - "status": { 26 - "type": "string", 27 - "description": "The status for the account.", 28 - "knownValues": [ 29 - "app.bsky.actor.status#live" 30 - ] 31 - }, 32 - "createdAt": { 33 - "type": "string", 34 - "format": "datetime" 35 - }, 36 - "durationMinutes": { 37 - "type": "integer", 38 - "minimum": 1, 39 - "description": "The duration of the status in minutes. Applications can choose to impose minimum and maximum limits." 40 - } 41 - } 42 - }, 43 - "description": "A declaration of a Bluesky account status." 44 - } 45 - }, 46 - "$type": "com.atproto.lexicon.schema", 47 - "lexicon": 1 48 - }
-25
templates/react-ts/lexicons/app/bsky/embed/defs.json
··· 1 - { 2 - "id": "app.bsky.embed.defs", 3 - "defs": { 4 - "aspectRatio": { 5 - "type": "object", 6 - "required": [ 7 - "width", 8 - "height" 9 - ], 10 - "properties": { 11 - "width": { 12 - "type": "integer", 13 - "minimum": 1 14 - }, 15 - "height": { 16 - "type": "integer", 17 - "minimum": 1 18 - } 19 - }, 20 - "description": "width:height represents an aspect ratio. It may be approximate, and may not correspond to absolute dimensions in any given unit." 21 - } 22 - }, 23 - "$type": "com.atproto.lexicon.schema", 24 - "lexicon": 1 25 - }
-83
templates/react-ts/lexicons/app/bsky/embed/external.json
··· 1 - { 2 - "id": "app.bsky.embed.external", 3 - "defs": { 4 - "main": { 5 - "type": "object", 6 - "required": [ 7 - "external" 8 - ], 9 - "properties": { 10 - "external": { 11 - "ref": "#external", 12 - "type": "ref" 13 - } 14 - }, 15 - "description": "A representation of some externally linked content (eg, a URL and 'card'), embedded in a Bluesky record (eg, a post)." 16 - }, 17 - "view": { 18 - "type": "object", 19 - "required": [ 20 - "external" 21 - ], 22 - "properties": { 23 - "external": { 24 - "ref": "#viewExternal", 25 - "type": "ref" 26 - } 27 - } 28 - }, 29 - "external": { 30 - "type": "object", 31 - "required": [ 32 - "uri", 33 - "title", 34 - "description" 35 - ], 36 - "properties": { 37 - "uri": { 38 - "type": "string", 39 - "format": "uri" 40 - }, 41 - "thumb": { 42 - "type": "blob", 43 - "accept": [ 44 - "image/*" 45 - ], 46 - "maxSize": 1000000 47 - }, 48 - "title": { 49 - "type": "string" 50 - }, 51 - "description": { 52 - "type": "string" 53 - } 54 - } 55 - }, 56 - "viewExternal": { 57 - "type": "object", 58 - "required": [ 59 - "uri", 60 - "title", 61 - "description" 62 - ], 63 - "properties": { 64 - "uri": { 65 - "type": "string", 66 - "format": "uri" 67 - }, 68 - "thumb": { 69 - "type": "string", 70 - "format": "uri" 71 - }, 72 - "title": { 73 - "type": "string" 74 - }, 75 - "description": { 76 - "type": "string" 77 - } 78 - } 79 - } 80 - }, 81 - "$type": "com.atproto.lexicon.schema", 82 - "lexicon": 1 83 - }
-92
templates/react-ts/lexicons/app/bsky/embed/images.json
··· 1 - { 2 - "id": "app.bsky.embed.images", 3 - "defs": { 4 - "main": { 5 - "type": "object", 6 - "required": [ 7 - "images" 8 - ], 9 - "properties": { 10 - "images": { 11 - "type": "array", 12 - "items": { 13 - "ref": "#image", 14 - "type": "ref" 15 - }, 16 - "maxLength": 4 17 - } 18 - } 19 - }, 20 - "view": { 21 - "type": "object", 22 - "required": [ 23 - "images" 24 - ], 25 - "properties": { 26 - "images": { 27 - "type": "array", 28 - "items": { 29 - "ref": "#viewImage", 30 - "type": "ref" 31 - }, 32 - "maxLength": 4 33 - } 34 - } 35 - }, 36 - "image": { 37 - "type": "object", 38 - "required": [ 39 - "image", 40 - "alt" 41 - ], 42 - "properties": { 43 - "alt": { 44 - "type": "string", 45 - "description": "Alt text description of the image, for accessibility." 46 - }, 47 - "image": { 48 - "type": "blob", 49 - "accept": [ 50 - "image/*" 51 - ], 52 - "maxSize": 1000000 53 - }, 54 - "aspectRatio": { 55 - "ref": "app.bsky.embed.defs#aspectRatio", 56 - "type": "ref" 57 - } 58 - } 59 - }, 60 - "viewImage": { 61 - "type": "object", 62 - "required": [ 63 - "thumb", 64 - "fullsize", 65 - "alt" 66 - ], 67 - "properties": { 68 - "alt": { 69 - "type": "string", 70 - "description": "Alt text description of the image, for accessibility." 71 - }, 72 - "thumb": { 73 - "type": "string", 74 - "format": "uri", 75 - "description": "Fully-qualified URL where a thumbnail of the image can be fetched. For example, CDN location provided by the App View." 76 - }, 77 - "fullsize": { 78 - "type": "string", 79 - "format": "uri", 80 - "description": "Fully-qualified URL where a large version of the image can be fetched. May or may not be the exact original blob. For example, CDN location provided by the App View." 81 - }, 82 - "aspectRatio": { 83 - "ref": "app.bsky.embed.defs#aspectRatio", 84 - "type": "ref" 85 - } 86 - } 87 - } 88 - }, 89 - "$type": "com.atproto.lexicon.schema", 90 - "lexicon": 1, 91 - "description": "A set of images embedded in a Bluesky record (eg, a post)." 92 - }
-161
templates/react-ts/lexicons/app/bsky/embed/record.json
··· 1 - { 2 - "id": "app.bsky.embed.record", 3 - "defs": { 4 - "main": { 5 - "type": "object", 6 - "required": [ 7 - "record" 8 - ], 9 - "properties": { 10 - "record": { 11 - "ref": "com.atproto.repo.strongRef", 12 - "type": "ref" 13 - } 14 - } 15 - }, 16 - "view": { 17 - "type": "object", 18 - "required": [ 19 - "record" 20 - ], 21 - "properties": { 22 - "record": { 23 - "refs": [ 24 - "#viewRecord", 25 - "#viewNotFound", 26 - "#viewBlocked", 27 - "#viewDetached", 28 - "app.bsky.feed.defs#generatorView", 29 - "app.bsky.graph.defs#listView", 30 - "app.bsky.labeler.defs#labelerView", 31 - "app.bsky.graph.defs#starterPackViewBasic" 32 - ], 33 - "type": "union" 34 - } 35 - } 36 - }, 37 - "viewRecord": { 38 - "type": "object", 39 - "required": [ 40 - "uri", 41 - "cid", 42 - "author", 43 - "value", 44 - "indexedAt" 45 - ], 46 - "properties": { 47 - "cid": { 48 - "type": "string", 49 - "format": "cid" 50 - }, 51 - "uri": { 52 - "type": "string", 53 - "format": "at-uri" 54 - }, 55 - "value": { 56 - "type": "unknown", 57 - "description": "The record data itself." 58 - }, 59 - "author": { 60 - "ref": "app.bsky.actor.defs#profileViewBasic", 61 - "type": "ref" 62 - }, 63 - "embeds": { 64 - "type": "array", 65 - "items": { 66 - "refs": [ 67 - "app.bsky.embed.images#view", 68 - "app.bsky.embed.video#view", 69 - "app.bsky.embed.external#view", 70 - "app.bsky.embed.record#view", 71 - "app.bsky.embed.recordWithMedia#view" 72 - ], 73 - "type": "union" 74 - } 75 - }, 76 - "labels": { 77 - "type": "array", 78 - "items": { 79 - "ref": "com.atproto.label.defs#label", 80 - "type": "ref" 81 - } 82 - }, 83 - "indexedAt": { 84 - "type": "string", 85 - "format": "datetime" 86 - }, 87 - "likeCount": { 88 - "type": "integer" 89 - }, 90 - "quoteCount": { 91 - "type": "integer" 92 - }, 93 - "replyCount": { 94 - "type": "integer" 95 - }, 96 - "repostCount": { 97 - "type": "integer" 98 - } 99 - } 100 - }, 101 - "viewBlocked": { 102 - "type": "object", 103 - "required": [ 104 - "uri", 105 - "blocked", 106 - "author" 107 - ], 108 - "properties": { 109 - "uri": { 110 - "type": "string", 111 - "format": "at-uri" 112 - }, 113 - "author": { 114 - "ref": "app.bsky.feed.defs#blockedAuthor", 115 - "type": "ref" 116 - }, 117 - "blocked": { 118 - "type": "boolean", 119 - "const": true 120 - } 121 - } 122 - }, 123 - "viewDetached": { 124 - "type": "object", 125 - "required": [ 126 - "uri", 127 - "detached" 128 - ], 129 - "properties": { 130 - "uri": { 131 - "type": "string", 132 - "format": "at-uri" 133 - }, 134 - "detached": { 135 - "type": "boolean", 136 - "const": true 137 - } 138 - } 139 - }, 140 - "viewNotFound": { 141 - "type": "object", 142 - "required": [ 143 - "uri", 144 - "notFound" 145 - ], 146 - "properties": { 147 - "uri": { 148 - "type": "string", 149 - "format": "at-uri" 150 - }, 151 - "notFound": { 152 - "type": "boolean", 153 - "const": true 154 - } 155 - } 156 - } 157 - }, 158 - "$type": "com.atproto.lexicon.schema", 159 - "lexicon": 1, 160 - "description": "A representation of a record embedded in a Bluesky record (eg, a post). For example, a quote-post, or sharing a feed generator record." 161 - }
-50
templates/react-ts/lexicons/app/bsky/embed/recordWithMedia.json
··· 1 - { 2 - "id": "app.bsky.embed.recordWithMedia", 3 - "defs": { 4 - "main": { 5 - "type": "object", 6 - "required": [ 7 - "record", 8 - "media" 9 - ], 10 - "properties": { 11 - "media": { 12 - "refs": [ 13 - "app.bsky.embed.images", 14 - "app.bsky.embed.video", 15 - "app.bsky.embed.external" 16 - ], 17 - "type": "union" 18 - }, 19 - "record": { 20 - "ref": "app.bsky.embed.record", 21 - "type": "ref" 22 - } 23 - } 24 - }, 25 - "view": { 26 - "type": "object", 27 - "required": [ 28 - "record", 29 - "media" 30 - ], 31 - "properties": { 32 - "media": { 33 - "refs": [ 34 - "app.bsky.embed.images#view", 35 - "app.bsky.embed.video#view", 36 - "app.bsky.embed.external#view" 37 - ], 38 - "type": "union" 39 - }, 40 - "record": { 41 - "ref": "app.bsky.embed.record#view", 42 - "type": "ref" 43 - } 44 - } 45 - } 46 - }, 47 - "$type": "com.atproto.lexicon.schema", 48 - "lexicon": 1, 49 - "description": "A representation of a record embedded in a Bluesky record (eg, a post), alongside other compatible embeds. For example, a quote post and image, or a quote post and external URL card." 50 - }
-108
templates/react-ts/lexicons/app/bsky/embed/video.json
··· 1 - { 2 - "id": "app.bsky.embed.video", 3 - "defs": { 4 - "main": { 5 - "type": "object", 6 - "required": [ 7 - "video" 8 - ], 9 - "properties": { 10 - "alt": { 11 - "type": "string", 12 - "maxLength": 10000, 13 - "description": "Alt text description of the video, for accessibility.", 14 - "maxGraphemes": 1000 15 - }, 16 - "video": { 17 - "type": "blob", 18 - "accept": [ 19 - "video/mp4" 20 - ], 21 - "maxSize": 100000000, 22 - "description": "The mp4 video file. May be up to 100mb, formerly limited to 50mb." 23 - }, 24 - "captions": { 25 - "type": "array", 26 - "items": { 27 - "ref": "#caption", 28 - "type": "ref" 29 - }, 30 - "maxLength": 20 31 - }, 32 - "aspectRatio": { 33 - "ref": "app.bsky.embed.defs#aspectRatio", 34 - "type": "ref" 35 - }, 36 - "presentation": { 37 - "type": "string", 38 - "description": "A hint to the client about how to present the video.", 39 - "knownValues": [ 40 - "default", 41 - "gif" 42 - ] 43 - } 44 - } 45 - }, 46 - "view": { 47 - "type": "object", 48 - "required": [ 49 - "cid", 50 - "playlist" 51 - ], 52 - "properties": { 53 - "alt": { 54 - "type": "string", 55 - "maxLength": 10000, 56 - "maxGraphemes": 1000 57 - }, 58 - "cid": { 59 - "type": "string", 60 - "format": "cid" 61 - }, 62 - "playlist": { 63 - "type": "string", 64 - "format": "uri" 65 - }, 66 - "thumbnail": { 67 - "type": "string", 68 - "format": "uri" 69 - }, 70 - "aspectRatio": { 71 - "ref": "app.bsky.embed.defs#aspectRatio", 72 - "type": "ref" 73 - }, 74 - "presentation": { 75 - "type": "string", 76 - "description": "A hint to the client about how to present the video.", 77 - "knownValues": [ 78 - "default", 79 - "gif" 80 - ] 81 - } 82 - } 83 - }, 84 - "caption": { 85 - "type": "object", 86 - "required": [ 87 - "lang", 88 - "file" 89 - ], 90 - "properties": { 91 - "file": { 92 - "type": "blob", 93 - "accept": [ 94 - "text/vtt" 95 - ], 96 - "maxSize": 20000 97 - }, 98 - "lang": { 99 - "type": "string", 100 - "format": "language" 101 - } 102 - } 103 - } 104 - }, 105 - "$type": "com.atproto.lexicon.schema", 106 - "lexicon": 1, 107 - "description": "A video embedded in a Bluesky record (eg, a post)." 108 - }
-544
templates/react-ts/lexicons/app/bsky/feed/defs.json
··· 1 - { 2 - "id": "app.bsky.feed.defs", 3 - "defs": { 4 - "postView": { 5 - "type": "object", 6 - "required": [ 7 - "uri", 8 - "cid", 9 - "author", 10 - "record", 11 - "indexedAt" 12 - ], 13 - "properties": { 14 - "cid": { 15 - "type": "string", 16 - "format": "cid" 17 - }, 18 - "uri": { 19 - "type": "string", 20 - "format": "at-uri" 21 - }, 22 - "debug": { 23 - "type": "unknown", 24 - "description": "Debug information for internal development" 25 - }, 26 - "embed": { 27 - "refs": [ 28 - "app.bsky.embed.images#view", 29 - "app.bsky.embed.video#view", 30 - "app.bsky.embed.external#view", 31 - "app.bsky.embed.record#view", 32 - "app.bsky.embed.recordWithMedia#view" 33 - ], 34 - "type": "union" 35 - }, 36 - "author": { 37 - "ref": "app.bsky.actor.defs#profileViewBasic", 38 - "type": "ref" 39 - }, 40 - "labels": { 41 - "type": "array", 42 - "items": { 43 - "ref": "com.atproto.label.defs#label", 44 - "type": "ref" 45 - } 46 - }, 47 - "record": { 48 - "type": "unknown" 49 - }, 50 - "viewer": { 51 - "ref": "#viewerState", 52 - "type": "ref" 53 - }, 54 - "indexedAt": { 55 - "type": "string", 56 - "format": "datetime" 57 - }, 58 - "likeCount": { 59 - "type": "integer" 60 - }, 61 - "quoteCount": { 62 - "type": "integer" 63 - }, 64 - "replyCount": { 65 - "type": "integer" 66 - }, 67 - "threadgate": { 68 - "ref": "#threadgateView", 69 - "type": "ref" 70 - }, 71 - "repostCount": { 72 - "type": "integer" 73 - }, 74 - "bookmarkCount": { 75 - "type": "integer" 76 - } 77 - } 78 - }, 79 - "replyRef": { 80 - "type": "object", 81 - "required": [ 82 - "root", 83 - "parent" 84 - ], 85 - "properties": { 86 - "root": { 87 - "refs": [ 88 - "#postView", 89 - "#notFoundPost", 90 - "#blockedPost" 91 - ], 92 - "type": "union" 93 - }, 94 - "parent": { 95 - "refs": [ 96 - "#postView", 97 - "#notFoundPost", 98 - "#blockedPost" 99 - ], 100 - "type": "union" 101 - }, 102 - "grandparentAuthor": { 103 - "ref": "app.bsky.actor.defs#profileViewBasic", 104 - "type": "ref", 105 - "description": "When parent is a reply to another post, this is the author of that post." 106 - } 107 - } 108 - }, 109 - "reasonPin": { 110 - "type": "object", 111 - "properties": {} 112 - }, 113 - "blockedPost": { 114 - "type": "object", 115 - "required": [ 116 - "uri", 117 - "blocked", 118 - "author" 119 - ], 120 - "properties": { 121 - "uri": { 122 - "type": "string", 123 - "format": "at-uri" 124 - }, 125 - "author": { 126 - "ref": "#blockedAuthor", 127 - "type": "ref" 128 - }, 129 - "blocked": { 130 - "type": "boolean", 131 - "const": true 132 - } 133 - } 134 - }, 135 - "interaction": { 136 - "type": "object", 137 - "properties": { 138 - "item": { 139 - "type": "string", 140 - "format": "at-uri" 141 - }, 142 - "event": { 143 - "type": "string", 144 - "knownValues": [ 145 - "app.bsky.feed.defs#requestLess", 146 - "app.bsky.feed.defs#requestMore", 147 - "app.bsky.feed.defs#clickthroughItem", 148 - "app.bsky.feed.defs#clickthroughAuthor", 149 - "app.bsky.feed.defs#clickthroughReposter", 150 - "app.bsky.feed.defs#clickthroughEmbed", 151 - "app.bsky.feed.defs#interactionSeen", 152 - "app.bsky.feed.defs#interactionLike", 153 - "app.bsky.feed.defs#interactionRepost", 154 - "app.bsky.feed.defs#interactionReply", 155 - "app.bsky.feed.defs#interactionQuote", 156 - "app.bsky.feed.defs#interactionShare" 157 - ] 158 - }, 159 - "reqId": { 160 - "type": "string", 161 - "maxLength": 100, 162 - "description": "Unique identifier per request that may be passed back alongside interactions." 163 - }, 164 - "feedContext": { 165 - "type": "string", 166 - "maxLength": 2000, 167 - "description": "Context on a feed item that was originally supplied by the feed generator on getFeedSkeleton." 168 - } 169 - } 170 - }, 171 - "requestLess": { 172 - "type": "token", 173 - "description": "Request that less content like the given feed item be shown in the feed" 174 - }, 175 - "requestMore": { 176 - "type": "token", 177 - "description": "Request that more content like the given feed item be shown in the feed" 178 - }, 179 - "viewerState": { 180 - "type": "object", 181 - "properties": { 182 - "like": { 183 - "type": "string", 184 - "format": "at-uri" 185 - }, 186 - "pinned": { 187 - "type": "boolean" 188 - }, 189 - "repost": { 190 - "type": "string", 191 - "format": "at-uri" 192 - }, 193 - "bookmarked": { 194 - "type": "boolean" 195 - }, 196 - "threadMuted": { 197 - "type": "boolean" 198 - }, 199 - "replyDisabled": { 200 - "type": "boolean" 201 - }, 202 - "embeddingDisabled": { 203 - "type": "boolean" 204 - } 205 - }, 206 - "description": "Metadata about the requesting account's relationship with the subject content. Only has meaningful content for authed requests." 207 - }, 208 - "feedViewPost": { 209 - "type": "object", 210 - "required": [ 211 - "post" 212 - ], 213 - "properties": { 214 - "post": { 215 - "ref": "#postView", 216 - "type": "ref" 217 - }, 218 - "reply": { 219 - "ref": "#replyRef", 220 - "type": "ref" 221 - }, 222 - "reqId": { 223 - "type": "string", 224 - "maxLength": 100, 225 - "description": "Unique identifier per request that may be passed back alongside interactions." 226 - }, 227 - "reason": { 228 - "refs": [ 229 - "#reasonRepost", 230 - "#reasonPin" 231 - ], 232 - "type": "union" 233 - }, 234 - "feedContext": { 235 - "type": "string", 236 - "maxLength": 2000, 237 - "description": "Context provided by feed generator that may be passed back alongside interactions." 238 - } 239 - } 240 - }, 241 - "notFoundPost": { 242 - "type": "object", 243 - "required": [ 244 - "uri", 245 - "notFound" 246 - ], 247 - "properties": { 248 - "uri": { 249 - "type": "string", 250 - "format": "at-uri" 251 - }, 252 - "notFound": { 253 - "type": "boolean", 254 - "const": true 255 - } 256 - } 257 - }, 258 - "reasonRepost": { 259 - "type": "object", 260 - "required": [ 261 - "by", 262 - "indexedAt" 263 - ], 264 - "properties": { 265 - "by": { 266 - "ref": "app.bsky.actor.defs#profileViewBasic", 267 - "type": "ref" 268 - }, 269 - "cid": { 270 - "type": "string", 271 - "format": "cid" 272 - }, 273 - "uri": { 274 - "type": "string", 275 - "format": "at-uri" 276 - }, 277 - "indexedAt": { 278 - "type": "string", 279 - "format": "datetime" 280 - } 281 - } 282 - }, 283 - "blockedAuthor": { 284 - "type": "object", 285 - "required": [ 286 - "did" 287 - ], 288 - "properties": { 289 - "did": { 290 - "type": "string", 291 - "format": "did" 292 - }, 293 - "viewer": { 294 - "ref": "app.bsky.actor.defs#viewerState", 295 - "type": "ref" 296 - } 297 - } 298 - }, 299 - "generatorView": { 300 - "type": "object", 301 - "required": [ 302 - "uri", 303 - "cid", 304 - "did", 305 - "creator", 306 - "displayName", 307 - "indexedAt" 308 - ], 309 - "properties": { 310 - "cid": { 311 - "type": "string", 312 - "format": "cid" 313 - }, 314 - "did": { 315 - "type": "string", 316 - "format": "did" 317 - }, 318 - "uri": { 319 - "type": "string", 320 - "format": "at-uri" 321 - }, 322 - "avatar": { 323 - "type": "string", 324 - "format": "uri" 325 - }, 326 - "labels": { 327 - "type": "array", 328 - "items": { 329 - "ref": "com.atproto.label.defs#label", 330 - "type": "ref" 331 - } 332 - }, 333 - "viewer": { 334 - "ref": "#generatorViewerState", 335 - "type": "ref" 336 - }, 337 - "creator": { 338 - "ref": "app.bsky.actor.defs#profileView", 339 - "type": "ref" 340 - }, 341 - "indexedAt": { 342 - "type": "string", 343 - "format": "datetime" 344 - }, 345 - "likeCount": { 346 - "type": "integer", 347 - "minimum": 0 348 - }, 349 - "contentMode": { 350 - "type": "string", 351 - "knownValues": [ 352 - "app.bsky.feed.defs#contentModeUnspecified", 353 - "app.bsky.feed.defs#contentModeVideo" 354 - ] 355 - }, 356 - "description": { 357 - "type": "string", 358 - "maxLength": 3000, 359 - "maxGraphemes": 300 360 - }, 361 - "displayName": { 362 - "type": "string" 363 - }, 364 - "descriptionFacets": { 365 - "type": "array", 366 - "items": { 367 - "ref": "app.bsky.richtext.facet", 368 - "type": "ref" 369 - } 370 - }, 371 - "acceptsInteractions": { 372 - "type": "boolean" 373 - } 374 - } 375 - }, 376 - "threadContext": { 377 - "type": "object", 378 - "properties": { 379 - "rootAuthorLike": { 380 - "type": "string", 381 - "format": "at-uri" 382 - } 383 - }, 384 - "description": "Metadata about this post within the context of the thread it is in." 385 - }, 386 - "threadViewPost": { 387 - "type": "object", 388 - "required": [ 389 - "post" 390 - ], 391 - "properties": { 392 - "post": { 393 - "ref": "#postView", 394 - "type": "ref" 395 - }, 396 - "parent": { 397 - "refs": [ 398 - "#threadViewPost", 399 - "#notFoundPost", 400 - "#blockedPost" 401 - ], 402 - "type": "union" 403 - }, 404 - "replies": { 405 - "type": "array", 406 - "items": { 407 - "refs": [ 408 - "#threadViewPost", 409 - "#notFoundPost", 410 - "#blockedPost" 411 - ], 412 - "type": "union" 413 - } 414 - }, 415 - "threadContext": { 416 - "ref": "#threadContext", 417 - "type": "ref" 418 - } 419 - } 420 - }, 421 - "threadgateView": { 422 - "type": "object", 423 - "properties": { 424 - "cid": { 425 - "type": "string", 426 - "format": "cid" 427 - }, 428 - "uri": { 429 - "type": "string", 430 - "format": "at-uri" 431 - }, 432 - "lists": { 433 - "type": "array", 434 - "items": { 435 - "ref": "app.bsky.graph.defs#listViewBasic", 436 - "type": "ref" 437 - } 438 - }, 439 - "record": { 440 - "type": "unknown" 441 - } 442 - } 443 - }, 444 - "interactionLike": { 445 - "type": "token", 446 - "description": "User liked the feed item" 447 - }, 448 - "interactionSeen": { 449 - "type": "token", 450 - "description": "Feed item was seen by user" 451 - }, 452 - "clickthroughItem": { 453 - "type": "token", 454 - "description": "User clicked through to the feed item" 455 - }, 456 - "contentModeVideo": { 457 - "type": "token", 458 - "description": "Declares the feed generator returns posts containing app.bsky.embed.video embeds." 459 - }, 460 - "interactionQuote": { 461 - "type": "token", 462 - "description": "User quoted the feed item" 463 - }, 464 - "interactionReply": { 465 - "type": "token", 466 - "description": "User replied to the feed item" 467 - }, 468 - "interactionShare": { 469 - "type": "token", 470 - "description": "User shared the feed item" 471 - }, 472 - "skeletonFeedPost": { 473 - "type": "object", 474 - "required": [ 475 - "post" 476 - ], 477 - "properties": { 478 - "post": { 479 - "type": "string", 480 - "format": "at-uri" 481 - }, 482 - "reason": { 483 - "refs": [ 484 - "#skeletonReasonRepost", 485 - "#skeletonReasonPin" 486 - ], 487 - "type": "union" 488 - }, 489 - "feedContext": { 490 - "type": "string", 491 - "maxLength": 2000, 492 - "description": "Context that will be passed through to client and may be passed to feed generator back alongside interactions." 493 - } 494 - } 495 - }, 496 - "clickthroughEmbed": { 497 - "type": "token", 498 - "description": "User clicked through to the embedded content of the feed item" 499 - }, 500 - "interactionRepost": { 501 - "type": "token", 502 - "description": "User reposted the feed item" 503 - }, 504 - "skeletonReasonPin": { 505 - "type": "object", 506 - "properties": {} 507 - }, 508 - "clickthroughAuthor": { 509 - "type": "token", 510 - "description": "User clicked through to the author of the feed item" 511 - }, 512 - "clickthroughReposter": { 513 - "type": "token", 514 - "description": "User clicked through to the reposter of the feed item" 515 - }, 516 - "generatorViewerState": { 517 - "type": "object", 518 - "properties": { 519 - "like": { 520 - "type": "string", 521 - "format": "at-uri" 522 - } 523 - } 524 - }, 525 - "skeletonReasonRepost": { 526 - "type": "object", 527 - "required": [ 528 - "repost" 529 - ], 530 - "properties": { 531 - "repost": { 532 - "type": "string", 533 - "format": "at-uri" 534 - } 535 - } 536 - }, 537 - "contentModeUnspecified": { 538 - "type": "token", 539 - "description": "Declares the feed generator returns any types of posts." 540 - } 541 - }, 542 - "$type": "com.atproto.lexicon.schema", 543 - "lexicon": 1 544 - }
-55
templates/react-ts/lexicons/app/bsky/feed/postgate.json
··· 1 - { 2 - "id": "app.bsky.feed.postgate", 3 - "defs": { 4 - "main": { 5 - "key": "tid", 6 - "type": "record", 7 - "record": { 8 - "type": "object", 9 - "required": [ 10 - "post", 11 - "createdAt" 12 - ], 13 - "properties": { 14 - "post": { 15 - "type": "string", 16 - "format": "at-uri", 17 - "description": "Reference (AT-URI) to the post record." 18 - }, 19 - "createdAt": { 20 - "type": "string", 21 - "format": "datetime" 22 - }, 23 - "embeddingRules": { 24 - "type": "array", 25 - "items": { 26 - "refs": [ 27 - "#disableRule" 28 - ], 29 - "type": "union" 30 - }, 31 - "maxLength": 5, 32 - "description": "List of rules defining who can embed this post. If value is an empty array or is undefined, no particular rules apply and anyone can embed." 33 - }, 34 - "detachedEmbeddingUris": { 35 - "type": "array", 36 - "items": { 37 - "type": "string", 38 - "format": "at-uri" 39 - }, 40 - "maxLength": 50, 41 - "description": "List of AT-URIs embedding this post that the author has detached from." 42 - } 43 - } 44 - }, 45 - "description": "Record defining interaction rules for a post. The record key (rkey) of the postgate record must match the record key of the post, and that record must be in the same repository." 46 - }, 47 - "disableRule": { 48 - "type": "object", 49 - "properties": {}, 50 - "description": "Disables embedding of this post." 51 - } 52 - }, 53 - "$type": "com.atproto.lexicon.schema", 54 - "lexicon": 1 55 - }
-81
templates/react-ts/lexicons/app/bsky/feed/threadgate.json
··· 1 - { 2 - "id": "app.bsky.feed.threadgate", 3 - "defs": { 4 - "main": { 5 - "key": "tid", 6 - "type": "record", 7 - "record": { 8 - "type": "object", 9 - "required": [ 10 - "post", 11 - "createdAt" 12 - ], 13 - "properties": { 14 - "post": { 15 - "type": "string", 16 - "format": "at-uri", 17 - "description": "Reference (AT-URI) to the post record." 18 - }, 19 - "allow": { 20 - "type": "array", 21 - "items": { 22 - "refs": [ 23 - "#mentionRule", 24 - "#followerRule", 25 - "#followingRule", 26 - "#listRule" 27 - ], 28 - "type": "union" 29 - }, 30 - "maxLength": 5, 31 - "description": "List of rules defining who can reply to this post. If value is an empty array, no one can reply. If value is undefined, anyone can reply." 32 - }, 33 - "createdAt": { 34 - "type": "string", 35 - "format": "datetime" 36 - }, 37 - "hiddenReplies": { 38 - "type": "array", 39 - "items": { 40 - "type": "string", 41 - "format": "at-uri" 42 - }, 43 - "maxLength": 300, 44 - "description": "List of hidden reply URIs." 45 - } 46 - } 47 - }, 48 - "description": "Record defining interaction gating rules for a thread (aka, reply controls). The record key (rkey) of the threadgate record must match the record key of the thread's root post, and that record must be in the same repository." 49 - }, 50 - "listRule": { 51 - "type": "object", 52 - "required": [ 53 - "list" 54 - ], 55 - "properties": { 56 - "list": { 57 - "type": "string", 58 - "format": "at-uri" 59 - } 60 - }, 61 - "description": "Allow replies from actors on a list." 62 - }, 63 - "mentionRule": { 64 - "type": "object", 65 - "properties": {}, 66 - "description": "Allow replies from actors mentioned in your post." 67 - }, 68 - "followerRule": { 69 - "type": "object", 70 - "properties": {}, 71 - "description": "Allow replies from actors who follow you." 72 - }, 73 - "followingRule": { 74 - "type": "object", 75 - "properties": {}, 76 - "description": "Allow replies from actors you follow." 77 - } 78 - }, 79 - "$type": "com.atproto.lexicon.schema", 80 - "lexicon": 1 81 - }
-353
templates/react-ts/lexicons/app/bsky/graph/defs.json
··· 1 - { 2 - "id": "app.bsky.graph.defs", 3 - "defs": { 4 - "modlist": { 5 - "type": "token", 6 - "description": "A list of actors to apply an aggregate moderation action (mute/block) on." 7 - }, 8 - "listView": { 9 - "type": "object", 10 - "required": [ 11 - "uri", 12 - "cid", 13 - "creator", 14 - "name", 15 - "purpose", 16 - "indexedAt" 17 - ], 18 - "properties": { 19 - "cid": { 20 - "type": "string", 21 - "format": "cid" 22 - }, 23 - "uri": { 24 - "type": "string", 25 - "format": "at-uri" 26 - }, 27 - "name": { 28 - "type": "string", 29 - "maxLength": 64, 30 - "minLength": 1 31 - }, 32 - "avatar": { 33 - "type": "string", 34 - "format": "uri" 35 - }, 36 - "labels": { 37 - "type": "array", 38 - "items": { 39 - "ref": "com.atproto.label.defs#label", 40 - "type": "ref" 41 - } 42 - }, 43 - "viewer": { 44 - "ref": "#listViewerState", 45 - "type": "ref" 46 - }, 47 - "creator": { 48 - "ref": "app.bsky.actor.defs#profileView", 49 - "type": "ref" 50 - }, 51 - "purpose": { 52 - "ref": "#listPurpose", 53 - "type": "ref" 54 - }, 55 - "indexedAt": { 56 - "type": "string", 57 - "format": "datetime" 58 - }, 59 - "description": { 60 - "type": "string", 61 - "maxLength": 3000, 62 - "maxGraphemes": 300 63 - }, 64 - "listItemCount": { 65 - "type": "integer", 66 - "minimum": 0 67 - }, 68 - "descriptionFacets": { 69 - "type": "array", 70 - "items": { 71 - "ref": "app.bsky.richtext.facet", 72 - "type": "ref" 73 - } 74 - } 75 - } 76 - }, 77 - "curatelist": { 78 - "type": "token", 79 - "description": "A list of actors used for curation purposes such as list feeds or interaction gating." 80 - }, 81 - "listPurpose": { 82 - "type": "string", 83 - "knownValues": [ 84 - "app.bsky.graph.defs#modlist", 85 - "app.bsky.graph.defs#curatelist", 86 - "app.bsky.graph.defs#referencelist" 87 - ] 88 - }, 89 - "listItemView": { 90 - "type": "object", 91 - "required": [ 92 - "uri", 93 - "subject" 94 - ], 95 - "properties": { 96 - "uri": { 97 - "type": "string", 98 - "format": "at-uri" 99 - }, 100 - "subject": { 101 - "ref": "app.bsky.actor.defs#profileView", 102 - "type": "ref" 103 - } 104 - } 105 - }, 106 - "relationship": { 107 - "type": "object", 108 - "required": [ 109 - "did" 110 - ], 111 - "properties": { 112 - "did": { 113 - "type": "string", 114 - "format": "did" 115 - }, 116 - "blocking": { 117 - "type": "string", 118 - "format": "at-uri", 119 - "description": "if the actor blocks this DID, this is the AT-URI of the block record" 120 - }, 121 - "blockedBy": { 122 - "type": "string", 123 - "format": "at-uri", 124 - "description": "if the actor is blocked by this DID, contains the AT-URI of the block record" 125 - }, 126 - "following": { 127 - "type": "string", 128 - "format": "at-uri", 129 - "description": "if the actor follows this DID, this is the AT-URI of the follow record" 130 - }, 131 - "followedBy": { 132 - "type": "string", 133 - "format": "at-uri", 134 - "description": "if the actor is followed by this DID, contains the AT-URI of the follow record" 135 - }, 136 - "blockedByList": { 137 - "type": "string", 138 - "format": "at-uri", 139 - "description": "if the actor is blocked by this DID via a block list, contains the AT-URI of the listblock record" 140 - }, 141 - "blockingByList": { 142 - "type": "string", 143 - "format": "at-uri", 144 - "description": "if the actor blocks this DID via a block list, this is the AT-URI of the listblock record" 145 - } 146 - }, 147 - "description": "lists the bi-directional graph relationships between one actor (not indicated in the object), and the target actors (the DID included in the object)" 148 - }, 149 - "listViewBasic": { 150 - "type": "object", 151 - "required": [ 152 - "uri", 153 - "cid", 154 - "name", 155 - "purpose" 156 - ], 157 - "properties": { 158 - "cid": { 159 - "type": "string", 160 - "format": "cid" 161 - }, 162 - "uri": { 163 - "type": "string", 164 - "format": "at-uri" 165 - }, 166 - "name": { 167 - "type": "string", 168 - "maxLength": 64, 169 - "minLength": 1 170 - }, 171 - "avatar": { 172 - "type": "string", 173 - "format": "uri" 174 - }, 175 - "labels": { 176 - "type": "array", 177 - "items": { 178 - "ref": "com.atproto.label.defs#label", 179 - "type": "ref" 180 - } 181 - }, 182 - "viewer": { 183 - "ref": "#listViewerState", 184 - "type": "ref" 185 - }, 186 - "purpose": { 187 - "ref": "#listPurpose", 188 - "type": "ref" 189 - }, 190 - "indexedAt": { 191 - "type": "string", 192 - "format": "datetime" 193 - }, 194 - "listItemCount": { 195 - "type": "integer", 196 - "minimum": 0 197 - } 198 - } 199 - }, 200 - "notFoundActor": { 201 - "type": "object", 202 - "required": [ 203 - "actor", 204 - "notFound" 205 - ], 206 - "properties": { 207 - "actor": { 208 - "type": "string", 209 - "format": "at-identifier" 210 - }, 211 - "notFound": { 212 - "type": "boolean", 213 - "const": true 214 - } 215 - }, 216 - "description": "indicates that a handle or DID could not be resolved" 217 - }, 218 - "referencelist": { 219 - "type": "token", 220 - "description": "A list of actors used for only for reference purposes such as within a starter pack." 221 - }, 222 - "listViewerState": { 223 - "type": "object", 224 - "properties": { 225 - "muted": { 226 - "type": "boolean" 227 - }, 228 - "blocked": { 229 - "type": "string", 230 - "format": "at-uri" 231 - } 232 - } 233 - }, 234 - "starterPackView": { 235 - "type": "object", 236 - "required": [ 237 - "uri", 238 - "cid", 239 - "record", 240 - "creator", 241 - "indexedAt" 242 - ], 243 - "properties": { 244 - "cid": { 245 - "type": "string", 246 - "format": "cid" 247 - }, 248 - "uri": { 249 - "type": "string", 250 - "format": "at-uri" 251 - }, 252 - "list": { 253 - "ref": "#listViewBasic", 254 - "type": "ref" 255 - }, 256 - "feeds": { 257 - "type": "array", 258 - "items": { 259 - "ref": "app.bsky.feed.defs#generatorView", 260 - "type": "ref" 261 - }, 262 - "maxLength": 3 263 - }, 264 - "labels": { 265 - "type": "array", 266 - "items": { 267 - "ref": "com.atproto.label.defs#label", 268 - "type": "ref" 269 - } 270 - }, 271 - "record": { 272 - "type": "unknown" 273 - }, 274 - "creator": { 275 - "ref": "app.bsky.actor.defs#profileViewBasic", 276 - "type": "ref" 277 - }, 278 - "indexedAt": { 279 - "type": "string", 280 - "format": "datetime" 281 - }, 282 - "joinedWeekCount": { 283 - "type": "integer", 284 - "minimum": 0 285 - }, 286 - "listItemsSample": { 287 - "type": "array", 288 - "items": { 289 - "ref": "#listItemView", 290 - "type": "ref" 291 - }, 292 - "maxLength": 12 293 - }, 294 - "joinedAllTimeCount": { 295 - "type": "integer", 296 - "minimum": 0 297 - } 298 - } 299 - }, 300 - "starterPackViewBasic": { 301 - "type": "object", 302 - "required": [ 303 - "uri", 304 - "cid", 305 - "record", 306 - "creator", 307 - "indexedAt" 308 - ], 309 - "properties": { 310 - "cid": { 311 - "type": "string", 312 - "format": "cid" 313 - }, 314 - "uri": { 315 - "type": "string", 316 - "format": "at-uri" 317 - }, 318 - "labels": { 319 - "type": "array", 320 - "items": { 321 - "ref": "com.atproto.label.defs#label", 322 - "type": "ref" 323 - } 324 - }, 325 - "record": { 326 - "type": "unknown" 327 - }, 328 - "creator": { 329 - "ref": "app.bsky.actor.defs#profileViewBasic", 330 - "type": "ref" 331 - }, 332 - "indexedAt": { 333 - "type": "string", 334 - "format": "datetime" 335 - }, 336 - "listItemCount": { 337 - "type": "integer", 338 - "minimum": 0 339 - }, 340 - "joinedWeekCount": { 341 - "type": "integer", 342 - "minimum": 0 343 - }, 344 - "joinedAllTimeCount": { 345 - "type": "integer", 346 - "minimum": 0 347 - } 348 - } 349 - } 350 - }, 351 - "$type": "com.atproto.lexicon.schema", 352 - "lexicon": 1 353 - }
-153
templates/react-ts/lexicons/app/bsky/labeler/defs.json
··· 1 - { 2 - "id": "app.bsky.labeler.defs", 3 - "defs": { 4 - "labelerView": { 5 - "type": "object", 6 - "required": [ 7 - "uri", 8 - "cid", 9 - "creator", 10 - "indexedAt" 11 - ], 12 - "properties": { 13 - "cid": { 14 - "type": "string", 15 - "format": "cid" 16 - }, 17 - "uri": { 18 - "type": "string", 19 - "format": "at-uri" 20 - }, 21 - "labels": { 22 - "type": "array", 23 - "items": { 24 - "ref": "com.atproto.label.defs#label", 25 - "type": "ref" 26 - } 27 - }, 28 - "viewer": { 29 - "ref": "#labelerViewerState", 30 - "type": "ref" 31 - }, 32 - "creator": { 33 - "ref": "app.bsky.actor.defs#profileView", 34 - "type": "ref" 35 - }, 36 - "indexedAt": { 37 - "type": "string", 38 - "format": "datetime" 39 - }, 40 - "likeCount": { 41 - "type": "integer", 42 - "minimum": 0 43 - } 44 - } 45 - }, 46 - "labelerPolicies": { 47 - "type": "object", 48 - "required": [ 49 - "labelValues" 50 - ], 51 - "properties": { 52 - "labelValues": { 53 - "type": "array", 54 - "items": { 55 - "ref": "com.atproto.label.defs#labelValue", 56 - "type": "ref" 57 - }, 58 - "description": "The label values which this labeler publishes. May include global or custom labels." 59 - }, 60 - "labelValueDefinitions": { 61 - "type": "array", 62 - "items": { 63 - "ref": "com.atproto.label.defs#labelValueDefinition", 64 - "type": "ref" 65 - }, 66 - "description": "Label values created by this labeler and scoped exclusively to it. Labels defined here will override global label definitions for this labeler." 67 - } 68 - } 69 - }, 70 - "labelerViewerState": { 71 - "type": "object", 72 - "properties": { 73 - "like": { 74 - "type": "string", 75 - "format": "at-uri" 76 - } 77 - } 78 - }, 79 - "labelerViewDetailed": { 80 - "type": "object", 81 - "required": [ 82 - "uri", 83 - "cid", 84 - "creator", 85 - "policies", 86 - "indexedAt" 87 - ], 88 - "properties": { 89 - "cid": { 90 - "type": "string", 91 - "format": "cid" 92 - }, 93 - "uri": { 94 - "type": "string", 95 - "format": "at-uri" 96 - }, 97 - "labels": { 98 - "type": "array", 99 - "items": { 100 - "ref": "com.atproto.label.defs#label", 101 - "type": "ref" 102 - } 103 - }, 104 - "viewer": { 105 - "ref": "#labelerViewerState", 106 - "type": "ref" 107 - }, 108 - "creator": { 109 - "ref": "app.bsky.actor.defs#profileView", 110 - "type": "ref" 111 - }, 112 - "policies": { 113 - "ref": "app.bsky.labeler.defs#labelerPolicies", 114 - "type": "ref" 115 - }, 116 - "indexedAt": { 117 - "type": "string", 118 - "format": "datetime" 119 - }, 120 - "likeCount": { 121 - "type": "integer", 122 - "minimum": 0 123 - }, 124 - "reasonTypes": { 125 - "type": "array", 126 - "items": { 127 - "ref": "com.atproto.moderation.defs#reasonType", 128 - "type": "ref" 129 - }, 130 - "description": "The set of report reason 'codes' which are in-scope for this service to review and action. These usually align to policy categories. If not defined (distinct from empty array), all reason types are allowed." 131 - }, 132 - "subjectTypes": { 133 - "type": "array", 134 - "items": { 135 - "ref": "com.atproto.moderation.defs#subjectType", 136 - "type": "ref" 137 - }, 138 - "description": "The set of subject types (account, record, etc) this service accepts reports on." 139 - }, 140 - "subjectCollections": { 141 - "type": "array", 142 - "items": { 143 - "type": "string", 144 - "format": "nsid" 145 - }, 146 - "description": "Set of record types (collection NSIDs) which can be reported to this service. If not defined (distinct from empty array), default is any record type." 147 - } 148 - } 149 - } 150 - }, 151 - "$type": "com.atproto.lexicon.schema", 152 - "lexicon": 1 153 - }
-173
templates/react-ts/lexicons/app/bsky/notification/defs.json
··· 1 - { 2 - "id": "app.bsky.notification.defs", 3 - "defs": { 4 - "preference": { 5 - "type": "object", 6 - "required": [ 7 - "list", 8 - "push" 9 - ], 10 - "properties": { 11 - "list": { 12 - "type": "boolean" 13 - }, 14 - "push": { 15 - "type": "boolean" 16 - } 17 - } 18 - }, 19 - "preferences": { 20 - "type": "object", 21 - "required": [ 22 - "chat", 23 - "follow", 24 - "like", 25 - "likeViaRepost", 26 - "mention", 27 - "quote", 28 - "reply", 29 - "repost", 30 - "repostViaRepost", 31 - "starterpackJoined", 32 - "subscribedPost", 33 - "unverified", 34 - "verified" 35 - ], 36 - "properties": { 37 - "chat": { 38 - "ref": "#chatPreference", 39 - "type": "ref" 40 - }, 41 - "like": { 42 - "ref": "#filterablePreference", 43 - "type": "ref" 44 - }, 45 - "quote": { 46 - "ref": "#filterablePreference", 47 - "type": "ref" 48 - }, 49 - "reply": { 50 - "ref": "#filterablePreference", 51 - "type": "ref" 52 - }, 53 - "follow": { 54 - "ref": "#filterablePreference", 55 - "type": "ref" 56 - }, 57 - "repost": { 58 - "ref": "#filterablePreference", 59 - "type": "ref" 60 - }, 61 - "mention": { 62 - "ref": "#filterablePreference", 63 - "type": "ref" 64 - }, 65 - "verified": { 66 - "ref": "#preference", 67 - "type": "ref" 68 - }, 69 - "unverified": { 70 - "ref": "#preference", 71 - "type": "ref" 72 - }, 73 - "likeViaRepost": { 74 - "ref": "#filterablePreference", 75 - "type": "ref" 76 - }, 77 - "subscribedPost": { 78 - "ref": "#preference", 79 - "type": "ref" 80 - }, 81 - "repostViaRepost": { 82 - "ref": "#filterablePreference", 83 - "type": "ref" 84 - }, 85 - "starterpackJoined": { 86 - "ref": "#preference", 87 - "type": "ref" 88 - } 89 - } 90 - }, 91 - "recordDeleted": { 92 - "type": "object", 93 - "properties": {} 94 - }, 95 - "chatPreference": { 96 - "type": "object", 97 - "required": [ 98 - "include", 99 - "push" 100 - ], 101 - "properties": { 102 - "push": { 103 - "type": "boolean" 104 - }, 105 - "include": { 106 - "type": "string", 107 - "knownValues": [ 108 - "all", 109 - "accepted" 110 - ] 111 - } 112 - } 113 - }, 114 - "activitySubscription": { 115 - "type": "object", 116 - "required": [ 117 - "post", 118 - "reply" 119 - ], 120 - "properties": { 121 - "post": { 122 - "type": "boolean" 123 - }, 124 - "reply": { 125 - "type": "boolean" 126 - } 127 - } 128 - }, 129 - "filterablePreference": { 130 - "type": "object", 131 - "required": [ 132 - "include", 133 - "list", 134 - "push" 135 - ], 136 - "properties": { 137 - "list": { 138 - "type": "boolean" 139 - }, 140 - "push": { 141 - "type": "boolean" 142 - }, 143 - "include": { 144 - "type": "string", 145 - "knownValues": [ 146 - "all", 147 - "follows" 148 - ] 149 - } 150 - } 151 - }, 152 - "subjectActivitySubscription": { 153 - "type": "object", 154 - "required": [ 155 - "subject", 156 - "activitySubscription" 157 - ], 158 - "properties": { 159 - "subject": { 160 - "type": "string", 161 - "format": "did" 162 - }, 163 - "activitySubscription": { 164 - "ref": "#activitySubscription", 165 - "type": "ref" 166 - } 167 - }, 168 - "description": "Object used to store activity subscription data in stash." 169 - } 170 - }, 171 - "$type": "com.atproto.lexicon.schema", 172 - "lexicon": 1 173 - }
-90
templates/react-ts/lexicons/app/bsky/richtext/facet.json
··· 1 - { 2 - "id": "app.bsky.richtext.facet", 3 - "defs": { 4 - "tag": { 5 - "type": "object", 6 - "required": [ 7 - "tag" 8 - ], 9 - "properties": { 10 - "tag": { 11 - "type": "string", 12 - "maxLength": 640, 13 - "maxGraphemes": 64 14 - } 15 - }, 16 - "description": "Facet feature for a hashtag. The text usually includes a '#' prefix, but the facet reference should not (except in the case of 'double hash tags')." 17 - }, 18 - "link": { 19 - "type": "object", 20 - "required": [ 21 - "uri" 22 - ], 23 - "properties": { 24 - "uri": { 25 - "type": "string", 26 - "format": "uri" 27 - } 28 - }, 29 - "description": "Facet feature for a URL. The text URL may have been simplified or truncated, but the facet reference should be a complete URL." 30 - }, 31 - "main": { 32 - "type": "object", 33 - "required": [ 34 - "index", 35 - "features" 36 - ], 37 - "properties": { 38 - "index": { 39 - "ref": "#byteSlice", 40 - "type": "ref" 41 - }, 42 - "features": { 43 - "type": "array", 44 - "items": { 45 - "refs": [ 46 - "#mention", 47 - "#link", 48 - "#tag" 49 - ], 50 - "type": "union" 51 - } 52 - } 53 - }, 54 - "description": "Annotation of a sub-string within rich text." 55 - }, 56 - "mention": { 57 - "type": "object", 58 - "required": [ 59 - "did" 60 - ], 61 - "properties": { 62 - "did": { 63 - "type": "string", 64 - "format": "did" 65 - } 66 - }, 67 - "description": "Facet feature for mention of another account. The text is usually a handle, including a '@' prefix, but the facet reference is a DID." 68 - }, 69 - "byteSlice": { 70 - "type": "object", 71 - "required": [ 72 - "byteStart", 73 - "byteEnd" 74 - ], 75 - "properties": { 76 - "byteEnd": { 77 - "type": "integer", 78 - "minimum": 0 79 - }, 80 - "byteStart": { 81 - "type": "integer", 82 - "minimum": 0 83 - } 84 - }, 85 - "description": "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." 86 - } 87 - }, 88 - "$type": "com.atproto.lexicon.schema", 89 - "lexicon": 1 90 - }
-193
templates/react-ts/lexicons/com/atproto/label/defs.json
··· 1 - { 2 - "id": "com.atproto.label.defs", 3 - "defs": { 4 - "label": { 5 - "type": "object", 6 - "required": [ 7 - "src", 8 - "uri", 9 - "val", 10 - "cts" 11 - ], 12 - "properties": { 13 - "cid": { 14 - "type": "string", 15 - "format": "cid", 16 - "description": "Optionally, CID specifying the specific version of 'uri' resource this label applies to." 17 - }, 18 - "cts": { 19 - "type": "string", 20 - "format": "datetime", 21 - "description": "Timestamp when this label was created." 22 - }, 23 - "exp": { 24 - "type": "string", 25 - "format": "datetime", 26 - "description": "Timestamp at which this label expires (no longer applies)." 27 - }, 28 - "neg": { 29 - "type": "boolean", 30 - "description": "If true, this is a negation label, overwriting a previous label." 31 - }, 32 - "sig": { 33 - "type": "bytes", 34 - "description": "Signature of dag-cbor encoded label." 35 - }, 36 - "src": { 37 - "type": "string", 38 - "format": "did", 39 - "description": "DID of the actor who created this label." 40 - }, 41 - "uri": { 42 - "type": "string", 43 - "format": "uri", 44 - "description": "AT URI of the record, repository (account), or other resource that this label applies to." 45 - }, 46 - "val": { 47 - "type": "string", 48 - "maxLength": 128, 49 - "description": "The short string name of the value or type of this label." 50 - }, 51 - "ver": { 52 - "type": "integer", 53 - "description": "The AT Protocol version of the label object." 54 - } 55 - }, 56 - "description": "Metadata tag on an atproto resource (eg, repo or record)." 57 - }, 58 - "selfLabel": { 59 - "type": "object", 60 - "required": [ 61 - "val" 62 - ], 63 - "properties": { 64 - "val": { 65 - "type": "string", 66 - "maxLength": 128, 67 - "description": "The short string name of the value or type of this label." 68 - } 69 - }, 70 - "description": "Metadata tag on an atproto record, published by the author within the record. Note that schemas should use #selfLabels, not #selfLabel." 71 - }, 72 - "labelValue": { 73 - "type": "string", 74 - "knownValues": [ 75 - "!hide", 76 - "!no-promote", 77 - "!warn", 78 - "!no-unauthenticated", 79 - "dmca-violation", 80 - "doxxing", 81 - "porn", 82 - "sexual", 83 - "nudity", 84 - "nsfl", 85 - "gore" 86 - ] 87 - }, 88 - "selfLabels": { 89 - "type": "object", 90 - "required": [ 91 - "values" 92 - ], 93 - "properties": { 94 - "values": { 95 - "type": "array", 96 - "items": { 97 - "ref": "#selfLabel", 98 - "type": "ref" 99 - }, 100 - "maxLength": 10 101 - } 102 - }, 103 - "description": "Metadata tags on an atproto record, published by the author within the record." 104 - }, 105 - "labelValueDefinition": { 106 - "type": "object", 107 - "required": [ 108 - "identifier", 109 - "severity", 110 - "blurs", 111 - "locales" 112 - ], 113 - "properties": { 114 - "blurs": { 115 - "type": "string", 116 - "description": "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.", 117 - "knownValues": [ 118 - "content", 119 - "media", 120 - "none" 121 - ] 122 - }, 123 - "locales": { 124 - "type": "array", 125 - "items": { 126 - "ref": "#labelValueDefinitionStrings", 127 - "type": "ref" 128 - } 129 - }, 130 - "severity": { 131 - "type": "string", 132 - "description": "How should a client visually convey this label? 'inform' means neutral and informational; 'alert' means negative and warning; 'none' means show nothing.", 133 - "knownValues": [ 134 - "inform", 135 - "alert", 136 - "none" 137 - ] 138 - }, 139 - "adultOnly": { 140 - "type": "boolean", 141 - "description": "Does the user need to have adult content enabled in order to configure this label?" 142 - }, 143 - "identifier": { 144 - "type": "string", 145 - "maxLength": 100, 146 - "description": "The value of the label being defined. Must only include lowercase ascii and the '-' character ([a-z-]+).", 147 - "maxGraphemes": 100 148 - }, 149 - "defaultSetting": { 150 - "type": "string", 151 - "default": "warn", 152 - "description": "The default setting for this label.", 153 - "knownValues": [ 154 - "ignore", 155 - "warn", 156 - "hide" 157 - ] 158 - } 159 - }, 160 - "description": "Declares a label value and its expected interpretations and behaviors." 161 - }, 162 - "labelValueDefinitionStrings": { 163 - "type": "object", 164 - "required": [ 165 - "lang", 166 - "name", 167 - "description" 168 - ], 169 - "properties": { 170 - "lang": { 171 - "type": "string", 172 - "format": "language", 173 - "description": "The code of the language these strings are written in." 174 - }, 175 - "name": { 176 - "type": "string", 177 - "maxLength": 640, 178 - "description": "A short human-readable name for the label.", 179 - "maxGraphemes": 64 180 - }, 181 - "description": { 182 - "type": "string", 183 - "maxLength": 100000, 184 - "description": "A longer description of what the label means and why it might be applied.", 185 - "maxGraphemes": 10000 186 - } 187 - }, 188 - "description": "Strings which describe the label in the UI, localized into a specific language." 189 - } 190 - }, 191 - "$type": "com.atproto.lexicon.schema", 192 - "lexicon": 1 193 - }
-96
templates/react-ts/lexicons/com/atproto/moderation/defs.json
··· 1 - { 2 - "id": "com.atproto.moderation.defs", 3 - "defs": { 4 - "reasonRude": { 5 - "type": "token", 6 - "description": "Rude, harassing, explicit, or otherwise unwelcoming behavior. Prefer new lexicon definition `tools.ozone.report.defs#reasonHarassmentOther`." 7 - }, 8 - "reasonSpam": { 9 - "type": "token", 10 - "description": "Spam: frequent unwanted promotion, replies, mentions. Prefer new lexicon definition `tools.ozone.report.defs#reasonMisleadingSpam`." 11 - }, 12 - "reasonType": { 13 - "type": "string", 14 - "knownValues": [ 15 - "com.atproto.moderation.defs#reasonSpam", 16 - "com.atproto.moderation.defs#reasonViolation", 17 - "com.atproto.moderation.defs#reasonMisleading", 18 - "com.atproto.moderation.defs#reasonSexual", 19 - "com.atproto.moderation.defs#reasonRude", 20 - "com.atproto.moderation.defs#reasonOther", 21 - "com.atproto.moderation.defs#reasonAppeal", 22 - "tools.ozone.report.defs#reasonAppeal", 23 - "tools.ozone.report.defs#reasonOther", 24 - "tools.ozone.report.defs#reasonViolenceAnimal", 25 - "tools.ozone.report.defs#reasonViolenceThreats", 26 - "tools.ozone.report.defs#reasonViolenceGraphicContent", 27 - "tools.ozone.report.defs#reasonViolenceGlorification", 28 - "tools.ozone.report.defs#reasonViolenceExtremistContent", 29 - "tools.ozone.report.defs#reasonViolenceTrafficking", 30 - "tools.ozone.report.defs#reasonViolenceOther", 31 - "tools.ozone.report.defs#reasonSexualAbuseContent", 32 - "tools.ozone.report.defs#reasonSexualNCII", 33 - "tools.ozone.report.defs#reasonSexualDeepfake", 34 - "tools.ozone.report.defs#reasonSexualAnimal", 35 - "tools.ozone.report.defs#reasonSexualUnlabeled", 36 - "tools.ozone.report.defs#reasonSexualOther", 37 - "tools.ozone.report.defs#reasonChildSafetyCSAM", 38 - "tools.ozone.report.defs#reasonChildSafetyGroom", 39 - "tools.ozone.report.defs#reasonChildSafetyPrivacy", 40 - "tools.ozone.report.defs#reasonChildSafetyHarassment", 41 - "tools.ozone.report.defs#reasonChildSafetyOther", 42 - "tools.ozone.report.defs#reasonHarassmentTroll", 43 - "tools.ozone.report.defs#reasonHarassmentTargeted", 44 - "tools.ozone.report.defs#reasonHarassmentHateSpeech", 45 - "tools.ozone.report.defs#reasonHarassmentDoxxing", 46 - "tools.ozone.report.defs#reasonHarassmentOther", 47 - "tools.ozone.report.defs#reasonMisleadingBot", 48 - "tools.ozone.report.defs#reasonMisleadingImpersonation", 49 - "tools.ozone.report.defs#reasonMisleadingSpam", 50 - "tools.ozone.report.defs#reasonMisleadingScam", 51 - "tools.ozone.report.defs#reasonMisleadingElections", 52 - "tools.ozone.report.defs#reasonMisleadingOther", 53 - "tools.ozone.report.defs#reasonRuleSiteSecurity", 54 - "tools.ozone.report.defs#reasonRuleProhibitedSales", 55 - "tools.ozone.report.defs#reasonRuleBanEvasion", 56 - "tools.ozone.report.defs#reasonRuleOther", 57 - "tools.ozone.report.defs#reasonSelfHarmContent", 58 - "tools.ozone.report.defs#reasonSelfHarmED", 59 - "tools.ozone.report.defs#reasonSelfHarmStunts", 60 - "tools.ozone.report.defs#reasonSelfHarmSubstances", 61 - "tools.ozone.report.defs#reasonSelfHarmOther" 62 - ] 63 - }, 64 - "reasonOther": { 65 - "type": "token", 66 - "description": "Reports not falling under another report category. Prefer new lexicon definition `tools.ozone.report.defs#reasonOther`." 67 - }, 68 - "subjectType": { 69 - "type": "string", 70 - "description": "Tag describing a type of subject that might be reported.", 71 - "knownValues": [ 72 - "account", 73 - "record", 74 - "chat" 75 - ] 76 - }, 77 - "reasonAppeal": { 78 - "type": "token", 79 - "description": "Appeal a previously taken moderation action" 80 - }, 81 - "reasonSexual": { 82 - "type": "token", 83 - "description": "Unwanted or mislabeled sexual content. Prefer new lexicon definition `tools.ozone.report.defs#reasonSexualUnlabeled`." 84 - }, 85 - "reasonViolation": { 86 - "type": "token", 87 - "description": "Direct violation of server rules, laws, terms of service. Prefer new lexicon definition `tools.ozone.report.defs#reasonRuleOther`." 88 - }, 89 - "reasonMisleading": { 90 - "type": "token", 91 - "description": "Misleading identity, affiliation, or content. Prefer new lexicon definition `tools.ozone.report.defs#reasonMisleadingOther`." 92 - } 93 - }, 94 - "$type": "com.atproto.lexicon.schema", 95 - "lexicon": 1 96 - }
-25
templates/react-ts/lexicons/com/atproto/repo/strongRef.json
··· 1 - { 2 - "id": "com.atproto.repo.strongRef", 3 - "defs": { 4 - "main": { 5 - "type": "object", 6 - "required": [ 7 - "uri", 8 - "cid" 9 - ], 10 - "properties": { 11 - "cid": { 12 - "type": "string", 13 - "format": "cid" 14 - }, 15 - "uri": { 16 - "type": "string", 17 - "format": "at-uri" 18 - } 19 - } 20 - } 21 - }, 22 - "$type": "com.atproto.lexicon.schema", 23 - "lexicon": 1, 24 - "description": "A URI with a content-hash fingerprint." 25 - }
-212
templates/react-ts/lexicons/tools/ozone/report/defs.json
··· 1 - { 2 - "id": "tools.ozone.report.defs", 3 - "defs": { 4 - "reasonType": { 5 - "type": "string", 6 - "knownValues": [ 7 - "tools.ozone.report.defs#reasonAppeal", 8 - "tools.ozone.report.defs#reasonOther", 9 - "tools.ozone.report.defs#reasonViolenceAnimal", 10 - "tools.ozone.report.defs#reasonViolenceThreats", 11 - "tools.ozone.report.defs#reasonViolenceGraphicContent", 12 - "tools.ozone.report.defs#reasonViolenceGlorification", 13 - "tools.ozone.report.defs#reasonViolenceExtremistContent", 14 - "tools.ozone.report.defs#reasonViolenceTrafficking", 15 - "tools.ozone.report.defs#reasonViolenceOther", 16 - "tools.ozone.report.defs#reasonSexualAbuseContent", 17 - "tools.ozone.report.defs#reasonSexualNCII", 18 - "tools.ozone.report.defs#reasonSexualDeepfake", 19 - "tools.ozone.report.defs#reasonSexualAnimal", 20 - "tools.ozone.report.defs#reasonSexualUnlabeled", 21 - "tools.ozone.report.defs#reasonSexualOther", 22 - "tools.ozone.report.defs#reasonChildSafetyCSAM", 23 - "tools.ozone.report.defs#reasonChildSafetyGroom", 24 - "tools.ozone.report.defs#reasonChildSafetyPrivacy", 25 - "tools.ozone.report.defs#reasonChildSafetyHarassment", 26 - "tools.ozone.report.defs#reasonChildSafetyOther", 27 - "tools.ozone.report.defs#reasonHarassmentTroll", 28 - "tools.ozone.report.defs#reasonHarassmentTargeted", 29 - "tools.ozone.report.defs#reasonHarassmentHateSpeech", 30 - "tools.ozone.report.defs#reasonHarassmentDoxxing", 31 - "tools.ozone.report.defs#reasonHarassmentOther", 32 - "tools.ozone.report.defs#reasonMisleadingBot", 33 - "tools.ozone.report.defs#reasonMisleadingImpersonation", 34 - "tools.ozone.report.defs#reasonMisleadingSpam", 35 - "tools.ozone.report.defs#reasonMisleadingScam", 36 - "tools.ozone.report.defs#reasonMisleadingElections", 37 - "tools.ozone.report.defs#reasonMisleadingOther", 38 - "tools.ozone.report.defs#reasonRuleSiteSecurity", 39 - "tools.ozone.report.defs#reasonRuleProhibitedSales", 40 - "tools.ozone.report.defs#reasonRuleBanEvasion", 41 - "tools.ozone.report.defs#reasonRuleOther", 42 - "tools.ozone.report.defs#reasonSelfHarmContent", 43 - "tools.ozone.report.defs#reasonSelfHarmED", 44 - "tools.ozone.report.defs#reasonSelfHarmStunts", 45 - "tools.ozone.report.defs#reasonSelfHarmSubstances", 46 - "tools.ozone.report.defs#reasonSelfHarmOther" 47 - ] 48 - }, 49 - "reasonOther": { 50 - "type": "token", 51 - "description": "An issue not included in these options" 52 - }, 53 - "reasonAppeal": { 54 - "type": "token", 55 - "description": "Appeal a previously taken moderation action" 56 - }, 57 - "reasonRuleOther": { 58 - "type": "token", 59 - "description": "Other" 60 - }, 61 - "reasonSelfHarmED": { 62 - "type": "token", 63 - "description": "Eating disorders" 64 - }, 65 - "reasonSexualNCII": { 66 - "type": "token", 67 - "description": "Non-consensual intimate imagery" 68 - }, 69 - "reasonSexualOther": { 70 - "type": "token", 71 - "description": "Other sexual violence content" 72 - }, 73 - "reasonSexualAnimal": { 74 - "type": "token", 75 - "description": "Animal sexual abuse" 76 - }, 77 - "reasonMisleadingBot": { 78 - "type": "token", 79 - "description": "Fake account or bot" 80 - }, 81 - "reasonSelfHarmOther": { 82 - "type": "token", 83 - "description": "Other dangerous content" 84 - }, 85 - "reasonViolenceOther": { 86 - "type": "token", 87 - "description": "Other violent content" 88 - }, 89 - "reasonMisleadingScam": { 90 - "type": "token", 91 - "description": "Scam" 92 - }, 93 - "reasonMisleadingSpam": { 94 - "type": "token", 95 - "description": "Spam" 96 - }, 97 - "reasonRuleBanEvasion": { 98 - "type": "token", 99 - "description": "Banned user returning" 100 - }, 101 - "reasonSelfHarmStunts": { 102 - "type": "token", 103 - "description": "Dangerous challenges or activities" 104 - }, 105 - "reasonSexualDeepfake": { 106 - "type": "token", 107 - "description": "Deepfake adult content" 108 - }, 109 - "reasonViolenceAnimal": { 110 - "type": "token", 111 - "description": "Animal welfare violations" 112 - }, 113 - "reasonChildSafetyCSAM": { 114 - "type": "token", 115 - "description": "Child sexual abuse material (CSAM). These reports will be sent only be sent to the application's Moderation Authority." 116 - }, 117 - "reasonHarassmentOther": { 118 - "type": "token", 119 - "description": "Other harassing or hateful content" 120 - }, 121 - "reasonHarassmentTroll": { 122 - "type": "token", 123 - "description": "Trolling" 124 - }, 125 - "reasonMisleadingOther": { 126 - "type": "token", 127 - "description": "Other misleading content" 128 - }, 129 - "reasonSelfHarmContent": { 130 - "type": "token", 131 - "description": "Content promoting or depicting self-harm" 132 - }, 133 - "reasonSexualUnlabeled": { 134 - "type": "token", 135 - "description": "Unlabelled adult content" 136 - }, 137 - "reasonViolenceThreats": { 138 - "type": "token", 139 - "description": "Threats or incitement" 140 - }, 141 - "reasonChildSafetyGroom": { 142 - "type": "token", 143 - "description": "Grooming or predatory behavior. These reports will be sent only be sent to the application's Moderation Authority." 144 - }, 145 - "reasonChildSafetyOther": { 146 - "type": "token", 147 - "description": "Other child safety. These reports will be sent only be sent to the application's Moderation Authority." 148 - }, 149 - "reasonRuleSiteSecurity": { 150 - "type": "token", 151 - "description": "Hacking or system attacks" 152 - }, 153 - "reasonHarassmentDoxxing": { 154 - "type": "token", 155 - "description": "Doxxing" 156 - }, 157 - "reasonChildSafetyPrivacy": { 158 - "type": "token", 159 - "description": "Privacy violation involving a minor" 160 - }, 161 - "reasonHarassmentTargeted": { 162 - "type": "token", 163 - "description": "Targeted harassment" 164 - }, 165 - "reasonSelfHarmSubstances": { 166 - "type": "token", 167 - "description": "Dangerous substances or drug abuse" 168 - }, 169 - "reasonSexualAbuseContent": { 170 - "type": "token", 171 - "description": "Adult sexual abuse content" 172 - }, 173 - "reasonMisleadingElections": { 174 - "type": "token", 175 - "description": "False information about elections" 176 - }, 177 - "reasonRuleProhibitedSales": { 178 - "type": "token", 179 - "description": "Promoting or selling prohibited items or services" 180 - }, 181 - "reasonViolenceTrafficking": { 182 - "type": "token", 183 - "description": "Human trafficking" 184 - }, 185 - "reasonHarassmentHateSpeech": { 186 - "type": "token", 187 - "description": "Hate speech" 188 - }, 189 - "reasonChildSafetyHarassment": { 190 - "type": "token", 191 - "description": "Harassment or bullying of minors" 192 - }, 193 - "reasonViolenceGlorification": { 194 - "type": "token", 195 - "description": "Glorification of violence" 196 - }, 197 - "reasonViolenceGraphicContent": { 198 - "type": "token", 199 - "description": "Graphic violent content" 200 - }, 201 - "reasonMisleadingImpersonation": { 202 - "type": "token", 203 - "description": "Impersonation" 204 - }, 205 - "reasonViolenceExtremistContent": { 206 - "type": "token", 207 - "description": "Extremist content. These reports will be sent only be sent to the application's Moderation Authority." 208 - } 209 - }, 210 - "$type": "com.atproto.lexicon.schema", 211 - "lexicon": 1 212 - }
-5
templates/react-ts/public/favicon.svg
··· 1 - <svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" class="h-6" viewBox="0 0 160.264 27"> 2 - <path fill="#3b82f5" d="M13.482 27c-1.956 0-3.756-.324-5.4-.972-1.644-.648-3.072-1.566-4.284-2.754A12.247 12.247 0 0 1 .99 19.116C.33 17.52 0 15.786 0 13.914c0-2.232.342-4.212 1.026-5.94.696-1.728 1.656-3.18 2.88-4.356A12.48 12.48 0 0 1 8.19.918C9.822.306 11.568 0 13.428 0c2.28 0 4.278.354 5.994 1.062 1.716.708 3.144 1.668 4.284 2.88A11.706 11.706 0 0 1 26.244 8.1c.552 1.548.804 3.168.756 4.86-.06 2.328-.546 4.116-1.458 5.364-.912 1.236-2.328 1.854-4.248 1.854a5.839 5.839 0 0 1-2.826-.702 3.703 3.703 0 0 1-1.764-2.07l1.044.054c-.492.924-1.164 1.572-2.016 1.944a6.464 6.464 0 0 1-2.61.558c-1.212 0-2.28-.258-3.204-.774a5.682 5.682 0 0 1-2.178-2.214c-.528-.948-.792-2.046-.792-3.294 0-1.284.276-2.394.828-3.33a5.77 5.77 0 0 1 2.232-2.196c.936-.516 1.992-.774 3.168-.774.78 0 1.59.162 2.43.486.852.324 1.512.78 1.98 1.368l-.738.936V7.884h2.412l-.054 6.462c0 .924.18 1.62.54 2.088.36.468.894.702 1.602.702.624 0 1.104-.174 1.44-.522.348-.36.588-.846.72-1.458a10.66 10.66 0 0 0 .252-2.106c.036-1.86-.24-3.426-.828-4.698-.588-1.272-1.386-2.298-2.394-3.078a9.499 9.499 0 0 0-3.294-1.71c-1.2-.36-2.394-.54-3.582-.54-1.68 0-3.174.27-4.482.81-1.308.528-2.412 1.278-3.312 2.25-.888.96-1.56 2.1-2.016 3.42-.444 1.308-.654 2.748-.63 4.32.048 1.56.33 2.964.846 4.212a9.324 9.324 0 0 0 2.16 3.204 9.38 9.38 0 0 0 3.276 2.034c1.26.468 2.64.702 4.14.702.84 0 1.674-.096 2.502-.288.84-.18 1.608-.438 2.304-.774l1.026 2.808c-.924.432-1.896.75-2.916.954a14.649 14.649 0 0 1-3.078.324Zm-.144-10.098c.852 0 1.566-.246 2.142-.738.576-.492.864-1.326.864-2.502 0-1.068-.258-1.872-.774-2.412-.504-.552-1.218-.828-2.142-.828-1.092 0-1.908.288-2.448.864-.54.576-.81 1.368-.81 2.376 0 1.032.276 1.83.828 2.394.564.564 1.344.846 2.34.846z" class="fill-blue-500"/> 3 - <path fill="#2665eb" d="M50.919 7.033V4.765h13.509v2.268H58.98V22.22h-2.624V7.032h-5.438ZM38.512 22.22h-2.795l6.28-17.455h3.043l6.283 17.455h-2.796L43.592 7.936h-.137zm.469-6.835h9.068v2.216h-9.068z" class="fill-blue-600 dark:fill-blue-500"/> 4 - <path fill="#3e3e45" d="M160.264 4.765V22.22h-2.548V4.765Zm-11.495 17.719c-1.227 0-2.298-.281-3.213-.843-.915-.563-1.625-1.35-2.131-2.361-.505-1.012-.758-2.194-.758-3.546 0-1.358.253-2.545.758-3.562.506-1.017 1.216-1.807 2.131-2.37.915-.562 1.986-.843 3.213-.843s2.298.28 3.213.843 1.625 1.353 2.131 2.37c.506 1.017.758 2.204.758 3.562 0 1.352-.252 2.534-.758 3.546-.506 1.011-1.216 1.798-2.131 2.36-.915.563-1.986.844-3.213.844zm.009-2.139c.795 0 1.454-.21 1.977-.63.523-.421.909-.98 1.159-1.68.256-.699.384-1.468.384-2.31a6.64 6.64 0 0 0-.384-2.3c-.25-.705-.636-1.27-1.159-1.697-.523-.426-1.182-.639-1.977-.639-.801 0-1.466.213-1.995.64-.522.426-.912.991-1.167 1.695a6.789 6.789 0 0 0-.375 2.302c0 .84.125 1.61.375 2.31.255.698.645 1.258 1.167 1.678.529.42 1.194.631 1.995.631zm-13.626 2.139c-1.267 0-2.358-.287-3.273-.86-.909-.58-1.608-1.378-2.096-2.395-.489-1.018-.733-2.182-.733-3.495 0-1.33.25-2.503.75-3.52.5-1.022 1.204-1.82 2.113-2.395.909-.573 1.98-.86 3.213-.86.995 0 1.881.184 2.659.554a4.764 4.764 0 0 1 1.884 1.534c.483.659.77 1.429.861 2.31h-2.48a2.974 2.974 0 0 0-.938-1.586c-.483-.443-1.13-.665-1.943-.665-.71 0-1.332.188-1.866.563-.529.37-.941.898-1.236 1.585-.296.682-.443 1.489-.443 2.42 0 .955.144 1.779.434 2.472.29.693.699 1.23 1.227 1.61.535.382 1.162.572 1.884.572.483 0 .92-.088 1.313-.264.397-.182.73-.44.997-.776.272-.335.463-.739.571-1.21h2.48a4.823 4.823 0 0 1-.827 2.267 4.76 4.76 0 0 1-1.849 1.568c-.767.38-1.668.571-2.702.571zm-14.461 0c-1.227 0-2.298-.281-3.213-.843-.915-.563-1.625-1.35-2.131-2.361-.505-1.012-.758-2.194-.758-3.546 0-1.358.253-2.545.758-3.562.506-1.017 1.216-1.807 2.131-2.37.915-.562 1.986-.843 3.213-.843s2.298.28 3.213.843 1.625 1.353 2.131 2.37c.505 1.017.758 2.204.758 3.562 0 1.352-.253 2.534-.758 3.546-.506 1.011-1.216 1.798-2.131 2.36-.915.563-1.986.844-3.213.844zm.009-2.139c.795 0 1.454-.21 1.977-.63.523-.421.909-.98 1.159-1.68.256-.699.383-1.468.383-2.31 0-.834-.127-1.602-.383-2.3-.25-.705-.636-1.27-1.159-1.697-.523-.426-1.182-.639-1.977-.639-.802 0-1.466.213-1.995.64-.522.426-.912.991-1.167 1.695a6.789 6.789 0 0 0-.375 2.302c0 .84.125 1.61.375 2.31.255.698.645 1.258 1.167 1.678.529.42 1.193.631 1.995.631zM112.499 9.13v2.044h-7.151V9.13Zm-5.233-3.137h2.548v12.383c0 .495.074.867.221 1.117.148.244.339.412.572.503.238.085.497.127.775.127.205 0 .384-.014.537-.042l.358-.068.46 2.105a4.307 4.307 0 0 1-.63.17 4.992 4.992 0 0 1-1.023.102 4.483 4.483 0 0 1-1.875-.358 3.208 3.208 0 0 1-1.406-1.159c-.358-.522-.537-1.179-.537-1.968zm-9.825 16.491c-1.227 0-2.298-.281-3.213-.843-.915-.563-1.625-1.35-2.13-2.361-.506-1.012-.76-2.194-.76-3.546 0-1.358.254-2.545.76-3.562.505-1.017 1.215-1.807 2.13-2.37.915-.562 1.986-.843 3.213-.843s2.298.28 3.213.843 1.625 1.353 2.131 2.37c.505 1.017.758 2.204.758 3.562 0 1.352-.253 2.534-.758 3.546-.506 1.011-1.216 1.798-2.131 2.36-.915.563-1.986.844-3.213.844zm.008-2.139c.796 0 1.455-.21 1.978-.63.523-.421.909-.98 1.159-1.68.256-.699.383-1.468.383-2.31 0-.834-.127-1.602-.383-2.3-.25-.705-.636-1.27-1.159-1.697-.523-.426-1.182-.639-1.978-.639-.8 0-1.465.213-1.994.64-.522.426-.912.991-1.167 1.695a6.789 6.789 0 0 0-.375 2.302c0 .84.125 1.61.375 2.31.255.698.644 1.258 1.167 1.678.529.42 1.193.631 1.995.631zM83.185 22.22V9.13h2.463v2.079h.136a3.164 3.164 0 0 1 1.261-1.662 3.61 3.61 0 0 1 2.063-.614 10.896 10.896 0 0 1 1.082.06v2.437a4.577 4.577 0 0 0-.545-.094 5.202 5.202 0 0 0-.784-.06c-.603 0-1.14.129-1.611.384a2.85 2.85 0 0 0-1.517 2.566v7.994zm-15.147 0V4.765h6.221c1.358 0 2.483.248 3.375.742.892.494 1.56 1.17 2.003 2.028.443.853.665 1.813.665 2.881 0 1.074-.225 2.04-.674 2.898-.443.852-1.113 1.528-2.01 2.028-.893.494-2.015.742-3.367.742h-4.279V13.85h4.04c.858 0 1.554-.148 2.088-.444.534-.3.926-.71 1.176-1.227.25-.517.375-1.105.375-1.764 0-.66-.125-1.244-.375-1.756-.25-.511-.645-.912-1.184-1.201-.534-.29-1.239-.435-2.114-.435h-3.307V22.22Z" class="fill-zinc-700 dark:fill-zinc-400"/> 5 - </svg>
+8
templates/svelte-ts/README.md
··· 1 + # Svelte + TypeScript + Vite + AT Protocol 2 + 3 + This is a minimal project with just enough to get you going with developing an AT Protocol web application using the public APIs. 4 + 5 + ## Resources 6 + 7 + - [Introduction to the AT Protocol](https://atproto.com/articles/atproto-ethos) 8 + - [Bluesky Developer Documentation](https://docs.bsky.app)
+93
templates/svelte-ts/lexicons.json
··· 1 + { 2 + "version": 1, 3 + "lexicons": [ 4 + "app.bsky.actor.getProfile", 5 + "app.bsky.actor.profile" 6 + ], 7 + "resolutions": { 8 + "app.bsky.actor.defs": { 9 + "uri": "at://did:plc:4v4y5r3lwsbtmsxhile2ljac/com.atproto.lexicon.schema/app.bsky.actor.defs", 10 + "cid": "bafyreigwqwhe2jxohagozazfbrf6dxgzphvkg3d3lg7uxdvepsimqyclka" 11 + }, 12 + "app.bsky.actor.getProfile": { 13 + "uri": "at://did:plc:4v4y5r3lwsbtmsxhile2ljac/com.atproto.lexicon.schema/app.bsky.actor.getProfile", 14 + "cid": "bafyreigrtosreva7e5m7bwbbfsmw77gkdnieizgxwpobw5iobuck3j54xa" 15 + }, 16 + "app.bsky.actor.profile": { 17 + "uri": "at://did:plc:4v4y5r3lwsbtmsxhile2ljac/com.atproto.lexicon.schema/app.bsky.actor.profile", 18 + "cid": "bafyreia6umzg3a6d7mjbow4p57tviey45muohklhgsvjoamcctoiusr4pe" 19 + }, 20 + "app.bsky.actor.status": { 21 + "uri": "at://did:plc:4v4y5r3lwsbtmsxhile2ljac/com.atproto.lexicon.schema/app.bsky.actor.status", 22 + "cid": "bafyreifdg4b64wohpwkh5lydc6tckvol2rspnpni6dec6recy2rhvlnz4a" 23 + }, 24 + "app.bsky.embed.defs": { 25 + "uri": "at://did:plc:4v4y5r3lwsbtmsxhile2ljac/com.atproto.lexicon.schema/app.bsky.embed.defs", 26 + "cid": "bafyreia42uud4qil67wknywzbxfyxc3b7woewsii54cakq2ould3ldetei" 27 + }, 28 + "app.bsky.embed.external": { 29 + "uri": "at://did:plc:4v4y5r3lwsbtmsxhile2ljac/com.atproto.lexicon.schema/app.bsky.embed.external", 30 + "cid": "bafyreiblxmpzgwg4fbr45b4xzts3h4k72k7cdnrxy2ub2w5d7mnwzznkwi" 31 + }, 32 + "app.bsky.embed.images": { 33 + "uri": "at://did:plc:4v4y5r3lwsbtmsxhile2ljac/com.atproto.lexicon.schema/app.bsky.embed.images", 34 + "cid": "bafyreifrntpx63uebiskpooozv6hji62swectq3pocw5h5gpkkqynmazdm" 35 + }, 36 + "app.bsky.embed.record": { 37 + "uri": "at://did:plc:4v4y5r3lwsbtmsxhile2ljac/com.atproto.lexicon.schema/app.bsky.embed.record", 38 + "cid": "bafyreigdtmu53blwxoygphg5zh5zpmlftz64c3jyqpv2yqpx3nrichkyla" 39 + }, 40 + "app.bsky.embed.recordWithMedia": { 41 + "uri": "at://did:plc:4v4y5r3lwsbtmsxhile2ljac/com.atproto.lexicon.schema/app.bsky.embed.recordWithMedia", 42 + "cid": "bafyreia7jrw2p73egm7vrunssgzeyj2rwmk3s4dymfhgzcavxjfaje3qfi" 43 + }, 44 + "app.bsky.embed.video": { 45 + "uri": "at://did:plc:4v4y5r3lwsbtmsxhile2ljac/com.atproto.lexicon.schema/app.bsky.embed.video", 46 + "cid": "bafyreie3nug4ezpwodl6yrpgv5edkazzn22t7ea4yaeuun4rctyekkngai" 47 + }, 48 + "app.bsky.feed.defs": { 49 + "uri": "at://did:plc:4v4y5r3lwsbtmsxhile2ljac/com.atproto.lexicon.schema/app.bsky.feed.defs", 50 + "cid": "bafyreiadwvxawxifsnm7ae6l56aq23qs7ndih7npgs6pxmkoin7gi3k6pu" 51 + }, 52 + "app.bsky.feed.postgate": { 53 + "uri": "at://did:plc:4v4y5r3lwsbtmsxhile2ljac/com.atproto.lexicon.schema/app.bsky.feed.postgate", 54 + "cid": "bafyreiai5efexyluyptv5tbl6kqbqlnneczqzexcqnxmitmulyjfaftgva" 55 + }, 56 + "app.bsky.feed.threadgate": { 57 + "uri": "at://did:plc:4v4y5r3lwsbtmsxhile2ljac/com.atproto.lexicon.schema/app.bsky.feed.threadgate", 58 + "cid": "bafyreiht77wd6duduz4yqp62m6dwma5dy7gdihps4g2nd73acfzqlglvdi" 59 + }, 60 + "app.bsky.graph.defs": { 61 + "uri": "at://did:plc:4v4y5r3lwsbtmsxhile2ljac/com.atproto.lexicon.schema/app.bsky.graph.defs", 62 + "cid": "bafyreifcipomli7yggtl46xufgxlnrw7se6xmsdxmzgfcz2tiu76ljatxm" 63 + }, 64 + "app.bsky.labeler.defs": { 65 + "uri": "at://did:plc:4v4y5r3lwsbtmsxhile2ljac/com.atproto.lexicon.schema/app.bsky.labeler.defs", 66 + "cid": "bafyreicxx5i36v5dbqk5vvfzhnta5gajrvc544mnepux4wksrkid7mw3q4" 67 + }, 68 + "app.bsky.notification.defs": { 69 + "uri": "at://did:plc:4v4y5r3lwsbtmsxhile2ljac/com.atproto.lexicon.schema/app.bsky.notification.defs", 70 + "cid": "bafyreickbpnayydlyfakliahgf23jjuesllh6qrslyofk5yz5xizjavhui" 71 + }, 72 + "app.bsky.richtext.facet": { 73 + "uri": "at://did:plc:4v4y5r3lwsbtmsxhile2ljac/com.atproto.lexicon.schema/app.bsky.richtext.facet", 74 + "cid": "bafyreidg56eo7zynf6ihz4xb627vwoqf5idnevkmwp7sxc4tijg6xngbu4" 75 + }, 76 + "com.atproto.label.defs": { 77 + "uri": "at://did:plc:6msi3pj7krzih5qxqtryxlzw/com.atproto.lexicon.schema/com.atproto.label.defs", 78 + "cid": "bafyreig4hmnb2xkecyg4aaqfhr2rrcxxb3gsr4xks4rqb7rscrycalbrji" 79 + }, 80 + "com.atproto.moderation.defs": { 81 + "uri": "at://did:plc:6msi3pj7krzih5qxqtryxlzw/com.atproto.lexicon.schema/com.atproto.moderation.defs", 82 + "cid": "bafyreideawy4rlpgces2oebk5q4kpurbonhb5qtl4pes7dvxsc5osaiksy" 83 + }, 84 + "com.atproto.repo.strongRef": { 85 + "uri": "at://did:plc:6msi3pj7krzih5qxqtryxlzw/com.atproto.lexicon.schema/com.atproto.repo.strongRef", 86 + "cid": "bafyreifrkdbnkvfjujntdaeigolnrjj3srrs53tfixjhmacclps72qlov4" 87 + }, 88 + "tools.ozone.report.defs": { 89 + "uri": "at://did:plc:33dt5kftu3jq2h5h4jjlqezt/com.atproto.lexicon.schema/tools.ozone.report.defs", 90 + "cid": "bafyreic3l2rmh2ugirt3jz372wcvy333m7t2ynlyzj2k54oshijs6lxdfu" 91 + } 92 + } 93 + }
+26
templates/svelte-ts/package.json
··· 1 + { 2 + "name": "vite-svelte-typescript-atproto", 3 + "version": "0.0.0", 4 + "private": true, 5 + "type": "module", 6 + "scripts": { 7 + "dev": "vite", 8 + "build": "vite build", 9 + "preview": "vite preview", 10 + "check": "svelte-check --tsconfig ./tsconfig.app.json && tsc -p tsconfig.node.json", 11 + "postinstall": "lex install --ci && lex install --update && lex build --out ./src/__generated__", 12 + "prebuild": "lex build --out ./src/__generated__" 13 + }, 14 + "dependencies": { 15 + "@atproto/lex": "^0.0.16" 16 + }, 17 + "devDependencies": { 18 + "@sveltejs/vite-plugin-svelte": "^6.2.1", 19 + "@tsconfig/svelte": "^5.0.6", 20 + "@types/node": "^24.10.1", 21 + "svelte": "^5.45.2", 22 + "svelte-check": "^4.3.4", 23 + "typescript": "~5.9.3", 24 + "vite": "^7.3.1" 25 + } 26 + }
+33
templates/svelte-ts/src/App.svelte
··· 1 + <script lang="ts"> 2 + import { Client, type AtIdentifierString } from "@atproto/lex"; 3 + import * as app from "./__generated__/app.js" 4 + import Profile from "./lib/Profile.svelte" 5 + 6 + const client = new Client("https://public.api.bsky.app"); 7 + 8 + const people: AtIdentifierString[] = [ 9 + "pfrazee.com", 10 + "rude1.blacksky.team", 11 + "jcsalterego.bsky.social", 12 + "byarielm.fyi", 13 + "vicwalker.dev.br", 14 + "nonbinary.computer", 15 + ]; 16 + 17 + async function getProfile() { 18 + const randomPerson = Math.floor(Math.random() * people.length); 19 + const response = client.call(app.bsky.actor.getProfile, { 20 + actor: people[randomPerson], 21 + }); 22 + return response; 23 + } 24 + const response = getProfile(); 25 + </script> 26 + 27 + <main> 28 + {#await response} 29 + <p>fetching profile...</p> 30 + {:then profile} 31 + <Profile {...profile}/> 32 + {/await} 33 + </main>
+96
templates/svelte-ts/src/app.css
··· 1 + @import "https://unpkg.com/open-props/colors.min.css"; 2 + @import "https://unpkg.com/open-props/shadows.min.css"; 3 + 4 + @layer reset { 5 + *, 6 + *::before, 7 + *::after { 8 + box-sizing: border-box; 9 + } 10 + 11 + * { 12 + margin: 0; 13 + padding: 0; 14 + } 15 + 16 + html { 17 + -webkit-font-smoothing: antialiased; 18 + text-rendering: optimizespeed; 19 + text-size-adjust: none; 20 + tab-size: 2; 21 + scrollbar-gutter: stable; 22 + interpolate-size: allow-keywords; 23 + line-height: 1.5; 24 + height: 100%; 25 + background-color: #f8f9fa; 26 + } 27 + 28 + body { 29 + margin: 0; 30 + /* https://systemfontstack.com */ 31 + font-family: 32 + Menlo, 33 + Consolas, 34 + Monaco, 35 + Adwaita Mono, 36 + Liberation Mono, 37 + Lucida Console, 38 + monospace; 39 + font-synthesis: none; 40 + 41 + height: 100%; 42 + display: flex; 43 + justify-content: center; 44 + align-items: center; 45 + } 46 + 47 + ul[role="list"], 48 + ol[role="list"] { 49 + list-style: none; 50 + padding: 0; 51 + } 52 + 53 + ::marker { 54 + line-height: 0; 55 + } 56 + 57 + :focus-visible { 58 + outline-offset: 2px; 59 + } 60 + 61 + @media (prefers-reduced-motion: no-preference) { 62 + html:focus-within { 63 + scroll-behavior: smooth; 64 + } 65 + } 66 + 67 + a { 68 + color: inherit; 69 + text-underline-offset: 0.2ex; 70 + } 71 + 72 + h1, 73 + h2, 74 + h3, 75 + h4 { 76 + text-wrap: balance; 77 + } 78 + 79 + a[href] { 80 + -webkit-tap-highlight-color: transparent; 81 + } 82 + 83 + p, 84 + h1, 85 + h2, 86 + h3, 87 + h4, 88 + h5, 89 + h6 { 90 + overflow-wrap: break-word; 91 + } 92 + 93 + p { 94 + text-wrap: pretty; 95 + } 96 + }
+83
templates/svelte-ts/src/lib/Profile.svelte
··· 1 + <script lang="ts"> 2 + import type { ProfileViewDetailed } from "../__generated__/app/bsky/actor/defs.defs"; 3 + let { avatar, followersCount, followsCount, postsCount, description, displayName, handle }: ProfileViewDetailed = $props() 4 + 5 + function formatStat(stat?: number) { 6 + if (!stat || typeof stat !== "number") { 7 + return; 8 + } 9 + 10 + return new Intl.NumberFormat(window.navigator.language).format(stat); 11 + } 12 + </script> 13 + 14 + <article class="profile"> 15 + <header class="header"> 16 + <img 17 + src={avatar} 18 + alt="" 19 + height={100} 20 + width={100} 21 + class="avatar" 22 + /> 23 + <div> 24 + <h2>{displayName}</h2> 25 + <p>{handle}</p> 26 + </div> 27 + </header> 28 + <section class="stats"> 29 + <p> 30 + <span class="number"> 31 + {formatStat(followersCount)} 32 + </span>{" "} 33 + followers 34 + </p> 35 + <p> 36 + <span class="number"> 37 + {formatStat(followsCount)} 38 + </span>{" "} 39 + following 40 + </p> 41 + <p> 42 + <span class="number"> 43 + {formatStat(postsCount)} 44 + </span>{" "} 45 + posts 46 + </p> 47 + </section> 48 + <footer>{description}</footer> 49 + </article> 50 + 51 + <style> 52 + .avatar { 53 + border-radius: 100%; 54 + border: 1px solid grey; 55 + } 56 + 57 + .header { 58 + display: flex; 59 + align-items: center; 60 + gap: 1rem; 61 + } 62 + 63 + .number { 64 + font-weight: bold; 65 + } 66 + 67 + .stats { 68 + display: flex; 69 + gap: 0.5rem; 70 + } 71 + 72 + .profile { 73 + width: 80ch; 74 + display: flex; 75 + flex-direction: column; 76 + gap: 1rem; 77 + background-color: #ffffff; 78 + border-radius: 0.5rem; 79 + padding: 2rem; 80 + box-shadow: var(--shadow-1); 81 + border: 1px solid var(--stone-0); 82 + } 83 + </style>
+9
templates/svelte-ts/src/main.ts
··· 1 + import { mount } from 'svelte' 2 + import './app.css' 3 + import App from './App.svelte' 4 + 5 + const app = mount(App, { 6 + target: document.getElementById('app')!, 7 + }) 8 + 9 + export default app
+13
templates/svelte-ts/svelte.config.js
··· 1 + import { vitePreprocess } from "@sveltejs/vite-plugin-svelte"; 2 + 3 + /** @type {import("@sveltejs/vite-plugin-svelte").SvelteConfig} */ 4 + export default { 5 + // Consult https://svelte.dev/docs#compile-time-svelte-preprocess 6 + // for more information about preprocessors 7 + preprocess: vitePreprocess(), 8 + compilerOptions: { 9 + experimental: { 10 + async: true, 11 + }, 12 + }, 13 + };