A very simple bookmarking webapp bookmarker.finxol.deno.net/

feat: add bookmark edit api route

finxol.io 5e0f4fcf 26f92754

verified
+85 -207
+1
deno.json
··· 10 10 "imports": { 11 11 "@arkenv/vite-plugin": "npm:@arkenv/vite-plugin@^0.0.29", 12 12 "@evilmartians/harmony": "npm:@evilmartians/harmony@^1.4.0", 13 + "@hono/arktype-validator": "npm:@hono/arktype-validator@^2.0.1", 13 14 "@hono/ua-blocker": "npm:@hono/ua-blocker@^0.1.24", 14 15 "@openauthjs/openauth": "npm:@openauthjs/openauth@^0.4.3", 15 16 "@std/assert": "jsr:@std/assert@1",
+35 -201
deno.lock
··· 14 14 "jsr:@std/net@^1.0.6": "1.0.6", 15 15 "jsr:@std/path@^1.1.4": "1.1.4", 16 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", 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 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", 19 20 "npm:@hono/ua-blocker@~0.1.24": "0.1.24_hono@4.9.8", 20 21 "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/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", 22 23 "npm:@tanstack/solid-query@^5.90.23": "5.90.23_solid-js@1.9.11__seroval@1.5.0", 23 24 "npm:@tanstack/solid-router@^1.158.1": "1.158.1_solid-js@1.9.11__seroval@1.5.0", 24 25 "npm:arkenv@~0.9.2": "0.9.2_arktype@2.1.29", ··· 33 34 "npm:solid-js@^1.9.11": "1.9.11_seroval@1.5.0", 34 35 "npm:temporal-polyfill@0.3": "0.3.0", 35 36 "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", 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", 38 39 "npm:vite@^8.0.0-beta.13": "8.0.0-beta.13_picomatch@4.0.3" 39 40 }, 40 41 "jsr": { ··· 111 112 "@ark/util@0.56.0": { 112 113 "integrity": "sha512-BghfRC8b9pNs3vBoDJhcta0/c1J1rsoS1+HgVUreMFPdhz/CRAKReAu57YEllNaSy98rWAdY1gE+gFup7OXpgA==" 113 114 }, 114 - "@arkenv/vite-plugin@0.0.29_arktype@2.1.29_vite@7.3.1__picomatch@4.0.3": { 115 + "@arkenv/vite-plugin@0.0.29_arktype@2.1.29_vite@8.0.0-beta.13__picomatch@4.0.3": { 115 116 "integrity": "sha512-88hoQ9/Ro6HpII3JucuPGdw/t8xzRlH2asNz8TBgG4/exbyTB4GyydDcfjLwJbDB0YElBtJdBmKxtndabWzmfg==", 116 117 "dependencies": [ 117 118 "arkenv", 118 119 "arktype", 119 - "vite@7.3.1_picomatch@4.0.3" 120 + "vite" 120 121 ] 121 122 }, 122 123 "@babel/code-frame@7.29.0": { ··· 1051 1052 "@evilmartians/harmony@1.4.0": { 1052 1053 "integrity": "sha512-NgKkhTnQOSE07IvDxHHPLzFF81TaWU1Ir5nmaRM+PebXAol5vNXnk+Lp2JPgj1P/PBTu6lzSWckSpNjC19XSUw==" 1053 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 + }, 1054 1062 "@hono/ua-blocker@0.1.24_hono@4.9.8": { 1055 1063 "integrity": "sha512-rdEx83ssuEm5rcB69vndUQ37GTtucPakmSt0UmXd0ICTbDiQflTQzhtBR5HlTAWpa7eNkdEOA8bmqUMtnwdA6Q==", 1056 1064 "dependencies": [ ··· 1234 1242 "@babel/core", 1235 1243 "@babel/helper-module-imports@7.28.6", 1236 1244 "@rollup/pluginutils@3.1.0_rollup@2.79.2", 1237 - "rollup@2.79.2" 1245 + "rollup" 1238 1246 ] 1239 1247 }, 1240 1248 "@rollup/plugin-node-resolve@15.3.1_rollup@2.79.2": { ··· 1245 1253 "deepmerge", 1246 1254 "is-module", 1247 1255 "resolve", 1248 - "rollup@2.79.2" 1256 + "rollup" 1249 1257 ], 1250 1258 "optionalPeers": [ 1251 - "rollup@2.79.2" 1259 + "rollup" 1252 1260 ] 1253 1261 }, 1254 1262 "@rollup/plugin-replace@2.4.2_rollup@2.79.2": { ··· 1256 1264 "dependencies": [ 1257 1265 "@rollup/pluginutils@3.1.0_rollup@2.79.2", 1258 1266 "magic-string", 1259 - "rollup@2.79.2" 1267 + "rollup" 1260 1268 ] 1261 1269 }, 1262 1270 "@rollup/plugin-terser@0.4.4_rollup@2.79.2": { 1263 1271 "integrity": "sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==", 1264 1272 "dependencies": [ 1265 - "rollup@2.79.2", 1273 + "rollup", 1266 1274 "serialize-javascript", 1267 1275 "smob", 1268 1276 "terser" 1269 1277 ], 1270 1278 "optionalPeers": [ 1271 - "rollup@2.79.2" 1279 + "rollup" 1272 1280 ] 1273 1281 }, 1274 1282 "@rollup/pluginutils@3.1.0_rollup@2.79.2": { ··· 1277 1285 "@types/estree@0.0.39", 1278 1286 "estree-walker@1.0.1", 1279 1287 "picomatch@2.3.1", 1280 - "rollup@2.79.2" 1288 + "rollup" 1281 1289 ] 1282 1290 }, 1283 1291 "@rollup/pluginutils@5.3.0_rollup@2.79.2": { ··· 1286 1294 "@types/estree@1.0.8", 1287 1295 "estree-walker@2.0.2", 1288 1296 "picomatch@4.0.3", 1289 - "rollup@2.79.2" 1297 + "rollup" 1290 1298 ], 1291 1299 "optionalPeers": [ 1292 - "rollup@2.79.2" 1300 + "rollup" 1293 1301 ] 1294 1302 }, 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 1303 "@solid-devtools/debugger@0.28.1_solid-js@1.9.11__seroval@1.5.0": { 1421 1304 "integrity": "sha512-6qIUI6VYkXoRnL8oF5bvh2KgH71qlJ18hNw/mwSyY6v48eb80ZR48/5PDXufUa3q+MBSuYa1uqTMwLewpay9eg==", 1422 1305 "dependencies": [ ··· 1593 1476 "zod" 1594 1477 ] 1595 1478 }, 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": { 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": { 1597 1480 "integrity": "sha512-IPCnf1CBc0jnczuy65+3iBaoABv5TKhOJ1YLzwel4kb9D8Abcq0vF8ooR5FiPmaGnree/z3SvjgHe5eQtgcsSQ==", 1598 1481 "dependencies": [ 1599 1482 "@babel/core", ··· 1608 1491 "@tanstack/virtual-file-routes", 1609 1492 "chokidar", 1610 1493 "unplugin", 1611 - "vite@7.3.1_picomatch@4.0.3", 1494 + "vite", 1612 1495 "vite-plugin-solid", 1613 1496 "zod" 1614 1497 ], 1615 1498 "optionalPeers": [ 1616 - "vite@7.3.1_picomatch@4.0.3", 1499 + "vite", 1617 1500 "vite-plugin-solid" 1618 1501 ] 1619 1502 }, ··· 3048 2931 ], 3049 2932 "bin": true 3050 2933 }, 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 2934 "safe-array-concat@1.1.3": { 3087 2935 "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", 3088 2936 "dependencies": [ ··· 3499 3347 "validate-html-nesting@1.2.3": { 3500 3348 "integrity": "sha512-kdkWdCl6eCeLlRShJKbjVOU2kFKxMF8Ghu50n+crEoyx+VKm3FxAxF9z4DCy6+bbTOqNW0+jcIYRnjoIRzigRw==" 3501 3349 }, 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": { 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": { 3503 3351 "integrity": "sha512-a2xld+SJshT9Lgcv8Ji4+srFJL4k/1bVbd1x06JIkvecpQkwkvCncD1+gSzcdm3s+owWLpMJerG3aN5jupJEVw==", 3504 3352 "dependencies": [ 3505 3353 "debug", 3506 3354 "pretty-bytes@6.1.1", 3507 3355 "tinyglobby", 3508 - "vite@7.3.1_picomatch@4.0.3", 3356 + "vite", 3509 3357 "workbox-build", 3510 3358 "workbox-window" 3511 3359 ] 3512 3360 }, 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": { 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": { 3514 3362 "integrity": "sha512-Yr1dQybmtDtDAHkii6hXuc1oVH9CPcS/Zb2jN/P36qqcrkNnVPsMTzQ06jyzFPFjj3U1IYKMVt/9ZqcwGCEbjw==", 3515 3363 "dependencies": [ 3516 3364 "@babel/core", ··· 3519 3367 "merge-anything", 3520 3368 "solid-js", 3521 3369 "solid-refresh", 3522 - "vite@7.3.1_picomatch@4.0.3", 3370 + "vite", 3523 3371 "vitefu" 3524 3372 ] 3525 3373 }, 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 3374 "vite@8.0.0-beta.13_picomatch@4.0.3": { 3542 3375 "integrity": "sha512-7s/rfpYOAo7WUHh9irzaGjhhKb12hGv0BpDegAMV5A391wdyvM45WtX6VMV7hvEtZF2j/QtpDpR6ldXI3GgARQ==", 3543 3376 "dependencies": [ ··· 3554 3387 ], 3555 3388 "bin": true 3556 3389 }, 3557 - "vitefu@1.1.1_vite@7.3.1__picomatch@4.0.3": { 3390 + "vitefu@1.1.1_vite@8.0.0-beta.13__picomatch@4.0.3": { 3558 3391 "integrity": "sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ==", 3559 3392 "dependencies": [ 3560 - "vite@7.3.1_picomatch@4.0.3" 3393 + "vite" 3561 3394 ], 3562 3395 "optionalPeers": [ 3563 - "vite@7.3.1_picomatch@4.0.3" 3396 + "vite" 3564 3397 ] 3565 3398 }, 3566 3399 "webidl-conversions@4.0.2": { ··· 3665 3498 "glob", 3666 3499 "lodash", 3667 3500 "pretty-bytes@5.6.0", 3668 - "rollup@2.79.2", 3501 + "rollup", 3669 3502 "source-map@0.8.0-beta.0", 3670 3503 "stringify-object", 3671 3504 "strip-comments", ··· 3787 3620 "jsr:@std/http@1", 3788 3621 "npm:@arkenv/vite-plugin@^0.0.29", 3789 3622 "npm:@evilmartians/harmony@^1.4.0", 3623 + "npm:@hono/arktype-validator@^2.0.1", 3790 3624 "npm:@hono/ua-blocker@~0.1.24", 3791 3625 "npm:@openauthjs/openauth@~0.4.3", 3792 3626 "npm:@tanstack/router-plugin@^1.158.1",
+47 -6
server/routes/bookmarks.ts
··· 1 + import { arktypeValidator } from "@hono/arktype-validator" 2 + import { encodeHex } from "@std/encoding/hex" 3 + import { type } from "arktype" 1 4 import { Hono } from "hono" 2 - import { kv } from "../utils/kv.ts" 3 - import { Bookmark, BookmarkSchema, URLSchema } from "../utils/bookmarks.ts" 5 + import { parse } from "node-html-parser" 6 + import { ofetch } from "ofetch" 4 7 import { TidyURL } from "tidy-url" 5 - import { encodeHex } from "@std/encoding/hex" 6 - import { parse } from "node-html-parser" 8 + import { kv } from "../utils/kv.ts" 9 + import { 10 + Bookmark, 11 + BookmarkEditSchema, 12 + BookmarkSchema, 13 + URLSchema, 14 + } from "../utils/bookmarks.ts" 7 15 import type { Variables } from "../utils/globals.ts" 8 16 import { tryCatch } from "../utils/utils.ts" 9 - import { ofetch } from "ofetch" 10 - import { type } from "arktype" 11 17 12 18 async function getMeta( 13 19 cleanUrl: string, ··· 186 192 await kv.delete(item.key) 187 193 } 188 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 + }) 189 230 }) 190 231 .delete("/:id", async (c) => { 191 232 const subject = c.get("user")
+2
server/utils/bookmarks.ts
··· 11 11 }) 12 12 13 13 export type Bookmark = typeof BookmarkSchema.infer 14 + 15 + export const BookmarkEditSchema = BookmarkSchema.pick("title", "description")