From a6b980bc47ec4f4a4a37492ecda82094e20457ce Mon Sep 17 00:00:00 2001 From: Florian <45694132+flo-bit@users.noreply.github.com> Date: Sat, 15 Aug 2026 07:42:55 +0200 Subject: [PATCH] commit --- .prettierignore | 3 + README.md | 4 + api/.gitignore | 2 + api/README.md | 59 ++ api/lex.config.js | 34 + .../custom/social/popfeed/actor/profile.json | 72 ++ .../custom/social/popfeed/feed/comment.json | 59 ++ .../custom/social/popfeed/feed/like.json | 40 + .../custom/social/popfeed/feed/list.json | 59 ++ .../custom/social/popfeed/feed/listItem.json | 282 +++++ .../custom/social/popfeed/feed/review.json | 212 ++++ .../custom/social/popfeed/richtext/facet.json | 89 ++ api/lexicons/generated/index.ts | 28 + .../watch/atmo/comment/getRecord.json | 110 ++ .../watch/atmo/comment/listRecords.json | 164 +++ .../generated/watch/atmo/getCursor.json | 48 + .../generated/watch/atmo/getProfile.json | 73 ++ .../generated/watch/atmo/like/getRecord.json | 110 ++ .../watch/atmo/like/listRecords.json | 159 +++ .../generated/watch/atmo/list/getRecord.json | 110 ++ .../watch/atmo/list/listRecords.json | 135 +++ .../watch/atmo/listItem/getRecord.json | 110 ++ .../watch/atmo/listItem/listRecords.json | 135 +++ .../generated/watch/atmo/notifyOfUpdate.json | 56 + .../watch/atmo/review/getRecord.json | 222 ++++ .../watch/atmo/review/listRecords.json | 281 +++++ api/lexicons/pulled/README.md | 5 + .../pulled/app/bsky/actor/profile.json | 75 ++ .../pulled/com/atproto/label/defs.json | 190 ++++ .../pulled/com/atproto/repo/strongRef.json | 25 + api/package.json | 26 + api/src/contrail.config.ts | 58 ++ api/src/lexicon-types/index.ts | 16 + .../types/app/bsky/actor/profile.ts | 98 ++ .../types/com/atproto/label/defs.ts | 184 ++++ .../types/com/atproto/repo/strongRef.ts | 14 + .../types/watch/atmo/comment/getRecord.ts | 72 ++ .../types/watch/atmo/comment/listRecords.ts | 98 ++ .../types/watch/atmo/getCursor.ts | 47 + .../types/watch/atmo/getProfile.ts | 56 + .../types/watch/atmo/like/getRecord.ts | 72 ++ .../types/watch/atmo/like/listRecords.ts | 98 ++ .../types/watch/atmo/list/getRecord.ts | 72 ++ .../types/watch/atmo/list/listRecords.ts | 98 ++ .../types/watch/atmo/listItem/getRecord.ts | 72 ++ .../types/watch/atmo/listItem/listRecords.ts | 98 ++ .../types/watch/atmo/notifyOfUpdate.ts | 56 + .../types/watch/atmo/review/getRecord.ts | 72 ++ .../types/watch/atmo/review/listRecords.ts | 114 ++ api/src/worker.ts | 10 + api/tsconfig.json | 14 + api/wrangler.jsonc | 26 + eslint.config.js | 5 +- package.json | 4 + pnpm-lock.yaml | 986 ++++++++++++++++-- pnpm-workspace.yaml | 4 + src/lib/components/AccountMenuItem.svelte | 19 +- src/lib/components/AppMenu.svelte | 2 +- src/lib/components/ItemPage.svelte | 13 +- src/lib/components/ListCard.svelte | 47 + src/lib/components/LoginDialog.svelte | 19 + src/lib/components/Review.svelte | 68 +- src/lib/components/SearchCommand.svelte | 35 +- src/lib/components/SearchMenuItem.svelte | 17 +- src/lib/contrail.config.ts | 26 - src/lib/lists.server.ts | 168 +++ src/lib/login.svelte.ts | 11 + src/lib/reviews.server.ts | 94 +- src/lib/types.ts | 15 + src/routes/+layout.svelte | 2 + src/routes/+page.svelte | 6 +- src/routes/profile/[actor]/+page.server.ts | 21 +- src/routes/profile/[actor]/+page.svelte | 16 +- .../[actor]/list/[rkey]/+page.server.ts | 46 + .../profile/[actor]/list/[rkey]/+page.svelte | 99 ++ 75 files changed, 5969 insertions(+), 176 deletions(-) create mode 100644 api/.gitignore create mode 100644 api/README.md create mode 100644 api/lex.config.js create mode 100644 api/lexicons/custom/social/popfeed/actor/profile.json create mode 100644 api/lexicons/custom/social/popfeed/feed/comment.json create mode 100644 api/lexicons/custom/social/popfeed/feed/like.json create mode 100644 api/lexicons/custom/social/popfeed/feed/list.json create mode 100644 api/lexicons/custom/social/popfeed/feed/listItem.json create mode 100644 api/lexicons/custom/social/popfeed/feed/review.json create mode 100644 api/lexicons/custom/social/popfeed/richtext/facet.json create mode 100644 api/lexicons/generated/index.ts create mode 100644 api/lexicons/generated/watch/atmo/comment/getRecord.json create mode 100644 api/lexicons/generated/watch/atmo/comment/listRecords.json create mode 100644 api/lexicons/generated/watch/atmo/getCursor.json create mode 100644 api/lexicons/generated/watch/atmo/getProfile.json create mode 100644 api/lexicons/generated/watch/atmo/like/getRecord.json create mode 100644 api/lexicons/generated/watch/atmo/like/listRecords.json create mode 100644 api/lexicons/generated/watch/atmo/list/getRecord.json create mode 100644 api/lexicons/generated/watch/atmo/list/listRecords.json create mode 100644 api/lexicons/generated/watch/atmo/listItem/getRecord.json create mode 100644 api/lexicons/generated/watch/atmo/listItem/listRecords.json create mode 100644 api/lexicons/generated/watch/atmo/notifyOfUpdate.json create mode 100644 api/lexicons/generated/watch/atmo/review/getRecord.json create mode 100644 api/lexicons/generated/watch/atmo/review/listRecords.json create mode 100644 api/lexicons/pulled/README.md create mode 100644 api/lexicons/pulled/app/bsky/actor/profile.json create mode 100644 api/lexicons/pulled/com/atproto/label/defs.json create mode 100644 api/lexicons/pulled/com/atproto/repo/strongRef.json create mode 100644 api/package.json create mode 100644 api/src/contrail.config.ts create mode 100644 api/src/lexicon-types/index.ts create mode 100644 api/src/lexicon-types/types/app/bsky/actor/profile.ts create mode 100644 api/src/lexicon-types/types/com/atproto/label/defs.ts create mode 100644 api/src/lexicon-types/types/com/atproto/repo/strongRef.ts create mode 100644 api/src/lexicon-types/types/watch/atmo/comment/getRecord.ts create mode 100644 api/src/lexicon-types/types/watch/atmo/comment/listRecords.ts create mode 100644 api/src/lexicon-types/types/watch/atmo/getCursor.ts create mode 100644 api/src/lexicon-types/types/watch/atmo/getProfile.ts create mode 100644 api/src/lexicon-types/types/watch/atmo/like/getRecord.ts create mode 100644 api/src/lexicon-types/types/watch/atmo/like/listRecords.ts create mode 100644 api/src/lexicon-types/types/watch/atmo/list/getRecord.ts create mode 100644 api/src/lexicon-types/types/watch/atmo/list/listRecords.ts create mode 100644 api/src/lexicon-types/types/watch/atmo/listItem/getRecord.ts create mode 100644 api/src/lexicon-types/types/watch/atmo/listItem/listRecords.ts create mode 100644 api/src/lexicon-types/types/watch/atmo/notifyOfUpdate.ts create mode 100644 api/src/lexicon-types/types/watch/atmo/review/getRecord.ts create mode 100644 api/src/lexicon-types/types/watch/atmo/review/listRecords.ts create mode 100644 api/src/worker.ts create mode 100644 api/tsconfig.json create mode 100644 api/wrangler.jsonc create mode 100644 src/lib/components/ListCard.svelte create mode 100644 src/lib/components/LoginDialog.svelte delete mode 100644 src/lib/contrail.config.ts create mode 100644 src/lib/lists.server.ts create mode 100644 src/lib/login.svelte.ts create mode 100644 src/routes/profile/[actor]/list/[rkey]/+page.server.ts create mode 100644 src/routes/profile/[actor]/list/[rkey]/+page.svelte diff --git a/.prettierignore b/.prettierignore index 7d74fe2..5d0d3e8 100644 --- a/.prettierignore +++ b/.prettierignore @@ -7,3 +7,6 @@ bun.lockb # Miscellaneous /static/ +/api/lex.config.js +/api/lexicons/ +/api/src/lexicon-types/ diff --git a/README.md b/README.md index 5128f5c..8fa7b62 100644 --- a/README.md +++ b/README.md @@ -29,6 +29,10 @@ npm run dev npm run dev -- --open ``` +## API Worker + +The public Contrail API is a separate Cloudflare Worker under [`api/`](api/README.md). Use `pnpm api:dev`, `pnpm api:check`, and `pnpm api:deploy` from the repository root. + ## Cloudflare KV Bind a Cloudflare KV namespace as `MEDIA_CACHE` to cache TMDB and OMDb data. Without the binding, external data is fetched normally. diff --git a/api/.gitignore b/api/.gitignore new file mode 100644 index 0000000..0dcc8a4 --- /dev/null +++ b/api/.gitignore @@ -0,0 +1,2 @@ +node_modules/ +.wrangler/ diff --git a/api/README.md b/api/README.md new file mode 100644 index 0000000..c2aeecf --- /dev/null +++ b/api/README.md @@ -0,0 +1,59 @@ +# api.atmo.watch + +Cloudflare Worker running the public Contrail service for atmo.watch. Records remain in their authors' AT Protocol repositories; the Worker indexes them in D1 and serves typed XRPC queries. + +## Public endpoints + +```text +https://api.atmo.watch/.well-known/contrail +https://api.atmo.watch/.well-known/did.json +https://api.atmo.watch/lexicons +https://api.atmo.watch/status +``` + +Collection reads, profiles, and `watch.atmo.getCursor` are anonymous. Review responses include materialized `likesCount` and `commentsCount`; likes count distinct actors, while comments count records whose `subjectUri` is the review. Like and comment endpoints can also filter by subject. `watch.atmo.notifyOfUpdate` uses AT Protocol service auth with audience `did:web:api.atmo.watch`. + +## Initial Cloudflare setup + +Create the production database: + +```bash +pnpm --dir api exec wrangler d1 create atmo-watch-contrail-g20260815 +``` + +Copy the returned database ID into `api/wrangler.jsonc`, then deploy and backfill: + +```bash +pnpm api:deploy +pnpm --dir api backfill:remote +``` + +The custom domain route requires `atmo.watch` to be available in the same Cloudflare account. + +## Development + +```bash +pnpm api:dev +pnpm --dir api backfill:dev +``` + +Wrangler stores the local D1 database under `api/.wrangler/`. + +## Updating the contract + +```bash +pnpm --dir api lexicons:all +pnpm api:check +``` + +After the production service is live, connect the web app to it from the repository root: + +```bash +rm -rf src/lib/contrail contrail.lock.json +pnpm exec contrail connect https://api.atmo.watch \ + --out src/lib/contrail/lexicons \ + --client src/lib/contrail/index.ts \ + --client-types src/lib/contrail/types/index.ts +``` + +Review and commit the regenerated client, lock, Lexicons, and types. diff --git a/api/lex.config.js b/api/lex.config.js new file mode 100644 index 0000000..a7d9c5e --- /dev/null +++ b/api/lex.config.js @@ -0,0 +1,34 @@ +// Generated by `contrail lexicons generate`. Re-run the command to update; do not edit. +import { defineLexiconConfig } from "@atcute/lex-cli"; + +export default defineLexiconConfig({ + generate: { + files: [ + "lexicons/custom/**/*.json", + "lexicons/pulled/**/*.json", + "lexicons/generated/**/*.json", + ], + outdir: "src/lexicon-types/", + }, + pull: { + outdir: "lexicons/pulled/", + clean: true, + sources: [ + { + type: "atproto", + mode: "nsids", + nsids: [ + "app.bsky.actor.profile", + "com.atproto.label.defs", + "com.atproto.repo.strongRef", + "social.popfeed.feed.comment", + "social.popfeed.feed.like", + "social.popfeed.feed.list", + "social.popfeed.feed.listItem", + "social.popfeed.feed.review", + "social.popfeed.richtext.facet" + ], + }, + ], + }, +}); diff --git a/api/lexicons/custom/social/popfeed/actor/profile.json b/api/lexicons/custom/social/popfeed/actor/profile.json new file mode 100644 index 0000000..e34eb53 --- /dev/null +++ b/api/lexicons/custom/social/popfeed/actor/profile.json @@ -0,0 +1,72 @@ +{ + "defs": { + "externalLink": { + "properties": { + "service": { + "description": "Name of the external service (e.g., 'Twitter', 'GitHub').", + "maxLength": 100, + "type": "string" + }, + "url": { + "description": "URL to the user's profile on the external service.", + "format": "uri", + "type": "string" + } + }, + "required": [ + "service", + "url" + ], + "type": "object" + }, + "main": { + "description": "A declaration of a user's profile information.", + "key": "literal:self", + "record": { + "properties": { + "banner": { + "accept": [ + "image/png", + "image/jpeg" + ], + "description": "Larger horizontal image to display behind profile view. Have not fully cut over yet so may not be shown", + "maxSize": 1000000, + "type": "blob" + }, + "bannerUrl": { + "description": "Optional URL to a banner image. DEPRECATED - soon to be ignored", + "format": "uri", + "type": "string" + }, + "createdAt": { + "format": "datetime", + "type": "string" + }, + "description": { + "description": "Free-form profile description text.", + "maxGraphemes": 256, + "maxLength": 2560, + "type": "string" + }, + "displayName": { + "maxGraphemes": 64, + "maxLength": 640, + "type": "string" + }, + "externalLinks": { + "description": "List of external links to the user's profiles on other services.", + "items": { + "ref": "#externalLink", + "type": "ref" + }, + "type": "array" + } + }, + "type": "object" + }, + "type": "record" + } + }, + "id": "social.popfeed.actor.profile", + "lexicon": 1 +} diff --git a/api/lexicons/custom/social/popfeed/feed/comment.json b/api/lexicons/custom/social/popfeed/feed/comment.json new file mode 100644 index 0000000..fd6e3ed --- /dev/null +++ b/api/lexicons/custom/social/popfeed/feed/comment.json @@ -0,0 +1,59 @@ +{ + "defs": { + "main": { + "description": "Record containing a comment on a review.", + "key": "tid", + "record": { + "properties": { + "createdAt": { + "description": "Client-declared timestamp when this comment was created.", + "format": "datetime", + "type": "string" + }, + "facets": { + "description": "Annotations of text (mentions, URLs, hashtags, etc).", + "items": { + "ref": "social.popfeed.richtext.facet", + "type": "ref" + }, + "type": "array" + }, + "rootUri": { + "description": "The URI of the root entity of the comment thread, if applicable.", + "format": "uri", + "type": "string" + }, + "subjectType": { + "description": "The type of subject being commented on, e.g., 'review'.", + "enum": [ + "review", + "list", + "post", + "comment" + ], + "type": "string" + }, + "subjectUri": { + "description": "The URI of the review being commented on.", + "format": "uri", + "type": "string" + }, + "text": { + "description": "The primary comment content.", + "maxLength": 1000, + "type": "string" + } + }, + "required": [ + "text", + "subjectUri", + "createdAt" + ], + "type": "object" + }, + "type": "record" + } + }, + "id": "social.popfeed.feed.comment", + "lexicon": 1 +} diff --git a/api/lexicons/custom/social/popfeed/feed/like.json b/api/lexicons/custom/social/popfeed/feed/like.json new file mode 100644 index 0000000..a47081e --- /dev/null +++ b/api/lexicons/custom/social/popfeed/feed/like.json @@ -0,0 +1,40 @@ +{ + "defs": { + "main": { + "description": "Record declaring a 'like' of a review.", + "key": "tid", + "record": { + "properties": { + "createdAt": { + "description": "Client-declared timestamp when this like was created.", + "format": "datetime", + "type": "string" + }, + "subjectType": { + "description": "The type of subject being liked, e.g., 'review'.", + "enum": [ + "review", + "list", + "post", + "comment" + ], + "type": "string" + }, + "subjectUri": { + "description": "The type of subject being liked, e.g., 'review'.", + "format": "uri", + "type": "string" + } + }, + "required": [ + "subjectUri", + "createdAt" + ], + "type": "object" + }, + "type": "record" + } + }, + "id": "social.popfeed.feed.like", + "lexicon": 1 +} diff --git a/api/lexicons/custom/social/popfeed/feed/list.json b/api/lexicons/custom/social/popfeed/feed/list.json new file mode 100644 index 0000000..9e19527 --- /dev/null +++ b/api/lexicons/custom/social/popfeed/feed/list.json @@ -0,0 +1,59 @@ +{ + "defs": { + "main": { + "key": "tid", + "record": { + "properties": { + "createdAt": { + "description": "The timestamp when the list was created.", + "format": "datetime", + "type": "string" + }, + "description": { + "description": "Optional description of the list.", + "maxLength": 500, + "type": "string" + }, + "itemOrder": { + "description": "An array of item uris in the order they appear in the list. Stored separately from the items themselves to allow for efficient reordering without needing to update each item record.", + "items": { + "format": "uri", + "type": "string" + }, + "type": "array" + }, + "listType": { + "description": "The type of list, e.g., 'watchlist', 'favorites', 'to-read', etc.", + "maxLength": 50, + "type": "string" + }, + "name": { + "description": "The name of the list.", + "maxLength": 100, + "type": "string" + }, + "ordered": { + "description": "Indicates whether the list is ordered or unordered.", + "type": "boolean" + }, + "tags": { + "description": "Optional array of tags for categorizing or describing the list.", + "items": { + "maxLength": 50, + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "name", + "createdAt" + ], + "type": "object" + }, + "type": "record" + } + }, + "id": "social.popfeed.feed.list", + "lexicon": 1 +} diff --git a/api/lexicons/custom/social/popfeed/feed/listItem.json b/api/lexicons/custom/social/popfeed/feed/listItem.json new file mode 100644 index 0000000..8d4908c --- /dev/null +++ b/api/lexicons/custom/social/popfeed/feed/listItem.json @@ -0,0 +1,282 @@ +{ + "defs": { + "bookProgress": { + "description": "Tracks reading/listening progress for a book or book series item.", + "properties": { + "currentChapter": { + "description": "Current chapter number (optional alternative to pages).", + "type": "integer" + }, + "currentPage": { + "description": "Current page number (if applicable).", + "type": "integer" + }, + "percent": { + "description": "Optional explicit progress percentage (0–100).", + "type": "integer" + }, + "status": { + "description": "Overall progress state.", + "enum": [ + "in_progress", + "completed", + "paused" + ], + "type": "string" + }, + "totalChapters": { + "description": "Total chapters (if known).", + "type": "integer" + }, + "totalPages": { + "description": "Total pages (if known).", + "type": "integer" + }, + "updatedAt": { + "description": "Last time progress was updated.", + "format": "datetime", + "type": "string" + } + }, + "required": [ + "status", + "updatedAt" + ], + "type": "object" + }, + "identifiers": { + "properties": { + "asin": { + "description": "Amazon Standard ID", + "type": "string" + }, + "episodeNumber": { + "description": "Episode number for TV shows or series", + "type": "integer" + }, + "igdbId": { + "description": "IGDB ID for games", + "type": "string" + }, + "imdbId": { + "description": "IMDb ID", + "type": "string" + }, + "isbn10": { + "description": "ISBN-10 for books", + "type": "string" + }, + "isbn13": { + "description": "ISBN-13 for books", + "type": "string" + }, + "mbId": { + "description": "DEPRECATED - soon to be ignored", + "type": "string" + }, + "mbReleaseId": { + "description": "MusicBrainz ID for specific releases (albums, EPs, tracks)", + "type": "string" + }, + "other": { + "description": "Other external ID", + "type": "string" + }, + "parentMbReleaseId": { + "description": "MusicBrainz ID for parent release (e.g., album for a track)", + "type": "string" + }, + "seasonNumber": { + "description": "Season number for TV shows or series", + "type": "integer" + }, + "tmdbId": { + "description": "TMDb ID for movies/TV shows", + "type": "string" + }, + "tmdbTvSeriesId": { + "description": "TMDb ID for TV series", + "type": "string" + } + }, + "type": "object" + }, + "main": { + "key": "tid", + "record": { + "properties": { + "addedAt": { + "description": "Timestamp when the creative work was added to the list.", + "format": "datetime", + "type": "string" + }, + "backdrop": { + "accept": [ + "image/*" + ], + "maxSize": 4000000, + "type": "blob" + }, + "backdropUrl": { + "description": "Backdrop image URL for the creative work. Soon to be deprecated in favor of the 'backdrop' blob field", + "format": "uri", + "type": "string" + }, + "bookProgress": { + "description": "Reading progress for books or book series (also supports audiobooks via time fields).", + "ref": "#bookProgress", + "type": "ref" + }, + "completedAt": { + "description": "Timestamp when the user finished the creative work. Most relevant for books, TV shows, and video games.", + "format": "datetime", + "type": "string" + }, + "creativeWorkType": { + "description": "The type of creative work this item represents.", + "enum": [ + "movie", + "tv_show", + "video_game", + "album", + "book", + "book_series", + "episode", + "album", + "ep", + "tv_season", + "tv_episode", + "track" + ], + "type": "string" + }, + "description": { + "description": "Optional description or commentary for the list item.", + "maxLength": 5000, + "type": "string" + }, + "genres": { + "items": { + "maxLength": 50, + "type": "string" + }, + "type": "array" + }, + "identifiers": { + "description": "External identifiers for the creative work.", + "ref": "#identifiers", + "type": "ref" + }, + "listType": { + "description": "The type of list, e.g., 'watchlist', 'favorites', 'to-read', etc.", + "maxLength": 50, + "type": "string" + }, + "listUri": { + "description": "URI of the list where the item is stored.", + "format": "uri", + "type": "string" + }, + "mainCredit": { + "description": "Main actor, director, author, or artist of the creative work.", + "maxLength": 1000, + "type": "string" + }, + "mainCreditRole": { + "description": "The role of the main credit.", + "enum": [ + "director", + "author", + "artist", + "showrunner", + "lead_actor", + "creator", + "studio", + "publisher", + "developer", + "performer", + "network" + ], + "type": "string" + }, + "position": { + "description": "DEPRECATED", + "type": "integer" + }, + "poster": { + "accept": [ + "image/*" + ], + "maxSize": 2000000, + "type": "blob" + }, + "posterUrl": { + "description": "Poster or cover image URL for the creative work. Soon to be deprecated in favor of the 'poster' blob field", + "format": "uri", + "type": "string" + }, + "releaseDate": { + "description": "Release date of the creative work.", + "format": "datetime", + "type": "string" + }, + "startedAt": { + "description": "Timestamp when the user started the creative work. Most relevant for books, TV shows, and video games.", + "format": "datetime", + "type": "string" + }, + "status": { + "knownValues": [ + "#finished", + "#in_progress", + "#backlog", + "#abandoned" + ], + "type": "string" + }, + "title": { + "description": "Title of the creative work.", + "maxLength": 1000, + "type": "string" + }, + "watchedEpisodes": { + "description": "For TV shows, the episodes the user has watched.", + "items": { + "ref": "#watchedEpisode", + "type": "ref" + }, + "type": "array" + } + }, + "required": [ + "identifiers", + "creativeWorkType", + "addedAt", + "listUri" + ], + "type": "object" + }, + "type": "record" + }, + "watchedEpisode": { + "properties": { + "episodeNumber": { + "type": "integer" + }, + "seasonNumber": { + "type": "integer" + }, + "tmdbId": { + "type": "string" + } + }, + "required": [ + "seasonNumber", + "episodeNumber" + ], + "type": "object" + } + }, + "id": "social.popfeed.feed.listItem", + "lexicon": 1 +} diff --git a/api/lexicons/custom/social/popfeed/feed/review.json b/api/lexicons/custom/social/popfeed/feed/review.json new file mode 100644 index 0000000..2dbf6d7 --- /dev/null +++ b/api/lexicons/custom/social/popfeed/feed/review.json @@ -0,0 +1,212 @@ +{ + "defs": { + "crossPosts": { + "properties": { + "bluesky": { + "description": "The URI of the original Bluesky post being cross-posted.", + "format": "uri", + "type": "string" + }, + "leaflet": { + "description": "The URI of the original Leaflet post being cross-posted.", + "format": "uri", + "type": "string" + } + }, + "type": "object" + }, + "identifiers": { + "properties": { + "asin": { + "type": "string" + }, + "episodeNumber": { + "description": "Episode number for TV shows or series", + "type": "integer" + }, + "igdbId": { + "type": "string" + }, + "imdbId": { + "type": "string" + }, + "isbn10": { + "type": "string" + }, + "isbn13": { + "type": "string" + }, + "mbId": { + "description": "DEPRECATED - soon to be ignored", + "type": "string" + }, + "mbReleaseId": { + "description": "MusicBrainz ID for specific releases (albums, EPs, tracks)", + "type": "string" + }, + "other": { + "type": "string" + }, + "parentMbReleaseId": { + "description": "MusicBrainz ID for parent release (e.g., album for a track)", + "type": "string" + }, + "seasonNumber": { + "description": "Season number for TV shows or series", + "type": "integer" + }, + "tmdbId": { + "type": "string" + }, + "tmdbTvSeriesId": { + "description": "TMDb ID for TV series", + "type": "string" + } + }, + "type": "object" + }, + "main": { + "key": "tid", + "record": { + "properties": { + "backdrop": { + "accept": [ + "image/*" + ], + "description": "Backdrop image for the review post. Have not fully cut over yet so may not be shown", + "maxSize": 4000000, + "type": "blob" + }, + "backdropUrl": { + "description": "Backdrop image URL for the creative work. Soon to be deprecated in favor of the 'backdrop' blob field", + "format": "uri", + "type": "string" + }, + "containsSpoilers": { + "description": "Indicates if the review contains spoilers.", + "type": "boolean" + }, + "createdAt": { + "format": "datetime", + "type": "string" + }, + "creativeWorkType": { + "enum": [ + "movie", + "tv_show", + "video_game", + "album", + "book", + "book_series", + "episode", + "album", + "ep", + "tv_season", + "tv_episode", + "track" + ], + "type": "string" + }, + "crossPosts": { + "description": "Information about cross-posting to other platforms.", + "ref": "#crossPosts", + "type": "ref" + }, + "facets": { + "description": "Annotations of text (mentions, URLs, hashtags, etc)", + "items": { + "ref": "social.popfeed.richtext.facet", + "type": "ref" + }, + "type": "array" + }, + "genres": { + "items": { + "maxLength": 50, + "type": "string" + }, + "type": "array" + }, + "identifiers": { + "ref": "#identifiers", + "type": "ref" + }, + "isRevisit": { + "description": "Indicates if the user has experienced this work before (re-watch, re-read, replay).", + "type": "boolean" + }, + "mainCredit": { + "description": "Main actor, director, author, or artist of the creative work.", + "maxLength": 1000, + "type": "string" + }, + "mainCreditRole": { + "description": "The role of the main credit.", + "enum": [ + "director", + "author", + "artist", + "showrunner", + "lead_actor", + "creator", + "studio", + "publisher", + "developer", + "performer", + "network" + ], + "type": "string" + }, + "poster": { + "accept": [ + "image/*" + ], + "maxSize": 2000000, + "type": "blob" + }, + "posterUrl": { + "description": "Poster or cover image URL for the creative work. Soon to be deprecated in favor of the 'poster' blob field", + "format": "uri", + "type": "string" + }, + "rating": { + "maximum": 10, + "minimum": 0, + "type": "integer" + }, + "releaseDate": { + "description": "Release date of the creative work.", + "format": "datetime", + "type": "string" + }, + "tags": { + "items": { + "maxLength": 50, + "type": "string" + }, + "type": "array" + }, + "text": { + "maxLength": 100000, + "type": "string" + }, + "title": { + "description": "Title of the creative work.", + "maxLength": 1000, + "type": "string" + } + }, + "required": [ + "identifiers", + "creativeWorkType", + "rating", + "createdAt" + ], + "type": "object" + }, + "type": "record" + } + }, + "id": "social.popfeed.feed.review", + "lexicon": 1 +} diff --git a/api/lexicons/custom/social/popfeed/richtext/facet.json b/api/lexicons/custom/social/popfeed/richtext/facet.json new file mode 100644 index 0000000..05cc46a --- /dev/null +++ b/api/lexicons/custom/social/popfeed/richtext/facet.json @@ -0,0 +1,89 @@ +{ + "defs": { + "byteSlice": { + "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.", + "properties": { + "byteEnd": { + "minimum": 0, + "type": "integer" + }, + "byteStart": { + "minimum": 0, + "type": "integer" + } + }, + "required": [ + "byteStart", + "byteEnd" + ], + "type": "object" + }, + "link": { + "description": "Facet feature for a URL. The text URL may have been simplified or truncated, but the facet reference should be a complete URL.", + "properties": { + "uri": { + "format": "uri", + "type": "string" + } + }, + "required": [ + "uri" + ], + "type": "object" + }, + "main": { + "description": "Annotation of a sub-string within rich text.", + "properties": { + "features": { + "items": { + "refs": [ + "#mention", + "#link", + "#tag" + ], + "type": "union" + }, + "type": "array" + }, + "index": { + "ref": "#byteSlice", + "type": "ref" + } + }, + "required": [ + "index", + "features" + ], + "type": "object" + }, + "mention": { + "description": "Facet feature for mention of another account. The text is usually a handle, including a '@' prefix, but the facet reference is a DID.", + "properties": { + "did": { + "format": "did", + "type": "string" + } + }, + "required": [ + "did" + ], + "type": "object" + }, + "tag": { + "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').", + "properties": { + "tag": { + "maxGraphemes": 64, + "maxLength": 640, + "type": "string" + } + }, + "required": [ + "tag" + ], + "type": "object" + } + }, + "id": "social.popfeed.richtext.facet", + "lexicon": 1 +} diff --git a/api/lexicons/generated/index.ts b/api/lexicons/generated/index.ts new file mode 100644 index 0000000..72d2829 --- /dev/null +++ b/api/lexicons/generated/index.ts @@ -0,0 +1,28 @@ +// Auto-generated by @atmo-dev/contrail. Do not edit. +// Regenerate with `contrail lexicons generate`. + +import _0 from "../custom/social/popfeed/actor/profile.json"; +import _1 from "../custom/social/popfeed/feed/comment.json"; +import _2 from "../custom/social/popfeed/feed/like.json"; +import _3 from "../custom/social/popfeed/feed/list.json"; +import _4 from "../custom/social/popfeed/feed/listItem.json"; +import _5 from "../custom/social/popfeed/feed/review.json"; +import _6 from "../custom/social/popfeed/richtext/facet.json"; +import _7 from "../pulled/app/bsky/actor/profile.json"; +import _8 from "../pulled/com/atproto/label/defs.json"; +import _9 from "../pulled/com/atproto/repo/strongRef.json"; +import _10 from "./watch/atmo/comment/getRecord.json"; +import _11 from "./watch/atmo/comment/listRecords.json"; +import _12 from "./watch/atmo/getCursor.json"; +import _13 from "./watch/atmo/getProfile.json"; +import _14 from "./watch/atmo/like/getRecord.json"; +import _15 from "./watch/atmo/like/listRecords.json"; +import _16 from "./watch/atmo/list/getRecord.json"; +import _17 from "./watch/atmo/list/listRecords.json"; +import _18 from "./watch/atmo/listItem/getRecord.json"; +import _19 from "./watch/atmo/listItem/listRecords.json"; +import _20 from "./watch/atmo/notifyOfUpdate.json"; +import _21 from "./watch/atmo/review/getRecord.json"; +import _22 from "./watch/atmo/review/listRecords.json"; + +export const lexicons: object[] = [_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22]; diff --git a/api/lexicons/generated/watch/atmo/comment/getRecord.json b/api/lexicons/generated/watch/atmo/comment/getRecord.json new file mode 100644 index 0000000..4e8a729 --- /dev/null +++ b/api/lexicons/generated/watch/atmo/comment/getRecord.json @@ -0,0 +1,110 @@ +{ + "lexicon": 1, + "id": "watch.atmo.comment.getRecord", + "defs": { + "main": { + "type": "query", + "description": "Get a social.popfeed.feed.comment record by AT URI", + "parameters": { + "type": "params", + "required": [ + "uri" + ], + "properties": { + "uri": { + "type": "string", + "format": "at-uri", + "description": "AT URI of the record" + }, + "profiles": { + "type": "boolean", + "description": "Include indexed profile and identity information" + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": [ + "uri", + "value", + "did", + "collection", + "rkey", + "time_us" + ], + "properties": { + "uri": { + "type": "string", + "format": "at-uri" + }, + "cid": { + "type": "string", + "format": "cid" + }, + "value": { + "type": "ref", + "ref": "social.popfeed.feed.comment#main" + }, + "did": { + "type": "string", + "format": "did" + }, + "collection": { + "type": "string", + "format": "nsid" + }, + "rkey": { + "type": "string" + }, + "time_us": { + "type": "integer" + }, + "profiles": { + "type": "array", + "items": { + "type": "ref", + "ref": "#profileEntry" + } + } + } + } + } + }, + "profileEntry": { + "type": "object", + "required": [ + "did" + ], + "properties": { + "did": { + "type": "string", + "format": "did" + }, + "handle": { + "type": "string" + }, + "uri": { + "type": "string", + "format": "at-uri" + }, + "cid": { + "type": "string", + "format": "cid" + }, + "value": { + "type": "ref", + "ref": "app.bsky.actor.profile#main" + }, + "collection": { + "type": "string", + "format": "nsid" + }, + "rkey": { + "type": "string" + } + } + } + } +} diff --git a/api/lexicons/generated/watch/atmo/comment/listRecords.json b/api/lexicons/generated/watch/atmo/comment/listRecords.json new file mode 100644 index 0000000..362b124 --- /dev/null +++ b/api/lexicons/generated/watch/atmo/comment/listRecords.json @@ -0,0 +1,164 @@ +{ + "lexicon": 1, + "id": "watch.atmo.comment.listRecords", + "defs": { + "main": { + "type": "query", + "description": "Query social.popfeed.feed.comment records", + "parameters": { + "type": "params", + "properties": { + "limit": { + "type": "integer", + "minimum": 1, + "maximum": 200, + "default": 50 + }, + "cursor": { + "type": "string" + }, + "actor": { + "type": "string", + "format": "at-identifier", + "description": "Filter by an indexed DID or cached handle" + }, + "profiles": { + "type": "boolean", + "description": "Include indexed profile and identity information" + }, + "rootUri": { + "type": "string", + "description": "Filter by rootUri" + }, + "subjectType": { + "type": "string", + "description": "Filter by subjectType" + }, + "subjectUri": { + "type": "string", + "description": "Filter by subjectUri" + }, + "sort": { + "type": "string", + "knownValues": [ + "rootUri", + "subjectType", + "subjectUri" + ], + "description": "Field to sort by (default: time_us)" + }, + "order": { + "type": "string", + "knownValues": [ + "asc", + "desc" + ], + "description": "Sort direction" + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": [ + "records" + ], + "properties": { + "records": { + "type": "array", + "items": { + "type": "ref", + "ref": "#record" + } + }, + "cursor": { + "type": "string" + }, + "profiles": { + "type": "array", + "items": { + "type": "ref", + "ref": "#profileEntry" + } + } + } + } + } + }, + "record": { + "type": "object", + "required": [ + "uri", + "cid", + "value", + "did", + "collection", + "rkey", + "time_us" + ], + "properties": { + "uri": { + "type": "string", + "format": "at-uri" + }, + "cid": { + "type": "string", + "format": "cid" + }, + "value": { + "type": "ref", + "ref": "social.popfeed.feed.comment#main" + }, + "did": { + "type": "string", + "format": "did" + }, + "collection": { + "type": "string", + "format": "nsid" + }, + "rkey": { + "type": "string" + }, + "time_us": { + "type": "integer" + } + } + }, + "profileEntry": { + "type": "object", + "required": [ + "did" + ], + "properties": { + "did": { + "type": "string", + "format": "did" + }, + "handle": { + "type": "string" + }, + "uri": { + "type": "string", + "format": "at-uri" + }, + "cid": { + "type": "string", + "format": "cid" + }, + "value": { + "type": "ref", + "ref": "app.bsky.actor.profile#main" + }, + "collection": { + "type": "string", + "format": "nsid" + }, + "rkey": { + "type": "string" + } + } + } + } +} diff --git a/api/lexicons/generated/watch/atmo/getCursor.json b/api/lexicons/generated/watch/atmo/getCursor.json new file mode 100644 index 0000000..c8bf0f8 --- /dev/null +++ b/api/lexicons/generated/watch/atmo/getCursor.json @@ -0,0 +1,48 @@ +{ + "lexicon": 1, + "id": "watch.atmo.getCursor", + "defs": { + "main": { + "type": "query", + "description": "Get the committed primary ordered-source position", + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "properties": { + "position": { + "type": "ref", + "ref": "#sourcePosition" + }, + "updatedAt": { + "type": "integer" + }, + "updatedAtDate": { + "type": "string", + "format": "datetime" + } + } + } + } + }, + "sourcePosition": { + "type": "object", + "required": [ + "source", + "epoch", + "cursor" + ], + "properties": { + "source": { + "type": "string" + }, + "epoch": { + "type": "string" + }, + "cursor": { + "type": "string" + } + } + } + } +} diff --git a/api/lexicons/generated/watch/atmo/getProfile.json b/api/lexicons/generated/watch/atmo/getProfile.json new file mode 100644 index 0000000..ebd042a --- /dev/null +++ b/api/lexicons/generated/watch/atmo/getProfile.json @@ -0,0 +1,73 @@ +{ + "lexicon": 1, + "id": "watch.atmo.getProfile", + "defs": { + "main": { + "type": "query", + "parameters": { + "type": "params", + "required": [ + "actor" + ], + "properties": { + "actor": { + "type": "string", + "format": "at-identifier" + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": [ + "profiles" + ], + "properties": { + "profiles": { + "type": "array", + "items": { + "type": "ref", + "ref": "#profileEntry" + } + } + } + } + } + }, + "profileEntry": { + "type": "object", + "required": [ + "did" + ], + "properties": { + "did": { + "type": "string", + "format": "did" + }, + "handle": { + "type": "string" + }, + "uri": { + "type": "string", + "format": "at-uri" + }, + "cid": { + "type": "string", + "format": "cid" + }, + "value": { + "type": "ref", + "ref": "app.bsky.actor.profile#main" + }, + "collection": { + "type": "string", + "format": "nsid" + }, + "rkey": { + "type": "string" + } + } + } + } +} diff --git a/api/lexicons/generated/watch/atmo/like/getRecord.json b/api/lexicons/generated/watch/atmo/like/getRecord.json new file mode 100644 index 0000000..e649081 --- /dev/null +++ b/api/lexicons/generated/watch/atmo/like/getRecord.json @@ -0,0 +1,110 @@ +{ + "lexicon": 1, + "id": "watch.atmo.like.getRecord", + "defs": { + "main": { + "type": "query", + "description": "Get a social.popfeed.feed.like record by AT URI", + "parameters": { + "type": "params", + "required": [ + "uri" + ], + "properties": { + "uri": { + "type": "string", + "format": "at-uri", + "description": "AT URI of the record" + }, + "profiles": { + "type": "boolean", + "description": "Include indexed profile and identity information" + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": [ + "uri", + "value", + "did", + "collection", + "rkey", + "time_us" + ], + "properties": { + "uri": { + "type": "string", + "format": "at-uri" + }, + "cid": { + "type": "string", + "format": "cid" + }, + "value": { + "type": "ref", + "ref": "social.popfeed.feed.like#main" + }, + "did": { + "type": "string", + "format": "did" + }, + "collection": { + "type": "string", + "format": "nsid" + }, + "rkey": { + "type": "string" + }, + "time_us": { + "type": "integer" + }, + "profiles": { + "type": "array", + "items": { + "type": "ref", + "ref": "#profileEntry" + } + } + } + } + } + }, + "profileEntry": { + "type": "object", + "required": [ + "did" + ], + "properties": { + "did": { + "type": "string", + "format": "did" + }, + "handle": { + "type": "string" + }, + "uri": { + "type": "string", + "format": "at-uri" + }, + "cid": { + "type": "string", + "format": "cid" + }, + "value": { + "type": "ref", + "ref": "app.bsky.actor.profile#main" + }, + "collection": { + "type": "string", + "format": "nsid" + }, + "rkey": { + "type": "string" + } + } + } + } +} diff --git a/api/lexicons/generated/watch/atmo/like/listRecords.json b/api/lexicons/generated/watch/atmo/like/listRecords.json new file mode 100644 index 0000000..2d3f82c --- /dev/null +++ b/api/lexicons/generated/watch/atmo/like/listRecords.json @@ -0,0 +1,159 @@ +{ + "lexicon": 1, + "id": "watch.atmo.like.listRecords", + "defs": { + "main": { + "type": "query", + "description": "Query social.popfeed.feed.like records", + "parameters": { + "type": "params", + "properties": { + "limit": { + "type": "integer", + "minimum": 1, + "maximum": 200, + "default": 50 + }, + "cursor": { + "type": "string" + }, + "actor": { + "type": "string", + "format": "at-identifier", + "description": "Filter by an indexed DID or cached handle" + }, + "profiles": { + "type": "boolean", + "description": "Include indexed profile and identity information" + }, + "subjectType": { + "type": "string", + "description": "Filter by subjectType" + }, + "subjectUri": { + "type": "string", + "description": "Filter by subjectUri" + }, + "sort": { + "type": "string", + "knownValues": [ + "subjectType", + "subjectUri" + ], + "description": "Field to sort by (default: time_us)" + }, + "order": { + "type": "string", + "knownValues": [ + "asc", + "desc" + ], + "description": "Sort direction" + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": [ + "records" + ], + "properties": { + "records": { + "type": "array", + "items": { + "type": "ref", + "ref": "#record" + } + }, + "cursor": { + "type": "string" + }, + "profiles": { + "type": "array", + "items": { + "type": "ref", + "ref": "#profileEntry" + } + } + } + } + } + }, + "record": { + "type": "object", + "required": [ + "uri", + "cid", + "value", + "did", + "collection", + "rkey", + "time_us" + ], + "properties": { + "uri": { + "type": "string", + "format": "at-uri" + }, + "cid": { + "type": "string", + "format": "cid" + }, + "value": { + "type": "ref", + "ref": "social.popfeed.feed.like#main" + }, + "did": { + "type": "string", + "format": "did" + }, + "collection": { + "type": "string", + "format": "nsid" + }, + "rkey": { + "type": "string" + }, + "time_us": { + "type": "integer" + } + } + }, + "profileEntry": { + "type": "object", + "required": [ + "did" + ], + "properties": { + "did": { + "type": "string", + "format": "did" + }, + "handle": { + "type": "string" + }, + "uri": { + "type": "string", + "format": "at-uri" + }, + "cid": { + "type": "string", + "format": "cid" + }, + "value": { + "type": "ref", + "ref": "app.bsky.actor.profile#main" + }, + "collection": { + "type": "string", + "format": "nsid" + }, + "rkey": { + "type": "string" + } + } + } + } +} diff --git a/api/lexicons/generated/watch/atmo/list/getRecord.json b/api/lexicons/generated/watch/atmo/list/getRecord.json new file mode 100644 index 0000000..8c0a4f6 --- /dev/null +++ b/api/lexicons/generated/watch/atmo/list/getRecord.json @@ -0,0 +1,110 @@ +{ + "lexicon": 1, + "id": "watch.atmo.list.getRecord", + "defs": { + "main": { + "type": "query", + "description": "Get a social.popfeed.feed.list record by AT URI", + "parameters": { + "type": "params", + "required": [ + "uri" + ], + "properties": { + "uri": { + "type": "string", + "format": "at-uri", + "description": "AT URI of the record" + }, + "profiles": { + "type": "boolean", + "description": "Include indexed profile and identity information" + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": [ + "uri", + "value", + "did", + "collection", + "rkey", + "time_us" + ], + "properties": { + "uri": { + "type": "string", + "format": "at-uri" + }, + "cid": { + "type": "string", + "format": "cid" + }, + "value": { + "type": "ref", + "ref": "social.popfeed.feed.list#main" + }, + "did": { + "type": "string", + "format": "did" + }, + "collection": { + "type": "string", + "format": "nsid" + }, + "rkey": { + "type": "string" + }, + "time_us": { + "type": "integer" + }, + "profiles": { + "type": "array", + "items": { + "type": "ref", + "ref": "#profileEntry" + } + } + } + } + } + }, + "profileEntry": { + "type": "object", + "required": [ + "did" + ], + "properties": { + "did": { + "type": "string", + "format": "did" + }, + "handle": { + "type": "string" + }, + "uri": { + "type": "string", + "format": "at-uri" + }, + "cid": { + "type": "string", + "format": "cid" + }, + "value": { + "type": "ref", + "ref": "app.bsky.actor.profile#main" + }, + "collection": { + "type": "string", + "format": "nsid" + }, + "rkey": { + "type": "string" + } + } + } + } +} diff --git a/api/lexicons/generated/watch/atmo/list/listRecords.json b/api/lexicons/generated/watch/atmo/list/listRecords.json new file mode 100644 index 0000000..25a287b --- /dev/null +++ b/api/lexicons/generated/watch/atmo/list/listRecords.json @@ -0,0 +1,135 @@ +{ + "lexicon": 1, + "id": "watch.atmo.list.listRecords", + "defs": { + "main": { + "type": "query", + "description": "Query social.popfeed.feed.list records", + "parameters": { + "type": "params", + "properties": { + "limit": { + "type": "integer", + "minimum": 1, + "maximum": 200, + "default": 50 + }, + "cursor": { + "type": "string" + }, + "actor": { + "type": "string", + "format": "at-identifier", + "description": "Filter by an indexed DID or cached handle" + }, + "profiles": { + "type": "boolean", + "description": "Include indexed profile and identity information" + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": [ + "records" + ], + "properties": { + "records": { + "type": "array", + "items": { + "type": "ref", + "ref": "#record" + } + }, + "cursor": { + "type": "string" + }, + "profiles": { + "type": "array", + "items": { + "type": "ref", + "ref": "#profileEntry" + } + } + } + } + } + }, + "record": { + "type": "object", + "required": [ + "uri", + "cid", + "value", + "did", + "collection", + "rkey", + "time_us" + ], + "properties": { + "uri": { + "type": "string", + "format": "at-uri" + }, + "cid": { + "type": "string", + "format": "cid" + }, + "value": { + "type": "ref", + "ref": "social.popfeed.feed.list#main" + }, + "did": { + "type": "string", + "format": "did" + }, + "collection": { + "type": "string", + "format": "nsid" + }, + "rkey": { + "type": "string" + }, + "time_us": { + "type": "integer" + } + } + }, + "profileEntry": { + "type": "object", + "required": [ + "did" + ], + "properties": { + "did": { + "type": "string", + "format": "did" + }, + "handle": { + "type": "string" + }, + "uri": { + "type": "string", + "format": "at-uri" + }, + "cid": { + "type": "string", + "format": "cid" + }, + "value": { + "type": "ref", + "ref": "app.bsky.actor.profile#main" + }, + "collection": { + "type": "string", + "format": "nsid" + }, + "rkey": { + "type": "string" + } + } + } + } +} diff --git a/api/lexicons/generated/watch/atmo/listItem/getRecord.json b/api/lexicons/generated/watch/atmo/listItem/getRecord.json new file mode 100644 index 0000000..044245a --- /dev/null +++ b/api/lexicons/generated/watch/atmo/listItem/getRecord.json @@ -0,0 +1,110 @@ +{ + "lexicon": 1, + "id": "watch.atmo.listItem.getRecord", + "defs": { + "main": { + "type": "query", + "description": "Get a social.popfeed.feed.listItem record by AT URI", + "parameters": { + "type": "params", + "required": [ + "uri" + ], + "properties": { + "uri": { + "type": "string", + "format": "at-uri", + "description": "AT URI of the record" + }, + "profiles": { + "type": "boolean", + "description": "Include indexed profile and identity information" + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": [ + "uri", + "value", + "did", + "collection", + "rkey", + "time_us" + ], + "properties": { + "uri": { + "type": "string", + "format": "at-uri" + }, + "cid": { + "type": "string", + "format": "cid" + }, + "value": { + "type": "ref", + "ref": "social.popfeed.feed.listItem#main" + }, + "did": { + "type": "string", + "format": "did" + }, + "collection": { + "type": "string", + "format": "nsid" + }, + "rkey": { + "type": "string" + }, + "time_us": { + "type": "integer" + }, + "profiles": { + "type": "array", + "items": { + "type": "ref", + "ref": "#profileEntry" + } + } + } + } + } + }, + "profileEntry": { + "type": "object", + "required": [ + "did" + ], + "properties": { + "did": { + "type": "string", + "format": "did" + }, + "handle": { + "type": "string" + }, + "uri": { + "type": "string", + "format": "at-uri" + }, + "cid": { + "type": "string", + "format": "cid" + }, + "value": { + "type": "ref", + "ref": "app.bsky.actor.profile#main" + }, + "collection": { + "type": "string", + "format": "nsid" + }, + "rkey": { + "type": "string" + } + } + } + } +} diff --git a/api/lexicons/generated/watch/atmo/listItem/listRecords.json b/api/lexicons/generated/watch/atmo/listItem/listRecords.json new file mode 100644 index 0000000..540a92e --- /dev/null +++ b/api/lexicons/generated/watch/atmo/listItem/listRecords.json @@ -0,0 +1,135 @@ +{ + "lexicon": 1, + "id": "watch.atmo.listItem.listRecords", + "defs": { + "main": { + "type": "query", + "description": "Query social.popfeed.feed.listItem records", + "parameters": { + "type": "params", + "properties": { + "limit": { + "type": "integer", + "minimum": 1, + "maximum": 200, + "default": 50 + }, + "cursor": { + "type": "string" + }, + "actor": { + "type": "string", + "format": "at-identifier", + "description": "Filter by an indexed DID or cached handle" + }, + "profiles": { + "type": "boolean", + "description": "Include indexed profile and identity information" + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": [ + "records" + ], + "properties": { + "records": { + "type": "array", + "items": { + "type": "ref", + "ref": "#record" + } + }, + "cursor": { + "type": "string" + }, + "profiles": { + "type": "array", + "items": { + "type": "ref", + "ref": "#profileEntry" + } + } + } + } + } + }, + "record": { + "type": "object", + "required": [ + "uri", + "cid", + "value", + "did", + "collection", + "rkey", + "time_us" + ], + "properties": { + "uri": { + "type": "string", + "format": "at-uri" + }, + "cid": { + "type": "string", + "format": "cid" + }, + "value": { + "type": "ref", + "ref": "social.popfeed.feed.listItem#main" + }, + "did": { + "type": "string", + "format": "did" + }, + "collection": { + "type": "string", + "format": "nsid" + }, + "rkey": { + "type": "string" + }, + "time_us": { + "type": "integer" + } + } + }, + "profileEntry": { + "type": "object", + "required": [ + "did" + ], + "properties": { + "did": { + "type": "string", + "format": "did" + }, + "handle": { + "type": "string" + }, + "uri": { + "type": "string", + "format": "at-uri" + }, + "cid": { + "type": "string", + "format": "cid" + }, + "value": { + "type": "ref", + "ref": "app.bsky.actor.profile#main" + }, + "collection": { + "type": "string", + "format": "nsid" + }, + "rkey": { + "type": "string" + } + } + } + } +} diff --git a/api/lexicons/generated/watch/atmo/notifyOfUpdate.json b/api/lexicons/generated/watch/atmo/notifyOfUpdate.json new file mode 100644 index 0000000..3b0d44d --- /dev/null +++ b/api/lexicons/generated/watch/atmo/notifyOfUpdate.json @@ -0,0 +1,56 @@ +{ + "lexicon": 1, + "id": "watch.atmo.notifyOfUpdate", + "defs": { + "main": { + "type": "procedure", + "description": "Fetch changed records from their authoritative PDS for immediate indexing", + "input": { + "encoding": "application/json", + "schema": { + "type": "object", + "properties": { + "uri": { + "type": "string", + "format": "at-uri" + }, + "uris": { + "type": "array", + "items": { + "type": "string", + "format": "at-uri" + }, + "maxLength": 25 + } + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": [ + "indexed", + "deleted" + ], + "properties": { + "indexed": { + "type": "integer", + "minimum": 0 + }, + "deleted": { + "type": "integer", + "minimum": 0 + }, + "errors": { + "type": "array", + "items": { + "type": "string" + } + } + } + } + } + } + } +} diff --git a/api/lexicons/generated/watch/atmo/review/getRecord.json b/api/lexicons/generated/watch/atmo/review/getRecord.json new file mode 100644 index 0000000..0218242 --- /dev/null +++ b/api/lexicons/generated/watch/atmo/review/getRecord.json @@ -0,0 +1,222 @@ +{ + "lexicon": 1, + "id": "watch.atmo.review.getRecord", + "defs": { + "main": { + "type": "query", + "description": "Get a social.popfeed.feed.review record by AT URI", + "parameters": { + "type": "params", + "required": [ + "uri" + ], + "properties": { + "uri": { + "type": "string", + "format": "at-uri", + "description": "AT URI of the record" + }, + "profiles": { + "type": "boolean", + "description": "Include indexed profile and identity information" + }, + "hydrateComments": { + "type": "integer", + "minimum": 1, + "maximum": 50, + "description": "Number of comments records to embed" + }, + "hydrateLikes": { + "type": "integer", + "minimum": 1, + "maximum": 50, + "description": "Number of likes records to embed" + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": [ + "uri", + "value", + "did", + "collection", + "rkey", + "time_us" + ], + "properties": { + "uri": { + "type": "string", + "format": "at-uri" + }, + "cid": { + "type": "string", + "format": "cid" + }, + "value": { + "type": "ref", + "ref": "social.popfeed.feed.review#main" + }, + "did": { + "type": "string", + "format": "did" + }, + "collection": { + "type": "string", + "format": "nsid" + }, + "rkey": { + "type": "string" + }, + "time_us": { + "type": "integer" + }, + "commentsCount": { + "type": "integer", + "description": "Total comments count" + }, + "comments": { + "type": "array", + "items": { + "type": "ref", + "ref": "#hydrateCommentsRecord" + } + }, + "likesCount": { + "type": "integer", + "description": "Total likes count" + }, + "likes": { + "type": "array", + "items": { + "type": "ref", + "ref": "#hydrateLikesRecord" + } + }, + "profiles": { + "type": "array", + "items": { + "type": "ref", + "ref": "#profileEntry" + } + } + } + } + } + }, + "hydrateCommentsRecord": { + "type": "object", + "required": [ + "uri", + "value", + "did", + "collection", + "rkey", + "time_us" + ], + "properties": { + "uri": { + "type": "string", + "format": "at-uri" + }, + "cid": { + "type": "string", + "format": "cid" + }, + "value": { + "type": "ref", + "ref": "social.popfeed.feed.comment#main" + }, + "did": { + "type": "string", + "format": "did" + }, + "collection": { + "type": "string", + "format": "nsid" + }, + "rkey": { + "type": "string" + }, + "time_us": { + "type": "integer" + } + } + }, + "hydrateLikesRecord": { + "type": "object", + "required": [ + "uri", + "value", + "did", + "collection", + "rkey", + "time_us" + ], + "properties": { + "uri": { + "type": "string", + "format": "at-uri" + }, + "cid": { + "type": "string", + "format": "cid" + }, + "value": { + "type": "ref", + "ref": "social.popfeed.feed.like#main" + }, + "did": { + "type": "string", + "format": "did" + }, + "collection": { + "type": "string", + "format": "nsid" + }, + "rkey": { + "type": "string" + }, + "time_us": { + "type": "integer" + } + } + }, + "profileEntry": { + "type": "object", + "required": [ + "did" + ], + "properties": { + "did": { + "type": "string", + "format": "did" + }, + "handle": { + "type": "string" + }, + "uri": { + "type": "string", + "format": "at-uri" + }, + "cid": { + "type": "string", + "format": "cid" + }, + "value": { + "type": "ref", + "ref": "app.bsky.actor.profile#main" + }, + "collection": { + "type": "string", + "format": "nsid" + }, + "rkey": { + "type": "string" + } + } + } + } +} diff --git a/api/lexicons/generated/watch/atmo/review/listRecords.json b/api/lexicons/generated/watch/atmo/review/listRecords.json new file mode 100644 index 0000000..fdceadc --- /dev/null +++ b/api/lexicons/generated/watch/atmo/review/listRecords.json @@ -0,0 +1,281 @@ +{ + "lexicon": 1, + "id": "watch.atmo.review.listRecords", + "defs": { + "main": { + "type": "query", + "description": "Query social.popfeed.feed.review records", + "parameters": { + "type": "params", + "properties": { + "limit": { + "type": "integer", + "minimum": 1, + "maximum": 200, + "default": 50 + }, + "cursor": { + "type": "string" + }, + "actor": { + "type": "string", + "format": "at-identifier", + "description": "Filter by an indexed DID or cached handle" + }, + "profiles": { + "type": "boolean", + "description": "Include indexed profile and identity information" + }, + "creativeWorkType": { + "type": "string", + "description": "Filter by creativeWorkType" + }, + "identifiersTmdbId": { + "type": "string", + "description": "Filter by identifiers.tmdbId" + }, + "commentsCountMin": { + "type": "integer", + "description": "Minimum total comments count" + }, + "hydrateComments": { + "type": "integer", + "minimum": 1, + "maximum": 50, + "description": "Number of comments records to embed" + }, + "likesCountMin": { + "type": "integer", + "description": "Minimum total likes count" + }, + "hydrateLikes": { + "type": "integer", + "minimum": 1, + "maximum": 50, + "description": "Number of likes records to embed" + }, + "sort": { + "type": "string", + "knownValues": [ + "commentsCount", + "creativeWorkType", + "identifiersTmdbId", + "likesCount" + ], + "description": "Field to sort by (default: time_us)" + }, + "order": { + "type": "string", + "knownValues": [ + "asc", + "desc" + ], + "description": "Sort direction" + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": [ + "records" + ], + "properties": { + "records": { + "type": "array", + "items": { + "type": "ref", + "ref": "#record" + } + }, + "cursor": { + "type": "string" + }, + "profiles": { + "type": "array", + "items": { + "type": "ref", + "ref": "#profileEntry" + } + } + } + } + } + }, + "record": { + "type": "object", + "required": [ + "uri", + "cid", + "value", + "did", + "collection", + "rkey", + "time_us" + ], + "properties": { + "uri": { + "type": "string", + "format": "at-uri" + }, + "cid": { + "type": "string", + "format": "cid" + }, + "value": { + "type": "ref", + "ref": "social.popfeed.feed.review#main" + }, + "did": { + "type": "string", + "format": "did" + }, + "collection": { + "type": "string", + "format": "nsid" + }, + "rkey": { + "type": "string" + }, + "time_us": { + "type": "integer" + }, + "commentsCount": { + "type": "integer", + "description": "Total comments count" + }, + "comments": { + "type": "array", + "items": { + "type": "ref", + "ref": "#hydrateCommentsRecord" + } + }, + "likesCount": { + "type": "integer", + "description": "Total likes count" + }, + "likes": { + "type": "array", + "items": { + "type": "ref", + "ref": "#hydrateLikesRecord" + } + } + } + }, + "hydrateCommentsRecord": { + "type": "object", + "required": [ + "uri", + "value", + "did", + "collection", + "rkey", + "time_us" + ], + "properties": { + "uri": { + "type": "string", + "format": "at-uri" + }, + "cid": { + "type": "string", + "format": "cid" + }, + "value": { + "type": "ref", + "ref": "social.popfeed.feed.comment#main" + }, + "did": { + "type": "string", + "format": "did" + }, + "collection": { + "type": "string", + "format": "nsid" + }, + "rkey": { + "type": "string" + }, + "time_us": { + "type": "integer" + } + } + }, + "hydrateLikesRecord": { + "type": "object", + "required": [ + "uri", + "value", + "did", + "collection", + "rkey", + "time_us" + ], + "properties": { + "uri": { + "type": "string", + "format": "at-uri" + }, + "cid": { + "type": "string", + "format": "cid" + }, + "value": { + "type": "ref", + "ref": "social.popfeed.feed.like#main" + }, + "did": { + "type": "string", + "format": "did" + }, + "collection": { + "type": "string", + "format": "nsid" + }, + "rkey": { + "type": "string" + }, + "time_us": { + "type": "integer" + } + } + }, + "profileEntry": { + "type": "object", + "required": [ + "did" + ], + "properties": { + "did": { + "type": "string", + "format": "did" + }, + "handle": { + "type": "string" + }, + "uri": { + "type": "string", + "format": "at-uri" + }, + "cid": { + "type": "string", + "format": "cid" + }, + "value": { + "type": "ref", + "ref": "app.bsky.actor.profile#main" + }, + "collection": { + "type": "string", + "format": "nsid" + }, + "rkey": { + "type": "string" + } + } + } + } +} diff --git a/api/lexicons/pulled/README.md b/api/lexicons/pulled/README.md new file mode 100644 index 0000000..f22b079 --- /dev/null +++ b/api/lexicons/pulled/README.md @@ -0,0 +1,5 @@ +# lexicon sources + +this directory contains lexicon documents pulled from the following sources: + +- atproto (nsids: app.bsky.actor.profile, com.atproto.label.defs, com.atproto.repo.strongRef, social.popfeed.feed.comment, social.popfeed.feed.like, social.popfeed.feed.list, social.popfeed.feed.listItem, social.popfeed.feed.review) diff --git a/api/lexicons/pulled/app/bsky/actor/profile.json b/api/lexicons/pulled/app/bsky/actor/profile.json new file mode 100644 index 0000000..35e72fe --- /dev/null +++ b/api/lexicons/pulled/app/bsky/actor/profile.json @@ -0,0 +1,75 @@ +{ + "id": "app.bsky.actor.profile", + "defs": { + "main": { + "key": "literal:self", + "type": "record", + "record": { + "type": "object", + "properties": { + "avatar": { + "type": "blob", + "accept": [ + "image/jpeg", + "image/png" + ], + "maxSize": 1000000, + "description": "Small image to be displayed next to posts from account. AKA, 'profile picture'" + }, + "banner": { + "type": "blob", + "accept": [ + "image/jpeg", + "image/png" + ], + "maxSize": 1000000, + "description": "Larger horizontal image to display behind profile view." + }, + "labels": { + "refs": [ + "com.atproto.label.defs#selfLabels" + ], + "type": "union", + "description": "Self-label values, specific to the Bluesky application, on the overall account." + }, + "website": { + "type": "string", + "format": "uri" + }, + "pronouns": { + "type": "string", + "maxLength": 200, + "description": "Free-form pronouns text.", + "maxGraphemes": 20 + }, + "createdAt": { + "type": "string", + "format": "datetime" + }, + "pinnedPost": { + "ref": "com.atproto.repo.strongRef", + "type": "ref" + }, + "description": { + "type": "string", + "maxLength": 2560, + "description": "Free-form profile description text.", + "maxGraphemes": 256 + }, + "displayName": { + "type": "string", + "maxLength": 640, + "maxGraphemes": 64 + }, + "joinedViaStarterPack": { + "ref": "com.atproto.repo.strongRef", + "type": "ref" + } + } + }, + "description": "A declaration of a Bluesky account profile." + } + }, + "$type": "com.atproto.lexicon.schema", + "lexicon": 1 +} \ No newline at end of file diff --git a/api/lexicons/pulled/com/atproto/label/defs.json b/api/lexicons/pulled/com/atproto/label/defs.json new file mode 100644 index 0000000..b7017ec --- /dev/null +++ b/api/lexicons/pulled/com/atproto/label/defs.json @@ -0,0 +1,190 @@ +{ + "id": "com.atproto.label.defs", + "defs": { + "label": { + "type": "object", + "required": [ + "cts", + "src", + "uri", + "val" + ], + "properties": { + "cid": { + "type": "string", + "format": "cid", + "description": "Optionally, CID specifying the specific version of 'uri' resource this label applies to." + }, + "cts": { + "type": "string", + "format": "datetime", + "description": "Timestamp when this label was created." + }, + "exp": { + "type": "string", + "format": "datetime", + "description": "Timestamp at which this label expires (no longer applies)." + }, + "neg": { + "type": "boolean", + "description": "If true, this is a negation label, overwriting a previous label." + }, + "sig": { + "type": "bytes", + "description": "Signature of dag-cbor encoded label." + }, + "src": { + "type": "string", + "format": "did", + "description": "DID of the actor who created this label." + }, + "uri": { + "type": "string", + "format": "uri", + "description": "AT URI of the record, repository (account), or other resource that this label applies to." + }, + "val": { + "type": "string", + "maxLength": 128, + "description": "The short string name of the value or type of this label." + }, + "ver": { + "type": "integer", + "description": "The AT Protocol version of the label object." + } + }, + "description": "Metadata tag on an atproto resource (eg, repo or record)." + }, + "selfLabel": { + "type": "object", + "required": [ + "val" + ], + "properties": { + "val": { + "type": "string", + "maxLength": 128, + "description": "The short string name of the value or type of this label." + } + }, + "description": "Metadata tag on an atproto record, published by the author within the record. Note that schemas should use #selfLabels, not #selfLabel." + }, + "labelValue": { + "type": "string", + "knownValues": [ + "!hide", + "!no-unauthenticated", + "!warn", + "bot", + "graphic-media", + "nudity", + "porn", + "sexual" + ] + }, + "selfLabels": { + "type": "object", + "required": [ + "values" + ], + "properties": { + "values": { + "type": "array", + "items": { + "ref": "#selfLabel", + "type": "ref" + }, + "maxLength": 10 + } + }, + "description": "Metadata tags on an atproto record, published by the author within the record." + }, + "labelValueDefinition": { + "type": "object", + "required": [ + "blurs", + "identifier", + "locales", + "severity" + ], + "properties": { + "blurs": { + "type": "string", + "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.", + "knownValues": [ + "content", + "media", + "none" + ] + }, + "locales": { + "type": "array", + "items": { + "ref": "#labelValueDefinitionStrings", + "type": "ref" + } + }, + "severity": { + "type": "string", + "description": "How should a client visually convey this label? 'inform' means neutral and informational; 'alert' means negative and warning; 'none' means show nothing.", + "knownValues": [ + "alert", + "inform", + "none" + ] + }, + "adultOnly": { + "type": "boolean", + "description": "Does the user need to have adult content enabled in order to configure this label?" + }, + "identifier": { + "type": "string", + "maxLength": 100, + "description": "The value of the label being defined. Must only include lowercase ascii and the '-' character ([a-z-]+).", + "maxGraphemes": 100 + }, + "defaultSetting": { + "type": "string", + "default": "warn", + "description": "The default setting for this label.", + "knownValues": [ + "hide", + "ignore", + "warn" + ] + } + }, + "description": "Declares a label value and its expected interpretations and behaviors." + }, + "labelValueDefinitionStrings": { + "type": "object", + "required": [ + "description", + "lang", + "name" + ], + "properties": { + "lang": { + "type": "string", + "format": "language", + "description": "The code of the language these strings are written in." + }, + "name": { + "type": "string", + "maxLength": 640, + "description": "A short human-readable name for the label.", + "maxGraphemes": 64 + }, + "description": { + "type": "string", + "maxLength": 100000, + "description": "A longer description of what the label means and why it might be applied.", + "maxGraphemes": 10000 + } + }, + "description": "Strings which describe the label in the UI, localized into a specific language." + } + }, + "$type": "com.atproto.lexicon.schema", + "lexicon": 1 +} \ No newline at end of file diff --git a/api/lexicons/pulled/com/atproto/repo/strongRef.json b/api/lexicons/pulled/com/atproto/repo/strongRef.json new file mode 100644 index 0000000..fffb47b --- /dev/null +++ b/api/lexicons/pulled/com/atproto/repo/strongRef.json @@ -0,0 +1,25 @@ +{ + "id": "com.atproto.repo.strongRef", + "defs": { + "main": { + "type": "object", + "required": [ + "cid", + "uri" + ], + "properties": { + "cid": { + "type": "string", + "format": "cid" + }, + "uri": { + "type": "string", + "format": "at-uri" + } + } + } + }, + "$type": "com.atproto.lexicon.schema", + "lexicon": 1, + "description": "A URI with a content-hash fingerprint." +} \ No newline at end of file diff --git a/api/package.json b/api/package.json new file mode 100644 index 0000000..45d4681 --- /dev/null +++ b/api/package.json @@ -0,0 +1,26 @@ +{ + "name": "@atmo-watch/api", + "version": "0.0.1", + "private": true, + "type": "module", + "scripts": { + "dev": "contrail dev --wrangler", + "deploy": "wrangler deploy", + "backfill:dev": "contrail backfill", + "backfill:remote": "contrail backfill --remote", + "lexicons": "contrail lexicons generate --public", + "lexicons:all": "contrail lexicons all --public", + "lexicons:check": "contrail lexicons check --public", + "check": "pnpm run lexicons:check && tsc --noEmit" + }, + "dependencies": { + "@atmo-dev/contrail": "^0.17.0" + }, + "devDependencies": { + "@atcute/lex-cli": "^3.2.1", + "@atcute/lexicons": "^2.0.3", + "@cloudflare/workers-types": "^5.20260804.1", + "typescript": "^6.0.3", + "wrangler": "^4.118.0" + } +} diff --git a/api/src/contrail.config.ts b/api/src/contrail.config.ts new file mode 100644 index 0000000..51b2487 --- /dev/null +++ b/api/src/contrail.config.ts @@ -0,0 +1,58 @@ +import type { ContrailConfig } from '@atmo-dev/contrail'; + +export const config: ContrailConfig = { + namespace: 'watch.atmo', + profiles: ['app.bsky.actor.profile'], + jetstreams: ['wss://jetstream1.us-east.bsky.network'], + orderedSource: { + source: 'jetstream', + epoch: 'api-atmo-watch-primary-2026-08' + }, + notify: true, + serviceAuth: { + audience: 'did:web:api.atmo.watch', + methods: ['notifyOfUpdate'] + }, + maintenance: { optimize: true }, + collections: { + review: { + collection: 'social.popfeed.feed.review', + queryable: { + creativeWorkType: {}, + 'identifiers.tmdbId': {} + }, + relations: { + likes: { + collection: 'like', + field: 'subjectUri', + countDistinct: 'did' + }, + comments: { + collection: 'comment', + field: 'subjectUri' + } + } + }, + like: { + collection: 'social.popfeed.feed.like', + queryable: { + subjectUri: {}, + subjectType: {} + } + }, + list: { + collection: 'social.popfeed.feed.list' + }, + listItem: { + collection: 'social.popfeed.feed.listItem' + }, + comment: { + collection: 'social.popfeed.feed.comment', + queryable: { + subjectUri: {}, + rootUri: {}, + subjectType: {} + } + } + } +}; diff --git a/api/src/lexicon-types/index.ts b/api/src/lexicon-types/index.ts new file mode 100644 index 0000000..28be0d9 --- /dev/null +++ b/api/src/lexicon-types/index.ts @@ -0,0 +1,16 @@ +export * as AppBskyActorProfile from "./types/app/bsky/actor/profile.js"; +export * as ComAtprotoLabelDefs from "./types/com/atproto/label/defs.js"; +export * as ComAtprotoRepoStrongRef from "./types/com/atproto/repo/strongRef.js"; +export * as WatchAtmoCommentGetRecord from "./types/watch/atmo/comment/getRecord.js"; +export * as WatchAtmoCommentListRecords from "./types/watch/atmo/comment/listRecords.js"; +export * as WatchAtmoGetCursor from "./types/watch/atmo/getCursor.js"; +export * as WatchAtmoGetProfile from "./types/watch/atmo/getProfile.js"; +export * as WatchAtmoLikeGetRecord from "./types/watch/atmo/like/getRecord.js"; +export * as WatchAtmoLikeListRecords from "./types/watch/atmo/like/listRecords.js"; +export * as WatchAtmoListGetRecord from "./types/watch/atmo/list/getRecord.js"; +export * as WatchAtmoListListRecords from "./types/watch/atmo/list/listRecords.js"; +export * as WatchAtmoListItemGetRecord from "./types/watch/atmo/listItem/getRecord.js"; +export * as WatchAtmoListItemListRecords from "./types/watch/atmo/listItem/listRecords.js"; +export * as WatchAtmoNotifyOfUpdate from "./types/watch/atmo/notifyOfUpdate.js"; +export * as WatchAtmoReviewGetRecord from "./types/watch/atmo/review/getRecord.js"; +export * as WatchAtmoReviewListRecords from "./types/watch/atmo/review/listRecords.js"; diff --git a/api/src/lexicon-types/types/app/bsky/actor/profile.ts b/api/src/lexicon-types/types/app/bsky/actor/profile.ts new file mode 100644 index 0000000..1b1574e --- /dev/null +++ b/api/src/lexicon-types/types/app/bsky/actor/profile.ts @@ -0,0 +1,98 @@ +import type {} from '@atcute/lexicons'; +import * as v from '@atcute/lexicons/validations'; +import type {} from '@atcute/lexicons/ambient'; +import * as ComAtprotoLabelDefs from "../../../com/atproto/label/defs.js"; +import * as ComAtprotoRepoStrongRef from "../../../com/atproto/repo/strongRef.js"; + +const _mainSchema = /*#__PURE__*/ v.record( + /*#__PURE__*/ v.literal("self"), + /*#__PURE__*/ v.object( + { + "$type": /*#__PURE__*/ v.literal("app.bsky.actor.profile"), + /** + * Small image to be displayed next to posts from account. AKA, 'profile picture' + * @accept image/jpeg, image/png + * @maxSize 1000000 + */ + "avatar": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.constrain( + /*#__PURE__*/ v.blob(), + [ + /*#__PURE__*/ v.blobSize(1000000), + /*#__PURE__*/ v.blobAccept(["image/jpeg", "image/png"]) + ] + )), + /** + * Larger horizontal image to display behind profile view. + * @accept image/jpeg, image/png + * @maxSize 1000000 + */ + "banner": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.constrain( + /*#__PURE__*/ v.blob(), + [ + /*#__PURE__*/ v.blobSize(1000000), + /*#__PURE__*/ v.blobAccept(["image/jpeg", "image/png"]) + ] + )), + "createdAt": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.datetimeString()), + /** + * Free-form profile description text. + * @maxLength 2560 + * @maxGraphemes 256 + */ + "description": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.constrain( + /*#__PURE__*/ v.string(), + [ + /*#__PURE__*/ v.stringLength(0, 2560), + /*#__PURE__*/ v.stringGraphemes(0, 256) + ] + )), + /** + * @maxLength 640 + * @maxGraphemes 64 + */ + "displayName": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.constrain( + /*#__PURE__*/ v.string(), + [ + /*#__PURE__*/ v.stringLength(0, 640), + /*#__PURE__*/ v.stringGraphemes(0, 64) + ] + )), + get "joinedViaStarterPack"() { + return /*#__PURE__*/ v.optional(ComAtprotoRepoStrongRef.mainSchema) + }, + /** + * Self-label values, specific to the Bluesky application, on the overall account. + */ + get "labels"() { + return /*#__PURE__*/ v.optional(/*#__PURE__*/ v.variant([ComAtprotoLabelDefs.selfLabelsSchema])) + }, + get "pinnedPost"() { + return /*#__PURE__*/ v.optional(ComAtprotoRepoStrongRef.mainSchema) + }, + /** + * Free-form pronouns text. + * @maxLength 200 + * @maxGraphemes 20 + */ + "pronouns": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.constrain( + /*#__PURE__*/ v.string(), + [ + /*#__PURE__*/ v.stringLength(0, 200), + /*#__PURE__*/ v.stringGraphemes(0, 20) + ] + )), + "website": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.genericUriString()), + } + ) +); +type main$schematype = typeof _mainSchema; + +export interface mainSchema extends main$schematype {} +export const mainSchema = _mainSchema as mainSchema; + +export interface Main extends v.InferInput {} +declare module '@atcute/lexicons/ambient' { + interface Records { + "app.bsky.actor.profile": mainSchema; + } +} diff --git a/api/src/lexicon-types/types/com/atproto/label/defs.ts b/api/src/lexicon-types/types/com/atproto/label/defs.ts new file mode 100644 index 0000000..1614d05 --- /dev/null +++ b/api/src/lexicon-types/types/com/atproto/label/defs.ts @@ -0,0 +1,184 @@ +import type {} from '@atcute/lexicons'; +import * as v from '@atcute/lexicons/validations'; + +const _labelSchema = /*#__PURE__*/ v.object( + { + "$type": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.literal("com.atproto.label.defs#label")), + /** + * Optionally, CID specifying the specific version of 'uri' resource this label applies to. + */ + "cid": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.cidString()), + /** + * Timestamp when this label was created. + */ + "cts": /*#__PURE__*/ v.datetimeString(), + /** + * Timestamp at which this label expires (no longer applies). + */ + "exp": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.datetimeString()), + /** + * If true, this is a negation label, overwriting a previous label. + */ + "neg": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.boolean()), + /** + * Signature of dag-cbor encoded label. + */ + "sig": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.bytes()), + /** + * DID of the actor who created this label. + */ + "src": /*#__PURE__*/ v.didString(), + /** + * AT URI of the record, repository (account), or other resource that this label applies to. + */ + "uri": /*#__PURE__*/ v.genericUriString(), + /** + * The short string name of the value or type of this label. + * @maxLength 128 + */ + "val": /*#__PURE__*/ v.constrain( + /*#__PURE__*/ v.string(), + [/*#__PURE__*/ v.stringLength(0, 128)] + ), + /** + * The AT Protocol version of the label object. + */ + "ver": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.integer()), + } +); +const _labelValueSchema = /*#__PURE__*/ v.string<"!hide" | "!no-unauthenticated" | "!warn" | "bot" | "graphic-media" | "nudity" | "porn" | "sexual" | (string & {})>(); +const _labelValueDefinitionSchema = /*#__PURE__*/ v.object( + { + "$type": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.literal("com.atproto.label.defs#labelValueDefinition")), + /** + * Does the user need to have adult content enabled in order to configure this label? + */ + "adultOnly": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.boolean()), + /** + * 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. + */ + "blurs": /*#__PURE__*/ v.string<"content" | "media" | "none" | (string & {})>(), + /** + * The default setting for this label. + * @default "warn" + */ + "defaultSetting": /*#__PURE__*/ v.optional( + /*#__PURE__*/ v.string<"hide" | "ignore" | "warn" | (string & {})>(), + "warn" + ), + /** + * The value of the label being defined. Must only include lowercase ascii and the '-' character ([a-z-]+). + * @maxLength 100 + * @maxGraphemes 100 + */ + "identifier": /*#__PURE__*/ v.constrain( + /*#__PURE__*/ v.string(), + [ + /*#__PURE__*/ v.stringLength(0, 100), + /*#__PURE__*/ v.stringGraphemes(0, 100) + ] + ), + get "locales"() { + return /*#__PURE__*/ v.array(labelValueDefinitionStringsSchema) + }, + /** + * How should a client visually convey this label? 'inform' means neutral and informational; 'alert' means negative and warning; 'none' means show nothing. + */ + "severity": /*#__PURE__*/ v.string<"alert" | "inform" | "none" | (string & {})>(), + } +); +const _labelValueDefinitionStringsSchema = /*#__PURE__*/ v.object( + { + "$type": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.literal("com.atproto.label.defs#labelValueDefinitionStrings")), + /** + * A longer description of what the label means and why it might be applied. + * @maxLength 100000 + * @maxGraphemes 10000 + */ + "description": /*#__PURE__*/ v.constrain( + /*#__PURE__*/ v.string(), + [ + /*#__PURE__*/ v.stringLength(0, 100000), + /*#__PURE__*/ v.stringGraphemes(0, 10000) + ] + ), + /** + * The code of the language these strings are written in. + */ + "lang": /*#__PURE__*/ v.languageCodeString(), + /** + * A short human-readable name for the label. + * @maxLength 640 + * @maxGraphemes 64 + */ + "name": /*#__PURE__*/ v.constrain( + /*#__PURE__*/ v.string(), + [ + /*#__PURE__*/ v.stringLength(0, 640), + /*#__PURE__*/ v.stringGraphemes(0, 64) + ] + ), + } +); +const _selfLabelSchema = /*#__PURE__*/ v.object( + { + "$type": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.literal("com.atproto.label.defs#selfLabel")), + /** + * The short string name of the value or type of this label. + * @maxLength 128 + */ + "val": /*#__PURE__*/ v.constrain( + /*#__PURE__*/ v.string(), + [/*#__PURE__*/ v.stringLength(0, 128)] + ), + } +); +const _selfLabelsSchema = /*#__PURE__*/ v.object( + { + "$type": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.literal("com.atproto.label.defs#selfLabels")), + /** + * @maxLength 10 + */ + get "values"() { + return /*#__PURE__*/ v.constrain( + /*#__PURE__*/ v.array(selfLabelSchema), + [/*#__PURE__*/ v.arrayLength(0, 10)] + ) + }, + } +); +type label$schematype = typeof _labelSchema; +type labelValue$schematype = typeof _labelValueSchema; +type labelValueDefinition$schematype = typeof _labelValueDefinitionSchema; +type labelValueDefinitionStrings$schematype = typeof _labelValueDefinitionStringsSchema; +type selfLabel$schematype = typeof _selfLabelSchema; +type selfLabels$schematype = typeof _selfLabelsSchema; + +export interface labelSchema extends label$schematype {} + +export interface labelValueSchema extends labelValue$schematype {} + +export interface labelValueDefinitionSchema extends labelValueDefinition$schematype {} + +export interface labelValueDefinitionStringsSchema extends labelValueDefinitionStrings$schematype {} + +export interface selfLabelSchema extends selfLabel$schematype {} + +export interface selfLabelsSchema extends selfLabels$schematype {} +export const labelSchema = _labelSchema as labelSchema; +export const labelValueSchema = _labelValueSchema as labelValueSchema; +export const labelValueDefinitionSchema = _labelValueDefinitionSchema as labelValueDefinitionSchema; +export const labelValueDefinitionStringsSchema = _labelValueDefinitionStringsSchema as labelValueDefinitionStringsSchema; +export const selfLabelSchema = _selfLabelSchema as selfLabelSchema; +export const selfLabelsSchema = _selfLabelsSchema as selfLabelsSchema; + +export interface Label extends v.InferInput {} +export type LabelValue = v.InferInput; + +export interface LabelValueDefinition extends v.InferInput {} + +export interface LabelValueDefinitionStrings extends v.InferInput {} + +export interface SelfLabel extends v.InferInput {} + +export interface SelfLabels extends v.InferInput {} diff --git a/api/src/lexicon-types/types/com/atproto/repo/strongRef.ts b/api/src/lexicon-types/types/com/atproto/repo/strongRef.ts new file mode 100644 index 0000000..020515e --- /dev/null +++ b/api/src/lexicon-types/types/com/atproto/repo/strongRef.ts @@ -0,0 +1,14 @@ +import type {} from '@atcute/lexicons'; +import * as v from '@atcute/lexicons/validations'; + +const _mainSchema = /*#__PURE__*/ v.object({ + "$type": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.literal("com.atproto.repo.strongRef")), + "cid": /*#__PURE__*/ v.cidString(), + "uri": /*#__PURE__*/ v.resourceUriString(), +}); +type main$schematype = typeof _mainSchema; + +export interface mainSchema extends main$schematype {} +export const mainSchema = _mainSchema as mainSchema; + +export interface Main extends v.InferInput {} diff --git a/api/src/lexicon-types/types/watch/atmo/comment/getRecord.ts b/api/src/lexicon-types/types/watch/atmo/comment/getRecord.ts new file mode 100644 index 0000000..06285c0 --- /dev/null +++ b/api/src/lexicon-types/types/watch/atmo/comment/getRecord.ts @@ -0,0 +1,72 @@ +import type {} from '@atcute/lexicons'; +import * as v from '@atcute/lexicons/validations'; +import type {} from '@atcute/lexicons/ambient'; +import * as AppBskyActorProfile from "../../../app/bsky/actor/profile.js"; + +const _mainSchema = /*#__PURE__*/ v.query( + "watch.atmo.comment.getRecord", + { + "params": /*#__PURE__*/ v.object( + { + /** + * Include indexed profile and identity information + */ + "profiles": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.boolean()), + /** + * AT URI of the record + */ + "uri": /*#__PURE__*/ v.resourceUriString(), + } + ), + "output": { + "type": "lex", + "schema": /*#__PURE__*/ v.object( + { + "cid": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.cidString()), + "collection": /*#__PURE__*/ v.nsidString(), + "did": /*#__PURE__*/ v.didString(), + get "profiles"() { + return /*#__PURE__*/ v.optional(/*#__PURE__*/ v.array(profileEntrySchema)) + }, + "rkey": /*#__PURE__*/ v.string(), + "time_us": /*#__PURE__*/ v.integer(), + "uri": /*#__PURE__*/ v.resourceUriString(), + "value": /*#__PURE__*/ v.unknown(), + } + ), + } + } +); +const _profileEntrySchema = /*#__PURE__*/ v.object( + { + "$type": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.literal("watch.atmo.comment.getRecord#profileEntry")), + "cid": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.cidString()), + "collection": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.nsidString()), + "did": /*#__PURE__*/ v.didString(), + "handle": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), + "rkey": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), + "uri": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.resourceUriString()), + get "value"() { + return /*#__PURE__*/ v.optional(AppBskyActorProfile.mainSchema) + }, + } +); +type main$schematype = typeof _mainSchema; +type profileEntry$schematype = typeof _profileEntrySchema; + +export interface mainSchema extends main$schematype {} + +export interface profileEntrySchema extends profileEntry$schematype {} +export const mainSchema = _mainSchema as mainSchema; +export const profileEntrySchema = _profileEntrySchema as profileEntrySchema; + +export interface ProfileEntry extends v.InferInput {} + +export interface $params extends v.InferInput {} + +export interface $output extends v.InferXRPCBodyInput {} +declare module '@atcute/lexicons/ambient' { + interface XRPCQueries { + "watch.atmo.comment.getRecord": mainSchema; + } +} diff --git a/api/src/lexicon-types/types/watch/atmo/comment/listRecords.ts b/api/src/lexicon-types/types/watch/atmo/comment/listRecords.ts new file mode 100644 index 0000000..c8891e3 --- /dev/null +++ b/api/src/lexicon-types/types/watch/atmo/comment/listRecords.ts @@ -0,0 +1,98 @@ +import type {} from '@atcute/lexicons'; +import * as v from '@atcute/lexicons/validations'; +import type {} from '@atcute/lexicons/ambient'; +import * as AppBskyActorProfile from "../../../app/bsky/actor/profile.js"; + +const _mainSchema = /*#__PURE__*/ v.query( + "watch.atmo.comment.listRecords", + { + "params": /*#__PURE__*/ v.object( + { + /** + * Filter by an indexed DID or cached handle + */ + "actor": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.actorIdentifierString()), + "cursor": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), + /** + * @minimum 1 + * @maximum 200 + * @default 50 + */ + "limit": /*#__PURE__*/ v.optional( + /*#__PURE__*/ v.constrain( + /*#__PURE__*/ v.integer(), + [/*#__PURE__*/ v.integerRange(1, 200)] + ), + 50 + ), + /** + * Include indexed profile and identity information + */ + "profiles": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.boolean()), + } + ), + "output": { + "type": "lex", + "schema": /*#__PURE__*/ v.object( + { + "cursor": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), + get "profiles"() { + return /*#__PURE__*/ v.optional(/*#__PURE__*/ v.array(profileEntrySchema)) + }, + get "records"() { + return /*#__PURE__*/ v.array(recordSchema) + }, + } + ), + } + } +); +const _profileEntrySchema = /*#__PURE__*/ v.object( + { + "$type": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.literal("watch.atmo.comment.listRecords#profileEntry")), + "cid": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.cidString()), + "collection": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.nsidString()), + "did": /*#__PURE__*/ v.didString(), + "handle": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), + "rkey": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), + "uri": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.resourceUriString()), + get "value"() { + return /*#__PURE__*/ v.optional(AppBskyActorProfile.mainSchema) + }, + } +); +const _recordSchema = /*#__PURE__*/ v.object({ + "$type": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.literal("watch.atmo.comment.listRecords#record")), + "cid": /*#__PURE__*/ v.cidString(), + "collection": /*#__PURE__*/ v.nsidString(), + "did": /*#__PURE__*/ v.didString(), + "rkey": /*#__PURE__*/ v.string(), + "time_us": /*#__PURE__*/ v.integer(), + "uri": /*#__PURE__*/ v.resourceUriString(), + "value": /*#__PURE__*/ v.unknown(), +}); +type main$schematype = typeof _mainSchema; +type profileEntry$schematype = typeof _profileEntrySchema; +type record$schematype = typeof _recordSchema; + +export interface mainSchema extends main$schematype {} + +export interface profileEntrySchema extends profileEntry$schematype {} + +export interface recordSchema extends record$schematype {} +export const mainSchema = _mainSchema as mainSchema; +export const profileEntrySchema = _profileEntrySchema as profileEntrySchema; +export const recordSchema = _recordSchema as recordSchema; + +export interface ProfileEntry extends v.InferInput {} + +export interface Record extends v.InferInput {} + +export interface $params extends v.InferInput {} + +export interface $output extends v.InferXRPCBodyInput {} +declare module '@atcute/lexicons/ambient' { + interface XRPCQueries { + "watch.atmo.comment.listRecords": mainSchema; + } +} diff --git a/api/src/lexicon-types/types/watch/atmo/getCursor.ts b/api/src/lexicon-types/types/watch/atmo/getCursor.ts new file mode 100644 index 0000000..03a1b6d --- /dev/null +++ b/api/src/lexicon-types/types/watch/atmo/getCursor.ts @@ -0,0 +1,47 @@ +import type {} from '@atcute/lexicons'; +import * as v from '@atcute/lexicons/validations'; +import type {} from '@atcute/lexicons/ambient'; + +const _mainSchema = /*#__PURE__*/ v.query( + "watch.atmo.getCursor", + { + "params": null, + "output": { + "type": "lex", + "schema": /*#__PURE__*/ v.object( + { + get "position"() { + return /*#__PURE__*/ v.optional(sourcePositionSchema) + }, + "updatedAt": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.integer()), + "updatedAtDate": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.datetimeString()), + } + ), + } + } +); +const _sourcePositionSchema = /*#__PURE__*/ v.object({ + "$type": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.literal("watch.atmo.getCursor#sourcePosition")), + "cursor": /*#__PURE__*/ v.string(), + "epoch": /*#__PURE__*/ v.string(), + "source": /*#__PURE__*/ v.string(), +}); +type main$schematype = typeof _mainSchema; +type sourcePosition$schematype = typeof _sourcePositionSchema; + +export interface mainSchema extends main$schematype {} + +export interface sourcePositionSchema extends sourcePosition$schematype {} +export const mainSchema = _mainSchema as mainSchema; +export const sourcePositionSchema = _sourcePositionSchema as sourcePositionSchema; + +export interface SourcePosition extends v.InferInput {} + +export interface $params {} + +export interface $output extends v.InferXRPCBodyInput {} +declare module '@atcute/lexicons/ambient' { + interface XRPCQueries { + "watch.atmo.getCursor": mainSchema; + } +} diff --git a/api/src/lexicon-types/types/watch/atmo/getProfile.ts b/api/src/lexicon-types/types/watch/atmo/getProfile.ts new file mode 100644 index 0000000..34c071c --- /dev/null +++ b/api/src/lexicon-types/types/watch/atmo/getProfile.ts @@ -0,0 +1,56 @@ +import type {} from '@atcute/lexicons'; +import * as v from '@atcute/lexicons/validations'; +import type {} from '@atcute/lexicons/ambient'; +import * as AppBskyActorProfile from "../../app/bsky/actor/profile.js"; + +const _mainSchema = /*#__PURE__*/ v.query( + "watch.atmo.getProfile", + { + "params": /*#__PURE__*/ v.object({ + "actor": /*#__PURE__*/ v.actorIdentifierString(), + }), + "output": { + "type": "lex", + "schema": /*#__PURE__*/ v.object( + { + get "profiles"() { + return /*#__PURE__*/ v.array(profileEntrySchema) + }, + } + ), + } + } +); +const _profileEntrySchema = /*#__PURE__*/ v.object( + { + "$type": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.literal("watch.atmo.getProfile#profileEntry")), + "cid": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.cidString()), + "collection": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.nsidString()), + "did": /*#__PURE__*/ v.didString(), + "handle": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), + "rkey": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), + "uri": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.resourceUriString()), + get "value"() { + return /*#__PURE__*/ v.optional(AppBskyActorProfile.mainSchema) + }, + } +); +type main$schematype = typeof _mainSchema; +type profileEntry$schematype = typeof _profileEntrySchema; + +export interface mainSchema extends main$schematype {} + +export interface profileEntrySchema extends profileEntry$schematype {} +export const mainSchema = _mainSchema as mainSchema; +export const profileEntrySchema = _profileEntrySchema as profileEntrySchema; + +export interface ProfileEntry extends v.InferInput {} + +export interface $params extends v.InferInput {} + +export interface $output extends v.InferXRPCBodyInput {} +declare module '@atcute/lexicons/ambient' { + interface XRPCQueries { + "watch.atmo.getProfile": mainSchema; + } +} diff --git a/api/src/lexicon-types/types/watch/atmo/like/getRecord.ts b/api/src/lexicon-types/types/watch/atmo/like/getRecord.ts new file mode 100644 index 0000000..4b6ff1b --- /dev/null +++ b/api/src/lexicon-types/types/watch/atmo/like/getRecord.ts @@ -0,0 +1,72 @@ +import type {} from '@atcute/lexicons'; +import * as v from '@atcute/lexicons/validations'; +import type {} from '@atcute/lexicons/ambient'; +import * as AppBskyActorProfile from "../../../app/bsky/actor/profile.js"; + +const _mainSchema = /*#__PURE__*/ v.query( + "watch.atmo.like.getRecord", + { + "params": /*#__PURE__*/ v.object( + { + /** + * Include indexed profile and identity information + */ + "profiles": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.boolean()), + /** + * AT URI of the record + */ + "uri": /*#__PURE__*/ v.resourceUriString(), + } + ), + "output": { + "type": "lex", + "schema": /*#__PURE__*/ v.object( + { + "cid": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.cidString()), + "collection": /*#__PURE__*/ v.nsidString(), + "did": /*#__PURE__*/ v.didString(), + get "profiles"() { + return /*#__PURE__*/ v.optional(/*#__PURE__*/ v.array(profileEntrySchema)) + }, + "rkey": /*#__PURE__*/ v.string(), + "time_us": /*#__PURE__*/ v.integer(), + "uri": /*#__PURE__*/ v.resourceUriString(), + "value": /*#__PURE__*/ v.unknown(), + } + ), + } + } +); +const _profileEntrySchema = /*#__PURE__*/ v.object( + { + "$type": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.literal("watch.atmo.like.getRecord#profileEntry")), + "cid": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.cidString()), + "collection": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.nsidString()), + "did": /*#__PURE__*/ v.didString(), + "handle": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), + "rkey": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), + "uri": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.resourceUriString()), + get "value"() { + return /*#__PURE__*/ v.optional(AppBskyActorProfile.mainSchema) + }, + } +); +type main$schematype = typeof _mainSchema; +type profileEntry$schematype = typeof _profileEntrySchema; + +export interface mainSchema extends main$schematype {} + +export interface profileEntrySchema extends profileEntry$schematype {} +export const mainSchema = _mainSchema as mainSchema; +export const profileEntrySchema = _profileEntrySchema as profileEntrySchema; + +export interface ProfileEntry extends v.InferInput {} + +export interface $params extends v.InferInput {} + +export interface $output extends v.InferXRPCBodyInput {} +declare module '@atcute/lexicons/ambient' { + interface XRPCQueries { + "watch.atmo.like.getRecord": mainSchema; + } +} diff --git a/api/src/lexicon-types/types/watch/atmo/like/listRecords.ts b/api/src/lexicon-types/types/watch/atmo/like/listRecords.ts new file mode 100644 index 0000000..56e8ddb --- /dev/null +++ b/api/src/lexicon-types/types/watch/atmo/like/listRecords.ts @@ -0,0 +1,98 @@ +import type {} from '@atcute/lexicons'; +import * as v from '@atcute/lexicons/validations'; +import type {} from '@atcute/lexicons/ambient'; +import * as AppBskyActorProfile from "../../../app/bsky/actor/profile.js"; + +const _mainSchema = /*#__PURE__*/ v.query( + "watch.atmo.like.listRecords", + { + "params": /*#__PURE__*/ v.object( + { + /** + * Filter by an indexed DID or cached handle + */ + "actor": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.actorIdentifierString()), + "cursor": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), + /** + * @minimum 1 + * @maximum 200 + * @default 50 + */ + "limit": /*#__PURE__*/ v.optional( + /*#__PURE__*/ v.constrain( + /*#__PURE__*/ v.integer(), + [/*#__PURE__*/ v.integerRange(1, 200)] + ), + 50 + ), + /** + * Include indexed profile and identity information + */ + "profiles": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.boolean()), + } + ), + "output": { + "type": "lex", + "schema": /*#__PURE__*/ v.object( + { + "cursor": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), + get "profiles"() { + return /*#__PURE__*/ v.optional(/*#__PURE__*/ v.array(profileEntrySchema)) + }, + get "records"() { + return /*#__PURE__*/ v.array(recordSchema) + }, + } + ), + } + } +); +const _profileEntrySchema = /*#__PURE__*/ v.object( + { + "$type": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.literal("watch.atmo.like.listRecords#profileEntry")), + "cid": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.cidString()), + "collection": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.nsidString()), + "did": /*#__PURE__*/ v.didString(), + "handle": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), + "rkey": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), + "uri": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.resourceUriString()), + get "value"() { + return /*#__PURE__*/ v.optional(AppBskyActorProfile.mainSchema) + }, + } +); +const _recordSchema = /*#__PURE__*/ v.object({ + "$type": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.literal("watch.atmo.like.listRecords#record")), + "cid": /*#__PURE__*/ v.cidString(), + "collection": /*#__PURE__*/ v.nsidString(), + "did": /*#__PURE__*/ v.didString(), + "rkey": /*#__PURE__*/ v.string(), + "time_us": /*#__PURE__*/ v.integer(), + "uri": /*#__PURE__*/ v.resourceUriString(), + "value": /*#__PURE__*/ v.unknown(), +}); +type main$schematype = typeof _mainSchema; +type profileEntry$schematype = typeof _profileEntrySchema; +type record$schematype = typeof _recordSchema; + +export interface mainSchema extends main$schematype {} + +export interface profileEntrySchema extends profileEntry$schematype {} + +export interface recordSchema extends record$schematype {} +export const mainSchema = _mainSchema as mainSchema; +export const profileEntrySchema = _profileEntrySchema as profileEntrySchema; +export const recordSchema = _recordSchema as recordSchema; + +export interface ProfileEntry extends v.InferInput {} + +export interface Record extends v.InferInput {} + +export interface $params extends v.InferInput {} + +export interface $output extends v.InferXRPCBodyInput {} +declare module '@atcute/lexicons/ambient' { + interface XRPCQueries { + "watch.atmo.like.listRecords": mainSchema; + } +} diff --git a/api/src/lexicon-types/types/watch/atmo/list/getRecord.ts b/api/src/lexicon-types/types/watch/atmo/list/getRecord.ts new file mode 100644 index 0000000..f504781 --- /dev/null +++ b/api/src/lexicon-types/types/watch/atmo/list/getRecord.ts @@ -0,0 +1,72 @@ +import type {} from '@atcute/lexicons'; +import * as v from '@atcute/lexicons/validations'; +import type {} from '@atcute/lexicons/ambient'; +import * as AppBskyActorProfile from "../../../app/bsky/actor/profile.js"; + +const _mainSchema = /*#__PURE__*/ v.query( + "watch.atmo.list.getRecord", + { + "params": /*#__PURE__*/ v.object( + { + /** + * Include indexed profile and identity information + */ + "profiles": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.boolean()), + /** + * AT URI of the record + */ + "uri": /*#__PURE__*/ v.resourceUriString(), + } + ), + "output": { + "type": "lex", + "schema": /*#__PURE__*/ v.object( + { + "cid": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.cidString()), + "collection": /*#__PURE__*/ v.nsidString(), + "did": /*#__PURE__*/ v.didString(), + get "profiles"() { + return /*#__PURE__*/ v.optional(/*#__PURE__*/ v.array(profileEntrySchema)) + }, + "rkey": /*#__PURE__*/ v.string(), + "time_us": /*#__PURE__*/ v.integer(), + "uri": /*#__PURE__*/ v.resourceUriString(), + "value": /*#__PURE__*/ v.unknown(), + } + ), + } + } +); +const _profileEntrySchema = /*#__PURE__*/ v.object( + { + "$type": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.literal("watch.atmo.list.getRecord#profileEntry")), + "cid": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.cidString()), + "collection": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.nsidString()), + "did": /*#__PURE__*/ v.didString(), + "handle": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), + "rkey": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), + "uri": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.resourceUriString()), + get "value"() { + return /*#__PURE__*/ v.optional(AppBskyActorProfile.mainSchema) + }, + } +); +type main$schematype = typeof _mainSchema; +type profileEntry$schematype = typeof _profileEntrySchema; + +export interface mainSchema extends main$schematype {} + +export interface profileEntrySchema extends profileEntry$schematype {} +export const mainSchema = _mainSchema as mainSchema; +export const profileEntrySchema = _profileEntrySchema as profileEntrySchema; + +export interface ProfileEntry extends v.InferInput {} + +export interface $params extends v.InferInput {} + +export interface $output extends v.InferXRPCBodyInput {} +declare module '@atcute/lexicons/ambient' { + interface XRPCQueries { + "watch.atmo.list.getRecord": mainSchema; + } +} diff --git a/api/src/lexicon-types/types/watch/atmo/list/listRecords.ts b/api/src/lexicon-types/types/watch/atmo/list/listRecords.ts new file mode 100644 index 0000000..5fb52ce --- /dev/null +++ b/api/src/lexicon-types/types/watch/atmo/list/listRecords.ts @@ -0,0 +1,98 @@ +import type {} from '@atcute/lexicons'; +import * as v from '@atcute/lexicons/validations'; +import type {} from '@atcute/lexicons/ambient'; +import * as AppBskyActorProfile from "../../../app/bsky/actor/profile.js"; + +const _mainSchema = /*#__PURE__*/ v.query( + "watch.atmo.list.listRecords", + { + "params": /*#__PURE__*/ v.object( + { + /** + * Filter by an indexed DID or cached handle + */ + "actor": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.actorIdentifierString()), + "cursor": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), + /** + * @minimum 1 + * @maximum 200 + * @default 50 + */ + "limit": /*#__PURE__*/ v.optional( + /*#__PURE__*/ v.constrain( + /*#__PURE__*/ v.integer(), + [/*#__PURE__*/ v.integerRange(1, 200)] + ), + 50 + ), + /** + * Include indexed profile and identity information + */ + "profiles": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.boolean()), + } + ), + "output": { + "type": "lex", + "schema": /*#__PURE__*/ v.object( + { + "cursor": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), + get "profiles"() { + return /*#__PURE__*/ v.optional(/*#__PURE__*/ v.array(profileEntrySchema)) + }, + get "records"() { + return /*#__PURE__*/ v.array(recordSchema) + }, + } + ), + } + } +); +const _profileEntrySchema = /*#__PURE__*/ v.object( + { + "$type": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.literal("watch.atmo.list.listRecords#profileEntry")), + "cid": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.cidString()), + "collection": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.nsidString()), + "did": /*#__PURE__*/ v.didString(), + "handle": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), + "rkey": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), + "uri": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.resourceUriString()), + get "value"() { + return /*#__PURE__*/ v.optional(AppBskyActorProfile.mainSchema) + }, + } +); +const _recordSchema = /*#__PURE__*/ v.object({ + "$type": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.literal("watch.atmo.list.listRecords#record")), + "cid": /*#__PURE__*/ v.cidString(), + "collection": /*#__PURE__*/ v.nsidString(), + "did": /*#__PURE__*/ v.didString(), + "rkey": /*#__PURE__*/ v.string(), + "time_us": /*#__PURE__*/ v.integer(), + "uri": /*#__PURE__*/ v.resourceUriString(), + "value": /*#__PURE__*/ v.unknown(), +}); +type main$schematype = typeof _mainSchema; +type profileEntry$schematype = typeof _profileEntrySchema; +type record$schematype = typeof _recordSchema; + +export interface mainSchema extends main$schematype {} + +export interface profileEntrySchema extends profileEntry$schematype {} + +export interface recordSchema extends record$schematype {} +export const mainSchema = _mainSchema as mainSchema; +export const profileEntrySchema = _profileEntrySchema as profileEntrySchema; +export const recordSchema = _recordSchema as recordSchema; + +export interface ProfileEntry extends v.InferInput {} + +export interface Record extends v.InferInput {} + +export interface $params extends v.InferInput {} + +export interface $output extends v.InferXRPCBodyInput {} +declare module '@atcute/lexicons/ambient' { + interface XRPCQueries { + "watch.atmo.list.listRecords": mainSchema; + } +} diff --git a/api/src/lexicon-types/types/watch/atmo/listItem/getRecord.ts b/api/src/lexicon-types/types/watch/atmo/listItem/getRecord.ts new file mode 100644 index 0000000..5d1f0fc --- /dev/null +++ b/api/src/lexicon-types/types/watch/atmo/listItem/getRecord.ts @@ -0,0 +1,72 @@ +import type {} from '@atcute/lexicons'; +import * as v from '@atcute/lexicons/validations'; +import type {} from '@atcute/lexicons/ambient'; +import * as AppBskyActorProfile from "../../../app/bsky/actor/profile.js"; + +const _mainSchema = /*#__PURE__*/ v.query( + "watch.atmo.listItem.getRecord", + { + "params": /*#__PURE__*/ v.object( + { + /** + * Include indexed profile and identity information + */ + "profiles": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.boolean()), + /** + * AT URI of the record + */ + "uri": /*#__PURE__*/ v.resourceUriString(), + } + ), + "output": { + "type": "lex", + "schema": /*#__PURE__*/ v.object( + { + "cid": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.cidString()), + "collection": /*#__PURE__*/ v.nsidString(), + "did": /*#__PURE__*/ v.didString(), + get "profiles"() { + return /*#__PURE__*/ v.optional(/*#__PURE__*/ v.array(profileEntrySchema)) + }, + "rkey": /*#__PURE__*/ v.string(), + "time_us": /*#__PURE__*/ v.integer(), + "uri": /*#__PURE__*/ v.resourceUriString(), + "value": /*#__PURE__*/ v.unknown(), + } + ), + } + } +); +const _profileEntrySchema = /*#__PURE__*/ v.object( + { + "$type": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.literal("watch.atmo.listItem.getRecord#profileEntry")), + "cid": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.cidString()), + "collection": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.nsidString()), + "did": /*#__PURE__*/ v.didString(), + "handle": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), + "rkey": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), + "uri": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.resourceUriString()), + get "value"() { + return /*#__PURE__*/ v.optional(AppBskyActorProfile.mainSchema) + }, + } +); +type main$schematype = typeof _mainSchema; +type profileEntry$schematype = typeof _profileEntrySchema; + +export interface mainSchema extends main$schematype {} + +export interface profileEntrySchema extends profileEntry$schematype {} +export const mainSchema = _mainSchema as mainSchema; +export const profileEntrySchema = _profileEntrySchema as profileEntrySchema; + +export interface ProfileEntry extends v.InferInput {} + +export interface $params extends v.InferInput {} + +export interface $output extends v.InferXRPCBodyInput {} +declare module '@atcute/lexicons/ambient' { + interface XRPCQueries { + "watch.atmo.listItem.getRecord": mainSchema; + } +} diff --git a/api/src/lexicon-types/types/watch/atmo/listItem/listRecords.ts b/api/src/lexicon-types/types/watch/atmo/listItem/listRecords.ts new file mode 100644 index 0000000..850a76e --- /dev/null +++ b/api/src/lexicon-types/types/watch/atmo/listItem/listRecords.ts @@ -0,0 +1,98 @@ +import type {} from '@atcute/lexicons'; +import * as v from '@atcute/lexicons/validations'; +import type {} from '@atcute/lexicons/ambient'; +import * as AppBskyActorProfile from "../../../app/bsky/actor/profile.js"; + +const _mainSchema = /*#__PURE__*/ v.query( + "watch.atmo.listItem.listRecords", + { + "params": /*#__PURE__*/ v.object( + { + /** + * Filter by an indexed DID or cached handle + */ + "actor": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.actorIdentifierString()), + "cursor": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), + /** + * @minimum 1 + * @maximum 200 + * @default 50 + */ + "limit": /*#__PURE__*/ v.optional( + /*#__PURE__*/ v.constrain( + /*#__PURE__*/ v.integer(), + [/*#__PURE__*/ v.integerRange(1, 200)] + ), + 50 + ), + /** + * Include indexed profile and identity information + */ + "profiles": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.boolean()), + } + ), + "output": { + "type": "lex", + "schema": /*#__PURE__*/ v.object( + { + "cursor": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), + get "profiles"() { + return /*#__PURE__*/ v.optional(/*#__PURE__*/ v.array(profileEntrySchema)) + }, + get "records"() { + return /*#__PURE__*/ v.array(recordSchema) + }, + } + ), + } + } +); +const _profileEntrySchema = /*#__PURE__*/ v.object( + { + "$type": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.literal("watch.atmo.listItem.listRecords#profileEntry")), + "cid": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.cidString()), + "collection": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.nsidString()), + "did": /*#__PURE__*/ v.didString(), + "handle": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), + "rkey": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), + "uri": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.resourceUriString()), + get "value"() { + return /*#__PURE__*/ v.optional(AppBskyActorProfile.mainSchema) + }, + } +); +const _recordSchema = /*#__PURE__*/ v.object({ + "$type": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.literal("watch.atmo.listItem.listRecords#record")), + "cid": /*#__PURE__*/ v.cidString(), + "collection": /*#__PURE__*/ v.nsidString(), + "did": /*#__PURE__*/ v.didString(), + "rkey": /*#__PURE__*/ v.string(), + "time_us": /*#__PURE__*/ v.integer(), + "uri": /*#__PURE__*/ v.resourceUriString(), + "value": /*#__PURE__*/ v.unknown(), +}); +type main$schematype = typeof _mainSchema; +type profileEntry$schematype = typeof _profileEntrySchema; +type record$schematype = typeof _recordSchema; + +export interface mainSchema extends main$schematype {} + +export interface profileEntrySchema extends profileEntry$schematype {} + +export interface recordSchema extends record$schematype {} +export const mainSchema = _mainSchema as mainSchema; +export const profileEntrySchema = _profileEntrySchema as profileEntrySchema; +export const recordSchema = _recordSchema as recordSchema; + +export interface ProfileEntry extends v.InferInput {} + +export interface Record extends v.InferInput {} + +export interface $params extends v.InferInput {} + +export interface $output extends v.InferXRPCBodyInput {} +declare module '@atcute/lexicons/ambient' { + interface XRPCQueries { + "watch.atmo.listItem.listRecords": mainSchema; + } +} diff --git a/api/src/lexicon-types/types/watch/atmo/notifyOfUpdate.ts b/api/src/lexicon-types/types/watch/atmo/notifyOfUpdate.ts new file mode 100644 index 0000000..0cdbb50 --- /dev/null +++ b/api/src/lexicon-types/types/watch/atmo/notifyOfUpdate.ts @@ -0,0 +1,56 @@ +import type {} from '@atcute/lexicons'; +import * as v from '@atcute/lexicons/validations'; +import type {} from '@atcute/lexicons/ambient'; + +const _mainSchema = /*#__PURE__*/ v.procedure( + "watch.atmo.notifyOfUpdate", + { + "params": null, + "input": { + "type": "lex", + "schema": /*#__PURE__*/ v.object( + { + "uri": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.resourceUriString()), + /** + * @maxLength 25 + */ + "uris": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.constrain( + /*#__PURE__*/ v.array(/*#__PURE__*/ v.resourceUriString()), + [/*#__PURE__*/ v.arrayLength(0, 25)] + )), + } + ), + }, + "output": { + "type": "lex", + "schema": /*#__PURE__*/ v.object( + { + /** + * @minimum 0 + */ + "deleted": /*#__PURE__*/ v.integer(), + "errors": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.array(/*#__PURE__*/ v.string())), + /** + * @minimum 0 + */ + "indexed": /*#__PURE__*/ v.integer(), + } + ), + } + } +); +type main$schematype = typeof _mainSchema; + +export interface mainSchema extends main$schematype {} +export const mainSchema = _mainSchema as mainSchema; + +export interface $params {} + +export interface $input extends v.InferXRPCBodyInput {} + +export interface $output extends v.InferXRPCBodyInput {} +declare module '@atcute/lexicons/ambient' { + interface XRPCProcedures { + "watch.atmo.notifyOfUpdate": mainSchema; + } +} diff --git a/api/src/lexicon-types/types/watch/atmo/review/getRecord.ts b/api/src/lexicon-types/types/watch/atmo/review/getRecord.ts new file mode 100644 index 0000000..ee23fab --- /dev/null +++ b/api/src/lexicon-types/types/watch/atmo/review/getRecord.ts @@ -0,0 +1,72 @@ +import type {} from '@atcute/lexicons'; +import * as v from '@atcute/lexicons/validations'; +import type {} from '@atcute/lexicons/ambient'; +import * as AppBskyActorProfile from "../../../app/bsky/actor/profile.js"; + +const _mainSchema = /*#__PURE__*/ v.query( + "watch.atmo.review.getRecord", + { + "params": /*#__PURE__*/ v.object( + { + /** + * Include indexed profile and identity information + */ + "profiles": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.boolean()), + /** + * AT URI of the record + */ + "uri": /*#__PURE__*/ v.resourceUriString(), + } + ), + "output": { + "type": "lex", + "schema": /*#__PURE__*/ v.object( + { + "cid": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.cidString()), + "collection": /*#__PURE__*/ v.nsidString(), + "did": /*#__PURE__*/ v.didString(), + get "profiles"() { + return /*#__PURE__*/ v.optional(/*#__PURE__*/ v.array(profileEntrySchema)) + }, + "rkey": /*#__PURE__*/ v.string(), + "time_us": /*#__PURE__*/ v.integer(), + "uri": /*#__PURE__*/ v.resourceUriString(), + "value": /*#__PURE__*/ v.unknown(), + } + ), + } + } +); +const _profileEntrySchema = /*#__PURE__*/ v.object( + { + "$type": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.literal("watch.atmo.review.getRecord#profileEntry")), + "cid": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.cidString()), + "collection": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.nsidString()), + "did": /*#__PURE__*/ v.didString(), + "handle": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), + "rkey": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), + "uri": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.resourceUriString()), + get "value"() { + return /*#__PURE__*/ v.optional(AppBskyActorProfile.mainSchema) + }, + } +); +type main$schematype = typeof _mainSchema; +type profileEntry$schematype = typeof _profileEntrySchema; + +export interface mainSchema extends main$schematype {} + +export interface profileEntrySchema extends profileEntry$schematype {} +export const mainSchema = _mainSchema as mainSchema; +export const profileEntrySchema = _profileEntrySchema as profileEntrySchema; + +export interface ProfileEntry extends v.InferInput {} + +export interface $params extends v.InferInput {} + +export interface $output extends v.InferXRPCBodyInput {} +declare module '@atcute/lexicons/ambient' { + interface XRPCQueries { + "watch.atmo.review.getRecord": mainSchema; + } +} diff --git a/api/src/lexicon-types/types/watch/atmo/review/listRecords.ts b/api/src/lexicon-types/types/watch/atmo/review/listRecords.ts new file mode 100644 index 0000000..6efd1ac --- /dev/null +++ b/api/src/lexicon-types/types/watch/atmo/review/listRecords.ts @@ -0,0 +1,114 @@ +import type {} from '@atcute/lexicons'; +import * as v from '@atcute/lexicons/validations'; +import type {} from '@atcute/lexicons/ambient'; +import * as AppBskyActorProfile from "../../../app/bsky/actor/profile.js"; + +const _mainSchema = /*#__PURE__*/ v.query( + "watch.atmo.review.listRecords", + { + "params": /*#__PURE__*/ v.object( + { + /** + * Filter by an indexed DID or cached handle + */ + "actor": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.actorIdentifierString()), + /** + * Filter by creativeWorkType + */ + "creativeWorkType": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), + "cursor": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), + /** + * Filter by identifiers.tmdbId + */ + "identifiersTmdbId": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), + /** + * @minimum 1 + * @maximum 200 + * @default 50 + */ + "limit": /*#__PURE__*/ v.optional( + /*#__PURE__*/ v.constrain( + /*#__PURE__*/ v.integer(), + [/*#__PURE__*/ v.integerRange(1, 200)] + ), + 50 + ), + /** + * Sort direction + */ + "order": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string<"asc" | "desc" | (string & {})>()), + /** + * Include indexed profile and identity information + */ + "profiles": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.boolean()), + /** + * Field to sort by (default: time_us) + */ + "sort": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string<"creativeWorkType" | "identifiersTmdbId" | (string & {})>()), + } + ), + "output": { + "type": "lex", + "schema": /*#__PURE__*/ v.object( + { + "cursor": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), + get "profiles"() { + return /*#__PURE__*/ v.optional(/*#__PURE__*/ v.array(profileEntrySchema)) + }, + get "records"() { + return /*#__PURE__*/ v.array(recordSchema) + }, + } + ), + } + } +); +const _profileEntrySchema = /*#__PURE__*/ v.object( + { + "$type": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.literal("watch.atmo.review.listRecords#profileEntry")), + "cid": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.cidString()), + "collection": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.nsidString()), + "did": /*#__PURE__*/ v.didString(), + "handle": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), + "rkey": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), + "uri": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.resourceUriString()), + get "value"() { + return /*#__PURE__*/ v.optional(AppBskyActorProfile.mainSchema) + }, + } +); +const _recordSchema = /*#__PURE__*/ v.object({ + "$type": /*#__PURE__*/ v.optional(/*#__PURE__*/ v.literal("watch.atmo.review.listRecords#record")), + "cid": /*#__PURE__*/ v.cidString(), + "collection": /*#__PURE__*/ v.nsidString(), + "did": /*#__PURE__*/ v.didString(), + "rkey": /*#__PURE__*/ v.string(), + "time_us": /*#__PURE__*/ v.integer(), + "uri": /*#__PURE__*/ v.resourceUriString(), + "value": /*#__PURE__*/ v.unknown(), +}); +type main$schematype = typeof _mainSchema; +type profileEntry$schematype = typeof _profileEntrySchema; +type record$schematype = typeof _recordSchema; + +export interface mainSchema extends main$schematype {} + +export interface profileEntrySchema extends profileEntry$schematype {} + +export interface recordSchema extends record$schematype {} +export const mainSchema = _mainSchema as mainSchema; +export const profileEntrySchema = _profileEntrySchema as profileEntrySchema; +export const recordSchema = _recordSchema as recordSchema; + +export interface ProfileEntry extends v.InferInput {} + +export interface Record extends v.InferInput {} + +export interface $params extends v.InferInput {} + +export interface $output extends v.InferXRPCBodyInput {} +declare module '@atcute/lexicons/ambient' { + interface XRPCQueries { + "watch.atmo.review.listRecords": mainSchema; + } +} diff --git a/api/src/worker.ts b/api/src/worker.ts new file mode 100644 index 0000000..19521bb --- /dev/null +++ b/api/src/worker.ts @@ -0,0 +1,10 @@ +import { createWorker } from '@atmo-dev/contrail/worker'; +import { lexicons } from '../lexicons/generated'; +import { config } from './contrail.config'; + +export default createWorker(config, { + lexicons, + publicService: { + endpoint: 'https://api.atmo.watch' + } +}); diff --git a/api/tsconfig.json b/api/tsconfig.json new file mode 100644 index 0000000..3975d36 --- /dev/null +++ b/api/tsconfig.json @@ -0,0 +1,14 @@ +{ + "compilerOptions": { + "target": "ES2022", + "module": "ES2022", + "moduleResolution": "bundler", + "lib": ["ES2022"], + "types": ["@cloudflare/workers-types"], + "strict": true, + "noEmit": true, + "skipLibCheck": true, + "isolatedModules": true + }, + "include": ["."] +} diff --git a/api/wrangler.jsonc b/api/wrangler.jsonc new file mode 100644 index 0000000..d618631 --- /dev/null +++ b/api/wrangler.jsonc @@ -0,0 +1,26 @@ +{ + "$schema": "node_modules/wrangler/config-schema.json", + "name": "atmo-watch-api", + "main": "src/worker.ts", + "compatibility_date": "2026-08-15", + "observability": { + "enabled": true + }, + "routes": [ + { + "pattern": "api.atmo.watch", + "custom_domain": true + } + ], + "d1_databases": [ + { + "binding": "DB", + "database_name": "atmo-watch-contrail-g20260815", + // Replace this after creating the production D1 database. + "database_id": "00000000-0000-0000-0000-000000000000" + } + ], + "triggers": { + "crons": ["*/1 * * * *"] + } +} diff --git a/eslint.config.js b/eslint.config.js index e46c5b5..4cf492f 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -2,7 +2,7 @@ import prettier from 'eslint-config-prettier'; import path from 'node:path'; import js from '@eslint/js'; import svelte from 'eslint-plugin-svelte'; -import { defineConfig, includeIgnoreFile } from 'eslint/config'; +import { defineConfig, globalIgnores, includeIgnoreFile } from 'eslint/config'; import globals from 'globals'; import ts from 'typescript-eslint'; @@ -10,6 +10,7 @@ const gitignorePath = path.resolve(import.meta.dirname, '.gitignore'); export default defineConfig( includeIgnoreFile(gitignorePath), + globalIgnores(['api/lex.config.js', 'api/lexicons/**', 'api/src/lexicon-types/**']), js.configs.recommended, ts.configs.recommended, svelte.configs.recommended, @@ -20,7 +21,7 @@ export default defineConfig( rules: { // typescript-eslint strongly recommend that you do not use the no-undef lint rule on TypeScript projects. // see: https://typescript-eslint.io/troubleshooting/faqs/eslint/#i-get-errors-from-the-no-undef-rule-about-global-variables-not-being-defined-even-though-there-are-no-typescript-errors - "no-undef": 'off' + 'no-undef': 'off' } }, { diff --git a/package.json b/package.json index 04ee4d5..3c6fee6 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,9 @@ "dev": "vite dev", "build": "vite build", "preview": "vite preview", + "api:dev": "pnpm --dir api dev", + "api:check": "pnpm --dir api check", + "api:deploy": "pnpm --dir api deploy", "prepare": "svelte-kit sync || echo ''", "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch", @@ -56,6 +59,7 @@ "@foxui/core": "^0.9.1", "@foxui/social": "^0.8.10", "@lorenzopant/tmdb": "^1.25.3", + "@lucide/svelte": "^1.31.0", "@svelte-atproto/oauth": "^0.3.0", "add": "^2.0.9", "bits-ui": "^2.18.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c5d7fa0..5f43144 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -19,28 +19,31 @@ importers: version: 2.0.3 '@atmo-dev/contrail': specifier: ^0.17.0 - version: 0.17.0(@atcute/identity@2.0.2(@atcute/lexicons@2.0.3)(typescript@6.0.3))(prettier@3.9.6)(typescript@6.0.3) + version: 0.17.0(@atcute/identity@2.0.2(@atcute/lexicons@2.0.3)(typescript@6.0.3))(prettier@3.9.6)(typescript@6.0.3)(wrangler@4.123.0(@cloudflare/workers-types@5.20260815.1)) '@ethercorps/sveltekit-og': specifier: ^4.3.0 - version: 4.3.0(@sveltejs/kit@2.70.2(@sveltejs/vite-plugin-svelte@7.3.0(svelte@5.56.9(@typescript-eslint/types@8.67.0))(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0))(typescript@6.0.3)(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0))) + version: 4.3.0(@sveltejs/kit@2.70.2(@sveltejs/vite-plugin-svelte@7.3.0(svelte@5.56.9(@typescript-eslint/types@8.67.0))(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0))(typescript@6.0.3)(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0))) '@foxui/core': specifier: ^0.9.1 - version: 0.9.1(@internationalized/date@3.12.3)(@sveltejs/kit@2.70.2(@sveltejs/vite-plugin-svelte@7.3.0(svelte@5.56.9(@typescript-eslint/types@8.67.0))(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0))(typescript@6.0.3)(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0))(tailwindcss@4.3.3) + version: 0.9.1(@internationalized/date@3.12.3)(@sveltejs/kit@2.70.2(@sveltejs/vite-plugin-svelte@7.3.0(svelte@5.56.9(@typescript-eslint/types@8.67.0))(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0))(typescript@6.0.3)(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0))(tailwindcss@4.3.3) '@foxui/social': specifier: ^0.8.10 - version: 0.8.10(@atcute/lexicons@2.0.3)(@internationalized/date@3.12.3)(@sveltejs/kit@2.70.2(@sveltejs/vite-plugin-svelte@7.3.0(svelte@5.56.9(@typescript-eslint/types@8.67.0))(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0))(typescript@6.0.3)(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0)))(@tiptap/extension-code-block@3.30.1(@tiptap/core@3.30.1(@tiptap/pm@3.30.1))(@tiptap/pm@3.30.1))(@tiptap/extensions@3.30.1(@tiptap/core@3.30.1(@tiptap/pm@3.30.1))(@tiptap/pm@3.30.1))(highlight.js@11.11.2)(svelte@5.56.9(@typescript-eslint/types@8.67.0))(tailwindcss@4.3.3) + version: 0.8.10(@atcute/lexicons@2.0.3)(@internationalized/date@3.12.3)(@sveltejs/kit@2.70.2(@sveltejs/vite-plugin-svelte@7.3.0(svelte@5.56.9(@typescript-eslint/types@8.67.0))(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0))(typescript@6.0.3)(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)))(@tiptap/extension-code-block@3.30.1(@tiptap/core@3.30.1(@tiptap/pm@3.30.1))(@tiptap/pm@3.30.1))(@tiptap/extensions@3.30.1(@tiptap/core@3.30.1(@tiptap/pm@3.30.1))(@tiptap/pm@3.30.1))(highlight.js@11.11.2)(svelte@5.56.9(@typescript-eslint/types@8.67.0))(tailwindcss@4.3.3) '@lorenzopant/tmdb': specifier: ^1.25.3 version: 1.25.3 + '@lucide/svelte': + specifier: ^1.31.0 + version: 1.31.0(svelte@5.56.9(@typescript-eslint/types@8.67.0)) '@svelte-atproto/oauth': specifier: ^0.3.0 - version: 0.3.0(@atcute/identity@2.0.2(@atcute/lexicons@2.0.3)(typescript@6.0.3))(@sveltejs/kit@2.70.2(@sveltejs/vite-plugin-svelte@7.3.0(svelte@5.56.9(@typescript-eslint/types@8.67.0))(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0))(typescript@6.0.3)(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0))(typescript@6.0.3) + version: 0.3.0(@atcute/identity@2.0.2(@atcute/lexicons@2.0.3)(typescript@6.0.3))(@sveltejs/kit@2.70.2(@sveltejs/vite-plugin-svelte@7.3.0(svelte@5.56.9(@typescript-eslint/types@8.67.0))(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0))(typescript@6.0.3)(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0))(typescript@6.0.3) add: specifier: ^2.0.9 version: 2.0.9 bits-ui: specifier: ^2.18.1 - version: 2.18.1(@internationalized/date@3.12.3)(@sveltejs/kit@2.70.2(@sveltejs/vite-plugin-svelte@7.3.0(svelte@5.56.9(@typescript-eslint/types@8.67.0))(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0))(typescript@6.0.3)(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0)) + version: 2.18.1(@internationalized/date@3.12.3)(@sveltejs/kit@2.70.2(@sveltejs/vite-plugin-svelte@7.3.0(svelte@5.56.9(@typescript-eslint/types@8.67.0))(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0))(typescript@6.0.3)(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0)) pnpm: specifier: ^11.21.0 version: 11.21.0 @@ -56,13 +59,13 @@ importers: version: 1.62.1 '@sveltejs/adapter-auto': specifier: ^7.0.1 - version: 7.0.1(@sveltejs/kit@2.70.2(@sveltejs/vite-plugin-svelte@7.3.0(svelte@5.56.9(@typescript-eslint/types@8.67.0))(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0))(typescript@6.0.3)(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0))) + version: 7.0.1(@sveltejs/kit@2.70.2(@sveltejs/vite-plugin-svelte@7.3.0(svelte@5.56.9(@typescript-eslint/types@8.67.0))(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0))(typescript@6.0.3)(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0))) '@sveltejs/kit': specifier: ^2.63.0 - version: 2.70.2(@sveltejs/vite-plugin-svelte@7.3.0(svelte@5.56.9(@typescript-eslint/types@8.67.0))(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0))(typescript@6.0.3)(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0)) + version: 2.70.2(@sveltejs/vite-plugin-svelte@7.3.0(svelte@5.56.9(@typescript-eslint/types@8.67.0))(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0))(typescript@6.0.3)(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)) '@sveltejs/vite-plugin-svelte': specifier: ^7.1.2 - version: 7.3.0(svelte@5.56.9(@typescript-eslint/types@8.67.0))(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0)) + version: 7.3.0(svelte@5.56.9(@typescript-eslint/types@8.67.0))(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)) '@tailwindcss/forms': specifier: ^0.5.11 version: 0.5.11(tailwindcss@4.3.3) @@ -71,13 +74,13 @@ importers: version: 0.5.20(tailwindcss@4.3.3) '@tailwindcss/vite': specifier: ^4.3.0 - version: 4.3.3(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0)) + version: 4.3.3(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)) '@types/node': specifier: ^24 version: 24.13.3 '@vitest/browser-playwright': specifier: ^4.1.8 - version: 4.1.10(playwright@1.62.1)(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0))(vitest@4.1.10) + version: 4.1.10(playwright@1.62.1)(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0))(vitest@4.1.10) eslint: specifier: ^10.4.1 version: 10.8.1(jiti@2.7.0) @@ -119,14 +122,36 @@ importers: version: 8.67.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3) vite: specifier: ^8.0.16 - version: 8.2.1(@types/node@24.13.3)(jiti@2.7.0) + version: 8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0) vitest: specifier: ^4.1.8 - version: 4.1.10(@types/node@24.13.3)(@vitest/browser-playwright@4.1.10)(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0)) + version: 4.1.10(@types/node@24.13.3)(@vitest/browser-playwright@4.1.10)(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)) vitest-browser-svelte: specifier: ^2.1.1 version: 2.2.1(svelte@5.56.9(@typescript-eslint/types@8.67.0))(vitest@4.1.10) + api: + dependencies: + '@atmo-dev/contrail': + specifier: ^0.17.0 + version: 0.17.0(@atcute/identity@2.0.2(@atcute/lexicons@2.0.3)(typescript@6.0.3))(prettier@3.9.6)(typescript@6.0.3)(wrangler@4.123.0(@cloudflare/workers-types@5.20260815.1)) + devDependencies: + '@atcute/lex-cli': + specifier: ^3.2.1 + version: 3.2.1(@atcute/cbor@2.3.6(@atcute/cid@2.4.2))(@atcute/cid@2.4.2)(prettier@3.9.6)(typescript@6.0.3) + '@atcute/lexicons': + specifier: ^2.0.3 + version: 2.0.3 + '@cloudflare/workers-types': + specifier: ^5.20260804.1 + version: 5.20260815.1 + typescript: + specifier: ^6.0.3 + version: 6.0.3 + wrangler: + specifier: ^4.118.0 + version: 4.123.0(@cloudflare/workers-types@5.20260815.1) + packages: '@atcute/atproto@3.1.12': @@ -290,6 +315,215 @@ packages: '@blazediff/core@1.9.1': resolution: {integrity: sha512-ehg3jIkYKulZh+8om/O25vkvSsXXwC+skXmyA87FFx6A/45eqOkZsBltMw/TVteb0mloiGT8oGRTcjRAz66zaA==} + '@cloudflare/kv-asset-handler@0.5.0': + resolution: {integrity: sha512-jxQYkj8dSIzc0cD6cMMNdOc1UVjqSqu8BZdor5s8cGjW2I8BjODt/kWPVdY+u9zj3ms75Q5qaZgnxUad83+eAg==} + engines: {node: '>=22.0.0'} + + '@cloudflare/unenv-preset@2.16.1': + resolution: {integrity: sha512-ECxObrMfyTl5bhQf/lZCXwo5G6xX9IAUo+nDMKK4SZ8m4Jvvxp52vilxyySSWh2YTZz8+HQ07qGH/2rEom1vDw==} + peerDependencies: + unenv: 2.0.0-rc.24 + workerd: '>1.20260305.0 <2.0.0-0' + peerDependenciesMeta: + workerd: + optional: true + + '@cloudflare/workerd-darwin-64@1.20260811.1': + resolution: {integrity: sha512-i5jqz+ywtOefr0AJbiAc8qxBLfSim/B0WJG7aW3B+pWnoVfMJdUQvi+BWcFKZJ0MoCci3KadTx6g31VfuEEqpQ==} + engines: {node: '>=16'} + cpu: [x64] + os: [darwin] + + '@cloudflare/workerd-darwin-arm64@1.20260811.1': + resolution: {integrity: sha512-NoOUM/nvaDdm2Onlnz33FikWjtatzulNtvwvy4xs0IrHaTCHwC0c8NwIt6s+AI13FkDs02/vm2I3GTPLCT9+hQ==} + engines: {node: '>=16'} + cpu: [arm64] + os: [darwin] + + '@cloudflare/workerd-linux-64@1.20260811.1': + resolution: {integrity: sha512-sdYq2jL1AD1supa3fsi5O4zTB28wSjvTHj7Migh6/ts8EROPdvrSwv+rdGHhv8HJNAz/wbIAY3wZsi1Rw4uUIg==} + engines: {node: '>=16'} + cpu: [x64] + os: [linux] + + '@cloudflare/workerd-linux-arm64@1.20260811.1': + resolution: {integrity: sha512-RIRv4shbu1kg05sD+DHTpSFCNnb5Dl2SkPDMUykqZa508tkPqe7VVw7gO0Q5msTBGyL0FfFrLuRxwwfA8u5Sow==} + engines: {node: '>=16'} + cpu: [arm64] + os: [linux] + + '@cloudflare/workerd-windows-64@1.20260811.1': + resolution: {integrity: sha512-g6VquwjASlYAibcNW/0E6Zszht4qLkmnXOGwIjjRHl2A0Qz48kVeMcGvyH6eA0G9U3OzZojjYFpP+YeyQmmdjw==} + engines: {node: '>=16'} + cpu: [x64] + os: [win32] + + '@cloudflare/workers-types@5.20260815.1': + resolution: {integrity: sha512-btpW8rEgeJKcxDlBWKxzjLLUHxzUWqXZY8O+DmM6NcSHadUQN5I71z6Q/yAKCTJyGS7adBpXzlsZSFbosLnECQ==} + + '@cspotcode/source-map-support@0.8.1': + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} + + '@emnapi/runtime@1.11.3': + resolution: {integrity: sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==} + + '@esbuild/aix-ppc64@0.28.1': + resolution: {integrity: sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.28.1': + resolution: {integrity: sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.28.1': + resolution: {integrity: sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.28.1': + resolution: {integrity: sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.28.1': + resolution: {integrity: sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.28.1': + resolution: {integrity: sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.28.1': + resolution: {integrity: sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.28.1': + resolution: {integrity: sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.28.1': + resolution: {integrity: sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.28.1': + resolution: {integrity: sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.28.1': + resolution: {integrity: sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.28.1': + resolution: {integrity: sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.28.1': + resolution: {integrity: sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.28.1': + resolution: {integrity: sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.28.1': + resolution: {integrity: sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.28.1': + resolution: {integrity: sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.28.1': + resolution: {integrity: sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.28.1': + resolution: {integrity: sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.28.1': + resolution: {integrity: sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.28.1': + resolution: {integrity: sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.28.1': + resolution: {integrity: sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.28.1': + resolution: {integrity: sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.28.1': + resolution: {integrity: sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.28.1': + resolution: {integrity: sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.28.1': + resolution: {integrity: sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.28.1': + resolution: {integrity: sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + '@eslint-community/eslint-utils@4.10.1': resolution: {integrity: sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -397,6 +631,168 @@ packages: resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} + '@img/colour@1.1.0': + resolution: {integrity: sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==} + engines: {node: '>=18'} + + '@img/sharp-darwin-arm64@0.35.2': + resolution: {integrity: sha512-eEieHsMksAW4IiO5NzauESRl2D2qz3J/kwUxUrSfV06A93eEaRfMpHXyUb1mAqrR7i8U9A0GRqE9pjn6u1Jjpg==} + engines: {node: '>=20.9.0'} + cpu: [arm64] + os: [darwin] + + '@img/sharp-darwin-x64@0.35.2': + resolution: {integrity: sha512-BaktuGPCeHJMARpodR8jK4uKiZrPAy9WrfQW0sdI37clracq8Bp01AYS3SZgi5FS/y5twa9t4+LIuuxQjqRrWw==} + engines: {node: '>=20.9.0'} + cpu: [x64] + os: [darwin] + + '@img/sharp-freebsd-wasm32@0.35.2': + resolution: {integrity: sha512-YoAxdnd8hPUkvLHd3bWY+YA8nw3xM/RyRopYucNsWHVSan8NLVM3X2volsfoRDcXdUJPg6tXahSd7HXPK7lRnw==} + engines: {node: '>=20.9.0'} + os: [freebsd] + + '@img/sharp-libvips-darwin-arm64@1.3.1': + resolution: {integrity: sha512-4V/M3roRMTYjiwZY9IOVQOE8OyeCxFAkYmyZDrZl51uOKjibm3oeEJ4WAmLxutAfzFbC9jqUiPs2gbnGflH+7g==} + cpu: [arm64] + os: [darwin] + + '@img/sharp-libvips-darwin-x64@1.3.1': + resolution: {integrity: sha512-c0/DxItpJv2+dGhgycJBBgotdqruGYDvA79drdh0MD1dFpy7JzJ/PlXwi1H4rFf0eTy8tgbI91aHDnZIceY3jQ==} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-linux-arm64@1.3.1': + resolution: {integrity: sha512-JznefmcK9j1JKPz8AkQDh89kjojubyfOasWBPKfzMIhPwsgDy9evpE/naJTXXXmghS1iFwR8u/kTwh/I2/+GCw==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-arm@1.3.1': + resolution: {integrity: sha512-aGGy9aWzXgHBG7HNyQPWorZthlp7+x6fDRoPAQbGO3ThcttuTyKIx3NuSHb6zb4gBNq6/yNn9f1cy9nFKS/Vmg==} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-ppc64@1.3.1': + resolution: {integrity: sha512-1EkwGNCZk6iWNCMWqrvdJ+r1j0PT1zIz60CNPhYnJlK/zyeWqlsPZIe+ocBVqPF8k/Ssee/NCk+tE9Ryrko6ng==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-riscv64@1.3.1': + resolution: {integrity: sha512-Ilays+w2bXdnxzxtQdmXR62u8o8GYa3eL4+Gr+1KiE4xperMZUslRaVPJwwPkzlHEjGfXAfRVAa/7CYCtSqsBw==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-s390x@1.3.1': + resolution: {integrity: sha512-VfBwVHQTbRoj4XlpA/KLZ7ltgMpz+4WSejFzQ+GnoImjo1PtEJ59QB2qR1xQEeRPYIkNrPIm2L4cICMvz4C2ew==} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-x64@1.3.1': + resolution: {integrity: sha512-+c8ukgwU62DS54nCAjw7keOfHUkmr0B5QHEdcOqRnodF/MNXJbVI8Eopoj4B/0H8Asr65I+A4Amrn7a85/md6A==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linuxmusl-arm64@1.3.1': + resolution: {integrity: sha512-qlKb/pwbkAi1WMsJrYHk7CuDrd12s27U2QnRhFYUoJNrRCmkosMTttuRFat/DDB3IlDm5qE1TJgZ4JDnHX8Ldw==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@img/sharp-libvips-linuxmusl-x64@1.3.1': + resolution: {integrity: sha512-yO21HwoUVLN8Qa+/SBjQLMYwBWAVJjeGPNe+hc0OUeMeifEtJqu5a1c4HayE1nNpDih9y3/KkoltfkDodmKAlg==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@img/sharp-linux-arm64@0.35.2': + resolution: {integrity: sha512-af12Pnd0ZGu2HfP8NayB0kk6eC/lrfbQE6HlR4jD+34wdJ1Vw9TF6TMn6ZvffT+WgqVsl0hRbmNvz2u/23VmwA==} + engines: {node: '>=20.9.0'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@img/sharp-linux-arm@0.35.2': + resolution: {integrity: sha512-SE4kzF2mepn6z+6E7L6lsV8FzuLL6IPQdyX8ZiwROAG/G8td+hP/m7FsFPwidtrF19gvajuC9l6TxAVcsA4S7A==} + engines: {node: '>=20.9.0'} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@img/sharp-linux-ppc64@0.35.2': + resolution: {integrity: sha512-hYSBm7zcNtDCozCxQHYZJiu63b/bXsgRZuOxCIBZsStMM9Vap47iFHdbX4kCvQsblPB/k+clhELpdQJHQLSHvg==} + engines: {node: '>=20.9.0'} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@img/sharp-linux-riscv64@0.35.2': + resolution: {integrity: sha512-qQt0Kc13+Hoan/Awq/qMSQw3L+RI1NCRPgD5cUJ/1WSSmIoysLOc72jlRM3E0OHN9Yr313jgeQ2T+zW+F03QFA==} + engines: {node: '>=20.9.0'} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@img/sharp-linux-s390x@0.35.2': + resolution: {integrity: sha512-E4fLLfRPzDLlEeDaTzI98OFLcv++WL5ChLLMwPoVd0CIoZQqupBSNbOisPL5am9XsbQ9T84+iiMpUvbFtkunbA==} + engines: {node: '>=20.9.0'} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@img/sharp-linux-x64@0.35.2': + resolution: {integrity: sha512-gi0zFJJRLswfCZmHtJdikXPOc5u7qamSOS3NHedLqLd4W8Q0NqjdBr6TTRIgsfFjqfTsHFgdfvJ9LwqSgcHiAA==} + engines: {node: '>=20.9.0'} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@img/sharp-linuxmusl-arm64@0.35.2': + resolution: {integrity: sha512-siWbOW1u6HFnFLrp0waKyW7VEf7jYvcDWdrXEFa8AkdAQgEvuu5Fz8/Y70w9EeqAdwDtfU012BhEHHaDqvQNzg==} + engines: {node: '>=20.9.0'} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@img/sharp-linuxmusl-x64@0.35.2': + resolution: {integrity: sha512-YBqMMcjDi4QGYiSn4vNOYBhmlC4z5AXqkOUUqI2e0AFA4urNv4ESgOgwNl3K+4etQhha0twXlzeF20bbULm9Yg==} + engines: {node: '>=20.9.0'} + cpu: [x64] + os: [linux] + libc: [musl] + + '@img/sharp-wasm32@0.35.2': + resolution: {integrity: sha512-Mrv4JQNYVQ94xH+jzZ9r+gowleN8mv2FTgKT+PI6bx5C0G8TdNYndu161pg2i7uoBwxy2ImPMHrJOM2LZef7Bw==} + engines: {node: '>=20.9.0'} + + '@img/sharp-webcontainers-wasm32@0.35.2': + resolution: {integrity: sha512-QNV27pxs9wpApEiCfvHM1RDoP1w1+2KrUWWDPEhEwg+latvOrfuhWrHWZKwdSFwU6jh3myjw/yOCRsUIuOft3g==} + engines: {node: '>=20.9.0'} + cpu: [wasm32] + + '@img/sharp-win32-arm64@0.35.2': + resolution: {integrity: sha512-BiVRYc/t6/Vl3e1hBx0hugG4oN9Pydf4fgMSpxTQJmwGUg/YoXTWHiFeRymHfCZzifxu4F4rpk/I67D0LQ20wQ==} + engines: {node: '>=20.9.0'} + cpu: [arm64] + os: [win32] + + '@img/sharp-win32-ia32@0.35.2': + resolution: {integrity: sha512-YYEhx9PImCC7T0tI8JDMi4DB9LwLCXCU5OWNYEXAxh5Q1ShKkyC6byxzoBJ3gEFDnH2lQckWuDe70G7mB2XJog==} + engines: {node: ^20.9.0} + cpu: [ia32] + os: [win32] + + '@img/sharp-win32-x64@0.35.2': + resolution: {integrity: sha512-imoOyBcoM/iiUr4J6VPpCNjPnjvP/Gks95898yB8YqoGGYmHYbOyCuNv9FMhFgtaiHFGbHW8bxKqRV6VjtXThQ==} + engines: {node: '>=20.9.0'} + cpu: [x64] + os: [win32] + '@internationalized/date@3.12.3': resolution: {integrity: sha512-fuLX+3ZKLsxI73y8b01EG/WjHb6gE6weCqlfawPO27kBWGMh9G1yH6Csv1uU7/cac9H2GHmOMt6CjmuQ1aia4Q==} @@ -421,6 +817,9 @@ packages: '@jridgewell/trace-mapping@0.3.31': resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + '@jridgewell/trace-mapping@0.3.9': + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + '@lorenzopant/tmdb@1.25.3': resolution: {integrity: sha512-gNv0iKTmMnOg9asx8JhBIMejdiGWXfWMQUVZ1elqFmmVaEPXFZJXYf4FoCS0aACNn3kvJHE9xcP3VtPU/dj5PA==} @@ -465,6 +864,15 @@ packages: '@polka/url@1.0.0-next.29': resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==} + '@poppinss/colors@4.1.6': + resolution: {integrity: sha512-H9xkIdFswbS8n1d6vmRd8+c10t2Qe+rZITbbDHHkQixH5+2x1FDGmi/0K+WgWiqQFKPSlIYB7jlH6Kpfn6Fleg==} + + '@poppinss/dumper@0.6.5': + resolution: {integrity: sha512-NBdYIb90J7LfOI32dOewKI1r7wnkiH6m920puQ3qHUeZkxNkQiFnXVWoE6YtFSv6QOiPPf7ys6i+HWWecDz7sw==} + + '@poppinss/exception@1.2.3': + resolution: {integrity: sha512-dCED+QRChTVatE9ibtoaxc+WkdzOSjYTKi/+uacHWIsfodVfpsueo3+DKpgU5Px8qXjgmXkSvhXvSCz3fnP9lw==} + '@resvg/resvg-wasm@2.6.2': resolution: {integrity: sha512-FqALmHI8D4o6lk/LRWDnhw95z5eO+eAa6ORjVg09YRR7BkcM6oPHU9uyC0gtQG5vpFLvgpeU4+zEAz2H8APHNw==} engines: {node: '>= 10'} @@ -567,6 +975,13 @@ packages: engines: {node: '>= 8.0.0'} hasBin: true + '@sindresorhus/is@7.2.0': + resolution: {integrity: sha512-P1Cz1dWaFfR4IR+U13mqqiGsLFf1KbayybWwdd2vfctdV6hDpUkgCY0nKOLLTMSoRd/jJNjtbqzf13K8DCCXQw==} + engines: {node: '>=18'} + + '@speed-highlight/core@1.2.24': + resolution: {integrity: sha512-qeW2e1l78afw8VhRPfPQ1Gjj+KU5XFQ/OFV5ti6eTa9bruO7mJyZtA4vw0ofqmA3tKCkROE9xLk3VZoeRc98nw==} + '@standard-schema/spec@1.1.0': resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} @@ -1087,6 +1502,9 @@ packages: '@internationalized/date': ^3.8.1 svelte: ^5.33.0 + blake3-wasm@2.1.5: + resolution: {integrity: sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==} + brace-expansion@5.0.9: resolution: {integrity: sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==} engines: {node: 20 || >=22} @@ -1126,6 +1544,10 @@ packages: resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} engines: {node: '>= 0.6'} + cookie@1.1.1: + resolution: {integrity: sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==} + engines: {node: '>=18'} + core-js@3.50.0: resolution: {integrity: sha512-BRWgOLKkFeCgRudR6zrs8p9XJZcE14grzKMMssoYrk6krtuEZ7MTKPIY5RzOnqsEKIR9kst7wNzphttraT+Yqw==} @@ -1202,9 +1624,17 @@ packages: resolution: {integrity: sha512-L1l8TNvomm6UVW5B253AGxQagSQr+vGwhMlrrfRS2qmhx46AMpMVJKQYLvWYbysTMY8VoicOvzHzoHMbyzB+4A==} engines: {node: '>=10.13.0'} + error-stack-parser-es@1.0.5: + resolution: {integrity: sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==} + es-module-lexer@2.3.1: resolution: {integrity: sha512-shc1dbU90Yl/xq1QrC7QRtfcwURZuVRfPhZbDoldJ1cn1gzDvBaBWlv0eFolj5+0znnPJz5TXLxsN77X/12KTA==} + esbuild@0.28.1: + resolution: {integrity: sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==} + engines: {node: '>=18'} + hasBin: true + escape-html@1.0.3: resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} @@ -1634,6 +2064,10 @@ packages: resolution: {integrity: sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==} hasBin: true + miniflare@5.20260811.1-alpha: + resolution: {integrity: sha512-DtOG0BeanIxs2sH0smFvExZD89cBQwGckbHiFkRJrrNAUu3NGClZkUxqu+zy7HYfKBAgq935EMY49vIPm3JVdA==} + engines: {node: '>=22.0.0'} + minimatch@10.2.6: resolution: {integrity: sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==} engines: {node: 18 || 20 || >=22} @@ -1719,6 +2153,9 @@ packages: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} + path-to-regexp@6.3.0: + resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} + pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} @@ -1968,6 +2405,10 @@ packages: set-cookie-parser@3.1.2: resolution: {integrity: sha512-5/r/lTwbJ3zQ+qwdUFZYeRNqda7P5HD8zQKqlSjdGt1/S0cjLAphHusj4Y58ahDtWn/g32xrIS58/ikOvwl0Lw==} + sharp@0.35.2: + resolution: {integrity: sha512-FVtFjtBCMiJS6yb5CX7Sop45WFMpeGw6oRKuJnXYgf/f1ms/D7LE/ZUSNxnW7rZ/dbslQWYkoqFHGPaDBtaK4w==} + engines: {node: '>=20.9.0'} + shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -1999,6 +2440,10 @@ packages: style-to-object@1.0.14: resolution: {integrity: sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==} + supports-color@10.2.2: + resolution: {integrity: sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==} + engines: {node: '>=18'} + svelte-check@4.7.6: resolution: {integrity: sha512-t2scM//ZuVbSY/T2w6FSBw1v9s2NEmh/g+sy1lqtosW5ylBV5AF4wFb1Ts9Kf3MbfPDUDJDZ9L436YT0SPTdvw==} engines: {node: '>= 18.0.0'} @@ -2132,6 +2577,13 @@ packages: undici-types@7.18.2: resolution: {integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==} + undici@7.29.0: + resolution: {integrity: sha512-IDxfleLmmbSskfWSUATiN1nfn2rDuvnMOqb5CWR92iIfojA0Ud+ulOAAEQ57LPr9rWmsreUyf5lwyao+7GNNVw==} + engines: {node: '>=20.18.1'} + + unenv@2.0.0-rc.24: + resolution: {integrity: sha512-i7qRCmY42zmCwnYlh9H2SvLEypEFGye5iRmEMKjcGi7zk9UquigRjFtTLz0TYqr0ZGLZhaMHl/foy1bZR+Cwlw==} + unicode-segmenter@0.17.3: resolution: {integrity: sha512-hKZwqBjJDmqNrq1+LjDxck1qLzJFcLLJM2Xq92ORRHOuau6GSHeELmn+uyk6zNH1CK9mogrUJGP9WJCJUQXMAw==} @@ -2290,6 +2742,33 @@ packages: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} + workerd@1.20260811.1: + resolution: {integrity: sha512-kh+FFm55JQ4ssxhHZV9VPdMQq3D1nHxNJgwxMtWGD4dGppJvLySdguTRDKgeNTvgq6heSz+6TTXyPSDGj8Yllw==} + engines: {node: '>=16'} + hasBin: true + + wrangler@4.123.0: + resolution: {integrity: sha512-VXo2I1oa0x9aGAKIFPRSQPqTh0RBY5Ktl44YOhNmsJQFUdJKDA2vVTU6Xj+FC2koll6orJqWZN8jbXVIk9O67Q==} + engines: {node: '>=22.0.0'} + hasBin: true + peerDependencies: + '@cloudflare/workers-types': ^5.20260811.1 + peerDependenciesMeta: + '@cloudflare/workers-types': + optional: true + + ws@8.21.0: + resolution: {integrity: sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + ws@8.21.3: resolution: {integrity: sha512-201TZ/kPWxoPr/OKWjquZR1SWKXcvxdH+e1xrx89b3YbmzLMFCLfnaG1HFIgWzJOEWZ7MvpK++odZufgYR50Rw==} engines: {node: '>=10.0.0'} @@ -2317,6 +2796,12 @@ packages: yoga-layout@3.2.1: resolution: {integrity: sha512-0LPOt3AxKqMdFBZA3HBAt/t/8vIKq7VaQYbuA8WxCgung+p9TVyKRYdpvCb80HcdTN2NkbIKbhNwKUfm3tQywQ==} + youch-core@0.3.3: + resolution: {integrity: sha512-ho7XuGjLaJ2hWHoK8yFnsUGy2Y5uDpqSTq1FkHLK4/oqKtyUU1AFbOOxY4IpC9f0fTLjwYbslUz0Po5BpD1wrA==} + + youch@4.1.0-beta.10: + resolution: {integrity: sha512-rLfVLB4FgQneDr0dv1oddCVZmKjcJ6yX6mS4pU82Mq/Dt9a3cLZQ62pDBL4AUO+uVrCvtWz3ZFUL2HFAFJ/BXQ==} + zimmerframe@1.1.4: resolution: {integrity: sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ==} @@ -2558,7 +3043,7 @@ snapshots: - '@atcute/cid' - typescript - '@atmo-dev/contrail@0.17.0(@atcute/identity@2.0.2(@atcute/lexicons@2.0.3)(typescript@6.0.3))(prettier@3.9.6)(typescript@6.0.3)': + '@atmo-dev/contrail@0.17.0(@atcute/identity@2.0.2(@atcute/lexicons@2.0.3)(typescript@6.0.3))(prettier@3.9.6)(typescript@6.0.3)(wrangler@4.123.0(@cloudflare/workers-types@5.20260815.1))': dependencies: '@atcute/atproto': 4.0.4(@atcute/lexicons@2.0.3) '@atcute/cbor': 2.3.6(@atcute/cid@2.4.2) @@ -2575,6 +3060,8 @@ snapshots: hono: 4.13.2 jiti: 2.7.0 valibot: 1.4.2(typescript@6.0.3) + optionalDependencies: + wrangler: 4.123.0(@cloudflare/workers-types@5.20260815.1) transitivePeerDependencies: - '@atcute/identity' - prettier @@ -2583,6 +3070,118 @@ snapshots: '@blazediff/core@1.9.1': {} + '@cloudflare/kv-asset-handler@0.5.0': {} + + '@cloudflare/unenv-preset@2.16.1(unenv@2.0.0-rc.24)(workerd@1.20260811.1)': + dependencies: + unenv: 2.0.0-rc.24 + optionalDependencies: + workerd: 1.20260811.1 + + '@cloudflare/workerd-darwin-64@1.20260811.1': + optional: true + + '@cloudflare/workerd-darwin-arm64@1.20260811.1': + optional: true + + '@cloudflare/workerd-linux-64@1.20260811.1': + optional: true + + '@cloudflare/workerd-linux-arm64@1.20260811.1': + optional: true + + '@cloudflare/workerd-windows-64@1.20260811.1': + optional: true + + '@cloudflare/workers-types@5.20260815.1': {} + + '@cspotcode/source-map-support@0.8.1': + dependencies: + '@jridgewell/trace-mapping': 0.3.9 + + '@emnapi/runtime@1.11.3': + dependencies: + tslib: 2.8.1 + optional: true + + '@esbuild/aix-ppc64@0.28.1': + optional: true + + '@esbuild/android-arm64@0.28.1': + optional: true + + '@esbuild/android-arm@0.28.1': + optional: true + + '@esbuild/android-x64@0.28.1': + optional: true + + '@esbuild/darwin-arm64@0.28.1': + optional: true + + '@esbuild/darwin-x64@0.28.1': + optional: true + + '@esbuild/freebsd-arm64@0.28.1': + optional: true + + '@esbuild/freebsd-x64@0.28.1': + optional: true + + '@esbuild/linux-arm64@0.28.1': + optional: true + + '@esbuild/linux-arm@0.28.1': + optional: true + + '@esbuild/linux-ia32@0.28.1': + optional: true + + '@esbuild/linux-loong64@0.28.1': + optional: true + + '@esbuild/linux-mips64el@0.28.1': + optional: true + + '@esbuild/linux-ppc64@0.28.1': + optional: true + + '@esbuild/linux-riscv64@0.28.1': + optional: true + + '@esbuild/linux-s390x@0.28.1': + optional: true + + '@esbuild/linux-x64@0.28.1': + optional: true + + '@esbuild/netbsd-arm64@0.28.1': + optional: true + + '@esbuild/netbsd-x64@0.28.1': + optional: true + + '@esbuild/openbsd-arm64@0.28.1': + optional: true + + '@esbuild/openbsd-x64@0.28.1': + optional: true + + '@esbuild/openharmony-arm64@0.28.1': + optional: true + + '@esbuild/sunos-x64@0.28.1': + optional: true + + '@esbuild/win32-arm64@0.28.1': + optional: true + + '@esbuild/win32-ia32@0.28.1': + optional: true + + '@esbuild/win32-x64@0.28.1': + optional: true + '@eslint-community/eslint-utils@4.10.1(eslint@10.8.1(jiti@2.7.0))': dependencies: eslint: 10.8.1(jiti@2.7.0) @@ -2617,10 +3216,10 @@ snapshots: '@eslint/core': 1.2.1 levn: 0.4.1 - '@ethercorps/sveltekit-og@4.3.0(@sveltejs/kit@2.70.2(@sveltejs/vite-plugin-svelte@7.3.0(svelte@5.56.9(@typescript-eslint/types@8.67.0))(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0))(typescript@6.0.3)(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0)))': + '@ethercorps/sveltekit-og@4.3.0(@sveltejs/kit@2.70.2(@sveltejs/vite-plugin-svelte@7.3.0(svelte@5.56.9(@typescript-eslint/types@8.67.0))(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0))(typescript@6.0.3)(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)))': dependencies: '@resvg/resvg-wasm': 2.6.2 - '@sveltejs/kit': 2.70.2(@sveltejs/vite-plugin-svelte@7.3.0(svelte@5.56.9(@typescript-eslint/types@8.67.0))(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0))(typescript@6.0.3)(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0)) + '@sveltejs/kit': 2.70.2(@sveltejs/vite-plugin-svelte@7.3.0(svelte@5.56.9(@typescript-eslint/types@8.67.0))(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0))(typescript@6.0.3)(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)) satori: 0.25.0 satori-html: 0.3.2 std-env: 4.2.0 @@ -2641,14 +3240,14 @@ snapshots: '@fontsource-variable/geist@5.3.0': {} - '@foxui/core@0.9.1(@internationalized/date@3.12.3)(@sveltejs/kit@2.70.2(@sveltejs/vite-plugin-svelte@7.3.0(svelte@5.56.9(@typescript-eslint/types@8.67.0))(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0))(typescript@6.0.3)(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0))(tailwindcss@4.3.3)': + '@foxui/core@0.9.1(@internationalized/date@3.12.3)(@sveltejs/kit@2.70.2(@sveltejs/vite-plugin-svelte@7.3.0(svelte@5.56.9(@typescript-eslint/types@8.67.0))(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0))(typescript@6.0.3)(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0))(tailwindcss@4.3.3)': dependencies: '@fontsource-variable/geist': 5.3.0 '@fontsource-variable/geist-mono': 5.3.0 '@jis3r/icons': 2.9.0(svelte@5.56.9(@typescript-eslint/types@8.67.0)) '@lucide/svelte': 1.31.0(svelte@5.56.9(@typescript-eslint/types@8.67.0)) '@number-flow/svelte': 0.4.2(svelte@5.56.9(@typescript-eslint/types@8.67.0)) - bits-ui: 2.18.1(@internationalized/date@3.12.3)(@sveltejs/kit@2.70.2(@sveltejs/vite-plugin-svelte@7.3.0(svelte@5.56.9(@typescript-eslint/types@8.67.0))(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0))(typescript@6.0.3)(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0)) + bits-ui: 2.18.1(@internationalized/date@3.12.3)(@sveltejs/kit@2.70.2(@sveltejs/vite-plugin-svelte@7.3.0(svelte@5.56.9(@typescript-eslint/types@8.67.0))(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0))(typescript@6.0.3)(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0)) clsx: 2.1.1 dompurify: 3.4.13 mode-watcher: 1.1.0(svelte@5.56.9(@typescript-eslint/types@8.67.0)) @@ -2665,15 +3264,15 @@ snapshots: - react-dom - vue - '@foxui/social@0.8.10(@atcute/lexicons@2.0.3)(@internationalized/date@3.12.3)(@sveltejs/kit@2.70.2(@sveltejs/vite-plugin-svelte@7.3.0(svelte@5.56.9(@typescript-eslint/types@8.67.0))(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0))(typescript@6.0.3)(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0)))(@tiptap/extension-code-block@3.30.1(@tiptap/core@3.30.1(@tiptap/pm@3.30.1))(@tiptap/pm@3.30.1))(@tiptap/extensions@3.30.1(@tiptap/core@3.30.1(@tiptap/pm@3.30.1))(@tiptap/pm@3.30.1))(highlight.js@11.11.2)(svelte@5.56.9(@typescript-eslint/types@8.67.0))(tailwindcss@4.3.3)': + '@foxui/social@0.8.10(@atcute/lexicons@2.0.3)(@internationalized/date@3.12.3)(@sveltejs/kit@2.70.2(@sveltejs/vite-plugin-svelte@7.3.0(svelte@5.56.9(@typescript-eslint/types@8.67.0))(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0))(typescript@6.0.3)(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)))(@tiptap/extension-code-block@3.30.1(@tiptap/core@3.30.1(@tiptap/pm@3.30.1))(@tiptap/pm@3.30.1))(@tiptap/extensions@3.30.1(@tiptap/core@3.30.1(@tiptap/pm@3.30.1))(@tiptap/pm@3.30.1))(highlight.js@11.11.2)(svelte@5.56.9(@typescript-eslint/types@8.67.0))(tailwindcss@4.3.3)': dependencies: '@atcute/bluesky': 3.3.5(@atcute/lexicons@2.0.3) '@atcute/bluesky-richtext-segmenter': 3.0.2 - '@foxui/core': 0.9.1(@internationalized/date@3.12.3)(@sveltejs/kit@2.70.2(@sveltejs/vite-plugin-svelte@7.3.0(svelte@5.56.9(@typescript-eslint/types@8.67.0))(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0))(typescript@6.0.3)(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0))(tailwindcss@4.3.3) - '@foxui/text': 0.8.5(@internationalized/date@3.12.3)(@sveltejs/kit@2.70.2(@sveltejs/vite-plugin-svelte@7.3.0(svelte@5.56.9(@typescript-eslint/types@8.67.0))(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0))(typescript@6.0.3)(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0)))(@tiptap/extension-code-block@3.30.1(@tiptap/core@3.30.1(@tiptap/pm@3.30.1))(@tiptap/pm@3.30.1))(@tiptap/extensions@3.30.1(@tiptap/core@3.30.1(@tiptap/pm@3.30.1))(@tiptap/pm@3.30.1))(highlight.js@11.11.2)(svelte@5.56.9(@typescript-eslint/types@8.67.0))(tailwindcss@4.3.3) - '@foxui/time': 0.8.5(@internationalized/date@3.12.3)(@sveltejs/kit@2.70.2(@sveltejs/vite-plugin-svelte@7.3.0(svelte@5.56.9(@typescript-eslint/types@8.67.0))(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0))(typescript@6.0.3)(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0))(tailwindcss@4.3.3) + '@foxui/core': 0.9.1(@internationalized/date@3.12.3)(@sveltejs/kit@2.70.2(@sveltejs/vite-plugin-svelte@7.3.0(svelte@5.56.9(@typescript-eslint/types@8.67.0))(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0))(typescript@6.0.3)(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0))(tailwindcss@4.3.3) + '@foxui/text': 0.8.5(@internationalized/date@3.12.3)(@sveltejs/kit@2.70.2(@sveltejs/vite-plugin-svelte@7.3.0(svelte@5.56.9(@typescript-eslint/types@8.67.0))(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0))(typescript@6.0.3)(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)))(@tiptap/extension-code-block@3.30.1(@tiptap/core@3.30.1(@tiptap/pm@3.30.1))(@tiptap/pm@3.30.1))(@tiptap/extensions@3.30.1(@tiptap/core@3.30.1(@tiptap/pm@3.30.1))(@tiptap/pm@3.30.1))(highlight.js@11.11.2)(svelte@5.56.9(@typescript-eslint/types@8.67.0))(tailwindcss@4.3.3) + '@foxui/time': 0.8.5(@internationalized/date@3.12.3)(@sveltejs/kit@2.70.2(@sveltejs/vite-plugin-svelte@7.3.0(svelte@5.56.9(@typescript-eslint/types@8.67.0))(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0))(typescript@6.0.3)(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0))(tailwindcss@4.3.3) '@use-gesture/vanilla': 10.3.1 - bits-ui: 2.18.1(@internationalized/date@3.12.3)(@sveltejs/kit@2.70.2(@sveltejs/vite-plugin-svelte@7.3.0(svelte@5.56.9(@typescript-eslint/types@8.67.0))(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0))(typescript@6.0.3)(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0)) + bits-ui: 2.18.1(@internationalized/date@3.12.3)(@sveltejs/kit@2.70.2(@sveltejs/vite-plugin-svelte@7.3.0(svelte@5.56.9(@typescript-eslint/types@8.67.0))(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0))(typescript@6.0.3)(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0)) emoji-picker-element: 1.29.1 hls.js: 1.7.0 is-emoji-supported: 0.0.5 @@ -2691,10 +3290,10 @@ snapshots: - react-dom - vue - '@foxui/text@0.8.5(@internationalized/date@3.12.3)(@sveltejs/kit@2.70.2(@sveltejs/vite-plugin-svelte@7.3.0(svelte@5.56.9(@typescript-eslint/types@8.67.0))(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0))(typescript@6.0.3)(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0)))(@tiptap/extension-code-block@3.30.1(@tiptap/core@3.30.1(@tiptap/pm@3.30.1))(@tiptap/pm@3.30.1))(@tiptap/extensions@3.30.1(@tiptap/core@3.30.1(@tiptap/pm@3.30.1))(@tiptap/pm@3.30.1))(highlight.js@11.11.2)(svelte@5.56.9(@typescript-eslint/types@8.67.0))(tailwindcss@4.3.3)': + '@foxui/text@0.8.5(@internationalized/date@3.12.3)(@sveltejs/kit@2.70.2(@sveltejs/vite-plugin-svelte@7.3.0(svelte@5.56.9(@typescript-eslint/types@8.67.0))(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0))(typescript@6.0.3)(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)))(@tiptap/extension-code-block@3.30.1(@tiptap/core@3.30.1(@tiptap/pm@3.30.1))(@tiptap/pm@3.30.1))(@tiptap/extensions@3.30.1(@tiptap/core@3.30.1(@tiptap/pm@3.30.1))(@tiptap/pm@3.30.1))(highlight.js@11.11.2)(svelte@5.56.9(@typescript-eslint/types@8.67.0))(tailwindcss@4.3.3)': dependencies: '@floating-ui/dom': 1.8.0 - '@foxui/core': 0.9.1(@internationalized/date@3.12.3)(@sveltejs/kit@2.70.2(@sveltejs/vite-plugin-svelte@7.3.0(svelte@5.56.9(@typescript-eslint/types@8.67.0))(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0))(typescript@6.0.3)(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0))(tailwindcss@4.3.3) + '@foxui/core': 0.9.1(@internationalized/date@3.12.3)(@sveltejs/kit@2.70.2(@sveltejs/vite-plugin-svelte@7.3.0(svelte@5.56.9(@typescript-eslint/types@8.67.0))(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0))(typescript@6.0.3)(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0))(tailwindcss@4.3.3) '@tiptap/core': 3.30.1(@tiptap/pm@3.30.1) '@tiptap/extension-bubble-menu': 3.30.1(@tiptap/core@3.30.1(@tiptap/pm@3.30.1))(@tiptap/pm@3.30.1) '@tiptap/extension-code-block-lowlight': 3.30.1(@tiptap/core@3.30.1(@tiptap/pm@3.30.1))(@tiptap/extension-code-block@3.30.1(@tiptap/core@3.30.1(@tiptap/pm@3.30.1))(@tiptap/pm@3.30.1))(@tiptap/pm@3.30.1)(highlight.js@11.11.2)(lowlight@3.3.0) @@ -2714,7 +3313,7 @@ snapshots: '@tiptap/pm': 3.30.1 '@tiptap/starter-kit': 3.30.1 '@tiptap/suggestion': 3.30.1(@floating-ui/dom@1.8.0)(@tiptap/core@3.30.1(@tiptap/pm@3.30.1))(@tiptap/pm@3.30.1) - bits-ui: 2.18.1(@internationalized/date@3.12.3)(@sveltejs/kit@2.70.2(@sveltejs/vite-plugin-svelte@7.3.0(svelte@5.56.9(@typescript-eslint/types@8.67.0))(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0))(typescript@6.0.3)(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0)) + bits-ui: 2.18.1(@internationalized/date@3.12.3)(@sveltejs/kit@2.70.2(@sveltejs/vite-plugin-svelte@7.3.0(svelte@5.56.9(@typescript-eslint/types@8.67.0))(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0))(typescript@6.0.3)(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0)) lowlight: 3.3.0 state: link:@tiptap/pm/state svelte: 5.56.9(@typescript-eslint/types@8.67.0) @@ -2730,11 +3329,11 @@ snapshots: - react-dom - vue - '@foxui/time@0.8.5(@internationalized/date@3.12.3)(@sveltejs/kit@2.70.2(@sveltejs/vite-plugin-svelte@7.3.0(svelte@5.56.9(@typescript-eslint/types@8.67.0))(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0))(typescript@6.0.3)(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0))(tailwindcss@4.3.3)': + '@foxui/time@0.8.5(@internationalized/date@3.12.3)(@sveltejs/kit@2.70.2(@sveltejs/vite-plugin-svelte@7.3.0(svelte@5.56.9(@typescript-eslint/types@8.67.0))(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0))(typescript@6.0.3)(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0))(tailwindcss@4.3.3)': dependencies: - '@foxui/core': 0.9.1(@internationalized/date@3.12.3)(@sveltejs/kit@2.70.2(@sveltejs/vite-plugin-svelte@7.3.0(svelte@5.56.9(@typescript-eslint/types@8.67.0))(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0))(typescript@6.0.3)(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0))(tailwindcss@4.3.3) + '@foxui/core': 0.9.1(@internationalized/date@3.12.3)(@sveltejs/kit@2.70.2(@sveltejs/vite-plugin-svelte@7.3.0(svelte@5.56.9(@typescript-eslint/types@8.67.0))(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0))(typescript@6.0.3)(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0))(tailwindcss@4.3.3) '@number-flow/svelte': 0.4.2(svelte@5.56.9(@typescript-eslint/types@8.67.0)) - bits-ui: 2.18.1(@internationalized/date@3.12.3)(@sveltejs/kit@2.70.2(@sveltejs/vite-plugin-svelte@7.3.0(svelte@5.56.9(@typescript-eslint/types@8.67.0))(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0))(typescript@6.0.3)(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0)) + bits-ui: 2.18.1(@internationalized/date@3.12.3)(@sveltejs/kit@2.70.2(@sveltejs/vite-plugin-svelte@7.3.0(svelte@5.56.9(@typescript-eslint/types@8.67.0))(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0))(typescript@6.0.3)(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0)) svelte: 5.56.9(@typescript-eslint/types@8.67.0) tailwindcss: 4.3.3 transitivePeerDependencies: @@ -2760,6 +3359,112 @@ snapshots: '@humanwhocodes/retry@0.4.3': {} + '@img/colour@1.1.0': {} + + '@img/sharp-darwin-arm64@0.35.2': + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.3.1 + optional: true + + '@img/sharp-darwin-x64@0.35.2': + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.3.1 + optional: true + + '@img/sharp-freebsd-wasm32@0.35.2': + dependencies: + '@img/sharp-wasm32': 0.35.2 + optional: true + + '@img/sharp-libvips-darwin-arm64@1.3.1': + optional: true + + '@img/sharp-libvips-darwin-x64@1.3.1': + optional: true + + '@img/sharp-libvips-linux-arm64@1.3.1': + optional: true + + '@img/sharp-libvips-linux-arm@1.3.1': + optional: true + + '@img/sharp-libvips-linux-ppc64@1.3.1': + optional: true + + '@img/sharp-libvips-linux-riscv64@1.3.1': + optional: true + + '@img/sharp-libvips-linux-s390x@1.3.1': + optional: true + + '@img/sharp-libvips-linux-x64@1.3.1': + optional: true + + '@img/sharp-libvips-linuxmusl-arm64@1.3.1': + optional: true + + '@img/sharp-libvips-linuxmusl-x64@1.3.1': + optional: true + + '@img/sharp-linux-arm64@0.35.2': + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.3.1 + optional: true + + '@img/sharp-linux-arm@0.35.2': + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.3.1 + optional: true + + '@img/sharp-linux-ppc64@0.35.2': + optionalDependencies: + '@img/sharp-libvips-linux-ppc64': 1.3.1 + optional: true + + '@img/sharp-linux-riscv64@0.35.2': + optionalDependencies: + '@img/sharp-libvips-linux-riscv64': 1.3.1 + optional: true + + '@img/sharp-linux-s390x@0.35.2': + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.3.1 + optional: true + + '@img/sharp-linux-x64@0.35.2': + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.3.1 + optional: true + + '@img/sharp-linuxmusl-arm64@0.35.2': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.3.1 + optional: true + + '@img/sharp-linuxmusl-x64@0.35.2': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.3.1 + optional: true + + '@img/sharp-wasm32@0.35.2': + dependencies: + '@emnapi/runtime': 1.11.3 + optional: true + + '@img/sharp-webcontainers-wasm32@0.35.2': + dependencies: + '@img/sharp-wasm32': 0.35.2 + optional: true + + '@img/sharp-win32-arm64@0.35.2': + optional: true + + '@img/sharp-win32-ia32@0.35.2': + optional: true + + '@img/sharp-win32-x64@0.35.2': + optional: true + '@internationalized/date@3.12.3': dependencies: '@swc/helpers': 0.5.23 @@ -2787,6 +3492,11 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping@0.3.9': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + '@lorenzopant/tmdb@1.25.3': {} '@lucide/svelte@1.31.0(svelte@5.56.9(@typescript-eslint/types@8.67.0))': @@ -2823,6 +3533,18 @@ snapshots: '@polka/url@1.0.0-next.29': {} + '@poppinss/colors@4.1.6': + dependencies: + kleur: 4.1.5 + + '@poppinss/dumper@0.6.5': + dependencies: + '@poppinss/colors': 4.1.6 + '@sindresorhus/is': 7.2.0 + supports-color: 10.2.2 + + '@poppinss/exception@1.2.3': {} + '@resvg/resvg-wasm@2.6.2': {} '@rolldown/binding-android-arm64@1.2.4': @@ -2874,9 +3596,13 @@ snapshots: fflate: 0.7.5 string.prototype.codepointat: 0.2.1 + '@sindresorhus/is@7.2.0': {} + + '@speed-highlight/core@1.2.24': {} + '@standard-schema/spec@1.1.0': {} - '@svelte-atproto/oauth@0.3.0(@atcute/identity@2.0.2(@atcute/lexicons@2.0.3)(typescript@6.0.3))(@sveltejs/kit@2.70.2(@sveltejs/vite-plugin-svelte@7.3.0(svelte@5.56.9(@typescript-eslint/types@8.67.0))(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0))(typescript@6.0.3)(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0))(typescript@6.0.3)': + '@svelte-atproto/oauth@0.3.0(@atcute/identity@2.0.2(@atcute/lexicons@2.0.3)(typescript@6.0.3))(@sveltejs/kit@2.70.2(@sveltejs/vite-plugin-svelte@7.3.0(svelte@5.56.9(@typescript-eslint/types@8.67.0))(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0))(typescript@6.0.3)(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0))(typescript@6.0.3)': dependencies: '@atcute/atproto': 4.0.4(@atcute/lexicons@2.0.3) '@atcute/bluesky': 4.0.18(@atcute/lexicons@2.0.3) @@ -2886,7 +3612,7 @@ snapshots: '@atcute/oauth-browser-client': 4.0.1(@atcute/identity-resolver@2.0.1(@atcute/identity@2.0.2(@atcute/lexicons@2.0.3)(typescript@6.0.3))(@atcute/lexicons@2.0.3)(typescript@6.0.3))(@atcute/lexicons@2.0.3)(typescript@6.0.3) '@atcute/oauth-node-client': 2.0.1(@atcute/identity-resolver@2.0.1(@atcute/identity@2.0.2(@atcute/lexicons@2.0.3)(typescript@6.0.3))(@atcute/lexicons@2.0.3)(typescript@6.0.3))(@atcute/lexicons@2.0.3)(typescript@6.0.3) '@atcute/tid': 1.1.4 - '@sveltejs/kit': 2.70.2(@sveltejs/vite-plugin-svelte@7.3.0(svelte@5.56.9(@typescript-eslint/types@8.67.0))(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0))(typescript@6.0.3)(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0)) + '@sveltejs/kit': 2.70.2(@sveltejs/vite-plugin-svelte@7.3.0(svelte@5.56.9(@typescript-eslint/types@8.67.0))(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0))(typescript@6.0.3)(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)) svelte: 5.56.9(@typescript-eslint/types@8.67.0) transitivePeerDependencies: - '@atcute/identity' @@ -2896,15 +3622,15 @@ snapshots: dependencies: acorn: 8.18.0 - '@sveltejs/adapter-auto@7.0.1(@sveltejs/kit@2.70.2(@sveltejs/vite-plugin-svelte@7.3.0(svelte@5.56.9(@typescript-eslint/types@8.67.0))(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0))(typescript@6.0.3)(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0)))': + '@sveltejs/adapter-auto@7.0.1(@sveltejs/kit@2.70.2(@sveltejs/vite-plugin-svelte@7.3.0(svelte@5.56.9(@typescript-eslint/types@8.67.0))(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0))(typescript@6.0.3)(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)))': dependencies: - '@sveltejs/kit': 2.70.2(@sveltejs/vite-plugin-svelte@7.3.0(svelte@5.56.9(@typescript-eslint/types@8.67.0))(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0))(typescript@6.0.3)(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0)) + '@sveltejs/kit': 2.70.2(@sveltejs/vite-plugin-svelte@7.3.0(svelte@5.56.9(@typescript-eslint/types@8.67.0))(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0))(typescript@6.0.3)(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)) - '@sveltejs/kit@2.70.2(@sveltejs/vite-plugin-svelte@7.3.0(svelte@5.56.9(@typescript-eslint/types@8.67.0))(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0))(typescript@6.0.3)(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0))': + '@sveltejs/kit@2.70.2(@sveltejs/vite-plugin-svelte@7.3.0(svelte@5.56.9(@typescript-eslint/types@8.67.0))(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0))(typescript@6.0.3)(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0))': dependencies: '@standard-schema/spec': 1.1.0 '@sveltejs/acorn-typescript': 1.0.13(acorn@8.18.0) - '@sveltejs/vite-plugin-svelte': 7.3.0(svelte@5.56.9(@typescript-eslint/types@8.67.0))(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0)) + '@sveltejs/vite-plugin-svelte': 7.3.0(svelte@5.56.9(@typescript-eslint/types@8.67.0))(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)) '@types/cookie': 0.6.0 acorn: 8.18.0 cookie: 0.6.0 @@ -2916,20 +3642,20 @@ snapshots: set-cookie-parser: 3.1.2 sirv: 3.0.2 svelte: 5.56.9(@typescript-eslint/types@8.67.0) - vite: 8.2.1(@types/node@24.13.3)(jiti@2.7.0) + vite: 8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0) optionalDependencies: typescript: 6.0.3 '@sveltejs/load-config@0.2.3': {} - '@sveltejs/vite-plugin-svelte@7.3.0(svelte@5.56.9(@typescript-eslint/types@8.67.0))(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0))': + '@sveltejs/vite-plugin-svelte@7.3.0(svelte@5.56.9(@typescript-eslint/types@8.67.0))(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0))': dependencies: deepmerge: 4.3.1 magic-string: 1.2.0 obug: 2.1.4 svelte: 5.56.9(@typescript-eslint/types@8.67.0) - vite: 8.2.1(@types/node@24.13.3)(jiti@2.7.0) - vitefu: 1.1.3(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0)) + vite: 8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0) + vitefu: 1.1.3(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)) '@swc/helpers@0.5.23': dependencies: @@ -3006,12 +3732,12 @@ snapshots: postcss-selector-parser: 6.0.10 tailwindcss: 4.3.3 - '@tailwindcss/vite@4.3.3(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0))': + '@tailwindcss/vite@4.3.3(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0))': dependencies: '@tailwindcss/node': 4.3.3 '@tailwindcss/oxide': 4.3.3 tailwindcss: 4.3.3 - vite: 8.2.1(@types/node@24.13.3)(jiti@2.7.0) + vite: 8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0) '@testing-library/svelte-core@1.1.3(svelte@5.56.9(@typescript-eslint/types@8.67.0))': dependencies: @@ -3331,29 +4057,29 @@ snapshots: dependencies: '@use-gesture/core': 10.3.1 - '@vitest/browser-playwright@4.1.10(playwright@1.62.1)(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0))(vitest@4.1.10)': + '@vitest/browser-playwright@4.1.10(playwright@1.62.1)(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0))(vitest@4.1.10)': dependencies: - '@vitest/browser': 4.1.10(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0))(vitest@4.1.10) - '@vitest/mocker': 4.1.10(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0)) + '@vitest/browser': 4.1.10(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0))(vitest@4.1.10) + '@vitest/mocker': 4.1.10(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)) playwright: 1.62.1 tinyrainbow: 3.1.1 - vitest: 4.1.10(@types/node@24.13.3)(@vitest/browser-playwright@4.1.10)(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0)) + vitest: 4.1.10(@types/node@24.13.3)(@vitest/browser-playwright@4.1.10)(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)) transitivePeerDependencies: - bufferutil - msw - utf-8-validate - vite - '@vitest/browser@4.1.10(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0))(vitest@4.1.10)': + '@vitest/browser@4.1.10(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0))(vitest@4.1.10)': dependencies: '@blazediff/core': 1.9.1 - '@vitest/mocker': 4.1.10(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0)) + '@vitest/mocker': 4.1.10(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)) '@vitest/utils': 4.1.10 magic-string: 0.30.21 pngjs: 7.0.0 sirv: 3.0.2 tinyrainbow: 3.1.1 - vitest: 4.1.10(@types/node@24.13.3)(@vitest/browser-playwright@4.1.10)(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0)) + vitest: 4.1.10(@types/node@24.13.3)(@vitest/browser-playwright@4.1.10)(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)) ws: 8.21.3 transitivePeerDependencies: - bufferutil @@ -3370,13 +4096,13 @@ snapshots: chai: 6.2.2 tinyrainbow: 3.1.1 - '@vitest/mocker@4.1.10(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0))': + '@vitest/mocker@4.1.10(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0))': dependencies: '@vitest/spy': 4.1.10 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 8.2.1(@types/node@24.13.3)(jiti@2.7.0) + vite: 8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0) '@vitest/pretty-format@4.1.10': dependencies: @@ -3427,19 +4153,21 @@ snapshots: base64-js@0.0.8: {} - bits-ui@2.18.1(@internationalized/date@3.12.3)(@sveltejs/kit@2.70.2(@sveltejs/vite-plugin-svelte@7.3.0(svelte@5.56.9(@typescript-eslint/types@8.67.0))(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0))(typescript@6.0.3)(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0)): + bits-ui@2.18.1(@internationalized/date@3.12.3)(@sveltejs/kit@2.70.2(@sveltejs/vite-plugin-svelte@7.3.0(svelte@5.56.9(@typescript-eslint/types@8.67.0))(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0))(typescript@6.0.3)(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0)): dependencies: '@floating-ui/core': 1.8.0 '@floating-ui/dom': 1.8.0 '@internationalized/date': 3.12.3 esm-env: 1.2.2 - runed: 0.35.1(@sveltejs/kit@2.70.2(@sveltejs/vite-plugin-svelte@7.3.0(svelte@5.56.9(@typescript-eslint/types@8.67.0))(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0))(typescript@6.0.3)(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0)) + runed: 0.35.1(@sveltejs/kit@2.70.2(@sveltejs/vite-plugin-svelte@7.3.0(svelte@5.56.9(@typescript-eslint/types@8.67.0))(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0))(typescript@6.0.3)(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0)) svelte: 5.56.9(@typescript-eslint/types@8.67.0) - svelte-toolbelt: 0.10.6(@sveltejs/kit@2.70.2(@sveltejs/vite-plugin-svelte@7.3.0(svelte@5.56.9(@typescript-eslint/types@8.67.0))(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0))(typescript@6.0.3)(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0)) + svelte-toolbelt: 0.10.6(@sveltejs/kit@2.70.2(@sveltejs/vite-plugin-svelte@7.3.0(svelte@5.56.9(@typescript-eslint/types@8.67.0))(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0))(typescript@6.0.3)(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0)) tabbable: 6.5.0 transitivePeerDependencies: - '@sveltejs/kit' + blake3-wasm@2.1.5: {} + brace-expansion@5.0.9: dependencies: balanced-match: 4.0.4 @@ -3466,6 +4194,8 @@ snapshots: cookie@0.6.0: {} + cookie@1.1.1: {} + core-js@3.50.0: {} cross-spawn@7.0.6: @@ -3523,8 +4253,39 @@ snapshots: graceful-fs: 4.2.11 tapable: 2.3.3 + error-stack-parser-es@1.0.5: {} + es-module-lexer@2.3.1: {} + esbuild@0.28.1: + optionalDependencies: + '@esbuild/aix-ppc64': 0.28.1 + '@esbuild/android-arm': 0.28.1 + '@esbuild/android-arm64': 0.28.1 + '@esbuild/android-x64': 0.28.1 + '@esbuild/darwin-arm64': 0.28.1 + '@esbuild/darwin-x64': 0.28.1 + '@esbuild/freebsd-arm64': 0.28.1 + '@esbuild/freebsd-x64': 0.28.1 + '@esbuild/linux-arm': 0.28.1 + '@esbuild/linux-arm64': 0.28.1 + '@esbuild/linux-ia32': 0.28.1 + '@esbuild/linux-loong64': 0.28.1 + '@esbuild/linux-mips64el': 0.28.1 + '@esbuild/linux-ppc64': 0.28.1 + '@esbuild/linux-riscv64': 0.28.1 + '@esbuild/linux-s390x': 0.28.1 + '@esbuild/linux-x64': 0.28.1 + '@esbuild/netbsd-arm64': 0.28.1 + '@esbuild/netbsd-x64': 0.28.1 + '@esbuild/openbsd-arm64': 0.28.1 + '@esbuild/openbsd-x64': 0.28.1 + '@esbuild/openharmony-arm64': 0.28.1 + '@esbuild/sunos-x64': 0.28.1 + '@esbuild/win32-arm64': 0.28.1 + '@esbuild/win32-ia32': 0.28.1 + '@esbuild/win32-x64': 0.28.1 + escape-html@1.0.3: {} escape-string-regexp@4.0.0: {} @@ -3880,6 +4641,18 @@ snapshots: mini-svg-data-uri@1.4.4: {} + miniflare@5.20260811.1-alpha: + dependencies: + '@cspotcode/source-map-support': 0.8.1 + sharp: 0.35.2 + undici: 7.29.0 + workerd: 1.20260811.1 + ws: 8.21.0 + youch: 4.1.0-beta.10 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + minimatch@10.2.6: dependencies: brace-expansion: 5.0.9 @@ -3951,6 +4724,8 @@ snapshots: path-key@3.1.1: {} + path-to-regexp@6.3.0: {} + pathe@2.0.3: {} picocolors@1.1.1: {} @@ -4154,14 +4929,14 @@ snapshots: esm-env: 1.2.2 svelte: 5.56.9(@typescript-eslint/types@8.67.0) - runed@0.35.1(@sveltejs/kit@2.70.2(@sveltejs/vite-plugin-svelte@7.3.0(svelte@5.56.9(@typescript-eslint/types@8.67.0))(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0))(typescript@6.0.3)(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0)): + runed@0.35.1(@sveltejs/kit@2.70.2(@sveltejs/vite-plugin-svelte@7.3.0(svelte@5.56.9(@typescript-eslint/types@8.67.0))(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0))(typescript@6.0.3)(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0)): dependencies: dequal: 2.0.3 esm-env: 1.2.2 lz-string: 1.5.0 svelte: 5.56.9(@typescript-eslint/types@8.67.0) optionalDependencies: - '@sveltejs/kit': 2.70.2(@sveltejs/vite-plugin-svelte@7.3.0(svelte@5.56.9(@typescript-eslint/types@8.67.0))(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0))(typescript@6.0.3)(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0)) + '@sveltejs/kit': 2.70.2(@sveltejs/vite-plugin-svelte@7.3.0(svelte@5.56.9(@typescript-eslint/types@8.67.0))(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0))(typescript@6.0.3)(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)) sade@1.8.1: dependencies: @@ -4189,6 +4964,38 @@ snapshots: set-cookie-parser@3.1.2: {} + sharp@0.35.2: + dependencies: + '@img/colour': 1.1.0 + detect-libc: 2.1.2 + semver: 7.8.5 + optionalDependencies: + '@img/sharp-darwin-arm64': 0.35.2 + '@img/sharp-darwin-x64': 0.35.2 + '@img/sharp-freebsd-wasm32': 0.35.2 + '@img/sharp-libvips-darwin-arm64': 1.3.1 + '@img/sharp-libvips-darwin-x64': 1.3.1 + '@img/sharp-libvips-linux-arm': 1.3.1 + '@img/sharp-libvips-linux-arm64': 1.3.1 + '@img/sharp-libvips-linux-ppc64': 1.3.1 + '@img/sharp-libvips-linux-riscv64': 1.3.1 + '@img/sharp-libvips-linux-s390x': 1.3.1 + '@img/sharp-libvips-linux-x64': 1.3.1 + '@img/sharp-libvips-linuxmusl-arm64': 1.3.1 + '@img/sharp-libvips-linuxmusl-x64': 1.3.1 + '@img/sharp-linux-arm': 0.35.2 + '@img/sharp-linux-arm64': 0.35.2 + '@img/sharp-linux-ppc64': 0.35.2 + '@img/sharp-linux-riscv64': 0.35.2 + '@img/sharp-linux-s390x': 0.35.2 + '@img/sharp-linux-x64': 0.35.2 + '@img/sharp-linuxmusl-arm64': 0.35.2 + '@img/sharp-linuxmusl-x64': 0.35.2 + '@img/sharp-webcontainers-wasm32': 0.35.2 + '@img/sharp-win32-arm64': 0.35.2 + '@img/sharp-win32-ia32': 0.35.2 + '@img/sharp-win32-x64': 0.35.2 + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 @@ -4215,6 +5022,8 @@ snapshots: dependencies: inline-style-parser: 0.2.7 + supports-color@10.2.2: {} + svelte-check@4.7.6(picomatch@4.0.5)(svelte@5.56.9(@typescript-eslint/types@8.67.0))(typescript@6.0.3): dependencies: '@jridgewell/trace-mapping': 0.3.31 @@ -4254,10 +5063,10 @@ snapshots: '@tiptap/pm': 3.30.1 svelte: 5.56.9(@typescript-eslint/types@8.67.0) - svelte-toolbelt@0.10.6(@sveltejs/kit@2.70.2(@sveltejs/vite-plugin-svelte@7.3.0(svelte@5.56.9(@typescript-eslint/types@8.67.0))(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0))(typescript@6.0.3)(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0)): + svelte-toolbelt@0.10.6(@sveltejs/kit@2.70.2(@sveltejs/vite-plugin-svelte@7.3.0(svelte@5.56.9(@typescript-eslint/types@8.67.0))(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0))(typescript@6.0.3)(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0)): dependencies: clsx: 2.1.1 - runed: 0.35.1(@sveltejs/kit@2.70.2(@sveltejs/vite-plugin-svelte@7.3.0(svelte@5.56.9(@typescript-eslint/types@8.67.0))(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0))(typescript@6.0.3)(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0)) + runed: 0.35.1(@sveltejs/kit@2.70.2(@sveltejs/vite-plugin-svelte@7.3.0(svelte@5.56.9(@typescript-eslint/types@8.67.0))(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0))(typescript@6.0.3)(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0)) style-to-object: 1.0.14 svelte: 5.56.9(@typescript-eslint/types@8.67.0) transitivePeerDependencies: @@ -4350,6 +5159,12 @@ snapshots: undici-types@7.18.2: {} + undici@7.29.0: {} + + unenv@2.0.0-rc.24: + dependencies: + pathe: 2.0.3 + unicode-segmenter@0.17.3: {} unicode-trie@2.0.0: @@ -4378,7 +5193,7 @@ snapshots: optionalDependencies: typescript: 6.0.3 - vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0): + vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0): dependencies: lightningcss: 1.33.0 picomatch: 4.0.5 @@ -4387,23 +5202,24 @@ snapshots: tinyglobby: 0.2.17 optionalDependencies: '@types/node': 24.13.3 + esbuild: 0.28.1 fsevents: 2.3.3 jiti: 2.7.0 - vitefu@1.1.3(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0)): + vitefu@1.1.3(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)): optionalDependencies: - vite: 8.2.1(@types/node@24.13.3)(jiti@2.7.0) + vite: 8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0) vitest-browser-svelte@2.2.1(svelte@5.56.9(@typescript-eslint/types@8.67.0))(vitest@4.1.10): dependencies: '@testing-library/svelte-core': 1.1.3(svelte@5.56.9(@typescript-eslint/types@8.67.0)) svelte: 5.56.9(@typescript-eslint/types@8.67.0) - vitest: 4.1.10(@types/node@24.13.3)(@vitest/browser-playwright@4.1.10)(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0)) + vitest: 4.1.10(@types/node@24.13.3)(@vitest/browser-playwright@4.1.10)(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)) - vitest@4.1.10(@types/node@24.13.3)(@vitest/browser-playwright@4.1.10)(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0)): + vitest@4.1.10(@types/node@24.13.3)(@vitest/browser-playwright@4.1.10)(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)): dependencies: '@vitest/expect': 4.1.10 - '@vitest/mocker': 4.1.10(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0)) + '@vitest/mocker': 4.1.10(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)) '@vitest/pretty-format': 4.1.10 '@vitest/runner': 4.1.10 '@vitest/snapshot': 4.1.10 @@ -4420,11 +5236,11 @@ snapshots: tinyexec: 1.3.0 tinyglobby: 0.2.17 tinyrainbow: 3.1.1 - vite: 8.2.1(@types/node@24.13.3)(jiti@2.7.0) + vite: 8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 24.13.3 - '@vitest/browser-playwright': 4.1.10(playwright@1.62.1)(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0))(vitest@4.1.10) + '@vitest/browser-playwright': 4.1.10(playwright@1.62.1)(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0))(vitest@4.1.10) transitivePeerDependencies: - msw @@ -4445,6 +5261,33 @@ snapshots: word-wrap@1.2.5: {} + workerd@1.20260811.1: + optionalDependencies: + '@cloudflare/workerd-darwin-64': 1.20260811.1 + '@cloudflare/workerd-darwin-arm64': 1.20260811.1 + '@cloudflare/workerd-linux-64': 1.20260811.1 + '@cloudflare/workerd-linux-arm64': 1.20260811.1 + '@cloudflare/workerd-windows-64': 1.20260811.1 + + wrangler@4.123.0(@cloudflare/workers-types@5.20260815.1): + dependencies: + '@cloudflare/kv-asset-handler': 0.5.0 + '@cloudflare/unenv-preset': 2.16.1(unenv@2.0.0-rc.24)(workerd@1.20260811.1) + blake3-wasm: 2.1.5 + esbuild: 0.28.1 + miniflare: 5.20260811.1-alpha + path-to-regexp: 6.3.0 + unenv: 2.0.0-rc.24 + workerd: 1.20260811.1 + optionalDependencies: + '@cloudflare/workers-types': 5.20260815.1 + fsevents: 2.3.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + ws@8.21.0: {} + ws@8.21.3: {} yaml@1.10.3: {} @@ -4455,4 +5298,17 @@ snapshots: yoga-layout@3.2.1: {} + youch-core@0.3.3: + dependencies: + '@poppinss/exception': 1.2.3 + error-stack-parser-es: 1.0.5 + + youch@4.1.0-beta.10: + dependencies: + '@poppinss/colors': 4.1.6 + '@poppinss/dumper': 0.6.5 + '@speed-highlight/core': 1.2.24 + cookie: 1.1.1 + youch-core: 0.3.3 + zimmerframe@1.1.4: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 5ed0b5a..a44f21d 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,2 +1,6 @@ +packages: + - api + allowBuilds: esbuild: true + workerd: true diff --git a/src/lib/components/AccountMenuItem.svelte b/src/lib/components/AccountMenuItem.svelte index 5e218c6..b56b21a 100644 --- a/src/lib/components/AccountMenuItem.svelte +++ b/src/lib/components/AccountMenuItem.svelte @@ -2,12 +2,10 @@ import { resolve } from '$app/paths'; import { page } from '$app/state'; import type { Pathname } from '$app/types'; - import { oauthLogin } from '$lib/atproto/oauth.remote'; - import { AtprotoLoginModal } from '@foxui/social'; + import { loginDialog } from '$lib/login.svelte'; import MenuItem from './MenuItem.svelte'; let { did, onLoginOpen }: { did: string | null; onLoginOpen?: () => void } = $props(); - let loginOpen = $state(false); let profileHref: Pathname | undefined = $derived( did ? (resolve('/profile/[actor]', { actor: did }) as Pathname) : undefined ); @@ -15,20 +13,9 @@ did !== null && page.route.id === '/profile/[actor]' && page.params.actor === did ); - $effect(() => { - if (page.url.pathname) loginOpen = false; - }); - function openLogin() { onLoginOpen?.(); - loginOpen = true; - } - - async function login(handle: string) { - const returnTo = page.url.pathname + page.url.search + page.url.hash; - const { url } = await oauthLogin({ handle: handle.trim(), returnTo }); - window.location.assign(url); - return true; + loginDialog.show(); } @@ -55,5 +42,3 @@ /> - - diff --git a/src/lib/components/AppMenu.svelte b/src/lib/components/AppMenu.svelte index 226b243..dede2d8 100644 --- a/src/lib/components/AppMenu.svelte +++ b/src/lib/components/AppMenu.svelte @@ -38,7 +38,7 @@ - (menuOpen = false)} /> + (menuOpen = false)} /> (menuOpen = false)} /> diff --git a/src/lib/components/ItemPage.svelte b/src/lib/components/ItemPage.svelte index 660acfe..9b7a6f7 100644 --- a/src/lib/components/ItemPage.svelte +++ b/src/lib/components/ItemPage.svelte @@ -11,6 +11,7 @@ import TabSelect from './TabSelect.svelte'; import TrailerDialog from './TrailerDialog.svelte'; import { backdropUrl, posterUrl, profileUrl } from '$lib/images'; + import { loginDialog } from '$lib/login.svelte'; import { reviewDialog } from '$lib/review.svelte'; import { slugify } from '$lib/utils'; import type { getMediaPage } from '$lib/tmdb.server'; @@ -18,9 +19,19 @@ type DetailSection = 'reviews' | 'similar' | 'cast'; type ItemPageData = Awaited> & { + did: string | null; reviews: ReviewCardModel[]; }; + function startReview() { + if (!data.did) { + loginDialog.show(); + return; + } + + reviewDialog.show(data.item); + } + function getDefaultDetailSection(data: ItemPageData): DetailSection { if (data.reviews.length > 0) return 'reviews'; if (data.recommendations.length > 0) return 'similar'; @@ -105,7 +116,7 @@
+ diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index 8625960..0d0a479 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -18,12 +18,12 @@ -
+

