Live video on the AT Protocol

streamplace: add streamplace npm package

+392 -144
+1 -1
.ci/dockerfile-hash.yaml
··· 1 1 variables: 2 - DOCKERFILE_HASH: adc7d067c9cb33be6724f83622dba508141bacb1 2 + DOCKERFILE_HASH: fb5480a73648575c1b7b2b32039211ba2d32e78d
+10 -10
Makefile
··· 108 108 109 109 .PHONY: js-lexicons 110 110 js-lexicons: 111 - node_modules/.bin/lex gen-api ./js/app/lexicons $$(find ./lexicons -type f -name '*.json') --yes \ 112 - && echo 'import { ComAtprotoRepoCreateRecord, ComAtprotoRepoDeleteRecord, ComAtprotoRepoGetRecord, ComAtprotoRepoListRecords } from "@atproto/api"' >> ./js/app/lexicons/index.ts \ 113 - && sed -i.bak "s/'\.\.\/\.\.\/app/'@atproto\/api\/src\/client\/types\/app/" $$(find ./js/app/lexicons/types/place/stream -type f) \ 114 - && sed -i.bak "s/'\.\.\/\.\.\/\.\.\/app/'@atproto\/api\/src\/client\/types\/app/" $$(find ./js/app/lexicons/types/place/stream -type f) \ 115 - && sed -i.bak "s/'\.\.\/\.\.\/com/'@atproto\/api\/src\/client\/types\/com/" $$(find ./js/app/lexicons/types/place/stream -type f) \ 116 - && sed -i.bak "s/'\.\.\/\.\.\/\.\.\/com/'@atproto\/api\/src\/client\/types\/com/" $$(find ./js/app/lexicons/types/place/stream -type f) \ 117 - && sed -i.bak 's/AppBskyGraphBlock\.Main/AppBskyGraphBlock\.Record/' $$(find ./js/app/lexicons/types/place/stream -type f) \ 118 - && sed -i.bak 's/PlaceStreamChatProfile\.Main/PlaceStreamChatProfile\.Record/' $$(find ./js/app/lexicons/types/place/stream -type f) \ 119 - && sed -i.bak "s/import\ \*\ as\ AppBskyFeedDefs\ from\ '.\/defs'/import \{ AppBskyFeedDefs } from '@atproto\/api'/" $$(find ./js/app/lexicons/types -type f) \ 120 - && sed -i.bak "s/import\ \*\ as\ AppBskyActorDefs\ from\ '.\/defs'/import \{ AppBskyActorDefs } from '@atproto\/api'/" $$(find ./js/app/lexicons -type f) \ 111 + node_modules/.bin/lex gen-api ./js/streamplace/src/lexicons $$(find ./lexicons -type f -name '*.json') --yes \ 112 + && echo 'import { ComAtprotoRepoCreateRecord, ComAtprotoRepoDeleteRecord, ComAtprotoRepoGetRecord, ComAtprotoRepoListRecords } from "@atproto/api"' >> ./js/streamplace/src/lexicons/index.ts \ 113 + && sed -i.bak "s/'\.\.\/\.\.\/app/'@atproto\/api\/src\/client\/types\/app/" $$(find ./js/streamplace/src/lexicons/types/place/stream -type f) \ 114 + && sed -i.bak "s/'\.\.\/\.\.\/\.\.\/app/'@atproto\/api\/src\/client\/types\/app/" $$(find ./js/streamplace/src/lexicons/types/place/stream -type f) \ 115 + && sed -i.bak "s/'\.\.\/\.\.\/com/'@atproto\/api\/src\/client\/types\/com/" $$(find ./js/streamplace/src/lexicons/types/place/stream -type f) \ 116 + && sed -i.bak "s/'\.\.\/\.\.\/\.\.\/com/'@atproto\/api\/src\/client\/types\/com/" $$(find ./js/streamplace/src/lexicons/types/place/stream -type f) \ 117 + && sed -i.bak 's/AppBskyGraphBlock\.Main/AppBskyGraphBlock\.Record/' $$(find ./js/streamplace/src/lexicons/types/place/stream -type f) \ 118 + && sed -i.bak 's/PlaceStreamChatProfile\.Main/PlaceStreamChatProfile\.Record/' $$(find ./js/streamplace/src/lexicons/types/place/stream -type f) \ 119 + && sed -i.bak "s/import\ \*\ as\ AppBskyFeedDefs\ from\ '.\/defs'/import \{ AppBskyFeedDefs } from '@atproto\/api'/" $$(find ./js/streamplace/src/lexicons/types -type f) \ 120 + && sed -i.bak "s/import\ \*\ as\ AppBskyActorDefs\ from\ '.\/defs'/import \{ AppBskyActorDefs } from '@atproto\/api'/" $$(find ./js/streamplace/src/lexicons -type f) \ 121 121 && find . | grep bak$$ | xargs rm 122 122 123 123 .PHONY: md-lexicons
-1
js/app/.gitignore
··· 58 58 android 59 59 code-signing-dev 60 60 generated 61 - lexicons
+1 -1
js/app/components/login/login.tsx
··· 1 - import { AtpBaseClient } from "lexicons"; 1 + import { AtpBaseClient } from "streamplace"; 2 2 import NameColorPicker from "components/name-color-picker/name-color-picker"; 3 3 import { 4 4 login,
+1 -1
js/app/components/name-color-picker/name-color-picker.tsx
··· 5 5 selectChatProfile, 6 6 selectUserProfile, 7 7 } from "features/bluesky/blueskySlice"; 8 - import { PlaceStreamChatProfile } from "lexicons"; 8 + import { PlaceStreamChatProfile } from "streamplace"; 9 9 import { useEffect, useState } from "react"; 10 10 import { Keyboard } from "react-native"; 11 11 import ColorPicker, {
+2 -2
js/app/components/player/controls.tsx
··· 53 53 import Viewers from "components/viewers"; 54 54 import { userMute } from "features/streamplace/streamplaceSlice"; 55 55 import { Countdown } from "components/countdown"; 56 - import { Rendition } from "lexicons/types/place/stream/defs"; 56 + import { PlaceStreamDefs } from "streamplace"; 57 57 import usePlatform from "hooks/usePlatform"; 58 58 import { Image } from "tamagui"; 59 59 ··· 625 625 626 626 function GearMenu( 627 627 props: PlayerProps & { 628 - renditions: Rendition[]; 628 + renditions: PlaceStreamDefs.Rendition[]; 629 629 selectedRendition: string; 630 630 protocol: string; 631 631 setSelectedRendition: (rendition: string) => void;
+2 -2
js/app/components/player/props.tsx
··· 1 1 import { VideoView } from "expo-video"; 2 - import { Rendition } from "lexicons/types/place/stream/defs"; 2 + import { PlaceStreamDefs } from "streamplace"; 3 3 4 4 export enum IngestMediaSource { 5 5 USER = "user", ··· 36 36 ingestAutoStart?: boolean; 37 37 avSyncTest?: boolean; 38 38 offline: boolean; 39 - renditions: Rendition[]; 39 + renditions: PlaceStreamDefs.Rendition[]; 40 40 selectedRendition: string; 41 41 muteWasForced: boolean; 42 42 setMuteWasForced: (muteWasForced: boolean) => void;
+2 -2
js/app/features/bluesky/agent.tsx
··· 1 1 import { Agent } from "@atproto/api"; 2 2 import { SessionManager } from "@atproto/api/dist/session-manager"; 3 - import { PlaceNS } from "lexicons"; 3 + import { PlaceNS } from "streamplace"; 4 4 import { schemas as parentSchemas } from "@atproto/api/dist/client/lexicons"; 5 - import { schemas as appSchemas } from "../../lexicons/lexicons"; 5 + import { schemas as appSchemas } from "streamplace"; 6 6 import { Lexicons } from "@atproto/lexicon"; 7 7 export class StreamplaceAgent extends Agent { 8 8 place = new PlaceNS(this);
+1 -1
js/app/features/bluesky/blueskySlice.tsx
··· 24 24 PlaceStreamChatProfile, 25 25 PlaceStreamKey, 26 26 PlaceStreamLivestream, 27 - } from "lexicons"; 27 + } from "streamplace"; 28 28 import Storage from "storage"; 29 29 import { isWeb } from "tamagui"; 30 30 import { privateKeyToAccount } from "viem/accounts";
+1 -1
js/app/features/bluesky/blueskyTypes.tsx
··· 1 1 import { OAuthSession } from "@streamplace/atproto-oauth-client-react-native"; 2 2 import { ProfileViewDetailed } from "@atproto/api/dist/client/types/app/bsky/actor/defs"; 3 3 import { StreamKey } from "features/base/baseSlice"; 4 - import { PlaceStreamChatProfile, PlaceStreamLivestream } from "lexicons"; 4 + import { PlaceStreamChatProfile, PlaceStreamLivestream } from "streamplace"; 5 5 import { StreamplaceOAuthClient } from "./oauthClient"; 6 6 import { StreamplaceAgent } from "./agent"; 7 7
+26 -34
js/app/features/player/playerSlice.tsx
··· 3 3 import { PROTOCOL_HLS, PROTOCOL_WEBRTC } from "components/player/props"; 4 4 import { StreamplaceState } from "features/streamplace/streamplaceSlice"; 5 5 import { uuidv7 } from "hooks/uuid"; 6 - import { isMessageView } from "lexicons/types/place/stream/chat/defs"; 7 6 import { createContext, useContext } from "react"; 8 7 import { createAppSlice } from "../../hooks/createSlice"; 9 - import { Record as ChatMessageRecord } from "../../lexicons/types/place/stream/chat/message"; 10 - import { 11 - BlockView, 12 - isBlockView, 13 - isRenditions, 14 - Rendition, 15 - } from "../../lexicons/types/place/stream/defs"; 16 8 import { 17 - isLivestreamView, 18 - isViewerCount, 19 - Record as LivestreamRecord, 20 - LivestreamView, 21 - ViewerCount, 22 - } from "../../lexicons/types/place/stream/livestream"; 23 - import * as Segment from "../../lexicons/types/place/stream/segment"; 9 + PlaceStreamSegment, 10 + PlaceStreamLivestream, 11 + PlaceStreamDefs, 12 + PlaceStreamChatDefs, 13 + PlaceStreamChatMessage, 14 + } from "streamplace"; 24 15 import { useAppDispatch } from "store/hooks"; 25 16 26 17 export interface PlayerContextType { 27 18 playerId: string | null; 28 19 } 29 20 30 - export interface LivestreamViewHydrated extends LivestreamView { 31 - record: LivestreamRecord; 21 + export interface LivestreamViewHydrated 22 + extends PlaceStreamLivestream.LivestreamView { 23 + record: PlaceStreamLivestream.Record; 32 24 } 33 25 export interface PostViewHydrated extends AppBskyFeedDefs.PostView { 34 26 record: AppBskyFeedPost.Record; ··· 37 29 uri: string; 38 30 cid: string; 39 31 author: Author; 40 - record: ChatMessageRecord; 32 + record: PlaceStreamChatMessage.Record; 41 33 indexedAt: string; 42 34 chatProfile?: ChatProfile; 43 35 replyTo?: MessageViewHydrated; ··· 71 63 chat: { [key: string]: MessageViewHydrated }; 72 64 chatList: MessageViewHydrated[]; 73 65 livestream: LivestreamViewHydrated | null; 74 - segment: Segment.Record | null; 75 - renditions: Rendition[]; 66 + segment: PlaceStreamSegment.Record | null; 67 + renditions: PlaceStreamDefs.Rendition[]; 76 68 selectedRendition: string | null; 77 69 protocol: string; 78 70 replyToMessage: MessageViewHydrated | null; ··· 159 151 const reduceChat = ( 160 152 state: PlayerState, 161 153 messages: MessageViewHydrated[], 162 - blocks: BlockView[], 154 + blocks: PlaceStreamDefs.BlockView[], 163 155 ): PlayerState => { 164 156 state = { ...state } as PlayerState; 165 157 const newChat: { [key: string]: MessageViewHydrated } = { ...state.chat }; ··· 319 311 }, 320 312 ) => { 321 313 for (const message of action.payload.messages) { 322 - if (isLivestreamView(message)) { 314 + if (PlaceStreamLivestream.isLivestreamView(message)) { 323 315 state = { 324 316 ...state, 325 317 [action.payload.playerId]: { ··· 327 319 livestream: message as LivestreamViewHydrated, 328 320 }, 329 321 }; 330 - } else if (isViewerCount(message)) { 322 + } else if (PlaceStreamLivestream.isViewerCount(message)) { 331 323 state = { 332 324 ...state, 333 325 [action.payload.playerId]: { ··· 335 327 viewers: message.count, 336 328 }, 337 329 }; 338 - } else if (isMessageView(message)) { 330 + } else if (PlaceStreamChatDefs.isMessageView(message)) { 339 331 // Explicitly map MessageView to MessageViewHydrated 340 332 const hydrated: MessageViewHydrated = { 341 333 uri: message.uri, 342 334 cid: message.cid, 343 335 author: message.author, 344 - record: message.record as ChatMessageRecord, 336 + record: message.record as PlaceStreamChatMessage.Record, 345 337 indexedAt: message.indexedAt, 346 338 chatProfile: (message as any).chatProfile, 347 339 replyTo: (message as any).replyTo, ··· 354 346 [], 355 347 ), 356 348 }; 357 - } else if (Segment.isRecord(message)) { 349 + } else if (PlaceStreamSegment.isRecord(message)) { 358 350 state = { 359 351 ...state, 360 352 [action.payload.playerId]: { 361 353 ...state[action.payload.playerId], 362 - segment: message as Segment.Record, 354 + segment: message as PlaceStreamSegment.Record, 363 355 }, 364 356 }; 365 - } else if (isBlockView(message)) { 366 - const block = message as BlockView; 357 + } else if (PlaceStreamDefs.isBlockView(message)) { 358 + const block = message as PlaceStreamDefs.BlockView; 367 359 state = { 368 360 ...state, 369 361 [action.payload.playerId]: reduceChat( ··· 372 364 [block], 373 365 ), 374 366 }; 375 - } else if (isRenditions(message)) { 367 + } else if (PlaceStreamDefs.isRenditions(message)) { 376 368 state = { 377 369 ...state, 378 370 [action.payload.playerId]: { ··· 449 441 streamplace: StreamplaceState; 450 442 }; 451 443 const res = await fetch(`${streamplace.url}/api/view-count/${user}`); 452 - const data = (await res.json()) as ViewerCount; 444 + const data = (await res.json()) as PlaceStreamLivestream.ViewerCount; 453 445 return { playerId, count: data.count }; 454 446 }, 455 447 { ··· 548 540 const res = await fetch( 549 541 `${streamplace.url}/api/segment/recent/${user}`, 550 542 ); 551 - const data = (await res.json()) as Segment.Record; 543 + const data = (await res.json()) as PlaceStreamSegment.Record; 552 544 return { playerId, segment: data }; 553 545 }, 554 546 { ··· 697 689 }; 698 690 export const usePlayerSegment = (): ((state: { 699 691 player: PlayersState; 700 - }) => Segment.Record | null) => { 692 + }) => PlaceStreamSegment.Record | null) => { 701 693 const playerId = usePlayerId(); 702 694 return (state) => state.player[playerId].segment; 703 695 }; 704 696 export const usePlayerRenditions = (): ((state: { 705 697 player: PlayersState; 706 - }) => Rendition[]) => { 698 + }) => PlaceStreamDefs.Rendition[]) => { 707 699 const playerId = usePlayerId(); 708 700 return (state) => state.player[playerId].renditions; 709 701 };
+3 -4
js/app/features/streamplace/streamplaceSlice.tsx
··· 2 2 import { createAppSlice } from "../../hooks/createSlice"; 3 3 import Storage from "../../storage"; 4 4 import { BlueskyState } from "features/bluesky/blueskyTypes"; 5 - import { SegmentView } from "lexicons/types/place/stream/segment"; 6 - import { LivestreamView } from "lexicons/types/place/stream/livestream"; 5 + import { PlaceStreamSegment, PlaceStreamLivestream } from "streamplace"; 7 6 import { StreamplaceAgent } from "features/bluesky/agent"; 8 7 9 8 let DEFAULT_URL = process.env.EXPO_PUBLIC_STREAMPLACE_URL as string; ··· 44 43 identity: Identity | null; 45 44 initialized: boolean; 46 45 recentSegments: { 47 - segments: LivestreamView[]; 46 + segments: PlaceStreamLivestream.LivestreamView[]; 48 47 error: string | null; 49 48 loading: boolean; 50 49 firstRequest: boolean; 51 50 }; 52 - mySegments: SegmentView[]; 51 + mySegments: PlaceStreamSegment.SegmentView[]; 53 52 telemetry: boolean | null; 54 53 userMuted: boolean | null; 55 54 chatWarned: boolean;
+2 -3
js/app/hooks/useLiveUser.tsx
··· 1 1 import { selectMySegments } from "features/streamplace/streamplaceSlice"; 2 - import { isRecord } from "lexicons/types/place/stream/segment"; 3 2 import { useAppSelector } from "store/hooks"; 4 - import { PlaceStreamSegment } from "lexicons"; 3 + import { PlaceStreamSegment } from "streamplace"; 5 4 6 5 // composite selector that tells us when the current user is live 7 6 export const useLiveUser = (): boolean => { ··· 9 8 if (mySegments.length === 0) { 10 9 return false; 11 10 } 12 - if (!isRecord(mySegments[0].record)) { 11 + if (!PlaceStreamSegment.isRecord(mySegments[0].record)) { 13 12 return false; 14 13 } 15 14 const record = mySegments[0].record as PlaceStreamSegment.Record;
+4 -3
js/app/package.json
··· 1 1 { 2 - "name": "streamplace", 2 + "name": "@streamplace/app", 3 3 "main": "./src/entrypoint.tsx", 4 4 "version": "0.6.28", 5 5 "runtimeVersion": "0.4.3", 6 6 "scripts": { 7 7 "start": "npx expo start -c --port 38081", 8 - "android": "expo run:android --port 38081 \"$@\"", 9 - "ios": "expo run:ios --port 38081", 8 + "android": "expo run:android --no-bundler", 9 + "ios": "expo run:ios --no-bundler", 10 10 "web": "npx expo start --web --port 38081", 11 11 "test": "jest --watchAll", 12 12 "build": "pnpm run build:web && pnpm run prebuild", ··· 91 91 "react-use-websocket": "^4.13.0", 92 92 "reanimated-color-picker": "^4.0.0", 93 93 "rtcaudiodevice": "git+https://github.com/streamplace/RTCAudioDevice.git#7b4659fe845545d366623cbc813936987144b76f", 94 + "streamplace": "workspace:*", 94 95 "tamagui": "^1.123.17", 95 96 "ua-parser-js": "^2.0.0-rc.1", 96 97 "uuid": "^11.0.2",
+12 -11
js/app/src/screens/home.tsx
··· 26 26 H3, 27 27 Text, 28 28 } from "tamagui"; 29 - import { 30 - LivestreamView, 31 - Record as LivestreamRecord, 32 - } from "lexicons/types/place/stream/livestream"; 29 + import { LivestreamRecord, PlaceStreamLivestream } from "streamplace"; 33 30 import { AlertCircle, AlertTriangle } from "@tamagui/lucide-icons"; 34 31 35 32 // as we're not using a specific grid library these are necessary ··· 50 47 }; 51 48 52 49 // Function to generate mock data for testing purposes 53 - function generateMockSegments(count: number): { streams: LivestreamView[] } { 54 - const mockSegments: LivestreamView[] = []; 50 + function generateMockSegments(count: number): { 51 + streams: PlaceStreamLivestream.LivestreamView[]; 52 + } { 53 + const mockSegments: PlaceStreamLivestream.LivestreamView[] = []; 55 54 const baseDid = "did:plc:mockmockmockmockmockmockmockmockmock"; 56 55 57 56 for (let i = 0; i < count; i++) { ··· 64 63 $type: "place.stream.livestream", 65 64 createdAt: new Date().toISOString(), 66 65 title: `Mock Stream ${i + 1}`, 67 - } as LivestreamRecord, 66 + } as PlaceStreamLivestream.Record, 68 67 author: { 69 68 did: did, 70 69 handle: handle, ··· 119 118 avatarUrl, 120 119 horizontal = false, 121 120 }: { 122 - item: LivestreamView; 121 + item: PlaceStreamLivestream.LivestreamView; 123 122 media: UseMediaState; 124 123 size: StreamCardSize; 125 124 avatarUrl?: string; ··· 140 139 > 141 140 <StreamCardHorizontal 142 141 size={size} 143 - title={(item.record as LivestreamRecord).title || "A livestream!"} 142 + title={ 143 + (item.record as PlaceStreamLivestream.Record).title || "A livestream!" 144 + } 144 145 horizontal={horizontal} 145 146 thumbnailUrl={`/api/playback/${user}/stream.png?bweh=${(Date.now() / 120000).toFixed(0)}`} 146 147 avatarUrl={avatarUrl} ··· 240 241 let cutSegs = segments.slice(firstRowCols); 241 242 242 243 // fill in null data to pad out the list for grid display 243 - let segs: (LivestreamView | null)[] = cutSegs.concat( 244 + let segs: (PlaceStreamLivestream.LivestreamView | null)[] = cutSegs.concat( 244 245 Array((cols - (segments.length % cols)) % cols).fill(null), 245 246 ); 246 247 if (cutSegs.length === 0 && segs.every((s) => s === null) && cols > 0) { ··· 249 250 } 250 251 251 252 // assemble rows 252 - const rows: (LivestreamView | null)[][] = []; 253 + const rows: (PlaceStreamLivestream.LivestreamView | null)[][] = []; 253 254 for (let i = 0; i < cutSegs.length; i += cols) { 254 255 let row = cutSegs.slice(i, i + cols); 255 256 // pad the last row with nulls if it's not full
+1 -1
js/desktop/package.json
··· 1 1 { 2 - "name": "streamplace-desktop", 2 + "name": "@streamplace/desktop", 3 3 "productName": "streamplace-desktop", 4 4 "version": "0.6.28", 5 5 "description": "Streamplace Desktop Application",
+1 -1
js/docs/package.json
··· 14 14 "@fontsource/atkinson-hyperlegible-next": "^5.2.2", 15 15 "astro": "^5.6.1", 16 16 "sharp": "^0.32.5", 17 - "streamplace": "workspace:*" 17 + "@streamplace/app": "workspace:*" 18 18 } 19 19 }
+11 -19
js/docs/src/content/docs/guides/start-contributing/streamplace-dev-setup.md
··· 67 67 [download a production release of Streamplace](https://git.stream.place/streamplace/streamplace/-/releases) 68 68 and configure it to forward to the dev server with a command like: 69 69 70 - ````shell 70 + ```shell 71 71 curl -O https://git-cloudflare.stream.place/api/v4/projects/1/packages/generic/latest/VERSION/streamplace-VERSION-darwin-arm64.tar.gz 72 72 tar -xzvf streamplace-VERSION-darwin-arm64.tar.gz 73 73 ./streamplace --dev-frontend-proxy=http://127.0.0.1:38081 74 74 ``` 75 75 76 - Either way, once you have a local Streamplace node running, install the prerequisites with: 76 + Either way, once you have a local Streamplace node running, install the 77 + prerequisites with: 77 78 78 79 ```shell 79 80 pnpm install 80 - ```` 81 + ``` 81 82 82 - #### Web 83 + Then start building all of the packages with: 83 84 84 85 ```shell 85 - pnpm run app start 86 + pnpm run start 86 87 ``` 87 88 88 - #### iOS 89 + #### iOS Build 89 90 90 91 ```shell 91 92 pnpm run app ios 92 93 ``` 93 94 94 - #### Android 95 + #### Android Build 95 96 96 97 ```shell 97 98 pnpm run app android 98 99 ``` 99 100 100 101 You can also specify a physical device with something like 101 - `pnpm run app ios -d 'Stream’s iPhone'`. Note also that this command runs a full 102 - native build of the iOS/Android app, which is not necessary in many cases: once 103 - you have a copy of the `Devplace` app on your device or emulator, you can boot 104 - the dev server back up with `pnpm run app start`. 102 + `pnpm run app ios -d 'Stream’s iPhone'`. Note that these commands only run 103 + native builds; you'll still need the development server booted up with 104 + `pnpm run start`. 105 105 106 106 Note also that `react-native-webrtc`, our primary package for streaming in and 107 107 playing back on iOS/Android, doesn't work very well in the iOS Simulator. It may 108 108 work, it may crash. Physical devices preferred when possible! 109 - 110 - ### Streamplace Desktop 111 - 112 - 1. `pnpm install` 113 - 2. `pnpm run desktop start` 114 - 115 - By default Streamplace Desktop will assume there's a local node to connect to, 116 - running with something like `make dev && ./build-linux-amd64/streamplace` above. 117 109 118 110 ### Streamplace Docs 119 111
+1
js/streamplace/.gitignore
··· 1 + lexicons
+36
js/streamplace/package.json
··· 1 + { 2 + "name": "streamplace", 3 + "version": "0.0.1", 4 + "description": "Live video on the AT Protocol", 5 + "main": "dist/index.js", 6 + "types": "dist/index.d.js", 7 + "type": "module", 8 + "exports": { 9 + ".": { 10 + "types": "./dist/index.d.js", 11 + "default": "./dist/index.js" 12 + } 13 + }, 14 + "scripts": { 15 + "build": "tsup-node", 16 + "postinstall": "cd ../.. && make js-lexicons && cd - && pnpm run build", 17 + "start": "tsup-node --watch" 18 + }, 19 + "keywords": [ 20 + "streamplace", 21 + "livepeer", 22 + "atproto" 23 + ], 24 + "author": "Streamplace", 25 + "license": "MIT", 26 + "packageManager": "pnpm@10.11.0", 27 + "dependencies": { 28 + "@atproto/xrpc": "^0.7.0", 29 + "@atproto/lexicon": "^0.4.11", 30 + "multiformats": "^9.9.0" 31 + }, 32 + "devDependencies": { 33 + "typescript": "~5.3.3", 34 + "tsup": "^8.5.0" 35 + } 36 + }
+2
js/streamplace/src/index.ts
··· 1 + export * from "./lexicons"; 2 + export { schemas } from "./lexicons/lexicons";
+10
js/streamplace/tsconfig.json
··· 1 + { 2 + "include": [], 3 + "references": [{ "path": "../app/tsconfig.base.json" }], 4 + "compilerOptions": { 5 + "moduleResolution": "bundler", 6 + "module": "es2022", 7 + "jsx": "react-jsx", 8 + "sourceMap": true 9 + } 10 + }
+18
js/streamplace/tsup.config.ts
··· 1 + import { defineConfig, Format } from "tsup"; 2 + 3 + const options = { 4 + splitting: false, 5 + bundle: false, 6 + clean: true, 7 + sourcemap: true, 8 + dts: true, 9 + format: ["esm"] as Format[], 10 + }; 11 + 12 + export default defineConfig([ 13 + { 14 + ...options, 15 + entry: ["./src/**"], 16 + outDir: "dist", 17 + }, 18 + ]);
+5 -5
package.json
··· 12 12 "check": "pnpm run check:workspaces && git ls-files | xargs prettier --check --ignore-unknown", 13 13 "check:workspaces": "cd js/app && pnpm run check", 14 14 "fix": "git ls-files | xargs prettier --write --ignore-unknown", 15 - "postinstall": "husky && make js-lexicons", 15 + "postinstall": "husky", 16 16 "build": "pnpm --stream -r run build", 17 17 "prepare": "husky", 18 18 "release": "lerna publish --force-publish", 19 19 "precommit": "make precommit", 20 - "app": "cd js/app && pnpm run \"$@\"", 21 - "desktop": "cd js/desktop && pnpm run \"$@\"", 22 - "docs": "cd js/docs && pnpm run \"$@\"", 23 - "start": "pnpm --stream --parallel -r run start" 20 + "app": "pnpm run -r --stream --filter @streamplace/app... --parallel", 21 + "desktop": "pnpm run -r --stream --filter @streamplace/desktop... --parallel", 22 + "docs": "cd js/docs && pnpm run", 23 + "start": "pnpm run -r --stream --parallel start" 24 24 }, 25 25 "keywords": [], 26 26 "author": "Streamplace",
+239 -41
pnpm-lock.yaml
··· 237 237 rtcaudiodevice: 238 238 specifier: git+https://github.com/streamplace/RTCAudioDevice.git#7b4659fe845545d366623cbc813936987144b76f 239 239 version: https://codeload.github.com/streamplace/RTCAudioDevice/tar.gz/7b4659fe845545d366623cbc813936987144b76f 240 + streamplace: 241 + specifier: workspace:* 242 + version: link:../streamplace 240 243 tamagui: 241 244 specifier: ^1.123.17 242 245 version: 1.123.17(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react-native@0.76.2(@babel/core@7.26.0)(@babel/preset-env@7.27.2(@babel/core@7.26.0))(@types/react@18.3.12)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1) ··· 487 490 '@fontsource/atkinson-hyperlegible-next': 488 491 specifier: ^5.2.2 489 492 version: 5.2.2 493 + '@streamplace/app': 494 + specifier: workspace:* 495 + version: link:../app 490 496 astro: 491 497 specifier: ^5.6.1 492 498 version: 5.7.10(@types/node@22.15.17)(encoding@0.1.13)(idb-keyval@6.2.1)(jiti@1.21.6)(lightningcss@1.29.1)(rollup@4.40.1)(terser@5.32.0)(typescript@5.8.3)(yaml@2.5.1) 493 499 sharp: 494 500 specifier: ^0.32.5 495 501 version: 0.32.6 496 - streamplace: 497 - specifier: workspace:* 498 - version: link:../app 502 + 503 + js/streamplace: 504 + dependencies: 505 + '@atproto/lexicon': 506 + specifier: ^0.4.11 507 + version: 0.4.11 508 + '@atproto/xrpc': 509 + specifier: ^0.7.0 510 + version: 0.7.0 511 + multiformats: 512 + specifier: ^9.9.0 513 + version: 9.9.0 514 + devDependencies: 515 + tsup: 516 + specifier: ^8.5.0 517 + version: 8.5.0(@swc/core@1.8.0(@swc/helpers@0.5.17))(jiti@1.21.6)(postcss@8.5.3)(typescript@5.3.3)(yaml@2.5.1) 518 + typescript: 519 + specifier: ~5.3.3 520 + version: 5.3.3 499 521 500 522 packages: 501 523 ··· 1108 1130 1109 1131 '@babel/plugin-syntax-import-assertions@7.27.1': 1110 1132 resolution: {integrity: sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==} 1111 - engines: {node: '>=6.9.0'} 1112 - peerDependencies: 1113 - '@babel/core': ^7.0.0-0 1114 - 1115 - '@babel/plugin-syntax-import-attributes@7.26.0': 1116 - resolution: {integrity: sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==} 1117 1133 engines: {node: '>=6.9.0'} 1118 1134 peerDependencies: 1119 1135 '@babel/core': ^7.0.0-0 ··· 5692 5708 builtins@1.0.3: 5693 5709 resolution: {integrity: sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ==} 5694 5710 5711 + bundle-require@5.1.0: 5712 + resolution: {integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==} 5713 + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 5714 + peerDependencies: 5715 + esbuild: '>=0.18' 5716 + 5695 5717 burnt@0.12.2: 5696 5718 resolution: {integrity: sha512-bbZjGN4Om7dykr8ZcLb0tTO5L2becMR+HIez1ySUGgG/rvK+ePgBEuBA6lMOZqOTsUXhIKFUBH0sCXQ25fq5SA==} 5697 5719 peerDependencies: ··· 5710 5732 bytes@3.1.2: 5711 5733 resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} 5712 5734 engines: {node: '>= 0.8'} 5735 + 5736 + cac@6.7.14: 5737 + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} 5738 + engines: {node: '>=8'} 5713 5739 5714 5740 cacache@16.1.3: 5715 5741 resolution: {integrity: sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==} ··· 6077 6103 resolution: {integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==} 6078 6104 engines: {'0': node >= 6.0} 6079 6105 6106 + confbox@0.1.8: 6107 + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} 6108 + 6080 6109 connect-history-api-fallback@2.0.0: 6081 6110 resolution: {integrity: sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==} 6082 6111 engines: {node: '>=0.8'} ··· 6084 6113 connect@3.7.0: 6085 6114 resolution: {integrity: sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==} 6086 6115 engines: {node: '>= 0.10.0'} 6116 + 6117 + consola@3.4.2: 6118 + resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} 6119 + engines: {node: ^14.18.0 || >=16.10.0} 6087 6120 6088 6121 console-control-strings@1.1.0: 6089 6122 resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} ··· 7331 7364 firebase@10.13.2: 7332 7365 resolution: {integrity: sha512-YeI+TO5rJsoyZsVFx9WiN5ibdVCIigYTWwldRTMfCzrSPrJFVGao4acYj3x0EYGKDIgSgEyVBayD5BffD4Eyow==} 7333 7366 7367 + fix-dts-default-cjs-exports@1.0.1: 7368 + resolution: {integrity: sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg==} 7369 + 7334 7370 flat-cache@4.0.1: 7335 7371 resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} 7336 7372 engines: {node: '>=16'} ··· 8500 8536 jose@5.9.6: 8501 8537 resolution: {integrity: sha512-AMlnetc9+CV9asI19zHmrgS/WYsWUwCn2R7RzlbJWD7F9eWYUTGyBmU9o6PxngtLGOiDGPRu+Uc4fhKzbpteZQ==} 8502 8538 8539 + joycon@3.1.1: 8540 + resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} 8541 + engines: {node: '>=10'} 8542 + 8503 8543 js-tokens@4.0.0: 8504 8544 resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 8505 8545 ··· 8868 8908 load-json-file@6.2.0: 8869 8909 resolution: {integrity: sha512-gUD/epcRms75Cw8RT1pUdHugZYM5ce64ucs2GEISABwkRsOQr0q2wm/MV2TKThycIe5e0ytRweW2RZxclogCdQ==} 8870 8910 engines: {node: '>=8'} 8911 + 8912 + load-tsconfig@0.2.5: 8913 + resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} 8914 + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 8871 8915 8872 8916 loader-runner@4.3.0: 8873 8917 resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} ··· 8937 8981 lodash.once@4.1.1: 8938 8982 resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} 8939 8983 8984 + lodash.sortby@4.7.0: 8985 + resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} 8986 + 8940 8987 lodash.throttle@4.1.1: 8941 8988 resolution: {integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==} 8942 8989 ··· 9559 9606 resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} 9560 9607 engines: {node: '>=10'} 9561 9608 hasBin: true 9609 + 9610 + mlly@1.7.4: 9611 + resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==} 9562 9612 9563 9613 modern-ahocorasick@1.0.1: 9564 9614 resolution: {integrity: sha512-yoe+JbhTClckZ67b2itRtistFKf8yPYelHLc7e5xAwtNAXxM6wJTUx2C7QeVSJFDzKT7bCIFyBVybPMKvmB9AA==} ··· 10209 10259 resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} 10210 10260 engines: {node: '>=8'} 10211 10261 10262 + pathe@2.0.3: 10263 + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} 10264 + 10212 10265 pe-library@1.0.1: 10213 10266 resolution: {integrity: sha512-nh39Mo1eGWmZS7y+mK/dQIqg7S1lp38DpRxkyoHf0ZcUs/HDc+yyTjuOtTvSMZHmfSLuSQaX945u05Y2Q6UWZg==} 10214 10267 engines: {node: '>=14', npm: '>=7'} ··· 10279 10332 resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} 10280 10333 engines: {node: '>=8'} 10281 10334 10335 + pkg-types@1.3.1: 10336 + resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} 10337 + 10282 10338 plist@3.1.0: 10283 10339 resolution: {integrity: sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==} 10284 10340 engines: {node: '>=10.4.0'} ··· 10324 10380 postcss: 10325 10381 optional: true 10326 10382 ts-node: 10383 + optional: true 10384 + 10385 + postcss-load-config@6.0.1: 10386 + resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} 10387 + engines: {node: '>= 18'} 10388 + peerDependencies: 10389 + jiti: '>=1.21.0' 10390 + postcss: '>=8.0.9' 10391 + tsx: ^4.8.1 10392 + yaml: ^2.4.2 10393 + peerDependenciesMeta: 10394 + jiti: 10395 + optional: true 10396 + postcss: 10397 + optional: true 10398 + tsx: 10399 + optional: true 10400 + yaml: 10327 10401 optional: true 10328 10402 10329 10403 postcss-modules-extract-imports@3.1.0: ··· 11416 11490 resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} 11417 11491 engines: {node: '>= 8'} 11418 11492 11493 + source-map@0.8.0-beta.0: 11494 + resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} 11495 + engines: {node: '>= 8'} 11496 + 11419 11497 space-separated-tokens@2.0.2: 11420 11498 resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} 11421 11499 ··· 11848 11926 tr46@0.0.3: 11849 11927 resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} 11850 11928 11929 + tr46@1.0.1: 11930 + resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} 11931 + 11932 + tree-kill@1.2.2: 11933 + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} 11934 + hasBin: true 11935 + 11851 11936 treeverse@3.0.0: 11852 11937 resolution: {integrity: sha512-gcANaAnd2QDZFmHFEOF4k7uc1J/6a6z3DJMd/QwEyxLoKGiptJRwid582r7QIsFlFMIZ3SnxfS52S4hm2DHkuQ==} 11853 11938 engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} ··· 11926 12011 tslib@2.8.1: 11927 12012 resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} 11928 12013 12014 + tsup@8.5.0: 12015 + resolution: {integrity: sha512-VmBp77lWNQq6PfuMqCHD3xWl22vEoWsKajkF8t+yMBawlUS8JzEI+vOVMeuNZIuMML8qXRizFKi9oD5glKQVcQ==} 12016 + engines: {node: '>=18'} 12017 + hasBin: true 12018 + peerDependencies: 12019 + '@microsoft/api-extractor': ^7.36.0 12020 + '@swc/core': ^1 12021 + postcss: ^8.4.12 12022 + typescript: '>=4.5.0' 12023 + peerDependenciesMeta: 12024 + '@microsoft/api-extractor': 12025 + optional: true 12026 + '@swc/core': 12027 + optional: true 12028 + postcss: 12029 + optional: true 12030 + typescript: 12031 + optional: true 12032 + 11929 12033 tuf-js@2.2.1: 11930 12034 resolution: {integrity: sha512-GwIJau9XaA8nLVbUXsN3IlFi7WmQ48gBUrl3FTkkL/XLu/POhBzfmX9hd33FNMX1qAsfl6ozO1iMmW9NC8YniA==} 11931 12035 engines: {node: ^16.14.0 || >=18.0.0} ··· 12480 12584 webidl-conversions@3.0.1: 12481 12585 resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} 12482 12586 12587 + webidl-conversions@4.0.2: 12588 + resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} 12589 + 12483 12590 webidl-conversions@5.0.0: 12484 12591 resolution: {integrity: sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==} 12485 12592 engines: {node: '>=8'} ··· 12538 12645 12539 12646 whatwg-url@5.0.0: 12540 12647 resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} 12648 + 12649 + whatwg-url@7.1.0: 12650 + resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} 12541 12651 12542 12652 which-boxed-primitive@1.0.2: 12543 12653 resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} ··· 14015 14125 '@babel/core': 7.26.0 14016 14126 '@babel/helper-plugin-utils': 7.27.1 14017 14127 14018 - '@babel/plugin-syntax-import-attributes@7.26.0(@babel/core@7.26.0)': 14019 - dependencies: 14020 - '@babel/core': 7.26.0 14021 - '@babel/helper-plugin-utils': 7.27.1 14022 - 14023 14128 '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.26.0)': 14024 14129 dependencies: 14025 14130 '@babel/core': 7.26.0 ··· 14106 14211 '@babel/core': 7.26.0 14107 14212 '@babel/helper-plugin-utils': 7.27.1 14108 14213 '@babel/helper-remap-async-to-generator': 7.25.9(@babel/core@7.26.0) 14109 - '@babel/traverse': 7.25.9 14214 + '@babel/traverse': 7.27.3 14110 14215 transitivePeerDependencies: 14111 14216 - supports-color 14112 14217 ··· 14270 14375 dependencies: 14271 14376 '@babel/core': 7.26.0 14272 14377 '@babel/helper-plugin-utils': 7.27.1 14273 - '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 14378 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 14274 14379 transitivePeerDependencies: 14275 14380 - supports-color 14276 14381 ··· 14287 14392 '@babel/core': 7.26.0 14288 14393 '@babel/helper-compilation-targets': 7.25.9 14289 14394 '@babel/helper-plugin-utils': 7.27.1 14290 - '@babel/traverse': 7.25.9 14395 + '@babel/traverse': 7.27.3 14291 14396 transitivePeerDependencies: 14292 14397 - supports-color 14293 14398 ··· 14578 14683 dependencies: 14579 14684 '@babel/core': 7.26.0 14580 14685 '@babel/helper-plugin-utils': 7.27.1 14581 - '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 14686 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 14582 14687 transitivePeerDependencies: 14583 14688 - supports-color 14584 14689 ··· 14621 14726 '@babel/helper-annotate-as-pure': 7.27.3 14622 14727 '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.26.0) 14623 14728 '@babel/helper-plugin-utils': 7.27.1 14624 - '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 14729 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 14625 14730 '@babel/plugin-syntax-typescript': 7.25.9(@babel/core@7.26.0) 14626 14731 transitivePeerDependencies: 14627 14732 - supports-color ··· 14734 14839 dependencies: 14735 14840 '@babel/core': 7.26.0 14736 14841 '@babel/helper-plugin-utils': 7.27.1 14737 - '@babel/helper-validator-option': 7.25.9 14842 + '@babel/helper-validator-option': 7.27.1 14738 14843 '@babel/plugin-transform-flow-strip-types': 7.25.9(@babel/core@7.26.0) 14739 14844 14740 14845 '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.26.0)': ··· 16469 16574 16470 16575 '@leichtgewicht/ip-codec@2.0.5': {} 16471 16576 16472 - '@lerna/create@8.1.9(@swc/core@1.8.0(@swc/helpers@0.5.17))(encoding@0.1.13)(typescript@5.8.3)': 16577 + '@lerna/create@8.1.9(@swc/core@1.8.0(@swc/helpers@0.5.17))(encoding@0.1.13)(typescript@5.6.3)': 16473 16578 dependencies: 16474 16579 '@npmcli/arborist': 7.5.4 16475 16580 '@npmcli/package-json': 5.2.0 ··· 16487 16592 console-control-strings: 1.1.0 16488 16593 conventional-changelog-core: 5.0.1 16489 16594 conventional-recommended-bump: 7.0.1 16490 - cosmiconfig: 9.0.0(typescript@5.8.3) 16595 + cosmiconfig: 9.0.0(typescript@5.6.3) 16491 16596 dedent: 1.5.3 16492 16597 execa: 5.0.0 16493 16598 fs-extra: 11.2.0 ··· 17286 17391 17287 17392 '@react-native/codegen@0.76.2(@babel/preset-env@7.27.2(@babel/core@7.26.0))': 17288 17393 dependencies: 17289 - '@babel/parser': 7.26.2 17394 + '@babel/parser': 7.27.3 17290 17395 '@babel/preset-env': 7.27.2(@babel/core@7.26.0) 17291 17396 glob: 7.2.3 17292 17397 hermes-parser: 0.23.1 ··· 19318 19423 19319 19424 '@types/babel__core@7.20.5': 19320 19425 dependencies: 19321 - '@babel/parser': 7.26.2 19426 + '@babel/parser': 7.27.3 19322 19427 '@babel/types': 7.27.3 19323 19428 '@types/babel__generator': 7.6.8 19324 19429 '@types/babel__template': 7.4.4 ··· 19332 19437 19333 19438 '@types/babel__template@7.4.4': 19334 19439 dependencies: 19335 - '@babel/parser': 7.26.2 19440 + '@babel/parser': 7.27.3 19336 19441 '@babel/types': 7.27.3 19337 19442 19338 19443 '@types/babel__traverse@7.20.6': ··· 20669 20774 20670 20775 babel-plugin-jest-hoist@29.6.3: 20671 20776 dependencies: 20672 - '@babel/template': 7.25.9 20777 + '@babel/template': 7.27.2 20673 20778 '@babel/types': 7.27.3 20674 20779 '@types/babel__core': 7.20.5 20675 20780 '@types/babel__traverse': 7.20.6 ··· 20729 20834 '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.26.0) 20730 20835 '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.26.0) 20731 20836 '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.26.0) 20732 - '@babel/plugin-syntax-import-attributes': 7.26.0(@babel/core@7.26.0) 20837 + '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.26.0) 20733 20838 '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.26.0) 20734 20839 '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.26.0) 20735 20840 '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.26.0) ··· 20981 21086 20982 21087 builtins@1.0.3: {} 20983 21088 21089 + bundle-require@5.1.0(esbuild@0.25.3): 21090 + dependencies: 21091 + esbuild: 0.25.3 21092 + load-tsconfig: 0.2.5 21093 + 20984 21094 burnt@0.12.2(expo@52.0.8(@babel/core@7.26.0)(@babel/preset-env@7.27.2(@babel/core@7.26.0))(@expo/metro-runtime@4.0.0(react-native@0.76.2(@babel/core@7.26.0)(@babel/preset-env@7.27.2(@babel/core@7.26.0))(@types/react@18.3.12)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(encoding@0.1.13)(react-native-webview@13.12.4(react-native@0.76.2(@babel/core@7.26.0)(@babel/preset-env@7.27.2(@babel/core@7.26.0))(@types/react@18.3.12)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1))(react-native@0.76.2(@babel/core@7.26.0)(@babel/preset-env@7.27.2(@babel/core@7.26.0))(@types/react@18.3.12)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10))(react-dom@18.3.1(react@18.3.1))(react-native@0.76.2(@babel/core@7.26.0)(@babel/preset-env@7.27.2(@babel/core@7.26.0))(@types/react@18.3.12)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1): 20985 21095 dependencies: 20986 21096 expo: 52.0.8(@babel/core@7.26.0)(@babel/preset-env@7.27.2(@babel/core@7.26.0))(@expo/metro-runtime@4.0.0(react-native@0.76.2(@babel/core@7.26.0)(@babel/preset-env@7.27.2(@babel/core@7.26.0))(@types/react@18.3.12)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(encoding@0.1.13)(react-native-webview@13.12.4(react-native@0.76.2(@babel/core@7.26.0)(@babel/preset-env@7.27.2(@babel/core@7.26.0))(@types/react@18.3.12)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1))(react-native@0.76.2(@babel/core@7.26.0)(@babel/preset-env@7.27.2(@babel/core@7.26.0))(@types/react@18.3.12)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) ··· 20996 21106 bytes@3.0.0: {} 20997 21107 20998 21108 bytes@3.1.2: {} 21109 + 21110 + cac@6.7.14: {} 20999 21111 21000 21112 cacache@16.1.3: 21001 21113 dependencies: ··· 21382 21494 readable-stream: 3.6.2 21383 21495 typedarray: 0.0.6 21384 21496 21497 + confbox@0.1.8: {} 21498 + 21385 21499 connect-history-api-fallback@2.0.0: {} 21386 21500 21387 21501 connect@3.7.0: ··· 21392 21506 utils-merge: 1.0.1 21393 21507 transitivePeerDependencies: 21394 21508 - supports-color 21509 + 21510 + consola@3.4.2: {} 21395 21511 21396 21512 console-control-strings@1.1.0: {} 21397 21513 ··· 21489 21605 optionalDependencies: 21490 21606 typescript: 5.6.3 21491 21607 21492 - cosmiconfig@9.0.0(typescript@5.8.3): 21608 + cosmiconfig@9.0.0(typescript@5.6.3): 21493 21609 dependencies: 21494 21610 env-paths: 2.2.1 21495 21611 import-fresh: 3.3.0 21496 21612 js-yaml: 4.1.0 21497 21613 parse-json: 5.2.0 21498 21614 optionalDependencies: 21499 - typescript: 5.8.3 21615 + typescript: 5.6.3 21500 21616 21501 21617 crc-32@1.2.2: {} 21502 21618 ··· 23017 23133 transitivePeerDependencies: 23018 23134 - '@react-native-async-storage/async-storage' 23019 23135 23136 + fix-dts-default-cjs-exports@1.0.1: 23137 + dependencies: 23138 + magic-string: 0.30.17 23139 + mlly: 1.7.4 23140 + rollup: 4.40.1 23141 + 23020 23142 flat-cache@4.0.1: 23021 23143 dependencies: 23022 23144 flatted: 3.3.1 ··· 24345 24467 istanbul-lib-instrument@5.2.1: 24346 24468 dependencies: 24347 24469 '@babel/core': 7.26.0 24348 - '@babel/parser': 7.26.2 24470 + '@babel/parser': 7.27.3 24349 24471 '@istanbuljs/schema': 0.1.3 24350 24472 istanbul-lib-coverage: 3.2.2 24351 24473 semver: 6.3.1 ··· 24462 24584 24463 24585 jose@5.9.6: {} 24464 24586 24587 + joycon@3.1.1: {} 24588 + 24465 24589 js-tokens@4.0.0: {} 24466 24590 24467 24591 js-yaml@3.14.1: ··· 24482 24606 jscodeshift@0.14.0(@babel/preset-env@7.27.2(@babel/core@7.26.0)): 24483 24607 dependencies: 24484 24608 '@babel/core': 7.26.0 24485 - '@babel/parser': 7.26.2 24609 + '@babel/parser': 7.27.3 24486 24610 '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.26.0) 24487 24611 '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.26.0) 24488 24612 '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.26.0) 24489 - '@babel/plugin-transform-modules-commonjs': 7.25.9(@babel/core@7.26.0) 24613 + '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.26.0) 24490 24614 '@babel/preset-env': 7.27.2(@babel/core@7.26.0) 24491 24615 '@babel/preset-flow': 7.24.7(@babel/core@7.26.0) 24492 24616 '@babel/preset-typescript': 7.24.7(@babel/core@7.26.0) ··· 24642 24766 24643 24767 lerna@8.1.9(@swc/core@1.8.0(@swc/helpers@0.5.17))(encoding@0.1.13): 24644 24768 dependencies: 24645 - '@lerna/create': 8.1.9(@swc/core@1.8.0(@swc/helpers@0.5.17))(encoding@0.1.13)(typescript@5.8.3) 24769 + '@lerna/create': 8.1.9(@swc/core@1.8.0(@swc/helpers@0.5.17))(encoding@0.1.13)(typescript@5.6.3) 24646 24770 '@npmcli/arborist': 7.5.4 24647 24771 '@npmcli/package-json': 5.2.0 24648 24772 '@npmcli/run-script': 8.1.0 ··· 24660 24784 conventional-changelog-angular: 7.0.0 24661 24785 conventional-changelog-core: 5.0.1 24662 24786 conventional-recommended-bump: 7.0.1 24663 - cosmiconfig: 9.0.0(typescript@5.8.3) 24787 + cosmiconfig: 9.0.0(typescript@5.6.3) 24664 24788 dedent: 1.5.3 24665 24789 envinfo: 7.13.0 24666 24790 execa: 5.0.0 ··· 24713 24837 strong-log-transformer: 2.1.0 24714 24838 tar: 6.2.1 24715 24839 temp-dir: 1.0.0 24716 - typescript: 5.8.3 24840 + typescript: 5.6.3 24717 24841 upath: 2.0.1 24718 24842 uuid: 10.0.0 24719 24843 validate-npm-package-license: 3.0.4 ··· 24945 25069 strip-bom: 4.0.0 24946 25070 type-fest: 0.6.0 24947 25071 25072 + load-tsconfig@0.2.5: {} 25073 + 24948 25074 loader-runner@4.3.0: {} 24949 25075 24950 25076 loader-utils@2.0.4: ··· 24998 25124 lodash.merge@4.6.2: {} 24999 25125 25000 25126 lodash.once@4.1.1: {} 25127 + 25128 + lodash.sortby@4.7.0: {} 25001 25129 25002 25130 lodash.throttle@4.1.1: {} 25003 25131 ··· 25553 25681 25554 25682 metro-source-map@0.81.0: 25555 25683 dependencies: 25556 - '@babel/traverse': 7.25.9 25684 + '@babel/traverse': 7.27.3 25557 25685 '@babel/traverse--for-generate-function-map': '@babel/traverse@7.27.3' 25558 - '@babel/types': 7.26.0 25686 + '@babel/types': 7.27.3 25559 25687 flow-enums-runtime: 0.0.6 25560 25688 invariant: 2.2.4 25561 25689 metro-symbolicate: 0.81.0 ··· 25703 25831 25704 25832 metro@0.81.0(bufferutil@4.0.8)(utf-8-validate@5.0.10): 25705 25833 dependencies: 25706 - '@babel/code-frame': 7.26.2 25834 + '@babel/code-frame': 7.27.1 25707 25835 '@babel/core': 7.26.0 25708 - '@babel/generator': 7.26.2 25709 - '@babel/parser': 7.26.2 25710 - '@babel/template': 7.25.9 25836 + '@babel/generator': 7.27.3 25837 + '@babel/parser': 7.27.3 25838 + '@babel/template': 7.27.2 25711 25839 '@babel/traverse': 7.27.3 25712 25840 '@babel/types': 7.27.3 25713 25841 accepts: 1.3.8 ··· 26160 26288 26161 26289 mkdirp@1.0.4: {} 26162 26290 26291 + mlly@1.7.4: 26292 + dependencies: 26293 + acorn: 8.14.1 26294 + pathe: 2.0.3 26295 + pkg-types: 1.3.1 26296 + ufo: 1.6.1 26297 + 26163 26298 modern-ahocorasick@1.0.1: {} 26164 26299 26165 26300 modify-values@1.0.1: {} ··· 26949 27084 26950 27085 path-type@4.0.0: {} 26951 27086 27087 + pathe@2.0.3: {} 27088 + 26952 27089 pe-library@1.0.1: {} 26953 27090 26954 27091 pend@1.2.0: {} ··· 27004 27141 dependencies: 27005 27142 find-up: 4.1.0 27006 27143 27144 + pkg-types@1.3.1: 27145 + dependencies: 27146 + confbox: 0.1.8 27147 + mlly: 1.7.4 27148 + pathe: 2.0.3 27149 + 27007 27150 plist@3.1.0: 27008 27151 dependencies: 27009 27152 '@xmldom/xmldom': 0.8.10 ··· 27045 27188 postcss: 8.5.3 27046 27189 ts-node: 10.9.2(@swc/core@1.8.0(@swc/helpers@0.5.17))(@types/node@22.15.17)(typescript@5.3.3) 27047 27190 27191 + postcss-load-config@6.0.1(jiti@1.21.6)(postcss@8.5.3)(yaml@2.5.1): 27192 + dependencies: 27193 + lilconfig: 3.1.3 27194 + optionalDependencies: 27195 + jiti: 1.21.6 27196 + postcss: 8.5.3 27197 + yaml: 2.5.1 27198 + 27048 27199 postcss-modules-extract-imports@3.1.0(postcss@8.5.3): 27049 27200 dependencies: 27050 27201 postcss: 8.5.3 ··· 28460 28611 28461 28612 source-map@0.7.4: {} 28462 28613 28614 + source-map@0.8.0-beta.0: 28615 + dependencies: 28616 + whatwg-url: 7.1.0 28617 + 28463 28618 space-separated-tokens@2.0.2: {} 28464 28619 28465 28620 spdx-correct@3.2.0: ··· 29009 29164 29010 29165 tr46@0.0.3: {} 29011 29166 29167 + tr46@1.0.1: 29168 + dependencies: 29169 + punycode: 2.3.1 29170 + 29171 + tree-kill@1.2.2: {} 29172 + 29012 29173 treeverse@3.0.0: {} 29013 29174 29014 29175 trim-lines@3.0.1: {} ··· 29106 29267 29107 29268 tslib@2.8.1: {} 29108 29269 29270 + tsup@8.5.0(@swc/core@1.8.0(@swc/helpers@0.5.17))(jiti@1.21.6)(postcss@8.5.3)(typescript@5.3.3)(yaml@2.5.1): 29271 + dependencies: 29272 + bundle-require: 5.1.0(esbuild@0.25.3) 29273 + cac: 6.7.14 29274 + chokidar: 4.0.3 29275 + consola: 3.4.2 29276 + debug: 4.4.0 29277 + esbuild: 0.25.3 29278 + fix-dts-default-cjs-exports: 1.0.1 29279 + joycon: 3.1.1 29280 + picocolors: 1.1.1 29281 + postcss-load-config: 6.0.1(jiti@1.21.6)(postcss@8.5.3)(yaml@2.5.1) 29282 + resolve-from: 5.0.0 29283 + rollup: 4.40.1 29284 + source-map: 0.8.0-beta.0 29285 + sucrase: 3.35.0 29286 + tinyexec: 0.3.2 29287 + tinyglobby: 0.2.13 29288 + tree-kill: 1.2.2 29289 + optionalDependencies: 29290 + '@swc/core': 1.8.0(@swc/helpers@0.5.17) 29291 + postcss: 8.5.3 29292 + typescript: 5.3.3 29293 + transitivePeerDependencies: 29294 + - jiti 29295 + - supports-color 29296 + - tsx 29297 + - yaml 29298 + 29109 29299 tuf-js@2.2.1: 29110 29300 dependencies: 29111 29301 '@tufjs/models': 2.0.1 ··· 29621 29811 29622 29812 webidl-conversions@3.0.1: {} 29623 29813 29814 + webidl-conversions@4.0.2: {} 29815 + 29624 29816 webidl-conversions@5.0.0: {} 29625 29817 29626 29818 webpack-dev-middleware@5.3.4(webpack@5.94.0(@swc/core@1.8.0(@swc/helpers@0.5.17))): ··· 29730 29922 dependencies: 29731 29923 tr46: 0.0.3 29732 29924 webidl-conversions: 3.0.1 29925 + 29926 + whatwg-url@7.1.0: 29927 + dependencies: 29928 + lodash.sortby: 4.7.0 29929 + tr46: 1.0.1 29930 + webidl-conversions: 4.0.2 29733 29931 29734 29932 which-boxed-primitive@1.0.2: 29735 29933 dependencies: