+30
.husky/pre-commit
+30
.husky/pre-commit
···
1
+
#!/bin/sh
2
+
3
+
#
4
+
# clippr: a social bookmarking service for the AT Protocol
5
+
# Copyright (c) 2025 clippr contributors.
6
+
# SPDX-License-Identifier: AGPL-3.0-only
7
+
#
8
+
9
+
test() {
10
+
cd backend || return 1
11
+
pnpm run fmt
12
+
pnpm run lint
13
+
cd ../frontend || return 1
14
+
pnpm run fmt
15
+
cd ../lexicons || return 1
16
+
pnpm run generate
17
+
pnpm run prepublish
18
+
}
19
+
20
+
echo "Testing code for any errors before committing..."
21
+
test
22
+
if [ $? -ne 0 ]; then {
23
+
echo "Linting failed. Commit aborted."
24
+
exit 1
25
+
}
26
+
fi
27
+
28
+
echo "All relevant checks passed. Proceeding with commit."
29
+
exit 0
30
+
+2
.idea/dictionaries/project.xml
+2
.idea/dictionaries/project.xml
+3
.tangled/workflows/build_backend.yaml
+3
.tangled/workflows/build_backend.yaml
+3
.tangled/workflows/build_frontend.yaml
+3
.tangled/workflows/build_frontend.yaml
+3
.tangled/workflows/build_lexicons.yaml
+3
.tangled/workflows/build_lexicons.yaml
+25
-12
README.md
+25
-12
README.md
···
1
1
# clippr
2
2
3
-
social bookmarking for atproto
3
+
Social bookmarking for the AT Protocol.
4
4
5
5
## current status
6
6
7
-
we are currently working on completing the appview first before moving on to the frontend or any other packages.
7
+
Our current focus is on completing the AppView first before moving on in full earnest to the frontend or any other
8
+
packages; however, some may be developed in tandem if necessary.
8
9
9
-
a lexicon package is available for those using atcute, however, it is still under heavy development. we do not recommend
10
-
using it in any way until the appview is ready.
10
+
The AppView currently has support for indexing records that are created, updated or deleted, some basic queries and DID
11
+
service proxying. Authenticated endpoints and most other queries are currently not implemented.
12
+
13
+
The frontend has OAuth authentication and the ability to view and edit profiles, but is otherwise empty.
11
14
12
-
the frontend has no interactivity and is basically just a mockup.
15
+
A lexicon package is available for those using [atcute](https://github.com/mary-ext/atcute), but it is still under
16
+
heavy development. We do not recommend
17
+
using it in any production environment until the AppView is functionally complete.
13
18
14
19
## what's in here?
15
20
16
-
the project is sorted into different sections, with each root-level folder signifying a package.
21
+
The project is sorted into different sections, with each root-level folder signifying a package.
17
22
18
-
each section will usually contain its own README.md file dedicated to it, going into more detail about that specific
23
+
Each section will usually contain its own README.md file dedicated to it, going into more detail about that specific
19
24
package.
20
25
21
26
| package | description |
22
27
|--------------------------------------------------------------------------|---------------------------------------------------|
23
-
| [``backend``](https://tangled.sh/@hexmani.ac/clippr/tree/main/backend) | the reference appview written using node and hono |
24
-
| [``frontend``](https://tangled.sh/@hexmani.ac/clippr/tree/main/frontend) | the reference client written in solid |
25
-
| [``lexdocs``](https://tangled.sh/@hexmani.ac/clippr/tree/main/lexdocs) | the original lexicon files |
26
-
| [``lexicons``](https://tangled.sh/@hexmani.ac/clippr/tree/main/lexicons) | an atcute package for the clippr lexicons |
28
+
| [``backend``](https://tangled.sh/@hexmani.ac/clippr/tree/main/backend) | The reference AppView written using Node and Hono |
29
+
| [``frontend``](https://tangled.sh/@hexmani.ac/clippr/tree/main/frontend) | The reference client written in Solid |
30
+
| [``lexdocs``](https://tangled.sh/@hexmani.ac/clippr/tree/main/lexdocs) | The original Lexicon files |
31
+
| [``lexicons``](https://tangled.sh/@hexmani.ac/clippr/tree/main/lexicons) | An atcute package for the clippr lexicons |
27
32
28
33
## roadmap
29
34
30
-
soonโข๏ธ
35
+
soonโข๏ธ
36
+
37
+
## license
38
+
39
+
All project code is licensed as free software under the
40
+
[**GNU Affero General Public License**](https://tangled.sh/@hexmani.ac/clippr/blob/main/LICENSE), exclusively under
41
+
version 3. However, the Lexicon schema files are licensed under the permissive
42
+
[**MIT License**](https://tangled.sh/@hexmani.ac/clippr/blob/main/lexdocs/LICENSE) to encourage forks and to allow them
43
+
to be used in projects that are incompatible with the AGPL.
+16
-17
backend/README.md
+16
-17
backend/README.md
···
1
1
# @clipprjs/server
2
2
3
-
typescript implementation of clippr appview using ~~bun~~ deno and hono
3
+
TypeScript implementation of the Clippr AppView, using ~~Bun~~ NodeJS and Hono.
4
+
5
+
> **Why not Bun?** We currently aren't using Bun due to some compatibility errors. A migration to
6
+
> Bun is planned in the future, preferably before launch.
4
7
5
-
## run and develop
8
+
## Start development server
6
9
7
10
```shell
8
11
pnpm install
12
+
cp config.example.toml config.toml # Customize as necessary
9
13
pnpm run db:push
10
14
pnpm run dev
11
15
```
12
16
13
-
open http://localhost:9090 and enjoy
14
-
15
-
## build for production
17
+
## Build for production
16
18
17
19
```shell
18
20
pnpm install
21
+
cp config.example.toml config.toml # Customize as necessary
19
22
pnpm run db:push
20
23
pnpm run build
21
24
pnpm run start
22
25
```
23
26
27
+
Open http://localhost:9090 and enjoy
28
+
24
29
## current status
25
30
26
-
right now we're not running on bun because there are
27
-
[some issues with partysocket](https://github.com/oven-sh/bun/issues/18807), which haven't been
28
-
fixed yet and which the jetstream library we use depends on for the moment. once it has been fixed,
29
-
we do plan to use bun over node in the future.
30
-
31
-
### checklist before it's usable
32
-
33
31
- โ
Ingesting content from the firehose (using Jetstream)
34
-
- โ
Creating the lexicon documents and validating content that comes in from the firehose
32
+
- โ
Validating incoming content according to the Lexicon schema
35
33
- โ
Indexing valid content from the firehose into a database
36
-
- Handling OAuth authentication (public OAuth for the moment)
37
-
- Creating responses to API calls
38
-
- Create records through the API
39
-
- Interact with the frontend
34
+
- โ
Support for DID service proxying and Nodeinfo
35
+
- ๐ก API documentation
36
+
- ๐ก Creating responses to unauthenticated API calls
37
+
- ๐ก Interactions with the frontend
38
+
- ๐ด Creating responses to authenticated API calls
+17
-4
backend/config.example.toml
+17
-4
backend/config.example.toml
···
2
2
## Please copy to "config.example.toml" before starting the server,
3
3
## otherwise it will not start. Modify as necessary.
4
4
5
+
## Where the server is broadcasted to.
5
6
hostname = "localhost"
6
7
port = 9090
7
8
9
+
## Where the server will be deployed to.
10
+
baseUrl = "https://localhost:9090"
11
+
8
12
## For most deployments, you will want to keep the log level at "info".
9
-
## If you are debugging the software, move it down to "debug".
13
+
## If you are a developer, move it down to "debug" for more information.
10
14
##
11
15
## List of all recognized log levels, sorted by importance:
12
16
## "error" - Critical errors, typically leading to a crash or a degraded state.
···
16
20
## "verbose" - Details more of the server's operations.
17
21
## "debug" - Information for developers, meant for debugging.
18
22
## "silly" - Anything goes.
19
-
log-level = "info"
23
+
logLevel = "info"
20
24
21
25
## How the SQLite database is stored.
22
-
## For testing, you can store the database in memory with ":memory:"
26
+
## NOTE: Storing the database in-memory does not work as the schema is not properly loaded. Fixme!
23
27
[database]
24
28
## Paths can be used here.
29
+
## It is not recommended to change this if you are using Docker.
25
30
name = "file:clippr.db"
26
31
27
32
## How the server interacts with the ATproto network.
28
33
[network]
29
-
firehose = "jetstream1.us-east.bsky.network"
34
+
## What Jetstream instance to use for receiving content from the network.
35
+
## Non-Bluesky relay: relay2.fire.hose.cam
36
+
firehose = "jetstream1.us-east.bsky.network"
37
+
## What DID to use for service proxying. This should be the domain that the API is accessible from.
38
+
## Default: "did:web:localhost%3A9090"
39
+
serviceDid = "did:web:localhost%3A9090"
40
+
## A multibase public key to use for DID service proxying, formatted as "did:key:[key]".
41
+
## Do not use the default key outside of development.
42
+
didSigningKey = "did:key:zDnaeuuRRQuYp4S76LwosLhHbpU1HJcg6S5oJAUHmdZLVdLM5"
+2
-7
backend/drizzle.config.ts
+2
-7
backend/drizzle.config.ts
···
8
8
// @ts-expect-error Read from the TypeScript file instead of assuming that it's JavaScript
9
9
import { Config } from "./src/config.ts";
10
10
11
-
const config = Config.getInstance();
12
-
let dbname;
13
-
14
-
dbname = config.get("database.name");
15
-
if (typeof dbname !== "string") {
16
-
dbname = "file:clippr.db"; // Only way to disable linter error
17
-
}
11
+
const config = Config.getInstance().getConfig();
12
+
const dbname = config.database.name;
18
13
19
14
export default defineConfig({
20
15
out: "./drizzle",
+10
-7
backend/package.json
+10
-7
backend/package.json
···
9
9
"start": "node dist/src/main.js",
10
10
"lint": "npx eslint .",
11
11
"lint-write": "npx eslint . --fix",
12
+
"test": "vitest",
12
13
"fmt": "npx prettier --write .",
13
14
"db:push": "npx drizzle-kit push"
14
15
},
···
18
19
"node": ">=22.16.0"
19
20
},
20
21
"dependencies": {
21
-
"@atcute/atproto": "^3.1.1",
22
+
"@atcute/atproto": "^3.1.2",
22
23
"@atcute/client": "^4.0.3",
24
+
"@atcute/crypto": "^2.2.4",
23
25
"@atcute/identity": "^1.0.3",
24
26
"@atcute/identity-resolver": "^1.1.3",
25
27
"@atcute/lexicon-doc": "^1.0.3",
26
-
"@atcute/lexicons": "^1.1.0",
27
-
"@clipprjs/lexicons": "^1.0.2",
28
+
"@atcute/lexicons": "^1.1.1",
29
+
"@clipprjs/lexicons": "^1.0.3",
28
30
"@eslint/eslintrc": "^3.3.1",
29
31
"@hono/node-server": "^1.19.0",
30
32
"@libsql/client": "^0.15.12",
31
-
"@scalar/hono-api-reference": "^0.9.13",
32
-
"@scalar/openapi-to-markdown": "^0.2.26",
33
+
"@scalar/hono-api-reference": "^0.9.15",
34
+
"@scalar/openapi-to-markdown": "^0.2.28",
33
35
"@skyware/jetstream": "^0.2.5",
34
36
"drizzle-orm": "^0.44.4",
35
-
"hono": "^4.9.2",
37
+
"hono": "^4.9.4",
36
38
"toml": "^3.0.0",
37
39
"winston": "^3.17.0",
38
40
"xxhash-wasm": "^1.1.0"
···
54
56
"prettier": "^3.6.2",
55
57
"tsx": "^4.20.4",
56
58
"typescript": "^5.9.2",
57
-
"typescript-eslint": "^8.40.0"
59
+
"typescript-eslint": "^8.40.0",
60
+
"vitest": "^3.2.4"
58
61
}
59
62
}
+854
-216
backend/pnpm-lock.yaml
+854
-216
backend/pnpm-lock.yaml
···
9
9
.:
10
10
dependencies:
11
11
'@atcute/atproto':
12
-
specifier: ^3.1.1
13
-
version: 3.1.1
12
+
specifier: ^3.1.2
13
+
version: 3.1.2
14
14
'@atcute/client':
15
15
specifier: ^4.0.3
16
16
version: 4.0.3
17
+
'@atcute/crypto':
18
+
specifier: ^2.2.4
19
+
version: 2.2.4
17
20
'@atcute/identity':
18
21
specifier: ^1.0.3
19
22
version: 1.0.3
···
24
27
specifier: ^1.0.3
25
28
version: 1.0.3
26
29
'@atcute/lexicons':
27
-
specifier: ^1.1.0
28
-
version: 1.1.0
30
+
specifier: ^1.1.1
31
+
version: 1.1.1
29
32
'@clipprjs/lexicons':
30
-
specifier: ^1.0.2
31
-
version: 1.0.2
33
+
specifier: ^1.0.3
34
+
version: 1.0.3
32
35
'@eslint/eslintrc':
33
36
specifier: ^3.3.1
34
37
version: 3.3.1
35
38
'@hono/node-server':
36
39
specifier: ^1.19.0
37
-
version: 1.19.0(hono@4.9.2)
40
+
version: 1.19.0(hono@4.9.4)
38
41
'@libsql/client':
39
42
specifier: ^0.15.12
40
43
version: 0.15.12
41
44
'@scalar/hono-api-reference':
42
-
specifier: ^0.9.13
43
-
version: 0.9.13(hono@4.9.2)
45
+
specifier: ^0.9.15
46
+
version: 0.9.15(hono@4.9.4)
44
47
'@scalar/openapi-to-markdown':
45
-
specifier: ^0.2.26
46
-
version: 0.2.26(typescript@5.9.2)
48
+
specifier: ^0.2.28
49
+
version: 0.2.28(typescript@5.9.2)
47
50
'@skyware/jetstream':
48
51
specifier: ^0.2.5
49
52
version: 0.2.5
···
51
54
specifier: ^0.44.4
52
55
version: 0.44.4(@libsql/client@0.15.12)(bun-types@1.2.17)
53
56
hono:
54
-
specifier: ^4.9.2
55
-
version: 4.9.2
57
+
specifier: ^4.9.4
58
+
version: 4.9.4
56
59
toml:
57
60
specifier: ^3.0.0
58
61
version: 3.0.0
···
114
117
typescript-eslint:
115
118
specifier: ^8.40.0
116
119
version: 8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2)
120
+
vitest:
121
+
specifier: ^3.2.4
122
+
version: 3.2.4(@types/debug@4.1.12)(@types/node@24.3.0)(jiti@2.5.1)(terser@5.43.1)(tsx@4.20.4)(yaml@2.8.0)
117
123
118
124
packages:
119
125
120
-
'@atcute/atproto@3.1.1':
121
-
resolution: {integrity: sha512-D+RLTIPF0xLu7BPZY8KSewAPemJFh+3n3zeQ3ROsLxbTtCHbrTDMAmAFexaVRAPGcPYrwXaBUlv7yZjScJolMg==}
126
+
'@atcute/atproto@3.1.2':
127
+
resolution: {integrity: sha512-m6OWoGTeL8Wlw7cm8Nrf+NU24rlx5A0DzxEQQPPu1wqYNHw6S33nOU90W+U09vVN0aZGZUrLFfWWhAaSWTp1ZQ==}
122
128
123
-
'@atcute/bluesky@3.2.0':
124
-
resolution: {integrity: sha512-OqPLqUNjXcgQ25MaPdU7H0QcWmZrx6QQk7d5B22A5U4xy+hZJ954kQ5mSAn24Bt0DEm4j/isq1WZovr3vaPTUA==}
129
+
'@atcute/bluesky@3.2.1':
130
+
resolution: {integrity: sha512-WehZuGNEC9NNB2y7Jg/i4ANzbMEQzs2EwrLYKWDuvJT3YnPHEol3vkc4DK47TODs3TiacQJp4MWhsQyfktsZ6g==}
125
131
126
132
'@atcute/client@4.0.3':
127
133
resolution: {integrity: sha512-RIOZWFVLca/HiPAAUDqQPOdOreCxTbL5cb+WUf5yqQOKIu5yEAP3eksinmlLmgIrlr5qVOE7brazUUzaskFCfw==}
134
+
135
+
'@atcute/crypto@2.2.4':
136
+
resolution: {integrity: sha512-88LbuJr63bbdJywd949YgbEiaaW4UU5iXJcFE1WqY/5ItYuoHWVdmL3XsqehiM0AfzvrYEfd5ox2wm9CK9dyQQ==}
128
137
129
138
'@atcute/identity-resolver@1.1.3':
130
139
resolution: {integrity: sha512-KZgGgg99CWaV7Df3+h3X/WMrDzTPQVfsaoIVbTNLx2B56BvCL2EmaxPSVw/7BFUJMZHlVU4rtoEB4lyvNyMswA==}
···
141
150
'@atcute/lexicon-doc@1.0.3':
142
151
resolution: {integrity: sha512-U7rinsTOwXGGcrF6/s7GzTXargcQpDr4BTrj5ci/XTK+POEK5jpcI+Ag1fF932pBX3k97em6y4TWwTSO8M/McQ==}
143
152
144
-
'@atcute/lexicons@1.1.0':
145
-
resolution: {integrity: sha512-LFqwnria78xLYb62Ri/+WwQpUTgZp2DuyolNGIIOV1dpiKhFFFh//nscHMA6IExFLQRqWDs3tTjy7zv0h3sf1Q==}
153
+
'@atcute/lexicons@1.1.1':
154
+
resolution: {integrity: sha512-k6qy5p3j9fJJ6ekaMPfEfp3ni4TW/XNuH9ZmsuwC0fi0tOjp+Fa8ZQakHwnqOzFt/cVBfGcmYE/lKNAbeTjgUg==}
155
+
156
+
'@atcute/multibase@1.1.5':
157
+
resolution: {integrity: sha512-vbmEFxgpntMuRqVZOCBgf6bgq69UGrlznQCZirVSit/mlcgyFVkSGbSEfkRnpIcrM8SnaySwuKbVvL+EPLh2dw==}
158
+
159
+
'@atcute/uint8array@1.0.4':
160
+
resolution: {integrity: sha512-9jASMDghzhhDwjF3+eW+ZIauvytnUWDPfUVGUValRwnf9AZ7Yqqkc76tC89HVzVDAlJdhwQIUG2dQBsiVqumUA==}
146
161
147
162
'@atcute/util-fetch@1.0.1':
148
163
resolution: {integrity: sha512-Clc0E/5ufyGBVfYBUwWNlHONlZCoblSr4Ho50l1LhmRPGB1Wu/AQ9Sz+rsBg7fdaW/auve8ulmwhRhnX2cGRow==}
···
168
183
resolution: {integrity: sha512-4kdqcjyxo/8RQ8ayjms47HCWZIF5981oE5nIenbfThKDxWXtEHKipAOWlflpPJzZx9y/JWYQkp18Awr7VuepFg==}
169
184
engines: {node: '>= 18'}
170
185
171
-
'@clipprjs/lexicons@1.0.2':
172
-
resolution: {integrity: sha512-AIof/RWAtwq/8ygMSNS5KzElbPdXWD9WEX4uGCgAb0RQ/FJUe41X7gIpL0MYOrVtLmOwH+A5rHxq8o3Tn3b8Sg==}
186
+
'@clipprjs/lexicons@1.0.3':
187
+
resolution: {integrity: sha512-RmdrHXcIXBuLcqoDyLexJKNdz06wCvZsHxDlo8XY54J7Qpm7Sp5+K9jeeuEYJEiFZ1b6Tds0aggvi9s0s0NrMw==}
173
188
174
189
'@colors/colors@1.6.0':
175
190
resolution: {integrity: sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==}
···
523
538
'@floating-ui/core@1.7.3':
524
539
resolution: {integrity: sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==}
525
540
526
-
'@floating-ui/dom@1.7.3':
527
-
resolution: {integrity: sha512-uZA413QEpNuhtb3/iIKoYMSK07keHPYeXF02Zhd6e213j+d1NamLix/mCLxBUDW/Gx52sPH2m+chlUsyaBs/Ag==}
541
+
'@floating-ui/dom@1.7.4':
542
+
resolution: {integrity: sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==}
528
543
529
544
'@floating-ui/utils@0.2.10':
530
545
resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==}
531
546
532
-
'@floating-ui/vue@1.1.8':
533
-
resolution: {integrity: sha512-SNJAa1jbT8Gh1LvWw2uIIViLL0saV2bCY59ISCvJzhbut5DSb2H3LKUK49Xkd7SixTNHKX4LFu59nbwIXt9jjQ==}
547
+
'@floating-ui/vue@1.1.9':
548
+
resolution: {integrity: sha512-BfNqNW6KA83Nexspgb9DZuz578R7HT8MZw1CfK9I6Ah4QReNWEJsXWHN+SdmOVLNGmTPDi+fDT535Df5PzMLbQ==}
534
549
535
550
'@headlessui/vue@1.7.23':
536
551
resolution: {integrity: sha512-JzdCNqurrtuu0YW6QaDtR2PIYCKPUWq28csDyMvN4zmGccmE7lz40Is6hc3LA4HFeCI7sekZ/PQMTNmn9I/4Wg==}
···
668
683
'@neon-rs/load@0.0.4':
669
684
resolution: {integrity: sha512-kTPhdZyTQxB+2wpiRcFWrDcejc4JI6tkPuS7UZCG4l6Zvc5kU/gGQ/ozvHTh1XR5tS+UlfAfGuPajjzQjCiHCw==}
670
685
686
+
'@noble/secp256k1@2.3.0':
687
+
resolution: {integrity: sha512-0TQed2gcBbIrh7Ccyw+y/uZQvbJwm7Ao4scBUxqpBCcsOlZG0O4KGfjtNAy/li4W8n1xt3dxrwJ0beZ2h2G6Kw==}
688
+
671
689
'@nodelib/fs.scandir@2.1.5':
672
690
resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
673
691
engines: {node: '>= 8'}
···
687
705
resolution: {integrity: sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==}
688
706
engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0}
689
707
708
+
'@rollup/rollup-android-arm-eabi@4.50.0':
709
+
resolution: {integrity: sha512-lVgpeQyy4fWN5QYebtW4buT/4kn4p4IJ+kDNB4uYNT5b8c8DLJDg6titg20NIg7E8RWwdWZORW6vUFfrLyG3KQ==}
710
+
cpu: [arm]
711
+
os: [android]
712
+
713
+
'@rollup/rollup-android-arm64@4.50.0':
714
+
resolution: {integrity: sha512-2O73dR4Dc9bp+wSYhviP6sDziurB5/HCym7xILKifWdE9UsOe2FtNcM+I4xZjKrfLJnq5UR8k9riB87gauiQtw==}
715
+
cpu: [arm64]
716
+
os: [android]
717
+
718
+
'@rollup/rollup-darwin-arm64@4.50.0':
719
+
resolution: {integrity: sha512-vwSXQN8T4sKf1RHr1F0s98Pf8UPz7pS6P3LG9NSmuw0TVh7EmaE+5Ny7hJOZ0M2yuTctEsHHRTMi2wuHkdS6Hg==}
720
+
cpu: [arm64]
721
+
os: [darwin]
722
+
723
+
'@rollup/rollup-darwin-x64@4.50.0':
724
+
resolution: {integrity: sha512-cQp/WG8HE7BCGyFVuzUg0FNmupxC+EPZEwWu2FCGGw5WDT1o2/YlENbm5e9SMvfDFR6FRhVCBePLqj0o8MN7Vw==}
725
+
cpu: [x64]
726
+
os: [darwin]
727
+
728
+
'@rollup/rollup-freebsd-arm64@4.50.0':
729
+
resolution: {integrity: sha512-UR1uTJFU/p801DvvBbtDD7z9mQL8J80xB0bR7DqW7UGQHRm/OaKzp4is7sQSdbt2pjjSS72eAtRh43hNduTnnQ==}
730
+
cpu: [arm64]
731
+
os: [freebsd]
732
+
733
+
'@rollup/rollup-freebsd-x64@4.50.0':
734
+
resolution: {integrity: sha512-G/DKyS6PK0dD0+VEzH/6n/hWDNPDZSMBmqsElWnCRGrYOb2jC0VSupp7UAHHQ4+QILwkxSMaYIbQ72dktp8pKA==}
735
+
cpu: [x64]
736
+
os: [freebsd]
737
+
738
+
'@rollup/rollup-linux-arm-gnueabihf@4.50.0':
739
+
resolution: {integrity: sha512-u72Mzc6jyJwKjJbZZcIYmd9bumJu7KNmHYdue43vT1rXPm2rITwmPWF0mmPzLm9/vJWxIRbao/jrQmxTO0Sm9w==}
740
+
cpu: [arm]
741
+
os: [linux]
742
+
743
+
'@rollup/rollup-linux-arm-musleabihf@4.50.0':
744
+
resolution: {integrity: sha512-S4UefYdV0tnynDJV1mdkNawp0E5Qm2MtSs330IyHgaccOFrwqsvgigUD29uT+B/70PDY1eQ3t40+xf6wIvXJyg==}
745
+
cpu: [arm]
746
+
os: [linux]
747
+
748
+
'@rollup/rollup-linux-arm64-gnu@4.50.0':
749
+
resolution: {integrity: sha512-1EhkSvUQXJsIhk4msxP5nNAUWoB4MFDHhtc4gAYvnqoHlaL9V3F37pNHabndawsfy/Tp7BPiy/aSa6XBYbaD1g==}
750
+
cpu: [arm64]
751
+
os: [linux]
752
+
753
+
'@rollup/rollup-linux-arm64-musl@4.50.0':
754
+
resolution: {integrity: sha512-EtBDIZuDtVg75xIPIK1l5vCXNNCIRM0OBPUG+tbApDuJAy9mKago6QxX+tfMzbCI6tXEhMuZuN1+CU8iDW+0UQ==}
755
+
cpu: [arm64]
756
+
os: [linux]
757
+
758
+
'@rollup/rollup-linux-loongarch64-gnu@4.50.0':
759
+
resolution: {integrity: sha512-BGYSwJdMP0hT5CCmljuSNx7+k+0upweM2M4YGfFBjnFSZMHOLYR0gEEj/dxyYJ6Zc6AiSeaBY8dWOa11GF/ppQ==}
760
+
cpu: [loong64]
761
+
os: [linux]
762
+
763
+
'@rollup/rollup-linux-ppc64-gnu@4.50.0':
764
+
resolution: {integrity: sha512-I1gSMzkVe1KzAxKAroCJL30hA4DqSi+wGc5gviD0y3IL/VkvcnAqwBf4RHXHyvH66YVHxpKO8ojrgc4SrWAnLg==}
765
+
cpu: [ppc64]
766
+
os: [linux]
767
+
768
+
'@rollup/rollup-linux-riscv64-gnu@4.50.0':
769
+
resolution: {integrity: sha512-bSbWlY3jZo7molh4tc5dKfeSxkqnf48UsLqYbUhnkdnfgZjgufLS/NTA8PcP/dnvct5CCdNkABJ56CbclMRYCA==}
770
+
cpu: [riscv64]
771
+
os: [linux]
772
+
773
+
'@rollup/rollup-linux-riscv64-musl@4.50.0':
774
+
resolution: {integrity: sha512-LSXSGumSURzEQLT2e4sFqFOv3LWZsEF8FK7AAv9zHZNDdMnUPYH3t8ZlaeYYZyTXnsob3htwTKeWtBIkPV27iQ==}
775
+
cpu: [riscv64]
776
+
os: [linux]
777
+
778
+
'@rollup/rollup-linux-s390x-gnu@4.50.0':
779
+
resolution: {integrity: sha512-CxRKyakfDrsLXiCyucVfVWVoaPA4oFSpPpDwlMcDFQvrv3XY6KEzMtMZrA+e/goC8xxp2WSOxHQubP8fPmmjOQ==}
780
+
cpu: [s390x]
781
+
os: [linux]
782
+
783
+
'@rollup/rollup-linux-x64-gnu@4.50.0':
784
+
resolution: {integrity: sha512-8PrJJA7/VU8ToHVEPu14FzuSAqVKyo5gg/J8xUerMbyNkWkO9j2ExBho/68RnJsMGNJq4zH114iAttgm7BZVkA==}
785
+
cpu: [x64]
786
+
os: [linux]
787
+
788
+
'@rollup/rollup-linux-x64-musl@4.50.0':
789
+
resolution: {integrity: sha512-SkE6YQp+CzpyOrbw7Oc4MgXFvTw2UIBElvAvLCo230pyxOLmYwRPwZ/L5lBe/VW/qT1ZgND9wJfOsdy0XptRvw==}
790
+
cpu: [x64]
791
+
os: [linux]
792
+
793
+
'@rollup/rollup-openharmony-arm64@4.50.0':
794
+
resolution: {integrity: sha512-PZkNLPfvXeIOgJWA804zjSFH7fARBBCpCXxgkGDRjjAhRLOR8o0IGS01ykh5GYfod4c2yiiREuDM8iZ+pVsT+Q==}
795
+
cpu: [arm64]
796
+
os: [openharmony]
797
+
798
+
'@rollup/rollup-win32-arm64-msvc@4.50.0':
799
+
resolution: {integrity: sha512-q7cIIdFvWQoaCbLDUyUc8YfR3Jh2xx3unO8Dn6/TTogKjfwrax9SyfmGGK6cQhKtjePI7jRfd7iRYcxYs93esg==}
800
+
cpu: [arm64]
801
+
os: [win32]
802
+
803
+
'@rollup/rollup-win32-ia32-msvc@4.50.0':
804
+
resolution: {integrity: sha512-XzNOVg/YnDOmFdDKcxxK410PrcbcqZkBmz+0FicpW5jtjKQxcW1BZJEQOF0NJa6JO7CZhett8GEtRN/wYLYJuw==}
805
+
cpu: [ia32]
806
+
os: [win32]
807
+
808
+
'@rollup/rollup-win32-x64-msvc@4.50.0':
809
+
resolution: {integrity: sha512-xMmiWRR8sp72Zqwjgtf3QbZfF1wdh8X2ABu3EaozvZcyHJeU0r+XAnXdKgs4cCAp6ORoYoCygipYP1mjmbjrsg==}
810
+
cpu: [x64]
811
+
os: [win32]
812
+
690
813
'@rtsao/scc@1.1.0':
691
814
resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==}
692
815
···
694
817
resolution: {integrity: sha512-WUUVDd1Wk7QJVKWXl/Zdn/VINc2pc1NlWW8VJFYZRm3/hKJwBhi0on7+HjVQNKgUaRy7+zluru5Ckl1gcTHHEg==}
695
818
engines: {node: '>=20'}
696
819
697
-
'@scalar/components@0.14.23':
698
-
resolution: {integrity: sha512-rmIMRrlqOWlXAJaVbr9DArrKKp95P2fllNM69VrEAHtwMReambBRKuC02cQPwOZcbZCtPx4dZsv2aUB5QdtecQ==}
820
+
'@scalar/components@0.14.25':
821
+
resolution: {integrity: sha512-1lYVHa+9QVawEipFSBA/H9ROJJLijcAQ/kaFuTkJnZMS5DZ8aRB423TxVApJNSlMm96f8KGzIwS7Fq3sNYsXJg==}
699
822
engines: {node: '>=20'}
700
823
701
-
'@scalar/core@0.3.11':
702
-
resolution: {integrity: sha512-4O3mC29k2STz4quBHrpsl6czxi94F3dy8Ej/OPbELS2myKO4GoxromT0BiKSLPAThCnmJ0rqMZ7k9NsgzVjEgA==}
824
+
'@scalar/core@0.3.13':
825
+
resolution: {integrity: sha512-lgrueSjR1eacM39Zg0jAHikGomGAF2o2/s/5EcMz/ul7VLo/IBymw8gUjcGHZ9zd8PFGdo8DvOwFMRCiXiaDHw==}
703
826
engines: {node: '>=20'}
704
827
705
-
'@scalar/helpers@0.0.7':
706
-
resolution: {integrity: sha512-ieexJgofs0PPAp3yxz+0S2tI/GWvo9btxplHE5KxUiWwq2bksYnrhrt+gwe4DoGPRaajzutzJuD1u4VnJd9bNA==}
828
+
'@scalar/helpers@0.0.8':
829
+
resolution: {integrity: sha512-9A1CxL3jV7Kl9wGu86/cR/wiJN6J+3tK4WuW3252s2gF+upXsgQRx9WLhFF3xifOP1irIGusitZBiojiKmUSVg==}
707
830
engines: {node: '>=20'}
708
831
709
-
'@scalar/hono-api-reference@0.9.13':
710
-
resolution: {integrity: sha512-79Gs+/2/FcqwZ3Lp0lsv3pFKHY1qBF2ONkfgh/gxRsd8Z+RZRTDBZafe7OConj+c4tHm0Zz3bKTKEV0OMQi/aA==}
832
+
'@scalar/hono-api-reference@0.9.15':
833
+
resolution: {integrity: sha512-Lx/ity79xA3pdp624ikccDwvlY30M79e/1jvl/LjPDToc0byMr2tUVyHbmMhuaX8PVPlUKkdO97XGw0+M5IZJg==}
711
834
engines: {node: '>=20'}
712
835
peerDependencies:
713
836
hono: ^4.0.0
714
837
715
-
'@scalar/icons@0.4.6':
716
-
resolution: {integrity: sha512-ho9ee29Ik+Jv17bSaQEXvGn1e2ydNEyc7Sv8A8hqPq084aIOiTBtVFISPPt+k/O6z0SIRayfL8FEZqr93GyZPg==}
838
+
'@scalar/icons@0.4.7':
839
+
resolution: {integrity: sha512-0qXPGRdZ180TMfejWCPYy7ILszBrAraq4KBhPtcM12ghc5qkncFWWpTm5yXI/vrbm10t7wvtTK08CLZ36CnXlQ==}
717
840
engines: {node: '>=20'}
718
841
719
-
'@scalar/json-magic@0.1.0':
720
-
resolution: {integrity: sha512-Slq3nheaAzbhLMdjgKHsJBNyEYv2ekDnWaOagOflo6K5XOx6UTmCLclaj26z89ihpTgWWtQJIRDC8bsRIJwpAg==}
842
+
'@scalar/json-magic@0.3.0':
843
+
resolution: {integrity: sha512-RmX6tIsV76xHioQWVTB1By85+7tbBkKFFbMn3p+1s5PrPiK/U20AAv9OUTt6f5U5fjaTSuaQNVyyhn5SYjtBQQ==}
721
844
engines: {node: '>=20'}
722
845
723
-
'@scalar/oas-utils@0.4.18':
724
-
resolution: {integrity: sha512-1VsTZLIEThZ7vwa3Fych4Ks1VTf8JetCuP8LA1VlamAhl/+qpLn9mgvxKSAdTyiLzM8ST5jtDi/Pg/2qWbTlzw==}
846
+
'@scalar/oas-utils@0.4.20':
847
+
resolution: {integrity: sha512-zr7WLN6s6OLH+/BitInXOQxGOAr4ZDcIrQi6RFFc+U7F26rmhvhAN0qZXv8ew8SPnWyugH2PGjxZg0IgLs7+lQ==}
725
848
engines: {node: '>=20'}
726
849
727
-
'@scalar/object-utils@1.2.3':
728
-
resolution: {integrity: sha512-1LW2pHs2jp5ixyK+NdpAyuUlOL+iJ8wQ0P2EgV45vLJ8YeZo5DtxQbKuFyqoaviTYjg2MWs1exavYP/qAaSqyQ==}
850
+
'@scalar/object-utils@1.2.4':
851
+
resolution: {integrity: sha512-lX/+9Sp6euZvbsikGRZiHwmfbLd0oTLTttKbJF9v2EkahSrQUT0WF835Ct2N0R8xSkyQauDhT2xCfuA0QNqDeA==}
729
852
engines: {node: '>=20'}
730
853
731
-
'@scalar/openapi-parser@0.19.0':
732
-
resolution: {integrity: sha512-U1FDug4NFK+o1ib93L2MerW13s61sEDPDgrmO14mp5qAV5iYkC2l0KqKQLMIbt3sWw6fDy900eXNKIgUuge4BA==}
854
+
'@scalar/openapi-parser@0.20.0':
855
+
resolution: {integrity: sha512-gsqpiDP9BuZNMx8Ma9UXapdoorIXiyAwr3qra/Zb3CsShun2KQoq20jSMJzVSTAm8HnBmNlZIQm1jSUvzDW5Tw==}
733
856
engines: {node: '>=20'}
734
857
735
-
'@scalar/openapi-to-markdown@0.2.26':
736
-
resolution: {integrity: sha512-GqA1aItKQoTz6r36ClCSPqLCPHFDvMT4f7oNeg0mdzcNzN7/EE9DdMqNQFihkg5OPtl32nQFxL+r/XFwgGXDlQ==}
858
+
'@scalar/openapi-to-markdown@0.2.28':
859
+
resolution: {integrity: sha512-IB1P48kgLzCjVJQfkR0E2+qnnNY9uDLfYrStfZN5drhvWO/EmT7EIgGvGVj7XJHga7B9UVIL+s6CtfhUkPN0EA==}
737
860
engines: {node: '>=20'}
738
861
739
862
'@scalar/openapi-types@0.3.7':
740
863
resolution: {integrity: sha512-QHSvHBVDze3+dUwAhIGq6l1iOev4jdoqdBK7QpfeN1Q4h+6qpVEw3EEqBiH0AXUSh/iWwObBv4uMgfIx0aNZ5g==}
741
864
engines: {node: '>=20'}
742
865
743
-
'@scalar/snippetz@0.4.4':
744
-
resolution: {integrity: sha512-Vml82Jhzr10lLj4bUrwZAcn4ym63pzfH+fOkrJ0Ig/dM9dP1bAHmwHkEDaUQkiGM6x2KIhe2eMsJtO7Y+VgHOQ==}
866
+
'@scalar/snippetz@0.4.5':
867
+
resolution: {integrity: sha512-Pp4EDn5BAA1b/srgm6b7iD23UwzQISdQOh+Ai3gTWFePZlMHNuQBAiaqgDyINs1YUAgkBP+VDLBVlWMCjWC93A==}
745
868
engines: {node: '>=20'}
746
869
747
-
'@scalar/themes@0.13.12':
748
-
resolution: {integrity: sha512-fM010t8npZ8XqGle7ZjoAFGEfzkJ1XjEk1W3OJ5nLzSLq3hXXp72f4wHp6eaKoDWw8rFq+ZeOZk1GP7PgSr/Jw==}
870
+
'@scalar/themes@0.13.13':
871
+
resolution: {integrity: sha512-H67wm2Wfds6f+ygb/1qHWaKdieJdU8aGsU8qjGQamYPQriz6m6gr/AYNAc8B73I04ZXLswzJ6Doj/JcounPKZA==}
749
872
engines: {node: '>=20'}
750
873
751
-
'@scalar/types@0.2.11':
752
-
resolution: {integrity: sha512-SUZzGmoisWsYv33LmmT/ajvSlcl9ZDj9d5RncJ+wB9ZQ2l018xlfpDIH9Kdfo+6KCKQOe3LYLXfH4Lzm891Mag==}
874
+
'@scalar/types@0.2.12':
875
+
resolution: {integrity: sha512-CW7jS+gpc3lZdjf+888++I9HtsGCk6zbh4lZscY8spcg/dlXXd3ReYicxee/cx+soDjU1d/Pcqj9o/QqvTFYxQ==}
753
876
engines: {node: '>=20'}
754
877
755
878
'@scalar/use-hooks@0.2.4':
···
760
883
resolution: {integrity: sha512-u+o77cdTNZ5ePqHPu8ZcFw1BLlISv+cthN0bR1zJHXmqBjvanFTy2kL+Gmv3eW9HxZiHdqycKVETlYd0mWiqJQ==}
761
884
engines: {node: '>=20'}
762
885
763
-
'@scalar/workspace-store@0.12.0':
764
-
resolution: {integrity: sha512-e0OMEYTrQ6D/8gg4lAIim5lL5utK+8zLH5mdriYY34L9UszLTbzGTesZBfNA15Eao1mo7f3hbyRJPPBydwo0rw==}
886
+
'@scalar/workspace-store@0.14.0':
887
+
resolution: {integrity: sha512-60gY3e3vsPn2ue1kMt4SlAM5mBZHObi0tGVZWYxwkXxvaKik2HaEpHQWZov7F6ZullCy1ECXNThzVE63zjqw9g==}
765
888
engines: {node: '>=18'}
766
889
767
-
'@sinclair/typebox@0.34.37':
768
-
resolution: {integrity: sha512-2TRuQVgQYfy+EzHRTIvkhv2ADEouJ2xNS/Vq+W5EuuewBdOrvATvljZTxHWZSTYr2sTjTHpGvucaGAt67S2akw==}
890
+
'@sinclair/typebox@https://raw.githubusercontent.com/DemonHa/typebox/refs/heads/amrit/build/target/remote/sinclair-typebox-0.34.38.tgz':
891
+
resolution: {tarball: https://raw.githubusercontent.com/DemonHa/typebox/refs/heads/amrit/build/target/remote/sinclair-typebox-0.34.38.tgz}
892
+
version: 0.34.38
769
893
770
894
'@skyware/jetstream@0.2.5':
771
895
resolution: {integrity: sha512-fM/zs03DLwqRyzZZJFWN20e76KrdqIp97Tlm8Cek+vxn96+tu5d/fx79V6H85L0QN6HvGiX2l9A8hWFqHvYlOA==}
···
781
905
peerDependencies:
782
906
vue: ^2.7.0 || ^3.0.0
783
907
908
+
'@types/chai@5.2.2':
909
+
resolution: {integrity: sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==}
910
+
784
911
'@types/debug@4.1.12':
785
912
resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==}
913
+
914
+
'@types/deep-eql@4.0.2':
915
+
resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==}
786
916
787
917
'@types/estree@1.0.8':
788
918
resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==}
···
885
1015
'@ungap/structured-clone@1.3.0':
886
1016
resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==}
887
1017
888
-
'@vue/compiler-core@3.5.18':
889
-
resolution: {integrity: sha512-3slwjQrrV1TO8MoXgy3aynDQ7lslj5UqDxuHnrzHtpON5CBinhWjJETciPngpin/T3OuW3tXUf86tEurusnztw==}
1018
+
'@vitest/expect@3.2.4':
1019
+
resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==}
1020
+
1021
+
'@vitest/mocker@3.2.4':
1022
+
resolution: {integrity: sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==}
1023
+
peerDependencies:
1024
+
msw: ^2.4.9
1025
+
vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0
1026
+
peerDependenciesMeta:
1027
+
msw:
1028
+
optional: true
1029
+
vite:
1030
+
optional: true
1031
+
1032
+
'@vitest/pretty-format@3.2.4':
1033
+
resolution: {integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==}
1034
+
1035
+
'@vitest/runner@3.2.4':
1036
+
resolution: {integrity: sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==}
1037
+
1038
+
'@vitest/snapshot@3.2.4':
1039
+
resolution: {integrity: sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==}
1040
+
1041
+
'@vitest/spy@3.2.4':
1042
+
resolution: {integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==}
1043
+
1044
+
'@vitest/utils@3.2.4':
1045
+
resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==}
890
1046
891
-
'@vue/compiler-dom@3.5.18':
892
-
resolution: {integrity: sha512-RMbU6NTU70++B1JyVJbNbeFkK+A+Q7y9XKE2EM4NLGm2WFR8x9MbAtWxPPLdm0wUkuZv9trpwfSlL6tjdIa1+A==}
1047
+
'@vue/compiler-core@3.5.19':
1048
+
resolution: {integrity: sha512-/afpyvlkrSNYbPo94Qu8GtIOWS+g5TRdOvs6XZNw6pWQQmj5pBgSZvEPOIZlqWq0YvoUhDDQaQ2TnzuJdOV4hA==}
893
1049
894
-
'@vue/compiler-sfc@3.5.18':
895
-
resolution: {integrity: sha512-5aBjvGqsWs+MoxswZPoTB9nSDb3dhd1x30xrrltKujlCxo48j8HGDNj3QPhF4VIS0VQDUrA1xUfp2hEa+FNyXA==}
1050
+
'@vue/compiler-dom@3.5.19':
1051
+
resolution: {integrity: sha512-Drs6rPHQZx/pN9S6ml3Z3K/TWCIRPvzG2B/o5kFK9X0MNHt8/E+38tiRfojufrYBfA6FQUFB2qBBRXlcSXWtOA==}
896
1052
897
-
'@vue/compiler-ssr@3.5.18':
898
-
resolution: {integrity: sha512-xM16Ak7rSWHkM3m22NlmcdIM+K4BMyFARAfV9hYFl+SFuRzrZ3uGMNW05kA5pmeMa0X9X963Kgou7ufdbpOP9g==}
1053
+
'@vue/compiler-sfc@3.5.19':
1054
+
resolution: {integrity: sha512-YWCm1CYaJ+2RvNmhCwI7t3I3nU+hOrWGWMsn+Z/kmm1jy5iinnVtlmkiZwbLlbV1SRizX7vHsc0/bG5dj0zRTg==}
899
1055
900
-
'@vue/reactivity@3.5.18':
901
-
resolution: {integrity: sha512-x0vPO5Imw+3sChLM5Y+B6G1zPjwdOri9e8V21NnTnlEvkxatHEH5B5KEAJcjuzQ7BsjGrKtfzuQ5eQwXh8HXBg==}
1056
+
'@vue/compiler-ssr@3.5.19':
1057
+
resolution: {integrity: sha512-/wx0VZtkWOPdiQLWPeQeqpHWR/LuNC7bHfSX7OayBTtUy8wur6vT6EQIX6Et86aED6J+y8tTw43qo2uoqGg5sw==}
902
1058
903
-
'@vue/runtime-core@3.5.18':
904
-
resolution: {integrity: sha512-DUpHa1HpeOQEt6+3nheUfqVXRog2kivkXHUhoqJiKR33SO4x+a5uNOMkV487WPerQkL0vUuRvq/7JhRgLW3S+w==}
1059
+
'@vue/reactivity@3.5.19':
1060
+
resolution: {integrity: sha512-4bueZg2qs5MSsK2dQk3sssV0cfvxb/QZntTC8v7J448GLgmfPkQ+27aDjlt40+XFqOwUq5yRxK5uQh14Fc9eVA==}
1061
+
1062
+
'@vue/runtime-core@3.5.19':
1063
+
resolution: {integrity: sha512-TaooCr8Hge1sWjLSyhdubnuofs3shhzZGfyD11gFolZrny76drPwBVQj28/z/4+msSFb18tOIg6VVVgf9/IbIA==}
905
1064
906
-
'@vue/runtime-dom@3.5.18':
907
-
resolution: {integrity: sha512-YwDj71iV05j4RnzZnZtGaXwPoUWeRsqinblgVJwR8XTXYZ9D5PbahHQgsbmzUvCWNF6x7siQ89HgnX5eWkr3mw==}
1065
+
'@vue/runtime-dom@3.5.19':
1066
+
resolution: {integrity: sha512-qmahqeok6ztuUTmV8lqd7N9ymbBzctNF885n8gL3xdCC1u2RnM/coX16Via0AiONQXUoYpxPojL3U1IsDgSWUQ==}
908
1067
909
-
'@vue/server-renderer@3.5.18':
910
-
resolution: {integrity: sha512-PvIHLUoWgSbDG7zLHqSqaCoZvHi6NNmfVFOqO+OnwvqMz/tqQr3FuGWS8ufluNddk7ZLBJYMrjcw1c6XzR12mA==}
1068
+
'@vue/server-renderer@3.5.19':
1069
+
resolution: {integrity: sha512-ZJ/zV9SQuaIO+BEEVq/2a6fipyrSYfjKMU3267bPUk+oTx/hZq3RzV7VCh0Unlppt39Bvh6+NzxeopIFv4HJNg==}
911
1070
peerDependencies:
912
-
vue: 3.5.18
1071
+
vue: 3.5.19
913
1072
914
-
'@vue/shared@3.5.18':
915
-
resolution: {integrity: sha512-cZy8Dq+uuIXbxCZpuLd2GJdeSO/lIzIspC2WtkqIpje5QyFbvLaI5wZtdUjLHjGZrlVX6GilejatWwVYYRc8tA==}
1073
+
'@vue/shared@3.5.19':
1074
+
resolution: {integrity: sha512-IhXCOn08wgKrLQxRFKKlSacWg4Goi1BolrdEeLYn6tgHjJNXVrWJ5nzoxZqNwl5p88aLlQ8LOaoMa3AYvaKJ/Q==}
916
1075
917
1076
'@vueuse/core@10.11.1':
918
1077
resolution: {integrity: sha512-guoy26JQktXPcz+0n3GukWIy/JDNKti9v6VEMu6kV2sYBsWuGiTU8OWdg+ADfUbHg3/3DlqySDe7JmdHrktiww==}
···
999
1158
resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==}
1000
1159
engines: {node: '>= 0.4'}
1001
1160
1161
+
assertion-error@2.0.1:
1162
+
resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==}
1163
+
engines: {node: '>=12'}
1164
+
1002
1165
async-function@1.0.0:
1003
1166
resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==}
1004
1167
engines: {node: '>= 0.4'}
···
1032
1195
bun-types@1.2.17:
1033
1196
resolution: {integrity: sha512-ElC7ItwT3SCQwYZDYoAH+q6KT4Fxjl8DtZ6qDulUFBmXA8YB4xo+l54J9ZJN+k2pphfn9vk7kfubeSd5QfTVJQ==}
1034
1197
1198
+
cac@6.7.14:
1199
+
resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==}
1200
+
engines: {node: '>=8'}
1201
+
1035
1202
call-bind-apply-helpers@1.0.2:
1036
1203
resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==}
1037
1204
engines: {node: '>= 0.4'}
···
1053
1220
1054
1221
ccount@2.0.1:
1055
1222
resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==}
1223
+
1224
+
chai@5.3.3:
1225
+
resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==}
1226
+
engines: {node: '>=18'}
1056
1227
1057
1228
chalk@4.1.2:
1058
1229
resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
···
1071
1242
character-entities@2.0.2:
1072
1243
resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==}
1073
1244
1245
+
check-error@2.1.1:
1246
+
resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==}
1247
+
engines: {node: '>= 16'}
1248
+
1074
1249
clean-css@5.3.3:
1075
1250
resolution: {integrity: sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==}
1076
1251
engines: {node: '>= 10.0'}
···
1174
1349
1175
1350
decode-named-character-reference@1.2.0:
1176
1351
resolution: {integrity: sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==}
1352
+
1353
+
deep-eql@5.0.2:
1354
+
resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==}
1355
+
engines: {node: '>=6'}
1177
1356
1178
1357
deep-is@0.1.4:
1179
1358
resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
···
1330
1509
resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}
1331
1510
engines: {node: '>= 0.4'}
1332
1511
1512
+
es-module-lexer@1.7.0:
1513
+
resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==}
1514
+
1333
1515
es-object-atoms@1.1.1:
1334
1516
resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==}
1335
1517
engines: {node: '>= 0.4'}
···
1472
1654
estree-walker@2.0.2:
1473
1655
resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
1474
1656
1657
+
estree-walker@3.0.3:
1658
+
resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==}
1659
+
1475
1660
esutils@2.0.3:
1476
1661
resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
1477
1662
engines: {node: '>=0.10.0'}
···
1479
1664
event-target-polyfill@0.0.4:
1480
1665
resolution: {integrity: sha512-Gs6RLjzlLRdT8X9ZipJdIZI/Y6/HhRLyq9RdDlCsnpxr/+Nn6bU2EFGuC94GjxqhM+Nmij2Vcq98yoHrU8uNFQ==}
1481
1666
1667
+
expect-type@1.2.2:
1668
+
resolution: {integrity: sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==}
1669
+
engines: {node: '>=12.0.0'}
1670
+
1482
1671
extend@3.0.2:
1483
1672
resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==}
1484
1673
···
1504
1693
fastq@1.19.1:
1505
1694
resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==}
1506
1695
1696
+
fdir@6.5.0:
1697
+
resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==}
1698
+
engines: {node: '>=12.0.0'}
1699
+
peerDependencies:
1700
+
picomatch: ^3 || ^4
1701
+
peerDependenciesMeta:
1702
+
picomatch:
1703
+
optional: true
1704
+
1507
1705
fecha@4.2.3:
1508
1706
resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==}
1509
1707
···
1696
1894
highlightjs-vue@1.0.0:
1697
1895
resolution: {integrity: sha512-PDEfEF102G23vHmPhLyPboFCD+BkMGu+GuJe2d9/eH4FsCwvgBpnc9n0pGE+ffKdph38s6foEZiEjdgHdzp+IA==}
1698
1896
1699
-
hono@4.9.2:
1700
-
resolution: {integrity: sha512-UG2jXGS/gkLH42l/1uROnwXpkjvvxkl3kpopL3LBo27NuaDPI6xHNfuUSilIHcrBkPfl4y0z6y2ByI455TjNRw==}
1897
+
hono@4.9.4:
1898
+
resolution: {integrity: sha512-61hl6MF6ojTl/8QSRu5ran6GXt+6zsngIUN95KzF5v5UjiX/xnrLR358BNRawwIRO49JwUqJqQe3Rb2v559R8Q==}
1701
1899
engines: {node: '>=16.9.0'}
1702
1900
1703
1901
html-minifier-terser@7.2.0:
···
1870
2068
js-base64@3.7.8:
1871
2069
resolution: {integrity: sha512-hNngCeKxIUQiEUN3GPJOkz4wF/YvdUdbNL9hsBcMQTkKzboD7T/q3OYOuuPZLUE6dBxSGpwhk5mwuDud7JVAow==}
1872
2070
2071
+
js-tokens@9.0.1:
2072
+
resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==}
2073
+
1873
2074
js-yaml@4.1.0:
1874
2075
resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
1875
2076
hasBin: true
···
1937
2138
longest-streak@3.1.0:
1938
2139
resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==}
1939
2140
2141
+
loupe@3.2.1:
2142
+
resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==}
2143
+
1940
2144
lower-case@2.0.2:
1941
2145
resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==}
1942
2146
1943
2147
lowlight@3.3.0:
1944
2148
resolution: {integrity: sha512-0JNhgFoPvP6U6lE/UdVsSq99tn6DhjjpAj5MxG49ewd2mOBVtwWYIT8ClyABhq198aXXODMU6Ox8DrGy/CpTZQ==}
1945
2149
1946
-
magic-string@0.30.17:
1947
-
resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==}
2150
+
magic-string@0.30.18:
2151
+
resolution: {integrity: sha512-yi8swmWbO17qHhwIBNeeZxTceJMeBvWJaId6dyvTSOwTipqeHhMhOrz6513r1sOKnpvQ7zkhlG8tPrpilwTxHQ==}
1948
2152
1949
2153
markdown-table@3.0.4:
1950
2154
resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==}
···
2195
2399
path-parse@1.0.7:
2196
2400
resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
2197
2401
2402
+
pathe@2.0.3:
2403
+
resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==}
2404
+
2405
+
pathval@2.0.1:
2406
+
resolution: {integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==}
2407
+
engines: {node: '>= 14.16'}
2408
+
2198
2409
picocolors@1.1.1:
2199
2410
resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
2200
2411
···
2202
2413
resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
2203
2414
engines: {node: '>=8.6'}
2204
2415
2416
+
picomatch@4.0.3:
2417
+
resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==}
2418
+
engines: {node: '>=12'}
2419
+
2205
2420
possible-typed-array-names@1.1.0:
2206
2421
resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==}
2207
2422
engines: {node: '>= 0.4'}
···
2320
2535
resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==}
2321
2536
engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
2322
2537
2538
+
rollup@4.50.0:
2539
+
resolution: {integrity: sha512-/Zl4D8zPifNmyGzJS+3kVoyXeDeT/GrsJM94sACNg9RtUE0hrHa1bNPtRSrfHTMH5HjRzce6K7rlTh3Khiw+pw==}
2540
+
engines: {node: '>=18.0.0', npm: '>=8.0.0'}
2541
+
hasBin: true
2542
+
2323
2543
run-parallel@1.2.0:
2324
2544
resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
2325
2545
···
2390
2610
resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==}
2391
2611
engines: {node: '>= 0.4'}
2392
2612
2613
+
siginfo@2.0.0:
2614
+
resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==}
2615
+
2393
2616
simple-swizzle@0.2.2:
2394
2617
resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==}
2395
2618
···
2409
2632
2410
2633
stack-trace@0.0.10:
2411
2634
resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==}
2635
+
2636
+
stackback@0.0.2:
2637
+
resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==}
2638
+
2639
+
std-env@3.9.0:
2640
+
resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==}
2412
2641
2413
2642
stop-iteration-iterator@1.1.0:
2414
2643
resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==}
···
2444
2673
resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
2445
2674
engines: {node: '>=8'}
2446
2675
2676
+
strip-literal@3.0.0:
2677
+
resolution: {integrity: sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==}
2678
+
2447
2679
supports-color@7.2.0:
2448
2680
resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
2449
2681
engines: {node: '>=8'}
···
2470
2702
tiny-emitter@2.1.0:
2471
2703
resolution: {integrity: sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==}
2472
2704
2705
+
tinybench@2.9.0:
2706
+
resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==}
2707
+
2708
+
tinyexec@0.3.2:
2709
+
resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==}
2710
+
2711
+
tinyglobby@0.2.15:
2712
+
resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==}
2713
+
engines: {node: '>=12.0.0'}
2714
+
2715
+
tinypool@1.1.1:
2716
+
resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==}
2717
+
engines: {node: ^18.0.0 || >=20.0.0}
2718
+
2719
+
tinyrainbow@2.0.0:
2720
+
resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==}
2721
+
engines: {node: '>=14.0.0'}
2722
+
2723
+
tinyspy@4.0.3:
2724
+
resolution: {integrity: sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==}
2725
+
engines: {node: '>=14.0.0'}
2726
+
2473
2727
to-regex-range@5.0.1:
2474
2728
resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
2475
2729
engines: {node: '>=8.0'}
···
2597
2851
vfile@6.0.3:
2598
2852
resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==}
2599
2853
2600
-
vue-component-type-helpers@3.0.5:
2601
-
resolution: {integrity: sha512-uoNZaJ+a1/zppa/Vgmi8zIOP2PHXDN2rT8NyF+zQRK6ZG94lNB9prcV0GdLJbY9i9lrD47JOVIH92SaiA7oJ1A==}
2854
+
vite-node@3.2.4:
2855
+
resolution: {integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==}
2856
+
engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
2857
+
hasBin: true
2858
+
2859
+
vite@7.1.4:
2860
+
resolution: {integrity: sha512-X5QFK4SGynAeeIt+A7ZWnApdUyHYm+pzv/8/A57LqSGcI88U6R6ipOs3uCesdc6yl7nl+zNO0t8LmqAdXcQihw==}
2861
+
engines: {node: ^20.19.0 || >=22.12.0}
2862
+
hasBin: true
2863
+
peerDependencies:
2864
+
'@types/node': ^20.19.0 || >=22.12.0
2865
+
jiti: '>=1.21.0'
2866
+
less: ^4.0.0
2867
+
lightningcss: ^1.21.0
2868
+
sass: ^1.70.0
2869
+
sass-embedded: ^1.70.0
2870
+
stylus: '>=0.54.8'
2871
+
sugarss: ^5.0.0
2872
+
terser: ^5.16.0
2873
+
tsx: ^4.8.1
2874
+
yaml: ^2.4.2
2875
+
peerDependenciesMeta:
2876
+
'@types/node':
2877
+
optional: true
2878
+
jiti:
2879
+
optional: true
2880
+
less:
2881
+
optional: true
2882
+
lightningcss:
2883
+
optional: true
2884
+
sass:
2885
+
optional: true
2886
+
sass-embedded:
2887
+
optional: true
2888
+
stylus:
2889
+
optional: true
2890
+
sugarss:
2891
+
optional: true
2892
+
terser:
2893
+
optional: true
2894
+
tsx:
2895
+
optional: true
2896
+
yaml:
2897
+
optional: true
2898
+
2899
+
vitest@3.2.4:
2900
+
resolution: {integrity: sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==}
2901
+
engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
2902
+
hasBin: true
2903
+
peerDependencies:
2904
+
'@edge-runtime/vm': '*'
2905
+
'@types/debug': ^4.1.12
2906
+
'@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0
2907
+
'@vitest/browser': 3.2.4
2908
+
'@vitest/ui': 3.2.4
2909
+
happy-dom: '*'
2910
+
jsdom: '*'
2911
+
peerDependenciesMeta:
2912
+
'@edge-runtime/vm':
2913
+
optional: true
2914
+
'@types/debug':
2915
+
optional: true
2916
+
'@types/node':
2917
+
optional: true
2918
+
'@vitest/browser':
2919
+
optional: true
2920
+
'@vitest/ui':
2921
+
optional: true
2922
+
happy-dom:
2923
+
optional: true
2924
+
jsdom:
2925
+
optional: true
2926
+
2927
+
vue-component-type-helpers@3.0.6:
2928
+
resolution: {integrity: sha512-6CRM8X7EJqWCJOiKPvSLQG+hJPb/Oy2gyJx3pLjUEhY7PuaCthQu3e0zAGI1lqUBobrrk9IT0K8sG2GsCluxoQ==}
2602
2929
2603
2930
vue-demi@0.14.10:
2604
2931
resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==}
···
2614
2941
vue-sonner@1.3.2:
2615
2942
resolution: {integrity: sha512-UbZ48E9VIya3ToiRHAZUbodKute/z/M1iT8/3fU8zEbwBRE11AKuHikssv18LMk2gTTr6eMQT4qf6JoLHWuj/A==}
2616
2943
2617
-
vue@3.5.18:
2618
-
resolution: {integrity: sha512-7W4Y4ZbMiQ3SEo+m9lnoNpV9xG7QVMLa+/0RFwwiAVkeYoyGXqWE85jabU4pllJNUzqfLShJ5YLptewhCWUgNA==}
2944
+
vue@3.5.19:
2945
+
resolution: {integrity: sha512-ZRh0HTmw6KChRYWgN8Ox/wi7VhpuGlvMPrHjIsdRbzKNgECFLzy+dKL5z9yGaBSjCpmcfJCbh3I1tNSRmBz2tg==}
2619
2946
peerDependencies:
2620
2947
typescript: '*'
2621
2948
peerDependenciesMeta:
···
2650
2977
engines: {node: '>= 8'}
2651
2978
hasBin: true
2652
2979
2980
+
why-is-node-running@2.3.0:
2981
+
resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==}
2982
+
engines: {node: '>=8'}
2983
+
hasBin: true
2984
+
2653
2985
winston-transport@4.9.0:
2654
2986
resolution: {integrity: sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==}
2655
2987
engines: {node: '>= 12.0.0'}
···
2694
3026
2695
3027
snapshots:
2696
3028
2697
-
'@atcute/atproto@3.1.1':
3029
+
'@atcute/atproto@3.1.2':
2698
3030
dependencies:
2699
-
'@atcute/lexicons': 1.1.0
3031
+
'@atcute/lexicons': 1.1.1
2700
3032
2701
-
'@atcute/bluesky@3.2.0':
3033
+
'@atcute/bluesky@3.2.1':
2702
3034
dependencies:
2703
-
'@atcute/atproto': 3.1.1
2704
-
'@atcute/lexicons': 1.1.0
3035
+
'@atcute/atproto': 3.1.2
3036
+
'@atcute/lexicons': 1.1.1
2705
3037
2706
3038
'@atcute/client@4.0.3':
2707
3039
dependencies:
2708
3040
'@atcute/identity': 1.0.3
2709
-
'@atcute/lexicons': 1.1.0
3041
+
'@atcute/lexicons': 1.1.1
3042
+
3043
+
'@atcute/crypto@2.2.4':
3044
+
dependencies:
3045
+
'@atcute/multibase': 1.1.5
3046
+
'@atcute/uint8array': 1.0.4
3047
+
'@noble/secp256k1': 2.3.0
2710
3048
2711
3049
'@atcute/identity-resolver@1.1.3(@atcute/identity@1.0.3)':
2712
3050
dependencies:
2713
3051
'@atcute/identity': 1.0.3
2714
-
'@atcute/lexicons': 1.1.0
3052
+
'@atcute/lexicons': 1.1.1
2715
3053
'@atcute/util-fetch': 1.0.1
2716
3054
'@badrap/valita': 0.4.6
2717
3055
2718
3056
'@atcute/identity@1.0.3':
2719
3057
dependencies:
2720
-
'@atcute/lexicons': 1.1.0
3058
+
'@atcute/lexicons': 1.1.1
2721
3059
'@badrap/valita': 0.4.6
2722
3060
2723
3061
'@atcute/lex-cli@2.1.1':
···
2732
3070
dependencies:
2733
3071
'@badrap/valita': 0.4.6
2734
3072
2735
-
'@atcute/lexicons@1.1.0':
3073
+
'@atcute/lexicons@1.1.1':
2736
3074
dependencies:
2737
3075
esm-env: 1.2.2
2738
3076
3077
+
'@atcute/multibase@1.1.5':
3078
+
dependencies:
3079
+
'@atcute/uint8array': 1.0.4
3080
+
3081
+
'@atcute/uint8array@1.0.4': {}
3082
+
2739
3083
'@atcute/util-fetch@1.0.1':
2740
3084
dependencies:
2741
3085
'@badrap/valita': 0.4.6
···
2755
3099
2756
3100
'@badrap/valita@0.4.6': {}
2757
3101
2758
-
'@clipprjs/lexicons@1.0.2':
3102
+
'@clipprjs/lexicons@1.0.3':
2759
3103
dependencies:
2760
-
'@atcute/atproto': 3.1.1
2761
-
'@atcute/lexicons': 1.1.0
3104
+
'@atcute/atproto': 3.1.2
3105
+
'@atcute/lexicons': 1.1.1
2762
3106
2763
3107
'@colors/colors@1.6.0': {}
2764
3108
···
2976
3320
dependencies:
2977
3321
'@floating-ui/utils': 0.2.10
2978
3322
2979
-
'@floating-ui/dom@1.7.3':
3323
+
'@floating-ui/dom@1.7.4':
2980
3324
dependencies:
2981
3325
'@floating-ui/core': 1.7.3
2982
3326
'@floating-ui/utils': 0.2.10
2983
3327
2984
3328
'@floating-ui/utils@0.2.10': {}
2985
3329
2986
-
'@floating-ui/vue@1.1.8(vue@3.5.18(typescript@5.9.2))':
3330
+
'@floating-ui/vue@1.1.9(vue@3.5.19(typescript@5.9.2))':
2987
3331
dependencies:
2988
-
'@floating-ui/dom': 1.7.3
3332
+
'@floating-ui/dom': 1.7.4
2989
3333
'@floating-ui/utils': 0.2.10
2990
-
vue-demi: 0.14.10(vue@3.5.18(typescript@5.9.2))
3334
+
vue-demi: 0.14.10(vue@3.5.19(typescript@5.9.2))
2991
3335
transitivePeerDependencies:
2992
3336
- '@vue/composition-api'
2993
3337
- vue
2994
3338
2995
-
'@headlessui/vue@1.7.23(vue@3.5.18(typescript@5.9.2))':
3339
+
'@headlessui/vue@1.7.23(vue@3.5.19(typescript@5.9.2))':
2996
3340
dependencies:
2997
-
'@tanstack/vue-virtual': 3.13.12(vue@3.5.18(typescript@5.9.2))
2998
-
vue: 3.5.18(typescript@5.9.2)
3341
+
'@tanstack/vue-virtual': 3.13.12(vue@3.5.19(typescript@5.9.2))
3342
+
vue: 3.5.19(typescript@5.9.2)
2999
3343
3000
-
'@hono/node-server@1.19.0(hono@4.9.2)':
3344
+
'@hono/node-server@1.19.0(hono@4.9.4)':
3001
3345
dependencies:
3002
-
hono: 4.9.2
3346
+
hono: 4.9.4
3003
3347
3004
3348
'@humanfs/core@0.19.1': {}
3005
3349
···
3129
3473
3130
3474
'@neon-rs/load@0.0.4': {}
3131
3475
3476
+
'@noble/secp256k1@2.3.0': {}
3477
+
3132
3478
'@nodelib/fs.scandir@2.1.5':
3133
3479
dependencies:
3134
3480
'@nodelib/fs.stat': 2.0.5
···
3145
3491
3146
3492
'@pkgr/core@0.2.9': {}
3147
3493
3494
+
'@rollup/rollup-android-arm-eabi@4.50.0':
3495
+
optional: true
3496
+
3497
+
'@rollup/rollup-android-arm64@4.50.0':
3498
+
optional: true
3499
+
3500
+
'@rollup/rollup-darwin-arm64@4.50.0':
3501
+
optional: true
3502
+
3503
+
'@rollup/rollup-darwin-x64@4.50.0':
3504
+
optional: true
3505
+
3506
+
'@rollup/rollup-freebsd-arm64@4.50.0':
3507
+
optional: true
3508
+
3509
+
'@rollup/rollup-freebsd-x64@4.50.0':
3510
+
optional: true
3511
+
3512
+
'@rollup/rollup-linux-arm-gnueabihf@4.50.0':
3513
+
optional: true
3514
+
3515
+
'@rollup/rollup-linux-arm-musleabihf@4.50.0':
3516
+
optional: true
3517
+
3518
+
'@rollup/rollup-linux-arm64-gnu@4.50.0':
3519
+
optional: true
3520
+
3521
+
'@rollup/rollup-linux-arm64-musl@4.50.0':
3522
+
optional: true
3523
+
3524
+
'@rollup/rollup-linux-loongarch64-gnu@4.50.0':
3525
+
optional: true
3526
+
3527
+
'@rollup/rollup-linux-ppc64-gnu@4.50.0':
3528
+
optional: true
3529
+
3530
+
'@rollup/rollup-linux-riscv64-gnu@4.50.0':
3531
+
optional: true
3532
+
3533
+
'@rollup/rollup-linux-riscv64-musl@4.50.0':
3534
+
optional: true
3535
+
3536
+
'@rollup/rollup-linux-s390x-gnu@4.50.0':
3537
+
optional: true
3538
+
3539
+
'@rollup/rollup-linux-x64-gnu@4.50.0':
3540
+
optional: true
3541
+
3542
+
'@rollup/rollup-linux-x64-musl@4.50.0':
3543
+
optional: true
3544
+
3545
+
'@rollup/rollup-openharmony-arm64@4.50.0':
3546
+
optional: true
3547
+
3548
+
'@rollup/rollup-win32-arm64-msvc@4.50.0':
3549
+
optional: true
3550
+
3551
+
'@rollup/rollup-win32-ia32-msvc@4.50.0':
3552
+
optional: true
3553
+
3554
+
'@rollup/rollup-win32-x64-msvc@4.50.0':
3555
+
optional: true
3556
+
3148
3557
'@rtsao/scc@1.1.0': {}
3149
3558
3150
3559
'@scalar/code-highlight@0.1.9':
···
3169
3578
transitivePeerDependencies:
3170
3579
- supports-color
3171
3580
3172
-
'@scalar/components@0.14.23(typescript@5.9.2)':
3581
+
'@scalar/components@0.14.25(typescript@5.9.2)':
3173
3582
dependencies:
3174
3583
'@floating-ui/utils': 0.2.10
3175
-
'@floating-ui/vue': 1.1.8(vue@3.5.18(typescript@5.9.2))
3176
-
'@headlessui/vue': 1.7.23(vue@3.5.18(typescript@5.9.2))
3584
+
'@floating-ui/vue': 1.1.9(vue@3.5.19(typescript@5.9.2))
3585
+
'@headlessui/vue': 1.7.23(vue@3.5.19(typescript@5.9.2))
3177
3586
'@scalar/code-highlight': 0.1.9
3178
-
'@scalar/icons': 0.4.6(typescript@5.9.2)
3179
-
'@scalar/oas-utils': 0.4.18(typescript@5.9.2)
3180
-
'@scalar/themes': 0.13.12
3587
+
'@scalar/helpers': 0.0.8
3588
+
'@scalar/icons': 0.4.7(typescript@5.9.2)
3589
+
'@scalar/oas-utils': 0.4.20(typescript@5.9.2)
3590
+
'@scalar/themes': 0.13.13
3181
3591
'@scalar/use-hooks': 0.2.4(typescript@5.9.2)
3182
3592
'@scalar/use-toasts': 0.8.0(typescript@5.9.2)
3183
-
'@vueuse/core': 11.3.0(vue@3.5.18(typescript@5.9.2))
3593
+
'@vueuse/core': 11.3.0(vue@3.5.19(typescript@5.9.2))
3184
3594
cva: 1.0.0-beta.2(typescript@5.9.2)
3185
3595
nanoid: 5.1.5
3186
3596
pretty-bytes: 6.1.1
3187
-
radix-vue: 1.9.17(vue@3.5.18(typescript@5.9.2))
3188
-
vue: 3.5.18(typescript@5.9.2)
3189
-
vue-component-type-helpers: 3.0.5
3597
+
radix-vue: 1.9.17(vue@3.5.19(typescript@5.9.2))
3598
+
vue: 3.5.19(typescript@5.9.2)
3599
+
vue-component-type-helpers: 3.0.6
3190
3600
transitivePeerDependencies:
3191
3601
- '@vue/composition-api'
3192
3602
- supports-color
3193
3603
- typescript
3194
3604
3195
-
'@scalar/core@0.3.11':
3605
+
'@scalar/core@0.3.13':
3196
3606
dependencies:
3197
-
'@scalar/types': 0.2.11
3607
+
'@scalar/types': 0.2.12
3198
3608
3199
-
'@scalar/helpers@0.0.7': {}
3609
+
'@scalar/helpers@0.0.8': {}
3200
3610
3201
-
'@scalar/hono-api-reference@0.9.13(hono@4.9.2)':
3611
+
'@scalar/hono-api-reference@0.9.15(hono@4.9.4)':
3202
3612
dependencies:
3203
-
'@scalar/core': 0.3.11
3204
-
hono: 4.9.2
3613
+
'@scalar/core': 0.3.13
3614
+
hono: 4.9.4
3205
3615
3206
-
'@scalar/icons@0.4.6(typescript@5.9.2)':
3616
+
'@scalar/icons@0.4.7(typescript@5.9.2)':
3207
3617
dependencies:
3208
3618
'@phosphor-icons/core': 2.1.1
3209
3619
'@types/node': 22.17.2
3210
3620
chalk: 5.6.0
3211
-
vue: 3.5.18(typescript@5.9.2)
3621
+
vue: 3.5.19(typescript@5.9.2)
3212
3622
transitivePeerDependencies:
3213
3623
- typescript
3214
3624
3215
-
'@scalar/json-magic@0.1.0(typescript@5.9.2)':
3625
+
'@scalar/json-magic@0.3.0(typescript@5.9.2)':
3216
3626
dependencies:
3217
-
vue: 3.5.18(typescript@5.9.2)
3627
+
'@scalar/helpers': 0.0.8
3628
+
vue: 3.5.19(typescript@5.9.2)
3218
3629
yaml: 2.8.0
3219
3630
transitivePeerDependencies:
3220
3631
- typescript
3221
3632
3222
-
'@scalar/oas-utils@0.4.18(typescript@5.9.2)':
3633
+
'@scalar/oas-utils@0.4.20(typescript@5.9.2)':
3223
3634
dependencies:
3224
3635
'@hyperjump/browser': 1.3.1
3225
3636
'@hyperjump/json-schema': 1.16.2(@hyperjump/browser@1.3.1)
3226
-
'@scalar/helpers': 0.0.7
3227
-
'@scalar/object-utils': 1.2.3
3637
+
'@scalar/helpers': 0.0.8
3638
+
'@scalar/json-magic': 0.3.0(typescript@5.9.2)
3639
+
'@scalar/object-utils': 1.2.4
3228
3640
'@scalar/openapi-types': 0.3.7
3229
-
'@scalar/themes': 0.13.12
3230
-
'@scalar/types': 0.2.11
3231
-
'@scalar/workspace-store': 0.12.0(typescript@5.9.2)
3641
+
'@scalar/themes': 0.13.13
3642
+
'@scalar/types': 0.2.12
3643
+
'@scalar/workspace-store': 0.14.0(typescript@5.9.2)
3232
3644
'@types/har-format': 1.2.16
3233
3645
flatted: 3.3.3
3234
3646
microdiff: 1.5.0
···
3240
3652
- supports-color
3241
3653
- typescript
3242
3654
3243
-
'@scalar/object-utils@1.2.3':
3655
+
'@scalar/object-utils@1.2.4':
3244
3656
dependencies:
3245
-
'@scalar/helpers': 0.0.7
3657
+
'@scalar/helpers': 0.0.8
3246
3658
flatted: 3.3.3
3247
3659
just-clone: 6.2.0
3248
3660
ts-deepmerge: 7.0.3
3249
3661
type-fest: 4.41.0
3250
3662
3251
-
'@scalar/openapi-parser@0.19.0':
3663
+
'@scalar/openapi-parser@0.20.0(typescript@5.9.2)':
3252
3664
dependencies:
3665
+
'@scalar/json-magic': 0.3.0(typescript@5.9.2)
3253
3666
'@scalar/openapi-types': 0.3.7
3254
3667
ajv: 8.17.1
3255
3668
ajv-draft-04: 1.0.0(ajv@8.17.1)
···
3257
3670
jsonpointer: 5.0.1
3258
3671
leven: 4.0.0
3259
3672
yaml: 2.8.0
3673
+
transitivePeerDependencies:
3674
+
- typescript
3260
3675
3261
-
'@scalar/openapi-to-markdown@0.2.26(typescript@5.9.2)':
3676
+
'@scalar/openapi-to-markdown@0.2.28(typescript@5.9.2)':
3262
3677
dependencies:
3263
-
'@scalar/components': 0.14.23(typescript@5.9.2)
3264
-
'@scalar/oas-utils': 0.4.18(typescript@5.9.2)
3265
-
'@scalar/openapi-parser': 0.19.0
3678
+
'@scalar/components': 0.14.25(typescript@5.9.2)
3679
+
'@scalar/oas-utils': 0.4.20(typescript@5.9.2)
3680
+
'@scalar/openapi-parser': 0.20.0(typescript@5.9.2)
3266
3681
'@scalar/openapi-types': 0.3.7
3267
-
'@scalar/snippetz': 0.4.4
3268
-
'@scalar/types': 0.2.11
3682
+
'@scalar/snippetz': 0.4.5
3683
+
'@scalar/types': 0.2.12
3269
3684
html-minifier-terser: 7.2.0
3270
3685
object-to-xml: 2.0.0
3271
3686
rehype-parse: 9.0.1
···
3275
3690
remark-gfm: 4.0.1
3276
3691
remark-stringify: 11.0.0
3277
3692
unified: 11.0.5
3278
-
vue: 3.5.18(typescript@5.9.2)
3693
+
vue: 3.5.19(typescript@5.9.2)
3279
3694
transitivePeerDependencies:
3280
3695
- '@vue/composition-api'
3281
3696
- supports-color
···
3285
3700
dependencies:
3286
3701
zod: 3.24.1
3287
3702
3288
-
'@scalar/snippetz@0.4.4':
3703
+
'@scalar/snippetz@0.4.5':
3289
3704
dependencies:
3290
-
'@scalar/types': 0.2.11
3705
+
'@scalar/types': 0.2.12
3291
3706
stringify-object: 5.0.0
3292
3707
3293
-
'@scalar/themes@0.13.12':
3708
+
'@scalar/themes@0.13.13':
3294
3709
dependencies:
3295
-
'@scalar/types': 0.2.11
3710
+
'@scalar/types': 0.2.12
3296
3711
nanoid: 5.1.5
3297
3712
3298
-
'@scalar/types@0.2.11':
3713
+
'@scalar/types@0.2.12':
3299
3714
dependencies:
3300
3715
'@scalar/openapi-types': 0.3.7
3301
3716
nanoid: 5.1.5
···
3304
3719
'@scalar/use-hooks@0.2.4(typescript@5.9.2)':
3305
3720
dependencies:
3306
3721
'@scalar/use-toasts': 0.8.0(typescript@5.9.2)
3307
-
'@vueuse/core': 10.11.1(vue@3.5.18(typescript@5.9.2))
3722
+
'@vueuse/core': 10.11.1(vue@3.5.19(typescript@5.9.2))
3308
3723
cva: 1.0.0-beta.2(typescript@5.9.2)
3309
3724
tailwind-merge: 2.6.0
3310
-
vue: 3.5.18(typescript@5.9.2)
3725
+
vue: 3.5.19(typescript@5.9.2)
3311
3726
zod: 3.24.1
3312
3727
transitivePeerDependencies:
3313
3728
- '@vue/composition-api'
···
3316
3731
'@scalar/use-toasts@0.8.0(typescript@5.9.2)':
3317
3732
dependencies:
3318
3733
nanoid: 5.1.5
3319
-
vue: 3.5.18(typescript@5.9.2)
3734
+
vue: 3.5.19(typescript@5.9.2)
3320
3735
vue-sonner: 1.3.2
3321
3736
transitivePeerDependencies:
3322
3737
- typescript
3323
3738
3324
-
'@scalar/workspace-store@0.12.0(typescript@5.9.2)':
3739
+
'@scalar/workspace-store@0.14.0(typescript@5.9.2)':
3325
3740
dependencies:
3326
3741
'@scalar/code-highlight': 0.1.9
3327
-
'@scalar/helpers': 0.0.7
3328
-
'@scalar/json-magic': 0.1.0(typescript@5.9.2)
3329
-
'@scalar/openapi-parser': 0.19.0
3330
-
'@scalar/types': 0.2.11
3331
-
'@sinclair/typebox': 0.34.37
3742
+
'@scalar/helpers': 0.0.8
3743
+
'@scalar/json-magic': 0.3.0(typescript@5.9.2)
3744
+
'@scalar/openapi-parser': 0.20.0(typescript@5.9.2)
3745
+
'@scalar/types': 0.2.12
3746
+
'@sinclair/typebox': https://raw.githubusercontent.com/DemonHa/typebox/refs/heads/amrit/build/target/remote/sinclair-typebox-0.34.38.tgz
3332
3747
github-slugger: 2.0.0
3333
-
vue: 3.5.18(typescript@5.9.2)
3748
+
type-fest: 4.41.0
3749
+
vue: 3.5.19(typescript@5.9.2)
3334
3750
yaml: 2.8.0
3335
3751
transitivePeerDependencies:
3336
3752
- supports-color
3337
3753
- typescript
3338
3754
3339
-
'@sinclair/typebox@0.34.37': {}
3755
+
'@sinclair/typebox@https://raw.githubusercontent.com/DemonHa/typebox/refs/heads/amrit/build/target/remote/sinclair-typebox-0.34.38.tgz': {}
3340
3756
3341
3757
'@skyware/jetstream@0.2.5':
3342
3758
dependencies:
3343
-
'@atcute/atproto': 3.1.1
3344
-
'@atcute/bluesky': 3.2.0
3345
-
'@atcute/lexicons': 1.1.0
3759
+
'@atcute/atproto': 3.1.2
3760
+
'@atcute/bluesky': 3.2.1
3761
+
'@atcute/lexicons': 1.1.1
3346
3762
partysocket: 1.1.5
3347
3763
tiny-emitter: 2.1.0
3348
3764
···
3352
3768
3353
3769
'@tanstack/virtual-core@3.13.12': {}
3354
3770
3355
-
'@tanstack/vue-virtual@3.13.12(vue@3.5.18(typescript@5.9.2))':
3771
+
'@tanstack/vue-virtual@3.13.12(vue@3.5.19(typescript@5.9.2))':
3356
3772
dependencies:
3357
3773
'@tanstack/virtual-core': 3.13.12
3358
-
vue: 3.5.18(typescript@5.9.2)
3774
+
vue: 3.5.19(typescript@5.9.2)
3775
+
3776
+
'@types/chai@5.2.2':
3777
+
dependencies:
3778
+
'@types/deep-eql': 4.0.2
3359
3779
3360
3780
'@types/debug@4.1.12':
3361
3781
dependencies:
3362
3782
'@types/ms': 2.1.0
3783
+
3784
+
'@types/deep-eql@4.0.2': {}
3363
3785
3364
3786
'@types/estree@1.0.8': {}
3365
3787
···
3492
3914
3493
3915
'@ungap/structured-clone@1.3.0': {}
3494
3916
3495
-
'@vue/compiler-core@3.5.18':
3917
+
'@vitest/expect@3.2.4':
3918
+
dependencies:
3919
+
'@types/chai': 5.2.2
3920
+
'@vitest/spy': 3.2.4
3921
+
'@vitest/utils': 3.2.4
3922
+
chai: 5.3.3
3923
+
tinyrainbow: 2.0.0
3924
+
3925
+
'@vitest/mocker@3.2.4(vite@7.1.4(@types/node@24.3.0)(jiti@2.5.1)(terser@5.43.1)(tsx@4.20.4)(yaml@2.8.0))':
3926
+
dependencies:
3927
+
'@vitest/spy': 3.2.4
3928
+
estree-walker: 3.0.3
3929
+
magic-string: 0.30.18
3930
+
optionalDependencies:
3931
+
vite: 7.1.4(@types/node@24.3.0)(jiti@2.5.1)(terser@5.43.1)(tsx@4.20.4)(yaml@2.8.0)
3932
+
3933
+
'@vitest/pretty-format@3.2.4':
3934
+
dependencies:
3935
+
tinyrainbow: 2.0.0
3936
+
3937
+
'@vitest/runner@3.2.4':
3938
+
dependencies:
3939
+
'@vitest/utils': 3.2.4
3940
+
pathe: 2.0.3
3941
+
strip-literal: 3.0.0
3942
+
3943
+
'@vitest/snapshot@3.2.4':
3944
+
dependencies:
3945
+
'@vitest/pretty-format': 3.2.4
3946
+
magic-string: 0.30.18
3947
+
pathe: 2.0.3
3948
+
3949
+
'@vitest/spy@3.2.4':
3950
+
dependencies:
3951
+
tinyspy: 4.0.3
3952
+
3953
+
'@vitest/utils@3.2.4':
3954
+
dependencies:
3955
+
'@vitest/pretty-format': 3.2.4
3956
+
loupe: 3.2.1
3957
+
tinyrainbow: 2.0.0
3958
+
3959
+
'@vue/compiler-core@3.5.19':
3496
3960
dependencies:
3497
3961
'@babel/parser': 7.28.3
3498
-
'@vue/shared': 3.5.18
3962
+
'@vue/shared': 3.5.19
3499
3963
entities: 4.5.0
3500
3964
estree-walker: 2.0.2
3501
3965
source-map-js: 1.2.1
3502
3966
3503
-
'@vue/compiler-dom@3.5.18':
3967
+
'@vue/compiler-dom@3.5.19':
3504
3968
dependencies:
3505
-
'@vue/compiler-core': 3.5.18
3506
-
'@vue/shared': 3.5.18
3969
+
'@vue/compiler-core': 3.5.19
3970
+
'@vue/shared': 3.5.19
3507
3971
3508
-
'@vue/compiler-sfc@3.5.18':
3972
+
'@vue/compiler-sfc@3.5.19':
3509
3973
dependencies:
3510
3974
'@babel/parser': 7.28.3
3511
-
'@vue/compiler-core': 3.5.18
3512
-
'@vue/compiler-dom': 3.5.18
3513
-
'@vue/compiler-ssr': 3.5.18
3514
-
'@vue/shared': 3.5.18
3975
+
'@vue/compiler-core': 3.5.19
3976
+
'@vue/compiler-dom': 3.5.19
3977
+
'@vue/compiler-ssr': 3.5.19
3978
+
'@vue/shared': 3.5.19
3515
3979
estree-walker: 2.0.2
3516
-
magic-string: 0.30.17
3980
+
magic-string: 0.30.18
3517
3981
postcss: 8.5.6
3518
3982
source-map-js: 1.2.1
3519
3983
3520
-
'@vue/compiler-ssr@3.5.18':
3984
+
'@vue/compiler-ssr@3.5.19':
3521
3985
dependencies:
3522
-
'@vue/compiler-dom': 3.5.18
3523
-
'@vue/shared': 3.5.18
3986
+
'@vue/compiler-dom': 3.5.19
3987
+
'@vue/shared': 3.5.19
3524
3988
3525
-
'@vue/reactivity@3.5.18':
3989
+
'@vue/reactivity@3.5.19':
3526
3990
dependencies:
3527
-
'@vue/shared': 3.5.18
3991
+
'@vue/shared': 3.5.19
3528
3992
3529
-
'@vue/runtime-core@3.5.18':
3993
+
'@vue/runtime-core@3.5.19':
3530
3994
dependencies:
3531
-
'@vue/reactivity': 3.5.18
3532
-
'@vue/shared': 3.5.18
3995
+
'@vue/reactivity': 3.5.19
3996
+
'@vue/shared': 3.5.19
3533
3997
3534
-
'@vue/runtime-dom@3.5.18':
3998
+
'@vue/runtime-dom@3.5.19':
3535
3999
dependencies:
3536
-
'@vue/reactivity': 3.5.18
3537
-
'@vue/runtime-core': 3.5.18
3538
-
'@vue/shared': 3.5.18
4000
+
'@vue/reactivity': 3.5.19
4001
+
'@vue/runtime-core': 3.5.19
4002
+
'@vue/shared': 3.5.19
3539
4003
csstype: 3.1.3
3540
4004
3541
-
'@vue/server-renderer@3.5.18(vue@3.5.18(typescript@5.9.2))':
4005
+
'@vue/server-renderer@3.5.19(vue@3.5.19(typescript@5.9.2))':
3542
4006
dependencies:
3543
-
'@vue/compiler-ssr': 3.5.18
3544
-
'@vue/shared': 3.5.18
3545
-
vue: 3.5.18(typescript@5.9.2)
4007
+
'@vue/compiler-ssr': 3.5.19
4008
+
'@vue/shared': 3.5.19
4009
+
vue: 3.5.19(typescript@5.9.2)
3546
4010
3547
-
'@vue/shared@3.5.18': {}
4011
+
'@vue/shared@3.5.19': {}
3548
4012
3549
-
'@vueuse/core@10.11.1(vue@3.5.18(typescript@5.9.2))':
4013
+
'@vueuse/core@10.11.1(vue@3.5.19(typescript@5.9.2))':
3550
4014
dependencies:
3551
4015
'@types/web-bluetooth': 0.0.20
3552
4016
'@vueuse/metadata': 10.11.1
3553
-
'@vueuse/shared': 10.11.1(vue@3.5.18(typescript@5.9.2))
3554
-
vue-demi: 0.14.10(vue@3.5.18(typescript@5.9.2))
4017
+
'@vueuse/shared': 10.11.1(vue@3.5.19(typescript@5.9.2))
4018
+
vue-demi: 0.14.10(vue@3.5.19(typescript@5.9.2))
3555
4019
transitivePeerDependencies:
3556
4020
- '@vue/composition-api'
3557
4021
- vue
3558
4022
3559
-
'@vueuse/core@11.3.0(vue@3.5.18(typescript@5.9.2))':
4023
+
'@vueuse/core@11.3.0(vue@3.5.19(typescript@5.9.2))':
3560
4024
dependencies:
3561
4025
'@types/web-bluetooth': 0.0.20
3562
4026
'@vueuse/metadata': 11.3.0
3563
-
'@vueuse/shared': 11.3.0(vue@3.5.18(typescript@5.9.2))
3564
-
vue-demi: 0.14.10(vue@3.5.18(typescript@5.9.2))
4027
+
'@vueuse/shared': 11.3.0(vue@3.5.19(typescript@5.9.2))
4028
+
vue-demi: 0.14.10(vue@3.5.19(typescript@5.9.2))
3565
4029
transitivePeerDependencies:
3566
4030
- '@vue/composition-api'
3567
4031
- vue
···
3570
4034
3571
4035
'@vueuse/metadata@11.3.0': {}
3572
4036
3573
-
'@vueuse/shared@10.11.1(vue@3.5.18(typescript@5.9.2))':
4037
+
'@vueuse/shared@10.11.1(vue@3.5.19(typescript@5.9.2))':
3574
4038
dependencies:
3575
-
vue-demi: 0.14.10(vue@3.5.18(typescript@5.9.2))
4039
+
vue-demi: 0.14.10(vue@3.5.19(typescript@5.9.2))
3576
4040
transitivePeerDependencies:
3577
4041
- '@vue/composition-api'
3578
4042
- vue
3579
4043
3580
-
'@vueuse/shared@11.3.0(vue@3.5.18(typescript@5.9.2))':
4044
+
'@vueuse/shared@11.3.0(vue@3.5.19(typescript@5.9.2))':
3581
4045
dependencies:
3582
-
vue-demi: 0.14.10(vue@3.5.18(typescript@5.9.2))
4046
+
vue-demi: 0.14.10(vue@3.5.19(typescript@5.9.2))
3583
4047
transitivePeerDependencies:
3584
4048
- '@vue/composition-api'
3585
4049
- vue
···
3672
4136
get-intrinsic: 1.3.0
3673
4137
is-array-buffer: 3.0.5
3674
4138
4139
+
assertion-error@2.0.1: {}
4140
+
3675
4141
async-function@1.0.0: {}
3676
4142
3677
4143
async@3.2.6: {}
···
3704
4170
'@types/node': 24.3.0
3705
4171
optional: true
3706
4172
4173
+
cac@6.7.14: {}
4174
+
3707
4175
call-bind-apply-helpers@1.0.2:
3708
4176
dependencies:
3709
4177
es-errors: 1.3.0
···
3730
4198
3731
4199
ccount@2.0.1: {}
3732
4200
4201
+
chai@5.3.3:
4202
+
dependencies:
4203
+
assertion-error: 2.0.1
4204
+
check-error: 2.1.1
4205
+
deep-eql: 5.0.2
4206
+
loupe: 3.2.1
4207
+
pathval: 2.0.1
4208
+
3733
4209
chalk@4.1.2:
3734
4210
dependencies:
3735
4211
ansi-styles: 4.3.0
···
3742
4218
character-entities-legacy@3.0.0: {}
3743
4219
3744
4220
character-entities@2.0.2: {}
4221
+
4222
+
check-error@2.1.1: {}
3745
4223
3746
4224
clean-css@5.3.3:
3747
4225
dependencies:
···
3836
4314
dependencies:
3837
4315
character-entities: 2.0.2
3838
4316
4317
+
deep-eql@5.0.2: {}
4318
+
3839
4319
deep-is@0.1.4: {}
3840
4320
3841
4321
define-data-property@1.1.4:
···
3955
4435
es-define-property@1.0.1: {}
3956
4436
3957
4437
es-errors@1.3.0: {}
4438
+
4439
+
es-module-lexer@1.7.0: {}
3958
4440
3959
4441
es-object-atoms@1.1.1:
3960
4442
dependencies:
···
4177
4659
4178
4660
estree-walker@2.0.2: {}
4179
4661
4662
+
estree-walker@3.0.3:
4663
+
dependencies:
4664
+
'@types/estree': 1.0.8
4665
+
4180
4666
esutils@2.0.3: {}
4181
4667
4182
4668
event-target-polyfill@0.0.4: {}
4669
+
4670
+
expect-type@1.2.2: {}
4183
4671
4184
4672
extend@3.0.2: {}
4185
4673
···
4205
4693
dependencies:
4206
4694
reusify: 1.1.0
4207
4695
4696
+
fdir@6.5.0(picomatch@4.0.3):
4697
+
optionalDependencies:
4698
+
picomatch: 4.0.3
4699
+
4208
4700
fecha@4.2.3: {}
4209
4701
4210
4702
fetch-blob@3.2.0:
···
4488
4980
4489
4981
highlightjs-vue@1.0.0: {}
4490
4982
4491
-
hono@4.9.2: {}
4983
+
hono@4.9.4: {}
4492
4984
4493
4985
html-minifier-terser@7.2.0:
4494
4986
dependencies:
···
4650
5142
4651
5143
js-base64@3.7.8: {}
4652
5144
5145
+
js-tokens@9.0.1: {}
5146
+
4653
5147
js-yaml@4.1.0:
4654
5148
dependencies:
4655
5149
argparse: 2.0.1
···
4719
5213
4720
5214
longest-streak@3.1.0: {}
4721
5215
5216
+
loupe@3.2.1: {}
5217
+
4722
5218
lower-case@2.0.2:
4723
5219
dependencies:
4724
5220
tslib: 2.8.1
···
4729
5225
devlop: 1.1.0
4730
5226
highlight.js: 11.11.1
4731
5227
4732
-
magic-string@0.30.17:
5228
+
magic-string@0.30.18:
4733
5229
dependencies:
4734
5230
'@jridgewell/sourcemap-codec': 1.5.5
4735
5231
···
5176
5672
5177
5673
path-parse@1.0.7: {}
5178
5674
5675
+
pathe@2.0.3: {}
5676
+
5677
+
pathval@2.0.1: {}
5678
+
5179
5679
picocolors@1.1.1: {}
5180
5680
5181
5681
picomatch@2.3.1: {}
5682
+
5683
+
picomatch@4.0.3: {}
5182
5684
5183
5685
possible-typed-array-names@1.1.0: {}
5184
5686
···
5208
5710
5209
5711
queue-microtask@1.2.3: {}
5210
5712
5211
-
radix-vue@1.9.17(vue@3.5.18(typescript@5.9.2)):
5713
+
radix-vue@1.9.17(vue@3.5.19(typescript@5.9.2)):
5212
5714
dependencies:
5213
-
'@floating-ui/dom': 1.7.3
5214
-
'@floating-ui/vue': 1.1.8(vue@3.5.18(typescript@5.9.2))
5715
+
'@floating-ui/dom': 1.7.4
5716
+
'@floating-ui/vue': 1.1.9(vue@3.5.19(typescript@5.9.2))
5215
5717
'@internationalized/date': 3.8.2
5216
5718
'@internationalized/number': 3.6.4
5217
-
'@tanstack/vue-virtual': 3.13.12(vue@3.5.18(typescript@5.9.2))
5218
-
'@vueuse/core': 10.11.1(vue@3.5.18(typescript@5.9.2))
5219
-
'@vueuse/shared': 10.11.1(vue@3.5.18(typescript@5.9.2))
5719
+
'@tanstack/vue-virtual': 3.13.12(vue@3.5.19(typescript@5.9.2))
5720
+
'@vueuse/core': 10.11.1(vue@3.5.19(typescript@5.9.2))
5721
+
'@vueuse/shared': 10.11.1(vue@3.5.19(typescript@5.9.2))
5220
5722
aria-hidden: 1.2.6
5221
5723
defu: 6.1.4
5222
5724
fast-deep-equal: 3.1.3
5223
5725
nanoid: 5.1.5
5224
-
vue: 3.5.18(typescript@5.9.2)
5726
+
vue: 3.5.19(typescript@5.9.2)
5225
5727
transitivePeerDependencies:
5226
5728
- '@vue/composition-api'
5227
5729
···
5351
5853
5352
5854
reusify@1.1.0: {}
5353
5855
5856
+
rollup@4.50.0:
5857
+
dependencies:
5858
+
'@types/estree': 1.0.8
5859
+
optionalDependencies:
5860
+
'@rollup/rollup-android-arm-eabi': 4.50.0
5861
+
'@rollup/rollup-android-arm64': 4.50.0
5862
+
'@rollup/rollup-darwin-arm64': 4.50.0
5863
+
'@rollup/rollup-darwin-x64': 4.50.0
5864
+
'@rollup/rollup-freebsd-arm64': 4.50.0
5865
+
'@rollup/rollup-freebsd-x64': 4.50.0
5866
+
'@rollup/rollup-linux-arm-gnueabihf': 4.50.0
5867
+
'@rollup/rollup-linux-arm-musleabihf': 4.50.0
5868
+
'@rollup/rollup-linux-arm64-gnu': 4.50.0
5869
+
'@rollup/rollup-linux-arm64-musl': 4.50.0
5870
+
'@rollup/rollup-linux-loongarch64-gnu': 4.50.0
5871
+
'@rollup/rollup-linux-ppc64-gnu': 4.50.0
5872
+
'@rollup/rollup-linux-riscv64-gnu': 4.50.0
5873
+
'@rollup/rollup-linux-riscv64-musl': 4.50.0
5874
+
'@rollup/rollup-linux-s390x-gnu': 4.50.0
5875
+
'@rollup/rollup-linux-x64-gnu': 4.50.0
5876
+
'@rollup/rollup-linux-x64-musl': 4.50.0
5877
+
'@rollup/rollup-openharmony-arm64': 4.50.0
5878
+
'@rollup/rollup-win32-arm64-msvc': 4.50.0
5879
+
'@rollup/rollup-win32-ia32-msvc': 4.50.0
5880
+
'@rollup/rollup-win32-x64-msvc': 4.50.0
5881
+
fsevents: 2.3.3
5882
+
5354
5883
run-parallel@1.2.0:
5355
5884
dependencies:
5356
5885
queue-microtask: 1.2.3
···
5440
5969
side-channel-map: 1.0.1
5441
5970
side-channel-weakmap: 1.0.2
5442
5971
5972
+
siginfo@2.0.0: {}
5973
+
5443
5974
simple-swizzle@0.2.2:
5444
5975
dependencies:
5445
5976
is-arrayish: 0.3.2
···
5457
5988
5458
5989
stack-trace@0.0.10: {}
5459
5990
5991
+
stackback@0.0.2: {}
5992
+
5993
+
std-env@3.9.0: {}
5994
+
5460
5995
stop-iteration-iterator@1.1.0:
5461
5996
dependencies:
5462
5997
es-errors: 1.3.0
···
5504
6039
5505
6040
strip-json-comments@3.1.1: {}
5506
6041
6042
+
strip-literal@3.0.0:
6043
+
dependencies:
6044
+
js-tokens: 9.0.1
6045
+
5507
6046
supports-color@7.2.0:
5508
6047
dependencies:
5509
6048
has-flag: 4.0.0
···
5527
6066
5528
6067
tiny-emitter@2.1.0: {}
5529
6068
6069
+
tinybench@2.9.0: {}
6070
+
6071
+
tinyexec@0.3.2: {}
6072
+
6073
+
tinyglobby@0.2.15:
6074
+
dependencies:
6075
+
fdir: 6.5.0(picomatch@4.0.3)
6076
+
picomatch: 4.0.3
6077
+
6078
+
tinypool@1.1.1: {}
6079
+
6080
+
tinyrainbow@2.0.0: {}
6081
+
6082
+
tinyspy@4.0.3: {}
6083
+
5530
6084
to-regex-range@5.0.1:
5531
6085
dependencies:
5532
6086
is-number: 7.0.0
···
5687
6241
'@types/unist': 3.0.3
5688
6242
vfile-message: 4.0.3
5689
6243
5690
-
vue-component-type-helpers@3.0.5: {}
6244
+
vite-node@3.2.4(@types/node@24.3.0)(jiti@2.5.1)(terser@5.43.1)(tsx@4.20.4)(yaml@2.8.0):
6245
+
dependencies:
6246
+
cac: 6.7.14
6247
+
debug: 4.4.1
6248
+
es-module-lexer: 1.7.0
6249
+
pathe: 2.0.3
6250
+
vite: 7.1.4(@types/node@24.3.0)(jiti@2.5.1)(terser@5.43.1)(tsx@4.20.4)(yaml@2.8.0)
6251
+
transitivePeerDependencies:
6252
+
- '@types/node'
6253
+
- jiti
6254
+
- less
6255
+
- lightningcss
6256
+
- sass
6257
+
- sass-embedded
6258
+
- stylus
6259
+
- sugarss
6260
+
- supports-color
6261
+
- terser
6262
+
- tsx
6263
+
- yaml
6264
+
6265
+
vite@7.1.4(@types/node@24.3.0)(jiti@2.5.1)(terser@5.43.1)(tsx@4.20.4)(yaml@2.8.0):
6266
+
dependencies:
6267
+
esbuild: 0.25.9
6268
+
fdir: 6.5.0(picomatch@4.0.3)
6269
+
picomatch: 4.0.3
6270
+
postcss: 8.5.6
6271
+
rollup: 4.50.0
6272
+
tinyglobby: 0.2.15
6273
+
optionalDependencies:
6274
+
'@types/node': 24.3.0
6275
+
fsevents: 2.3.3
6276
+
jiti: 2.5.1
6277
+
terser: 5.43.1
6278
+
tsx: 4.20.4
6279
+
yaml: 2.8.0
5691
6280
5692
-
vue-demi@0.14.10(vue@3.5.18(typescript@5.9.2)):
6281
+
vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.3.0)(jiti@2.5.1)(terser@5.43.1)(tsx@4.20.4)(yaml@2.8.0):
5693
6282
dependencies:
5694
-
vue: 3.5.18(typescript@5.9.2)
6283
+
'@types/chai': 5.2.2
6284
+
'@vitest/expect': 3.2.4
6285
+
'@vitest/mocker': 3.2.4(vite@7.1.4(@types/node@24.3.0)(jiti@2.5.1)(terser@5.43.1)(tsx@4.20.4)(yaml@2.8.0))
6286
+
'@vitest/pretty-format': 3.2.4
6287
+
'@vitest/runner': 3.2.4
6288
+
'@vitest/snapshot': 3.2.4
6289
+
'@vitest/spy': 3.2.4
6290
+
'@vitest/utils': 3.2.4
6291
+
chai: 5.3.3
6292
+
debug: 4.4.1
6293
+
expect-type: 1.2.2
6294
+
magic-string: 0.30.18
6295
+
pathe: 2.0.3
6296
+
picomatch: 4.0.3
6297
+
std-env: 3.9.0
6298
+
tinybench: 2.9.0
6299
+
tinyexec: 0.3.2
6300
+
tinyglobby: 0.2.15
6301
+
tinypool: 1.1.1
6302
+
tinyrainbow: 2.0.0
6303
+
vite: 7.1.4(@types/node@24.3.0)(jiti@2.5.1)(terser@5.43.1)(tsx@4.20.4)(yaml@2.8.0)
6304
+
vite-node: 3.2.4(@types/node@24.3.0)(jiti@2.5.1)(terser@5.43.1)(tsx@4.20.4)(yaml@2.8.0)
6305
+
why-is-node-running: 2.3.0
6306
+
optionalDependencies:
6307
+
'@types/debug': 4.1.12
6308
+
'@types/node': 24.3.0
6309
+
transitivePeerDependencies:
6310
+
- jiti
6311
+
- less
6312
+
- lightningcss
6313
+
- msw
6314
+
- sass
6315
+
- sass-embedded
6316
+
- stylus
6317
+
- sugarss
6318
+
- supports-color
6319
+
- terser
6320
+
- tsx
6321
+
- yaml
6322
+
6323
+
vue-component-type-helpers@3.0.6: {}
6324
+
6325
+
vue-demi@0.14.10(vue@3.5.19(typescript@5.9.2)):
6326
+
dependencies:
6327
+
vue: 3.5.19(typescript@5.9.2)
5695
6328
5696
6329
vue-sonner@1.3.2: {}
5697
6330
5698
-
vue@3.5.18(typescript@5.9.2):
6331
+
vue@3.5.19(typescript@5.9.2):
5699
6332
dependencies:
5700
-
'@vue/compiler-dom': 3.5.18
5701
-
'@vue/compiler-sfc': 3.5.18
5702
-
'@vue/runtime-dom': 3.5.18
5703
-
'@vue/server-renderer': 3.5.18(vue@3.5.18(typescript@5.9.2))
5704
-
'@vue/shared': 3.5.18
6333
+
'@vue/compiler-dom': 3.5.19
6334
+
'@vue/compiler-sfc': 3.5.19
6335
+
'@vue/runtime-dom': 3.5.19
6336
+
'@vue/server-renderer': 3.5.19(vue@3.5.19(typescript@5.9.2))
6337
+
'@vue/shared': 3.5.19
5705
6338
optionalDependencies:
5706
6339
typescript: 5.9.2
5707
6340
···
5753
6386
which@2.0.2:
5754
6387
dependencies:
5755
6388
isexe: 2.0.0
6389
+
6390
+
why-is-node-running@2.3.0:
6391
+
dependencies:
6392
+
siginfo: 2.0.0
6393
+
stackback: 0.0.2
5756
6394
5757
6395
winston-transport@4.9.0:
5758
6396
dependencies:
+51
backend/src/api/did.ts
+51
backend/src/api/did.ts
···
1
+
/*
2
+
* clippr: a social bookmarking service for the AT Protocol
3
+
* Copyright (c) 2025 clippr contributors.
4
+
* SPDX-License-Identifier: AGPL-3.0-only
5
+
*/
6
+
7
+
import {
8
+
CompositeDidDocumentResolver,
9
+
DocumentNotFoundError,
10
+
FailedDocumentResolutionError,
11
+
HandleResolutionError,
12
+
ImproperDidError,
13
+
PlcDidDocumentResolver,
14
+
UnsupportedDidMethodError,
15
+
WebDidDocumentResolver,
16
+
} from "@atcute/identity-resolver";
17
+
18
+
// Gets a DID document from a given DID. DID method agnostic.
19
+
export async function getDidDocument(
20
+
did: `did:plc:${string}` | `did:web:${string}`,
21
+
) {
22
+
const docResolver = new CompositeDidDocumentResolver({
23
+
methods: {
24
+
plc: new PlcDidDocumentResolver(),
25
+
web: new WebDidDocumentResolver(),
26
+
},
27
+
});
28
+
29
+
let doc;
30
+
try {
31
+
doc = await docResolver.resolve(did);
32
+
} catch (err) {
33
+
if (err instanceof DocumentNotFoundError) {
34
+
throw new Error("Document not found");
35
+
}
36
+
if (err instanceof UnsupportedDidMethodError) {
37
+
throw new Error("Unsupported DID method");
38
+
}
39
+
if (err instanceof ImproperDidError) {
40
+
throw new Error("Invalid DID");
41
+
}
42
+
if (err instanceof FailedDocumentResolutionError) {
43
+
throw new Error("Failed document resolution");
44
+
}
45
+
if (err instanceof HandleResolutionError) {
46
+
throw new Error("Unknown resolution error");
47
+
}
48
+
}
49
+
50
+
return doc;
51
+
}
+36
backend/src/api/stats.ts
+36
backend/src/api/stats.ts
···
1
+
/*
2
+
* clippr: a social bookmarking service for the AT Protocol
3
+
* Copyright (c) 2025 clippr contributors.
4
+
* SPDX-License-Identifier: AGPL-3.0-only
5
+
*/
6
+
7
+
import type { AppviewStatsQuery } from "./types.js";
8
+
import { Database } from "../db/database.js";
9
+
import { clipsTable, tagsTable, usersTable } from "../db/schema.js";
10
+
import { count } from "drizzle-orm";
11
+
12
+
const db = Database.getInstance().getDb();
13
+
14
+
export async function getStats(): Promise<AppviewStatsQuery> {
15
+
const clipCount = await db.select({ count: count() }).from(clipsTable);
16
+
const tagCount = await db.select({ count: count() }).from(tagsTable);
17
+
const userCount = await db.select({ count: count() }).from(usersTable);
18
+
19
+
if (
20
+
clipCount[0] === undefined ||
21
+
tagCount[0] === undefined ||
22
+
userCount[0] === undefined
23
+
) {
24
+
return {
25
+
knownClips: 0,
26
+
knownTags: 0,
27
+
knownUsers: 0,
28
+
};
29
+
}
30
+
31
+
return {
32
+
knownClips: clipCount[0].count,
33
+
knownTags: tagCount[0].count,
34
+
knownUsers: userCount[0].count,
35
+
};
36
+
}
+6
backend/src/api/types.ts
+6
backend/src/api/types.ts
+37
-14
backend/src/config.ts
+37
-14
backend/src/config.ts
···
7
7
import { readFileSync } from "fs";
8
8
import * as toml from "toml";
9
9
10
+
interface ConfigSchema {
11
+
hostname: string | "localhost";
12
+
port: number | 9090;
13
+
baseUrl: string | "http://localhost:9090";
14
+
logLevel: string | "debug";
15
+
database: {
16
+
name: string | "file:clippr.db";
17
+
};
18
+
network: {
19
+
firehose: string | "jetstream1.us-east.bsky.network";
20
+
serviceDid: string | "did:web:localhost%3A9090";
21
+
didSigningKey:
22
+
| string
23
+
| "did:key:zDnaeuuRRQuYp4S76LwosLhHbpU1HJcg6S5oJAUHmdZLVdLM5";
24
+
};
25
+
}
26
+
27
+
class ConfigError extends Error {
28
+
constructor(message: string) {
29
+
super(message);
30
+
this.name = "ConfigError";
31
+
}
32
+
}
33
+
10
34
export class Config {
11
35
private static instance: Config;
12
-
private readonly configData;
36
+
private readonly configData: ConfigSchema;
13
37
14
38
private constructor() {
15
39
let tomlString;
16
40
try {
17
41
tomlString = readFileSync("config.toml", "utf-8");
18
42
} catch {
19
-
throw new Error("Config file not found");
43
+
throw new ConfigError("Config file not found");
44
+
}
45
+
46
+
try {
47
+
this.configData = toml.parse(tomlString);
48
+
} catch {
49
+
throw new ConfigError(`Config file is not valid TOML`);
20
50
}
21
-
this.configData = toml.parse(tomlString);
22
51
}
23
52
53
+
/**
54
+
* Gets a singleton instance of the program configuration
55
+
* @throws {ConfigError} if the config file cannot be read or parsed
56
+
*/
24
57
static getInstance(): Config {
25
58
if (!Config.instance) {
26
59
try {
···
33
66
return Config.instance;
34
67
}
35
68
36
-
get<T>(path: string): T | undefined {
37
-
const keys = path.split(".");
38
-
let value = this.configData;
39
-
for (const key of keys) {
40
-
if (value == null) return undefined;
41
-
value = value[key];
42
-
}
43
-
return value;
44
-
}
45
-
46
-
getAll() {
69
+
getConfig(): ConfigSchema {
47
70
return this.configData;
48
71
}
49
72
}
+16
-3
backend/src/db/database.ts
+16
-3
backend/src/db/database.ts
···
8
8
import { Config } from "../config.js";
9
9
import Logger from "../logger.js";
10
10
11
-
const config = Config.getInstance();
12
-
const dbname = config.get("database.name");
11
+
const config = Config.getInstance().getConfig();
12
+
const dbname = config.database.name;
13
+
14
+
class DatabaseError extends Error {
15
+
constructor(message: string) {
16
+
super(message);
17
+
this.name = "DatabaseError";
18
+
}
19
+
}
13
20
14
21
export class Database {
15
22
private static instance: Database;
16
23
private readonly db;
17
24
18
25
private constructor() {
19
-
this.db = drizzle({ connection: { url: `${dbname}` } });
26
+
try {
27
+
this.db = drizzle({ connection: { url: `${dbname}` } });
28
+
} catch (e: unknown) {
29
+
if (e instanceof Error) {
30
+
throw new DatabaseError(e.message);
31
+
} else throw new DatabaseError("Unknown error");
32
+
}
20
33
}
21
34
22
35
static getInstance(): Database {
+4
-3
backend/src/logger.ts
+4
-3
backend/src/logger.ts
···
5
5
*/
6
6
7
7
import { createLogger, format, transports } from "winston";
8
+
import { Config } from "./config.js";
8
9
9
-
// TODO: I can't seem to actually get the config setting for the log level yet.
10
-
const loglevel = "debug";
10
+
const config = Config.getInstance().getConfig();
11
+
const logLevel = config.logLevel;
11
12
12
13
const Logger = createLogger({
13
-
level: loglevel,
14
+
level: logLevel,
14
15
transports: [
15
16
new transports.Console({
16
17
format: format.combine(
+7
-6
backend/src/main.ts
+7
-6
backend/src/main.ts
···
17
17
18
18
async function main() {
19
19
const logger = Logger;
20
-
logger.info("Clippr-BE starting...");
20
+
logger.info(`Clippr-BE v${process.env.npm_package_version} starting...`);
21
21
22
-
logger.verbose("Reading configuration...");
23
-
const config = Config.getInstance();
22
+
// Config is already loaded into the app (when preparing logger)
23
+
const config = Config.getInstance().getConfig();
24
24
25
25
logger.verbose("Initializing database...");
26
26
Database.getInstance();
···
29
29
startFirehose();
30
30
readFromFirehose();
31
31
32
+
logger.verbose("Starting XRPC server...");
32
33
const server: ServerType = serve({
33
-
port: config.get("port"),
34
-
hostname: config.get("hostname"),
34
+
port: config.port,
35
+
hostname: config.hostname,
35
36
fetch: app.fetch,
36
37
});
37
38
38
39
logger.info(
39
-
`XRPC server launched at http://${config.get("hostname")}:${config.get("port")}`,
40
+
`XRPC server launched at http://${config.hostname}:${config.port}`,
40
41
);
41
42
42
43
process.removeAllListeners("SIGINT");
+80
-20
backend/src/network/commit.ts
+80
-20
backend/src/network/commit.ts
···
18
18
import { validateClip, validateProfile, validateTag } from "./validator.js";
19
19
import { convertDidToString } from "./converters.js";
20
20
import { hashString } from "../hasher.js";
21
-
import { eq } from "drizzle-orm";
21
+
import { and, eq } from "drizzle-orm";
22
+
import type { TagRef } from "../api/types.js";
22
23
23
24
const db = Database.getInstance().getDb();
24
25
···
30
31
export async function handleClip(
31
32
event: CommitEvent<`social.clippr.${string}`>,
32
33
): Promise<void> {
33
-
if (event.commit.operation !== "create") {
34
-
Logger.warn(
35
-
`Operation '${event.commit.operation}' for ${event.commit.collection} not supported. Ignoring.`,
36
-
);
34
+
if (event.commit.operation === "delete") {
35
+
await db
36
+
.delete(clipsTable)
37
+
.where(
38
+
and(
39
+
eq(clipsTable.did, event.did),
40
+
eq(clipsTable.recordKey, event.commit.rkey),
41
+
),
42
+
);
43
+
Logger.verbose(`Deleted clip: ${event.did}/${event.commit.rkey}`, event);
37
44
return;
38
-
} // We currently do not handle these.
45
+
}
39
46
40
47
if (event.commit.record.$type !== "social.clippr.feed.clip") {
41
48
Logger.verbose(
···
76
83
return;
77
84
}
78
85
79
-
if (!(await validateClip(record))) {
86
+
if (!(await validateClip(record))) return;
87
+
88
+
if (event.commit.operation === "update") {
89
+
await db
90
+
.update(clipsTable)
91
+
.set({
92
+
did: convertDidToString(event.did),
93
+
cid: event.commit.cid,
94
+
timestamp: convertMicroToDate(event.time_us),
95
+
recordKey: event.commit.rkey,
96
+
createdAt: new Date(record.createdAt),
97
+
indexedAt: new Date(),
98
+
url: record.url,
99
+
title: record.title,
100
+
description: record.description,
101
+
tags: record.tags as TagRef[] | undefined,
102
+
notes: record.notes,
103
+
unlisted: record.unlisted,
104
+
unread: record.unread,
105
+
languages: record.languages,
106
+
})
107
+
.where(
108
+
and(
109
+
eq(clipsTable.did, event.did),
110
+
eq(clipsTable.recordKey, event.commit.rkey),
111
+
),
112
+
);
113
+
Logger.verbose(`Updated clip: ${event.did}/${event.commit.rkey}`, event);
80
114
return;
81
115
}
82
116
···
104
138
export async function handleTag(
105
139
event: CommitEvent<`social.clippr.${string}`>,
106
140
): Promise<void> {
107
-
if (event.commit.operation !== "create") {
108
-
Logger.warn(
109
-
`Operation '${event.commit.operation}' for ${event.commit.collection} not supported. Ignoring.`,
110
-
);
141
+
if (event.commit.operation === "delete") {
142
+
await db
143
+
.delete(tagsTable)
144
+
.where(
145
+
and(
146
+
eq(tagsTable.did, event.did),
147
+
eq(tagsTable.recordKey, event.commit.rkey),
148
+
),
149
+
);
150
+
Logger.verbose(`Deleted tag: ${event.did}/${event.commit.rkey}`, event);
111
151
return;
112
-
} // We currently do not handle these.
152
+
}
113
153
114
154
if (event.commit.record.$type !== "social.clippr.feed.tag") {
115
155
Logger.verbose(
···
148
188
return;
149
189
}
150
190
191
+
if (event.commit.operation === "update") {
192
+
await db
193
+
.update(tagsTable)
194
+
.set({
195
+
timestamp: convertMicroToDate(event.time_us),
196
+
did: convertDidToString(event.did),
197
+
cid: event.commit.cid,
198
+
recordKey: event.commit.rkey,
199
+
name: record.name,
200
+
description: record.description,
201
+
color: record.color,
202
+
createdAt: new Date(record.createdAt),
203
+
indexedAt: new Date(),
204
+
})
205
+
.where(
206
+
and(
207
+
eq(tagsTable.did, event.did),
208
+
eq(tagsTable.recordKey, event.commit.rkey),
209
+
),
210
+
);
211
+
Logger.verbose(`Updated tag: ${event.did}/${event.commit.rkey}`, event);
212
+
return;
213
+
}
214
+
151
215
await db.insert(tagsTable).values({
152
216
timestamp: convertMicroToDate(event.time_us),
153
217
did: convertDidToString(event.did),
···
167
231
event: CommitEvent<`social.clippr.${string}`>,
168
232
): Promise<void> {
169
233
if (event.commit.operation === "delete") {
170
-
Logger.warn(
171
-
`Operation '${event.commit.operation}' for ${event.commit.collection} not supported. Ignoring.`,
172
-
);
234
+
await db.delete(usersTable).where(eq(usersTable.did, event.did));
235
+
Logger.verbose(`Deleted profile: ${event.did}`, event);
173
236
return;
174
-
} // We currently do not handle deletes.
237
+
}
175
238
176
239
if (event.commit.record.$type !== "social.clippr.actor.profile") {
177
240
Logger.verbose(
···
257
320
avatar: record.avatar?.ref.$link,
258
321
description: record.description,
259
322
})
260
-
.where(eq(usersTable.did, convertDidToString(event.did)))
261
-
.execute();
262
-
323
+
.where(eq(usersTable.did, convertDidToString(event.did)));
263
324
Logger.verbose(`Updated profile: ${convertDidToString(event.did)}`, event);
264
-
265
325
return;
266
326
}
267
327
+5
-38
backend/src/network/converters.ts
+5
-38
backend/src/network/converters.ts
···
4
4
* SPDX-License-Identifier: AGPL-3.0-only
5
5
*/
6
6
7
-
import {
8
-
CompositeDidDocumentResolver,
9
-
DocumentNotFoundError,
10
-
FailedDocumentResolutionError,
11
-
HandleResolutionError,
12
-
ImproperDidError,
13
-
PlcDidDocumentResolver,
14
-
UnsupportedDidMethodError,
15
-
WebDidDocumentResolver,
16
-
} from "@atcute/identity-resolver";
17
7
import { Client, simpleFetchHandler } from "@atcute/client";
8
+
import { getDidDocument } from "../api/did.js";
18
9
19
10
/// Converts an ``At.DID`` type to a proper string, for type reasons.
20
11
export function convertDidToString(did: `did:${string}`): string {
···
31
22
}
32
23
}
33
24
34
-
// Get a user's handle from their DID. DID method agnostic.
25
+
// Get a user's handle from their DID.
26
+
//
27
+
// WARNING: Handle validation is not performed and is taken from the document as-is. Fix me!
35
28
export async function getHandleFromDid(did: string): Promise<string> {
36
-
const docResolver = new CompositeDidDocumentResolver({
37
-
methods: {
38
-
plc: new PlcDidDocumentResolver(),
39
-
web: new WebDidDocumentResolver(),
40
-
},
41
-
});
42
-
43
-
let doc;
44
-
try {
45
-
doc = await docResolver.resolve(convertStringToTypedDid(did));
46
-
} catch (err) {
47
-
if (err instanceof DocumentNotFoundError) {
48
-
throw new Error("Document not found");
49
-
}
50
-
if (err instanceof UnsupportedDidMethodError) {
51
-
throw new Error("Unsupported did method");
52
-
}
53
-
if (err instanceof ImproperDidError) {
54
-
throw new Error("Improper did");
55
-
}
56
-
if (err instanceof FailedDocumentResolutionError) {
57
-
throw new Error("Failed document resolution");
58
-
}
59
-
if (err instanceof HandleResolutionError) {
60
-
throw new Error("Generic handle resolution error");
61
-
}
62
-
}
29
+
const doc = await getDidDocument(convertStringToTypedDid(did));
63
30
64
31
if (!doc?.alsoKnownAs) {
65
32
throw new Error("No handles found");
+2
-2
backend/src/network/jetstream.ts
+2
-2
backend/src/network/jetstream.ts
···
9
9
import { handleClip, handleProfile, handleTag } from "./commit.js";
10
10
import Logger from "../logger.js";
11
11
12
-
const config = Config.getInstance();
13
-
const hostname = config.get("network.firehose");
12
+
const config = Config.getInstance().getConfig();
13
+
const hostname = config.network.firehose;
14
14
15
15
const jetstream = new Jetstream({
16
16
endpoint: `wss://${hostname}/subscribe`,
+186
backend/src/routes/well-known.ts
+186
backend/src/routes/well-known.ts
···
1
+
/*
2
+
* clippr: a social bookmarking service for the AT Protocol
3
+
* Copyright (c) 2025 clippr contributors.
4
+
* SPDX-License-Identifier: AGPL-3.0-only
5
+
*/
6
+
7
+
import { Hono } from "hono";
8
+
import { Config } from "../config.js";
9
+
import { getStats } from "../api/stats.js";
10
+
11
+
const app = new Hono();
12
+
const config = Config.getInstance().getConfig();
13
+
14
+
const serviceDid: string = config.network.serviceDid;
15
+
const signingKey: string = config.network.didSigningKey;
16
+
let baseUrl: string = config.baseUrl;
17
+
18
+
if (!baseUrl.startsWith("http://") || !baseUrl.startsWith("https://")) {
19
+
baseUrl = `http://${baseUrl.replace(/^https?:\/\//, "")}`;
20
+
}
21
+
22
+
app.get("/.well-known/nodeinfo", (c) => {
23
+
return c.json({
24
+
links: [
25
+
{
26
+
rel: "https://nodeinfo.diaspora.software/ns/schema/2.2",
27
+
href: `${baseUrl}/nodeinfo/2.2`,
28
+
},
29
+
{
30
+
rel: "https://nodeinfo.diaspora.software/ns/schema/2.1",
31
+
href: `${baseUrl}/nodeinfo/2.1`,
32
+
},
33
+
{
34
+
rel: "https://nodeinfo.diaspora.software/ns/schema/2.0",
35
+
href: `${baseUrl}/nodeinfo/2.0`,
36
+
},
37
+
],
38
+
});
39
+
});
40
+
41
+
app.get("/nodeinfo/2.2", async (c) => {
42
+
const appviewStats = await getStats();
43
+
44
+
return c.json({
45
+
version: "2.2",
46
+
software: {
47
+
name: "clippr",
48
+
version: `${process.env.npm_package_version}`,
49
+
repository: "https://tangled.sh/@hexmani.ac/clippr",
50
+
homepage: "https://clippr.social",
51
+
},
52
+
instance: {
53
+
name: "clippr",
54
+
description: "A social bookmarking service for the AT Protocol",
55
+
},
56
+
openRegistrations: true,
57
+
protocols: ["atprotocol"],
58
+
services: {
59
+
inbound: [],
60
+
outbound: [],
61
+
},
62
+
usage: {
63
+
users: {
64
+
total: appviewStats.knownUsers,
65
+
},
66
+
},
67
+
metadata: {
68
+
clips: appviewStats.knownClips,
69
+
tags: appviewStats.knownTags,
70
+
},
71
+
});
72
+
});
73
+
74
+
app.get("/nodeinfo/2.1", async (c) => {
75
+
const appviewStats = await getStats();
76
+
77
+
return c.json({
78
+
version: "2.1",
79
+
software: {
80
+
name: "clippr",
81
+
version: `${process.env.npm_package_version}`,
82
+
repository: "https://tangled.sh/@hexmani.ac/clippr",
83
+
homepage: "https://clippr.social",
84
+
},
85
+
openRegistrations: true,
86
+
protocols: ["atprotocol"],
87
+
services: {
88
+
inbound: [],
89
+
outbound: [],
90
+
},
91
+
usage: {
92
+
users: {
93
+
total: appviewStats.knownUsers,
94
+
},
95
+
},
96
+
metadata: {
97
+
clips: appviewStats.knownClips,
98
+
tags: appviewStats.knownTags,
99
+
},
100
+
});
101
+
});
102
+
103
+
app.get("/nodeinfo/2.0", async (c) => {
104
+
const appviewStats = await getStats();
105
+
106
+
return c.json({
107
+
version: "2.0",
108
+
software: {
109
+
name: "clippr",
110
+
version: `${process.env.npm_package_version}`,
111
+
},
112
+
openRegistrations: true,
113
+
protocols: ["atprotocol"],
114
+
services: {
115
+
inbound: [],
116
+
outbound: [],
117
+
},
118
+
usage: {
119
+
users: {
120
+
total: appviewStats.knownUsers,
121
+
},
122
+
},
123
+
metadata: {
124
+
clips: appviewStats.knownClips,
125
+
tags: appviewStats.knownTags,
126
+
},
127
+
});
128
+
});
129
+
130
+
app.get("/.well-known/did.json", async (c) => {
131
+
if (serviceDid === undefined) {
132
+
return c.json(
133
+
{
134
+
error: "Internal Server Error",
135
+
message: "Server is not properly configured",
136
+
},
137
+
500,
138
+
);
139
+
}
140
+
141
+
if (signingKey === undefined) {
142
+
return c.json(
143
+
{
144
+
error: "Internal Server Error",
145
+
message: "Server is not properly configured",
146
+
},
147
+
500,
148
+
);
149
+
}
150
+
151
+
if (!signingKey.replace("did:key:", "").startsWith("z")) {
152
+
console.log(signingKey);
153
+
return c.json(
154
+
{
155
+
error: "Internal Server Error",
156
+
message: "Server is not properly configured",
157
+
},
158
+
500,
159
+
);
160
+
}
161
+
162
+
return c.json({
163
+
"@context": [
164
+
"https://www.w3.org/ns/did/v1",
165
+
"https://w3id.org/security/multikey/v1",
166
+
],
167
+
id: serviceDid,
168
+
verificationMethod: [
169
+
{
170
+
id: `${serviceDid}#atproto`,
171
+
type: "Multikey",
172
+
controller: serviceDid,
173
+
publicKeyMultibase: `${signingKey.replace("did:key:", "")}`,
174
+
},
175
+
],
176
+
services: [
177
+
{
178
+
id: "#clippr_appview",
179
+
type: "ClipprAppView",
180
+
serviceEndpoint: `${baseUrl}`,
181
+
},
182
+
],
183
+
});
184
+
});
185
+
186
+
export default app;
+3
-1
backend/src/server.ts
+3
-1
backend/src/server.ts
···
6
6
7
7
import { Hono } from "hono";
8
8
import misc from "./routes/misc.js";
9
+
import openapi from "./routes/openapi.js";
9
10
import xrpc from "./routes/xrpc.js";
11
+
import wellKnown from "./routes/well-known.js";
10
12
import Logger from "./logger.js";
11
13
import { logger } from "hono/logger";
12
-
import openapi from "./routes/openapi.js";
13
14
import { cors } from "hono/cors";
14
15
15
16
export function winstonLogger(message: string, ...rest: unknown[]) {
···
23
24
// Link all routes up
24
25
app.route("/", misc);
25
26
app.route("/", openapi);
27
+
app.route("/", wellKnown);
26
28
app.route("/xrpc", xrpc);
27
29
28
30
export default app;
+12
-1
frontend/README.md
+12
-1
frontend/README.md
···
4
4
5
5
## development
6
6
7
+
If you are testing the frontend in conjunction with the AppView, you might want to change the
8
+
following:
9
+
10
+
- OAuth automatically adapts to whether the frontend is built or in dev mode.
11
+
- `VITE_CLIPPR_APPVIEW` is set to the defaults for both production and development, however, if you
12
+
are hosting the appview from another location, you will need to change this.
13
+
7
14
```shell
8
15
pnpm install
9
-
cp .env.example .env # Modify this if necessary
10
16
pnpm run dev
11
17
```
12
18
13
19
## deployment
20
+
21
+
If you plan to deploy the frontend and use another AppView or to add/remove OAuth scopes, you will
22
+
have to modify `public/oauth/client-metadata.json` and the `VITE_CLIPPR_APPVIEW` environment
23
+
variable. There are plans to add a way to change what AppView DID the frontend proxies its requests
24
+
to inside the frontend, but not before launch.
14
25
15
26
```shell
16
27
pnpm run build
+1
-1
frontend/package.json
+1
-1
frontend/package.json
+101
-101
frontend/pnpm-lock.yaml
+101
-101
frontend/pnpm-lock.yaml
···
15
15
specifier: ^1.1.3
16
16
version: 1.1.3(@atcute/identity@1.0.3)
17
17
'@atcute/lexicons':
18
-
specifier: ^1.1.0
19
-
version: 1.1.0
18
+
specifier: ^1.1.1
19
+
version: 1.1.1
20
20
'@atcute/oauth-browser-client':
21
21
specifier: ^1.0.26
22
22
version: 1.0.26
···
66
66
'@atcute/identity@1.0.3':
67
67
resolution: {integrity: sha512-mNMxbKHFGys03A8JXKk0KfMBzdd0vrYMzZZWjpw1nYTs0+ea6bo5S1hwqVUZxHdo1gFHSe/t63jxQIF4yL9aKw==}
68
68
69
-
'@atcute/lexicons@1.1.0':
70
-
resolution: {integrity: sha512-LFqwnria78xLYb62Ri/+WwQpUTgZp2DuyolNGIIOV1dpiKhFFFh//nscHMA6IExFLQRqWDs3tTjy7zv0h3sf1Q==}
69
+
'@atcute/lexicons@1.1.1':
70
+
resolution: {integrity: sha512-k6qy5p3j9fJJ6ekaMPfEfp3ni4TW/XNuH9ZmsuwC0fi0tOjp+Fa8ZQakHwnqOzFt/cVBfGcmYE/lKNAbeTjgUg==}
71
71
72
72
'@atcute/multibase@1.1.4':
73
73
resolution: {integrity: sha512-NUf5AeeSOmuZHGU+4GAaMtISJoG+ZHtW/vUVA4lK/YDt/7LODAW0Fd0NNIIUPVUoW0xJS6zSEIWvwLLuxmEHhA==}
···
347
347
'@nothing-but/utils@0.17.0':
348
348
resolution: {integrity: sha512-TuCHcHLOqDL0SnaAxACfuRHBNRgNJcNn9X0GiH5H3YSDBVquCr3qEIG3FOQAuMyZCbu9w8nk2CHhOsn7IvhIwQ==}
349
349
350
-
'@rollup/rollup-android-arm-eabi@4.46.3':
351
-
resolution: {integrity: sha512-UmTdvXnLlqQNOCJnyksjPs1G4GqXNGW1LrzCe8+8QoaLhhDeTXYBgJ3k6x61WIhlHX2U+VzEJ55TtIjR/HTySA==}
350
+
'@rollup/rollup-android-arm-eabi@4.47.1':
351
+
resolution: {integrity: sha512-lTahKRJip0knffA/GTNFJMrToD+CM+JJ+Qt5kjzBK/sFQ0EWqfKW3AYQSlZXN98tX0lx66083U9JYIMioMMK7g==}
352
352
cpu: [arm]
353
353
os: [android]
354
354
355
-
'@rollup/rollup-android-arm64@4.46.3':
356
-
resolution: {integrity: sha512-8NoxqLpXm7VyeI0ocidh335D6OKT0UJ6fHdnIxf3+6oOerZZc+O7r+UhvROji6OspyPm+rrIdb1gTXtVIqn+Sg==}
355
+
'@rollup/rollup-android-arm64@4.47.1':
356
+
resolution: {integrity: sha512-uqxkb3RJLzlBbh/bbNQ4r7YpSZnjgMgyoEOY7Fy6GCbelkDSAzeiogxMG9TfLsBbqmGsdDObo3mzGqa8hps4MA==}
357
357
cpu: [arm64]
358
358
os: [android]
359
359
360
-
'@rollup/rollup-darwin-arm64@4.46.3':
361
-
resolution: {integrity: sha512-csnNavqZVs1+7/hUKtgjMECsNG2cdB8F7XBHP6FfQjqhjF8rzMzb3SLyy/1BG7YSfQ+bG75Ph7DyedbUqwq1rA==}
360
+
'@rollup/rollup-darwin-arm64@4.47.1':
361
+
resolution: {integrity: sha512-tV6reObmxBDS4DDyLzTDIpymthNlxrLBGAoQx6m2a7eifSNEZdkXQl1PE4ZjCkEDPVgNXSzND/k9AQ3mC4IOEQ==}
362
362
cpu: [arm64]
363
363
os: [darwin]
364
364
365
-
'@rollup/rollup-darwin-x64@4.46.3':
366
-
resolution: {integrity: sha512-r2MXNjbuYabSIX5yQqnT8SGSQ26XQc8fmp6UhlYJd95PZJkQD1u82fWP7HqvGUf33IsOC6qsiV+vcuD4SDP6iw==}
365
+
'@rollup/rollup-darwin-x64@4.47.1':
366
+
resolution: {integrity: sha512-XuJRPTnMk1lwsSnS3vYyVMu4x/+WIw1MMSiqj5C4j3QOWsMzbJEK90zG+SWV1h0B1ABGCQ0UZUjti+TQK35uHQ==}
367
367
cpu: [x64]
368
368
os: [darwin]
369
369
370
-
'@rollup/rollup-freebsd-arm64@4.46.3':
371
-
resolution: {integrity: sha512-uluObTmgPJDuJh9xqxyr7MV61Imq+0IvVsAlWyvxAaBSNzCcmZlhfYcRhCdMaCsy46ccZa7vtDDripgs9Jkqsw==}
370
+
'@rollup/rollup-freebsd-arm64@4.47.1':
371
+
resolution: {integrity: sha512-79BAm8Ag/tmJ5asCqgOXsb3WY28Rdd5Lxj8ONiQzWzy9LvWORd5qVuOnjlqiWWZJw+dWewEktZb5yiM1DLLaHw==}
372
372
cpu: [arm64]
373
373
os: [freebsd]
374
374
375
-
'@rollup/rollup-freebsd-x64@4.46.3':
376
-
resolution: {integrity: sha512-AVJXEq9RVHQnejdbFvh1eWEoobohUYN3nqJIPI4mNTMpsyYN01VvcAClxflyk2HIxvLpRcRggpX1m9hkXkpC/A==}
375
+
'@rollup/rollup-freebsd-x64@4.47.1':
376
+
resolution: {integrity: sha512-OQ2/ZDGzdOOlyfqBiip0ZX/jVFekzYrGtUsqAfLDbWy0jh1PUU18+jYp8UMpqhly5ltEqotc2miLngf9FPSWIA==}
377
377
cpu: [x64]
378
378
os: [freebsd]
379
379
380
-
'@rollup/rollup-linux-arm-gnueabihf@4.46.3':
381
-
resolution: {integrity: sha512-byyflM+huiwHlKi7VHLAYTKr67X199+V+mt1iRgJenAI594vcmGGddWlu6eHujmcdl6TqSNnvqaXJqZdnEWRGA==}
380
+
'@rollup/rollup-linux-arm-gnueabihf@4.47.1':
381
+
resolution: {integrity: sha512-HZZBXJL1udxlCVvoVadstgiU26seKkHbbAMLg7680gAcMnRNP9SAwTMVet02ANA94kXEI2VhBnXs4e5nf7KG2A==}
382
382
cpu: [arm]
383
383
os: [linux]
384
384
385
-
'@rollup/rollup-linux-arm-musleabihf@4.46.3':
386
-
resolution: {integrity: sha512-aLm3NMIjr4Y9LklrH5cu7yybBqoVCdr4Nvnm8WB7PKCn34fMCGypVNpGK0JQWdPAzR/FnoEoFtlRqZbBBLhVoQ==}
385
+
'@rollup/rollup-linux-arm-musleabihf@4.47.1':
386
+
resolution: {integrity: sha512-sZ5p2I9UA7T950JmuZ3pgdKA6+RTBr+0FpK427ExW0t7n+QwYOcmDTK/aRlzoBrWyTpJNlS3kacgSlSTUg6P/Q==}
387
387
cpu: [arm]
388
388
os: [linux]
389
389
390
-
'@rollup/rollup-linux-arm64-gnu@4.46.3':
391
-
resolution: {integrity: sha512-VtilE6eznJRDIoFOzaagQodUksTEfLIsvXymS+UdJiSXrPW7Ai+WG4uapAc3F7Hgs791TwdGh4xyOzbuzIZrnw==}
390
+
'@rollup/rollup-linux-arm64-gnu@4.47.1':
391
+
resolution: {integrity: sha512-3hBFoqPyU89Dyf1mQRXCdpc6qC6At3LV6jbbIOZd72jcx7xNk3aAp+EjzAtN6sDlmHFzsDJN5yeUySvorWeRXA==}
392
392
cpu: [arm64]
393
393
os: [linux]
394
394
395
-
'@rollup/rollup-linux-arm64-musl@4.46.3':
396
-
resolution: {integrity: sha512-dG3JuS6+cRAL0GQ925Vppafi0qwZnkHdPeuZIxIPXqkCLP02l7ka+OCyBoDEv8S+nKHxfjvjW4OZ7hTdHkx8/w==}
395
+
'@rollup/rollup-linux-arm64-musl@4.47.1':
396
+
resolution: {integrity: sha512-49J4FnMHfGodJWPw73Ve+/hsPjZgcXQGkmqBGZFvltzBKRS+cvMiWNLadOMXKGnYRhs1ToTGM0sItKISoSGUNA==}
397
397
cpu: [arm64]
398
398
os: [linux]
399
399
400
-
'@rollup/rollup-linux-loongarch64-gnu@4.46.3':
401
-
resolution: {integrity: sha512-iU8DxnxEKJptf8Vcx4XvAUdpkZfaz0KWfRrnIRrOndL0SvzEte+MTM7nDH4A2Now4FvTZ01yFAgj6TX/mZl8hQ==}
400
+
'@rollup/rollup-linux-loongarch64-gnu@4.47.1':
401
+
resolution: {integrity: sha512-4yYU8p7AneEpQkRX03pbpLmE21z5JNys16F1BZBZg5fP9rIlb0TkeQjn5du5w4agConCCEoYIG57sNxjryHEGg==}
402
402
cpu: [loong64]
403
403
os: [linux]
404
404
405
-
'@rollup/rollup-linux-ppc64-gnu@4.46.3':
406
-
resolution: {integrity: sha512-VrQZp9tkk0yozJoQvQcqlWiqaPnLM6uY1qPYXvukKePb0fqaiQtOdMJSxNFUZFsGw5oA5vvVokjHrx8a9Qsz2A==}
405
+
'@rollup/rollup-linux-ppc64-gnu@4.47.1':
406
+
resolution: {integrity: sha512-fAiq+J28l2YMWgC39jz/zPi2jqc0y3GSRo1yyxlBHt6UN0yYgnegHSRPa3pnHS5amT/efXQrm0ug5+aNEu9UuQ==}
407
407
cpu: [ppc64]
408
408
os: [linux]
409
409
410
-
'@rollup/rollup-linux-riscv64-gnu@4.46.3':
411
-
resolution: {integrity: sha512-uf2eucWSUb+M7b0poZ/08LsbcRgaDYL8NCGjUeFMwCWFwOuFcZ8D9ayPl25P3pl+D2FH45EbHdfyUesQ2Lt9wA==}
410
+
'@rollup/rollup-linux-riscv64-gnu@4.47.1':
411
+
resolution: {integrity: sha512-daoT0PMENNdjVYYU9xec30Y2prb1AbEIbb64sqkcQcSaR0zYuKkoPuhIztfxuqN82KYCKKrj+tQe4Gi7OSm1ow==}
412
412
cpu: [riscv64]
413
413
os: [linux]
414
414
415
-
'@rollup/rollup-linux-riscv64-musl@4.46.3':
416
-
resolution: {integrity: sha512-7tnUcDvN8DHm/9ra+/nF7lLzYHDeODKKKrh6JmZejbh1FnCNZS8zMkZY5J4sEipy2OW1d1Ncc4gNHUd0DLqkSg==}
415
+
'@rollup/rollup-linux-riscv64-musl@4.47.1':
416
+
resolution: {integrity: sha512-JNyXaAhWtdzfXu5pUcHAuNwGQKevR+6z/poYQKVW+pLaYOj9G1meYc57/1Xv2u4uTxfu9qEWmNTjv/H/EpAisw==}
417
417
cpu: [riscv64]
418
418
os: [linux]
419
419
420
-
'@rollup/rollup-linux-s390x-gnu@4.46.3':
421
-
resolution: {integrity: sha512-MUpAOallJim8CsJK+4Lc9tQzlfPbHxWDrGXZm2z6biaadNpvh3a5ewcdat478W+tXDoUiHwErX/dOql7ETcLqg==}
420
+
'@rollup/rollup-linux-s390x-gnu@4.47.1':
421
+
resolution: {integrity: sha512-U/CHbqKSwEQyZXjCpY43/GLYcTVKEXeRHw0rMBJP7fP3x6WpYG4LTJWR3ic6TeYKX6ZK7mrhltP4ppolyVhLVQ==}
422
422
cpu: [s390x]
423
423
os: [linux]
424
424
425
-
'@rollup/rollup-linux-x64-gnu@4.46.3':
426
-
resolution: {integrity: sha512-F42IgZI4JicE2vM2PWCe0N5mR5vR0gIdORPqhGQ32/u1S1v3kLtbZ0C/mi9FFk7C5T0PgdeyWEPajPjaUpyoKg==}
425
+
'@rollup/rollup-linux-x64-gnu@4.47.1':
426
+
resolution: {integrity: sha512-uTLEakjxOTElfeZIGWkC34u2auLHB1AYS6wBjPGI00bWdxdLcCzK5awjs25YXpqB9lS8S0vbO0t9ZcBeNibA7g==}
427
427
cpu: [x64]
428
428
os: [linux]
429
429
430
-
'@rollup/rollup-linux-x64-musl@4.46.3':
431
-
resolution: {integrity: sha512-oLc+JrwwvbimJUInzx56Q3ujL3Kkhxehg7O1gWAYzm8hImCd5ld1F2Gry5YDjR21MNb5WCKhC9hXgU7rRlyegQ==}
430
+
'@rollup/rollup-linux-x64-musl@4.47.1':
431
+
resolution: {integrity: sha512-Ft+d/9DXs30BK7CHCTX11FtQGHUdpNDLJW0HHLign4lgMgBcPFN3NkdIXhC5r9iwsMwYreBBc4Rho5ieOmKNVQ==}
432
432
cpu: [x64]
433
433
os: [linux]
434
434
435
-
'@rollup/rollup-win32-arm64-msvc@4.46.3':
436
-
resolution: {integrity: sha512-lOrQ+BVRstruD1fkWg9yjmumhowR0oLAAzavB7yFSaGltY8klttmZtCLvOXCmGE9mLIn8IBV/IFrQOWz5xbFPg==}
435
+
'@rollup/rollup-win32-arm64-msvc@4.47.1':
436
+
resolution: {integrity: sha512-N9X5WqGYzZnjGAFsKSfYFtAShYjwOmFJoWbLg3dYixZOZqU7hdMq+/xyS14zKLhFhZDhP9VfkzQnsdk0ZDS9IA==}
437
437
cpu: [arm64]
438
438
os: [win32]
439
439
440
-
'@rollup/rollup-win32-ia32-msvc@4.46.3':
441
-
resolution: {integrity: sha512-vvrVKPRS4GduGR7VMH8EylCBqsDcw6U+/0nPDuIjXQRbHJc6xOBj+frx8ksfZAh6+Fptw5wHrN7etlMmQnPQVg==}
440
+
'@rollup/rollup-win32-ia32-msvc@4.47.1':
441
+
resolution: {integrity: sha512-O+KcfeCORZADEY8oQJk4HK8wtEOCRE4MdOkb8qGZQNun3jzmj2nmhV/B/ZaaZOkPmJyvm/gW9n0gsB4eRa1eiQ==}
442
442
cpu: [ia32]
443
443
os: [win32]
444
444
445
-
'@rollup/rollup-win32-x64-msvc@4.46.3':
446
-
resolution: {integrity: sha512-fi3cPxCnu3ZeM3EwKZPgXbWoGzm2XHgB/WShKI81uj8wG0+laobmqy5wbgEwzstlbLu4MyO8C19FyhhWseYKNQ==}
445
+
'@rollup/rollup-win32-x64-msvc@4.47.1':
446
+
resolution: {integrity: sha512-CpKnYa8eHthJa3c+C38v/E+/KZyF1Jdh2Cz3DyKZqEWYgrM1IHFArXNWvBLPQCKUEsAqqKX27tTqVEFbDNUcOA==}
447
447
cpu: [x64]
448
448
os: [win32]
449
449
···
554
554
engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
555
555
hasBin: true
556
556
557
-
caniuse-lite@1.0.30001735:
558
-
resolution: {integrity: sha512-EV/laoX7Wq2J9TQlyIXRxTJqIw4sxfXS4OYgudGxBYRuTv0q7AM6yMEpU/Vo1I94thg9U6EZ2NfZx9GJq83u7w==}
557
+
caniuse-lite@1.0.30001737:
558
+
resolution: {integrity: sha512-BiloLiXtQNrY5UyF0+1nSJLXUENuhka2pzy2Fx5pGxqavdrxSCW4U6Pn/PoG3Efspi2frRbHpBV2XsrPE6EDlw==}
559
559
560
560
convert-source-map@2.0.0:
561
561
resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==}
···
572
572
supports-color:
573
573
optional: true
574
574
575
-
electron-to-chromium@1.5.207:
576
-
resolution: {integrity: sha512-mryFrrL/GXDTmAtIVMVf+eIXM09BBPlO5IQ7lUyKmK8d+A4VpRGG+M3ofoVef6qyF8s60rJei8ymlJxjUA8Faw==}
575
+
electron-to-chromium@1.5.208:
576
+
resolution: {integrity: sha512-ozZyibehoe7tOhNaf16lKmljVf+3npZcJIEbJRVftVsmAg5TeA1mGS9dVCZzOwr2xT7xK15V0p7+GZqSPgkuPg==}
577
577
578
578
entities@6.0.1:
579
579
resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==}
···
671
671
engines: {node: '>=14'}
672
672
hasBin: true
673
673
674
-
rollup@4.46.3:
675
-
resolution: {integrity: sha512-RZn2XTjXb8t5g13f5YclGoilU/kwT696DIkY3sywjdZidNSi3+vseaQov7D7BZXVJCPv3pDWUN69C78GGbXsKw==}
674
+
rollup@4.47.1:
675
+
resolution: {integrity: sha512-iasGAQoZ5dWDzULEUX3jiW0oB1qyFOepSyDyoU6S/OhVlDIwj5knI5QBa5RRQ0sK7OE0v+8VIi2JuV+G+3tfNg==}
676
676
engines: {node: '>=18.0.0', npm: '>=8.0.0'}
677
677
hasBin: true
678
678
···
803
803
'@atcute/client@4.0.3':
804
804
dependencies:
805
805
'@atcute/identity': 1.0.3
806
-
'@atcute/lexicons': 1.1.0
806
+
'@atcute/lexicons': 1.1.1
807
807
808
808
'@atcute/identity-resolver@1.1.3(@atcute/identity@1.0.3)':
809
809
dependencies:
810
810
'@atcute/identity': 1.0.3
811
-
'@atcute/lexicons': 1.1.0
811
+
'@atcute/lexicons': 1.1.1
812
812
'@atcute/util-fetch': 1.0.1
813
813
'@badrap/valita': 0.4.6
814
814
815
815
'@atcute/identity@1.0.3':
816
816
dependencies:
817
-
'@atcute/lexicons': 1.1.0
817
+
'@atcute/lexicons': 1.1.1
818
818
'@badrap/valita': 0.4.6
819
819
820
-
'@atcute/lexicons@1.1.0':
820
+
'@atcute/lexicons@1.1.1':
821
821
dependencies:
822
822
esm-env: 1.2.2
823
823
···
829
829
dependencies:
830
830
'@atcute/client': 4.0.3
831
831
'@atcute/identity': 1.0.3
832
-
'@atcute/lexicons': 1.1.0
832
+
'@atcute/lexicons': 1.1.1
833
833
'@atcute/multibase': 1.1.4
834
834
'@atcute/uint8array': 1.0.3
835
835
nanoid: 5.1.5
···
1054
1054
1055
1055
'@nothing-but/utils@0.17.0': {}
1056
1056
1057
-
'@rollup/rollup-android-arm-eabi@4.46.3':
1057
+
'@rollup/rollup-android-arm-eabi@4.47.1':
1058
1058
optional: true
1059
1059
1060
-
'@rollup/rollup-android-arm64@4.46.3':
1060
+
'@rollup/rollup-android-arm64@4.47.1':
1061
1061
optional: true
1062
1062
1063
-
'@rollup/rollup-darwin-arm64@4.46.3':
1063
+
'@rollup/rollup-darwin-arm64@4.47.1':
1064
1064
optional: true
1065
1065
1066
-
'@rollup/rollup-darwin-x64@4.46.3':
1066
+
'@rollup/rollup-darwin-x64@4.47.1':
1067
1067
optional: true
1068
1068
1069
-
'@rollup/rollup-freebsd-arm64@4.46.3':
1069
+
'@rollup/rollup-freebsd-arm64@4.47.1':
1070
1070
optional: true
1071
1071
1072
-
'@rollup/rollup-freebsd-x64@4.46.3':
1072
+
'@rollup/rollup-freebsd-x64@4.47.1':
1073
1073
optional: true
1074
1074
1075
-
'@rollup/rollup-linux-arm-gnueabihf@4.46.3':
1075
+
'@rollup/rollup-linux-arm-gnueabihf@4.47.1':
1076
1076
optional: true
1077
1077
1078
-
'@rollup/rollup-linux-arm-musleabihf@4.46.3':
1078
+
'@rollup/rollup-linux-arm-musleabihf@4.47.1':
1079
1079
optional: true
1080
1080
1081
-
'@rollup/rollup-linux-arm64-gnu@4.46.3':
1081
+
'@rollup/rollup-linux-arm64-gnu@4.47.1':
1082
1082
optional: true
1083
1083
1084
-
'@rollup/rollup-linux-arm64-musl@4.46.3':
1084
+
'@rollup/rollup-linux-arm64-musl@4.47.1':
1085
1085
optional: true
1086
1086
1087
-
'@rollup/rollup-linux-loongarch64-gnu@4.46.3':
1087
+
'@rollup/rollup-linux-loongarch64-gnu@4.47.1':
1088
1088
optional: true
1089
1089
1090
-
'@rollup/rollup-linux-ppc64-gnu@4.46.3':
1090
+
'@rollup/rollup-linux-ppc64-gnu@4.47.1':
1091
1091
optional: true
1092
1092
1093
-
'@rollup/rollup-linux-riscv64-gnu@4.46.3':
1093
+
'@rollup/rollup-linux-riscv64-gnu@4.47.1':
1094
1094
optional: true
1095
1095
1096
-
'@rollup/rollup-linux-riscv64-musl@4.46.3':
1096
+
'@rollup/rollup-linux-riscv64-musl@4.47.1':
1097
1097
optional: true
1098
1098
1099
-
'@rollup/rollup-linux-s390x-gnu@4.46.3':
1099
+
'@rollup/rollup-linux-s390x-gnu@4.47.1':
1100
1100
optional: true
1101
1101
1102
-
'@rollup/rollup-linux-x64-gnu@4.46.3':
1102
+
'@rollup/rollup-linux-x64-gnu@4.47.1':
1103
1103
optional: true
1104
1104
1105
-
'@rollup/rollup-linux-x64-musl@4.46.3':
1105
+
'@rollup/rollup-linux-x64-musl@4.47.1':
1106
1106
optional: true
1107
1107
1108
-
'@rollup/rollup-win32-arm64-msvc@4.46.3':
1108
+
'@rollup/rollup-win32-arm64-msvc@4.47.1':
1109
1109
optional: true
1110
1110
1111
-
'@rollup/rollup-win32-ia32-msvc@4.46.3':
1111
+
'@rollup/rollup-win32-ia32-msvc@4.47.1':
1112
1112
optional: true
1113
1113
1114
-
'@rollup/rollup-win32-x64-msvc@4.46.3':
1114
+
'@rollup/rollup-win32-x64-msvc@4.47.1':
1115
1115
optional: true
1116
1116
1117
1117
'@solid-devtools/debugger@0.28.1(solid-js@1.9.9)':
···
1255
1255
1256
1256
browserslist@4.25.3:
1257
1257
dependencies:
1258
-
caniuse-lite: 1.0.30001735
1259
-
electron-to-chromium: 1.5.207
1258
+
caniuse-lite: 1.0.30001737
1259
+
electron-to-chromium: 1.5.208
1260
1260
node-releases: 2.0.19
1261
1261
update-browserslist-db: 1.1.3(browserslist@4.25.3)
1262
1262
1263
-
caniuse-lite@1.0.30001735: {}
1263
+
caniuse-lite@1.0.30001737: {}
1264
1264
1265
1265
convert-source-map@2.0.0: {}
1266
1266
···
1270
1270
dependencies:
1271
1271
ms: 2.1.3
1272
1272
1273
-
electron-to-chromium@1.5.207: {}
1273
+
electron-to-chromium@1.5.208: {}
1274
1274
1275
1275
entities@6.0.1: {}
1276
1276
···
1358
1358
1359
1359
prettier@3.6.2: {}
1360
1360
1361
-
rollup@4.46.3:
1361
+
rollup@4.47.1:
1362
1362
dependencies:
1363
1363
'@types/estree': 1.0.8
1364
1364
optionalDependencies:
1365
-
'@rollup/rollup-android-arm-eabi': 4.46.3
1366
-
'@rollup/rollup-android-arm64': 4.46.3
1367
-
'@rollup/rollup-darwin-arm64': 4.46.3
1368
-
'@rollup/rollup-darwin-x64': 4.46.3
1369
-
'@rollup/rollup-freebsd-arm64': 4.46.3
1370
-
'@rollup/rollup-freebsd-x64': 4.46.3
1371
-
'@rollup/rollup-linux-arm-gnueabihf': 4.46.3
1372
-
'@rollup/rollup-linux-arm-musleabihf': 4.46.3
1373
-
'@rollup/rollup-linux-arm64-gnu': 4.46.3
1374
-
'@rollup/rollup-linux-arm64-musl': 4.46.3
1375
-
'@rollup/rollup-linux-loongarch64-gnu': 4.46.3
1376
-
'@rollup/rollup-linux-ppc64-gnu': 4.46.3
1377
-
'@rollup/rollup-linux-riscv64-gnu': 4.46.3
1378
-
'@rollup/rollup-linux-riscv64-musl': 4.46.3
1379
-
'@rollup/rollup-linux-s390x-gnu': 4.46.3
1380
-
'@rollup/rollup-linux-x64-gnu': 4.46.3
1381
-
'@rollup/rollup-linux-x64-musl': 4.46.3
1382
-
'@rollup/rollup-win32-arm64-msvc': 4.46.3
1383
-
'@rollup/rollup-win32-ia32-msvc': 4.46.3
1384
-
'@rollup/rollup-win32-x64-msvc': 4.46.3
1365
+
'@rollup/rollup-android-arm-eabi': 4.47.1
1366
+
'@rollup/rollup-android-arm64': 4.47.1
1367
+
'@rollup/rollup-darwin-arm64': 4.47.1
1368
+
'@rollup/rollup-darwin-x64': 4.47.1
1369
+
'@rollup/rollup-freebsd-arm64': 4.47.1
1370
+
'@rollup/rollup-freebsd-x64': 4.47.1
1371
+
'@rollup/rollup-linux-arm-gnueabihf': 4.47.1
1372
+
'@rollup/rollup-linux-arm-musleabihf': 4.47.1
1373
+
'@rollup/rollup-linux-arm64-gnu': 4.47.1
1374
+
'@rollup/rollup-linux-arm64-musl': 4.47.1
1375
+
'@rollup/rollup-linux-loongarch64-gnu': 4.47.1
1376
+
'@rollup/rollup-linux-ppc64-gnu': 4.47.1
1377
+
'@rollup/rollup-linux-riscv64-gnu': 4.47.1
1378
+
'@rollup/rollup-linux-riscv64-musl': 4.47.1
1379
+
'@rollup/rollup-linux-s390x-gnu': 4.47.1
1380
+
'@rollup/rollup-linux-x64-gnu': 4.47.1
1381
+
'@rollup/rollup-linux-x64-musl': 4.47.1
1382
+
'@rollup/rollup-win32-arm64-msvc': 4.47.1
1383
+
'@rollup/rollup-win32-ia32-msvc': 4.47.1
1384
+
'@rollup/rollup-win32-x64-msvc': 4.47.1
1385
1385
fsevents: 2.3.3
1386
1386
1387
1387
semver@6.3.1: {}
···
1458
1458
fdir: 6.5.0(picomatch@4.0.3)
1459
1459
picomatch: 4.0.3
1460
1460
postcss: 8.5.6
1461
-
rollup: 4.46.3
1461
+
rollup: 4.47.1
1462
1462
tinyglobby: 0.2.14
1463
1463
optionalDependencies:
1464
1464
'@types/node': 24.3.0
-12
frontend/public/oauth/client-metadata.json
-12
frontend/public/oauth/client-metadata.json
···
1
-
{
2
-
"client_id": "https://clippr.social/oauth/client-metadata.json",
3
-
"client_name": "Clippr",
4
-
"client_uri": "https://clippr.social",
5
-
"redirect_uris": ["https://clippr.social/"],
6
-
"scope": "atproto blob?accept=image/* repo:social.clippr.actor.profile repo:social.clippr.feed.clip repo:social.clippr.feed.tag",
7
-
"grant_types": ["authorization_code", "refresh_token"],
8
-
"response_types": ["code"],
9
-
"token_endpoint_auth_method": "none",
10
-
"application_type": "web",
11
-
"dpop_bound_access_tokens": true
12
-
}
+12
frontend/public/oauth-client-metadata.json
+12
frontend/public/oauth-client-metadata.json
···
1
+
{
2
+
"client_id": "https://clippr.social/oauth/client-metadata.json",
3
+
"client_name": "Clippr",
4
+
"client_uri": "https://clippr.social",
5
+
"redirect_uris": ["https://clippr.social/"],
6
+
"scope": "atproto blob?accept=image/* repo:social.clippr.actor.profile repo:social.clippr.feed.clip repo:social.clippr.feed.tag",
7
+
"grant_types": ["authorization_code", "refresh_token"],
8
+
"response_types": ["code"],
9
+
"token_endpoint_auth_method": "none",
10
+
"application_type": "web",
11
+
"dpop_bound_access_tokens": true
12
+
}
+6
-1
frontend/src/components/profileEditor.tsx
+6
-1
frontend/src/components/profileEditor.tsx
···
146
146
accept=".jpg,.jpeg,.png,image/jpeg,image/png"
147
147
onChange={() => uploadBlob()}
148
148
/>
149
-
<img class="profile-picture" src={avatarPreview()} alt="The user's uploaded avatar." hidden={avatarPreview() === ""} />
149
+
<img
150
+
class="profile-picture"
151
+
src={avatarPreview()}
152
+
alt="The user's uploaded avatar."
153
+
hidden={avatarPreview() === ""}
154
+
/>
150
155
<label for="displayName">display name</label>
151
156
<input
152
157
type="text"
+1
-8
frontend/src/components/profileWidget.tsx
+1
-8
frontend/src/components/profileWidget.tsx
···
4
4
* SPDX-License-Identifier: AGPL-3.0-only
5
5
*/
6
6
7
-
import {
8
-
createResource,
9
-
Match,
10
-
Show,
11
-
splitProps,
12
-
Switch,
13
-
} from "solid-js";
7
+
import { createResource, Match, Show, splitProps, Switch } from "solid-js";
14
8
import { agent } from "./loginForm.tsx";
15
9
import { fetchProfile } from "../utils/profile.ts";
16
10
···
21
15
const ProfileWidget = (props: ProfileProps) => {
22
16
const [local] = splitProps(props, ["actor"]);
23
17
const actor = () => local.actor ?? agent.session.info.sub;
24
-
25
18
26
19
const [profile] = createResource(actor, fetchProfile);
27
20
+6
-6
frontend/src/styles/index.css
+6
-6
frontend/src/styles/index.css
···
13
13
:root {
14
14
--bg: #222 !important;
15
15
--fg: #fff !important;
16
-
--controls-bg: #2B2A33 !important;
17
-
--controls-bg-hover: #52525E !important;
18
-
--controls-border: #8F8F9D !important;
16
+
--controls-bg: #2b2a33 !important;
17
+
--controls-bg-hover: #52525e !important;
18
+
--controls-border: #8f8f9d !important;
19
19
}
20
20
}
21
21
···
23
23
:root {
24
24
--bg: #fff !important;
25
25
--fg: #222 !important;
26
-
--controls-bg: #E9E9ED !important;
27
-
--controls-bg-hover: #D0D0D7 !important;
28
-
--controls-border: #8F8F9D !important;
26
+
--controls-bg: #e9e9ed !important;
27
+
--controls-bg-hover: #d0d0d7 !important;
28
+
--controls-border: #8f8f9d !important;
29
29
}
30
30
}
31
31
+1
-1
frontend/src/types.ts
+1
-1
frontend/src/types.ts
+19
frontend/src/utils/client.ts
+19
frontend/src/utils/client.ts
···
1
+
/*
2
+
* clippr: a social bookmarking service for the AT Protocol
3
+
* Copyright (c) 2025 clippr contributors.
4
+
* SPDX-License-Identifier: AGPL-3.0-only
5
+
*/
6
+
7
+
import { ServiceProxyOptions } from "@atcute/client";
8
+
9
+
// Converts the AppView environment variable into options for the client's server proxy options.
10
+
export const createServiceProxy = (): ServiceProxyOptions | undefined => {
11
+
const appviewUrl = import.meta.env.VITE_CLIPPR_APPVIEW;
12
+
if (appviewUrl.includes("localhost:")) return undefined; // TODO: You can't do PDS proxying if you're testing locally!!!
13
+
let sanitizedUrl = appviewUrl.replace(/^(https?:\/\/)/, "did:web:");
14
+
15
+
return {
16
+
did: sanitizedUrl as `did:${string}:${string}`,
17
+
serviceId: "#clippr_appview",
18
+
};
19
+
};
+1
-1
frontend/vite.config.ts
+1
-1
frontend/vite.config.ts
···
6
6
7
7
import { defineConfig } from "vite";
8
8
import solidPlugin from "vite-plugin-solid";
9
-
import metadata from "./public/oauth/client-metadata.json";
9
+
import metadata from "./public/oauth-client-metadata.json";
10
10
import { devtoolsPlugin } from "solid-devtools/vite";
11
11
12
12
const SERVER_HOST = "127.0.0.1";
+21
lexdocs/LICENSE
+21
lexdocs/LICENSE
···
1
+
MIT License
2
+
3
+
Copyright (c) 2025 clippr contributors
4
+
5
+
Permission is hereby granted, free of charge, to any person obtaining a copy
6
+
of this software and associated documentation files (the "Software"), to deal
7
+
in the Software without restriction, including without limitation the rights
8
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+
copies of the Software, and to permit persons to whom the Software is
10
+
furnished to do so, subject to the following conditions:
11
+
12
+
The above copyright notice and this permission notice shall be included in all
13
+
copies or substantial portions of the Software.
14
+
15
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+
SOFTWARE.
+7
lexicons/CHANGELOG.md
+7
lexicons/CHANGELOG.md
···
1
1
# changelog for @clipprjs/lexicons
2
2
3
+
## v1.0.3
4
+
5
+
* add ``social.clippr.feed.getTagClips`` query
6
+
* make query parameter required for ``social.clippr.actor.searchProfiles``
7
+
* improved lexicon documentation
8
+
3
9
## v1.0.2
10
+
4
11
* fix some description typos
5
12
* fix `social.clippr.feed.getTags` not existing due to an ID collision
6
13
+1
-1
lexicons/README.md
+1
-1
lexicons/README.md
+1
-6
lexicons/lib/lexicons/index.ts
+1
-6
lexicons/lib/lexicons/index.ts
···
1
-
/*
2
-
* clippr: a social bookmarking service for the AT Protocol
3
-
* Copyright (c) 2025 clippr contributors.
4
-
* SPDX-License-Identifier: AGPL-3.0-only
5
-
*/
6
-
7
1
export * as SocialClipprActorDefs from "./types/social/clippr/actor/defs.js";
8
2
export * as SocialClipprActorGetPreferences from "./types/social/clippr/actor/getPreferences.js";
9
3
export * as SocialClipprActorGetProfile from "./types/social/clippr/actor/getProfile.js";
···
17
11
export * as SocialClipprFeedGetClips from "./types/social/clippr/feed/getClips.js";
18
12
export * as SocialClipprFeedGetProfileClips from "./types/social/clippr/feed/getProfileClips.js";
19
13
export * as SocialClipprFeedGetProfileTags from "./types/social/clippr/feed/getProfileTags.js";
14
+
export * as SocialClipprFeedGetTagClips from "./types/social/clippr/feed/getTagClips.js";
20
15
export * as SocialClipprFeedGetTagList from "./types/social/clippr/feed/getTagList.js";
21
16
export * as SocialClipprFeedGetTags from "./types/social/clippr/feed/getTags.js";
22
17
export * as SocialClipprFeedTag from "./types/social/clippr/feed/tag.js";
+4
-4
lexicons/package.json
+4
-4
lexicons/package.json
···
1
1
{
2
2
"type": "module",
3
3
"name": "@clipprjs/lexicons",
4
-
"version": "1.0.2",
4
+
"version": "1.0.3",
5
5
"description": "Clippr schema definitions",
6
6
"license": "AGPL-3.0-only",
7
7
"private": false,
···
29
29
"prepublish": "rm -rf dist; pnpm run build"
30
30
},
31
31
"dependencies": {
32
-
"@atcute/atproto": "^3.1.1",
33
-
"@atcute/lexicons": "^1.1.0"
32
+
"@atcute/atproto": "^3.1.2",
33
+
"@atcute/lexicons": "^1.1.1"
34
34
},
35
35
"devDependencies": {
36
36
"@atcute/lex-cli": "^2.1.1",
37
-
"typescript": "^5.8.3"
37
+
"typescript": "^5.9.2"
38
38
}
39
39
}
+24
-24
lexicons/pnpm-lock.yaml
+24
-24
lexicons/pnpm-lock.yaml
···
9
9
.:
10
10
dependencies:
11
11
'@atcute/atproto':
12
-
specifier: ^3.1.1
13
-
version: 3.1.1
12
+
specifier: ^3.1.2
13
+
version: 3.1.2
14
14
'@atcute/lexicons':
15
-
specifier: ^1.1.0
16
-
version: 1.1.0
15
+
specifier: ^1.1.1
16
+
version: 1.1.1
17
17
devDependencies:
18
18
'@atcute/lex-cli':
19
19
specifier: ^2.1.1
20
20
version: 2.1.1
21
21
typescript:
22
-
specifier: ^5.8.3
23
-
version: 5.8.3
22
+
specifier: ^5.9.2
23
+
version: 5.9.2
24
24
25
25
packages:
26
26
27
-
'@atcute/atproto@3.1.1':
28
-
resolution: {integrity: sha512-D+RLTIPF0xLu7BPZY8KSewAPemJFh+3n3zeQ3ROsLxbTtCHbrTDMAmAFexaVRAPGcPYrwXaBUlv7yZjScJolMg==}
27
+
'@atcute/atproto@3.1.2':
28
+
resolution: {integrity: sha512-m6OWoGTeL8Wlw7cm8Nrf+NU24rlx5A0DzxEQQPPu1wqYNHw6S33nOU90W+U09vVN0aZGZUrLFfWWhAaSWTp1ZQ==}
29
29
30
30
'@atcute/lex-cli@2.1.1':
31
31
resolution: {integrity: sha512-QaR0sOP8Z24opGHKsSfleDbP/ahUb6HECkVaOqSwG7ORZzbLK1w0265o1BRjCVr2dT6FxlsMUa2Ge85JMA9bxg==}
···
34
34
'@atcute/lexicon-doc@1.0.3':
35
35
resolution: {integrity: sha512-U7rinsTOwXGGcrF6/s7GzTXargcQpDr4BTrj5ci/XTK+POEK5jpcI+Ag1fF932pBX3k97em6y4TWwTSO8M/McQ==}
36
36
37
-
'@atcute/lexicons@1.1.0':
38
-
resolution: {integrity: sha512-LFqwnria78xLYb62Ri/+WwQpUTgZp2DuyolNGIIOV1dpiKhFFFh//nscHMA6IExFLQRqWDs3tTjy7zv0h3sf1Q==}
37
+
'@atcute/lexicons@1.1.1':
38
+
resolution: {integrity: sha512-k6qy5p3j9fJJ6ekaMPfEfp3ni4TW/XNuH9ZmsuwC0fi0tOjp+Fa8ZQakHwnqOzFt/cVBfGcmYE/lKNAbeTjgUg==}
39
39
40
-
'@badrap/valita@0.4.5':
41
-
resolution: {integrity: sha512-4QwGbuhh/JesHRQj79mO/l37PvJj4l/tlAu7+S1n4h47qwaNpZ0WDvIwUGLYUsdi9uQ5UPpiG9wb1Wm3XUFBUQ==}
40
+
'@badrap/valita@0.4.6':
41
+
resolution: {integrity: sha512-4kdqcjyxo/8RQ8ayjms47HCWZIF5981oE5nIenbfThKDxWXtEHKipAOWlflpPJzZx9y/JWYQkp18Awr7VuepFg==}
42
42
engines: {node: '>= 18'}
43
43
44
44
'@externdefs/collider@0.3.0':
···
57
57
engines: {node: '>=14'}
58
58
hasBin: true
59
59
60
-
typescript@5.8.3:
61
-
resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==}
60
+
typescript@5.9.2:
61
+
resolution: {integrity: sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==}
62
62
engines: {node: '>=14.17'}
63
63
hasBin: true
64
64
65
65
snapshots:
66
66
67
-
'@atcute/atproto@3.1.1':
67
+
'@atcute/atproto@3.1.2':
68
68
dependencies:
69
-
'@atcute/lexicons': 1.1.0
69
+
'@atcute/lexicons': 1.1.1
70
70
71
71
'@atcute/lex-cli@2.1.1':
72
72
dependencies:
73
73
'@atcute/lexicon-doc': 1.0.3
74
-
'@badrap/valita': 0.4.5
75
-
'@externdefs/collider': 0.3.0(@badrap/valita@0.4.5)
74
+
'@badrap/valita': 0.4.6
75
+
'@externdefs/collider': 0.3.0(@badrap/valita@0.4.6)
76
76
picocolors: 1.1.1
77
77
prettier: 3.6.2
78
78
79
79
'@atcute/lexicon-doc@1.0.3':
80
80
dependencies:
81
-
'@badrap/valita': 0.4.5
81
+
'@badrap/valita': 0.4.6
82
82
83
-
'@atcute/lexicons@1.1.0':
83
+
'@atcute/lexicons@1.1.1':
84
84
dependencies:
85
85
esm-env: 1.2.2
86
86
87
-
'@badrap/valita@0.4.5': {}
87
+
'@badrap/valita@0.4.6': {}
88
88
89
-
'@externdefs/collider@0.3.0(@badrap/valita@0.4.5)':
89
+
'@externdefs/collider@0.3.0(@badrap/valita@0.4.6)':
90
90
dependencies:
91
-
'@badrap/valita': 0.4.5
91
+
'@badrap/valita': 0.4.6
92
92
93
93
esm-env@1.2.2: {}
94
94
···
96
96
97
97
prettier@3.6.2: {}
98
98
99
-
typescript@5.8.3: {}
99
+
typescript@5.9.2: {}
+10
package.json
+10
package.json
+24
pnpm-lock.yaml
+24
pnpm-lock.yaml
···
1
+
lockfileVersion: '9.0'
2
+
3
+
settings:
4
+
autoInstallPeers: true
5
+
excludeLinksFromLockfile: false
6
+
7
+
importers:
8
+
9
+
.:
10
+
devDependencies:
11
+
husky:
12
+
specifier: ^9.1.7
13
+
version: 9.1.7
14
+
15
+
packages:
16
+
17
+
husky@9.1.7:
18
+
resolution: {integrity: sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==}
19
+
engines: {node: '>=18'}
20
+
hasBin: true
21
+
22
+
snapshots:
23
+
24
+
husky@9.1.7: {}