Search movies and TV shows

- +
@@ -34,7 +34,7 @@ {#if selectedItems.length > 0} {:else} -

This collection is unavailable right now.

+

This collection is unavailable right now.

{/if}
diff --git a/src/routes/profile/[actor]/+page.server.ts b/src/routes/profile/[actor]/+page.server.ts index ccef8d6..49d1b29 100644 --- a/src/routes/profile/[actor]/+page.server.ts +++ b/src/routes/profile/[actor]/+page.server.ts @@ -1,6 +1,7 @@ import { error } from '@sveltejs/kit'; import { contrail } from '$lib/contrail'; -import { toReview } from '$lib/reviews.server'; +import { getProfileMediaLists } from '$lib/lists.server'; +import { toReview, withReviewInteractionCounts } from '$lib/reviews.server'; import type { PageServerLoad } from './$types'; export const load: PageServerLoad = async ({ parent }) => { @@ -11,10 +12,18 @@ export const load: PageServerLoad = async ({ parent }) => { if (!response.ok) error(502, 'Could not load reviews'); - return { - reviews: response.data.records.flatMap((record) => { - const review = toReview(record, profile.handle); - return review ? [review] : []; + const reviews = response.data.records.flatMap((record) => { + const review = toReview(record, profile.handle); + return review ? [review] : []; + }); + + const [reviewsWithCounts, lists] = await Promise.all([ + withReviewInteractionCounts(reviews), + getProfileMediaLists(profile).catch((cause) => { + console.error('Could not load profile lists from Contrail', cause); + return []; }) - }; + ]); + + return { reviews: reviewsWithCounts, lists }; }; diff --git a/src/routes/profile/[actor]/+page.svelte b/src/routes/profile/[actor]/+page.svelte index ab67c14..4d56531 100644 --- a/src/routes/profile/[actor]/+page.svelte +++ b/src/routes/profile/[actor]/+page.svelte @@ -2,6 +2,7 @@ import Avatar from '$lib/components/Avatar.svelte'; import Container from '$lib/components/Container.svelte'; import ItemCard from '$lib/components/ItemCard.svelte'; + import ListCard from '$lib/components/ListCard.svelte'; import Review from '$lib/components/Review.svelte'; import type { PageData } from './$types'; @@ -11,8 +12,8 @@ - @{data.profile.handle} reviews | atmo.watch - + @{data.profile.handle} | atmo.watch +
@@ -28,6 +29,17 @@ + {#if data.lists.length > 0} +
+

lists

+
+ {#each data.lists as list (list.uri)} + + {/each} +
+
+ {/if} + {#if ratings.length > 0}

ratings

diff --git a/src/routes/profile/[actor]/list/[rkey]/+page.server.ts b/src/routes/profile/[actor]/list/[rkey]/+page.server.ts new file mode 100644 index 0000000..cea3e6d --- /dev/null +++ b/src/routes/profile/[actor]/list/[rkey]/+page.server.ts @@ -0,0 +1,46 @@ +import type { ResourceUri } from '@atcute/lexicons'; +import { isRecordKey } from '@atcute/lexicons/syntax'; +import { error } from '@sveltejs/kit'; +import { getMediaListPage } from '$lib/lists.server'; +import type { PageServerLoad } from './$types'; + +function parsePage(value: string | null) { + if (!value || !/^\d+$/.test(value)) return 1; + const page = Number(value); + return Number.isSafeInteger(page) && page > 0 ? page : 1; +} + +export const load: PageServerLoad = async ({ params, parent, url }) => { + if (!isRecordKey(params.rkey)) error(404, 'List not found'); + + const { profile } = await parent(); + const uri = `at://${profile.did}/social.popfeed.feed.list/${params.rkey}` as ResourceUri; + const result = await getMediaListPage({ + uri, + author: profile, + page: parsePage(url.searchParams.get('page')) + }); + + if (!result.response.ok) { + if (result.response.status === 400 || result.response.status === 404) { + error(404, 'List not found'); + } + error(502, 'Could not load list'); + } + if ( + !('list' in result) || + !result.list || + !result.items || + result.currentPage === undefined || + result.totalPages === undefined + ) { + error(502, 'Could not load list'); + } + + return { + list: result.list, + items: result.items, + currentPage: result.currentPage, + totalPages: result.totalPages + }; +}; diff --git a/src/routes/profile/[actor]/list/[rkey]/+page.svelte b/src/routes/profile/[actor]/list/[rkey]/+page.svelte new file mode 100644 index 0000000..4877098 --- /dev/null +++ b/src/routes/profile/[actor]/list/[rkey]/+page.svelte @@ -0,0 +1,99 @@ + + + + {data.list.name} by @{handle} | atmo.watch + + + +
+ +
+

{data.list.name}

+ + {#if data.list.description} +

+ {data.list.description} +

+ {/if} + +
+ + + @{handle} + + {data.list.itemCount} {data.list.itemCount === 1 ? 'item' : 'items'} + +
+
+ + {#if data.items.length > 0} +
+ {#each data.items as item, index (`${item.creativeWorkType}:${item.tmdbId}:${index}`)} + + {/each} +
+ + {#if data.totalPages > 1} + + {/if} + {:else} +

No movies or shows in this list yet.

+ {/if} +
+
-- 2.51.2