···1+/**
2+ * GENERATED CODE - DO NOT MODIFY
3+ */
4+import { ValidationResult, BlobRef } from '@atproto/lexicon'
5+import { lexicons } from '../../../../lexicons'
6+import { isObj, hasProp } from '../../../../util'
7+import { CID } from 'multiformats/cid'
8+9+/** Annotation of a sub-string within rich text. */
10+export interface Main {
11+ index: ByteSlice
12+ features: (Mention | Link | Tag | { $type: string; [k: string]: unknown })[]
13+ [k: string]: unknown
14+}
15+16+export function isMain(v: unknown): v is Main {
17+ return (
18+ isObj(v) &&
19+ hasProp(v, '$type') &&
20+ (v.$type === 'app.bsky.richtext.facet#main' ||
21+ v.$type === 'app.bsky.richtext.facet')
22+ )
23+}
24+25+export function validateMain(v: unknown): ValidationResult {
26+ return lexicons.validate('app.bsky.richtext.facet#main', v)
27+}
28+29+/** Facet feature for mention of another account. The text is usually a handle, including a '@' prefix, but the facet reference is a DID. */
30+export interface Mention {
31+ did: string
32+ [k: string]: unknown
33+}
34+35+export function isMention(v: unknown): v is Mention {
36+ return (
37+ isObj(v) &&
38+ hasProp(v, '$type') &&
39+ v.$type === 'app.bsky.richtext.facet#mention'
40+ )
41+}
42+43+export function validateMention(v: unknown): ValidationResult {
44+ return lexicons.validate('app.bsky.richtext.facet#mention', v)
45+}
46+47+/** Facet feature for a URL. The text URL may have been simplified or truncated, but the facet reference should be a complete URL. */
48+export interface Link {
49+ uri: string
50+ [k: string]: unknown
51+}
52+53+export function isLink(v: unknown): v is Link {
54+ return (
55+ isObj(v) &&
56+ hasProp(v, '$type') &&
57+ v.$type === 'app.bsky.richtext.facet#link'
58+ )
59+}
60+61+export function validateLink(v: unknown): ValidationResult {
62+ return lexicons.validate('app.bsky.richtext.facet#link', v)
63+}
64+65+/** 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'). */
66+export interface Tag {
67+ tag: string
68+ [k: string]: unknown
69+}
70+71+export function isTag(v: unknown): v is Tag {
72+ return (
73+ isObj(v) && hasProp(v, '$type') && v.$type === 'app.bsky.richtext.facet#tag'
74+ )
75+}
76+77+export function validateTag(v: unknown): ValidationResult {
78+ return lexicons.validate('app.bsky.richtext.facet#tag', v)
79+}
80+81+/** 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. */
82+export interface ByteSlice {
83+ byteStart: number
84+ byteEnd: number
85+ [k: string]: unknown
86+}
87+88+export function isByteSlice(v: unknown): v is ByteSlice {
89+ return (
90+ isObj(v) &&
91+ hasProp(v, '$type') &&
92+ v.$type === 'app.bsky.richtext.facet#byteSlice'
93+ )
94+}
95+96+export function validateByteSlice(v: unknown): ValidationResult {
97+ return lexicons.validate('app.bsky.richtext.facet#byteSlice', v)
98+}
···1+/**
2+ * GENERATED CODE - DO NOT MODIFY
3+ */
4+import { ValidationResult, BlobRef } from '@atproto/lexicon'
5+import { lexicons } from '../../../../lexicons'
6+import { isObj, hasProp } from '../../../../util'
7+import { CID } from 'multiformats/cid'
8+9+export interface Record {
10+ /** The name of the track */
11+ trackName: string
12+ /** The Musicbrainz ID of the track */
13+ trackMbId?: string
14+ /** The Musicbrainz recording ID of the track */
15+ recordingMbId?: string
16+ /** The length of the track in seconds */
17+ duration?: number
18+ /** The name of the artist */
19+ artistName: string
20+ /** Array of Musicbrainz artist IDs */
21+ artistMbIds?: string[]
22+ /** The name of the release/album */
23+ releaseName?: string
24+ /** The Musicbrainz release ID */
25+ releaseMbId?: string
26+ /** The ISRC code associated with the recording */
27+ isrc?: string
28+ /** The URL associated with this track */
29+ originUrl?: string
30+ /** The base domain of the music service. e.g. music.apple.com, tidal.com, spotify.com. */
31+ musicServiceBaseDomain?: string
32+ /** A user-agent style string specifying the user agent. e.g. tealtracker/0.0.1b */
33+ submissionClientAgent?: string
34+ /** The unix timestamp of when the track was played */
35+ playedTime?: string
36+ [k: string]: unknown
37+}
38+39+export function isRecord(v: unknown): v is Record {
40+ return (
41+ isObj(v) &&
42+ hasProp(v, '$type') &&
43+ (v.$type === 'fm.teal.alpha.play#main' || v.$type === 'fm.teal.alpha.play')
44+ )
45+}
46+47+export function validateRecord(v: unknown): ValidationResult {
48+ return lexicons.validate('fm.teal.alpha.play#main', v)
49+}
+26
lexicons/server/types/xyz/statusphere/status.ts
···00000000000000000000000000
···1+/**
2+ * GENERATED CODE - DO NOT MODIFY
3+ */
4+import { ValidationResult, BlobRef } from '@atproto/lexicon'
5+import { lexicons } from '../../../lexicons'
6+import { isObj, hasProp } from '../../../util'
7+import { CID } from 'multiformats/cid'
8+9+export interface Record {
10+ status: string
11+ createdAt: string
12+ [k: string]: unknown
13+}
14+15+export function isRecord(v: unknown): v is Record {
16+ return (
17+ isObj(v) &&
18+ hasProp(v, '$type') &&
19+ (v.$type === 'xyz.statusphere.status#main' ||
20+ v.$type === 'xyz.statusphere.status')
21+ )
22+}
23+24+export function validateRecord(v: unknown): ValidationResult {
25+ return lexicons.validate('xyz.statusphere.status#main', v)
26+}
+13
lexicons/server/util.ts
···0000000000000
···1+/**
2+ * GENERATED CODE - DO NOT MODIFY
3+ */
4+export function isObj(v: unknown): v is Record<string, unknown> {
5+ return typeof v === 'object' && v !== null
6+}
7+8+export function hasProp<K extends PropertyKey>(
9+ data: object,
10+ prop: K,
11+): data is Record<K, unknown> {
12+ return prop in data
13+}
···1+{
2+ "lexicon": 1,
3+ "id": "app.bsky.richtext.facet",
4+ "defs": {
5+ "main": {
6+ "type": "object",
7+ "description": "Annotation of a sub-string within rich text.",
8+ "required": ["index", "features"],
9+ "properties": {
10+ "index": { "type": "ref", "ref": "#byteSlice" },
11+ "features": {
12+ "type": "array",
13+ "items": { "type": "union", "refs": ["#mention", "#link", "#tag"] }
14+ }
15+ }
16+ },
17+ "mention": {
18+ "type": "object",
19+ "description": "Facet feature for mention of another account. The text is usually a handle, including a '@' prefix, but the facet reference is a DID.",
20+ "required": ["did"],
21+ "properties": {
22+ "did": { "type": "string", "format": "did" }
23+ }
24+ },
25+ "link": {
26+ "type": "object",
27+ "description": "Facet feature for a URL. The text URL may have been simplified or truncated, but the facet reference should be a complete URL.",
28+ "required": ["uri"],
29+ "properties": {
30+ "uri": { "type": "string", "format": "uri" }
31+ }
32+ },
33+ "tag": {
34+ "type": "object",
35+ "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').",
36+ "required": ["tag"],
37+ "properties": {
38+ "tag": { "type": "string", "maxLength": 640, "maxGraphemes": 64 }
39+ }
40+ },
41+ "byteSlice": {
42+ "type": "object",
43+ "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.",
44+ "required": ["byteStart", "byteEnd"],
45+ "properties": {
46+ "byteStart": { "type": "integer", "minimum": 0 },
47+ "byteEnd": { "type": "integer", "minimum": 0 }
48+ }
49+ }
50+ }
51+}
···1+{
2+ "lexicon": 1,
3+ "id": "fm.teal.alpha.actor.profile",
4+ "defs": {
5+ "main": {
6+ "type": "record",
7+ "description": "This lexicon is in a not officially released state. It is subject to change. | A declaration of a teal.fm account profile.",
8+ "key": "literal:self",
9+ "record": {
10+ "type": "object",
11+ "properties": {
12+ "displayName": {
13+ "type": "string",
14+ "maxGraphemes": 64,
15+ "maxLength": 640
16+ },
17+ "description": {
18+ "type": "string",
19+ "description": "Free-form profile description text.",
20+ "maxGraphemes": 256,
21+ "maxLength": 2560
22+ },
23+ "descriptionFacets": {
24+ "type": "array",
25+ "description": "Annotations of text in the profile description (mentions, URLs, hashtags, etc).",
26+ "items": { "type": "ref", "ref": "app.bsky.richtext.facet" }
27+ },
28+ "featuredItem": {
29+ "type": "ref",
30+ "description": "The user's most recent item featured on their profile.",
31+ "ref": "#featuredItem"
32+ },
33+ "avatar": {
34+ "type": "blob",
35+ "description": "Small image to be displayed next to posts from account. AKA, 'profile picture'",
36+ "accept": ["image/png", "image/jpeg"],
37+ "maxSize": 1000000
38+ },
39+ "banner": {
40+ "type": "blob",
41+ "description": "Larger horizontal image to display behind profile view.",
42+ "accept": ["image/png", "image/jpeg"],
43+ "maxSize": 1000000
44+ },
45+ "createdAt": { "type": "string", "format": "datetime" }
46+ }
47+ }
48+ },
49+ "featuredItem": {
50+ "type": "object",
51+ "required": ["mbid", "type"],
52+ "properties": {
53+ "mbid": {
54+ "type": "string",
55+ "description": "The Musicbrainz ID of the item"
56+ },
57+ "type": {
58+ "type": "string",
59+ "description": "The type of the item. Must be a valid Musicbrainz type, e.g. album, track, recording, etc."
60+ }
61+ }
62+ }
63+ }
64+}
+23
lexicons/src/fm.teal.alpha.actor.status.json
···00000000000000000000000
···1+{
2+ "lexicon": 1,
3+ "id": "fm.teal.alpha.actor.status",
4+ "defs": {
5+ "main": {
6+ "type": "record",
7+ "description": "This lexicon is in a not officially released state. It is subject to change. | A declaration of the status of the actor. Only one can be shown at a time. If there are multiple, the latest record should be picked and earlier records should be deleted or tombstoned.",
8+ "key": "literal:self",
9+ "record": {
10+ "type": "object",
11+ "required": ["time", "item"],
12+ "properties": {
13+ "time": {
14+ "type": "string",
15+ "format": "datetime",
16+ "description": "The unix timestamp of when the item was recorded"
17+ },
18+ "item": { "type": "union", "refs": ["fm.teal.alpha.play#record"] }
19+ }
20+ }
21+ }
22+ }
23+}
···1+{
2+ "lexicon": 1,
3+ "id": "fm.teal.alpha.play",
4+ "description": "This lexicon is in a not officially released state. It is subject to change. | A declaration of a teal.fm play. Plays are submitted as a result of a user listening to a track. Plays should be marked as tracked when a user has listened to the entire track if it's under 2 minutes long, or half of the track's duration up to 4 minutes, whichever is longest.",
5+ "defs": {
6+ "main": {
7+ "type": "record",
8+ "key": "tid",
9+ "record": {
10+ "type": "object",
11+ "required": ["trackName", "artistName"],
12+ "properties": {
13+ "trackName": {
14+ "type": "string",
15+ "minLength": 1,
16+ "maxLength": 256,
17+ "maxGraphemes": 2560,
18+ "description": "The name of the track"
19+ },
20+ "trackMbId": {
21+ "type": "string",
22+23+ "description": "The Musicbrainz ID of the track"
24+ },
25+ "recordingMbId": {
26+ "type": "string",
27+ "description": "The Musicbrainz recording ID of the track"
28+ },
29+ "duration": {
30+ "type": "integer",
31+ "description": "The length of the track in seconds"
32+ },
33+ "artistName": {
34+ "type": "string",
35+ "minLength": 1,
36+ "maxLength": 256,
37+ "maxGraphemes": 2560,
38+ "description": "The name of the artist"
39+ },
40+ "artistMbIds": {
41+ "type": "array",
42+ "items": {
43+ "type": "string"
44+ },
45+ "description": "Array of Musicbrainz artist IDs"
46+ },
47+ "releaseName": {
48+ "type": "string",
49+ "maxLength": 256,
50+ "maxGraphemes": 2560,
51+ "description": "The name of the release/album"
52+ },
53+ "releaseMbId": {
54+ "type": "string",
55+ "description": "The Musicbrainz release ID"
56+ },
57+ "isrc": {
58+ "type": "string",
59+ "description": "The ISRC code associated with the recording"
60+ },
61+ "originUrl": {
62+ "type": "string",
63+ "description": "The URL associated with this track"
64+ },
65+ "musicServiceBaseDomain": {
66+ "type": "string",
67+ "description": "The base domain of the music service. e.g. music.apple.com, tidal.com, spotify.com."
68+ },
69+ "submissionClientAgent": {
70+ "type": "string",
71+ "maxLength": 256,
72+ "maxGraphemes": 2560,
73+ "description": "A user-agent style string specifying the user agent. e.g. tealtracker/0.0.1b"
74+ },
75+ "playedTime": {
76+ "type": "string",
77+ "format": "datetime",
78+ "description": "The unix timestamp of when the track was played"
79+ }
80+ }
81+ }
82+ }
83+ }
84+}