···33</script>
4455<script lang="ts">
66- import type { AppBskyEmbedVideo } from '@atcute/client/lexicons';
66+ import type { AppBskyEmbedVideo } from '@atcute/bluesky';
7788 import { dev } from '$app/environment';
99 import { base } from '$app/paths';
···11<script lang="ts">
22 // This is meant to be used inside quote embeds, so it's non-standalone.
3344- import type { AppBskyEmbedVideo } from '@atcute/client/lexicons';
44+ import type { AppBskyEmbedVideo } from '@atcute/bluesky';
5566 import { replaceVideoCdnUrl } from '$lib/utils/bluesky/videos';
77
+3-3
src/lib/components/feeds/feed-item.svelte
···11<script lang="ts">
22- import type { AppBskyFeedDefs } from '@atcute/client/lexicons';
22+ import type { AppBskyFeedDefs } from '@atcute/bluesky';
3344 import { base } from '$app/paths';
5566- import { parseAddressedAtUri } from '$lib/types/at-uri';
66+ import { assertCanonicalResourceUri } from '$lib/types/at-uri';
77 import { normalizeDisplayName } from '$lib/utils/bluesky/display';
88 import { trimRichText } from '$lib/utils/bluesky/richtext';
99 import { formatLongNumber } from '$lib/utils/intl/number';
···19192020 const creator = $derived(feed.creator);
21212222- const href = $derived(`${base}/${creator.did}/feeds/${parseAddressedAtUri(feed.uri).rkey}`);
2222+ const href = $derived(`${base}/${creator.did}/feeds/${assertCanonicalResourceUri(feed.uri).rkey}`);
2323</script>
24242525<div class="feed-item">
+3-3
src/lib/components/lists/list-item.svelte
···11<script lang="ts">
22- import type { AppBskyGraphDefs } from '@atcute/client/lexicons';
22+ import type { AppBskyGraphDefs } from '@atcute/bluesky';
3344 import { base } from '$app/paths';
5566- import { parseAddressedAtUri } from '$lib/types/at-uri';
66+ import { assertCanonicalResourceUri } from '$lib/types/at-uri';
77 import { normalizeDisplayName } from '$lib/utils/bluesky/display';
88 import { purposeToLabel } from '$lib/utils/bluesky/lists';
99 import { trimRichText } from '$lib/utils/bluesky/richtext';
···19192020 const creator = $derived(list.creator);
21212222- const href = $derived(`${base}/${creator.did}/lists/${parseAddressedAtUri(list.uri).rkey}`);
2222+ const href = $derived(`${base}/${creator.did}/lists/${assertCanonicalResourceUri(list.uri).rkey}`);
2323</script>
24242525<div class="list-item">
+1-1
src/lib/components/profiles/profile-item.svelte
···11<script lang="ts">
22- import type { AppBskyActorDefs } from '@atcute/client/lexicons';
22+ import type { AppBskyActorDefs } from '@atcute/bluesky';
3344 import { base } from '$app/paths';
55
···11<script lang="ts">
22- import type { AppBskyGraphDefs, AppBskyGraphStarterpack } from '@atcute/client/lexicons';
22+ import type { AppBskyGraphDefs, AppBskyGraphStarterpack } from '@atcute/bluesky';
3344 import { base } from '$app/paths';
5566- import { parseAddressedAtUri } from '$lib/types/at-uri';
66+ import { assertCanonicalResourceUri } from '$lib/types/at-uri';
77 import { normalizeDisplayName } from '$lib/utils/bluesky/display';
88 import { trimRichText } from '$lib/utils/bluesky/richtext';
99 import { truncateMiddle } from '$lib/utils/strings';
···18181919 const creator = $derived(pack.creator);
20202121- const record = $derived(pack.record as AppBskyGraphStarterpack.Record);
2222- const href = $derived(`${base}/${creator.did}/packs/${parseAddressedAtUri(pack.uri).rkey}`);
2121+ const record = $derived(pack.record as AppBskyGraphStarterpack.Main);
2222+ const href = $derived(`${base}/${creator.did}/packs/${assertCanonicalResourceUri(pack.uri).rkey}`);
2323</script>
24242525<div class="starterpack-item">
+4-4
src/lib/components/timeline/post-feed-item.svelte
···11<script lang="ts">
22- import type { AppBskyFeedPost } from '@atcute/client/lexicons';
22+ import type { AppBskyFeedPost } from '@atcute/bluesky';
3344 import { base } from '$app/paths';
5566 import type { UiTimelineItem } from '$lib/models/timeline';
77 import { findLabel, FlagsBlurContent, FlagsBlurMedia } from '$lib/moderation';
88- import { parseAddressedAtUri } from '$lib/types/at-uri';
88+ import { assertCanonicalResourceUri } from '$lib/types/at-uri';
99 import { normalizeDisplayName } from '$lib/utils/bluesky/display';
10101111 import ArrowsRepeatRightLeftOutlined from '$lib/components/central-icons/arrows-repeat-right-left-outlined.svelte';
···2929 const author = $derived(post.author);
3030 const authorUrl = $derived(`${base}/${author.did}`);
31313232- const record = $derived(post.record as AppBskyFeedPost.Record);
3333- const postUrl = $derived(`${base}/${author.did}/${parseAddressedAtUri(post.uri).rkey}#main`);
3232+ const record = $derived(post.record as AppBskyFeedPost.Main);
3333+ const postUrl = $derived(`${base}/${author.did}/${assertCanonicalResourceUri(post.uri).rkey}#main`);
34343535 const isAviBlurred = $derived(!!findLabel(author.labels, author.did, FlagsBlurMedia));
3636 const blur = $derived(findLabel(post.labels, author.did, FlagsBlurContent));
+2-2
src/lib/components/timeline/post-meta.svelte
···11<script lang="ts">
22- import type { AppBskyFeedDefs, AppBskyFeedPost } from '@atcute/client/lexicons';
22+ import type { AppBskyFeedDefs, AppBskyFeedPost } from '@atcute/bluesky';
3344 import { normalizeDisplayName } from '$lib/utils/bluesky/display';
55···1717 const author = $derived(post.author);
1818 const authorName = $derived(normalizeDisplayName(author.displayName ?? ''));
19192020- const createdAt = $derived((post.record as AppBskyFeedPost.Record).createdAt);
2020+ const createdAt = $derived((post.record as AppBskyFeedPost.Main).createdAt);
2121</script>
22222323<div class={['post-meta', gutterBottom && 'has-bottom-gutter']}>
+1-1
src/lib/components/timeline/post-metrics.svelte
···11<script lang="ts">
22 import type { Component } from 'svelte';
3344- import type { AppBskyFeedDefs } from '@atcute/client/lexicons';
44+ import type { AppBskyFeedDefs } from '@atcute/bluesky';
5566 import { formatCompactNumber, formatLongNumber } from '$lib/utils/intl/number';
77
+2-2
src/lib/constants.ts
···11-import type { At } from '@atcute/client/lexicons';
11+import type { CanonicalResourceUri } from '@atcute/lexicons';
2233// Popular feeds that requires authentication to view
44-export const AUTHENTICATED_FEEDS: At.CanonicalResourceUri[] = [
44+export const AUTHENTICATED_FEEDS: CanonicalResourceUri[] = [
55 // "Popular With Friends" by @bsky.app
66 `at://did:plc:z72i7hdynmk6r22z27h6tvur/app.bsky.feed.generator/with-friends`,
77 // "Mutuals" by @skyfeed.xyz
+1-1
src/lib/models/timeline.ts
···11-import type { AppBskyFeedDefs } from '@atcute/client/lexicons';
11+import type { AppBskyFeedDefs } from '@atcute/bluesky';
22import { mapDefined } from '@mary/array-fns';
3344export type TimelineItem = AppBskyFeedDefs.FeedViewPost;
+3-2
src/lib/moderation.ts
···11-import type { At, ComAtprotoLabelDefs } from '@atcute/client/lexicons';
11+import type { ComAtprotoLabelDefs } from '@atcute/atproto';
22+import type { Did } from '@atcute/lexicons';
2334export const FlagsNone = 0;
45···123124124125export const findLabel = (
125126 labels: Label[] | undefined,
126126- authorDid: At.Did,
127127+ authorDid: Did,
127128 mask: number,
128129): LabelDefinition | undefined => {
129130 if (labels?.length) {
+2-2
src/lib/queries/constellation.ts
···11import { error } from '@sveltejs/kit';
2233-import type { Records } from '@atcute/client/lexicons';
33+import type { Did } from '@atcute/lexicons';
44+import type { Records } from '@atcute/lexicons/ambient';
4556import * as v from '@badrap/valita';
6778import { PUBLIC_APP_USER_AGENT, PUBLIC_CONSTELLATION_URL } from '$env/static/public';
8999-import type { Did } from '$lib/types/identity';
1010import { didString, integer, nsidString, recordKeyString } from '$lib/types/valita';
11111212const linkResponse = v.object({
+9-10
src/lib/queries/handle.ts
···11-import type { XRPC } from '@atcute/client';
22-import type { At } from '@atcute/client/lexicons';
11+import { ok, type Client } from '@atcute/client';
22+import type { Did, Handle } from '@atcute/lexicons';
3344-import type { Did } from '$lib/types/identity';
44+export const resolveHandle = async ({ client, handle }: { client: Client; handle: Handle }): Promise<Did> => {
55+ const data = await ok(
66+ client.get('com.atproto.identity.resolveHandle', {
77+ params: { handle },
88+ }),
99+ );
51066-export const resolveHandle = async ({ rpc, handle }: { rpc: XRPC; handle: At.Handle }): Promise<Did> => {
77- const { data } = await rpc.get('com.atproto.identity.resolveHandle', {
88- params: { handle },
99- });
1010-1111- // because my types are stricter than atcute's
1212- return data.did as Did;
1111+ return data.did;
1312};
+23-11
src/lib/queries/post.ts
···11-import { XRPC, XRPCError } from '@atcute/client';
22-import type { AppBskyFeedDefs, At } from '@atcute/client/lexicons';
11+import type { AppBskyFeedDefs } from '@atcute/bluesky';
22+import { type Client, ClientResponseError, ok } from '@atcute/client';
33+import type { ResourceUri } from '@atcute/lexicons';
3445export interface GetPostReturn {
56 post: AppBskyFeedDefs.PostView;
67 threadgate?: AppBskyFeedDefs.ThreadgateView;
78}
8999-export const getPost = async ({ rpc, uri }: { rpc: XRPC; uri: At.ResourceUri }): Promise<GetPostReturn> => {
1010- const { data } = await rpc.get('app.bsky.feed.getPostThread', {
1111- params: {
1212- uri: uri,
1313- depth: 0,
1414- parentHeight: 0,
1515- },
1616- });
1010+export const getPost = async ({
1111+ client,
1212+ uri,
1313+}: {
1414+ client: Client;
1515+ uri: ResourceUri;
1616+}): Promise<GetPostReturn> => {
1717+ const data = await ok(
1818+ client.get('app.bsky.feed.getPostThread', {
1919+ params: {
2020+ uri: uri,
2121+ depth: 0,
2222+ parentHeight: 0,
2323+ },
2424+ }),
2525+ );
17261827 const { thread, threadgate } = data;
1928 switch (thread.$type) {
2029 case 'app.bsky.feed.defs#notFoundPost':
2130 case 'app.bsky.feed.defs#blockedPost': {
2222- throw new XRPCError(400, { kind: 'NotFound', description: 'Post not found' });
3131+ throw new ClientResponseError({
3232+ status: 400,
3333+ data: { error: 'NotFound', message: `Post not found` },
3434+ });
2335 }
2436 }
2537
···11-import * as v from '@badrap/valita';
11+import { isDid, isNsid, isRecordKey } from '@atcute/lexicons/syntax';
2233-import { isDid } from './identity';
44-import { isNsid } from './nsid';
55-import { isRecordKey } from './rkey';
33+import * as v from '@badrap/valita';
6475export const didString = v.string().assert(isDid);
86
+11-45
src/lib/utils/bluesky/embeds.ts
···11-import type { AppBskyEmbedRecordWithMedia, AppBskyFeedDefs } from '@atcute/client/lexicons';
22-33-import { parseAddressedAtUri } from '$lib/types/at-uri';
44-55-export interface Embed {
66- media?: AppBskyEmbedRecordWithMedia.View['media'];
77- record?: AppBskyEmbedRecordWithMedia.View['record'];
88-}
99-1010-export type MediaEmbed = NonNullable<Embed['media']>;
1111-export type RecordEmbed = NonNullable<Embed['record']>;
1212-1313-export const unwrapMediaEmbedView = (embed: AppBskyFeedDefs.PostView['embed']): Embed['media'] => {
1414- switch (embed?.$type) {
1515- case 'app.bsky.embed.recordWithMedia#view':
1616- return embed.media;
1717- case 'app.bsky.embed.record#view':
1818- return;
1919- }
2020-2121- return embed;
2222-};
11+import type { RecordEmbed } from '@atcute/bluesky';
22+import { parseCanonicalResourceUri } from '@atcute/lexicons';
2332424-export const unwrapRecordEmbedView = (embed: AppBskyFeedDefs.PostView['embed']): Embed['record'] => {
44+export const getQuoteEmbed = (embed: RecordEmbed | undefined) => {
255 switch (embed?.$type) {
2626- case 'app.bsky.embed.recordWithMedia#view':
2727- return embed.record;
2828-2929- case 'app.bsky.embed.record#view':
3030- return embed;
3131- }
3232-};
3333-3434-export const unwrapEmbedView = (embed: AppBskyFeedDefs.PostView['embed']): Embed => {
3535- return {
3636- media: unwrapMediaEmbedView(embed),
3737- record: unwrapRecordEmbedView(embed),
3838- };
3939-};
4040-4141-export const getQuoteEmbedView = (embed: RecordEmbed | undefined) => {
4242- const record = embed?.record;
4343-4444- switch (record?.$type) {
456 case 'app.bsky.embed.record#viewRecord': {
4646- return record;
77+ return embed;
478 }
4894910 case 'app.bsky.embed.record#viewNotFound':
5011 case 'app.bsky.embed.record#viewDetached':
5112 case 'app.bsky.embed.record#viewBlocked': {
5252- const uri = parseAddressedAtUri(record.uri);
1313+ const result = parseCanonicalResourceUri(embed.uri);
1414+ if (!result.ok) {
1515+ return;
1616+ }
1717+1818+ const uri = result.value;
5319 if (uri.collection === 'app.bsky.feed.post') {
5454- return record;
2020+ return embed;
5521 }
5622 }
5723 }
+1-1
src/lib/utils/bluesky/lists.ts
···11-import type { AppBskyGraphDefs } from '@atcute/client/lexicons';
11+import type { AppBskyGraphDefs } from '@atcute/bluesky';
2233export const purposeToLabel = (purpose: AppBskyGraphDefs.ListView['purpose']): string => {
44 switch (purpose) {
+1-1
src/params/did.ts
···11import type { ParamMatcher } from '@sveltejs/kit';
2233-import { isDid } from '$lib/types/identity';
33+import { isDid } from '@atcute/lexicons/syntax';
4455export const match = isDid satisfies ParamMatcher;
+2-4
src/params/didOrHandle.ts
···11import type { ParamMatcher } from '@sveltejs/kit';
2233-import { isDid, isHandle, type Did, type Handle } from '$lib/types/identity';
33+import { isActorIdentifier } from '@atcute/lexicons/syntax';
4455-export const match = ((param: string): param is Did | Handle => {
66- return isDid(param) || isHandle(param);
77-}) satisfies ParamMatcher;
55+export const match = isActorIdentifier satisfies ParamMatcher;
+1-1
src/params/handle.ts
···11import type { ParamMatcher } from '@sveltejs/kit';
2233-import { isHandle } from '$lib/types/identity';
33+import { isHandle } from '@atcute/lexicons/syntax';
4455export const match = isHandle satisfies ParamMatcher;
+1-1
src/params/rkey.ts
···11import type { ParamMatcher } from '@sveltejs/kit';
2233-import { isRecordKey } from '$lib/types/rkey';
33+import { isRecordKey } from '@atcute/lexicons/syntax';
4455export const match = isRecordKey satisfies ParamMatcher;
+1-1
src/params/tid.ts
···11import type { ParamMatcher } from '@sveltejs/kit';
2233-import { isTid } from '$lib/types/rkey';
33+import { isTid } from '@atcute/lexicons/syntax';
4455export const match = isTid satisfies ParamMatcher;
···11<script lang="ts">
22- import type { AppBskyActorDefs } from '@atcute/client/lexicons';
22+ import type { AppBskyActorDefs } from '@atcute/bluesky';
3344 import { base } from '$app/paths';
55