tangled
alpha
login
or
join now
finxol.io
/
bookmarker
0
fork
atom
A very simple bookmarking webapp
bookmarker.finxol.deno.net/
0
fork
atom
overview
issues
pulls
pipelines
feat: add bookmark edit api route
finxol.io
1 month ago
5e0f4fcf
26f92754
verified
This commit was signed with the committer's
known signature
.
finxol.io
SSH Key Fingerprint:
SHA256:olFE3asYdoBMScuJOt60UxXdJ0RFdGv5kVKrdOtIcPI=
+85
-207
4 changed files
expand all
collapse all
unified
split
deno.json
deno.lock
server
routes
bookmarks.ts
utils
bookmarks.ts
+1
deno.json
···
10
"imports": {
11
"@arkenv/vite-plugin": "npm:@arkenv/vite-plugin@^0.0.29",
12
"@evilmartians/harmony": "npm:@evilmartians/harmony@^1.4.0",
0
13
"@hono/ua-blocker": "npm:@hono/ua-blocker@^0.1.24",
14
"@openauthjs/openauth": "npm:@openauthjs/openauth@^0.4.3",
15
"@std/assert": "jsr:@std/assert@1",
···
10
"imports": {
11
"@arkenv/vite-plugin": "npm:@arkenv/vite-plugin@^0.0.29",
12
"@evilmartians/harmony": "npm:@evilmartians/harmony@^1.4.0",
13
+
"@hono/arktype-validator": "npm:@hono/arktype-validator@^2.0.1",
14
"@hono/ua-blocker": "npm:@hono/ua-blocker@^0.1.24",
15
"@openauthjs/openauth": "npm:@openauthjs/openauth@^0.4.3",
16
"@std/assert": "jsr:@std/assert@1",
+35
-201
deno.lock
···
14
"jsr:@std/net@^1.0.6": "1.0.6",
15
"jsr:@std/path@^1.1.4": "1.1.4",
16
"jsr:@std/streams@^1.0.17": "1.0.17",
17
-
"npm:@arkenv/vite-plugin@^0.0.29": "0.0.29_arktype@2.1.29_vite@7.3.1__picomatch@4.0.3",
18
"npm:@evilmartians/harmony@^1.4.0": "1.4.0",
0
19
"npm:@hono/ua-blocker@~0.1.24": "0.1.24_hono@4.9.8",
20
"npm:@openauthjs/openauth@~0.4.3": "0.4.3_arctic@2.3.4_hono@4.9.8",
21
-
"npm:@tanstack/router-plugin@^1.158.1": "1.158.1_vite@7.3.1__picomatch@4.0.3_vite-plugin-solid@2.11.10__solid-js@1.9.11___seroval@1.5.0__vite@7.3.1___picomatch@4.0.3__@babel+core@7.29.0_@babel+core@7.29.0_solid-js@1.9.11__seroval@1.5.0",
22
"npm:@tanstack/solid-query@^5.90.23": "5.90.23_solid-js@1.9.11__seroval@1.5.0",
23
"npm:@tanstack/solid-router@^1.158.1": "1.158.1_solid-js@1.9.11__seroval@1.5.0",
24
"npm:arkenv@~0.9.2": "0.9.2_arktype@2.1.29",
···
33
"npm:solid-js@^1.9.11": "1.9.11_seroval@1.5.0",
34
"npm:temporal-polyfill@0.3": "0.3.0",
35
"npm:tidy-url@^1.18.3": "1.18.3",
36
-
"npm:vite-plugin-pwa@^1.2.0": "1.2.0_vite@7.3.1__picomatch@4.0.3_workbox-build@7.4.0__ajv@8.17.1__@babel+core@7.29.0__rollup@2.79.2_workbox-window@7.4.0",
37
-
"npm:vite-plugin-solid@^2.11.10": "2.11.10_solid-js@1.9.11__seroval@1.5.0_vite@7.3.1__picomatch@4.0.3_@babel+core@7.29.0",
38
"npm:vite@^8.0.0-beta.13": "8.0.0-beta.13_picomatch@4.0.3"
39
},
40
"jsr": {
···
111
"@ark/util@0.56.0": {
112
"integrity": "sha512-BghfRC8b9pNs3vBoDJhcta0/c1J1rsoS1+HgVUreMFPdhz/CRAKReAu57YEllNaSy98rWAdY1gE+gFup7OXpgA=="
113
},
114
-
"@arkenv/vite-plugin@0.0.29_arktype@2.1.29_vite@7.3.1__picomatch@4.0.3": {
115
"integrity": "sha512-88hoQ9/Ro6HpII3JucuPGdw/t8xzRlH2asNz8TBgG4/exbyTB4GyydDcfjLwJbDB0YElBtJdBmKxtndabWzmfg==",
116
"dependencies": [
117
"arkenv",
118
"arktype",
119
-
"vite@7.3.1_picomatch@4.0.3"
120
]
121
},
122
"@babel/code-frame@7.29.0": {
···
1051
"@evilmartians/harmony@1.4.0": {
1052
"integrity": "sha512-NgKkhTnQOSE07IvDxHHPLzFF81TaWU1Ir5nmaRM+PebXAol5vNXnk+Lp2JPgj1P/PBTu6lzSWckSpNjC19XSUw=="
1053
},
0
0
0
0
0
0
0
1054
"@hono/ua-blocker@0.1.24_hono@4.9.8": {
1055
"integrity": "sha512-rdEx83ssuEm5rcB69vndUQ37GTtucPakmSt0UmXd0ICTbDiQflTQzhtBR5HlTAWpa7eNkdEOA8bmqUMtnwdA6Q==",
1056
"dependencies": [
···
1234
"@babel/core",
1235
"@babel/helper-module-imports@7.28.6",
1236
"@rollup/pluginutils@3.1.0_rollup@2.79.2",
1237
-
"rollup@2.79.2"
1238
]
1239
},
1240
"@rollup/plugin-node-resolve@15.3.1_rollup@2.79.2": {
···
1245
"deepmerge",
1246
"is-module",
1247
"resolve",
1248
-
"rollup@2.79.2"
1249
],
1250
"optionalPeers": [
1251
-
"rollup@2.79.2"
1252
]
1253
},
1254
"@rollup/plugin-replace@2.4.2_rollup@2.79.2": {
···
1256
"dependencies": [
1257
"@rollup/pluginutils@3.1.0_rollup@2.79.2",
1258
"magic-string",
1259
-
"rollup@2.79.2"
1260
]
1261
},
1262
"@rollup/plugin-terser@0.4.4_rollup@2.79.2": {
1263
"integrity": "sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==",
1264
"dependencies": [
1265
-
"rollup@2.79.2",
1266
"serialize-javascript",
1267
"smob",
1268
"terser"
1269
],
1270
"optionalPeers": [
1271
-
"rollup@2.79.2"
1272
]
1273
},
1274
"@rollup/pluginutils@3.1.0_rollup@2.79.2": {
···
1277
"@types/estree@0.0.39",
1278
"estree-walker@1.0.1",
1279
"picomatch@2.3.1",
1280
-
"rollup@2.79.2"
1281
]
1282
},
1283
"@rollup/pluginutils@5.3.0_rollup@2.79.2": {
···
1286
"@types/estree@1.0.8",
1287
"estree-walker@2.0.2",
1288
"picomatch@4.0.3",
1289
-
"rollup@2.79.2"
1290
],
1291
"optionalPeers": [
1292
-
"rollup@2.79.2"
1293
]
1294
},
1295
-
"@rollup/rollup-android-arm-eabi@4.57.1": {
1296
-
"integrity": "sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg==",
1297
-
"os": ["android"],
1298
-
"cpu": ["arm"]
1299
-
},
1300
-
"@rollup/rollup-android-arm64@4.57.1": {
1301
-
"integrity": "sha512-dQaAddCY9YgkFHZcFNS/606Exo8vcLHwArFZ7vxXq4rigo2bb494/xKMMwRRQW6ug7Js6yXmBZhSBRuBvCCQ3w==",
1302
-
"os": ["android"],
1303
-
"cpu": ["arm64"]
1304
-
},
1305
-
"@rollup/rollup-darwin-arm64@4.57.1": {
1306
-
"integrity": "sha512-crNPrwJOrRxagUYeMn/DZwqN88SDmwaJ8Cvi/TN1HnWBU7GwknckyosC2gd0IqYRsHDEnXf328o9/HC6OkPgOg==",
1307
-
"os": ["darwin"],
1308
-
"cpu": ["arm64"]
1309
-
},
1310
-
"@rollup/rollup-darwin-x64@4.57.1": {
1311
-
"integrity": "sha512-Ji8g8ChVbKrhFtig5QBV7iMaJrGtpHelkB3lsaKzadFBe58gmjfGXAOfI5FV0lYMH8wiqsxKQ1C9B0YTRXVy4w==",
1312
-
"os": ["darwin"],
1313
-
"cpu": ["x64"]
1314
-
},
1315
-
"@rollup/rollup-freebsd-arm64@4.57.1": {
1316
-
"integrity": "sha512-R+/WwhsjmwodAcz65guCGFRkMb4gKWTcIeLy60JJQbXrJ97BOXHxnkPFrP+YwFlaS0m+uWJTstrUA9o+UchFug==",
1317
-
"os": ["freebsd"],
1318
-
"cpu": ["arm64"]
1319
-
},
1320
-
"@rollup/rollup-freebsd-x64@4.57.1": {
1321
-
"integrity": "sha512-IEQTCHeiTOnAUC3IDQdzRAGj3jOAYNr9kBguI7MQAAZK3caezRrg0GxAb6Hchg4lxdZEI5Oq3iov/w/hnFWY9Q==",
1322
-
"os": ["freebsd"],
1323
-
"cpu": ["x64"]
1324
-
},
1325
-
"@rollup/rollup-linux-arm-gnueabihf@4.57.1": {
1326
-
"integrity": "sha512-F8sWbhZ7tyuEfsmOxwc2giKDQzN3+kuBLPwwZGyVkLlKGdV1nvnNwYD0fKQ8+XS6hp9nY7B+ZeK01EBUE7aHaw==",
1327
-
"os": ["linux"],
1328
-
"cpu": ["arm"]
1329
-
},
1330
-
"@rollup/rollup-linux-arm-musleabihf@4.57.1": {
1331
-
"integrity": "sha512-rGfNUfn0GIeXtBP1wL5MnzSj98+PZe/AXaGBCRmT0ts80lU5CATYGxXukeTX39XBKsxzFpEeK+Mrp9faXOlmrw==",
1332
-
"os": ["linux"],
1333
-
"cpu": ["arm"]
1334
-
},
1335
-
"@rollup/rollup-linux-arm64-gnu@4.57.1": {
1336
-
"integrity": "sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g==",
1337
-
"os": ["linux"],
1338
-
"cpu": ["arm64"]
1339
-
},
1340
-
"@rollup/rollup-linux-arm64-musl@4.57.1": {
1341
-
"integrity": "sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q==",
1342
-
"os": ["linux"],
1343
-
"cpu": ["arm64"]
1344
-
},
1345
-
"@rollup/rollup-linux-loong64-gnu@4.57.1": {
1346
-
"integrity": "sha512-QWO6RQTZ/cqYtJMtxhkRkidoNGXc7ERPbZN7dVW5SdURuLeVU7lwKMpo18XdcmpWYd0qsP1bwKPf7DNSUinhvA==",
1347
-
"os": ["linux"],
1348
-
"cpu": ["loong64"]
1349
-
},
1350
-
"@rollup/rollup-linux-loong64-musl@4.57.1": {
1351
-
"integrity": "sha512-xpObYIf+8gprgWaPP32xiN5RVTi/s5FCR+XMXSKmhfoJjrpRAjCuuqQXyxUa/eJTdAE6eJ+KDKaoEqjZQxh3Gw==",
1352
-
"os": ["linux"],
1353
-
"cpu": ["loong64"]
1354
-
},
1355
-
"@rollup/rollup-linux-ppc64-gnu@4.57.1": {
1356
-
"integrity": "sha512-4BrCgrpZo4hvzMDKRqEaW1zeecScDCR+2nZ86ATLhAoJ5FQ+lbHVD3ttKe74/c7tNT9c6F2viwB3ufwp01Oh2w==",
1357
-
"os": ["linux"],
1358
-
"cpu": ["ppc64"]
1359
-
},
1360
-
"@rollup/rollup-linux-ppc64-musl@4.57.1": {
1361
-
"integrity": "sha512-NOlUuzesGauESAyEYFSe3QTUguL+lvrN1HtwEEsU2rOwdUDeTMJdO5dUYl/2hKf9jWydJrO9OL/XSSf65R5+Xw==",
1362
-
"os": ["linux"],
1363
-
"cpu": ["ppc64"]
1364
-
},
1365
-
"@rollup/rollup-linux-riscv64-gnu@4.57.1": {
1366
-
"integrity": "sha512-ptA88htVp0AwUUqhVghwDIKlvJMD/fmL/wrQj99PRHFRAG6Z5nbWoWG4o81Nt9FT+IuqUQi+L31ZKAFeJ5Is+A==",
1367
-
"os": ["linux"],
1368
-
"cpu": ["riscv64"]
1369
-
},
1370
-
"@rollup/rollup-linux-riscv64-musl@4.57.1": {
1371
-
"integrity": "sha512-S51t7aMMTNdmAMPpBg7OOsTdn4tySRQvklmL3RpDRyknk87+Sp3xaumlatU+ppQ+5raY7sSTcC2beGgvhENfuw==",
1372
-
"os": ["linux"],
1373
-
"cpu": ["riscv64"]
1374
-
},
1375
-
"@rollup/rollup-linux-s390x-gnu@4.57.1": {
1376
-
"integrity": "sha512-Bl00OFnVFkL82FHbEqy3k5CUCKH6OEJL54KCyx2oqsmZnFTR8IoNqBF+mjQVcRCT5sB6yOvK8A37LNm/kPJiZg==",
1377
-
"os": ["linux"],
1378
-
"cpu": ["s390x"]
1379
-
},
1380
-
"@rollup/rollup-linux-x64-gnu@4.57.1": {
1381
-
"integrity": "sha512-ABca4ceT4N+Tv/GtotnWAeXZUZuM/9AQyCyKYyKnpk4yoA7QIAuBt6Hkgpw8kActYlew2mvckXkvx0FfoInnLg==",
1382
-
"os": ["linux"],
1383
-
"cpu": ["x64"]
1384
-
},
1385
-
"@rollup/rollup-linux-x64-musl@4.57.1": {
1386
-
"integrity": "sha512-HFps0JeGtuOR2convgRRkHCekD7j+gdAuXM+/i6kGzQtFhlCtQkpwtNzkNj6QhCDp7DRJ7+qC/1Vg2jt5iSOFw==",
1387
-
"os": ["linux"],
1388
-
"cpu": ["x64"]
1389
-
},
1390
-
"@rollup/rollup-openbsd-x64@4.57.1": {
1391
-
"integrity": "sha512-H+hXEv9gdVQuDTgnqD+SQffoWoc0Of59AStSzTEj/feWTBAnSfSD3+Dql1ZruJQxmykT/JVY0dE8Ka7z0DH1hw==",
1392
-
"os": ["openbsd"],
1393
-
"cpu": ["x64"]
1394
-
},
1395
-
"@rollup/rollup-openharmony-arm64@4.57.1": {
1396
-
"integrity": "sha512-4wYoDpNg6o/oPximyc/NG+mYUejZrCU2q+2w6YZqrAs2UcNUChIZXjtafAiiZSUc7On8v5NyNj34Kzj/Ltk6dQ==",
1397
-
"os": ["openharmony"],
1398
-
"cpu": ["arm64"]
1399
-
},
1400
-
"@rollup/rollup-win32-arm64-msvc@4.57.1": {
1401
-
"integrity": "sha512-O54mtsV/6LW3P8qdTcamQmuC990HDfR71lo44oZMZlXU4tzLrbvTii87Ni9opq60ds0YzuAlEr/GNwuNluZyMQ==",
1402
-
"os": ["win32"],
1403
-
"cpu": ["arm64"]
1404
-
},
1405
-
"@rollup/rollup-win32-ia32-msvc@4.57.1": {
1406
-
"integrity": "sha512-P3dLS+IerxCT/7D2q2FYcRdWRl22dNbrbBEtxdWhXrfIMPP9lQhb5h4Du04mdl5Woq05jVCDPCMF7Ub0NAjIew==",
1407
-
"os": ["win32"],
1408
-
"cpu": ["ia32"]
1409
-
},
1410
-
"@rollup/rollup-win32-x64-gnu@4.57.1": {
1411
-
"integrity": "sha512-VMBH2eOOaKGtIJYleXsi2B8CPVADrh+TyNxJ4mWPnKfLB/DBUmzW+5m1xUrcwWoMfSLagIRpjUFeW5CO5hyciQ==",
1412
-
"os": ["win32"],
1413
-
"cpu": ["x64"]
1414
-
},
1415
-
"@rollup/rollup-win32-x64-msvc@4.57.1": {
1416
-
"integrity": "sha512-mxRFDdHIWRxg3UfIIAwCm6NzvxG0jDX/wBN6KsQFTvKFqqg9vTrWUE68qEjHt19A5wwx5X5aUi2zuZT7YR0jrA==",
1417
-
"os": ["win32"],
1418
-
"cpu": ["x64"]
1419
-
},
1420
"@solid-devtools/debugger@0.28.1_solid-js@1.9.11__seroval@1.5.0": {
1421
"integrity": "sha512-6qIUI6VYkXoRnL8oF5bvh2KgH71qlJ18hNw/mwSyY6v48eb80ZR48/5PDXufUa3q+MBSuYa1uqTMwLewpay9eg==",
1422
"dependencies": [
···
1593
"zod"
1594
]
1595
},
1596
-
"@tanstack/router-plugin@1.158.1_vite@7.3.1__picomatch@4.0.3_vite-plugin-solid@2.11.10__solid-js@1.9.11___seroval@1.5.0__vite@7.3.1___picomatch@4.0.3__@babel+core@7.29.0_@babel+core@7.29.0_solid-js@1.9.11__seroval@1.5.0": {
1597
"integrity": "sha512-IPCnf1CBc0jnczuy65+3iBaoABv5TKhOJ1YLzwel4kb9D8Abcq0vF8ooR5FiPmaGnree/z3SvjgHe5eQtgcsSQ==",
1598
"dependencies": [
1599
"@babel/core",
···
1608
"@tanstack/virtual-file-routes",
1609
"chokidar",
1610
"unplugin",
1611
-
"vite@7.3.1_picomatch@4.0.3",
1612
"vite-plugin-solid",
1613
"zod"
1614
],
1615
"optionalPeers": [
1616
-
"vite@7.3.1_picomatch@4.0.3",
1617
"vite-plugin-solid"
1618
]
1619
},
···
3048
],
3049
"bin": true
3050
},
3051
-
"rollup@4.57.1": {
3052
-
"integrity": "sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A==",
3053
-
"dependencies": [
3054
-
"@types/estree@1.0.8"
3055
-
],
3056
-
"optionalDependencies": [
3057
-
"@rollup/rollup-android-arm-eabi",
3058
-
"@rollup/rollup-android-arm64",
3059
-
"@rollup/rollup-darwin-arm64",
3060
-
"@rollup/rollup-darwin-x64",
3061
-
"@rollup/rollup-freebsd-arm64",
3062
-
"@rollup/rollup-freebsd-x64",
3063
-
"@rollup/rollup-linux-arm-gnueabihf",
3064
-
"@rollup/rollup-linux-arm-musleabihf",
3065
-
"@rollup/rollup-linux-arm64-gnu",
3066
-
"@rollup/rollup-linux-arm64-musl",
3067
-
"@rollup/rollup-linux-loong64-gnu",
3068
-
"@rollup/rollup-linux-loong64-musl",
3069
-
"@rollup/rollup-linux-ppc64-gnu",
3070
-
"@rollup/rollup-linux-ppc64-musl",
3071
-
"@rollup/rollup-linux-riscv64-gnu",
3072
-
"@rollup/rollup-linux-riscv64-musl",
3073
-
"@rollup/rollup-linux-s390x-gnu",
3074
-
"@rollup/rollup-linux-x64-gnu",
3075
-
"@rollup/rollup-linux-x64-musl",
3076
-
"@rollup/rollup-openbsd-x64",
3077
-
"@rollup/rollup-openharmony-arm64",
3078
-
"@rollup/rollup-win32-arm64-msvc",
3079
-
"@rollup/rollup-win32-ia32-msvc",
3080
-
"@rollup/rollup-win32-x64-gnu",
3081
-
"@rollup/rollup-win32-x64-msvc",
3082
-
"fsevents"
3083
-
],
3084
-
"bin": true
3085
-
},
3086
"safe-array-concat@1.1.3": {
3087
"integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==",
3088
"dependencies": [
···
3499
"validate-html-nesting@1.2.3": {
3500
"integrity": "sha512-kdkWdCl6eCeLlRShJKbjVOU2kFKxMF8Ghu50n+crEoyx+VKm3FxAxF9z4DCy6+bbTOqNW0+jcIYRnjoIRzigRw=="
3501
},
3502
-
"vite-plugin-pwa@1.2.0_vite@7.3.1__picomatch@4.0.3_workbox-build@7.4.0__ajv@8.17.1__@babel+core@7.29.0__rollup@2.79.2_workbox-window@7.4.0": {
3503
"integrity": "sha512-a2xld+SJshT9Lgcv8Ji4+srFJL4k/1bVbd1x06JIkvecpQkwkvCncD1+gSzcdm3s+owWLpMJerG3aN5jupJEVw==",
3504
"dependencies": [
3505
"debug",
3506
"pretty-bytes@6.1.1",
3507
"tinyglobby",
3508
-
"vite@7.3.1_picomatch@4.0.3",
3509
"workbox-build",
3510
"workbox-window"
3511
]
3512
},
3513
-
"vite-plugin-solid@2.11.10_solid-js@1.9.11__seroval@1.5.0_vite@7.3.1__picomatch@4.0.3_@babel+core@7.29.0": {
3514
"integrity": "sha512-Yr1dQybmtDtDAHkii6hXuc1oVH9CPcS/Zb2jN/P36qqcrkNnVPsMTzQ06jyzFPFjj3U1IYKMVt/9ZqcwGCEbjw==",
3515
"dependencies": [
3516
"@babel/core",
···
3519
"merge-anything",
3520
"solid-js",
3521
"solid-refresh",
3522
-
"vite@7.3.1_picomatch@4.0.3",
3523
"vitefu"
3524
]
3525
},
3526
-
"vite@7.3.1_picomatch@4.0.3": {
3527
-
"integrity": "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==",
3528
-
"dependencies": [
3529
-
"esbuild",
3530
-
"fdir",
3531
-
"picomatch@4.0.3",
3532
-
"postcss",
3533
-
"rollup@4.57.1",
3534
-
"tinyglobby"
3535
-
],
3536
-
"optionalDependencies": [
3537
-
"fsevents"
3538
-
],
3539
-
"bin": true
3540
-
},
3541
"vite@8.0.0-beta.13_picomatch@4.0.3": {
3542
"integrity": "sha512-7s/rfpYOAo7WUHh9irzaGjhhKb12hGv0BpDegAMV5A391wdyvM45WtX6VMV7hvEtZF2j/QtpDpR6ldXI3GgARQ==",
3543
"dependencies": [
···
3554
],
3555
"bin": true
3556
},
3557
-
"vitefu@1.1.1_vite@7.3.1__picomatch@4.0.3": {
3558
"integrity": "sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ==",
3559
"dependencies": [
3560
-
"vite@7.3.1_picomatch@4.0.3"
3561
],
3562
"optionalPeers": [
3563
-
"vite@7.3.1_picomatch@4.0.3"
3564
]
3565
},
3566
"webidl-conversions@4.0.2": {
···
3665
"glob",
3666
"lodash",
3667
"pretty-bytes@5.6.0",
3668
-
"rollup@2.79.2",
3669
"source-map@0.8.0-beta.0",
3670
"stringify-object",
3671
"strip-comments",
···
3787
"jsr:@std/http@1",
3788
"npm:@arkenv/vite-plugin@^0.0.29",
3789
"npm:@evilmartians/harmony@^1.4.0",
0
3790
"npm:@hono/ua-blocker@~0.1.24",
3791
"npm:@openauthjs/openauth@~0.4.3",
3792
"npm:@tanstack/router-plugin@^1.158.1",
···
14
"jsr:@std/net@^1.0.6": "1.0.6",
15
"jsr:@std/path@^1.1.4": "1.1.4",
16
"jsr:@std/streams@^1.0.17": "1.0.17",
17
+
"npm:@arkenv/vite-plugin@^0.0.29": "0.0.29_arktype@2.1.29_vite@8.0.0-beta.13__picomatch@4.0.3",
18
"npm:@evilmartians/harmony@^1.4.0": "1.4.0",
19
+
"npm:@hono/arktype-validator@^2.0.1": "2.0.1_arktype@2.1.29_hono@4.9.8",
20
"npm:@hono/ua-blocker@~0.1.24": "0.1.24_hono@4.9.8",
21
"npm:@openauthjs/openauth@~0.4.3": "0.4.3_arctic@2.3.4_hono@4.9.8",
22
+
"npm:@tanstack/router-plugin@^1.158.1": "1.158.1_vite@8.0.0-beta.13__picomatch@4.0.3_vite-plugin-solid@2.11.10__solid-js@1.9.11___seroval@1.5.0__vite@8.0.0-beta.13___picomatch@4.0.3__@babel+core@7.29.0_@babel+core@7.29.0_solid-js@1.9.11__seroval@1.5.0",
23
"npm:@tanstack/solid-query@^5.90.23": "5.90.23_solid-js@1.9.11__seroval@1.5.0",
24
"npm:@tanstack/solid-router@^1.158.1": "1.158.1_solid-js@1.9.11__seroval@1.5.0",
25
"npm:arkenv@~0.9.2": "0.9.2_arktype@2.1.29",
···
34
"npm:solid-js@^1.9.11": "1.9.11_seroval@1.5.0",
35
"npm:temporal-polyfill@0.3": "0.3.0",
36
"npm:tidy-url@^1.18.3": "1.18.3",
37
+
"npm:vite-plugin-pwa@^1.2.0": "1.2.0_vite@8.0.0-beta.13__picomatch@4.0.3_workbox-build@7.4.0__ajv@8.17.1__@babel+core@7.29.0__rollup@2.79.2_workbox-window@7.4.0",
38
+
"npm:vite-plugin-solid@^2.11.10": "2.11.10_solid-js@1.9.11__seroval@1.5.0_vite@8.0.0-beta.13__picomatch@4.0.3_@babel+core@7.29.0",
39
"npm:vite@^8.0.0-beta.13": "8.0.0-beta.13_picomatch@4.0.3"
40
},
41
"jsr": {
···
112
"@ark/util@0.56.0": {
113
"integrity": "sha512-BghfRC8b9pNs3vBoDJhcta0/c1J1rsoS1+HgVUreMFPdhz/CRAKReAu57YEllNaSy98rWAdY1gE+gFup7OXpgA=="
114
},
115
+
"@arkenv/vite-plugin@0.0.29_arktype@2.1.29_vite@8.0.0-beta.13__picomatch@4.0.3": {
116
"integrity": "sha512-88hoQ9/Ro6HpII3JucuPGdw/t8xzRlH2asNz8TBgG4/exbyTB4GyydDcfjLwJbDB0YElBtJdBmKxtndabWzmfg==",
117
"dependencies": [
118
"arkenv",
119
"arktype",
120
+
"vite"
121
]
122
},
123
"@babel/code-frame@7.29.0": {
···
1052
"@evilmartians/harmony@1.4.0": {
1053
"integrity": "sha512-NgKkhTnQOSE07IvDxHHPLzFF81TaWU1Ir5nmaRM+PebXAol5vNXnk+Lp2JPgj1P/PBTu6lzSWckSpNjC19XSUw=="
1054
},
1055
+
"@hono/arktype-validator@2.0.1_arktype@2.1.29_hono@4.9.8": {
1056
+
"integrity": "sha512-Z4PQFtzgbGneBap+TTViRIBAoUWbwEwg8PaKNqALAP6z9N2ksJI81PfcsSQNUzwtrn8LipkMvBb8/D9Pei2GJw==",
1057
+
"dependencies": [
1058
+
"arktype",
1059
+
"hono"
1060
+
]
1061
+
},
1062
"@hono/ua-blocker@0.1.24_hono@4.9.8": {
1063
"integrity": "sha512-rdEx83ssuEm5rcB69vndUQ37GTtucPakmSt0UmXd0ICTbDiQflTQzhtBR5HlTAWpa7eNkdEOA8bmqUMtnwdA6Q==",
1064
"dependencies": [
···
1242
"@babel/core",
1243
"@babel/helper-module-imports@7.28.6",
1244
"@rollup/pluginutils@3.1.0_rollup@2.79.2",
1245
+
"rollup"
1246
]
1247
},
1248
"@rollup/plugin-node-resolve@15.3.1_rollup@2.79.2": {
···
1253
"deepmerge",
1254
"is-module",
1255
"resolve",
1256
+
"rollup"
1257
],
1258
"optionalPeers": [
1259
+
"rollup"
1260
]
1261
},
1262
"@rollup/plugin-replace@2.4.2_rollup@2.79.2": {
···
1264
"dependencies": [
1265
"@rollup/pluginutils@3.1.0_rollup@2.79.2",
1266
"magic-string",
1267
+
"rollup"
1268
]
1269
},
1270
"@rollup/plugin-terser@0.4.4_rollup@2.79.2": {
1271
"integrity": "sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==",
1272
"dependencies": [
1273
+
"rollup",
1274
"serialize-javascript",
1275
"smob",
1276
"terser"
1277
],
1278
"optionalPeers": [
1279
+
"rollup"
1280
]
1281
},
1282
"@rollup/pluginutils@3.1.0_rollup@2.79.2": {
···
1285
"@types/estree@0.0.39",
1286
"estree-walker@1.0.1",
1287
"picomatch@2.3.1",
1288
+
"rollup"
1289
]
1290
},
1291
"@rollup/pluginutils@5.3.0_rollup@2.79.2": {
···
1294
"@types/estree@1.0.8",
1295
"estree-walker@2.0.2",
1296
"picomatch@4.0.3",
1297
+
"rollup"
1298
],
1299
"optionalPeers": [
1300
+
"rollup"
1301
]
1302
},
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1303
"@solid-devtools/debugger@0.28.1_solid-js@1.9.11__seroval@1.5.0": {
1304
"integrity": "sha512-6qIUI6VYkXoRnL8oF5bvh2KgH71qlJ18hNw/mwSyY6v48eb80ZR48/5PDXufUa3q+MBSuYa1uqTMwLewpay9eg==",
1305
"dependencies": [
···
1476
"zod"
1477
]
1478
},
1479
+
"@tanstack/router-plugin@1.158.1_vite@8.0.0-beta.13__picomatch@4.0.3_vite-plugin-solid@2.11.10__solid-js@1.9.11___seroval@1.5.0__vite@8.0.0-beta.13___picomatch@4.0.3__@babel+core@7.29.0_@babel+core@7.29.0_solid-js@1.9.11__seroval@1.5.0": {
1480
"integrity": "sha512-IPCnf1CBc0jnczuy65+3iBaoABv5TKhOJ1YLzwel4kb9D8Abcq0vF8ooR5FiPmaGnree/z3SvjgHe5eQtgcsSQ==",
1481
"dependencies": [
1482
"@babel/core",
···
1491
"@tanstack/virtual-file-routes",
1492
"chokidar",
1493
"unplugin",
1494
+
"vite",
1495
"vite-plugin-solid",
1496
"zod"
1497
],
1498
"optionalPeers": [
1499
+
"vite",
1500
"vite-plugin-solid"
1501
]
1502
},
···
2931
],
2932
"bin": true
2933
},
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
2934
"safe-array-concat@1.1.3": {
2935
"integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==",
2936
"dependencies": [
···
3347
"validate-html-nesting@1.2.3": {
3348
"integrity": "sha512-kdkWdCl6eCeLlRShJKbjVOU2kFKxMF8Ghu50n+crEoyx+VKm3FxAxF9z4DCy6+bbTOqNW0+jcIYRnjoIRzigRw=="
3349
},
3350
+
"vite-plugin-pwa@1.2.0_vite@8.0.0-beta.13__picomatch@4.0.3_workbox-build@7.4.0__ajv@8.17.1__@babel+core@7.29.0__rollup@2.79.2_workbox-window@7.4.0": {
3351
"integrity": "sha512-a2xld+SJshT9Lgcv8Ji4+srFJL4k/1bVbd1x06JIkvecpQkwkvCncD1+gSzcdm3s+owWLpMJerG3aN5jupJEVw==",
3352
"dependencies": [
3353
"debug",
3354
"pretty-bytes@6.1.1",
3355
"tinyglobby",
3356
+
"vite",
3357
"workbox-build",
3358
"workbox-window"
3359
]
3360
},
3361
+
"vite-plugin-solid@2.11.10_solid-js@1.9.11__seroval@1.5.0_vite@8.0.0-beta.13__picomatch@4.0.3_@babel+core@7.29.0": {
3362
"integrity": "sha512-Yr1dQybmtDtDAHkii6hXuc1oVH9CPcS/Zb2jN/P36qqcrkNnVPsMTzQ06jyzFPFjj3U1IYKMVt/9ZqcwGCEbjw==",
3363
"dependencies": [
3364
"@babel/core",
···
3367
"merge-anything",
3368
"solid-js",
3369
"solid-refresh",
3370
+
"vite",
3371
"vitefu"
3372
]
3373
},
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
3374
"vite@8.0.0-beta.13_picomatch@4.0.3": {
3375
"integrity": "sha512-7s/rfpYOAo7WUHh9irzaGjhhKb12hGv0BpDegAMV5A391wdyvM45WtX6VMV7hvEtZF2j/QtpDpR6ldXI3GgARQ==",
3376
"dependencies": [
···
3387
],
3388
"bin": true
3389
},
3390
+
"vitefu@1.1.1_vite@8.0.0-beta.13__picomatch@4.0.3": {
3391
"integrity": "sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ==",
3392
"dependencies": [
3393
+
"vite"
3394
],
3395
"optionalPeers": [
3396
+
"vite"
3397
]
3398
},
3399
"webidl-conversions@4.0.2": {
···
3498
"glob",
3499
"lodash",
3500
"pretty-bytes@5.6.0",
3501
+
"rollup",
3502
"source-map@0.8.0-beta.0",
3503
"stringify-object",
3504
"strip-comments",
···
3620
"jsr:@std/http@1",
3621
"npm:@arkenv/vite-plugin@^0.0.29",
3622
"npm:@evilmartians/harmony@^1.4.0",
3623
+
"npm:@hono/arktype-validator@^2.0.1",
3624
"npm:@hono/ua-blocker@~0.1.24",
3625
"npm:@openauthjs/openauth@~0.4.3",
3626
"npm:@tanstack/router-plugin@^1.158.1",
+47
-6
server/routes/bookmarks.ts
···
0
0
0
1
import { Hono } from "hono"
2
-
import { kv } from "../utils/kv.ts"
3
-
import { Bookmark, BookmarkSchema, URLSchema } from "../utils/bookmarks.ts"
4
import { TidyURL } from "tidy-url"
5
-
import { encodeHex } from "@std/encoding/hex"
6
-
import { parse } from "node-html-parser"
0
0
0
0
0
7
import type { Variables } from "../utils/globals.ts"
8
import { tryCatch } from "../utils/utils.ts"
9
-
import { ofetch } from "ofetch"
10
-
import { type } from "arktype"
11
12
async function getMeta(
13
cleanUrl: string,
···
186
await kv.delete(item.key)
187
}
188
return c.text("Bookmarks deleted!")
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
189
})
190
.delete("/:id", async (c) => {
191
const subject = c.get("user")
···
1
+
import { arktypeValidator } from "@hono/arktype-validator"
2
+
import { encodeHex } from "@std/encoding/hex"
3
+
import { type } from "arktype"
4
import { Hono } from "hono"
5
+
import { parse } from "node-html-parser"
6
+
import { ofetch } from "ofetch"
7
import { TidyURL } from "tidy-url"
8
+
import { kv } from "../utils/kv.ts"
9
+
import {
10
+
Bookmark,
11
+
BookmarkEditSchema,
12
+
BookmarkSchema,
13
+
URLSchema,
14
+
} from "../utils/bookmarks.ts"
15
import type { Variables } from "../utils/globals.ts"
16
import { tryCatch } from "../utils/utils.ts"
0
0
17
18
async function getMeta(
19
cleanUrl: string,
···
192
await kv.delete(item.key)
193
}
194
return c.text("Bookmarks deleted!")
195
+
})
196
+
.put("/:id", arktypeValidator("json", BookmarkEditSchema), async (c) => {
197
+
const subject = c.get("user")
198
+
199
+
const id = c.req.param("id")
200
+
const body = c.req.valid("json")
201
+
202
+
const b = await kv.get<Bookmark>(["bookmarks", subject.id, id])
203
+
204
+
if (!b.value) {
205
+
return c.json(
206
+
{
207
+
message: "Bookmark not found",
208
+
},
209
+
400,
210
+
)
211
+
}
212
+
213
+
const bookmark = b.value
214
+
bookmark.title = body.title
215
+
bookmark.description = body.description
216
+
217
+
const result = await kv.atomic()
218
+
.check(b)
219
+
.set(["bookmarks", subject.id, id], bookmark)
220
+
.commit()
221
+
222
+
if (!result.ok) {
223
+
// Value was modified by another request, return error
224
+
return c.json({ error: "Error, please retry" }, 500)
225
+
}
226
+
227
+
return c.json({
228
+
success: true,
229
+
})
230
})
231
.delete("/:id", async (c) => {
232
const subject = c.get("user")
+2
server/utils/bookmarks.ts
···
11
})
12
13
export type Bookmark = typeof BookmarkSchema.infer
0
0
···
11
})
12
13
export type Bookmark = typeof BookmarkSchema.infer
14
+
15
+
export const BookmarkEditSchema = BookmarkSchema.pick("title", "description")