├── typedoc.json ├── .gitignore ├── .dprint.json ├── tsconfig.json ├── .eslintrc.json ├── package.json ├── README.md ├── src └── index.ts ├── LICENSE └── pnpm-lock.yaml /typedoc.json: -------------------------------------------------------------------------------- 1 | { 2 | "entryPoints": ["src/index.ts"] 3 | } 4 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | npm-debug.log* 2 | yarn-debug.log* 3 | yarn-error.log* 4 | .pnpm-debug.log* 5 | 6 | pids 7 | _.pid 8 | _.seed 9 | *.pid.lock 10 | .DS_Store 11 | 12 | node_modules/ 13 | 14 | *.tsbuildinfo 15 | .npm 16 | .eslintcache 17 | 18 | .env 19 | .env.* 20 | 21 | .idea/ 22 | .vscode/ 23 | 24 | dist/ 25 | -------------------------------------------------------------------------------- /.dprint.json: -------------------------------------------------------------------------------- 1 | { 2 | "indentWidth": 4, 3 | "useTabs": true, 4 | "typescript": { 5 | "lineWidth": 100, 6 | "preferSingleLine": true, 7 | "arrowFunction.useParentheses": "force", 8 | "quoteProps": "asNeeded" 9 | }, 10 | "json": {}, 11 | "includes": ["src/**/*.{ts,tsx,js,jsx,json}", "./*.{ts,tsx,js,jsx,json,sh}"], 12 | "plugins": [ 13 | "https://plugins.dprint.dev/typescript-0.88.1.wasm", 14 | "https://plugins.dprint.dev/json-0.17.4.wasm" 15 | ] 16 | } 17 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "lib": ["esnext"], 4 | "target": "esnext", 5 | "module": "nodenext", 6 | "moduleResolution": "nodenext", 7 | "moduleDetection": "force", 8 | 9 | "declaration": true, 10 | 11 | "skipLibCheck": true, 12 | "newLine": "lf", 13 | 14 | "forceConsistentCasingInFileNames": true, 15 | "useDefineForClassFields": true, 16 | 17 | "noUnusedLocals": true, 18 | "noUnusedParameters": true, 19 | "noImplicitOverride": true, 20 | "noImplicitAny": true, 21 | "exactOptionalPropertyTypes": true, 22 | "strict": true, 23 | 24 | "outDir": "dist", 25 | "rootDir": "src" 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": ["plugin:@typescript-eslint/strict-type-checked"], 3 | "plugins": ["@typescript-eslint"], 4 | "parser": "@typescript-eslint/parser", 5 | "parserOptions": { 6 | "project": "./tsconfig.json" 7 | }, 8 | "rules": { 9 | "@typescript-eslint/ban-types": "off", 10 | "@typescript-eslint/no-explicit-any": "off", 11 | "@typescript-eslint/no-misused-promises": "off", 12 | "@typescript-eslint/no-unnecessary-condition": "off", 13 | "@typescript-eslint/no-unsafe-assignment": "off", 14 | "@typescript-eslint/no-unsafe-member-access": "off", 15 | "@typescript-eslint/no-unsafe-return": "off", 16 | "@typescript-eslint/restrict-plus-operands": "off", 17 | "@typescript-eslint/restrict-template-expressions": "off", 18 | "@typescript-eslint/unified-signatures": "off" 19 | }, 20 | "ignorePatterns": ["dist", "node_modules"], 21 | "root": true 22 | } 23 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@skyware/firehose", 3 | "type": "module", 4 | "description": "A simple client for consuming data from an AT Protocol Relay.", 5 | "version": "0.5.2", 6 | "main": "dist/index.js", 7 | "types": "dist/index.d.ts", 8 | "license": "MPL-2.0", 9 | "repository": "https://github.com/skyware-js/firehose", 10 | "homepage": "https://skyware.js.org/docs/firehose", 11 | "keywords": [ 12 | "bluesky", 13 | "bot", 14 | "atproto", 15 | "skyware" 16 | ], 17 | "scripts": { 18 | "build": "tsc", 19 | "lint": "eslint . --ext .ts", 20 | "fmt": "dprint fmt", 21 | "prepublish": "pnpm lint && pnpm fmt && pnpm build" 22 | }, 23 | "devDependencies": { 24 | "@atcute/atproto": "^3.1.1", 25 | "@types/node": "^22.17.0", 26 | "@types/ws": "^8.5.10", 27 | "@typescript-eslint/eslint-plugin": "^6.7.4", 28 | "@typescript-eslint/parser": "^6.7.4", 29 | "dprint": "^0.41.0", 30 | "eslint": "^8.50.0", 31 | "multiformats": "^13.1.0", 32 | "typescript": "^5.9.2", 33 | "ws": "^8.16.0" 34 | }, 35 | "dependencies": { 36 | "@atcute/car": "^3.0.3", 37 | "@atcute/cbor": "^2.2.2", 38 | "nanoevents": "^9.1.0" 39 | }, 40 | "files": [ 41 | "dist" 42 | ] 43 | } 44 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

2 | 3 |

4 |

@skyware/firehose

5 | 6 | A simple client for consuming data from an AT Protocol Relay. 7 | 8 | [Documentation](https://skyware.js.org/docs/firehose) 9 | 10 | ## Installation 11 | 12 | ```sh 13 | npm install @skyware/firehose 14 | ``` 15 | 16 | ## Example Usage 17 | 18 | ```js 19 | import { Firehose } from "@skyware/firehose"; 20 | 21 | const firehose = new Firehose(); 22 | firehose.on("commit", (commit) => { 23 | for (const op of commit.ops) { 24 | console.log(op); 25 | } 26 | }); 27 | firehose.start(); 28 | ``` 29 | 30 | ### Events 31 | | Event | Description | 32 | |------------------|------------------------------------------------------------------------------------------------------------------------------| 33 | | `commit` | Represents a commit to a user's repository. | 34 | | `identity` | Represents a change to an account's identity. Could be an updated handle, signing key, or PDS hosting endpoint. | 35 | | `handle` | Represents an update of an account's handle, or transition to/from invalid state (may be deprecated in favor of `identity`). | 36 | | `tombstone` | Indicates that an account has been deleted (may be deprecated in favor of `identity` or a future `account` event). | 37 | | `info` | An informational message from the relay. | 38 | | `open` | Emitted when the websocket connection is opened. | 39 | | `close` | Emitted when the websocket connection is closed. | 40 | | `error` | Emitted when an error occurs while handling a message. | 41 | | `websocketError` | Emitted when an error occurs with the websocket connection. | 42 | 43 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import type { ComAtprotoSyncSubscribeRepos } from "@atcute/atproto"; 2 | import { readCar as createCarIterator } from "@atcute/car"; 3 | import { decode, decodeFirst, fromBytes, toCidLink } from "@atcute/cbor"; 4 | 5 | import { createNanoEvents, type Unsubscribe } from "nanoevents"; 6 | import type { Data as WSData, WebSocket as WSWebSocket } from "ws"; 7 | 8 | /** 9 | * Options for the Firehose class. 10 | */ 11 | export interface FirehoseOptions { 12 | /** 13 | * The Relay to connect to. 14 | */ 15 | relay?: string; 16 | /** 17 | * The cursor to listen from. If not provided, the firehose will start from the latest event. 18 | */ 19 | cursor?: string; 20 | /** 21 | * Whether to automatically reconnect when no new messages are received for a period of time. 22 | * This will not reconnect if the connection was closed intentionally. 23 | * To do that, listen for the `"close"` event and call `start()` again. 24 | * @default true 25 | */ 26 | autoReconnect?: boolean; 27 | 28 | /** 29 | * The WebSocket implementation to use (e.g. `import ws from "ws"`). 30 | * Not required if you are on Node 21.0.0 or newer, or another environment that provides a WebSocket implementation. 31 | */ 32 | ws?: typeof WSWebSocket | typeof WebSocket; 33 | } 34 | 35 | export class Firehose { 36 | /** The relay to connect to. */ 37 | public relay: string; 38 | 39 | /** WebSocket connection to the relay. */ 40 | public ws: WebSocket; 41 | 42 | /** The current cursor. */ 43 | public cursor = ""; 44 | 45 | private emitter = createNanoEvents(); 46 | 47 | private autoReconnect: boolean; 48 | 49 | private reconnectTimeout: NodeJS.Timeout | undefined; 50 | 51 | /** 52 | * Creates a new Firehose instance. 53 | * @param options Optional configuration. 54 | */ 55 | constructor(options: FirehoseOptions = {}) { 56 | this.relay = options.relay ?? "wss://bsky.network"; 57 | this.cursor = options.cursor ?? ""; 58 | this.autoReconnect = options.autoReconnect ?? true; 59 | 60 | const cursorQueryParameter = this.cursor ? `?cursor=${this.cursor}` : ""; 61 | 62 | if (typeof globalThis.WebSocket === "undefined" && !options.ws) { 63 | throw new Error( 64 | `No WebSocket implementation was found in your environment. You must provide an implementation as the \`ws\` option. 65 | 66 | For example, in a Node.js environment, \`npm install ws\` and then: 67 | import { Firehose } from "@skyware/firehose"; 68 | import WebSocket from "ws"; 69 | 70 | const firehose = new Firehose({ 71 | ws: WebSocket, 72 | });`, 73 | ); 74 | } 75 | 76 | const wsImpl = options.ws ?? globalThis.WebSocket; 77 | 78 | // @ts-expect-error — prototype incompatibility 79 | this.ws = new wsImpl( 80 | `${this.relay}/xrpc/com.atproto.sync.subscribeRepos${cursorQueryParameter}`, 81 | ); 82 | } 83 | 84 | /** 85 | * Opens a WebSocket connection to the relay. 86 | */ 87 | start() { 88 | this.ws.addEventListener("open", () => { 89 | this.emitter.emit("open"); 90 | }); 91 | 92 | this.ws.addEventListener("message", async ({ data }) => { 93 | try { 94 | // eslint-disable-next-line @typescript-eslint/no-unsafe-argument 95 | const message = await this.parseMessage(data); 96 | if ("seq" in message && message.seq && !isNaN(message.seq)) { 97 | this.cursor = `${message.seq}`; 98 | } 99 | switch (message.$type) { 100 | case "com.atproto.sync.subscribeRepos#identity": 101 | this.emitter.emit("identity", message); 102 | break; 103 | case "com.atproto.sync.subscribeRepos#account": 104 | this.emitter.emit("account", message); 105 | break; 106 | case "com.atproto.sync.subscribeRepos#info": 107 | this.emitter.emit("info", message); 108 | break; 109 | case "com.atproto.sync.subscribeRepos#sync": 110 | this.emitter.emit("sync", message); 111 | break; 112 | case "com.atproto.sync.subscribeRepos#commit": 113 | this.emitter.emit("commit", message); 114 | break; 115 | default: 116 | this.emitter.emit("unknown", message); 117 | break; 118 | } 119 | } catch (error) { 120 | this.emitter.emit("error", { cursor: this.cursor, error }); 121 | } finally { 122 | if (this.autoReconnect) this.preventReconnect(); 123 | } 124 | }); 125 | 126 | this.ws.addEventListener("close", () => { 127 | this.emitter.emit("close", this.cursor); 128 | }); 129 | 130 | this.ws.addEventListener("error", (error) => { 131 | this.emitter.emit("websocketError", { cursor: this.cursor, error }); 132 | }); 133 | } 134 | 135 | /** 136 | * Closes the WebSocket connection. 137 | */ 138 | close() { 139 | this.ws?.close(); 140 | } 141 | 142 | /** Emitted when the connection is opened. */ 143 | on(event: "open", listener: () => void): Unsubscribe; 144 | /** Emitted when the connection is closed. */ 145 | on(event: "close", listener: (cursor: string) => void): Unsubscribe; 146 | /** 147 | * Emitted when the websocket reconnects due to not receiving any messages for a period of time. 148 | * This will only be emitted if the `autoReconnect` option is `true`. 149 | */ 150 | on(event: "reconnect", listener: () => void): Unsubscribe; 151 | /** Emitted when an error occurs while handling a message. */ 152 | on( 153 | event: "error", 154 | listener: ({ cursor, error }: { cursor: string; error: Error }) => void, 155 | ): Unsubscribe; 156 | /** Emitted when an error occurs within the websocket. */ 157 | on( 158 | event: "websocketError", 159 | listener: ({ cursor, error }: { cursor: string; error: unknown }) => void, 160 | ): Unsubscribe; 161 | /** Represents a commit to a user's repository. */ 162 | on(event: "commit", listener: (message: CommitEvent) => void): Unsubscribe; 163 | /** 164 | * Updates the repo to a new state, without necessarily including that state on the firehose. 165 | * Used to recover from broken commit streams, data loss incidents, or in situations where upstream 166 | * host does not know recent state of the repository. 167 | */ 168 | on(event: "sync", listener: (message: SyncEvent) => void): Unsubscribe; 169 | /** Represents a change to an account's status on a host (eg, PDS or Relay). */ 170 | on(event: "account", listener: (message: AccountEvent) => void): Unsubscribe; 171 | /** 172 | * Represents a change to an account's identity. 173 | * Could be an updated handle, signing key, or pds hosting endpoint. 174 | */ 175 | on(event: "identity", listener: (message: IdentityEvent) => void): Unsubscribe; 176 | /** An informational message from the relay. */ 177 | on(event: "info", listener: (message: InfoEvent) => void): Unsubscribe; 178 | /** Emitted when an unknown message is received. */ 179 | on(event: "unknown", listener: (message: unknown) => void): Unsubscribe; 180 | on(event: string, listener: (...args: any[]) => void): () => void { 181 | return this.emitter.on(event, listener); 182 | } 183 | 184 | private async parseMessage(data: WSData): Promise { 185 | const buffer = new Uint8Array( 186 | await (new Blob(Array.isArray(data) ? data : [data])).arrayBuffer(), 187 | ); 188 | 189 | const [header, remainder] = decodeFirst(buffer); 190 | const [body, remainder2] = decodeFirst(remainder); 191 | if (remainder2.length > 0) { 192 | throw new Error("Excess bytes in message"); 193 | } 194 | 195 | const { t, op } = parseHeader(header); 196 | 197 | if (op === -1) { 198 | throw new Error(`Error: ${body.message}\nError code: ${body.error}`); 199 | } 200 | 201 | if (t === "#commit") { 202 | const { 203 | seq, 204 | repo, 205 | commit, 206 | rev, 207 | since, 208 | blocks: blocksBytes, 209 | ops: commitOps, 210 | prevData, 211 | time, 212 | } = body as ComAtprotoSyncSubscribeRepos.Commit; 213 | 214 | // A commit can contain no changes 215 | if (!blocksBytes?.$bytes?.length) { 216 | return { 217 | $type: "com.atproto.sync.subscribeRepos#commit", 218 | seq, 219 | repo, 220 | commit: commit.$link, 221 | rev, 222 | since, 223 | blocks: new Uint8Array(), 224 | ops: [], 225 | ...(prevData ? { prevData: prevData.$link } : {}), 226 | time, 227 | } satisfies CommitEvent; 228 | } 229 | 230 | const blocks = fromBytes(blocksBytes); 231 | const car = readCar(blocks); 232 | 233 | const ops: Array = []; 234 | for (const op of commitOps) { 235 | const action: "create" | "update" | "delete" = op.action as any; 236 | if (action === "create") { 237 | if (!op.cid) continue; 238 | const record = car.get(op.cid.$link); 239 | if (!record) continue; 240 | ops.push( 241 | { action, path: op.path, cid: op.cid.$link, record } satisfies CreateOp, 242 | ); 243 | } else if (action === "update") { 244 | if (!op.cid) continue; 245 | const record = car.get(op.cid.$link); 246 | if (!record) continue; 247 | ops.push( 248 | { 249 | action, 250 | path: op.path, 251 | cid: op.cid.$link, 252 | ...(op.prev ? { prev: op.prev.$link } : {}), 253 | record, 254 | } satisfies UpdateOp, 255 | ); 256 | } else if (action === "delete") { 257 | ops.push( 258 | { 259 | action, 260 | path: op.path, 261 | ...(op.prev ? { prev: op.prev.$link } : {}), 262 | } satisfies DeleteOp, 263 | ); 264 | } else { 265 | throw new Error(`Unknown action: ${action}`); 266 | } 267 | } 268 | 269 | return { 270 | $type: "com.atproto.sync.subscribeRepos#commit", 271 | seq, 272 | repo, 273 | commit: commit.$link, 274 | rev, 275 | since, 276 | blocks, 277 | ops, 278 | ...(prevData ? { prevData: prevData.$link } : {}), 279 | time, 280 | } satisfies CommitEvent; 281 | } else if (t === "#sync") { 282 | const { seq, did, blocks: blocksBytes, rev, time } = 283 | body as ComAtprotoSyncSubscribeRepos.Sync; 284 | 285 | const blocks = (blocksBytes?.$bytes?.length) 286 | ? fromBytes(blocksBytes) 287 | : new Uint8Array(); 288 | return { 289 | $type: "com.atproto.sync.subscribeRepos#sync", 290 | seq, 291 | did, 292 | blocks, 293 | rev, 294 | time, 295 | } satisfies SyncEvent; 296 | } 297 | 298 | return { $type: `com.atproto.sync.subscribeRepos${t}`, ...body }; 299 | } 300 | 301 | private preventReconnect() { 302 | if (this.reconnectTimeout) clearTimeout(this.reconnectTimeout); 303 | this.reconnectTimeout = setTimeout(() => { 304 | this.reconnect(); 305 | }, 5_000); 306 | } 307 | 308 | private reconnect() { 309 | this.ws?.close(); 310 | this.start(); 311 | this.emitter.emit("reconnect"); 312 | } 313 | } 314 | 315 | /** 316 | * Represents a `create` repository operation. 317 | */ 318 | export interface CreateOp { 319 | action: "create"; 320 | /** The record's path in the repository. */ 321 | path: string; 322 | /** The record's CID. */ 323 | cid: string; 324 | /** The record's content. */ 325 | record: {}; 326 | } 327 | 328 | /** 329 | * Represents an `update` repository operation. 330 | */ 331 | export interface UpdateOp { 332 | action: "update"; 333 | /** The record's path in the repository. */ 334 | path: string; 335 | /** The record's CID. */ 336 | cid: string; 337 | /** The previous record CID. */ 338 | prev?: string; 339 | /** The record's content. */ 340 | record: {}; 341 | } 342 | 343 | /** 344 | * Represents a `delete` repository operation. 345 | */ 346 | export interface DeleteOp { 347 | action: "delete"; 348 | /** The record's path in the repository. */ 349 | path: string; 350 | /** The previous record CID. */ 351 | prev?: string; 352 | } 353 | 354 | /** A repository operation. */ 355 | export type RepoOp = CreateOp | UpdateOp | DeleteOp; 356 | 357 | /** 358 | * Represents an update of repository state. 359 | */ 360 | export interface CommitEvent { 361 | $type: "com.atproto.sync.subscribeRepos#commit"; 362 | /** The stream sequence number of this message. */ 363 | seq: number; 364 | /** The repo this event comes from. */ 365 | repo: string; 366 | /** Repo commit object CID. */ 367 | commit: string; 368 | /** The rev of the emitted commit. Note that this information is also in the commit object included in blocks, unless this is a tooBig event. */ 369 | rev: string; 370 | /** The rev of the last emitted commit from this repo (if any). */ 371 | since: string | null; 372 | /** CAR file containing relevant blocks, as a diff since the previous repo state. */ 373 | blocks: Uint8Array; 374 | /** List of repo mutation operations in this commit (eg, records created, updated, or deleted). */ 375 | ops: Array; 376 | /** List of new blobs (by CID) referenced by records in this commit. */ 377 | blobs?: { $link: string }[]; 378 | /** Timestamp of when this message was originally broadcast. */ 379 | time: string; 380 | } 381 | 382 | export interface SyncEvent { 383 | $type: "com.atproto.sync.subscribeRepos#sync"; 384 | /** The stream sequence number of this message. */ 385 | seq: number; 386 | /** The repo this event comes from. */ 387 | did: string; 388 | /** CAR file containing the commit, as a block. */ 389 | blocks: Uint8Array; 390 | /** The rev of the commit. */ 391 | rev: string; 392 | /** Timestamp of when this message was originally broadcast. */ 393 | time: string; 394 | } 395 | 396 | export type AccountEvent = ComAtprotoSyncSubscribeRepos.Account & { 397 | $type: "com.atproto.sync.subscribeRepos#account"; 398 | }; 399 | export type IdentityEvent = ComAtprotoSyncSubscribeRepos.Identity & { 400 | $type: "com.atproto.sync.subscribeRepos#identity"; 401 | }; 402 | export type InfoEvent = ComAtprotoSyncSubscribeRepos.Info & { 403 | $type: "com.atproto.sync.subscribeRepos#info"; 404 | }; 405 | export type Event = CommitEvent | SyncEvent | AccountEvent | IdentityEvent | InfoEvent; 406 | 407 | function parseHeader(header: any): { t: string; op: 1 | -1 } { 408 | if ( 409 | !header 410 | || typeof header !== "object" 411 | || !header.t 412 | || typeof header.t !== "string" 413 | || !header.op 414 | || typeof header.op !== "number" 415 | ) { 416 | throw new Error("Invalid header received"); 417 | } 418 | return { t: header.t, op: header.op }; 419 | } 420 | 421 | function readCar(buffer: Uint8Array): Map { 422 | const records = new Map(); 423 | for (const { cid, bytes } of createCarIterator(buffer)) { 424 | records.set(toCidLink(cid).$link, decode(bytes)); 425 | } 426 | return records; 427 | } 428 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Mozilla Public License Version 2.0 2 | ================================== 3 | 4 | 1. Definitions 5 | -------------- 6 | 7 | 1.1. "Contributor" 8 | means each individual or legal entity that creates, contributes to 9 | the creation of, or owns Covered Software. 10 | 11 | 1.2. "Contributor Version" 12 | means the combination of the Contributions of others (if any) used 13 | by a Contributor and that particular Contributor's Contribution. 14 | 15 | 1.3. "Contribution" 16 | means Covered Software of a particular Contributor. 17 | 18 | 1.4. "Covered Software" 19 | means Source Code Form to which the initial Contributor has attached 20 | the notice in Exhibit A, the Executable Form of such Source Code 21 | Form, and Modifications of such Source Code Form, in each case 22 | including portions thereof. 23 | 24 | 1.5. "Incompatible With Secondary Licenses" 25 | means 26 | 27 | (a) that the initial Contributor has attached the notice described 28 | in Exhibit B to the Covered Software; or 29 | 30 | (b) that the Covered Software was made available under the terms of 31 | version 1.1 or earlier of the License, but not also under the 32 | terms of a Secondary License. 33 | 34 | 1.6. "Executable Form" 35 | means any form of the work other than Source Code Form. 36 | 37 | 1.7. "Larger Work" 38 | means a work that combines Covered Software with other material, in 39 | a separate file or files, that is not Covered Software. 40 | 41 | 1.8. "License" 42 | means this document. 43 | 44 | 1.9. "Licensable" 45 | means having the right to grant, to the maximum extent possible, 46 | whether at the time of the initial grant or subsequently, any and 47 | all of the rights conveyed by this License. 48 | 49 | 1.10. "Modifications" 50 | means any of the following: 51 | 52 | (a) any file in Source Code Form that results from an addition to, 53 | deletion from, or modification of the contents of Covered 54 | Software; or 55 | 56 | (b) any new file in Source Code Form that contains any Covered 57 | Software. 58 | 59 | 1.11. "Patent Claims" of a Contributor 60 | means any patent claim(s), including without limitation, method, 61 | process, and apparatus claims, in any patent Licensable by such 62 | Contributor that would be infringed, but for the grant of the 63 | License, by the making, using, selling, offering for sale, having 64 | made, import, or transfer of either its Contributions or its 65 | Contributor Version. 66 | 67 | 1.12. "Secondary License" 68 | means either the GNU General Public License, Version 2.0, the GNU 69 | Lesser General Public License, Version 2.1, the GNU Affero General 70 | Public License, Version 3.0, or any later versions of those 71 | licenses. 72 | 73 | 1.13. "Source Code Form" 74 | means the form of the work preferred for making modifications. 75 | 76 | 1.14. "You" (or "Your") 77 | means an individual or a legal entity exercising rights under this 78 | License. For legal entities, "You" includes any entity that 79 | controls, is controlled by, or is under common control with You. For 80 | purposes of this definition, "control" means (a) the power, direct 81 | or indirect, to cause the direction or management of such entity, 82 | whether by contract or otherwise, or (b) ownership of more than 83 | fifty percent (50%) of the outstanding shares or beneficial 84 | ownership of such entity. 85 | 86 | 2. License Grants and Conditions 87 | -------------------------------- 88 | 89 | 2.1. Grants 90 | 91 | Each Contributor hereby grants You a world-wide, royalty-free, 92 | non-exclusive license: 93 | 94 | (a) under intellectual property rights (other than patent or trademark) 95 | Licensable by such Contributor to use, reproduce, make available, 96 | modify, display, perform, distribute, and otherwise exploit its 97 | Contributions, either on an unmodified basis, with Modifications, or 98 | as part of a Larger Work; and 99 | 100 | (b) under Patent Claims of such Contributor to make, use, sell, offer 101 | for sale, have made, import, and otherwise transfer either its 102 | Contributions or its Contributor Version. 103 | 104 | 2.2. Effective Date 105 | 106 | The licenses granted in Section 2.1 with respect to any Contribution 107 | become effective for each Contribution on the date the Contributor first 108 | distributes such Contribution. 109 | 110 | 2.3. Limitations on Grant Scope 111 | 112 | The licenses granted in this Section 2 are the only rights granted under 113 | this License. No additional rights or licenses will be implied from the 114 | distribution or licensing of Covered Software under this License. 115 | Notwithstanding Section 2.1(b) above, no patent license is granted by a 116 | Contributor: 117 | 118 | (a) for any code that a Contributor has removed from Covered Software; 119 | or 120 | 121 | (b) for infringements caused by: (i) Your and any other third party's 122 | modifications of Covered Software, or (ii) the combination of its 123 | Contributions with other software (except as part of its Contributor 124 | Version); or 125 | 126 | (c) under Patent Claims infringed by Covered Software in the absence of 127 | its Contributions. 128 | 129 | This License does not grant any rights in the trademarks, service marks, 130 | or logos of any Contributor (except as may be necessary to comply with 131 | the notice requirements in Section 3.4). 132 | 133 | 2.4. Subsequent Licenses 134 | 135 | No Contributor makes additional grants as a result of Your choice to 136 | distribute the Covered Software under a subsequent version of this 137 | License (see Section 10.2) or under the terms of a Secondary License (if 138 | permitted under the terms of Section 3.3). 139 | 140 | 2.5. Representation 141 | 142 | Each Contributor represents that the Contributor believes its 143 | Contributions are its original creation(s) or it has sufficient rights 144 | to grant the rights to its Contributions conveyed by this License. 145 | 146 | 2.6. Fair Use 147 | 148 | This License is not intended to limit any rights You have under 149 | applicable copyright doctrines of fair use, fair dealing, or other 150 | equivalents. 151 | 152 | 2.7. Conditions 153 | 154 | Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted 155 | in Section 2.1. 156 | 157 | 3. Responsibilities 158 | ------------------- 159 | 160 | 3.1. Distribution of Source Form 161 | 162 | All distribution of Covered Software in Source Code Form, including any 163 | Modifications that You create or to which You contribute, must be under 164 | the terms of this License. You must inform recipients that the Source 165 | Code Form of the Covered Software is governed by the terms of this 166 | License, and how they can obtain a copy of this License. You may not 167 | attempt to alter or restrict the recipients' rights in the Source Code 168 | Form. 169 | 170 | 3.2. Distribution of Executable Form 171 | 172 | If You distribute Covered Software in Executable Form then: 173 | 174 | (a) such Covered Software must also be made available in Source Code 175 | Form, as described in Section 3.1, and You must inform recipients of 176 | the Executable Form how they can obtain a copy of such Source Code 177 | Form by reasonable means in a timely manner, at a charge no more 178 | than the cost of distribution to the recipient; and 179 | 180 | (b) You may distribute such Executable Form under the terms of this 181 | License, or sublicense it under different terms, provided that the 182 | license for the Executable Form does not attempt to limit or alter 183 | the recipients' rights in the Source Code Form under this License. 184 | 185 | 3.3. Distribution of a Larger Work 186 | 187 | You may create and distribute a Larger Work under terms of Your choice, 188 | provided that You also comply with the requirements of this License for 189 | the Covered Software. If the Larger Work is a combination of Covered 190 | Software with a work governed by one or more Secondary Licenses, and the 191 | Covered Software is not Incompatible With Secondary Licenses, this 192 | License permits You to additionally distribute such Covered Software 193 | under the terms of such Secondary License(s), so that the recipient of 194 | the Larger Work may, at their option, further distribute the Covered 195 | Software under the terms of either this License or such Secondary 196 | License(s). 197 | 198 | 3.4. Notices 199 | 200 | You may not remove or alter the substance of any license notices 201 | (including copyright notices, patent notices, disclaimers of warranty, 202 | or limitations of liability) contained within the Source Code Form of 203 | the Covered Software, except that You may alter any license notices to 204 | the extent required to remedy known factual inaccuracies. 205 | 206 | 3.5. Application of Additional Terms 207 | 208 | You may choose to offer, and to charge a fee for, warranty, support, 209 | indemnity or liability obligations to one or more recipients of Covered 210 | Software. However, You may do so only on Your own behalf, and not on 211 | behalf of any Contributor. You must make it absolutely clear that any 212 | such warranty, support, indemnity, or liability obligation is offered by 213 | You alone, and You hereby agree to indemnify every Contributor for any 214 | liability incurred by such Contributor as a result of warranty, support, 215 | indemnity or liability terms You offer. You may include additional 216 | disclaimers of warranty and limitations of liability specific to any 217 | jurisdiction. 218 | 219 | 4. Inability to Comply Due to Statute or Regulation 220 | --------------------------------------------------- 221 | 222 | If it is impossible for You to comply with any of the terms of this 223 | License with respect to some or all of the Covered Software due to 224 | statute, judicial order, or regulation then You must: (a) comply with 225 | the terms of this License to the maximum extent possible; and (b) 226 | describe the limitations and the code they affect. Such description must 227 | be placed in a text file included with all distributions of the Covered 228 | Software under this License. Except to the extent prohibited by statute 229 | or regulation, such description must be sufficiently detailed for a 230 | recipient of ordinary skill to be able to understand it. 231 | 232 | 5. Termination 233 | -------------- 234 | 235 | 5.1. The rights granted under this License will terminate automatically 236 | if You fail to comply with any of its terms. However, if You become 237 | compliant, then the rights granted under this License from a particular 238 | Contributor are reinstated (a) provisionally, unless and until such 239 | Contributor explicitly and finally terminates Your grants, and (b) on an 240 | ongoing basis, if such Contributor fails to notify You of the 241 | non-compliance by some reasonable means prior to 60 days after You have 242 | come back into compliance. Moreover, Your grants from a particular 243 | Contributor are reinstated on an ongoing basis if such Contributor 244 | notifies You of the non-compliance by some reasonable means, this is the 245 | first time You have received notice of non-compliance with this License 246 | from such Contributor, and You become compliant prior to 30 days after 247 | Your receipt of the notice. 248 | 249 | 5.2. If You initiate litigation against any entity by asserting a patent 250 | infringement claim (excluding declaratory judgment actions, 251 | counter-claims, and cross-claims) alleging that a Contributor Version 252 | directly or indirectly infringes any patent, then the rights granted to 253 | You by any and all Contributors for the Covered Software under Section 254 | 2.1 of this License shall terminate. 255 | 256 | 5.3. In the event of termination under Sections 5.1 or 5.2 above, all 257 | end user license agreements (excluding distributors and resellers) which 258 | have been validly granted by You or Your distributors under this License 259 | prior to termination shall survive termination. 260 | 261 | ************************************************************************ 262 | * * 263 | * 6. Disclaimer of Warranty * 264 | * ------------------------- * 265 | * * 266 | * Covered Software is provided under this License on an "as is" * 267 | * basis, without warranty of any kind, either expressed, implied, or * 268 | * statutory, including, without limitation, warranties that the * 269 | * Covered Software is free of defects, merchantable, fit for a * 270 | * particular purpose or non-infringing. The entire risk as to the * 271 | * quality and performance of the Covered Software is with You. * 272 | * Should any Covered Software prove defective in any respect, You * 273 | * (not any Contributor) assume the cost of any necessary servicing, * 274 | * repair, or correction. This disclaimer of warranty constitutes an * 275 | * essential part of this License. No use of any Covered Software is * 276 | * authorized under this License except under this disclaimer. * 277 | * * 278 | ************************************************************************ 279 | 280 | ************************************************************************ 281 | * * 282 | * 7. Limitation of Liability * 283 | * -------------------------- * 284 | * * 285 | * Under no circumstances and under no legal theory, whether tort * 286 | * (including negligence), contract, or otherwise, shall any * 287 | * Contributor, or anyone who distributes Covered Software as * 288 | * permitted above, be liable to You for any direct, indirect, * 289 | * special, incidental, or consequential damages of any character * 290 | * including, without limitation, damages for lost profits, loss of * 291 | * goodwill, work stoppage, computer failure or malfunction, or any * 292 | * and all other commercial damages or losses, even if such party * 293 | * shall have been informed of the possibility of such damages. This * 294 | * limitation of liability shall not apply to liability for death or * 295 | * personal injury resulting from such party's negligence to the * 296 | * extent applicable law prohibits such limitation. Some * 297 | * jurisdictions do not allow the exclusion or limitation of * 298 | * incidental or consequential damages, so this exclusion and * 299 | * limitation may not apply to You. * 300 | * * 301 | ************************************************************************ 302 | 303 | 8. Litigation 304 | ------------- 305 | 306 | Any litigation relating to this License may be brought only in the 307 | courts of a jurisdiction where the defendant maintains its principal 308 | place of business and such litigation shall be governed by laws of that 309 | jurisdiction, without reference to its conflict-of-law provisions. 310 | Nothing in this Section shall prevent a party's ability to bring 311 | cross-claims or counter-claims. 312 | 313 | 9. Miscellaneous 314 | ---------------- 315 | 316 | This License represents the complete agreement concerning the subject 317 | matter hereof. If any provision of this License is held to be 318 | unenforceable, such provision shall be reformed only to the extent 319 | necessary to make it enforceable. Any law or regulation which provides 320 | that the language of a contract shall be construed against the drafter 321 | shall not be used to construe this License against a Contributor. 322 | 323 | 10. Versions of the License 324 | --------------------------- 325 | 326 | 10.1. New Versions 327 | 328 | Mozilla Foundation is the license steward. Except as provided in Section 329 | 10.3, no one other than the license steward has the right to modify or 330 | publish new versions of this License. Each version will be given a 331 | distinguishing version number. 332 | 333 | 10.2. Effect of New Versions 334 | 335 | You may distribute the Covered Software under the terms of the version 336 | of the License under which You originally received the Covered Software, 337 | or under the terms of any subsequent version published by the license 338 | steward. 339 | 340 | 10.3. Modified Versions 341 | 342 | If you create software not governed by this License, and you want to 343 | create a new license for such software, you may create and use a 344 | modified version of this License if you rename the license and remove 345 | any references to the name of the license steward (except to note that 346 | such modified license differs from this License). 347 | 348 | 10.4. Distributing Source Code Form that is Incompatible With Secondary 349 | Licenses 350 | 351 | If You choose to distribute Source Code Form that is Incompatible With 352 | Secondary Licenses under the terms of this version of the License, the 353 | notice described in Exhibit B of this License must be attached. 354 | 355 | Exhibit A - Source Code Form License Notice 356 | ------------------------------------------- 357 | 358 | This Source Code Form is subject to the terms of the Mozilla Public 359 | License, v. 2.0. If a copy of the MPL was not distributed with this 360 | file, You can obtain one at http://mozilla.org/MPL/2.0/. 361 | 362 | If it is not possible or desirable to put the notice in a particular 363 | file, then You may include the notice in a location (such as a LICENSE 364 | file in a relevant directory) where a recipient would be likely to look 365 | for such a notice. 366 | 367 | You may add additional accurate notices of copyright ownership. 368 | 369 | Exhibit B - "Incompatible With Secondary Licenses" Notice 370 | --------------------------------------------------------- 371 | 372 | This Source Code Form is "Incompatible With Secondary Licenses", as 373 | defined by the Mozilla Public License, v. 2.0. 374 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | dependencies: 11 | '@atcute/car': 12 | specifier: ^3.0.3 13 | version: 3.1.1 14 | '@atcute/cbor': 15 | specifier: ^2.2.2 16 | version: 2.2.5 17 | nanoevents: 18 | specifier: ^9.1.0 19 | version: 9.1.0 20 | devDependencies: 21 | '@atcute/atproto': 22 | specifier: ^3.1.1 23 | version: 3.1.1 24 | '@types/node': 25 | specifier: ^22.17.0 26 | version: 22.17.0 27 | '@types/ws': 28 | specifier: ^8.5.10 29 | version: 8.5.10 30 | '@typescript-eslint/eslint-plugin': 31 | specifier: ^6.7.4 32 | version: 6.7.4(@typescript-eslint/parser@6.7.4(eslint@8.50.0)(typescript@5.9.2))(eslint@8.50.0)(typescript@5.9.2) 33 | '@typescript-eslint/parser': 34 | specifier: ^6.7.4 35 | version: 6.7.4(eslint@8.50.0)(typescript@5.9.2) 36 | dprint: 37 | specifier: ^0.41.0 38 | version: 0.41.0 39 | eslint: 40 | specifier: ^8.50.0 41 | version: 8.50.0 42 | multiformats: 43 | specifier: ^13.1.0 44 | version: 13.1.0 45 | typescript: 46 | specifier: ^5.9.2 47 | version: 5.9.2 48 | ws: 49 | specifier: ^8.16.0 50 | version: 8.18.3 51 | 52 | packages: 53 | 54 | '@aashutoshrathi/word-wrap@1.2.6': 55 | resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} 56 | engines: {node: '>=0.10.0'} 57 | 58 | '@atcute/atproto@3.1.1': 59 | resolution: {integrity: sha512-D+RLTIPF0xLu7BPZY8KSewAPemJFh+3n3zeQ3ROsLxbTtCHbrTDMAmAFexaVRAPGcPYrwXaBUlv7yZjScJolMg==} 60 | 61 | '@atcute/car@3.1.1': 62 | resolution: {integrity: sha512-yhez/LqIl0zHubG6z/G/gqWYHmg7wJ5L4jNkbXj5FvZ4eOvmzsw8+ojbdq6wfMU4p5NhP0pUJNLkTZHbYSPmLg==} 63 | 64 | '@atcute/cbor@2.2.5': 65 | resolution: {integrity: sha512-sBT8+6qau0mC3kwgmjl+nzqGn02xsE9b+kSgXm4/BRd9w8fwdRQYwcC9ApDlfaojrljJfcEkimppl/IcPOF3CA==} 66 | 67 | '@atcute/cid@2.2.3': 68 | resolution: {integrity: sha512-WEzNSL1EuCVtCQDFYEBIm4dEP6PcMEwi8IYUVIWvT77eO5EjY58F63z5T4qMABxSBM0+L4kqMxypdL1Fzf6LZw==} 69 | 70 | '@atcute/lexicons@1.1.0': 71 | resolution: {integrity: sha512-LFqwnria78xLYb62Ri/+WwQpUTgZp2DuyolNGIIOV1dpiKhFFFh//nscHMA6IExFLQRqWDs3tTjy7zv0h3sf1Q==} 72 | 73 | '@atcute/multibase@1.1.4': 74 | resolution: {integrity: sha512-NUf5AeeSOmuZHGU+4GAaMtISJoG+ZHtW/vUVA4lK/YDt/7LODAW0Fd0NNIIUPVUoW0xJS6zSEIWvwLLuxmEHhA==} 75 | 76 | '@atcute/uint8array@1.0.3': 77 | resolution: {integrity: sha512-M/K+ihiVW8Pl2PFLzaC4E3l4JaZ1IH05Q0AbPWUC4cVHnd/gZ/1kAF5ngdtGvJeDMirHZ2VAy7OmAsPwR/2nlA==} 78 | 79 | '@atcute/varint@1.0.2': 80 | resolution: {integrity: sha512-0O31hePzzr4O3NGWHUKKOyta6CGSL+AtN8iir8grGxu9jXyI7DBARlw6PbgKA6uTAvsXdpmRmF8MX+p0TsLnNg==} 81 | 82 | '@dprint/darwin-arm64@0.41.0': 83 | resolution: {integrity: sha512-P9PtcQI0mrI4U6yyd+/iI664BHSqC9KTS6ogq0ptEdnLtlaWzf09D1nv6FBaHiG9m3conuBRlPsoUqt3j6PZ2w==} 84 | cpu: [arm64] 85 | os: [darwin] 86 | 87 | '@dprint/darwin-x64@0.41.0': 88 | resolution: {integrity: sha512-mSYnSoH0uyCkjgIWTny2DZAcaiRTe3kRWY5SeZECLGO37e+SdVg+ZjSzndhOvvEb9pv8EeBO1NJ9gHOSceT5Xw==} 89 | cpu: [x64] 90 | os: [darwin] 91 | 92 | '@dprint/linux-arm64-glibc@0.41.0': 93 | resolution: {integrity: sha512-U4xWzjjO/aAct8cSSMZFhg8l1jWy6VahXh8zWjGBufwX7t3xEcxMG9RyAp/ioYSY6wl4YXAmnUHywhC+wSjDHQ==} 94 | cpu: [arm64] 95 | os: [linux] 96 | 97 | '@dprint/linux-x64-glibc@0.41.0': 98 | resolution: {integrity: sha512-wjv5l4mGns7E8i32E8FfAk45tw5O7v4NM17gtvhe6ggOiOD6quHowOH00pLfEakMLMF9y0J5ZO2hxJ/w06bXmQ==} 99 | cpu: [x64] 100 | os: [linux] 101 | 102 | '@dprint/linux-x64-musl@0.41.0': 103 | resolution: {integrity: sha512-ZZOqiur9Xi/2uhz0Ce215VTSajAlSrduX/5k/hpIjI7Rgz22Vn77p5fmYxzWkTt/Li1zq5zboTvmGYx0QVNMrQ==} 104 | cpu: [x64] 105 | os: [linux] 106 | 107 | '@dprint/win32-x64@0.41.0': 108 | resolution: {integrity: sha512-mFx6x4Hn848/D4gPbDm7g1wlnOh2SGoVF9c9HMGCuOobUU2WIBztzV4L5qlFCB3gprlS0ru9BhlMpGhrp0CBYA==} 109 | cpu: [x64] 110 | os: [win32] 111 | 112 | '@eslint-community/eslint-utils@4.4.0': 113 | resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} 114 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 115 | peerDependencies: 116 | eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 117 | 118 | '@eslint-community/regexpp@4.10.0': 119 | resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} 120 | engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} 121 | 122 | '@eslint/eslintrc@2.1.4': 123 | resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} 124 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 125 | 126 | '@eslint/js@8.50.0': 127 | resolution: {integrity: sha512-NCC3zz2+nvYd+Ckfh87rA47zfu2QsQpvc6k1yzTk+b9KzRj0wkGa8LSoGOXN6Zv4lRf/EIoZ80biDh9HOI+RNQ==} 128 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 129 | 130 | '@humanwhocodes/config-array@0.11.14': 131 | resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} 132 | engines: {node: '>=10.10.0'} 133 | 134 | '@humanwhocodes/module-importer@1.0.1': 135 | resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} 136 | engines: {node: '>=12.22'} 137 | 138 | '@humanwhocodes/object-schema@2.0.2': 139 | resolution: {integrity: sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==} 140 | 141 | '@nodelib/fs.scandir@2.1.5': 142 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 143 | engines: {node: '>= 8'} 144 | 145 | '@nodelib/fs.stat@2.0.5': 146 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 147 | engines: {node: '>= 8'} 148 | 149 | '@nodelib/fs.walk@1.2.8': 150 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 151 | engines: {node: '>= 8'} 152 | 153 | '@types/json-schema@7.0.15': 154 | resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} 155 | 156 | '@types/node@22.17.0': 157 | resolution: {integrity: sha512-bbAKTCqX5aNVryi7qXVMi+OkB3w/OyblodicMbvE38blyAz7GxXf6XYhklokijuPwwVg9sDLKRxt0ZHXQwZVfQ==} 158 | 159 | '@types/semver@7.5.7': 160 | resolution: {integrity: sha512-/wdoPq1QqkSj9/QOeKkFquEuPzQbHTWAMPH/PaUMB+JuR31lXhlWXRZ52IpfDYVlDOUBvX09uBrPwxGT1hjNBg==} 161 | 162 | '@types/ws@8.5.10': 163 | resolution: {integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==} 164 | 165 | '@typescript-eslint/eslint-plugin@6.7.4': 166 | resolution: {integrity: sha512-DAbgDXwtX+pDkAHwiGhqP3zWUGpW49B7eqmgpPtg+BKJXwdct79ut9+ifqOFPJGClGKSHXn2PTBatCnldJRUoA==} 167 | engines: {node: ^16.0.0 || >=18.0.0} 168 | peerDependencies: 169 | '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha 170 | eslint: ^7.0.0 || ^8.0.0 171 | typescript: '*' 172 | peerDependenciesMeta: 173 | typescript: 174 | optional: true 175 | 176 | '@typescript-eslint/parser@6.7.4': 177 | resolution: {integrity: sha512-I5zVZFY+cw4IMZUeNCU7Sh2PO5O57F7Lr0uyhgCJmhN/BuTlnc55KxPonR4+EM3GBdfiCyGZye6DgMjtubQkmA==} 178 | engines: {node: ^16.0.0 || >=18.0.0} 179 | peerDependencies: 180 | eslint: ^7.0.0 || ^8.0.0 181 | typescript: '*' 182 | peerDependenciesMeta: 183 | typescript: 184 | optional: true 185 | 186 | '@typescript-eslint/scope-manager@6.7.4': 187 | resolution: {integrity: sha512-SdGqSLUPTXAXi7c3Ob7peAGVnmMoGzZ361VswK2Mqf8UOYcODiYvs8rs5ILqEdfvX1lE7wEZbLyELCW+Yrql1A==} 188 | engines: {node: ^16.0.0 || >=18.0.0} 189 | 190 | '@typescript-eslint/type-utils@6.7.4': 191 | resolution: {integrity: sha512-n+g3zi1QzpcAdHFP9KQF+rEFxMb2KxtnJGID3teA/nxKHOVi3ylKovaqEzGBbVY2pBttU6z85gp0D00ufLzViQ==} 192 | engines: {node: ^16.0.0 || >=18.0.0} 193 | peerDependencies: 194 | eslint: ^7.0.0 || ^8.0.0 195 | typescript: '*' 196 | peerDependenciesMeta: 197 | typescript: 198 | optional: true 199 | 200 | '@typescript-eslint/types@6.7.4': 201 | resolution: {integrity: sha512-o9XWK2FLW6eSS/0r/tgjAGsYasLAnOWg7hvZ/dGYSSNjCh+49k5ocPN8OmG5aZcSJ8pclSOyVKP2x03Sj+RrCA==} 202 | engines: {node: ^16.0.0 || >=18.0.0} 203 | 204 | '@typescript-eslint/typescript-estree@6.7.4': 205 | resolution: {integrity: sha512-ty8b5qHKatlNYd9vmpHooQz3Vki3gG+3PchmtsA4TgrZBKWHNjWfkQid7K7xQogBqqc7/BhGazxMD5vr6Ha+iQ==} 206 | engines: {node: ^16.0.0 || >=18.0.0} 207 | peerDependencies: 208 | typescript: '*' 209 | peerDependenciesMeta: 210 | typescript: 211 | optional: true 212 | 213 | '@typescript-eslint/utils@6.7.4': 214 | resolution: {integrity: sha512-PRQAs+HUn85Qdk+khAxsVV+oULy3VkbH3hQ8hxLRJXWBEd7iI+GbQxH5SEUSH7kbEoTp6oT1bOwyga24ELALTA==} 215 | engines: {node: ^16.0.0 || >=18.0.0} 216 | peerDependencies: 217 | eslint: ^7.0.0 || ^8.0.0 218 | 219 | '@typescript-eslint/visitor-keys@6.7.4': 220 | resolution: {integrity: sha512-pOW37DUhlTZbvph50x5zZCkFn3xzwkGtNoJHzIM3svpiSkJzwOYr/kVBaXmf+RAQiUDs1AHEZVNPg6UJCJpwRA==} 221 | engines: {node: ^16.0.0 || >=18.0.0} 222 | 223 | acorn-jsx@5.3.2: 224 | resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} 225 | peerDependencies: 226 | acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 227 | 228 | acorn@8.11.3: 229 | resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} 230 | engines: {node: '>=0.4.0'} 231 | hasBin: true 232 | 233 | ajv@6.12.6: 234 | resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} 235 | 236 | ansi-regex@5.0.1: 237 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 238 | engines: {node: '>=8'} 239 | 240 | ansi-styles@4.3.0: 241 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 242 | engines: {node: '>=8'} 243 | 244 | argparse@2.0.1: 245 | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 246 | 247 | array-union@2.1.0: 248 | resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} 249 | engines: {node: '>=8'} 250 | 251 | balanced-match@1.0.2: 252 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 253 | 254 | brace-expansion@1.1.11: 255 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 256 | 257 | braces@3.0.2: 258 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} 259 | engines: {node: '>=8'} 260 | 261 | callsites@3.1.0: 262 | resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 263 | engines: {node: '>=6'} 264 | 265 | chalk@4.1.2: 266 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 267 | engines: {node: '>=10'} 268 | 269 | color-convert@2.0.1: 270 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 271 | engines: {node: '>=7.0.0'} 272 | 273 | color-name@1.1.4: 274 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 275 | 276 | concat-map@0.0.1: 277 | resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} 278 | 279 | cross-spawn@7.0.3: 280 | resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} 281 | engines: {node: '>= 8'} 282 | 283 | debug@4.3.4: 284 | resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} 285 | engines: {node: '>=6.0'} 286 | peerDependencies: 287 | supports-color: '*' 288 | peerDependenciesMeta: 289 | supports-color: 290 | optional: true 291 | 292 | deep-is@0.1.4: 293 | resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} 294 | 295 | dir-glob@3.0.1: 296 | resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} 297 | engines: {node: '>=8'} 298 | 299 | doctrine@3.0.0: 300 | resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} 301 | engines: {node: '>=6.0.0'} 302 | 303 | dprint@0.41.0: 304 | resolution: {integrity: sha512-9Ctv6EnwOy5Ai566DczI/QhAC6y+AhWDA2gFU8Zz4xezUy1BevHaIYhfdLWZQxh4Qf4H28lRu1Lq+hhIm1US9w==} 305 | hasBin: true 306 | 307 | escape-string-regexp@4.0.0: 308 | resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 309 | engines: {node: '>=10'} 310 | 311 | eslint-scope@7.2.2: 312 | resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} 313 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 314 | 315 | eslint-visitor-keys@3.4.3: 316 | resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} 317 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 318 | 319 | eslint@8.50.0: 320 | resolution: {integrity: sha512-FOnOGSuFuFLv/Sa+FDVRZl4GGVAAFFi8LecRsI5a1tMO5HIE8nCm4ivAlzt4dT3ol/PaaGC0rJEEXQmHJBGoOg==} 321 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 322 | hasBin: true 323 | 324 | esm-env@1.2.2: 325 | resolution: {integrity: sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==} 326 | 327 | espree@9.6.1: 328 | resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} 329 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 330 | 331 | esquery@1.5.0: 332 | resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} 333 | engines: {node: '>=0.10'} 334 | 335 | esrecurse@4.3.0: 336 | resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} 337 | engines: {node: '>=4.0'} 338 | 339 | estraverse@5.3.0: 340 | resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} 341 | engines: {node: '>=4.0'} 342 | 343 | esutils@2.0.3: 344 | resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 345 | engines: {node: '>=0.10.0'} 346 | 347 | fast-deep-equal@3.1.3: 348 | resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 349 | 350 | fast-glob@3.3.2: 351 | resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} 352 | engines: {node: '>=8.6.0'} 353 | 354 | fast-json-stable-stringify@2.1.0: 355 | resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} 356 | 357 | fast-levenshtein@2.0.6: 358 | resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} 359 | 360 | fastq@1.17.1: 361 | resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} 362 | 363 | file-entry-cache@6.0.1: 364 | resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} 365 | engines: {node: ^10.12.0 || >=12.0.0} 366 | 367 | fill-range@7.0.1: 368 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} 369 | engines: {node: '>=8'} 370 | 371 | find-up@5.0.0: 372 | resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} 373 | engines: {node: '>=10'} 374 | 375 | flat-cache@3.2.0: 376 | resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} 377 | engines: {node: ^10.12.0 || >=12.0.0} 378 | 379 | flatted@3.2.9: 380 | resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} 381 | 382 | fs.realpath@1.0.0: 383 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} 384 | 385 | glob-parent@5.1.2: 386 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 387 | engines: {node: '>= 6'} 388 | 389 | glob-parent@6.0.2: 390 | resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} 391 | engines: {node: '>=10.13.0'} 392 | 393 | glob@7.2.3: 394 | resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} 395 | 396 | globals@13.24.0: 397 | resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} 398 | engines: {node: '>=8'} 399 | 400 | globby@11.1.0: 401 | resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} 402 | engines: {node: '>=10'} 403 | 404 | graphemer@1.4.0: 405 | resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} 406 | 407 | has-flag@4.0.0: 408 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 409 | engines: {node: '>=8'} 410 | 411 | ignore@5.3.1: 412 | resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} 413 | engines: {node: '>= 4'} 414 | 415 | import-fresh@3.3.0: 416 | resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} 417 | engines: {node: '>=6'} 418 | 419 | imurmurhash@0.1.4: 420 | resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 421 | engines: {node: '>=0.8.19'} 422 | 423 | inflight@1.0.6: 424 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} 425 | 426 | inherits@2.0.4: 427 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 428 | 429 | is-extglob@2.1.1: 430 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 431 | engines: {node: '>=0.10.0'} 432 | 433 | is-glob@4.0.3: 434 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 435 | engines: {node: '>=0.10.0'} 436 | 437 | is-number@7.0.0: 438 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 439 | engines: {node: '>=0.12.0'} 440 | 441 | is-path-inside@3.0.3: 442 | resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} 443 | engines: {node: '>=8'} 444 | 445 | isexe@2.0.0: 446 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 447 | 448 | js-yaml@4.1.0: 449 | resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} 450 | hasBin: true 451 | 452 | json-buffer@3.0.1: 453 | resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} 454 | 455 | json-schema-traverse@0.4.1: 456 | resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} 457 | 458 | json-stable-stringify-without-jsonify@1.0.1: 459 | resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} 460 | 461 | keyv@4.5.4: 462 | resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} 463 | 464 | levn@0.4.1: 465 | resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} 466 | engines: {node: '>= 0.8.0'} 467 | 468 | locate-path@6.0.0: 469 | resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} 470 | engines: {node: '>=10'} 471 | 472 | lodash.merge@4.6.2: 473 | resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} 474 | 475 | lru-cache@6.0.0: 476 | resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} 477 | engines: {node: '>=10'} 478 | 479 | merge2@1.4.1: 480 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 481 | engines: {node: '>= 8'} 482 | 483 | micromatch@4.0.5: 484 | resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} 485 | engines: {node: '>=8.6'} 486 | 487 | minimatch@3.1.2: 488 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 489 | 490 | ms@2.1.2: 491 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} 492 | 493 | multiformats@13.1.0: 494 | resolution: {integrity: sha512-HzdtdBwxsIkzpeXzhQ5mAhhuxcHbjEHH+JQoxt7hG/2HGFjjwyolLo7hbaexcnhoEuV4e0TNJ8kkpMjiEYY4VQ==} 495 | 496 | nanoevents@9.1.0: 497 | resolution: {integrity: sha512-Jd0fILWG44a9luj8v5kED4WI+zfkkgwKyRQKItTtlPfEsh7Lznfi1kr8/iZ+XAIss4Qq5GqRB0qtWbaz9ceO/A==} 498 | engines: {node: ^18.0.0 || >=20.0.0} 499 | 500 | natural-compare@1.4.0: 501 | resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} 502 | 503 | once@1.4.0: 504 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 505 | 506 | optionator@0.9.3: 507 | resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} 508 | engines: {node: '>= 0.8.0'} 509 | 510 | p-limit@3.1.0: 511 | resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} 512 | engines: {node: '>=10'} 513 | 514 | p-locate@5.0.0: 515 | resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} 516 | engines: {node: '>=10'} 517 | 518 | parent-module@1.0.1: 519 | resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} 520 | engines: {node: '>=6'} 521 | 522 | path-exists@4.0.0: 523 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 524 | engines: {node: '>=8'} 525 | 526 | path-is-absolute@1.0.1: 527 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} 528 | engines: {node: '>=0.10.0'} 529 | 530 | path-key@3.1.1: 531 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 532 | engines: {node: '>=8'} 533 | 534 | path-type@4.0.0: 535 | resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} 536 | engines: {node: '>=8'} 537 | 538 | picomatch@2.3.1: 539 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 540 | engines: {node: '>=8.6'} 541 | 542 | prelude-ls@1.2.1: 543 | resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} 544 | engines: {node: '>= 0.8.0'} 545 | 546 | punycode@2.3.1: 547 | resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} 548 | engines: {node: '>=6'} 549 | 550 | queue-microtask@1.2.3: 551 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 552 | 553 | resolve-from@4.0.0: 554 | resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} 555 | engines: {node: '>=4'} 556 | 557 | reusify@1.0.4: 558 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 559 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 560 | 561 | rimraf@3.0.2: 562 | resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} 563 | hasBin: true 564 | 565 | run-parallel@1.2.0: 566 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 567 | 568 | semver@7.6.0: 569 | resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} 570 | engines: {node: '>=10'} 571 | hasBin: true 572 | 573 | shebang-command@2.0.0: 574 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 575 | engines: {node: '>=8'} 576 | 577 | shebang-regex@3.0.0: 578 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 579 | engines: {node: '>=8'} 580 | 581 | slash@3.0.0: 582 | resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} 583 | engines: {node: '>=8'} 584 | 585 | strip-ansi@6.0.1: 586 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 587 | engines: {node: '>=8'} 588 | 589 | strip-json-comments@3.1.1: 590 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 591 | engines: {node: '>=8'} 592 | 593 | supports-color@7.2.0: 594 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 595 | engines: {node: '>=8'} 596 | 597 | text-table@0.2.0: 598 | resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} 599 | 600 | to-regex-range@5.0.1: 601 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 602 | engines: {node: '>=8.0'} 603 | 604 | ts-api-utils@1.2.1: 605 | resolution: {integrity: sha512-RIYA36cJn2WiH9Hy77hdF9r7oEwxAtB/TS9/S4Qd90Ap4z5FSiin5zEiTL44OII1Y3IIlEvxwxFUVgrHSZ/UpA==} 606 | engines: {node: '>=16'} 607 | peerDependencies: 608 | typescript: '>=4.2.0' 609 | 610 | type-check@0.4.0: 611 | resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} 612 | engines: {node: '>= 0.8.0'} 613 | 614 | type-fest@0.20.2: 615 | resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} 616 | engines: {node: '>=10'} 617 | 618 | typescript@5.9.2: 619 | resolution: {integrity: sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==} 620 | engines: {node: '>=14.17'} 621 | hasBin: true 622 | 623 | undici-types@6.21.0: 624 | resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} 625 | 626 | uri-js@4.4.1: 627 | resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} 628 | 629 | which@2.0.2: 630 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 631 | engines: {node: '>= 8'} 632 | hasBin: true 633 | 634 | wrappy@1.0.2: 635 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 636 | 637 | ws@8.18.3: 638 | resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==} 639 | engines: {node: '>=10.0.0'} 640 | peerDependencies: 641 | bufferutil: ^4.0.1 642 | utf-8-validate: '>=5.0.2' 643 | peerDependenciesMeta: 644 | bufferutil: 645 | optional: true 646 | utf-8-validate: 647 | optional: true 648 | 649 | yallist@4.0.0: 650 | resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} 651 | 652 | yocto-queue@0.1.0: 653 | resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 654 | engines: {node: '>=10'} 655 | 656 | yocto-queue@1.2.1: 657 | resolution: {integrity: sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==} 658 | engines: {node: '>=12.20'} 659 | 660 | snapshots: 661 | 662 | '@aashutoshrathi/word-wrap@1.2.6': {} 663 | 664 | '@atcute/atproto@3.1.1': 665 | dependencies: 666 | '@atcute/lexicons': 1.1.0 667 | 668 | '@atcute/car@3.1.1': 669 | dependencies: 670 | '@atcute/cbor': 2.2.5 671 | '@atcute/cid': 2.2.3 672 | '@atcute/uint8array': 1.0.3 673 | '@atcute/varint': 1.0.2 674 | yocto-queue: 1.2.1 675 | 676 | '@atcute/cbor@2.2.5': 677 | dependencies: 678 | '@atcute/cid': 2.2.3 679 | '@atcute/multibase': 1.1.4 680 | '@atcute/uint8array': 1.0.3 681 | 682 | '@atcute/cid@2.2.3': 683 | dependencies: 684 | '@atcute/multibase': 1.1.4 685 | '@atcute/uint8array': 1.0.3 686 | 687 | '@atcute/lexicons@1.1.0': 688 | dependencies: 689 | esm-env: 1.2.2 690 | 691 | '@atcute/multibase@1.1.4': 692 | dependencies: 693 | '@atcute/uint8array': 1.0.3 694 | 695 | '@atcute/uint8array@1.0.3': {} 696 | 697 | '@atcute/varint@1.0.2': {} 698 | 699 | '@dprint/darwin-arm64@0.41.0': 700 | optional: true 701 | 702 | '@dprint/darwin-x64@0.41.0': 703 | optional: true 704 | 705 | '@dprint/linux-arm64-glibc@0.41.0': 706 | optional: true 707 | 708 | '@dprint/linux-x64-glibc@0.41.0': 709 | optional: true 710 | 711 | '@dprint/linux-x64-musl@0.41.0': 712 | optional: true 713 | 714 | '@dprint/win32-x64@0.41.0': 715 | optional: true 716 | 717 | '@eslint-community/eslint-utils@4.4.0(eslint@8.50.0)': 718 | dependencies: 719 | eslint: 8.50.0 720 | eslint-visitor-keys: 3.4.3 721 | 722 | '@eslint-community/regexpp@4.10.0': {} 723 | 724 | '@eslint/eslintrc@2.1.4': 725 | dependencies: 726 | ajv: 6.12.6 727 | debug: 4.3.4 728 | espree: 9.6.1 729 | globals: 13.24.0 730 | ignore: 5.3.1 731 | import-fresh: 3.3.0 732 | js-yaml: 4.1.0 733 | minimatch: 3.1.2 734 | strip-json-comments: 3.1.1 735 | transitivePeerDependencies: 736 | - supports-color 737 | 738 | '@eslint/js@8.50.0': {} 739 | 740 | '@humanwhocodes/config-array@0.11.14': 741 | dependencies: 742 | '@humanwhocodes/object-schema': 2.0.2 743 | debug: 4.3.4 744 | minimatch: 3.1.2 745 | transitivePeerDependencies: 746 | - supports-color 747 | 748 | '@humanwhocodes/module-importer@1.0.1': {} 749 | 750 | '@humanwhocodes/object-schema@2.0.2': {} 751 | 752 | '@nodelib/fs.scandir@2.1.5': 753 | dependencies: 754 | '@nodelib/fs.stat': 2.0.5 755 | run-parallel: 1.2.0 756 | 757 | '@nodelib/fs.stat@2.0.5': {} 758 | 759 | '@nodelib/fs.walk@1.2.8': 760 | dependencies: 761 | '@nodelib/fs.scandir': 2.1.5 762 | fastq: 1.17.1 763 | 764 | '@types/json-schema@7.0.15': {} 765 | 766 | '@types/node@22.17.0': 767 | dependencies: 768 | undici-types: 6.21.0 769 | 770 | '@types/semver@7.5.7': {} 771 | 772 | '@types/ws@8.5.10': 773 | dependencies: 774 | '@types/node': 22.17.0 775 | 776 | '@typescript-eslint/eslint-plugin@6.7.4(@typescript-eslint/parser@6.7.4(eslint@8.50.0)(typescript@5.9.2))(eslint@8.50.0)(typescript@5.9.2)': 777 | dependencies: 778 | '@eslint-community/regexpp': 4.10.0 779 | '@typescript-eslint/parser': 6.7.4(eslint@8.50.0)(typescript@5.9.2) 780 | '@typescript-eslint/scope-manager': 6.7.4 781 | '@typescript-eslint/type-utils': 6.7.4(eslint@8.50.0)(typescript@5.9.2) 782 | '@typescript-eslint/utils': 6.7.4(eslint@8.50.0)(typescript@5.9.2) 783 | '@typescript-eslint/visitor-keys': 6.7.4 784 | debug: 4.3.4 785 | eslint: 8.50.0 786 | graphemer: 1.4.0 787 | ignore: 5.3.1 788 | natural-compare: 1.4.0 789 | semver: 7.6.0 790 | ts-api-utils: 1.2.1(typescript@5.9.2) 791 | optionalDependencies: 792 | typescript: 5.9.2 793 | transitivePeerDependencies: 794 | - supports-color 795 | 796 | '@typescript-eslint/parser@6.7.4(eslint@8.50.0)(typescript@5.9.2)': 797 | dependencies: 798 | '@typescript-eslint/scope-manager': 6.7.4 799 | '@typescript-eslint/types': 6.7.4 800 | '@typescript-eslint/typescript-estree': 6.7.4(typescript@5.9.2) 801 | '@typescript-eslint/visitor-keys': 6.7.4 802 | debug: 4.3.4 803 | eslint: 8.50.0 804 | optionalDependencies: 805 | typescript: 5.9.2 806 | transitivePeerDependencies: 807 | - supports-color 808 | 809 | '@typescript-eslint/scope-manager@6.7.4': 810 | dependencies: 811 | '@typescript-eslint/types': 6.7.4 812 | '@typescript-eslint/visitor-keys': 6.7.4 813 | 814 | '@typescript-eslint/type-utils@6.7.4(eslint@8.50.0)(typescript@5.9.2)': 815 | dependencies: 816 | '@typescript-eslint/typescript-estree': 6.7.4(typescript@5.9.2) 817 | '@typescript-eslint/utils': 6.7.4(eslint@8.50.0)(typescript@5.9.2) 818 | debug: 4.3.4 819 | eslint: 8.50.0 820 | ts-api-utils: 1.2.1(typescript@5.9.2) 821 | optionalDependencies: 822 | typescript: 5.9.2 823 | transitivePeerDependencies: 824 | - supports-color 825 | 826 | '@typescript-eslint/types@6.7.4': {} 827 | 828 | '@typescript-eslint/typescript-estree@6.7.4(typescript@5.9.2)': 829 | dependencies: 830 | '@typescript-eslint/types': 6.7.4 831 | '@typescript-eslint/visitor-keys': 6.7.4 832 | debug: 4.3.4 833 | globby: 11.1.0 834 | is-glob: 4.0.3 835 | semver: 7.6.0 836 | ts-api-utils: 1.2.1(typescript@5.9.2) 837 | optionalDependencies: 838 | typescript: 5.9.2 839 | transitivePeerDependencies: 840 | - supports-color 841 | 842 | '@typescript-eslint/utils@6.7.4(eslint@8.50.0)(typescript@5.9.2)': 843 | dependencies: 844 | '@eslint-community/eslint-utils': 4.4.0(eslint@8.50.0) 845 | '@types/json-schema': 7.0.15 846 | '@types/semver': 7.5.7 847 | '@typescript-eslint/scope-manager': 6.7.4 848 | '@typescript-eslint/types': 6.7.4 849 | '@typescript-eslint/typescript-estree': 6.7.4(typescript@5.9.2) 850 | eslint: 8.50.0 851 | semver: 7.6.0 852 | transitivePeerDependencies: 853 | - supports-color 854 | - typescript 855 | 856 | '@typescript-eslint/visitor-keys@6.7.4': 857 | dependencies: 858 | '@typescript-eslint/types': 6.7.4 859 | eslint-visitor-keys: 3.4.3 860 | 861 | acorn-jsx@5.3.2(acorn@8.11.3): 862 | dependencies: 863 | acorn: 8.11.3 864 | 865 | acorn@8.11.3: {} 866 | 867 | ajv@6.12.6: 868 | dependencies: 869 | fast-deep-equal: 3.1.3 870 | fast-json-stable-stringify: 2.1.0 871 | json-schema-traverse: 0.4.1 872 | uri-js: 4.4.1 873 | 874 | ansi-regex@5.0.1: {} 875 | 876 | ansi-styles@4.3.0: 877 | dependencies: 878 | color-convert: 2.0.1 879 | 880 | argparse@2.0.1: {} 881 | 882 | array-union@2.1.0: {} 883 | 884 | balanced-match@1.0.2: {} 885 | 886 | brace-expansion@1.1.11: 887 | dependencies: 888 | balanced-match: 1.0.2 889 | concat-map: 0.0.1 890 | 891 | braces@3.0.2: 892 | dependencies: 893 | fill-range: 7.0.1 894 | 895 | callsites@3.1.0: {} 896 | 897 | chalk@4.1.2: 898 | dependencies: 899 | ansi-styles: 4.3.0 900 | supports-color: 7.2.0 901 | 902 | color-convert@2.0.1: 903 | dependencies: 904 | color-name: 1.1.4 905 | 906 | color-name@1.1.4: {} 907 | 908 | concat-map@0.0.1: {} 909 | 910 | cross-spawn@7.0.3: 911 | dependencies: 912 | path-key: 3.1.1 913 | shebang-command: 2.0.0 914 | which: 2.0.2 915 | 916 | debug@4.3.4: 917 | dependencies: 918 | ms: 2.1.2 919 | 920 | deep-is@0.1.4: {} 921 | 922 | dir-glob@3.0.1: 923 | dependencies: 924 | path-type: 4.0.0 925 | 926 | doctrine@3.0.0: 927 | dependencies: 928 | esutils: 2.0.3 929 | 930 | dprint@0.41.0: 931 | optionalDependencies: 932 | '@dprint/darwin-arm64': 0.41.0 933 | '@dprint/darwin-x64': 0.41.0 934 | '@dprint/linux-arm64-glibc': 0.41.0 935 | '@dprint/linux-x64-glibc': 0.41.0 936 | '@dprint/linux-x64-musl': 0.41.0 937 | '@dprint/win32-x64': 0.41.0 938 | 939 | escape-string-regexp@4.0.0: {} 940 | 941 | eslint-scope@7.2.2: 942 | dependencies: 943 | esrecurse: 4.3.0 944 | estraverse: 5.3.0 945 | 946 | eslint-visitor-keys@3.4.3: {} 947 | 948 | eslint@8.50.0: 949 | dependencies: 950 | '@eslint-community/eslint-utils': 4.4.0(eslint@8.50.0) 951 | '@eslint-community/regexpp': 4.10.0 952 | '@eslint/eslintrc': 2.1.4 953 | '@eslint/js': 8.50.0 954 | '@humanwhocodes/config-array': 0.11.14 955 | '@humanwhocodes/module-importer': 1.0.1 956 | '@nodelib/fs.walk': 1.2.8 957 | ajv: 6.12.6 958 | chalk: 4.1.2 959 | cross-spawn: 7.0.3 960 | debug: 4.3.4 961 | doctrine: 3.0.0 962 | escape-string-regexp: 4.0.0 963 | eslint-scope: 7.2.2 964 | eslint-visitor-keys: 3.4.3 965 | espree: 9.6.1 966 | esquery: 1.5.0 967 | esutils: 2.0.3 968 | fast-deep-equal: 3.1.3 969 | file-entry-cache: 6.0.1 970 | find-up: 5.0.0 971 | glob-parent: 6.0.2 972 | globals: 13.24.0 973 | graphemer: 1.4.0 974 | ignore: 5.3.1 975 | imurmurhash: 0.1.4 976 | is-glob: 4.0.3 977 | is-path-inside: 3.0.3 978 | js-yaml: 4.1.0 979 | json-stable-stringify-without-jsonify: 1.0.1 980 | levn: 0.4.1 981 | lodash.merge: 4.6.2 982 | minimatch: 3.1.2 983 | natural-compare: 1.4.0 984 | optionator: 0.9.3 985 | strip-ansi: 6.0.1 986 | text-table: 0.2.0 987 | transitivePeerDependencies: 988 | - supports-color 989 | 990 | esm-env@1.2.2: {} 991 | 992 | espree@9.6.1: 993 | dependencies: 994 | acorn: 8.11.3 995 | acorn-jsx: 5.3.2(acorn@8.11.3) 996 | eslint-visitor-keys: 3.4.3 997 | 998 | esquery@1.5.0: 999 | dependencies: 1000 | estraverse: 5.3.0 1001 | 1002 | esrecurse@4.3.0: 1003 | dependencies: 1004 | estraverse: 5.3.0 1005 | 1006 | estraverse@5.3.0: {} 1007 | 1008 | esutils@2.0.3: {} 1009 | 1010 | fast-deep-equal@3.1.3: {} 1011 | 1012 | fast-glob@3.3.2: 1013 | dependencies: 1014 | '@nodelib/fs.stat': 2.0.5 1015 | '@nodelib/fs.walk': 1.2.8 1016 | glob-parent: 5.1.2 1017 | merge2: 1.4.1 1018 | micromatch: 4.0.5 1019 | 1020 | fast-json-stable-stringify@2.1.0: {} 1021 | 1022 | fast-levenshtein@2.0.6: {} 1023 | 1024 | fastq@1.17.1: 1025 | dependencies: 1026 | reusify: 1.0.4 1027 | 1028 | file-entry-cache@6.0.1: 1029 | dependencies: 1030 | flat-cache: 3.2.0 1031 | 1032 | fill-range@7.0.1: 1033 | dependencies: 1034 | to-regex-range: 5.0.1 1035 | 1036 | find-up@5.0.0: 1037 | dependencies: 1038 | locate-path: 6.0.0 1039 | path-exists: 4.0.0 1040 | 1041 | flat-cache@3.2.0: 1042 | dependencies: 1043 | flatted: 3.2.9 1044 | keyv: 4.5.4 1045 | rimraf: 3.0.2 1046 | 1047 | flatted@3.2.9: {} 1048 | 1049 | fs.realpath@1.0.0: {} 1050 | 1051 | glob-parent@5.1.2: 1052 | dependencies: 1053 | is-glob: 4.0.3 1054 | 1055 | glob-parent@6.0.2: 1056 | dependencies: 1057 | is-glob: 4.0.3 1058 | 1059 | glob@7.2.3: 1060 | dependencies: 1061 | fs.realpath: 1.0.0 1062 | inflight: 1.0.6 1063 | inherits: 2.0.4 1064 | minimatch: 3.1.2 1065 | once: 1.4.0 1066 | path-is-absolute: 1.0.1 1067 | 1068 | globals@13.24.0: 1069 | dependencies: 1070 | type-fest: 0.20.2 1071 | 1072 | globby@11.1.0: 1073 | dependencies: 1074 | array-union: 2.1.0 1075 | dir-glob: 3.0.1 1076 | fast-glob: 3.3.2 1077 | ignore: 5.3.1 1078 | merge2: 1.4.1 1079 | slash: 3.0.0 1080 | 1081 | graphemer@1.4.0: {} 1082 | 1083 | has-flag@4.0.0: {} 1084 | 1085 | ignore@5.3.1: {} 1086 | 1087 | import-fresh@3.3.0: 1088 | dependencies: 1089 | parent-module: 1.0.1 1090 | resolve-from: 4.0.0 1091 | 1092 | imurmurhash@0.1.4: {} 1093 | 1094 | inflight@1.0.6: 1095 | dependencies: 1096 | once: 1.4.0 1097 | wrappy: 1.0.2 1098 | 1099 | inherits@2.0.4: {} 1100 | 1101 | is-extglob@2.1.1: {} 1102 | 1103 | is-glob@4.0.3: 1104 | dependencies: 1105 | is-extglob: 2.1.1 1106 | 1107 | is-number@7.0.0: {} 1108 | 1109 | is-path-inside@3.0.3: {} 1110 | 1111 | isexe@2.0.0: {} 1112 | 1113 | js-yaml@4.1.0: 1114 | dependencies: 1115 | argparse: 2.0.1 1116 | 1117 | json-buffer@3.0.1: {} 1118 | 1119 | json-schema-traverse@0.4.1: {} 1120 | 1121 | json-stable-stringify-without-jsonify@1.0.1: {} 1122 | 1123 | keyv@4.5.4: 1124 | dependencies: 1125 | json-buffer: 3.0.1 1126 | 1127 | levn@0.4.1: 1128 | dependencies: 1129 | prelude-ls: 1.2.1 1130 | type-check: 0.4.0 1131 | 1132 | locate-path@6.0.0: 1133 | dependencies: 1134 | p-locate: 5.0.0 1135 | 1136 | lodash.merge@4.6.2: {} 1137 | 1138 | lru-cache@6.0.0: 1139 | dependencies: 1140 | yallist: 4.0.0 1141 | 1142 | merge2@1.4.1: {} 1143 | 1144 | micromatch@4.0.5: 1145 | dependencies: 1146 | braces: 3.0.2 1147 | picomatch: 2.3.1 1148 | 1149 | minimatch@3.1.2: 1150 | dependencies: 1151 | brace-expansion: 1.1.11 1152 | 1153 | ms@2.1.2: {} 1154 | 1155 | multiformats@13.1.0: {} 1156 | 1157 | nanoevents@9.1.0: {} 1158 | 1159 | natural-compare@1.4.0: {} 1160 | 1161 | once@1.4.0: 1162 | dependencies: 1163 | wrappy: 1.0.2 1164 | 1165 | optionator@0.9.3: 1166 | dependencies: 1167 | '@aashutoshrathi/word-wrap': 1.2.6 1168 | deep-is: 0.1.4 1169 | fast-levenshtein: 2.0.6 1170 | levn: 0.4.1 1171 | prelude-ls: 1.2.1 1172 | type-check: 0.4.0 1173 | 1174 | p-limit@3.1.0: 1175 | dependencies: 1176 | yocto-queue: 0.1.0 1177 | 1178 | p-locate@5.0.0: 1179 | dependencies: 1180 | p-limit: 3.1.0 1181 | 1182 | parent-module@1.0.1: 1183 | dependencies: 1184 | callsites: 3.1.0 1185 | 1186 | path-exists@4.0.0: {} 1187 | 1188 | path-is-absolute@1.0.1: {} 1189 | 1190 | path-key@3.1.1: {} 1191 | 1192 | path-type@4.0.0: {} 1193 | 1194 | picomatch@2.3.1: {} 1195 | 1196 | prelude-ls@1.2.1: {} 1197 | 1198 | punycode@2.3.1: {} 1199 | 1200 | queue-microtask@1.2.3: {} 1201 | 1202 | resolve-from@4.0.0: {} 1203 | 1204 | reusify@1.0.4: {} 1205 | 1206 | rimraf@3.0.2: 1207 | dependencies: 1208 | glob: 7.2.3 1209 | 1210 | run-parallel@1.2.0: 1211 | dependencies: 1212 | queue-microtask: 1.2.3 1213 | 1214 | semver@7.6.0: 1215 | dependencies: 1216 | lru-cache: 6.0.0 1217 | 1218 | shebang-command@2.0.0: 1219 | dependencies: 1220 | shebang-regex: 3.0.0 1221 | 1222 | shebang-regex@3.0.0: {} 1223 | 1224 | slash@3.0.0: {} 1225 | 1226 | strip-ansi@6.0.1: 1227 | dependencies: 1228 | ansi-regex: 5.0.1 1229 | 1230 | strip-json-comments@3.1.1: {} 1231 | 1232 | supports-color@7.2.0: 1233 | dependencies: 1234 | has-flag: 4.0.0 1235 | 1236 | text-table@0.2.0: {} 1237 | 1238 | to-regex-range@5.0.1: 1239 | dependencies: 1240 | is-number: 7.0.0 1241 | 1242 | ts-api-utils@1.2.1(typescript@5.9.2): 1243 | dependencies: 1244 | typescript: 5.9.2 1245 | 1246 | type-check@0.4.0: 1247 | dependencies: 1248 | prelude-ls: 1.2.1 1249 | 1250 | type-fest@0.20.2: {} 1251 | 1252 | typescript@5.9.2: {} 1253 | 1254 | undici-types@6.21.0: {} 1255 | 1256 | uri-js@4.4.1: 1257 | dependencies: 1258 | punycode: 2.3.1 1259 | 1260 | which@2.0.2: 1261 | dependencies: 1262 | isexe: 2.0.0 1263 | 1264 | wrappy@1.0.2: {} 1265 | 1266 | ws@8.18.3: {} 1267 | 1268 | yallist@4.0.0: {} 1269 | 1270 | yocto-queue@0.1.0: {} 1271 | 1272 | yocto-queue@1.2.1: {} 1273 | --------------------------------------------------------------------------------