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

+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: