Client side atproto account migrator in your web browser, along with services for backups and adversarial migrations. pdsmoover.com
pds atproto migrations moo cow

resolves did's and uses slingshot first

authored by baileytownsend.dev and committed by tangled.org 86650db3 d829485d

+56 -230
+13
.zed/settings.json
··· 31 31 } 32 32 ] 33 33 }, 34 + "JavaScript": { 35 + "format_on_save": "on", 36 + "prettier": { 37 + "allowed": false 38 + }, 39 + "formatter": [ 40 + { 41 + "language_server": { 42 + "name": "oxfmt" 43 + } 44 + } 45 + ] 46 + }, 34 47 "Svelte": { 35 48 "format_on_save": "on", 36 49 "prettier": {
+23
packages/moover/lib/atprotoUtils.js
··· 25 25 }) 26 26 27 27 /** 28 + * Fetches a minidoc from slingshot 29 + * 30 + * @param identifier {string} 31 + * @returns {Promise<{did: string, handle: string, pds: string}>} 32 + */ 33 + async function getMiniDoc(identifier) { 34 + const result = await fetch( 35 + `https://slingshot.microcosm.blue/xrpc/blue.microcosm.identity.resolveMiniDoc?identifier=${identifier}`, 36 + ) 37 + if (!result.ok) { 38 + throw new Error(`Failed to fetch minidoc: ${result.status} ${result.statusText}`) 39 + } 40 + return await result.json() 41 + } 42 + 43 + /** 28 44 * Cleans the handle of @ and some other unicode characters that used to show up when copied from the profile 29 45 * @param handle {string} 30 46 * @returns {string} ··· 42 58 * @returns {Promise<{usersDid: string, pds: string}>} 43 59 */ 44 60 async function handleAndPDSResolver(handle) { 61 + try { 62 + const { did, handle: _, pds } = await getMiniDoc(handle) 63 + return { usersDid: did, pds } 64 + } catch (error) { 65 + console.error('Failed to load mini doc, trying other routes', error) 66 + } 67 + 45 68 let usersDid = null 46 69 if (handle.startsWith('did:')) { 47 70 usersDid = handle
-5
packages/moover/lib/lexicons/blue.ts
··· 1 - /* 2 - * THIS FILE WAS GENERATED BY "@atproto/lex". DO NOT EDIT. 3 - */ 4 - 5 - export * as microcosm from './blue/microcosm.js'
-5
packages/moover/lib/lexicons/blue/microcosm.ts
··· 1 - /* 2 - * THIS FILE WAS GENERATED BY "@atproto/lex". DO NOT EDIT. 3 - */ 4 - 5 - export * as identity from './microcosm/identity.js'
-5
packages/moover/lib/lexicons/blue/microcosm/identity.ts
··· 1 - /* 2 - * THIS FILE WAS GENERATED BY "@atproto/lex". DO NOT EDIT. 3 - */ 4 - 5 - export * as resolveMiniDoc from './identity/resolveMiniDoc.js'
-30
packages/moover/lib/lexicons/blue/microcosm/identity/resolveMiniDoc.defs.ts
··· 1 - /* 2 - * THIS FILE WAS GENERATED BY "@atproto/lex". DO NOT EDIT. 3 - */ 4 - 5 - import { l } from '@atproto/lex' 6 - 7 - const $nsid = 'blue.microcosm.identity.resolveMiniDoc' 8 - 9 - export { $nsid } 10 - 11 - /** Like [com.atproto.identity.resolveIdentity](https://docs.bsky.app/docs/api/com-atproto-identity-resolve-identity) but instead of the full `didDoc` it returns an atproto-relevant subset. */ 12 - const main = l.query( 13 - $nsid, 14 - l.params({ identifier: l.string({ format: 'at-identifier' }) }), 15 - l.jsonPayload({ 16 - did: l.string({ format: 'did' }), 17 - pds: l.string({ format: 'uri' }), 18 - handle: l.string({ format: 'handle' }), 19 - signing_key: l.string(), 20 - }), 21 - ) 22 - export { main } 23 - 24 - export type Params = l.InferMethodParams<typeof main> 25 - export type Output = l.InferMethodOutput<typeof main> 26 - export type OutputBody = l.InferMethodOutputBody<typeof main> 27 - 28 - export const $lxm = main.nsid, 29 - $params = main.parameters, 30 - $output = main.output
-6
packages/moover/lib/lexicons/blue/microcosm/identity/resolveMiniDoc.ts
··· 1 - /* 2 - * THIS FILE WAS GENERATED BY "@atproto/lex". DO NOT EDIT. 3 - */ 4 - 5 - export * from './resolveMiniDoc.defs.js' 6 - export * as $defs from './resolveMiniDoc.defs.js'
+17 -15
packages/moover/lib/pdsmoover.js
··· 1 - import { docResolver, cleanHandle, handleResolver } from './atprotoUtils.js' 1 + import { docResolver, cleanHandle, handleResolver, handleAndPDSResolver } from './atprotoUtils.js' 2 2 import { AtpAgent } from '@atproto/api' 3 3 4 4 function safeStatusUpdate(statusUpdateHandler, status) { ··· 79 79 } else { 80 80 //Resolves the did and finds the did document for the old PDS 81 81 safeStatusUpdate(statusUpdateHandler, 'Resolving old PDS') 82 - usersDid = await handleResolver.resolve(oldHandle) 83 - const didDoc = await docResolver.resolve(usersDid) 84 - safeStatusUpdate( 85 - statusUpdateHandler, 86 - 'Resolving did document and finding your current PDS URL', 87 - ) 82 + let { usersDid: didFromLookUp, pds: oldPds } = await handleAndPDSResolver(oldHandle) 83 + usersDid = didFromLookUp 84 + // usersDid = await handleResolver.resolve(oldHandle) 85 + // const didDoc = await docResolver.resolve(usersDid) 86 + // safeStatusUpdate( 87 + // statusUpdateHandler, 88 + // 'Resolving did document and finding your current PDS URL', 89 + // ) 88 90 89 - let oldPds 90 - try { 91 - oldPds = didDoc.service.filter(s => s.type === 'AtprotoPersonalDataServer')[0] 92 - .serviceEndpoint 93 - } catch (error) { 94 - console.error(error) 95 - throw new Error('Could not find a PDS in the DID document.') 96 - } 91 + // let oldPds 92 + // try { 93 + // oldPds = didDoc.service.filter(s => s.type === 'AtprotoPersonalDataServer')[0] 94 + // .serviceEndpoint 95 + // } catch (error) { 96 + // console.error(error) 97 + // throw new Error('Could not find a PDS in the DID document.') 98 + // } 97 99 98 100 oldAgent = new AtpAgent({ 99 101 service: oldPds,
-1
packages/moover/package.json
··· 52 52 "@atcute/lexicons": "^1.2.2", 53 53 "@atcute/multibase": "^1.1.6", 54 54 "@atproto/api": "^0.16.7", 55 - "@atproto/lex": "^0.0.16", 56 55 "@pds-moover/lexicons": "^1.0.0", 57 56 "alpinejs": "^3.15.0", 58 57 "vite-plugin-full-reload": "^1.2.0",
+1 -1
web-ui/package.json
··· 17 17 "@atcute/client": "^4.0.5", 18 18 "@atcute/lexicons": "^1.2.2", 19 19 "@pds-moover/lexicons": "^1.0.1", 20 - "@pds-moover/moover": "^1.0.5" 20 + "@pds-moover/moover": "link:../packages/moover" 21 21 }, 22 22 "devDependencies": { 23 23 "@eslint/compat": "^1.4.0",
+2 -162
web-ui/pnpm-lock.yaml
··· 21 21 specifier: ^1.0.1 22 22 version: 1.0.1 23 23 '@pds-moover/moover': 24 - specifier: ^1.0.5 25 - version: 1.0.5(@atcute/identity@1.1.1)(vite@7.1.12(@types/node@22.19.0)) 24 + specifier: link:../packages/moover 25 + version: link:../packages/moover 26 26 devDependencies: 27 27 '@eslint/compat': 28 28 specifier: ^1.4.0 ··· 79 79 '@atcute/atproto@3.1.9': 80 80 resolution: {integrity: sha512-DyWwHCTdR4hY2BPNbLXgVmm7lI+fceOwWbE4LXbGvbvVtSn+ejSVFaAv01Ra3kWDha0whsOmbJL8JP0QPpf1+w==} 81 81 82 - '@atcute/cbor@2.2.8': 83 - resolution: {integrity: sha512-UzOAN9BuN6JCXgn0ryV8qZuRJUDrNqrbLd6EFM8jc6RYssjRyGRxNy6RZ1NU/07Hd8Tq/0pz8+nQiMu5Zai5uw==} 84 - 85 - '@atcute/cid@2.2.6': 86 - resolution: {integrity: sha512-bTAHHbJ24p+E//V4KCS4xdmd39o211jJswvqQOevj7vk+5IYcgDLx1ryZWZ1sEPOo9x875li/kj5gpKL14RDwQ==} 87 - 88 82 '@atcute/client@4.0.5': 89 83 resolution: {integrity: sha512-R8Qen8goGmEkynYGg2m6XFlVmz0GTDvQ+9w+4QqOob+XMk8/WDpF4aImev7WKEde/rV2gjcqW7zM8E6W9NShDA==} 90 - 91 - '@atcute/crypto@2.2.6': 92 - resolution: {integrity: sha512-vkuexF+kmrKE1/Uqzub99Qi4QpnxA2jbu60E6PTgL4XypELQ6rb59MB/J1VbY2gs0kd3ET7+L3+NWpKD5nXyfA==} 93 - 94 - '@atcute/did-plc@0.1.7': 95 - resolution: {integrity: sha512-a7yOQNqViae3rB5/xa3U0EPJbFD9l8zOHXx6XASZ5F8+Vy2uTgXK3omurpNZ5UxRpy1ni1AMhSohXr61cqWbkg==} 96 - 97 - '@atcute/identity-resolver@1.1.4': 98 - resolution: {integrity: sha512-/SVh8vf2cXFJenmBnGeYF2aY3WGQm3cJeew5NWTlkqoy3LvJ5wkvKq9PWu4Tv653VF40rPOp6LOdVr9Fa+q5rA==} 99 - peerDependencies: 100 - '@atcute/identity': ^1.0.0 101 84 102 85 '@atcute/identity@1.1.1': 103 86 resolution: {integrity: sha512-zax42n693VEhnC+5tndvO2KLDTMkHOz8UExwmklvJv7R9VujfEwiSWhcv6Jgwb3ellaG8wjiQ1lMOIjLLvwh0Q==} ··· 105 88 '@atcute/lexicons@1.2.2': 106 89 resolution: {integrity: sha512-bgEhJq5Z70/0TbK5sx+tAkrR8FsCODNiL2gUEvS5PuJfPxmFmRYNWaMGehxSPaXWpU2+Oa9ckceHiYbrItDTkA==} 107 90 108 - '@atcute/multibase@1.1.6': 109 - resolution: {integrity: sha512-HBxuCgYLKPPxETV0Rot4VP9e24vKl8JdzGCZOVsDaOXJgbRZoRIF67Lp0H/OgnJeH/Xpva8Z5ReoTNJE5dn3kg==} 110 - 111 - '@atcute/uint8array@1.0.5': 112 - resolution: {integrity: sha512-XLWWxoR2HNl2qU+FCr0rp1APwJXci7HnzbOQLxK55OaMNBXZ19+xNC5ii4QCsThsDxa4JS/JTzuiQLziITWf2Q==} 113 - 114 - '@atcute/util-fetch@1.0.4': 115 - resolution: {integrity: sha512-sIU9Qk0dE8PLEXSfhy+gIJV+HpiiknMytCI2SqLlqd0vgZUtEKI/EQfP+23LHWvP+CLCzVDOa6cpH045OlmNBg==} 116 - 117 - '@atproto/api@0.16.11': 118 - resolution: {integrity: sha512-1dhfQNHiclb102RW+Ea8Nft5olfqU0Ev/vlQaSX6mWNo1aP5zT+sPODJ8+BTUOYk3vcuvL7QMkqA/rLYy2PMyw==} 119 - 120 91 '@atproto/common-web@0.4.3': 121 92 resolution: {integrity: sha512-nRDINmSe4VycJzPo6fP/hEltBcULFxt9Kw7fQk6405FyAWZiTluYHlXOnU7GkQfeUK44OENG1qFTBcmCJ7e8pg==} 122 93 ··· 367 338 368 339 '@jridgewell/trace-mapping@0.3.31': 369 340 resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} 370 - 371 - '@noble/secp256k1@3.0.0': 372 - resolution: {integrity: sha512-NJBaR352KyIvj3t6sgT/+7xrNyF9Xk9QlLSIqUGVUYlsnDTAUqY8LOmwpcgEx4AMJXRITQ5XEVHD+mMaPfr3mg==} 373 341 374 342 '@nodelib/fs.scandir@2.1.5': 375 343 resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} ··· 386 354 '@pds-moover/lexicons@1.0.1': 387 355 resolution: {integrity: sha512-fv5b/DtHM7FEo/JklyF9gdK0ainlb6mWjWrBe6cmSAeg9G/4O2jBlQUOqfOAICY9gOcrCpkOrk9PHgGw//JQ2A==} 388 356 389 - '@pds-moover/moover@1.0.5': 390 - resolution: {integrity: sha512-do8Itd1mrH/446KYJf+velZqsA45ldJCPrEV10eD3nhFJyhf4KBEuseSHIhV0+KIZGU06HvmofBO+v8EZx9ToA==} 391 - 392 357 '@polka/url@1.0.0-next.29': 393 358 resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==} 394 359 ··· 658 623 resolution: {integrity: sha512-uk574k8IU0rOF/AjniX8qbLSGURJVUCeM5e4MIMKBFFi8weeiLrG1fyQejyLXQpRZbU/1BuQasleV/RfHC3hHg==} 659 624 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 660 625 661 - '@vue/reactivity@3.1.5': 662 - resolution: {integrity: sha512-1tdfLmNjWG6t/CsPldh+foumYFo3cpyCHgBYQ34ylaMsJ+SNHQ1kApMIa8jN+i593zQuaw3AdWH0nJTARzCFhg==} 663 - 664 - '@vue/shared@3.1.5': 665 - resolution: {integrity: sha512-oJ4F3TnvpXaQwZJNF3ZK+kLPHKarDmJjJ6jyzVNDKH9md1dptjC7lWR//jrGuLdek/U6iltWxqAnYOu8gCiOvA==} 666 - 667 626 acorn-jsx@5.3.2: 668 627 resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} 669 628 peerDependencies: ··· 677 636 ajv@6.12.6: 678 637 resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} 679 638 680 - alpinejs@3.15.2: 681 - resolution: {integrity: sha512-2kYF2aG+DTFkE6p0rHG5XmN4VEb6sO9b02aOdU4+i8QN6rL0DbRZQiypDE1gBcGO65yDcqMz5KKYUYgMUxgNkw==} 682 - 683 639 ansi-styles@4.3.0: 684 640 resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 685 641 engines: {node: '>=8'} ··· 690 646 aria-query@5.3.2: 691 647 resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} 692 648 engines: {node: '>= 0.4'} 693 - 694 - await-lock@2.2.2: 695 - resolution: {integrity: sha512-aDczADvlvTGajTDjcjpJMqRkOF6Qdz3YbPZm/PyW6tKPkx2hlYBzxMhEywM/tU72HrVZjgl5VCdRuMlA7pZ8Gw==} 696 649 697 650 axobject-query@4.1.0: 698 651 resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} ··· 1220 1173 resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} 1221 1174 engines: {node: '>=12.0.0'} 1222 1175 1223 - tlds@1.261.0: 1224 - resolution: {integrity: sha512-QXqwfEl9ddlGBaRFXIvNKK6OhipSiLXuRuLJX5DErz0o0Q0rYxulWLdFryTkV5PkdZct5iMInwYEGe/eR++1AA==} 1225 - hasBin: true 1226 - 1227 1176 to-regex-range@5.0.1: 1228 1177 resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 1229 1178 engines: {node: '>=8.0'} ··· 1265 1214 1266 1215 util-deprecate@1.0.2: 1267 1216 resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} 1268 - 1269 - vite-plugin-full-reload@1.2.0: 1270 - resolution: {integrity: sha512-kz18NW79x0IHbxRSHm0jttP4zoO9P9gXh+n6UTwlNKnviTTEpOlum6oS9SmecrTtSr+muHEn5TUuC75UovQzcA==} 1271 - 1272 - vite-rs-plugin@1.0.1: 1273 - resolution: {integrity: sha512-YhgflKQIRzuS5x66J3yICoVLH25D2fNU+jThK8tpYl/jGrXeIKT4w5VH1lkLPRC0SjK2ZCm9S6K9Z2ZFVDHjPQ==} 1274 - hasBin: true 1275 - peerDependencies: 1276 - vite: ^5.0.0 1277 1217 1278 1218 vite@7.1.12: 1279 1219 resolution: {integrity: sha512-ZWyE8YXEXqJrrSLvYgrRP7p62OziLW7xI5HYGWFzOvupfAlrLvURSzv/FyGyy0eidogEM3ujU+kUG1zuHgb6Ug==} ··· 1352 1292 dependencies: 1353 1293 '@atcute/lexicons': 1.2.2 1354 1294 1355 - '@atcute/cbor@2.2.8': 1356 - dependencies: 1357 - '@atcute/cid': 2.2.6 1358 - '@atcute/multibase': 1.1.6 1359 - '@atcute/uint8array': 1.0.5 1360 - 1361 - '@atcute/cid@2.2.6': 1362 - dependencies: 1363 - '@atcute/multibase': 1.1.6 1364 - '@atcute/uint8array': 1.0.5 1365 - 1366 1295 '@atcute/client@4.0.5': 1367 1296 dependencies: 1368 1297 '@atcute/identity': 1.1.1 1369 1298 '@atcute/lexicons': 1.2.2 1370 1299 1371 - '@atcute/crypto@2.2.6': 1372 - dependencies: 1373 - '@atcute/multibase': 1.1.6 1374 - '@atcute/uint8array': 1.0.5 1375 - '@noble/secp256k1': 3.0.0 1376 - 1377 - '@atcute/did-plc@0.1.7': 1378 - dependencies: 1379 - '@atcute/cbor': 2.2.8 1380 - '@atcute/cid': 2.2.6 1381 - '@atcute/crypto': 2.2.6 1382 - '@atcute/identity': 1.1.1 1383 - '@atcute/lexicons': 1.2.2 1384 - '@atcute/multibase': 1.1.6 1385 - '@atcute/uint8array': 1.0.5 1386 - '@badrap/valita': 0.4.6 1387 - 1388 - '@atcute/identity-resolver@1.1.4(@atcute/identity@1.1.1)': 1389 - dependencies: 1390 - '@atcute/identity': 1.1.1 1391 - '@atcute/lexicons': 1.2.2 1392 - '@atcute/util-fetch': 1.0.4 1393 - '@badrap/valita': 0.4.6 1394 - 1395 1300 '@atcute/identity@1.1.1': 1396 1301 dependencies: 1397 1302 '@atcute/lexicons': 1.2.2 ··· 1401 1306 dependencies: 1402 1307 '@standard-schema/spec': 1.0.0 1403 1308 esm-env: 1.2.2 1404 - 1405 - '@atcute/multibase@1.1.6': 1406 - dependencies: 1407 - '@atcute/uint8array': 1.0.5 1408 - 1409 - '@atcute/uint8array@1.0.5': {} 1410 - 1411 - '@atcute/util-fetch@1.0.4': 1412 - dependencies: 1413 - '@badrap/valita': 0.4.6 1414 - 1415 - '@atproto/api@0.16.11': 1416 - dependencies: 1417 - '@atproto/common-web': 0.4.3 1418 - '@atproto/lexicon': 0.5.1 1419 - '@atproto/syntax': 0.4.1 1420 - '@atproto/xrpc': 0.7.5 1421 - await-lock: 2.2.2 1422 - multiformats: 9.9.0 1423 - tlds: 1.261.0 1424 - zod: 3.25.76 1425 1309 1426 1310 '@atproto/common-web@0.4.3': 1427 1311 dependencies: ··· 1607 1491 '@jridgewell/resolve-uri': 3.1.2 1608 1492 '@jridgewell/sourcemap-codec': 1.5.5 1609 1493 1610 - '@noble/secp256k1@3.0.0': {} 1611 - 1612 1494 '@nodelib/fs.scandir@2.1.5': 1613 1495 dependencies: 1614 1496 '@nodelib/fs.stat': 2.0.5 ··· 1626 1508 '@atproto/lexicon': 0.5.1 1627 1509 '@atproto/xrpc': 0.7.5 1628 1510 1629 - '@pds-moover/moover@1.0.5(@atcute/identity@1.1.1)(vite@7.1.12(@types/node@22.19.0))': 1630 - dependencies: 1631 - '@atcute/cbor': 2.2.8 1632 - '@atcute/client': 4.0.5 1633 - '@atcute/crypto': 2.2.6 1634 - '@atcute/did-plc': 0.1.7 1635 - '@atcute/identity-resolver': 1.1.4(@atcute/identity@1.1.1) 1636 - '@atcute/lexicons': 1.2.2 1637 - '@atcute/multibase': 1.1.6 1638 - '@atproto/api': 0.16.11 1639 - '@pds-moover/lexicons': 1.0.1 1640 - alpinejs: 3.15.2 1641 - vite-plugin-full-reload: 1.2.0 1642 - vite-rs-plugin: 1.0.1(vite@7.1.12(@types/node@22.19.0)) 1643 - transitivePeerDependencies: 1644 - - '@atcute/identity' 1645 - - vite 1646 - 1647 1511 '@polka/url@1.0.0-next.29': {} 1648 1512 1649 1513 '@rollup/plugin-commonjs@28.0.9(rollup@4.52.5)': ··· 1911 1775 '@typescript-eslint/types': 8.46.3 1912 1776 eslint-visitor-keys: 4.2.1 1913 1777 1914 - '@vue/reactivity@3.1.5': 1915 - dependencies: 1916 - '@vue/shared': 3.1.5 1917 - 1918 - '@vue/shared@3.1.5': {} 1919 - 1920 1778 acorn-jsx@5.3.2(acorn@8.15.0): 1921 1779 dependencies: 1922 1780 acorn: 8.15.0 ··· 1930 1788 json-schema-traverse: 0.4.1 1931 1789 uri-js: 4.4.1 1932 1790 1933 - alpinejs@3.15.2: 1934 - dependencies: 1935 - '@vue/reactivity': 3.1.5 1936 - 1937 1791 ansi-styles@4.3.0: 1938 1792 dependencies: 1939 1793 color-convert: 2.0.1 ··· 1941 1795 argparse@2.0.1: {} 1942 1796 1943 1797 aria-query@5.3.2: {} 1944 - 1945 - await-lock@2.2.2: {} 1946 1798 1947 1799 axobject-query@4.1.0: {} 1948 1800 ··· 2479 2331 fdir: 6.5.0(picomatch@4.0.3) 2480 2332 picomatch: 4.0.3 2481 2333 2482 - tlds@1.261.0: {} 2483 - 2484 2334 to-regex-range@5.0.1: 2485 2335 dependencies: 2486 2336 is-number: 7.0.0 ··· 2519 2369 punycode: 2.3.1 2520 2370 2521 2371 util-deprecate@1.0.2: {} 2522 - 2523 - vite-plugin-full-reload@1.2.0: 2524 - dependencies: 2525 - picocolors: 1.1.1 2526 - picomatch: 2.3.1 2527 - 2528 - vite-rs-plugin@1.0.1(vite@7.1.12(@types/node@22.19.0)): 2529 - dependencies: 2530 - vite: 7.1.12(@types/node@22.19.0) 2531 - vite-plugin-full-reload: 1.2.0 2532 2372 2533 2373 vite@7.1.12(@types/node@22.19.0): 2534 2374 dependencies: