diff --git a/deno.json b/deno.json index efd53e63..ca6ac39a 100644 --- a/deno.json +++ b/deno.json @@ -18,7 +18,7 @@ ], "tasks": { "start": "deno run -A --env-file --deny-read=.env packages/ditto/server.ts", - "dev": "deno run -A --env-file --deny-read=.env --watch packages/ditto/server.ts", + "dev": "deno run -A --env-file --watch packages/ditto/server.ts", "hook": "deno run --allow-read --allow-run --allow-write https://deno.land/x/deno_hooks@0.1.1/mod.ts", "db:export": "deno run -A --env-file --deny-read=.env scripts/db-export.ts", "db:import": "deno run -A --env-file --deny-read=.env scripts/db-import.ts", @@ -82,6 +82,7 @@ "@std/fs": "jsr:@std/fs@^0.229.3", "@std/json": "jsr:@std/json@^0.223.0", "@std/media-types": "jsr:@std/media-types@^0.224.1", + "@std/path": "jsr:@std/path@^1.0.8", "@std/streams": "jsr:@std/streams@^0.223.0", "@std/testing": "jsr:@std/testing@^1.0.9", "blurhash": "npm:blurhash@2.0.5", diff --git a/deno.lock b/deno.lock index f5b01839..afb9c49c 100644 --- a/deno.lock +++ b/deno.lock @@ -1,72 +1,35 @@ { "version": "4", "specifiers": { - "jsr:@b-fuze/deno-dom@~0.1.47": "0.1.48", + "jsr:@b-fuze/deno-dom@~0.1.47": "0.1.49", "jsr:@bradenmacdonald/s3-lite-client@~0.7.4": "0.7.6", "jsr:@core/asyncutil@^1.2.0": "1.2.0", "jsr:@denosaurs/plug@1.0.3": "1.0.3", "jsr:@esroyo/scoped-performance@^3.1.0": "3.1.0", "jsr:@gfx/canvas-wasm@~0.4.2": "0.4.2", - "jsr:@gleasonator/policy@*": "0.2.0", - "jsr:@gleasonator/policy@0.2.0": "0.2.0", - "jsr:@gleasonator/policy@0.4.0": "0.4.0", - "jsr:@gleasonator/policy@0.4.1": "0.4.1", - "jsr:@gleasonator/policy@0.4.2": "0.4.2", - "jsr:@gleasonator/policy@0.5.0": "0.5.0", - "jsr:@gleasonator/policy@0.5.1": "0.5.1", - "jsr:@gleasonator/policy@0.5.2": "0.5.2", - "jsr:@gleasonator/policy@0.6.0": "0.6.0", - "jsr:@gleasonator/policy@0.6.1": "0.6.1", - "jsr:@gleasonator/policy@0.6.3": "0.6.3", - "jsr:@gleasonator/policy@0.6.4": "0.6.4", - "jsr:@gleasonator/policy@0.7.0": "0.7.0", - "jsr:@gleasonator/policy@0.7.1": "0.7.1", - "jsr:@gleasonator/policy@0.8.0": "0.8.0", - "jsr:@gleasonator/policy@0.8.1": "0.8.1", - "jsr:@gleasonator/policy@0.9.0": "0.9.0", - "jsr:@gleasonator/policy@0.9.1": "0.9.1", - "jsr:@gleasonator/policy@0.9.2": "0.9.2", - "jsr:@gleasonator/policy@0.9.3": "0.9.3", - "jsr:@gleasonator/policy@0.9.4": "0.9.4", - "jsr:@gleasonator/policy@0.9.5": "0.9.5", - "jsr:@hono/hono@^4.4.6": "4.6.15", + "jsr:@gleasonator/policy@*": "0.9.0", + "jsr:@hono/hono@^4.4.6": "4.7.5", "jsr:@negrel/http-ece@0.6.0": "0.6.0", "jsr:@negrel/webpush@0.3": "0.3.0", "jsr:@nostrify/db@~0.39.4": "0.39.4", - "jsr:@nostrify/nostrify@0.31": "0.31.0", - "jsr:@nostrify/nostrify@0.32": "0.32.0", "jsr:@nostrify/nostrify@0.36": "0.36.2", "jsr:@nostrify/nostrify@0.39": "0.39.1", - "jsr:@nostrify/nostrify@~0.22.1": "0.22.5", - "jsr:@nostrify/nostrify@~0.22.4": "0.22.4", - "jsr:@nostrify/nostrify@~0.22.5": "0.22.5", "jsr:@nostrify/nostrify@~0.39.1": "0.39.1", - "jsr:@nostrify/policies@0.33": "0.33.0", - "jsr:@nostrify/policies@0.33.1": "0.33.1", - "jsr:@nostrify/policies@0.34": "0.34.0", - "jsr:@nostrify/policies@0.36": "0.36.0", - "jsr:@nostrify/policies@~0.33.1": "0.33.1", "jsr:@nostrify/policies@~0.36.1": "0.36.1", - "jsr:@nostrify/types@0.30": "0.30.1", "jsr:@nostrify/types@0.35": "0.35.0", "jsr:@nostrify/types@0.36": "0.36.0", - "jsr:@nostrify/types@~0.30.1": "0.30.1", "jsr:@soapbox/kysely-pglite@1": "1.0.0", "jsr:@soapbox/logi@0.3": "0.3.0", "jsr:@soapbox/safe-fetch@2": "2.0.0", "jsr:@std/assert@0.223": "0.223.0", "jsr:@std/assert@0.224": "0.224.0", - "jsr:@std/assert@^1.0.10": "1.0.11", + "jsr:@std/assert@^1.0.12": "1.0.12", "jsr:@std/assert@~0.213.1": "0.213.1", "jsr:@std/assert@~0.225.1": "0.225.3", - "jsr:@std/async@^1.0.10": "1.0.10", + "jsr:@std/async@^1.0.10": "1.0.12", "jsr:@std/bytes@0.223": "0.223.0", - "jsr:@std/bytes@0.224": "0.224.0", "jsr:@std/bytes@0.224.0": "0.224.0", - "jsr:@std/bytes@^1.0.0-rc.3": "1.0.0", - "jsr:@std/bytes@^1.0.1-rc.3": "1.0.2", - "jsr:@std/bytes@^1.0.2": "1.0.4", - "jsr:@std/bytes@^1.0.2-rc.3": "1.0.2", + "jsr:@std/bytes@^1.0.2": "1.0.5", "jsr:@std/cli@0.223": "0.223.0", "jsr:@std/crypto@0.224": "0.224.0", "jsr:@std/data-structures@^1.0.6": "1.0.6", @@ -77,10 +40,10 @@ "jsr:@std/encoding@~0.224.1": "0.224.3", "jsr:@std/fmt@0.213.1": "0.213.1", "jsr:@std/fs@0.213.1": "0.213.1", - "jsr:@std/fs@^1.0.9": "1.0.11", + "jsr:@std/fs@^1.0.15": "1.0.15", "jsr:@std/fs@~0.229.3": "0.229.3", - "jsr:@std/internal@1": "1.0.5", - "jsr:@std/internal@^1.0.5": "1.0.5", + "jsr:@std/internal@1": "1.0.6", + "jsr:@std/internal@^1.0.6": "1.0.6", "jsr:@std/io@0.223": "0.223.0", "jsr:@std/io@0.224": "0.224.9", "jsr:@std/json@0.223": "0.223.0", @@ -92,66 +55,55 @@ "jsr:@std/path@^1.0.8": "1.0.8", "jsr:@std/path@~0.213.1": "0.213.1", "jsr:@std/streams@0.223": "0.223.0", - "jsr:@std/testing@^1.0.9": "1.0.9", - "npm:@cashu/cashu-ts@^2.2.0": "2.2.0", - "npm:@electric-sql/pglite@~0.2.8": "0.2.8", + "jsr:@std/testing@^1.0.9": "1.0.10", + "npm:@cashu/cashu-ts@^2.2.0": "2.4.1", + "npm:@electric-sql/pglite@~0.2.8": "0.2.17", "npm:@isaacs/ttlcache@^1.4.1": "1.4.1", - "npm:@noble/hashes@^1.4.0": "1.4.0", - "npm:@noble/secp256k1@2": "2.1.0", - "npm:@scure/base@^1.1.6": "1.1.6", - "npm:@scure/bip32@^1.4.0": "1.4.0", - "npm:@scure/bip39@^1.3.0": "1.3.0", + "npm:@noble/secp256k1@2": "2.2.3", + "npm:@scure/base@^1.1.6": "1.2.4", + "npm:@scure/bip32@^1.4.0": "1.6.2", + "npm:@scure/bip39@^1.3.0": "1.5.4", "npm:@types/node@*": "22.5.4", "npm:blurhash@2.0.5": "2.0.5", - "npm:comlink-async-generator@*": "0.0.1", "npm:comlink-async-generator@^0.0.1": "0.0.1", - "npm:comlink@^4.4.1": "4.4.1", + "npm:comlink@^4.4.1": "4.4.2", "npm:commander@12.1.0": "12.1.0", "npm:entities@^4.5.0": "4.5.0", "npm:fast-stable-stringify@1": "1.0.0", "npm:formdata-helper@0.3": "0.3.0", - "npm:hono-rate-limiter@0.3": "0.3.0_hono@4.2.5", + "npm:hono-rate-limiter@0.3": "0.3.0_hono@4.7.5", "npm:iso-639-1@^3.1.5": "3.1.5", - "npm:isomorphic-dompurify@^2.16.0": "2.16.0", - "npm:kysely-postgres-js@2.0.0": "2.0.0_kysely@0.27.3_postgres@3.4.4", - "npm:kysely@~0.27.2": "0.27.4", - "npm:kysely@~0.27.3": "0.27.4", - "npm:kysely@~0.27.4": "0.27.4", + "npm:isomorphic-dompurify@^2.16.0": "2.22.0", + "npm:kysely-postgres-js@2.0.0": "2.0.0_kysely@0.27.6_postgres@3.4.5", + "npm:kysely@~0.27.3": "0.27.6", + "npm:kysely@~0.27.4": "0.27.6", "npm:lande@^1.0.10": "1.0.10", - "npm:light-bolt11-decoder@*": "3.1.1", - "npm:linkify-plugin-hashtag@^4.1.1": "4.1.3_linkifyjs@4.1.3", - "npm:linkify-string@^4.1.1": "4.1.3_linkifyjs@4.1.3", - "npm:linkifyjs@^4.1.1": "4.1.3", - "npm:lint-staged@*": "15.2.2", - "npm:lru-cache@^10.2.0": "10.2.2", - "npm:lru-cache@^10.2.2": "10.2.2", + "npm:light-bolt11-decoder@*": "3.2.0", + "npm:linkify-plugin-hashtag@^4.1.1": "4.2.0_linkifyjs@4.2.0", + "npm:linkify-string@^4.1.1": "4.2.0_linkifyjs@4.2.0", + "npm:linkifyjs@^4.1.1": "4.2.0", + "npm:lint-staged@*": "15.5.0", + "npm:lru-cache@^10.2.0": "10.4.3", + "npm:lru-cache@^10.2.2": "10.4.3", "npm:nostr-tools@2.5.1": "2.5.1", - "npm:nostr-tools@^2.10.4": "2.10.4", - "npm:nostr-tools@^2.5.0": "2.5.1", - "npm:nostr-tools@^2.7.0": "2.7.0", + "npm:nostr-tools@^2.10.4": "2.11.0", + "npm:nostr-tools@^2.7.0": "2.11.0", "npm:nostr-wasm@0.1": "0.1.0", - "npm:path-to-regexp@^7.1.0": "7.1.0", - "npm:postgres@3.4.4": "3.4.4", - "npm:prom-client@^15.1.2": "15.1.2", + "npm:path-to-regexp@^7.1.0": "7.2.0", + "npm:prom-client@^15.1.2": "15.1.3", "npm:sharp@~0.33.5": "0.33.5", - "npm:tldts@^6.0.14": "6.1.18", - "npm:tldts@^6.1.61": "6.1.61", - "npm:tseep@^1.2.1": "1.2.1", - "npm:type-fest@^4.3.0": "4.18.2", + "npm:tldts@^6.0.14": "6.1.85", + "npm:tldts@^6.1.61": "6.1.85", + "npm:tseep@^1.2.1": "1.3.1", + "npm:type-fest@^4.3.0": "4.38.0", "npm:unfurl.js@^6.4.0": "6.4.0", - "npm:websocket-ts@^2.1.5": "2.1.5", + "npm:websocket-ts@^2.1.5": "2.2.1", "npm:websocket-ts@^2.2.1": "2.2.1", - "npm:zod@^3.23.8": "3.23.8" + "npm:zod@^3.23.8": "3.24.2" }, "jsr": { - "@b-fuze/deno-dom@0.1.47": { - "integrity": "270a888de91329f8ce3849211ece0ad97ce1e8b9a8a774f2bed2f43c8b0ffe8e", - "dependencies": [ - "jsr:@denosaurs/plug" - ] - }, - "@b-fuze/deno-dom@0.1.48": { - "integrity": "bf5b591aef2e9e9c59adfcbb93a9ecd45bab5b7c8263625beafa5c8f1662e7da", + "@b-fuze/deno-dom@0.1.49": { + "integrity": "45c40175fdd1e74ab2d4b54c4fdaabbad6e5b76ee28df12a48e076b3fa7901a9", "dependencies": [ "jsr:@denosaurs/plug" ] @@ -183,178 +135,15 @@ "jsr:@std/encoding@1.0.5" ] }, - "@gleasonator/policy@0.2.0": { - "integrity": "3fe58b853ab203b2b67e65b64391dbcf5c07bc1caaf46e97b2f8ed5b14f30fdf", - "dependencies": [ - "jsr:@nostrify/nostrify@~0.22.1" - ] - }, - "@gleasonator/policy@0.4.0": { - "integrity": "59c2f3ab1dc663e99a3e10b7eb69bf9fe581ce5d428fe56653e38f7f961da5ea", - "dependencies": [ - "jsr:@nostrify/nostrify@~0.22.1" - ] - }, - "@gleasonator/policy@0.4.1": { - "integrity": "4d42d11d2e9b5f183cec1ca73dbb6f5cd50475efb2bef9495857fa8e5e5d8251", - "dependencies": [ - "jsr:@nostrify/nostrify@~0.22.1" - ] - }, - "@gleasonator/policy@0.4.2": { - "integrity": "704527346b35a1ef799c58ba365fea30d1d4bb8e5291937183223d27b24b0f27", - "dependencies": [ - "jsr:@nostrify/nostrify@~0.22.1" - ] - }, - "@gleasonator/policy@0.5.0": { - "integrity": "c2882eb3b4147dfe96b6ec2870b012b5a614f686770d1d4b2f778fdc44e8b1f5", - "dependencies": [ - "jsr:@nostrify/nostrify@0.31", - "jsr:@nostrify/policies@0.33" - ] - }, - "@gleasonator/policy@0.5.1": { - "integrity": "2d687c5166556ce13ac05c4542f61ef8a47d8b96b57f6e43d52035805f895551", - "dependencies": [ - "jsr:@nostrify/nostrify@0.31", - "jsr:@nostrify/policies@0.33" - ] - }, - "@gleasonator/policy@0.5.2": { - "integrity": "cdd3add87be3132eb05736bca640dfb3bbb1aa79928a44d3563cde20bab7c0d3", - "dependencies": [ - "jsr:@nostrify/nostrify@0.31", - "jsr:@nostrify/policies@~0.33.1" - ] - }, - "@gleasonator/policy@0.6.0": { - "integrity": "77f52bb245255a61070a4970c50e2ea8e82345c1de2fef12b9d8887a20b46e6d", - "dependencies": [ - "jsr:@nostrify/nostrify@0.32", - "jsr:@nostrify/policies@0.34" - ] - }, - "@gleasonator/policy@0.6.1": { - "integrity": "ba763d69332a736678b068b4063709874bc64010dfc3f974818218a41deb2291", - "dependencies": [ - "jsr:@nostrify/nostrify@0.32", - "jsr:@nostrify/policies@0.34" - ] - }, - "@gleasonator/policy@0.6.3": { - "integrity": "7126c52edd3de21488714e66ec71f31ba9b14f8afc761ab73ac7c3ecc936625c", - "dependencies": [ - "jsr:@nostrify/nostrify@0.32", - "jsr:@nostrify/policies@0.34" - ] - }, - "@gleasonator/policy@0.6.4": { - "integrity": "fd91c94546edd1de1faa80cb3248699b2f010ef1bdd89818dbc4a03e7606e0bb", - "dependencies": [ - "jsr:@nostrify/nostrify@0.32", - "jsr:@nostrify/policies@0.34" - ] - }, - "@gleasonator/policy@0.7.0": { - "integrity": "22cad69f6c0eaa20ccd45fcbd0a3990c9e395f23181669ebbf397b8c501d14cf", - "dependencies": [ - "jsr:@nostrify/nostrify@0.36", - "jsr:@nostrify/policies@0.36" - ] - }, - "@gleasonator/policy@0.7.1": { - "integrity": "411c106ec8594f6b1c6aa716895600f2483f72367862bd80add91a0bfec94c28", - "dependencies": [ - "jsr:@nostrify/nostrify@0.36", - "jsr:@nostrify/policies@0.36" - ] - }, - "@gleasonator/policy@0.8.0": { - "integrity": "139611066eb60f15ec40686f9c9b8bad13eb631fdd069fd6eaae3ccf27157b0d", - "dependencies": [ - "jsr:@nostrify/nostrify@0.36", - "jsr:@nostrify/policies@0.36" - ] - }, - "@gleasonator/policy@0.8.1": { - "integrity": "32bc3da39f9fa0f8c4ab1d1d6f7ddf44c3c19ffbca34a7344b8ae9233e852fdb", - "dependencies": [ - "jsr:@nostrify/nostrify@0.36", - "jsr:@nostrify/policies@~0.36.1" - ] - }, "@gleasonator/policy@0.9.0": { "integrity": "483f87c3a18fb39f795495d3388453193f1115ab7e130981121f7828ce6b51bb", "dependencies": [ "jsr:@nostrify/nostrify@0.36", - "jsr:@nostrify/policies@~0.36.1" + "jsr:@nostrify/policies" ] }, - "@gleasonator/policy@0.9.1": { - "integrity": "34f10717d8e71a6d9ca49c89fce0e5474b80354f8b101003b02b1bd9f36bbff8", - "dependencies": [ - "jsr:@nostrify/nostrify@0.36", - "jsr:@nostrify/policies@~0.36.1" - ] - }, - "@gleasonator/policy@0.9.2": { - "integrity": "ded1e6535a01474f025c0f023c4956b9cf169a719c09fd8899ffa5b107fbbd74", - "dependencies": [ - "jsr:@nostrify/nostrify@0.36", - "jsr:@nostrify/policies@~0.36.1" - ] - }, - "@gleasonator/policy@0.9.3": { - "integrity": "7a682747c1b843b8f39b3c4f4787f6e21188fe0a1b1e5b896edfbadb4a11405f", - "dependencies": [ - "jsr:@nostrify/nostrify@0.36", - "jsr:@nostrify/policies@~0.36.1" - ] - }, - "@gleasonator/policy@0.9.4": { - "integrity": "5d5b8a585b8e3cd6e6b7daed2cfa61cd1a3e5945691f092eb98f8671384c3657", - "dependencies": [ - "jsr:@nostrify/nostrify@0.36", - "jsr:@nostrify/policies@~0.36.1" - ] - }, - "@gleasonator/policy@0.9.5": { - "integrity": "8ce76ad719b5d002bb1799c60f2deb4d450b32d590e0f4c211919aa68f1ea963", - "dependencies": [ - "jsr:@nostrify/nostrify@0.36", - "jsr:@nostrify/policies@~0.36.1" - ] - }, - "@hono/hono@4.4.6": { - "integrity": "aa557ca9930787ee86b9ca1730691f1ce1c379174c2cb244d5934db2b6314453" - }, - "@hono/hono@4.5.0": { - "integrity": "4a410f7773ac4b5b0eb4520b26c7ab7795a271d57a9df7fa1953ded6b90ccaf7" - }, - "@hono/hono@4.5.1": { - "integrity": "459748ed4d4146c6e4bdff0213ff1ac44749904066ae02e7550d6c7f28c9bc4c" - }, - "@hono/hono@4.5.3": { - "integrity": "429923b2b3c6586a1450862328d61a1346fee5841e8ae86c494250475057213c" - }, - "@hono/hono@4.5.4": { - "integrity": "3792780b8460d5df0959b07c059db9325e4fa1a49f8b5aff7ab9bc870bdec8e3" - }, - "@hono/hono@4.5.5": { - "integrity": "e5a63b5f535475cd80974b65fed23a138d0cbb91fe1cc9a17a7c7278e835c308" - }, - "@hono/hono@4.5.9": { - "integrity": "47f561e67aedbd6d1e21e3a1ae26c1b80ffdb62a51c161d502e75bee17ca40af" - }, - "@hono/hono@4.5.11": { - "integrity": "5bd6b1a3a503efb746fdcf0aae3ac536dd09229d372988bde5db0798ef64ae4f" - }, - "@hono/hono@4.6.2": { - "integrity": "35fcf3be4687825080b01bed7bbe2ac66f8d8b8939f0bad459661bf3b46d916f" - }, - "@hono/hono@4.6.15": { - "integrity": "935b3b12e98e4b22bcd1aa4dbe6587321e431c79829eba61f535b4ede39fd8b1" + "@hono/hono@4.7.5": { + "integrity": "36a7e1b3db8a58e5dc2bd36a76be53346f0966e04c24c635c4d6f58875575b0a" }, "@negrel/http-ece@0.6.0": { "integrity": "7afdd81b86ea5b21a9677b323c01c3338705e11cc2bfed250870f5349d8f86f7", @@ -382,91 +171,6 @@ "npm:nostr-tools@^2.10.4" ] }, - "@nostrify/nostrify@0.22.4": { - "integrity": "1c8a7847e5773213044b491e85fd7cafae2ad194ce59da4d957d2b27c776b42d", - "dependencies": [ - "jsr:@std/encoding@~0.224.1", - "npm:@noble/hashes", - "npm:@scure/base", - "npm:@scure/bip32", - "npm:@scure/bip39", - "npm:kysely@~0.27.3", - "npm:lru-cache@^10.2.0", - "npm:nostr-tools@^2.5.0", - "npm:websocket-ts@^2.1.5", - "npm:zod" - ] - }, - "@nostrify/nostrify@0.22.5": { - "integrity": "5b9c17325cc02e37c71e14ac0103b40446b0402fe183e5f5362af23e9ea162bf", - "dependencies": [ - "jsr:@std/encoding@~0.224.1", - "npm:@scure/base", - "npm:@scure/bip32", - "npm:@scure/bip39", - "npm:kysely@~0.27.3", - "npm:lru-cache@^10.2.0", - "npm:nostr-tools@^2.7.0", - "npm:websocket-ts@^2.1.5", - "npm:zod" - ] - }, - "@nostrify/nostrify@0.30.0": { - "integrity": "7c29e7d8b5a0a81e238170ac1e7ad708bc72dd8f478d8d82c30598fb4eff9b9c", - "dependencies": [ - "jsr:@nostrify/types@0.30", - "jsr:@std/crypto", - "jsr:@std/encoding@~0.224.1", - "npm:@scure/base", - "npm:@scure/bip32", - "npm:@scure/bip39", - "npm:lru-cache@^10.2.0", - "npm:nostr-tools@^2.7.0", - "npm:websocket-ts@^2.1.5", - "npm:zod" - ] - }, - "@nostrify/nostrify@0.31.0": { - "integrity": "1c1b686bb9ca3ad8d19807e3b96ef3793a65d70fd0f433fe6ef8b3fdb9f45557", - "dependencies": [ - "jsr:@nostrify/types@~0.30.1", - "jsr:@std/encoding@~0.224.1", - "npm:@scure/bip32", - "npm:@scure/bip39", - "npm:lru-cache@^10.2.0", - "npm:nostr-tools@^2.7.0", - "npm:websocket-ts@^2.1.5", - "npm:zod" - ] - }, - "@nostrify/nostrify@0.32.0": { - "integrity": "2d3b7a9cce275c150355f8e566c11f14044afd0b889afcb48e883da9467bdaa9", - "dependencies": [ - "jsr:@nostrify/types@~0.30.1", - "jsr:@std/encoding@~0.224.1", - "npm:@scure/bip32", - "npm:@scure/bip39", - "npm:lru-cache@^10.2.0", - "npm:nostr-tools@^2.7.0", - "npm:websocket-ts@^2.1.5", - "npm:zod" - ] - }, - "@nostrify/nostrify@0.36.0": { - "integrity": "f00dbff1f02a2c496c5e85eeeb7a84101b7dd874d87456449dc71b6d037e40fc", - "dependencies": [ - "jsr:@nostrify/types@0.35", - "jsr:@std/crypto", - "jsr:@std/encoding@~0.224.1", - "npm:@scure/base", - "npm:@scure/bip32", - "npm:@scure/bip39", - "npm:lru-cache@^10.2.0", - "npm:nostr-tools@^2.7.0", - "npm:websocket-ts@^2.1.5", - "npm:zod" - ] - }, "@nostrify/nostrify@0.36.2": { "integrity": "cc4787ca170b623a2e5dfed1baa4426077daa6143af728ea7dd325d58f4d04d6", "dependencies": [ @@ -480,37 +184,6 @@ "npm:zod" ] }, - "@nostrify/nostrify@0.38.0": { - "integrity": "9ec7920057ee3a4dcbaef7e706dedea622bfdfdf0f6aac11047443f88d953deb", - "dependencies": [ - "jsr:@nostrify/types@0.36", - "jsr:@std/crypto", - "jsr:@std/encoding@~0.224.1", - "npm:@scure/base", - "npm:@scure/bip32", - "npm:@scure/bip39", - "npm:lru-cache@^10.2.0", - "npm:nostr-tools@^2.10.4", - "npm:websocket-ts@^2.1.5", - "npm:zod" - ] - }, - "@nostrify/nostrify@0.39.0": { - "integrity": "f7e052c32b8b9bafe0f2517dcf090e7d3df5aed38452a0cf61ade817d34067ee", - "dependencies": [ - "jsr:@nostrify/nostrify@0.39", - "jsr:@nostrify/types@0.36", - "jsr:@std/crypto", - "jsr:@std/encoding@~0.224.1", - "npm:@scure/base", - "npm:@scure/bip32", - "npm:@scure/bip39", - "npm:lru-cache@^10.2.0", - "npm:nostr-tools@^2.10.4", - "npm:websocket-ts@^2.2.1", - "npm:zod" - ] - }, "@nostrify/nostrify@0.39.1": { "integrity": "84f98c815a07f4151bd02188a3525e438c416e9de632c79c9da9edbfca580d7f", "dependencies": [ @@ -527,36 +200,6 @@ "npm:zod" ] }, - "@nostrify/policies@0.33.0": { - "integrity": "c946b06d0527298b4d7c9819d142a10f522ba09eee76c37525aa4acfc5d87aee", - "dependencies": [ - "jsr:@nostrify/types@~0.30.1", - "npm:nostr-tools@^2.7.0" - ] - }, - "@nostrify/policies@0.33.1": { - "integrity": "381e1f9406a6da22da03a254e46b1aa07d5491b9761961cda3a4aeb5bf3f5286", - "dependencies": [ - "jsr:@nostrify/types@~0.30.1", - "npm:nostr-tools@^2.7.0" - ] - }, - "@nostrify/policies@0.34.0": { - "integrity": "27eb8fb36106a29e982ec7fc6bbb91bd6989f8ce11113a3ef6c528b4c2deceee", - "dependencies": [ - "jsr:@nostrify/nostrify@0.32", - "jsr:@nostrify/types@~0.30.1", - "npm:nostr-tools@^2.7.0" - ] - }, - "@nostrify/policies@0.36.0": { - "integrity": "ad1930de48ce03cdf34da456af1563b487581d1d86683cd416ad760ae40b1fb3", - "dependencies": [ - "jsr:@nostrify/nostrify@0.36", - "jsr:@nostrify/types@0.35", - "npm:nostr-tools@^2.7.0" - ] - }, "@nostrify/policies@0.36.1": { "integrity": "6d59af115a687fcd18b6caebab0e4f50ee6cdb0aafa2aacd0aec2065021275b4", "dependencies": [ @@ -565,12 +208,6 @@ "npm:nostr-tools@^2.7.0" ] }, - "@nostrify/types@0.30.0": { - "integrity": "1f38fa849cff930bd709edbf94ef9ac02f46afb8b851f86c8736517b354616da" - }, - "@nostrify/types@0.30.1": { - "integrity": "245da176f6893a43250697db51ad32bfa29bf9b1cdc1ca218043d9abf6de5ae5" - }, "@nostrify/types@0.35.0": { "integrity": "b8d515563d467072694557d5626fa1600f74e83197eef45dd86a9a99c64f7fe6" }, @@ -607,29 +244,26 @@ "jsr:@std/internal@1" ] }, - "@std/assert@1.0.11": { - "integrity": "2461ef3c368fe88bc60e186e7744a93112f16fd110022e113a0849e94d1c83c1", + "@std/assert@1.0.12": { + "integrity": "08009f0926dda9cbd8bef3a35d3b6a4b964b0ab5c3e140a4e0351fbf34af5b9a", "dependencies": [ - "jsr:@std/internal@^1.0.5" + "jsr:@std/internal@^1.0.6" ] }, "@std/async@1.0.10": { "integrity": "2ff1b1c7d33d1416159989b0f69e59ec7ee8cb58510df01e454def2108b3dbec" }, + "@std/async@1.0.12": { + "integrity": "d1bfcec459e8012846fe4e38dfc4241ab23240ecda3d8d6dfcf6d81a632e803d" + }, "@std/bytes@0.223.0": { "integrity": "84b75052cd8680942c397c2631318772b295019098f40aac5c36cead4cba51a8" }, "@std/bytes@0.224.0": { "integrity": "a2250e1d0eb7d1c5a426f21267ab9bdeac2447fa87a3d0d1a467d3f7a6058e49" }, - "@std/bytes@1.0.0": { - "integrity": "9392e72af80adccaa1197912fa19990ed091cb98d5c9c4344b0c301b22d7c632" - }, - "@std/bytes@1.0.2": { - "integrity": "fbdee322bbd8c599a6af186a1603b3355e59a5fb1baa139f8f4c3c9a1b3e3d57" - }, - "@std/bytes@1.0.4": { - "integrity": "11a0debe522707c95c7b7ef89b478c13fb1583a7cfb9a85674cd2cc2e3a28abc" + "@std/bytes@1.0.5": { + "integrity": "4465dd739d7963d964c809202ebea6d5c6b8e3829ef25c6a224290fbb8a1021e" }, "@std/cli@0.223.0": { "integrity": "2feb7970f2028904c3edc22ea916ce9538113dfc170844f3eae03578c333c356", @@ -647,9 +281,6 @@ "@std/data-structures@1.0.6": { "integrity": "76a7fd8080c66604c0496220a791860492ab21a04a63a969c0b9a0609bbbb760" }, - "@std/dotenv@0.224.0": { - "integrity": "d9234cdf551507dcda60abb6c474289843741d8c07ee8ce540c60f5c1b220a1d" - }, "@std/encoding@0.213.1": { "integrity": "fcbb6928713dde941a18ca5db88ca1544d0755ec8fb20fe61e2dc8144b390c62" }, @@ -678,26 +309,17 @@ "jsr:@std/path@1.0.0-rc.1" ] }, - "@std/fs@1.0.11": { - "integrity": "ba674672693340c5ebdd018b4fe1af46cb08741f42b4c538154e97d217b55bdd", + "@std/fs@1.0.15": { + "integrity": "c083fb479889d6440d768e498195c3fc499d426fbf9a6592f98f53884d1d3f41", "dependencies": [ "jsr:@std/path@^1.0.8" ] }, - "@std/internal@1.0.0": { - "integrity": "ac6a6dfebf838582c4b4f61a6907374e27e05bedb6ce276e0f1608fe84e7cd9a" - }, - "@std/internal@1.0.1": { - "integrity": "6f8c7544d06a11dd256c8d6ba54b11ed870aac6c5aeafff499892662c57673e6" - }, - "@std/internal@1.0.3": { - "integrity": "208e9b94a3d5649bd880e9ca38b885ab7651ab5b5303a56ed25de4755fb7b11e" - }, "@std/internal@1.0.4": { "integrity": "62e8e4911527e5e4f307741a795c0b0a9e6958d0b3790716ae71ce085f755422" }, - "@std/internal@1.0.5": { - "integrity": "54a546004f769c1ac9e025abd15a76b6671ddc9687e2313b67376125650dc7ba" + "@std/internal@1.0.6": { + "integrity": "9533b128f230f73bd209408bb07a4b12f8d4255ab2a4d22a1fd6d87304aca9a4" }, "@std/io@0.223.0": { "integrity": "2d8c3c2ab3a515619b90da2c6ff5ea7b75a94383259ef4d02116b228393f84f1", @@ -706,48 +328,6 @@ "jsr:@std/bytes@0.223" ] }, - "@std/io@0.224.0": { - "integrity": "0aff885d21d829c050b8a08b1d71b54aed5841aecf227f8d77e99ec529a11e8e", - "dependencies": [ - "jsr:@std/bytes@0.224" - ] - }, - "@std/io@0.224.1": { - "integrity": "73de242551a5c0965eb33e36b1fc7df4834ffbc836a1a643a410ccd11253d6be", - "dependencies": [ - "jsr:@std/bytes@^1.0.0-rc.3" - ] - }, - "@std/io@0.224.3": { - "integrity": "b402edeb99c6b3778d9ae3e9927bc9085b170b41e5a09bbb7064ab2ee394ae2f", - "dependencies": [ - "jsr:@std/bytes@^1.0.1-rc.3" - ] - }, - "@std/io@0.224.4": { - "integrity": "bce1151765e4e70e376039fd72c71672b4d4aae363878a5ee3e58361b81197ec", - "dependencies": [ - "jsr:@std/bytes@^1.0.2-rc.3" - ] - }, - "@std/io@0.224.6": { - "integrity": "eefe034a370be34daf066c8634dd645635d099bb21eccf110f0bdc28d9040891", - "dependencies": [ - "jsr:@std/bytes@^1.0.2" - ] - }, - "@std/io@0.224.7": { - "integrity": "a70848793c44a7c100926571a8c9be68ba85487bfcd4d0540d86deabe1123dc9", - "dependencies": [ - "jsr:@std/bytes@^1.0.2" - ] - }, - "@std/io@0.224.8": { - "integrity": "f525d05d51fd873de6352b9afcf35cab9ab5dc448bf3c20e0c8b521ded9be392", - "dependencies": [ - "jsr:@std/bytes@^1.0.2" - ] - }, "@std/io@0.224.9": { "integrity": "4414664b6926f665102e73c969cfda06d2c4c59bd5d0c603fd4f1b1c840d6ee3", "dependencies": [ @@ -793,23 +373,36 @@ ] }, "@std/testing@1.0.9": { - "integrity": "9bdd4ac07cb13e7594ac30e90f6ceef7254ac83a9aeaa089be0008f33aab5cd4", + "integrity": "9bdd4ac07cb13e7594ac30e90f6ceef7254ac83a9aeaa089be0008f33aab5cd4" + }, + "@std/testing@1.0.10": { + "integrity": "8997bd0b0df020b81bf5eae103c66622918adeff7e45e96291c92a29dbf82cc1", "dependencies": [ - "jsr:@std/assert@^1.0.10", + "jsr:@std/assert@^1.0.12", "jsr:@std/data-structures", - "jsr:@std/fs@^1.0.9", - "jsr:@std/internal@^1.0.5", + "jsr:@std/fs@^1.0.15", + "jsr:@std/internal@^1.0.6", "jsr:@std/path@^1.0.8" ] } }, "npm": { - "@cashu/cashu-ts@2.2.0": { - "integrity": "sha512-7b6pGyjjpm3uAJvmOL+ztpRxqp1qnmzGpydp+Pu30pOjxj93EhejPTJVrZMDJ0P35y6u5+5jIjHF4k0fpovvmg==", + "@asamuzakjp/css-color@3.1.1_@csstools+css-parser-algorithms@3.0.4__@csstools+css-tokenizer@3.0.3_@csstools+css-tokenizer@3.0.3": { + "integrity": "sha512-hpRD68SV2OMcZCsrbdkccTw5FXjNDLo5OuqSHyHZfwweGsDWZwDJ2+gONyNAbazZclobMirACLw0lk8WVxIqxA==", + "dependencies": [ + "@csstools/css-calc", + "@csstools/css-color-parser", + "@csstools/css-parser-algorithms", + "@csstools/css-tokenizer", + "lru-cache" + ] + }, + "@cashu/cashu-ts@2.4.1": { + "integrity": "sha512-9lDHP5GtWvC/mIDPRg5KdRQAsqoYYm93efPyfgDtRd9eW1BhWrzLuS0sN1WVkL9noAXCZoWjjpX8TElMXhpFhA==", "dependencies": [ "@cashu/crypto", - "@noble/curves@1.4.0", - "@noble/hashes@1.4.0", + "@noble/curves@1.8.1", + "@noble/hashes@1.7.1", "buffer" ] }, @@ -823,11 +416,39 @@ "buffer" ] }, - "@electric-sql/pglite@0.2.8": { - "integrity": "sha512-0wSmQu22euBRzR5ghqyIHnBH4MfwlkL5WstOrrA3KOsjEWEglvoL/gH92JajEUA6Ufei/+qbkB2hVloC/K/RxQ==" + "@csstools/color-helpers@5.0.2": { + "integrity": "sha512-JqWH1vsgdGcw2RR6VliXXdA0/59LttzlU8UlRT/iUUsEeWfYq8I+K0yhihEUTTHLRm1EXvpsCx3083EU15ecsA==" }, - "@emnapi/runtime@1.3.1": { - "integrity": "sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==", + "@csstools/css-calc@2.1.2_@csstools+css-parser-algorithms@3.0.4__@csstools+css-tokenizer@3.0.3_@csstools+css-tokenizer@3.0.3": { + "integrity": "sha512-TklMyb3uBB28b5uQdxjReG4L80NxAqgrECqLZFQbyLekwwlcDDS8r3f07DKqeo8C4926Br0gf/ZDe17Zv4wIuw==", + "dependencies": [ + "@csstools/css-parser-algorithms", + "@csstools/css-tokenizer" + ] + }, + "@csstools/css-color-parser@3.0.8_@csstools+css-parser-algorithms@3.0.4__@csstools+css-tokenizer@3.0.3_@csstools+css-tokenizer@3.0.3": { + "integrity": "sha512-pdwotQjCCnRPuNi06jFuP68cykU1f3ZWExLe/8MQ1LOs8Xq+fTkYgd+2V8mWUWMrOn9iS2HftPVaMZDaXzGbhQ==", + "dependencies": [ + "@csstools/color-helpers", + "@csstools/css-calc", + "@csstools/css-parser-algorithms", + "@csstools/css-tokenizer" + ] + }, + "@csstools/css-parser-algorithms@3.0.4_@csstools+css-tokenizer@3.0.3": { + "integrity": "sha512-Up7rBoV77rv29d3uKHUIVubz1BTcgyUK72IvCQAbfbMv584xHcGKCKbWh7i8hPrRJ7qU4Y8IO3IY9m+iTB7P3A==", + "dependencies": [ + "@csstools/css-tokenizer" + ] + }, + "@csstools/css-tokenizer@3.0.3": { + "integrity": "sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw==" + }, + "@electric-sql/pglite@0.2.17": { + "integrity": "sha512-qEpKRT2oUaWDH6tjRxLHjdzMqRUGYDnGZlKrnL4dJ77JVMcP2Hpo3NYnOSPKdZdeec57B6QPprCUFg0picx5Pw==" + }, + "@emnapi/runtime@1.4.0": { + "integrity": "sha512-64WYIf4UYcdLnbKn/umDlNjQDSS8AgZrI/R9+x5ilkUVFxXcA1Ebl+gQLc/6mERA4407Xof0R7wEyEuj091CVw==", "dependencies": [ "tslib" ] @@ -934,12 +555,6 @@ "@noble/hashes@1.3.2" ] }, - "@noble/curves@1.4.0": { - "integrity": "sha512-p+4cb332SFCrReJkCYe8Xzm0OWi4Jji5jVdIZRL/PmacmDkFNw6MrrV+gGpiPxLHbV+zKFRywUWbaseT+tZRXg==", - "dependencies": [ - "@noble/hashes@1.4.0" - ] - }, "@noble/curves@1.8.1": { "integrity": "sha512-warwspo+UYUPep0Q+vtdVB4Ugn8GGQj8iyB3gnRWsztmUHTI3S1nhdiWNsPUGL0vud7JlRRk1XEu7Lq1KGTnMQ==", "dependencies": [ @@ -952,14 +567,11 @@ "@noble/hashes@1.3.2": { "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==" }, - "@noble/hashes@1.4.0": { - "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==" - }, "@noble/hashes@1.7.1": { "integrity": "sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ==" }, - "@noble/secp256k1@2.1.0": { - "integrity": "sha512-XLEQQNdablO0XZOIniFQimiXsZDNwaYgL96dZwC54Q30imSbAOFf3NKtepc+cXyuZf5Q1HCgbqgZ2UFFuHVcEw==" + "@noble/secp256k1@2.2.3": { + "integrity": "sha512-l7r5oEQym9Us7EAigzg30/PQAvynhMt2uoYtT3t26eGDVm9Yii5mZ5jWSWmZ/oSIR2Et0xfc6DXrG0bZ787V3w==" }, "@opentelemetry/api@1.9.0": { "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==" @@ -967,9 +579,6 @@ "@scure/base@1.1.1": { "integrity": "sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA==" }, - "@scure/base@1.1.6": { - "integrity": "sha512-ok9AWwhcgYuGG3Zfhyqg+zwl+Wn5uE+dwC0NV/2qQkx4dABbb/bx96vWu8NSj+BNjjSjno+JRYRjle1jV08k3g==" - }, "@scure/base@1.2.4": { "integrity": "sha512-5Yy9czTO47mqz+/J8GM6GIId4umdCk1wc1q8rKERQulIoc8VP9pzDcghv10Tl2E7R96ZUx/PhND3ESYUQX8NuQ==" }, @@ -978,15 +587,7 @@ "dependencies": [ "@noble/curves@1.1.0", "@noble/hashes@1.3.2", - "@scure/base@1.1.6" - ] - }, - "@scure/bip32@1.4.0": { - "integrity": "sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==", - "dependencies": [ - "@noble/curves@1.4.0", - "@noble/hashes@1.4.0", - "@scure/base@1.1.6" + "@scure/base@1.1.1" ] }, "@scure/bip32@1.6.2": { @@ -1001,14 +602,7 @@ "integrity": "sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg==", "dependencies": [ "@noble/hashes@1.3.2", - "@scure/base@1.1.6" - ] - }, - "@scure/bip39@1.3.0": { - "integrity": "sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==", - "dependencies": [ - "@noble/hashes@1.4.0", - "@scure/base@1.1.6" + "@scure/base@1.1.1" ] }, "@scure/bip39@1.5.4": { @@ -1018,12 +612,6 @@ "@scure/base@1.2.4" ] }, - "@types/dompurify@3.0.5": { - "integrity": "sha512-1Wg0g3BtQF7sSb27fJQAKck1HECM6zV1EB66j8JH9i3LCjYabJa0FSdiSgsD5K/RbrsR0SiraKacLB+T8ZVYAg==", - "dependencies": [ - "@types/trusted-types" - ] - }, "@types/node@22.5.4": { "integrity": "sha512-FDuKUJQm/ju9fT/SeX/6+gBzoPzlVCzfzmGkwKvRHQVxi4BntVbyIwf6a4Xn62mrvndLiml6z/UBXIdEVjQLXg==", "dependencies": [ @@ -1033,20 +621,17 @@ "@types/trusted-types@2.0.7": { "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==" }, - "agent-base@7.1.1": { - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "agent-base@7.1.3": { + "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==" + }, + "ansi-escapes@7.0.0": { + "integrity": "sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==", "dependencies": [ - "debug@4.3.4" + "environment" ] }, - "ansi-escapes@6.2.0": { - "integrity": "sha512-kzRaCqXnpzWs+3z5ABPQiVke+iq0KXkHo8xiWV4RPTi5Yli0l97BEQuhXV1s7+aSU/fu1kUuxgS4MsQ0fRuygw==", - "dependencies": [ - "type-fest@3.13.1" - ] - }, - "ansi-regex@6.0.1": { - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==" + "ansi-regex@6.1.0": { + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==" }, "ansi-styles@6.2.1": { "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==" @@ -1063,8 +648,8 @@ "blurhash@2.0.5": { "integrity": "sha512-cRygWd7kGBQO3VEhPiTgq4Wc43ctsM+o46urrmPOiuAe+07fzlSB9OJVdpgDL0jPqXUVQ9ht7aq7kxOeJHRK+w==" }, - "braces@3.0.2": { - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "braces@3.0.3": { + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dependencies": [ "fill-range" ] @@ -1076,11 +661,18 @@ "ieee754" ] }, - "chalk@5.3.0": { - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==" + "call-bind-apply-helpers@1.0.2": { + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dependencies": [ + "es-errors", + "function-bind" + ] }, - "cli-cursor@4.0.0": { - "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", + "chalk@5.4.1": { + "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==" + }, + "cli-cursor@5.0.0": { + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", "dependencies": [ "restore-cursor" ] @@ -1130,26 +722,27 @@ "comlink" ] }, - "comlink@4.4.1": { - "integrity": "sha512-+1dlx0aY5Jo1vHy/tSsIGpSkN4tS9rZSW8FIhG0JH/crs9wwweswIo/POr451r7bZww3hFbPAKnTpimzL/mm4Q==" - }, - "commander@11.1.0": { - "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==" + "comlink@4.4.2": { + "integrity": "sha512-OxGdvBmJuNKSCMO4NTl1L47VRp6xn2wG4F/2hYzB6tiCb709otOxtEYCSvK80PtjODfXXZu8ds+Nw5kVCjqd2g==" }, "commander@12.1.0": { "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==" }, - "cross-spawn@7.0.3": { - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "commander@13.1.0": { + "integrity": "sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==" + }, + "cross-spawn@7.0.6": { + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dependencies": [ "path-key@3.1.1", "shebang-command", "which" ] }, - "cssstyle@4.1.0": { - "integrity": "sha512-h66W1URKpBS5YMI/V8PyXvTMFT8SupJ1IzoIV8IeBC/ji8WVmrO8dGlTi+2dh6whmdk6BiKJLD/ZBkhWbcg6nA==", + "cssstyle@4.3.0": { + "integrity": "sha512-6r0NiY0xizYqfBvWp1G7WXJ06/bZyrk7Dc6PHql82C/pKGUTKu4yAX4Y8JPamb1ob9nBKuxWzCGTRuGwU3yxJQ==", "dependencies": [ + "@asamuzakjp/css-color", "rrweb-cssom" ] }, @@ -1157,23 +750,23 @@ "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", "dependencies": [ "whatwg-mimetype", - "whatwg-url@14.0.0" + "whatwg-url@14.2.0" ] }, "debug@3.2.7": { "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dependencies": [ - "ms@2.1.3" + "ms" ] }, - "debug@4.3.4": { - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "debug@4.4.0": { + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", "dependencies": [ - "ms@2.1.2" + "ms" ] }, - "decimal.js@10.4.3": { - "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==" + "decimal.js@10.5.0": { + "integrity": "sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw==" }, "delayed-stream@1.0.0": { "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" @@ -1198,23 +791,58 @@ "domelementtype" ] }, - "dompurify@3.1.7": { - "integrity": "sha512-VaTstWtsneJY8xzy7DekmYWEOZcmzIe3Qb3zPd4STve1OBTa+e+WmS1ITQec1fZYXI3HCsOZZiSMpG6oxoWMWQ==" + "dompurify@3.2.4": { + "integrity": "sha512-ysFSFEDVduQpyhzAob/kkuJjf5zWkZD8/A9ywSp1byueyuCfHamrCBa14/Oc2iiB0e51B+NpxSl5gmzn+Ms/mg==", + "dependencies": [ + "@types/trusted-types" + ] }, - "domutils@3.1.0": { - "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "domutils@3.2.2": { + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", "dependencies": [ "dom-serializer", "domelementtype", "domhandler" ] }, - "emoji-regex@10.3.0": { - "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==" + "dunder-proto@1.0.1": { + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dependencies": [ + "call-bind-apply-helpers", + "es-errors", + "gopd" + ] + }, + "emoji-regex@10.4.0": { + "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==" }, "entities@4.5.0": { "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==" }, + "environment@1.1.0": { + "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==" + }, + "es-define-property@1.0.1": { + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==" + }, + "es-errors@1.3.0": { + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==" + }, + "es-object-atoms@1.1.1": { + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dependencies": [ + "es-errors" + ] + }, + "es-set-tostringtag@2.1.0": { + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dependencies": [ + "es-errors", + "get-intrinsic", + "has-tostringtag", + "hasown" + ] + }, "eventemitter3@5.0.1": { "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==" }, @@ -1228,47 +856,91 @@ "merge-stream", "npm-run-path", "onetime@6.0.0", - "signal-exit@4.1.0", + "signal-exit", "strip-final-newline" ] }, "fast-stable-stringify@1.0.0": { "integrity": "sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==" }, - "fill-range@7.0.1": { - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "fill-range@7.1.1": { + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dependencies": [ "to-regex-range" ] }, - "form-data@4.0.0": { - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "form-data@4.0.2": { + "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", "dependencies": [ "asynckit", "combined-stream", + "es-set-tostringtag", "mime-types" ] }, "formdata-helper@0.3.0": { "integrity": "sha512-QkRUFbNgWSu9lkc5TKLWri0ilTFowo950w13I5pRhj4cUxzMLuz0MIhGbE/gIRyfsZQoFeMNN0h06OCSOgfhUg==" }, - "get-east-asian-width@1.2.0": { - "integrity": "sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==" + "function-bind@1.1.2": { + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" + }, + "get-east-asian-width@1.3.0": { + "integrity": "sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==" + }, + "get-intrinsic@1.3.0": { + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dependencies": [ + "call-bind-apply-helpers", + "es-define-property", + "es-errors", + "es-object-atoms", + "function-bind", + "get-proto", + "gopd", + "has-symbols", + "hasown", + "math-intrinsics" + ] + }, + "get-proto@1.0.1": { + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dependencies": [ + "dunder-proto", + "es-object-atoms" + ] }, "get-stream@8.0.1": { "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==" }, + "gopd@1.2.0": { + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==" + }, + "has-symbols@1.1.0": { + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==" + }, + "has-tostringtag@1.0.2": { + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dependencies": [ + "has-symbols" + ] + }, + "hasown@2.0.2": { + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dependencies": [ + "function-bind" + ] + }, "he@1.2.0": { "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" }, - "hono-rate-limiter@0.3.0_hono@4.2.5": { + "hono-rate-limiter@0.3.0_hono@4.7.5": { "integrity": "sha512-QUS1N+DCZs8CKjpoHugvEvAp/+e+LUllPPnaIlATK9GyT26niQxn4H4V+O5kHwcsXjD3P3JOc0jMb7fnW6gpFQ==", "dependencies": [ "hono" ] }, - "hono@4.2.5": { - "integrity": "sha512-uonJD3i/yy005kQ7bPZRVfG3rejYJwyPqBmPoUGijS4UB/qM+YlrZ7xzSWy+ByDu9buGHUG+f+SKzz03Y6V1Kw==" + "hono@4.7.5": { + "integrity": "sha512-fDOK5W2C1vZACsgLONigdZTRZxuBqFtcKh7bUQ5cVSbwI2RWjloJDcgFOVzbQrlI6pCmhlTsVYZ7zpLj4m4qMQ==" }, "html-encoding-sniffer@4.0.0": { "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", @@ -1289,14 +961,14 @@ "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", "dependencies": [ "agent-base", - "debug@4.3.4" + "debug@4.4.0" ] }, - "https-proxy-agent@7.0.5": { - "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", + "https-proxy-agent@7.0.6": { + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", "dependencies": [ "agent-base", - "debug@4.3.4" + "debug@4.4.0" ] }, "human-signals@5.0.0": { @@ -1317,15 +989,6 @@ "ieee754@1.2.1": { "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" }, - "image-size@1.1.1": { - "integrity": "sha512-541xKlUw6jr/6gGuk92F+mYM5zaFAc5ahphvkqvNe2bQ6gVBkd6bfrmVJ2t4KDAfikAYZyIqTnktX3i6/aQDrQ==", - "dependencies": [ - "queue" - ] - }, - "inherits@2.0.4": { - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, "is-arrayish@0.3.2": { "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" }, @@ -1353,16 +1016,15 @@ "iso-639-1@3.1.5": { "integrity": "sha512-gXkz5+KN7HrG0Q5UGqSMO2qB9AsbEeyLP54kF1YrMsIxmu+g4BdB7rflReZTSTZGpfj8wywu6pfPBCylPIzGQA==" }, - "isomorphic-dompurify@2.16.0": { - "integrity": "sha512-cXhX2owp8rPxafCr0ywqy2CGI/4ceLNgWkWBEvUz64KTbtg3oRL2ZRqq/zW0pzt4YtDjkHLbwcp/lozpKzAQjg==", + "isomorphic-dompurify@2.22.0": { + "integrity": "sha512-A2xsDNST1yB94rErEnwqlzSvGllCJ4e8lDMe1OWBH2hvpfc/2qzgMEiDshTO1HwO+PIDTiYeOc7ZDB7Ds49BOg==", "dependencies": [ - "@types/dompurify", "dompurify", "jsdom" ] }, - "jsdom@25.0.1": { - "integrity": "sha512-8i7LzZj7BF8uplX+ZyOlIz86V6TAsSs+np6m1kpW9u0JWi4z/1t+FzcK1aek+ybTnAC4KhBL4uXCNT0wcUIeCw==", + "jsdom@26.0.0": { + "integrity": "sha512-BZYDGVAIriBWTpIxYzrXjv3E/4u8+/pSG5bQdIYCbNCGOvsPkDQfTVLAIXAf9ETdCpduCVTkDe2NNZ8NIwUVzw==", "dependencies": [ "cssstyle", "data-urls", @@ -1382,23 +1044,20 @@ "webidl-conversions@7.0.0", "whatwg-encoding", "whatwg-mimetype", - "whatwg-url@14.0.0", + "whatwg-url@14.2.0", "ws", "xml-name-validator" ] }, - "kysely-postgres-js@2.0.0_kysely@0.27.3_postgres@3.4.4": { + "kysely-postgres-js@2.0.0_kysely@0.27.6_postgres@3.4.5": { "integrity": "sha512-R1tWx6/x3tSatWvsmbHJxpBZYhNNxcnMw52QzZaHKg7ZOWtHib4iZyEaw4gb2hNKVctWQ3jfMxZT/ZaEMK6kBQ==", "dependencies": [ - "kysely@0.27.3", + "kysely", "postgres" ] }, - "kysely@0.27.3": { - "integrity": "sha512-lG03Ru+XyOJFsjH3OMY6R/9U38IjDPfnOfDgO3ynhbDr+Dz8fak+X6L62vqu3iybQnj+lG84OttBuU9KY3L9kA==" - }, - "kysely@0.27.4": { - "integrity": "sha512-dyNKv2KRvYOQPLCAOCjjQuCk4YFd33BvGdf/o5bC7FiW+BB6snA81Zt+2wT9QDFzKqxKa5rrOmvlK/anehCcgA==" + "kysely@0.27.6": { + "integrity": "sha512-FIyV/64EkKhJmjgC0g2hygpBv5RNWVPyNCqSAD7eTCv6eFWNIi4PN1UvdSJGicN/o35bnevgis4Y0UDC0qi8jQ==" }, "lande@1.0.10": { "integrity": "sha512-yT52DQh+UV2pEp08jOYrA4drDv0DbjpiRyZYgl25ak9G2cVR2AimzrqkYQWrD9a7Ud+qkAcaiDDoNH9DXfHPmw==", @@ -1406,36 +1065,36 @@ "toygrad" ] }, - "light-bolt11-decoder@3.1.1": { - "integrity": "sha512-sLg/KCwYkgsHWkefWd6KqpCHrLFWWaXTOX3cf6yD2hAzL0SLpX+lFcaFK2spkjbgzG6hhijKfORDc9WoUHwX0A==", + "light-bolt11-decoder@3.2.0": { + "integrity": "sha512-3QEofgiBOP4Ehs9BI+RkZdXZNtSys0nsJ6fyGeSiAGCBsMwHGUDS/JQlY/sTnWs91A2Nh0S9XXfA8Sy9g6QpuQ==", "dependencies": [ "@scure/base@1.1.1" ] }, - "lilconfig@3.0.0": { - "integrity": "sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==" + "lilconfig@3.1.3": { + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==" }, - "linkify-plugin-hashtag@4.1.3_linkifyjs@4.1.3": { - "integrity": "sha512-sq627UTrmmDhVnYoUbj/EFfSrhGBvAZYIUdUCjtLeW/AWBV7g9NX9JXEglAuJ7DIyJ84Ged0EHOe+xCXRe2Gmw==", + "linkify-plugin-hashtag@4.2.0_linkifyjs@4.2.0": { + "integrity": "sha512-qLgrxLA7LLKKi4cJPCvya/PlZZOercAqj6k4hi4jcl0zbquh+tNYyevzZ4his6YnpxhSYR8JJfXtDMwT3R9GSw==", "dependencies": [ "linkifyjs" ] }, - "linkify-string@4.1.3_linkifyjs@4.1.3": { - "integrity": "sha512-6dAgx4MiTcvEX87OS5aNpAioO7cSELUXp61k7azOvMYOLSmREx0w4yM1Uf0+O3JLC08YdkUyZhAX+YkasRt/mw==", + "linkify-string@4.2.0_linkifyjs@4.2.0": { + "integrity": "sha512-LqOKk0+RlqibFkxjPAGOL7Mfssqj6/SdG9QWGvzeVDpoWXhaw9OXxseCtFanjIl7C6UyTTZizhyGr4IWLfijiw==", "dependencies": [ "linkifyjs" ] }, - "linkifyjs@4.1.3": { - "integrity": "sha512-auMesunaJ8yfkHvK4gfg1K0SaKX/6Wn9g2Aac/NwX+l5VdmFZzo/hdPGxEOETj+ryRa4/fiOPjeeKURSAJx1sg==" + "linkifyjs@4.2.0": { + "integrity": "sha512-pCj3PrQyATaoTYKHrgWRF3SJwsm61udVh+vuls/Rl6SptiDhgE7ziUIudAedRY9QEfynmM7/RmLEfPUyw1HPCw==" }, - "lint-staged@15.2.2": { - "integrity": "sha512-TiTt93OPh1OZOsb5B7k96A/ATl2AjIZo+vnzFZ6oHK5FuTk63ByDtxGQpHm+kFETjEWqgkF95M8FRXKR/LEBcw==", + "lint-staged@15.5.0": { + "integrity": "sha512-WyCzSbfYGhK7cU+UuDDkzUiytbfbi0ZdPy2orwtM75P3WTtQBzmG40cCxIa8Ii2+XjfxzLH6Be46tUfWS85Xfg==", "dependencies": [ "chalk", - "commander@11.1.0", - "debug@4.3.4", + "commander@13.1.0", + "debug@4.4.0", "execa", "lilconfig", "listr2", @@ -1445,8 +1104,8 @@ "yaml" ] }, - "listr2@8.0.1": { - "integrity": "sha512-ovJXBXkKGfq+CwmKTjluEqFi3p4h8xvkxGQQAQan22YCgef4KZ1mKGjzfGh6PL6AW5Csw0QiQPNuQyH+6Xk3hA==", + "listr2@8.2.5": { + "integrity": "sha512-iyAZCeyD+c1gPyE9qpFu8af0Y+MRtmKOncdGoA2S5EY8iFq99dmmvkNnHiWo+pj0s7yH7l3KPIgee77tKpXPWQ==", "dependencies": [ "cli-truncate", "colorette", @@ -1456,8 +1115,8 @@ "wrap-ansi" ] }, - "log-update@6.0.0": { - "integrity": "sha512-niTvB4gqvtof056rRIrTZvjNYE4rCUzO6X/X+kYjd7WFxXeJ0NwEFnRxX6ehkvv3jTwrXnNdtAak5XYZuIyPFw==", + "log-update@6.1.0": { + "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==", "dependencies": [ "ansi-escapes", "cli-cursor", @@ -1466,14 +1125,17 @@ "wrap-ansi" ] }, - "lru-cache@10.2.2": { - "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==" + "lru-cache@10.4.3": { + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + }, + "math-intrinsics@1.1.0": { + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==" }, "merge-stream@2.0.0": { "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" }, - "micromatch@4.0.5": { - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "micromatch@4.0.8": { + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dependencies": [ "braces", "picomatch" @@ -1488,17 +1150,11 @@ "mime-db" ] }, - "mimic-fn@2.1.0": { - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" - }, "mimic-fn@4.0.0": { "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==" }, - "minimist@1.2.8": { - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" - }, - "ms@2.1.2": { - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "mimic-function@5.0.1": { + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==" }, "ms@2.1.3": { "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" @@ -1509,8 +1165,8 @@ "whatwg-url@5.0.0" ] }, - "nostr-tools@2.10.4": { - "integrity": "sha512-biU7sk+jxHgVASfobg2T5ttxOGGSt69wEVBC51sHHOEaKAAdzHBLV/I2l9Rf61UzClhliZwNouYhqIso4a3HYg==", + "nostr-tools@2.11.0": { + "integrity": "sha512-kRtXI9j5f45NvIcdJacQ0UEAfEb7p/jhZqhAGLQWtUd5idZJPYdSyR8hdw+MmpGH4TCMH5plZrXzFltIIZrkEA==", "dependencies": [ "@noble/ciphers", "@noble/curves@1.2.0", @@ -1533,18 +1189,6 @@ "nostr-wasm" ] }, - "nostr-tools@2.7.0": { - "integrity": "sha512-jJoL2J1CBiKDxaXZww27nY/Wsuxzx7AULxmGKFce4sskDu1tohNyfnzYQ8BvDyvkstU8kNZUAXPL32tre33uig==", - "dependencies": [ - "@noble/ciphers", - "@noble/curves@1.2.0", - "@noble/hashes@1.3.1", - "@scure/base@1.1.1", - "@scure/bip32@1.3.1", - "@scure/bip39@1.2.1", - "nostr-wasm" - ] - }, "nostr-wasm@0.1.0": { "integrity": "sha512-78BTryCLcLYv96ONU8Ws3Q1JzjlAt+43pWQhIl86xZmWeegYCNLPml7yQ+gG3vR6V5h4XGj+TxO+SS5dsThQIA==" }, @@ -1554,23 +1198,23 @@ "path-key@4.0.0" ] }, - "nwsapi@2.2.13": { - "integrity": "sha512-cTGB9ptp9dY9A5VbMSe7fQBcl/tt22Vcqdq8+eN93rblOuE0aCFu4aZ2vMwct/2t+lFnosm8RkQW1I0Omb1UtQ==" - }, - "onetime@5.1.2": { - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dependencies": [ - "mimic-fn@2.1.0" - ] + "nwsapi@2.2.20": { + "integrity": "sha512-/ieB+mDe4MrrKMT8z+mQL8klXydZWGR5Dowt4RAGKbJ3kIGEx3X4ljUo+6V73IXtUPWgfOlU5B9MlGxFO5T+cA==" }, "onetime@6.0.0": { "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", "dependencies": [ - "mimic-fn@4.0.0" + "mimic-fn" ] }, - "parse5@7.1.2": { - "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "onetime@7.0.0": { + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", + "dependencies": [ + "mimic-function" + ] + }, + "parse5@7.2.1": { + "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==", "dependencies": [ "entities" ] @@ -1581,8 +1225,8 @@ "path-key@4.0.0": { "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==" }, - "path-to-regexp@7.1.0": { - "integrity": "sha512-ZToe+MbUF4lBqk6dV8GKot4DKfzrxXsplOddH8zN3YK+qw9/McvP7+4ICjZvOne0jQhN4eJwHsX6tT0Ns19fvw==" + "path-to-regexp@7.2.0": { + "integrity": "sha512-0W4AcUxPpFlcS8ql8ZEmFwaI0X5WshUVAFdXe3PBurrt18DK8bvSS+UKHvJUAfGILco/nTtc/E4LcPNfVysfwQ==" }, "picomatch@2.3.1": { "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" @@ -1590,14 +1234,11 @@ "pidtree@0.6.0": { "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==" }, - "pngjs@6.0.0": { - "integrity": "sha512-TRzzuFRRmEoSW/p1KVAmiOgPco2Irlah+bGFCeNfJXxxYGwSw7YwAOAcd7X28K/m5bjBWKsC29KyoMfHbypayg==" + "postgres@3.4.5": { + "integrity": "sha512-cDWgoah1Gez9rN3H4165peY9qfpEo+SA61oQv65O3cRUE1pOEoJWwddwcqKE8XZYjbblOJlYDlLV4h67HrEVDg==" }, - "postgres@3.4.4": { - "integrity": "sha512-IbyN+9KslkqcXa8AO9fxpk97PA4pzewvpi2B3Dwy9u4zpV32QicaEdgmF3eSQUzdRk7ttDHQejNgAEr4XoeH4A==" - }, - "prom-client@15.1.2": { - "integrity": "sha512-on3h1iXb04QFLLThrmVYg1SChBQ9N1c+nKAjebBjokBqipddH3uxmOUcEkTnzmJ8Jh/5TSUnUqS40i2QB2dJHQ==", + "prom-client@15.1.3": { + "integrity": "sha512-6ZiOBfCywsD4k1BN9IX0uZhF+tJkV8q8llP64G5Hajs4JOeVLPCwpPVcpXy3BwYiUGgyJzsJJQeOIv7+hDSq8g==", "dependencies": [ "@opentelemetry/api", "tdigest" @@ -1606,24 +1247,18 @@ "punycode@2.3.1": { "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==" }, - "queue@6.0.2": { - "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", + "restore-cursor@5.1.0": { + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", "dependencies": [ - "inherits" + "onetime@7.0.0", + "signal-exit" ] }, - "restore-cursor@4.0.0": { - "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", - "dependencies": [ - "onetime@5.1.2", - "signal-exit@3.0.7" - ] + "rfdc@1.4.1": { + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==" }, - "rfdc@1.3.1": { - "integrity": "sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==" - }, - "rrweb-cssom@0.7.1": { - "integrity": "sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==" + "rrweb-cssom@0.8.0": { + "integrity": "sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==" }, "safer-buffer@2.1.2": { "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" @@ -1634,8 +1269,8 @@ "xmlchars" ] }, - "semver@7.6.3": { - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==" + "semver@7.7.1": { + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==" }, "sharp@0.33.5": { "integrity": "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==", @@ -1673,9 +1308,6 @@ "shebang-regex@3.0.0": { "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" }, - "signal-exit@3.0.7": { - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" - }, "signal-exit@4.1.0": { "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==" }, @@ -1702,8 +1334,8 @@ "string-argv@0.3.2": { "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==" }, - "string-width@7.1.0": { - "integrity": "sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==", + "string-width@7.2.0": { + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "dependencies": [ "emoji-regex", "get-east-asian-width", @@ -1728,31 +1360,13 @@ "bintrees" ] }, - "tldts-core@6.1.18": { - "integrity": "sha512-e4wx32F/7dMBSZyKAx825Yte3U0PQtZZ0bkWxYQiwLteRVnQ5zM40fEbi0IyNtwQssgJAk3GCr7Q+w39hX0VKA==" + "tldts-core@6.1.85": { + "integrity": "sha512-DTjUVvxckL1fIoPSb3KE7ISNtkWSawZdpfxGxwiIrZoO6EbHVDXXUIlIuWympPaeS+BLGyggozX/HTMsRAdsoA==" }, - "tldts-core@6.1.49": { - "integrity": "sha512-ctRO/wzBasOCxAStJG/60Qe8/QpGmaVPsE8djdk0vioxN4uCOgKoveH71Qc2EOmVMIjVf0BjigI5p9ZDuLOygg==" - }, - "tldts-core@6.1.61": { - "integrity": "sha512-In7VffkDWUPgwa+c9picLUxvb0RltVwTkSgMNFgvlGSWveCzGBemBqTsgJCL4EDFWZ6WH0fKTsot6yNhzy3ZzQ==" - }, - "tldts@6.1.18": { - "integrity": "sha512-F+6zjPFnFxZ0h6uGb8neQWwHQm8u3orZVFribsGq4eBgEVrzSkHxzWS2l6aKr19T1vXiOMFjqfff4fQt+WgJFg==", + "tldts@6.1.85": { + "integrity": "sha512-gBdZ1RjCSevRPFix/hpaUWeak2/RNUZB4/8frF1r5uYMHjFptkiT0JXIebWvgI/0ZHXvxaUDDJshiA0j6GdL3w==", "dependencies": [ - "tldts-core@6.1.18" - ] - }, - "tldts@6.1.49": { - "integrity": "sha512-E5se9HuCyfwWvmc0JiXiocOw+Cm4tlJCKewdB5RKMH8MmtiTsQCc+yu5BBYB5ZN4lNbz8Xg65bqJ1odS9+RhIA==", - "dependencies": [ - "tldts-core@6.1.49" - ] - }, - "tldts@6.1.61": { - "integrity": "sha512-rv8LUyez4Ygkopqn+M6OLItAOT9FF3REpPQDkdMx5ix8w4qkuE7Vo2o/vw1nxKQYmJDV8JpAMJQr1b+lTKf0FA==", - "dependencies": [ - "tldts-core@6.1.61" + "tldts-core" ] }, "to-regex-range@5.0.1": { @@ -1761,10 +1375,10 @@ "is-number" ] }, - "tough-cookie@5.0.0": { - "integrity": "sha512-FRKsF7cz96xIIeMZ82ehjC3xW2E+O2+v11udrDYewUbszngYhsGa8z6YUMMzO9QJZzzyd0nGGXnML/TReX6W8Q==", + "tough-cookie@5.1.2": { + "integrity": "sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==", "dependencies": [ - "tldts@6.1.49" + "tldts" ] }, "toygrad@2.6.0": { @@ -1773,23 +1387,20 @@ "tr46@0.0.3": { "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, - "tr46@5.0.0": { - "integrity": "sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==", + "tr46@5.1.0": { + "integrity": "sha512-IUWnUK7ADYR5Sl1fZlO1INDUhVhatWl7BtJWsIhwJ0UAK7ilzzIa8uIqOO/aYVWHZPJkKbEL+362wrzoeRF7bw==", "dependencies": [ "punycode" ] }, - "tseep@1.2.1": { - "integrity": "sha512-VFnsNcPGC4qFJ1nxbIPSjTmtRZOhlqLmtwRqtLVos8mbRHki8HO9cy9Z1e89EiWyxFmq6LBviI9TQjijxw/mEw==" + "tseep@1.3.1": { + "integrity": "sha512-ZPtfk1tQnZVyr7BPtbJ93qaAh2lZuIOpTMjhrYa4XctT8xe7t4SAW9LIxrySDuYMsfNNayE51E/WNGrNVgVicQ==" }, - "tslib@2.6.2": { - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + "tslib@2.8.1": { + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" }, - "type-fest@3.13.1": { - "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==" - }, - "type-fest@4.18.2": { - "integrity": "sha512-+suCYpfJLAe4OXS6+PPXjW3urOS4IoP9waSiLuXfLgqZODKw/aWwASvzqE886wA0kQgGy0mIWyhd87VpqIy6Xg==" + "type-fest@4.38.0": { + "integrity": "sha512-2dBz5D5ycHIoliLYLi0Q2V7KRaDlH0uWIvmk7TYlAg5slqwiPv1ezJdZm1QEM0xgk29oYWMCbIG7E6gHpvChlg==" }, "undici-types@6.19.8": { "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==" @@ -1816,9 +1427,6 @@ "webidl-conversions@7.0.0": { "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==" }, - "websocket-ts@2.1.5": { - "integrity": "sha512-rCNl9w6Hsir1azFm/pbjBEFzLD/gi7Th5ZgOxMifB6STUfTSovYAzryWw0TRvSZ1+Qu1Z5Plw4z42UfTNA9idA==" - }, "websocket-ts@2.2.1": { "integrity": "sha512-YKPDfxlK5qOheLZ2bTIiktZO1bpfGdNCPJmTEaPW7G9UXI1GKjDdeacOrsULUS000OPNxDVOyAuKLuIWPqWM0Q==" }, @@ -1831,10 +1439,10 @@ "whatwg-mimetype@4.0.0": { "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==" }, - "whatwg-url@14.0.0": { - "integrity": "sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==", + "whatwg-url@14.2.0": { + "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==", "dependencies": [ - "tr46@5.0.0", + "tr46@5.1.0", "webidl-conversions@7.0.0" ] }, @@ -1859,8 +1467,8 @@ "strip-ansi" ] }, - "ws@8.18.0": { - "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==" + "ws@8.18.1": { + "integrity": "sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==" }, "xml-name-validator@5.0.0": { "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==" @@ -1868,16 +1476,13 @@ "xmlchars@2.2.0": { "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" }, - "yaml@2.3.4": { - "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==" + "yaml@2.7.0": { + "integrity": "sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==" }, - "zod@3.23.8": { - "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==" + "zod@3.24.2": { + "integrity": "sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ==" } }, - "redirects": { - "https://github.com/xyzshantaram/postgres.js/raw/master/deno/mod.js": "https://raw.githubusercontent.com/xyzshantaram/postgres.js/master/deno/mod.js" - }, "remote": { "https://deno.land/std@0.132.0/_deno_unstable.ts": "23a1a36928f1b6d3b0170aaa67de09af12aa998525f608ff7331b9fb364cbde6", "https://deno.land/std@0.132.0/_util/assert.ts": "e94f2eb37cebd7f199952e242c77654e43333c1ac4c5c700e929ea3aa5489f74", @@ -2146,284 +1751,58 @@ "https://deno.land/std@0.132.0/streams/conversion.ts": "712585bfa0172a97fb68dd46e784ae8ad59d11b88079d6a4ab098ff42e697d21", "https://deno.land/std@0.132.0/testing/_diff.ts": "9d849cd6877694152e01775b2d93f9d6b7aef7e24bfe3bfafc4d7a1ac8e9f392", "https://deno.land/std@0.132.0/testing/asserts.ts": "b0ef969032882b1f7eb1c7571e313214baa1485f7b61cf35807b2434e254365c", - "https://deno.land/std@0.160.0/_util/assert.ts": "e94f2eb37cebd7f199952e242c77654e43333c1ac4c5c700e929ea3aa5489f74", - "https://deno.land/std@0.160.0/_util/os.ts": "8a33345f74990e627b9dfe2de9b040004b08ea5146c7c9e8fe9a29070d193934", - "https://deno.land/std@0.160.0/async/abortable.ts": "87aa7230be8360c24ad437212311c9e8d4328854baec27b4c7abb26e85515c06", - "https://deno.land/std@0.160.0/async/deadline.ts": "48ac998d7564969f3e6ec6b6f9bf0217ebd00239b1b2292feba61272d5dd58d0", - "https://deno.land/std@0.160.0/async/debounce.ts": "dc8b92d4a4fe7eac32c924f2b8d3e62112530db70cadce27042689d82970b350", - "https://deno.land/std@0.160.0/async/deferred.ts": "d8fb253ffde2a056e4889ef7e90f3928f28be9f9294b6505773d33f136aab4e6", - "https://deno.land/std@0.160.0/async/delay.ts": "0419dfc993752849692d1f9647edf13407c7facc3509b099381be99ffbc9d699", - "https://deno.land/std@0.160.0/async/mod.ts": "dd0a8ed4f3984ffabe2fcca7c9f466b7932d57b1864ffee148a5d5388316db6b", - "https://deno.land/std@0.160.0/async/mux_async_iterator.ts": "3447b28a2a582224a3d4d3596bccbba6e85040da3b97ed64012f7decce98d093", - "https://deno.land/std@0.160.0/async/pool.ts": "ef9eb97b388543acbf0ac32647121e4dbe629236899586c4d4311a8770fbb239", - "https://deno.land/std@0.160.0/async/tee.ts": "9af3a3e7612af75861308b52249e167f5ebc3dcfc8a1a4d45462d96606ee2b70", - "https://deno.land/std@0.160.0/bytes/bytes_list.ts": "aba5e2369e77d426b10af1de0dcc4531acecec27f9b9056f4f7bfbf8ac147ab4", - "https://deno.land/std@0.160.0/bytes/equals.ts": "3c3558c3ae85526f84510aa2b48ab2ad7bdd899e2e0f5b7a8ffc85acb3a6043a", - "https://deno.land/std@0.160.0/bytes/mod.ts": "b2e342fd3669176a27a4e15061e9d588b89c1aaf5008ab71766e23669565d179", - "https://deno.land/std@0.160.0/crypto/_fnv/fnv32.ts": "aa9bddead8c6345087d3abd4ef35fb9655622afc333fc41fff382b36e64280b5", - "https://deno.land/std@0.160.0/crypto/_fnv/fnv64.ts": "625d7e7505b6cb2e9801b5fd6ed0a89256bac12b2bbb3e4664b85a88b0ec5bef", - "https://deno.land/std@0.160.0/crypto/_fnv/index.ts": "a8f6a361b4c6d54e5e89c16098f99b6962a1dd6ad1307dbc97fa1ecac5d7060a", - "https://deno.land/std@0.160.0/crypto/_fnv/util.ts": "4848313bed7f00f55be3cb080aa0583fc007812ba965b03e4009665bde614ce3", - "https://deno.land/std@0.160.0/crypto/_wasm_crypto/lib/deno_std_wasm_crypto.generated.mjs": "258b484c2da27578bec61c01d4b62c21f72268d928d03c968c4eb590cb3bd830", - "https://deno.land/std@0.160.0/crypto/_wasm_crypto/mod.ts": "6c60d332716147ded0eece0861780678d51b560f533b27db2e15c64a4ef83665", - "https://deno.land/std@0.160.0/crypto/keystack.ts": "e481eed28007395e554a435e880fee83a5c73b9259ed8a135a75e4b1e4f381f7", - "https://deno.land/std@0.160.0/crypto/mod.ts": "fadedc013b4a86fda6305f1adc6d1c02225834d53cff5d95cc05f62b25127517", - "https://deno.land/std@0.160.0/crypto/timing_safe_equal.ts": "82a29b737bc8932d75d7a20c404136089d5d23629e94ba14efa98a8cc066c73e", - "https://deno.land/std@0.160.0/datetime/formatter.ts": "7c8e6d16a0950f400aef41b9f1eb9168249869776ec520265dfda785d746589e", - "https://deno.land/std@0.160.0/datetime/mod.ts": "ea927ca96dfb28c7b9a5eed5bdc7ac46bb9db38038c4922631895cea342fea87", - "https://deno.land/std@0.160.0/datetime/tokenizer.ts": "7381e28f6ab51cb504c7e132be31773d73ef2f3e1e50a812736962b9df1e8c47", - "https://deno.land/std@0.160.0/encoding/base64.ts": "c57868ca7fa2fbe919f57f88a623ad34e3d970d675bdc1ff3a9d02bba7409db2", - "https://deno.land/std@0.160.0/encoding/base64url.ts": "a5f82a9fa703bd85a5eb8e7c1296bc6529e601ebd9642cc2b5eaa6b38fa9e05a", - "https://deno.land/std@0.160.0/encoding/hex.ts": "4cc5324417cbb4ac9b828453d35aed45b9cc29506fad658f1f138d981ae33795", - "https://deno.land/std@0.160.0/fmt/colors.ts": "9e36a716611dcd2e4865adea9c4bec916b5c60caad4cdcdc630d4974e6bb8bd4", - "https://deno.land/std@0.160.0/io/buffer.ts": "fae02290f52301c4e0188670e730cd902f9307fb732d79c4aa14ebdc82497289", - "https://deno.land/std@0.160.0/path/_constants.ts": "df1db3ffa6dd6d1252cc9617e5d72165cd2483df90e93833e13580687b6083c3", - "https://deno.land/std@0.160.0/path/_interface.ts": "ee3b431a336b80cf445441109d089b70d87d5e248f4f90ff906820889ecf8d09", - "https://deno.land/std@0.160.0/path/_util.ts": "d16be2a16e1204b65f9d0dfc54a9bc472cafe5f4a190b3c8471ec2016ccd1677", - "https://deno.land/std@0.160.0/path/common.ts": "bee563630abd2d97f99d83c96c2fa0cca7cee103e8cb4e7699ec4d5db7bd2633", - "https://deno.land/std@0.160.0/path/glob.ts": "cb5255638de1048973c3e69e420c77dc04f75755524cb3b2e160fe9277d939ee", - "https://deno.land/std@0.160.0/path/mod.ts": "56fec03ad0ebd61b6ab39ddb9b0ddb4c4a5c9f2f4f632e09dd37ec9ebfd722ac", - "https://deno.land/std@0.160.0/path/posix.ts": "6b63de7097e68c8663c84ccedc0fd977656eb134432d818ecd3a4e122638ac24", - "https://deno.land/std@0.160.0/path/separator.ts": "fe1816cb765a8068afb3e8f13ad272351c85cbc739af56dacfc7d93d710fe0f9", - "https://deno.land/std@0.160.0/path/win32.ts": "ee8826dce087d31c5c81cd414714e677eb68febc40308de87a2ce4b40e10fb8d", - "https://deno.land/std@0.160.0/testing/_diff.ts": "a23e7fc2b4d8daa3e158fa06856bedf5334ce2a2831e8bf9e509717f455adb2c", - "https://deno.land/std@0.160.0/testing/_format.ts": "cd11136e1797791045e639e9f0f4640d5b4166148796cad37e6ef75f7d7f3832", - "https://deno.land/std@0.160.0/testing/asserts.ts": "1e340c589853e82e0807629ba31a43c84ebdcdeca910c4a9705715dfdb0f5ce8", - "https://deno.land/std@0.214.0/assert/assert.ts": "bec068b2fccdd434c138a555b19a2c2393b71dfaada02b7d568a01541e67cdc5", - "https://deno.land/std@0.214.0/assert/assertion_error.ts": "9f689a101ee586c4ce92f52fa7ddd362e86434ffdf1f848e45987dc7689976b8", - "https://deno.land/std@0.214.0/async/delay.ts": "8e1d18fe8b28ff95885e2bc54eccec1713f57f756053576d8228e6ca110793ad", - "https://deno.land/std@0.214.0/bytes/copy.ts": "f29c03168853720dfe82eaa57793d0b9e3543ebfe5306684182f0f1e3bfd422a", - "https://deno.land/std@0.214.0/crypto/_fnv/fnv32.ts": "ba2c5ef976b9f047d7ce2d33dfe18671afc75154bcf20ef89d932b2fe8820535", - "https://deno.land/std@0.214.0/crypto/_fnv/fnv64.ts": "580cadfe2ff333fe253d15df450f927c8ac7e408b704547be26aab41b5772558", - "https://deno.land/std@0.214.0/crypto/_fnv/mod.ts": "8dbb60f062a6e77b82f7a62ac11fabfba52c3cd408c21916b130d8f57a880f96", - "https://deno.land/std@0.214.0/crypto/_fnv/util.ts": "27b36ce3440d0a180af6bf1cfc2c326f68823288540a354dc1d636b781b9b75f", - "https://deno.land/std@0.214.0/crypto/_wasm/lib/deno_std_wasm_crypto.generated.mjs": "76c727912539737def4549bb62a96897f37eb334b979f49c57b8af7a1617635e", - "https://deno.land/std@0.214.0/crypto/_wasm/mod.ts": "c55f91473846827f077dfd7e5fc6e2726dee5003b6a5747610707cdc638a22ba", - "https://deno.land/std@0.214.0/crypto/crypto.ts": "4448f8461c797adba8d70a2c60f7795a546d7a0926e96366391bffdd06491c16", - "https://deno.land/std@0.214.0/datetime/_common.ts": "a62214c1924766e008e27d3d843ceba4b545dc2aa9880de0ecdef9966d5736b6", - "https://deno.land/std@0.214.0/datetime/parse.ts": "bb248bbcb3cd54bcaf504a1ee670fc4695e429d9019c06af954bbe2bcb8f1d02", - "https://deno.land/std@0.214.0/encoding/_util.ts": "beacef316c1255da9bc8e95afb1fa56ed69baef919c88dc06ae6cb7a6103d376", - "https://deno.land/std@0.214.0/encoding/base64.ts": "96e61a556d933201266fea84ae500453293f2aff130057b579baafda096a96bc", - "https://deno.land/std@0.214.0/encoding/hex.ts": "4d47d3b25103cf81a2ed38f54b394d39a77b63338e1eaa04b70c614cb45ec2e6", - "https://deno.land/std@0.214.0/fmt/colors.ts": "aeaee795471b56fc62a3cb2e174ed33e91551b535f44677f6320336aabb54fbb", - "https://deno.land/std@0.214.0/io/buf_reader.ts": "c73aad99491ee6db3d6b001fa4a780e9245c67b9296f5bad9c0fa7384e35d47a", - "https://deno.land/std@0.214.0/io/buf_writer.ts": "f82f640c8b3a820f600a8da429ad0537037c7d6a78426bbca2396fb1f75d3ef4", - "https://deno.land/std@0.214.0/io/types.ts": "748bbb3ac96abda03594ef5a0db15ce5450dcc6c0d841c8906f8b10ac8d32c96", - "https://deno.land/std@0.214.0/path/_common/assert_path.ts": "2ca275f36ac1788b2acb60fb2b79cb06027198bc2ba6fb7e163efaedde98c297", - "https://deno.land/std@0.214.0/path/_common/basename.ts": "569744855bc8445f3a56087fd2aed56bdad39da971a8d92b138c9913aecc5fa2", - "https://deno.land/std@0.214.0/path/_common/common.ts": "6157c7ec1f4db2b4a9a187efd6ce76dcaf1e61cfd49f87e40d4ea102818df031", - "https://deno.land/std@0.214.0/path/_common/constants.ts": "dc5f8057159f4b48cd304eb3027e42f1148cf4df1fb4240774d3492b5d12ac0c", - "https://deno.land/std@0.214.0/path/_common/dirname.ts": "684df4aa71a04bbcc346c692c8485594fc8a90b9408dfbc26ff32cf3e0c98cc8", - "https://deno.land/std@0.214.0/path/_common/format.ts": "92500e91ea5de21c97f5fe91e178bae62af524b72d5fcd246d6d60ae4bcada8b", - "https://deno.land/std@0.214.0/path/_common/from_file_url.ts": "d672bdeebc11bf80e99bf266f886c70963107bdd31134c4e249eef51133ceccf", - "https://deno.land/std@0.214.0/path/_common/glob_to_reg_exp.ts": "2007aa87bed6eb2c8ae8381adcc3125027543d9ec347713c1ad2c68427330770", - "https://deno.land/std@0.214.0/path/_common/normalize.ts": "684df4aa71a04bbcc346c692c8485594fc8a90b9408dfbc26ff32cf3e0c98cc8", - "https://deno.land/std@0.214.0/path/_common/normalize_string.ts": "dfdf657a1b1a7db7999f7c575ee7e6b0551d9c20f19486c6c3f5ff428384c965", - "https://deno.land/std@0.214.0/path/_common/relative.ts": "faa2753d9b32320ed4ada0733261e3357c186e5705678d9dd08b97527deae607", - "https://deno.land/std@0.214.0/path/_common/strip_trailing_separators.ts": "7024a93447efcdcfeaa9339a98fa63ef9d53de363f1fbe9858970f1bba02655a", - "https://deno.land/std@0.214.0/path/_common/to_file_url.ts": "7f76adbc83ece1bba173e6e98a27c647712cab773d3f8cbe0398b74afc817883", - "https://deno.land/std@0.214.0/path/_interface.ts": "a1419fcf45c0ceb8acdccc94394e3e94f99e18cfd32d509aab514c8841799600", - "https://deno.land/std@0.214.0/path/_os.ts": "8fb9b90fb6b753bd8c77cfd8a33c2ff6c5f5bc185f50de8ca4ac6a05710b2c15", - "https://deno.land/std@0.214.0/path/basename.ts": "5d341aadb7ada266e2280561692c165771d071c98746fcb66da928870cd47668", - "https://deno.land/std@0.214.0/path/common.ts": "03e52e22882402c986fe97ca3b5bb4263c2aa811c515ce84584b23bac4cc2643", - "https://deno.land/std@0.214.0/path/constants.ts": "0c206169ca104938ede9da48ac952de288f23343304a1c3cb6ec7625e7325f36", - "https://deno.land/std@0.214.0/path/dirname.ts": "85bd955bf31d62c9aafdd7ff561c4b5fb587d11a9a5a45e2b01aedffa4238a7c", - "https://deno.land/std@0.214.0/path/extname.ts": "593303db8ae8c865cbd9ceec6e55d4b9ac5410c1e276bfd3131916591b954441", - "https://deno.land/std@0.214.0/path/format.ts": "98fad25f1af7b96a48efb5b67378fcc8ed77be895df8b9c733b86411632162af", - "https://deno.land/std@0.214.0/path/from_file_url.ts": "911833ae4fd10a1c84f6271f36151ab785955849117dc48c6e43b929504ee069", - "https://deno.land/std@0.214.0/path/glob_to_regexp.ts": "83c5fd36a8c86f5e72df9d0f45317f9546afa2ce39acaafe079d43a865aced08", - "https://deno.land/std@0.214.0/path/is_absolute.ts": "4791afc8bfd0c87f0526eaa616b0d16e7b3ab6a65b62942e50eac68de4ef67d7", - "https://deno.land/std@0.214.0/path/is_glob.ts": "a65f6195d3058c3050ab905705891b412ff942a292bcbaa1a807a74439a14141", - "https://deno.land/std@0.214.0/path/join.ts": "ae2ec5ca44c7e84a235fd532e4a0116bfb1f2368b394db1c4fb75e3c0f26a33a", - "https://deno.land/std@0.214.0/path/join_globs.ts": "e9589869a33dc3982101898ee50903db918ca00ad2614dbe3934d597d7b1fbea", - "https://deno.land/std@0.214.0/path/mod.ts": "ffeaccb713dbe6c72e015b7c767f753f8ec5fbc3b621ff5eeee486ffc2c0ddda", - "https://deno.land/std@0.214.0/path/normalize.ts": "4155743ccceeed319b350c1e62e931600272fad8ad00c417b91df093867a8352", - "https://deno.land/std@0.214.0/path/normalize_glob.ts": "98ee8268fad271193603271c203ae973280b5abfbdd2cbca1053fd2af71869ca", - "https://deno.land/std@0.214.0/path/parse.ts": "65e8e285f1a63b714e19ef24b68f56e76934c3df0b6e65fd440d3991f4f8aefb", - "https://deno.land/std@0.214.0/path/posix/_util.ts": "1e3937da30f080bfc99fe45d7ed23c47dd8585c5e473b2d771380d3a6937cf9d", - "https://deno.land/std@0.214.0/path/posix/basename.ts": "39ee27a29f1f35935d3603ccf01d53f3d6e0c5d4d0f84421e65bd1afeff42843", - "https://deno.land/std@0.214.0/path/posix/common.ts": "26f60ccc8b2cac3e1613000c23ac5a7d392715d479e5be413473a37903a2b5d4", - "https://deno.land/std@0.214.0/path/posix/constants.ts": "93481efb98cdffa4c719c22a0182b994e5a6aed3047e1962f6c2c75b7592bef1", - "https://deno.land/std@0.214.0/path/posix/dirname.ts": "6535d2bdd566118963537b9dda8867ba9e2a361015540dc91f5afbb65c0cce8b", - "https://deno.land/std@0.214.0/path/posix/extname.ts": "8d36ae0082063c5e1191639699e6f77d3acf501600a3d87b74943f0ae5327427", - "https://deno.land/std@0.214.0/path/posix/format.ts": "185e9ee2091a42dd39e2a3b8e4925370ee8407572cee1ae52838aed96310c5c1", - "https://deno.land/std@0.214.0/path/posix/from_file_url.ts": "951aee3a2c46fd0ed488899d024c6352b59154c70552e90885ed0c2ab699bc40", - "https://deno.land/std@0.214.0/path/posix/glob_to_regexp.ts": "54d3ff40f309e3732ab6e5b19d7111d2d415248bcd35b67a99defcbc1972e697", - "https://deno.land/std@0.214.0/path/posix/is_absolute.ts": "cebe561ad0ae294f0ce0365a1879dcfca8abd872821519b4fcc8d8967f888ede", - "https://deno.land/std@0.214.0/path/posix/is_glob.ts": "8a8b08c08bf731acf2c1232218f1f45a11131bc01de81e5f803450a5914434b9", - "https://deno.land/std@0.214.0/path/posix/join.ts": "aef88d5fa3650f7516730865dbb951594d1a955b785e2450dbee93b8e32694f3", - "https://deno.land/std@0.214.0/path/posix/join_globs.ts": "ee2f4676c5b8a0dfa519da58b8ade4d1c4aa8dd3fe35619edec883ae9df1f8c9", - "https://deno.land/std@0.214.0/path/posix/mod.ts": "563a18c2b3ddc62f3e4a324ff0f583e819b8602a72ad880cb98c9e2e34f8db5b", - "https://deno.land/std@0.214.0/path/posix/normalize.ts": "baeb49816a8299f90a0237d214cef46f00ba3e95c0d2ceb74205a6a584b58a91", - "https://deno.land/std@0.214.0/path/posix/normalize_glob.ts": "65f0138fa518ef9ece354f32889783fc38cdf985fb02dcf1c3b14fa47d665640", - "https://deno.land/std@0.214.0/path/posix/parse.ts": "d5bac4eb21262ab168eead7e2196cb862940c84cee572eafedd12a0d34adc8fb", - "https://deno.land/std@0.214.0/path/posix/relative.ts": "3907d6eda41f0ff723d336125a1ad4349112cd4d48f693859980314d5b9da31c", - "https://deno.land/std@0.214.0/path/posix/resolve.ts": "bac20d9921beebbbb2b73706683b518b1d0c1b1da514140cee409e90d6b2913a", - "https://deno.land/std@0.214.0/path/posix/separator.ts": "c9ecae5c843170118156ac5d12dc53e9caf6a1a4c96fc8b1a0ab02dff5c847b0", - "https://deno.land/std@0.214.0/path/posix/to_file_url.ts": "7aa752ba66a35049e0e4a4be5a0a31ac6b645257d2e031142abb1854de250aaf", - "https://deno.land/std@0.214.0/path/posix/to_namespaced_path.ts": "28b216b3c76f892a4dca9734ff1cc0045d135532bfd9c435ae4858bfa5a2ebf0", - "https://deno.land/std@0.214.0/path/relative.ts": "ab739d727180ed8727e34ed71d976912461d98e2b76de3d3de834c1066667add", - "https://deno.land/std@0.214.0/path/resolve.ts": "a6f977bdb4272e79d8d0ed4333e3d71367cc3926acf15ac271f1d059c8494d8d", - "https://deno.land/std@0.214.0/path/separator.ts": "c6c890507f944a1f5cb7d53b8d638d6ce3cf0f34609c8d84a10c1eaa400b77a9", - "https://deno.land/std@0.214.0/path/to_file_url.ts": "88f049b769bce411e2d2db5bd9e6fd9a185a5fbd6b9f5ad8f52bef517c4ece1b", - "https://deno.land/std@0.214.0/path/to_namespaced_path.ts": "b706a4103b104cfadc09600a5f838c2ba94dbcdb642344557122dda444526e40", - "https://deno.land/std@0.214.0/path/windows/_util.ts": "d5f47363e5293fced22c984550d5e70e98e266cc3f31769e1710511803d04808", - "https://deno.land/std@0.214.0/path/windows/basename.ts": "e2dbf31d1d6385bfab1ce38c333aa290b6d7ae9e0ecb8234a654e583cf22f8fe", - "https://deno.land/std@0.214.0/path/windows/common.ts": "26f60ccc8b2cac3e1613000c23ac5a7d392715d479e5be413473a37903a2b5d4", - "https://deno.land/std@0.214.0/path/windows/constants.ts": "5afaac0a1f67b68b0a380a4ef391bf59feb55856aa8c60dfc01bd3b6abb813f5", - "https://deno.land/std@0.214.0/path/windows/dirname.ts": "33e421be5a5558a1346a48e74c330b8e560be7424ed7684ea03c12c21b627bc9", - "https://deno.land/std@0.214.0/path/windows/extname.ts": "165a61b00d781257fda1e9606a48c78b06815385e7d703232548dbfc95346bef", - "https://deno.land/std@0.214.0/path/windows/format.ts": "bbb5ecf379305b472b1082cd2fdc010e44a0020030414974d6029be9ad52aeb6", - "https://deno.land/std@0.214.0/path/windows/from_file_url.ts": "ced2d587b6dff18f963f269d745c4a599cf82b0c4007356bd957cb4cb52efc01", - "https://deno.land/std@0.214.0/path/windows/glob_to_regexp.ts": "6dcd1242bd8907aa9660cbdd7c93446e6927b201112b0cba37ca5d80f81be51b", - "https://deno.land/std@0.214.0/path/windows/is_absolute.ts": "4a8f6853f8598cf91a835f41abed42112cebab09478b072e4beb00ec81f8ca8a", - "https://deno.land/std@0.214.0/path/windows/is_glob.ts": "8a8b08c08bf731acf2c1232218f1f45a11131bc01de81e5f803450a5914434b9", - "https://deno.land/std@0.214.0/path/windows/join.ts": "e0b3356615c1a75c56ebb6a7311157911659e11fd533d80d724800126b761ac3", - "https://deno.land/std@0.214.0/path/windows/join_globs.ts": "ee2f4676c5b8a0dfa519da58b8ade4d1c4aa8dd3fe35619edec883ae9df1f8c9", - "https://deno.land/std@0.214.0/path/windows/mod.ts": "7d6062927bda47c47847ffb55d8f1a37b0383840aee5c7dfc93984005819689c", - "https://deno.land/std@0.214.0/path/windows/normalize.ts": "78126170ab917f0ca355a9af9e65ad6bfa5be14d574c5fb09bb1920f52577780", - "https://deno.land/std@0.214.0/path/windows/normalize_glob.ts": "179c86ba89f4d3fe283d2addbe0607341f79ee9b1ae663abcfb3439db2e97810", - "https://deno.land/std@0.214.0/path/windows/parse.ts": "b9239edd892a06a06625c1b58425e199f018ce5649ace024d144495c984da734", - "https://deno.land/std@0.214.0/path/windows/relative.ts": "3e1abc7977ee6cc0db2730d1f9cb38be87b0ce4806759d271a70e4997fc638d7", - "https://deno.land/std@0.214.0/path/windows/resolve.ts": "75b2e3e1238d840782cee3d8864d82bfaa593c7af8b22f19c6422cf82f330ab3", - "https://deno.land/std@0.214.0/path/windows/separator.ts": "e51c5522140eff4f8402617c5c68a201fdfa3a1a8b28dc23587cff931b665e43", - "https://deno.land/std@0.214.0/path/windows/to_file_url.ts": "1cd63fd35ec8d1370feaa4752eccc4cc05ea5362a878be8dc7db733650995484", - "https://deno.land/std@0.214.0/path/windows/to_namespaced_path.ts": "4ffa4fb6fae321448d5fe810b3ca741d84df4d7897e61ee29be961a6aac89a4c", "https://deno.land/std@0.80.0/encoding/utf8.ts": "1b7e77db9a12363c67872f8a208886ca1329f160c1ca9133b13d2ed399688b99", - "https://deno.land/x/hono@v3.10.1/adapter/deno/serve-static.ts": "ba10cf6aaf39da942b0d49c3b9877ddba69d41d414c6551d890beb1085f58eea", - "https://deno.land/x/hono@v3.10.1/client/client.ts": "ff340f58041203879972dd368b011ed130c66914f789826610869a90603406bf", - "https://deno.land/x/hono@v3.10.1/client/index.ts": "3ff4cf246f3543f827a85a2c84d66a025ac350ee927613629bda47e854bfb7ba", - "https://deno.land/x/hono@v3.10.1/client/types.ts": "52c66cbe74540e1811259a48c30622ac915666196eb978092d166435cbc15213", - "https://deno.land/x/hono@v3.10.1/client/utils.ts": "053273c002963b549d38268a1b423ac8ca211a8028bdab1ed0b781a62aa5e661", - "https://deno.land/x/hono@v3.10.1/compose.ts": "e8ab4b345aa367f2dd65f221c9fe829dd885326a613f4215b654f93a4066bb5c", - "https://deno.land/x/hono@v3.10.1/context.ts": "261cc8b8b1e8f04b98beab1cca6692f317b7dc6d2b75b4f84c982e54cf1db730", - "https://deno.land/x/hono@v3.10.1/helper/adapter/index.ts": "eea9b4caedbfa3a3b4a020bf46c88c0171a00008cd6c10708cd85a3e39d86e62", - "https://deno.land/x/hono@v3.10.1/helper/cookie/index.ts": "55ccd20bbd8d9a8bb2ecd998e90845c1d306c19027f54b3d1b89a5be35968b80", - "https://deno.land/x/hono@v3.10.1/helper/html/index.ts": "aba19e8d29f217c7fffa5719cf606c4e259b540d51296e82bbea3c992e2ecbc6", - "https://deno.land/x/hono@v3.10.1/hono-base.ts": "cc55e0a4c63a7bdf44df3e804ea4737d5399eeb6606b45d102f8e48c3ff1e925", - "https://deno.land/x/hono@v3.10.1/hono.ts": "2cc4c292e541463a4d6f83edbcea58048d203e9564ae62ec430a3d466b49a865", - "https://deno.land/x/hono@v3.10.1/http-exception.ts": "6071df078b5f76d279684d52fe82a590f447a64ffe1b75eb5064d0c8a8d2d676", - "https://deno.land/x/hono@v3.10.1/jsx/index.ts": "019512d3a9b3897b879e87fa5fb179cd34f3d326f8ff8b93379c2bb707ec168a", - "https://deno.land/x/hono@v3.10.1/jsx/intrinsic-elements.ts": "03250beb610bda1c72017bc0912c2505ff764b7a8d869e7e4add40eb4cfec096", - "https://deno.land/x/hono@v3.10.1/jsx/streaming.ts": "5d03b4d02eaa396c8f0f33c3f6e8c7ed3afb7598283c2d4a7ddea0ada8c212a7", - "https://deno.land/x/hono@v3.10.1/middleware.ts": "57b2047c4b9d775a052a9c44a3b805802c1d1cb477ab9c4bb6185d27382d1b96", - "https://deno.land/x/hono@v3.10.1/middleware/basic-auth/index.ts": "5505288ccf9364f56f7be2dfac841543b72e20656e54ac646a1a73a0aa853261", - "https://deno.land/x/hono@v3.10.1/middleware/bearer-auth/index.ts": "d11fe14e0a3006f6d35c391e455fe20d8ece9561e48b6a5580e4b87dd491cd90", - "https://deno.land/x/hono@v3.10.1/middleware/cache/index.ts": "9e5d31d33206bb5dba46dde16ed606dd2cb361d75c26b02e02c72bd1fb6fe53e", - "https://deno.land/x/hono@v3.10.1/middleware/compress/index.ts": "85d315c9a942d7758e5c524dc94b736124646a56752e56c6e4284f3989b4692a", - "https://deno.land/x/hono@v3.10.1/middleware/cors/index.ts": "d481eba7e05d3448cd326d3dca8b9c7e16ecf0d27a37fd7d700485834123ae5e", - "https://deno.land/x/hono@v3.10.1/middleware/etag/index.ts": "4ad675e108dc98dccca0e9e35cd903701669a1aea676b8b51266c3b602e4d54c", - "https://deno.land/x/hono@v3.10.1/middleware/jsx-renderer/index.ts": "5352d6dda872d419ebafbd4d6b408f66ad473fc3d395d82327850c1e786d7344", - "https://deno.land/x/hono@v3.10.1/middleware/jwt/index.ts": "c6e02a94a3911299d21392b3b1f8710bda7cacf0d60db59c0e2f0d9fa8ff1a70", - "https://deno.land/x/hono@v3.10.1/middleware/logger/index.ts": "c139f372f482baeffbad68b14bef990e011fe8df578dcee71fb612ffad7fe748", - "https://deno.land/x/hono@v3.10.1/middleware/powered-by/index.ts": "c36b7a3d1322c6a37f3d1510f7ff04a85aa6cacfac2173e5f1913eb16c3cc869", - "https://deno.land/x/hono@v3.10.1/middleware/pretty-json/index.ts": "f6967ceecdb42c95ddd5e2e7bc8545d3e8bda111fa659f3f1336b2e6fe6b0bb0", - "https://deno.land/x/hono@v3.10.1/middleware/secure-headers/index.ts": "d2b8a7978e3d201ead5ac8fd22e3adc9094189aebcba0d9cd51b98773927a5d5", - "https://deno.land/x/hono@v3.10.1/middleware/timing/index.ts": "d6976a07d9d51a7b26dae1311fe51d0744f7d234498bac3fe024ec7088c0ca47", - "https://deno.land/x/hono@v3.10.1/mod.ts": "90114a97be9111b348129ad0143e764a64921f60dd03b8f3da529db98a0d3a82", - "https://deno.land/x/hono@v3.10.1/request.ts": "52330303dd7a3bf4f580fde0463ba608bc4c88a8b7b5edd7c1327064c7cf65ce", - "https://deno.land/x/hono@v3.10.1/router.ts": "39d573f48baee429810cd583c931dd44274273c30804d538c86967d310ea4ab5", - "https://deno.land/x/hono@v3.10.1/router/linear-router/index.ts": "8a2a7144c50b1f4a92d9ee99c2c396716af144c868e10608255f969695efccd0", - "https://deno.land/x/hono@v3.10.1/router/linear-router/router.ts": "bc63e8b5bc1dabc815306d50bebd1bb5877ffa3936ba2ad7550d093c95ee6bd1", - "https://deno.land/x/hono@v3.10.1/router/pattern-router/index.ts": "304a66c50e243872037ed41c7dd79ed0c89d815e17e172e7ad7cdc4bc07d3383", - "https://deno.land/x/hono@v3.10.1/router/pattern-router/router.ts": "a9a5a2a182cce8c3ae82139892cc0502be7dd8f579f31e76d0302b19b338e548", - "https://deno.land/x/hono@v3.10.1/router/reg-exp-router/index.ts": "52755829213941756159b7a963097bafde5cc4fc22b13b1c7c9184dc0512d1db", - "https://deno.land/x/hono@v3.10.1/router/reg-exp-router/node.ts": "5b3fb80411db04c65df066e69fedb2c8c0844753c2633d703336de84d569252c", - "https://deno.land/x/hono@v3.10.1/router/reg-exp-router/router.ts": "fbe8917aa24fe25d0208bfa82ce7f49ba0507f9ae158d4d0c177f6a061b0a561", - "https://deno.land/x/hono@v3.10.1/router/reg-exp-router/trie.ts": "852ce7207e6701e47fa30889a0d2b8bfcd56d8862c97e7bc9831e0a64bd8835f", - "https://deno.land/x/hono@v3.10.1/router/smart-router/index.ts": "74f9b4fe15ea535900f2b9b048581915f12fe94e531dd2b0032f5610e61c3bef", - "https://deno.land/x/hono@v3.10.1/router/smart-router/router.ts": "71979c06b32b093960a6e8efc4c185e558f280bff18846b8b1cdc757ade6ff99", - "https://deno.land/x/hono@v3.10.1/router/trie-router/index.ts": "3eb75e7f71ba81801631b30de6b1f5cefb2c7239c03797e2b2cbab5085911b41", - "https://deno.land/x/hono@v3.10.1/router/trie-router/node.ts": "3af15fa9c9994a8664a2b7a7c11233504b5bb9d4fcf7bb34cf30d7199052c39f", - "https://deno.land/x/hono@v3.10.1/router/trie-router/router.ts": "54ced78d35676302c8fcdda4204f7bdf5a7cc907fbf9967c75674b1e394f830d", - "https://deno.land/x/hono@v3.10.1/types.ts": "edc414a92383f9deb82f5f7a09e95bcf76f6100c23457c27d041986768f5345c", - "https://deno.land/x/hono@v3.10.1/utils/body.ts": "7a16a6656331a96bcae57642f8d5e3912bd361cbbcc2c0d2157ecc3f218f7a92", - "https://deno.land/x/hono@v3.10.1/utils/buffer.ts": "9066a973e64498cb262c7e932f47eed525a51677b17f90893862b7279dc0773e", - "https://deno.land/x/hono@v3.10.1/utils/cookie.ts": "19920ba6756944aae1ad8585c3ddeaa9df479733f59d05359db096f7361e5e4b", - "https://deno.land/x/hono@v3.10.1/utils/crypto.ts": "bda0e141bbe46d3a4a20f8fbcb6380d473b617123d9fdfa93e4499410b537acc", - "https://deno.land/x/hono@v3.10.1/utils/encode.ts": "3b7c7d736123b5073542b34321700d4dbf5ff129c138f434bb2144a4d425ee89", - "https://deno.land/x/hono@v3.10.1/utils/filepath.ts": "18461b055a914d6da85077f453051b516281bb17cf64fa74bf5ef604dc9d2861", - "https://deno.land/x/hono@v3.10.1/utils/html.ts": "01c1520a4256f899da1954357cf63ae11c348eda141a505f72d7090cf5481aba", - "https://deno.land/x/hono@v3.10.1/utils/http-status.ts": "e0c4343ea7717c314dc600131e16b636c29d61cfdaf9df93b267258d1729d1a0", - "https://deno.land/x/hono@v3.10.1/utils/jwt/index.ts": "5e4b82a42eb3603351dfce726cd781ca41cb57437395409d227131aec348d2d5", - "https://deno.land/x/hono@v3.10.1/utils/jwt/jwt.ts": "02ff7bbf1298ffcc7a40266842f8eac44b6c136453e32d4441e24d0cbfba3a95", - "https://deno.land/x/hono@v3.10.1/utils/jwt/types.ts": "58ddf908f76ba18d9c62ddfc2d1e40cc2e306bf987409a6169287efa81ce2546", - "https://deno.land/x/hono@v3.10.1/utils/mime.ts": "0105d2b5e8e91f07acc70f5d06b388313995d62af23c802fcfba251f5a744d95", - "https://deno.land/x/hono@v3.10.1/utils/stream.ts": "1789dcc73c5b0ede28f83d7d34e47ae432c20e680907cb3275a9c9187f293983", - "https://deno.land/x/hono@v3.10.1/utils/types.ts": "ddff055e6d35066232efdfbd42c8954e855c04279c27dcd735d929b6b4f319b3", - "https://deno.land/x/hono@v3.10.1/utils/url.ts": "5fc3307ef3cb2e6f34ec2a03e3d7f2126c6a9f5f0eab677222df3f0e40bd7567", - "https://deno.land/x/hono@v3.10.1/validator/index.ts": "6c986e8b91dcf857ecc8164a506ae8eea8665792a4ff7215471df669c632ae7c", - "https://deno.land/x/hono@v3.10.1/validator/validator.ts": "afa5e52495e0996fbba61996736fab5c486590d72d376f809e9f9ff4e0c463e9", "https://deno.land/x/keypress@0.0.7/dep.ts": "feeb0056d332c126343249b79fe86cb0bf3abd03ea4c270cd39575c38d37a911", "https://deno.land/x/keypress@0.0.7/mod.ts": "1130570c2397118a3a301b1137400a8e55486716cc3557b3bd5e9947b6b9c035", - "https://deno.land/x/kysely_deno_postgres@v0.4.0/deps.ts": "7970f66a52a9fa0cef607cb7ef0171212af2ccb83e73ecfa7629aabc28a38793", - "https://deno.land/x/kysely_deno_postgres@v0.4.0/mod.ts": "662438fd3909984bb8cbaf3fd44d2121e949d11301baf21d6c3f057ccf9887de", - "https://deno.land/x/kysely_deno_postgres@v0.4.0/src/PostgreSQLDriver.ts": "590c2fa248cff38e6e0f623050983039b5fde61e9c7131593d2922fb1f0eb921", - "https://deno.land/x/kysely_deno_postgres@v0.4.0/src/PostgreSQLDriverDatabaseConnection.ts": "83cd176ca830407dbff8495140cba870d1a34b27075c91ef1d5dbf7bbe467c40", - "https://deno.land/x/postgres@v0.17.0/client.ts": "348779c9f6a1c75ef1336db662faf08dce7d2101ff72f0d1e341ba1505c8431d", - "https://deno.land/x/postgres@v0.17.0/client/error.ts": "0817583b666fd546664ed52c1d37beccc5a9eebcc6e3c2ead20ada99b681e5f7", - "https://deno.land/x/postgres@v0.17.0/connection/auth.ts": "1070125e2ac4ca4ade36d69a4222d37001903092826d313217987583edd61ce9", - "https://deno.land/x/postgres@v0.17.0/connection/connection.ts": "428ed3efa055870db505092b5d3545ef743497b7b4b72cf8f0593e7dd4788acd", - "https://deno.land/x/postgres@v0.17.0/connection/connection_params.ts": "52bfe90e8860f584b95b1b08c254dde97c3aa763c4b6bee0c80c5930e35459e0", - "https://deno.land/x/postgres@v0.17.0/connection/message.ts": "f9257948b7f87d58bfbfe3fc6e2e08f0de3ef885655904d56a5f73655cc22c5a", - "https://deno.land/x/postgres@v0.17.0/connection/message_code.ts": "466719008b298770c366c5c63f6cf8285b7f76514dadb4b11e7d9756a8a1ddbf", - "https://deno.land/x/postgres@v0.17.0/connection/packet.ts": "050aeff1fc13c9349e89451a155ffcd0b1343dc313a51f84439e3e45f64b56c8", - "https://deno.land/x/postgres@v0.17.0/connection/scram.ts": "0c7a2551fe7b1a1c62dd856b7714731a7e7534ccca10093336782d1bfc5b2bd2", - "https://deno.land/x/postgres@v0.17.0/deps.ts": "f47ccb41f7f97eaad455d94f407ef97146ae99443dbe782894422c869fbba69e", - "https://deno.land/x/postgres@v0.17.0/mod.ts": "a1e18fd9e6fedc8bc24e5aeec3ae6de45e2274be1411fb66e9081420c5e81d7d", - "https://deno.land/x/postgres@v0.17.0/pool.ts": "892db7b5e1787988babecc994a151ebbd7d017f080905cbe9c3d7b44a73032a9", - "https://deno.land/x/postgres@v0.17.0/query/array_parser.ts": "f8a229d82c3801de8266fa2cc4afe12e94fef8d0c479e73655c86ed3667ef33f", - "https://deno.land/x/postgres@v0.17.0/query/decode.ts": "44a4a6cbcf494ed91a4fecae38a57dce63a7b519166f02c702791d9717371419", - "https://deno.land/x/postgres@v0.17.0/query/decoders.ts": "16cb0e60227d86692931e315421b15768c78526e3aeb84e25fcc4111096de9fd", - "https://deno.land/x/postgres@v0.17.0/query/encode.ts": "5f1418a2932b7c2231556e4a5f5f56efef48728014070cfafe7656963f342933", - "https://deno.land/x/postgres@v0.17.0/query/oid.ts": "8c33e1325f34e4ca9f11a48b8066c8cfcace5f64bc1eb17ad7247af4936999e1", - "https://deno.land/x/postgres@v0.17.0/query/query.ts": "edb473cbcfeff2ee1c631272afb25d079d06b66b5853f42492725b03ffa742b6", - "https://deno.land/x/postgres@v0.17.0/query/transaction.ts": "8e75c3ce0aca97da7fe126e68f8e6c08d640e5c8d2016e62cee5c254bebe7fe8", - "https://deno.land/x/postgres@v0.17.0/query/types.ts": "a6dc8024867fe7ccb0ba4b4fa403ee5d474c7742174128c8e689c3b5e5eaa933", - "https://deno.land/x/postgres@v0.17.0/utils/deferred.ts": "dd94f2a57355355c47812b061a51b55263f72d24e9cb3fdb474c7519f4d61083", - "https://deno.land/x/postgres@v0.17.0/utils/utils.ts": "19c3527ddd5c6c4c49ae36397120274c7f41f9d3cbf479cb36065d23329e9f90", - "https://deno.land/x/postgres@v0.19.0/client.ts": "315a27543a86c5703555d9be06f291ecd51bf403ee25a5bdc7d1c3387e8116ad", - "https://deno.land/x/postgres@v0.19.0/client/error.ts": "05b0e35d65caf0ba21f7f6fab28c0811da83cd8b4897995a2f411c2c83391036", - "https://deno.land/x/postgres@v0.19.0/connection/auth.ts": "db15c1659742ef4d2791b32834950278dc7a40cb931f8e434e6569298e58df51", - "https://deno.land/x/postgres@v0.19.0/connection/connection.ts": "198a0ecf92a0d2aa72db3bb88b8f412d3b1f6b87d464d5f7bff9aa3b6aff8370", - "https://deno.land/x/postgres@v0.19.0/connection/connection_params.ts": "66389d9d2e638a6a67c4fb08052f460ccb819d1e13b8ed818c5ae43918f9c38f", - "https://deno.land/x/postgres@v0.19.0/connection/message.ts": "20da5d80fc4d7ddb7b850083e0b3fa8734eb26642221dad89c62e27d78e57a4d", - "https://deno.land/x/postgres@v0.19.0/connection/message_code.ts": "12bcb110df6945152f9f6c63128786558d7ad1e61006920daaa16ef85b3bab7d", - "https://deno.land/x/postgres@v0.19.0/connection/packet.ts": "050aeff1fc13c9349e89451a155ffcd0b1343dc313a51f84439e3e45f64b56c8", - "https://deno.land/x/postgres@v0.19.0/connection/scram.ts": "532d4d58b565a2ab48fb5e1e14dc9bfb3bb283d535011e371e698eb4a89dd994", - "https://deno.land/x/postgres@v0.19.0/debug.ts": "8add17699191f11e6830b8c95d9de25857d221bb2cf6c4ae22254d395895c1f9", - "https://deno.land/x/postgres@v0.19.0/deps.ts": "c312038fe64b8368f8a294119f11d8f235fe67de84d7c3b0ef67b3a56628171a", - "https://deno.land/x/postgres@v0.19.0/mod.ts": "4930c7b44f8d16ea71026f7e3ef22a2322d84655edceacd55f7461a9218d8560", - "https://deno.land/x/postgres@v0.19.0/pool.ts": "2289f029e7a3bd3d460d4faa71399a920b7406c92a97c0715d6e31dbf1380ec3", - "https://deno.land/x/postgres@v0.19.0/query/array_parser.ts": "60b891010890a0540822293d11f0c11f2eb90c2f267a72d0bf916fe09d13408d", - "https://deno.land/x/postgres@v0.19.0/query/decode.ts": "59721420b7851f845147bc6fe47d5138374feef8c045e1a01ca55c6f68d9aced", - "https://deno.land/x/postgres@v0.19.0/query/decoders.ts": "6a73da1024086ab91e233648c850dccbde59248b90d87054bbbd7f0bf4a50681", - "https://deno.land/x/postgres@v0.19.0/query/encode.ts": "5b1c305bc7352a6f9fe37f235dddfc23e26419c77a133b4eaea42cf136481aa6", - "https://deno.land/x/postgres@v0.19.0/query/oid.ts": "21fc714ac212350ba7df496f88ea9e01a4ee0458911d0f2b6a81498e12e7af4c", - "https://deno.land/x/postgres@v0.19.0/query/query.ts": "510f9a27da87ed7b31b5cbcd14bf3028b441ac2ddc368483679d0b86a9d9f213", - "https://deno.land/x/postgres@v0.19.0/query/transaction.ts": "8f4eef68f8e9b4be216199404315e6e08fe1fe98afb2e640bffd077662f79678", - "https://deno.land/x/postgres@v0.19.0/query/types.ts": "540f6f973d493d63f2c0059a09f3368071f57931bba68bea408a635a3e0565d6", - "https://deno.land/x/postgres@v0.19.0/utils/deferred.ts": "5420531adb6c3ea29ca8aac57b9b59bd3e4b9a938a4996bbd0947a858f611080", - "https://deno.land/x/postgres@v0.19.0/utils/utils.ts": "ca47193ea03ff5b585e487a06f106d367e509263a960b787197ce0c03113a738", "https://deno.land/x/sentry@7.112.2/index.mjs": "04382d5c2f4e233ba389611db46f77943b2a7f6efbeaaf31193f6e586f4366ef", - "https://esm.sh/kysely@0.17.1/dist/esm/index-nodeless.js": "9c23bfd307118e3ccd3a9f0ec1261fc3451fb5301aa34aa6f28e05156818755a", - "https://esm.sh/v135/kysely@0.17.1/denonext/dist/esm/index-nodeless.js": "6f73bbf2d73bc7e96cdabf941c4ae8c12f58fd7b441031edec44c029aed9532b", - "https://gitlab.com/soapbox-pub/kysely-deno-postgres/-/raw/b4725e74ad6ca359ba0e370b55dbb8bb845a8a83/deps.ts": "b3dbecae69c30a5f161323b8c8ebd91d9af1eceb98fafab3091c7281a4b64fed", - "https://gitlab.com/soapbox-pub/kysely-deno-postgres/-/raw/b4725e74ad6ca359ba0e370b55dbb8bb845a8a83/mod.ts": "662438fd3909984bb8cbaf3fd44d2121e949d11301baf21d6c3f057ccf9887de", - "https://gitlab.com/soapbox-pub/kysely-deno-postgres/-/raw/b4725e74ad6ca359ba0e370b55dbb8bb845a8a83/src/PostgreSQLDriver.ts": "ea5a523bceeed420858b744beeb95d48976cb2b0d3f519a68b65a8229036cf6a", - "https://gitlab.com/soapbox-pub/kysely-deno-postgres/-/raw/b4725e74ad6ca359ba0e370b55dbb8bb845a8a83/src/PostgreSQLDriverDatabaseConnection.ts": "11e2fc10a3abb3d0729613c4b7cdb9cb73b597fd77353311bb6707c73a635fc5", - "https://gitlab.com/soapbox-pub/kysely-deno-postgres/-/raw/c6869b9e12d74af78a846ad503d84493f5db9df4/deps.ts": "b3dbecae69c30a5f161323b8c8ebd91d9af1eceb98fafab3091c7281a4b64fed", - "https://gitlab.com/soapbox-pub/kysely-deno-postgres/-/raw/c6869b9e12d74af78a846ad503d84493f5db9df4/mod.ts": "662438fd3909984bb8cbaf3fd44d2121e949d11301baf21d6c3f057ccf9887de", - "https://gitlab.com/soapbox-pub/kysely-deno-postgres/-/raw/c6869b9e12d74af78a846ad503d84493f5db9df4/src/PostgreSQLDriver.ts": "0f5d1bc2b24d4e0052e38ee289fb2f5e8e1470544f61aa2afe65e1059bf35dfb", - "https://gitlab.com/soapbox-pub/kysely-deno-postgres/-/raw/c6869b9e12d74af78a846ad503d84493f5db9df4/src/PostgreSQLDriverDatabaseConnection.ts": "e5d4e0fc9737c3ec253e679a51f5b43d2bb9a3386c147b7b1d14f4f5a5f734f1", - "https://gitlab.com/soapbox-pub/kysely-deno-postgres/-/raw/f2948b86190a10faa293588775e162b3a8b52e70/deps.ts": "b3dbecae69c30a5f161323b8c8ebd91d9af1eceb98fafab3091c7281a4b64fed", - "https://gitlab.com/soapbox-pub/kysely-deno-postgres/-/raw/f2948b86190a10faa293588775e162b3a8b52e70/mod.ts": "662438fd3909984bb8cbaf3fd44d2121e949d11301baf21d6c3f057ccf9887de", - "https://gitlab.com/soapbox-pub/kysely-deno-postgres/-/raw/f2948b86190a10faa293588775e162b3a8b52e70/src/PostgreSQLDriver.ts": "ac1a39e86fd676973bce215e19db1f26b82408b8f2bb09a3601802974ea7cec6", - "https://gitlab.com/soapbox-pub/kysely-deno-postgres/-/raw/f2948b86190a10faa293588775e162b3a8b52e70/src/PostgreSQLDriverDatabaseConnection.ts": "2158de426860bfd4f8e73afff0289bd40a11e273c8d883d4fd6474db01a9c2a7", - "https://gitlab.com/soapbox-pub/kysely-deno-postgres/-/raw/main/deps.ts": "b3dbecae69c30a5f161323b8c8ebd91d9af1eceb98fafab3091c7281a4b64fed", - "https://gitlab.com/soapbox-pub/kysely-deno-postgres/-/raw/main/mod.ts": "662438fd3909984bb8cbaf3fd44d2121e949d11301baf21d6c3f057ccf9887de", - "https://gitlab.com/soapbox-pub/kysely-deno-postgres/-/raw/main/src/PostgreSQLDriver.ts": "590c2fa248cff38e6e0f623050983039b5fde61e9c7131593d2922fb1f0eb921", - "https://gitlab.com/soapbox-pub/kysely-deno-postgres/-/raw/main/src/PostgreSQLDriverDatabaseConnection.ts": "2158de426860bfd4f8e73afff0289bd40a11e273c8d883d4fd6474db01a9c2a7", + "https://gitlab.com/soapbox-pub/nostrify/-/raw/58c20b3ee23d8be4987d2c0055d86960e7db763d/packages/nostrify/NSchema.ts": "b6f72b3e8a24f8c29f84fea03f5d5dc1926196be751aec598457358846e9b3d5", + "https://gitlab.com/soapbox-pub/nostrify/-/raw/58c20b3ee23d8be4987d2c0055d86960e7db763d/packages/policies/AntiDuplicationPolicy.ts": "8586878d762312a326e468ec6de948f3ca7c23bc7fe807ccb7b5dfbd90d3041e", + "https://gitlab.com/soapbox-pub/nostrify/-/raw/58c20b3ee23d8be4987d2c0055d86960e7db763d/packages/policies/AnyPolicy.ts": "ff7c7d919bdaa0f22a4c323556dce6ddf9e6ab58668b274da485c2d6028c9464", + "https://gitlab.com/soapbox-pub/nostrify/-/raw/58c20b3ee23d8be4987d2c0055d86960e7db763d/packages/policies/AuthorPolicy.ts": "a876d89bec12fca1c2fa1cb0cd013effefa1d49821354359089264880e369b11", + "https://gitlab.com/soapbox-pub/nostrify/-/raw/58c20b3ee23d8be4987d2c0055d86960e7db763d/packages/policies/DomainPolicy.ts": "e493fed5bce89fcae46c534cb6e7e216afe48932b1899b49fd000fe0747219d4", + "https://gitlab.com/soapbox-pub/nostrify/-/raw/58c20b3ee23d8be4987d2c0055d86960e7db763d/packages/policies/FiltersPolicy.ts": "20ec603e71c52370c6264d138312caf16ffba95a58015996297acc2e4967d064", + "https://gitlab.com/soapbox-pub/nostrify/-/raw/58c20b3ee23d8be4987d2c0055d86960e7db763d/packages/policies/HashtagPolicy.ts": "f3f746bb683d2b871999fe094e81835bd17217f4833109b9adebd4bca593746a", + "https://gitlab.com/soapbox-pub/nostrify/-/raw/58c20b3ee23d8be4987d2c0055d86960e7db763d/packages/policies/HellthreadPolicy.ts": "c254843f3e6e46089e1166296099484ebee95e0d1adc0c055c1763189c13c89d", + "https://gitlab.com/soapbox-pub/nostrify/-/raw/58c20b3ee23d8be4987d2c0055d86960e7db763d/packages/policies/InvertPolicy.ts": "dd2a768322593a1ed9d70ab0db2877ba8740a7d97ccaf86d7473cedc188f9bce", + "https://gitlab.com/soapbox-pub/nostrify/-/raw/58c20b3ee23d8be4987d2c0055d86960e7db763d/packages/policies/KeywordPolicy.ts": "f58d1923fd504bc709086eeda2e5fc9e92fd18d260684dc28e2be53d2edac0e3", + "https://gitlab.com/soapbox-pub/nostrify/-/raw/58c20b3ee23d8be4987d2c0055d86960e7db763d/packages/policies/NoOpPolicy.ts": "57678872be69e51d4d286e0bcad01d1f641a203e2397bdcace17c0aa156cbc0c", + "https://gitlab.com/soapbox-pub/nostrify/-/raw/58c20b3ee23d8be4987d2c0055d86960e7db763d/packages/policies/OpenAIPolicy.ts": "8b3d4c44d8a3ff1b7064f960372a3c8017142daa0151471f732e4c02b611c704", + "https://gitlab.com/soapbox-pub/nostrify/-/raw/58c20b3ee23d8be4987d2c0055d86960e7db763d/packages/policies/PipePolicy.ts": "262476dcb245ee05ca8a03c54caf97259f0f45e9565e11a8073655b963fd5823", + "https://gitlab.com/soapbox-pub/nostrify/-/raw/58c20b3ee23d8be4987d2c0055d86960e7db763d/packages/policies/PowPolicy.ts": "80de7b93de0e50423ed4bc7454f81c87672b75cdaacad8d8daed5b1f16f96b3a", + "https://gitlab.com/soapbox-pub/nostrify/-/raw/58c20b3ee23d8be4987d2c0055d86960e7db763d/packages/policies/PubkeyBanPolicy.ts": "c9cc1675c955e73e89f6324ee7adbc1a17afdc244abe1274dcb1405274f08f97", + "https://gitlab.com/soapbox-pub/nostrify/-/raw/58c20b3ee23d8be4987d2c0055d86960e7db763d/packages/policies/ReadOnlyPolicy.ts": "a8183ca6b342660deeaf300ebfd34c7c10149a384ee716f6687c17a6681650e4", + "https://gitlab.com/soapbox-pub/nostrify/-/raw/58c20b3ee23d8be4987d2c0055d86960e7db763d/packages/policies/RegexPolicy.ts": "8f1e8d203b7fd82db4eca04f4d07e351c03d3a013cc329bd55cb5a5b40cae46a", + "https://gitlab.com/soapbox-pub/nostrify/-/raw/58c20b3ee23d8be4987d2c0055d86960e7db763d/packages/policies/ReplyBotPolicy.ts": "bec4bf8bf7c7ce0d51daa6621e6e3560605aab0cea8bc7effe14b5d54579f644", + "https://gitlab.com/soapbox-pub/nostrify/-/raw/58c20b3ee23d8be4987d2c0055d86960e7db763d/packages/policies/SizePolicy.ts": "5da7efabac35081eb731aa5a80bbfdd881deead396b434701403a7ff0dcea822", + "https://gitlab.com/soapbox-pub/nostrify/-/raw/58c20b3ee23d8be4987d2c0055d86960e7db763d/packages/policies/WhitelistPolicy.ts": "206c8b3d3f923ccecb97d49526d4f9d5c68d9a63a91d3e6810e3f7aa5b38fdaf", + "https://gitlab.com/soapbox-pub/nostrify/-/raw/58c20b3ee23d8be4987d2c0055d86960e7db763d/packages/policies/WoTPolicy.ts": "a96d08e5b7b0fc25465c3212041e51cca9fccbfad741a23809a4371831407f84", + "https://gitlab.com/soapbox-pub/nostrify/-/raw/58c20b3ee23d8be4987d2c0055d86960e7db763d/packages/policies/mod.ts": "4dcb596f213daeea7acd7317b9ae1c7593e052ab4ef53b49d690ec5606be64bd", + "https://gitlab.com/soapbox-pub/nostrify/-/raw/58c20b3ee23d8be4987d2c0055d86960e7db763d/packages/policies/registry.ts": "e2f74a1e785bdb597ded1956f6aa556514d1f066c8094084e1eb1eb341f6e6a7", + "https://gitlab.com/soapbox-pub/nostrify/-/raw/58c20b3ee23d8be4987d2c0055d86960e7db763d/packages/policies/utils.ts": "b60a1da230292d8b763472c1d47055175469f1212903a207903bd613a0406e2f", + "https://gitlab.com/soapbox-pub/nostrify/-/raw/npolicy-zod-updates/packages/nostrify/NSchema.ts": "b6f72b3e8a24f8c29f84fea03f5d5dc1926196be751aec598457358846e9b3d5", + "https://gitlab.com/soapbox-pub/nostrify/-/raw/npolicy-zod-updates/packages/policies/AntiDuplicationPolicy.ts": "8586878d762312a326e468ec6de948f3ca7c23bc7fe807ccb7b5dfbd90d3041e", + "https://gitlab.com/soapbox-pub/nostrify/-/raw/npolicy-zod-updates/packages/policies/AnyPolicy.ts": "ff7c7d919bdaa0f22a4c323556dce6ddf9e6ab58668b274da485c2d6028c9464", + "https://gitlab.com/soapbox-pub/nostrify/-/raw/npolicy-zod-updates/packages/policies/AuthorPolicy.ts": "a876d89bec12fca1c2fa1cb0cd013effefa1d49821354359089264880e369b11", + "https://gitlab.com/soapbox-pub/nostrify/-/raw/npolicy-zod-updates/packages/policies/DomainPolicy.ts": "e493fed5bce89fcae46c534cb6e7e216afe48932b1899b49fd000fe0747219d4", + "https://gitlab.com/soapbox-pub/nostrify/-/raw/npolicy-zod-updates/packages/policies/FiltersPolicy.ts": "20ec603e71c52370c6264d138312caf16ffba95a58015996297acc2e4967d064", + "https://gitlab.com/soapbox-pub/nostrify/-/raw/npolicy-zod-updates/packages/policies/HashtagPolicy.ts": "f3f746bb683d2b871999fe094e81835bd17217f4833109b9adebd4bca593746a", + "https://gitlab.com/soapbox-pub/nostrify/-/raw/npolicy-zod-updates/packages/policies/HellthreadPolicy.ts": "c254843f3e6e46089e1166296099484ebee95e0d1adc0c055c1763189c13c89d", + "https://gitlab.com/soapbox-pub/nostrify/-/raw/npolicy-zod-updates/packages/policies/InvertPolicy.ts": "dd2a768322593a1ed9d70ab0db2877ba8740a7d97ccaf86d7473cedc188f9bce", + "https://gitlab.com/soapbox-pub/nostrify/-/raw/npolicy-zod-updates/packages/policies/KeywordPolicy.ts": "f58d1923fd504bc709086eeda2e5fc9e92fd18d260684dc28e2be53d2edac0e3", + "https://gitlab.com/soapbox-pub/nostrify/-/raw/npolicy-zod-updates/packages/policies/NoOpPolicy.ts": "57678872be69e51d4d286e0bcad01d1f641a203e2397bdcace17c0aa156cbc0c", + "https://gitlab.com/soapbox-pub/nostrify/-/raw/npolicy-zod-updates/packages/policies/OpenAIPolicy.ts": "8b3d4c44d8a3ff1b7064f960372a3c8017142daa0151471f732e4c02b611c704", + "https://gitlab.com/soapbox-pub/nostrify/-/raw/npolicy-zod-updates/packages/policies/PipePolicy.ts": "262476dcb245ee05ca8a03c54caf97259f0f45e9565e11a8073655b963fd5823", + "https://gitlab.com/soapbox-pub/nostrify/-/raw/npolicy-zod-updates/packages/policies/PowPolicy.ts": "80de7b93de0e50423ed4bc7454f81c87672b75cdaacad8d8daed5b1f16f96b3a", + "https://gitlab.com/soapbox-pub/nostrify/-/raw/npolicy-zod-updates/packages/policies/PubkeyBanPolicy.ts": "c9cc1675c955e73e89f6324ee7adbc1a17afdc244abe1274dcb1405274f08f97", + "https://gitlab.com/soapbox-pub/nostrify/-/raw/npolicy-zod-updates/packages/policies/ReadOnlyPolicy.ts": "a8183ca6b342660deeaf300ebfd34c7c10149a384ee716f6687c17a6681650e4", + "https://gitlab.com/soapbox-pub/nostrify/-/raw/npolicy-zod-updates/packages/policies/RegexPolicy.ts": "8f1e8d203b7fd82db4eca04f4d07e351c03d3a013cc329bd55cb5a5b40cae46a", + "https://gitlab.com/soapbox-pub/nostrify/-/raw/npolicy-zod-updates/packages/policies/ReplyBotPolicy.ts": "bec4bf8bf7c7ce0d51daa6621e6e3560605aab0cea8bc7effe14b5d54579f644", + "https://gitlab.com/soapbox-pub/nostrify/-/raw/npolicy-zod-updates/packages/policies/SizePolicy.ts": "5da7efabac35081eb731aa5a80bbfdd881deead396b434701403a7ff0dcea822", + "https://gitlab.com/soapbox-pub/nostrify/-/raw/npolicy-zod-updates/packages/policies/WhitelistPolicy.ts": "206c8b3d3f923ccecb97d49526d4f9d5c68d9a63a91d3e6810e3f7aa5b38fdaf", + "https://gitlab.com/soapbox-pub/nostrify/-/raw/npolicy-zod-updates/packages/policies/WoTPolicy.ts": "a96d08e5b7b0fc25465c3212041e51cca9fccbfad741a23809a4371831407f84", + "https://gitlab.com/soapbox-pub/nostrify/-/raw/npolicy-zod-updates/packages/policies/mod.ts": "4dcb596f213daeea7acd7317b9ae1c7593e052ab4ef53b49d690ec5606be64bd", + "https://gitlab.com/soapbox-pub/nostrify/-/raw/npolicy-zod-updates/packages/policies/registry.ts": "e2f74a1e785bdb597ded1956f6aa556514d1f066c8094084e1eb1eb341f6e6a7", + "https://gitlab.com/soapbox-pub/nostrify/-/raw/npolicy-zod-updates/packages/policies/utils.ts": "b60a1da230292d8b763472c1d47055175469f1212903a207903bd613a0406e2f", "https://gitlab.com/soapbox-pub/postgres.js/-/raw/e79d7d2039446fbf7a37d4eca0d17e94a94b8b53/deno/mod.js": "cb68f17d6d90df318934deccdb469d740be0888e7a597a9e7eea7100ce36a252", "https://gitlab.com/soapbox-pub/postgres.js/-/raw/e79d7d2039446fbf7a37d4eca0d17e94a94b8b53/deno/polyfills.js": "318eb01f2b4cc33a46c59f3ddc11f22a56d6b1db8b7719b2ad7decee63a5bd47", "https://gitlab.com/soapbox-pub/postgres.js/-/raw/e79d7d2039446fbf7a37d4eca0d17e94a94b8b53/deno/src/bytes.js": "f2de43bdc8fa5dc4b169f2c70d5d8b053a3dea8f85ef011d7b27dec69e14ebb7", @@ -2445,44 +1824,7 @@ "https://raw.githubusercontent.com/ocpu/question-deno/10022b8e52555335aa510adb08b0a300df3cf904/mod.ts": "cb10c598652cf7edf600af17f73bcadcdedf6900d9f5b5647e89ba2ea378b7d5", "https://raw.githubusercontent.com/ocpu/question-deno/10022b8e52555335aa510adb08b0a300df3cf904/password.ts": "3c578bd21e4fd283431aa940357f40fed2e26d3de12ad129a696d7fe38ae744d", "https://raw.githubusercontent.com/ocpu/question-deno/10022b8e52555335aa510adb08b0a300df3cf904/text-util.ts": "37c0437d2030c0b6255f10afec7ccfcb6b195e9a0a011bb7956595142c3d7383", - "https://raw.githubusercontent.com/ocpu/question-deno/10022b8e52555335aa510adb08b0a300df3cf904/util.ts": "a8285450db7b56a3e507f478aaad68927ecb1ee545449cb869ccc4aace13fada", - "https://raw.githubusercontent.com/xyzshantaram/postgres.js/17469a9e5f025d112206c583a29275e93dfc1431/deno/mod.js": "cb68f17d6d90df318934deccdb469d740be0888e7a597a9e7eea7100ce36a252", - "https://raw.githubusercontent.com/xyzshantaram/postgres.js/17469a9e5f025d112206c583a29275e93dfc1431/deno/polyfills.js": "318eb01f2b4cc33a46c59f3ddc11f22a56d6b1db8b7719b2ad7decee63a5bd47", - "https://raw.githubusercontent.com/xyzshantaram/postgres.js/17469a9e5f025d112206c583a29275e93dfc1431/deno/src/bytes.js": "f2de43bdc8fa5dc4b169f2c70d5d8b053a3dea8f85ef011d7b27dec69e14ebb7", - "https://raw.githubusercontent.com/xyzshantaram/postgres.js/17469a9e5f025d112206c583a29275e93dfc1431/deno/src/connection.js": "c63d53a0f35a7eb2670befef551f23fe914bbe9f0590de974e3e210c50527a29", - "https://raw.githubusercontent.com/xyzshantaram/postgres.js/17469a9e5f025d112206c583a29275e93dfc1431/deno/src/errors.js": "85cfbed9a5ab0db41ab8e97b806c881af29807dfe99bc656fdf1a18c1c13b6c6", - "https://raw.githubusercontent.com/xyzshantaram/postgres.js/17469a9e5f025d112206c583a29275e93dfc1431/deno/src/index.js": "119a320c6cc8d0e3927ec1384322494613980716f9fb4f67c82e3cb708a23d0a", - "https://raw.githubusercontent.com/xyzshantaram/postgres.js/17469a9e5f025d112206c583a29275e93dfc1431/deno/src/large.js": "f3e770cdb7cc695f7b50687b4c6c4b7252129515486ec8def98b7582ee7c54ef", - "https://raw.githubusercontent.com/xyzshantaram/postgres.js/17469a9e5f025d112206c583a29275e93dfc1431/deno/src/query.js": "67c45a5151032aa46b587abc15381fe4efd97c696e5c1b53082b8161309c4ee2", - "https://raw.githubusercontent.com/xyzshantaram/postgres.js/17469a9e5f025d112206c583a29275e93dfc1431/deno/src/queue.js": "709624843223ea842bf095f6934080f19f1a059a51cbbf82e9827f3bb1bf2ca7", - "https://raw.githubusercontent.com/xyzshantaram/postgres.js/17469a9e5f025d112206c583a29275e93dfc1431/deno/src/result.js": "001ff5e0c8d634674f483d07fbcd620a797e3101f842d6c20ca3ace936260465", - "https://raw.githubusercontent.com/xyzshantaram/postgres.js/17469a9e5f025d112206c583a29275e93dfc1431/deno/src/subscribe.js": "9e4d0c3e573a6048e77ee2f15abbd5bcd17da9ca85a78c914553472c6d6c169b", - "https://raw.githubusercontent.com/xyzshantaram/postgres.js/17469a9e5f025d112206c583a29275e93dfc1431/deno/src/types.js": "471f4a6c35412aa202a7c177c0a7e5a7c3bd225f01bbde67c947894c1b8bf6ed", - "https://raw.githubusercontent.com/xyzshantaram/postgres.js/8a9bbce88b3f6425ecaacd99a80372338b157a53/deno/mod.js": "cb68f17d6d90df318934deccdb469d740be0888e7a597a9e7eea7100ce36a252", - "https://raw.githubusercontent.com/xyzshantaram/postgres.js/8a9bbce88b3f6425ecaacd99a80372338b157a53/deno/polyfills.js": "318eb01f2b4cc33a46c59f3ddc11f22a56d6b1db8b7719b2ad7decee63a5bd47", - "https://raw.githubusercontent.com/xyzshantaram/postgres.js/8a9bbce88b3f6425ecaacd99a80372338b157a53/deno/src/bytes.js": "f2de43bdc8fa5dc4b169f2c70d5d8b053a3dea8f85ef011d7b27dec69e14ebb7", - "https://raw.githubusercontent.com/xyzshantaram/postgres.js/8a9bbce88b3f6425ecaacd99a80372338b157a53/deno/src/connection.js": "c63d53a0f35a7eb2670befef551f23fe914bbe9f0590de974e3e210c50527a29", - "https://raw.githubusercontent.com/xyzshantaram/postgres.js/8a9bbce88b3f6425ecaacd99a80372338b157a53/deno/src/errors.js": "85cfbed9a5ab0db41ab8e97b806c881af29807dfe99bc656fdf1a18c1c13b6c6", - "https://raw.githubusercontent.com/xyzshantaram/postgres.js/8a9bbce88b3f6425ecaacd99a80372338b157a53/deno/src/index.js": "4e8b09c7d0ce6e9eea386f59337867266498d5bb60ccd567d0bea5da03f6094d", - "https://raw.githubusercontent.com/xyzshantaram/postgres.js/8a9bbce88b3f6425ecaacd99a80372338b157a53/deno/src/large.js": "f3e770cdb7cc695f7b50687b4c6c4b7252129515486ec8def98b7582ee7c54ef", - "https://raw.githubusercontent.com/xyzshantaram/postgres.js/8a9bbce88b3f6425ecaacd99a80372338b157a53/deno/src/query.js": "67c45a5151032aa46b587abc15381fe4efd97c696e5c1b53082b8161309c4ee2", - "https://raw.githubusercontent.com/xyzshantaram/postgres.js/8a9bbce88b3f6425ecaacd99a80372338b157a53/deno/src/queue.js": "709624843223ea842bf095f6934080f19f1a059a51cbbf82e9827f3bb1bf2ca7", - "https://raw.githubusercontent.com/xyzshantaram/postgres.js/8a9bbce88b3f6425ecaacd99a80372338b157a53/deno/src/result.js": "001ff5e0c8d634674f483d07fbcd620a797e3101f842d6c20ca3ace936260465", - "https://raw.githubusercontent.com/xyzshantaram/postgres.js/8a9bbce88b3f6425ecaacd99a80372338b157a53/deno/src/subscribe.js": "9e4d0c3e573a6048e77ee2f15abbd5bcd17da9ca85a78c914553472c6d6c169b", - "https://raw.githubusercontent.com/xyzshantaram/postgres.js/8a9bbce88b3f6425ecaacd99a80372338b157a53/deno/src/types.js": "471f4a6c35412aa202a7c177c0a7e5a7c3bd225f01bbde67c947894c1b8bf6ed", - "https://raw.githubusercontent.com/xyzshantaram/postgres.js/master/deno/mod.js": "cb68f17d6d90df318934deccdb469d740be0888e7a597a9e7eea7100ce36a252", - "https://raw.githubusercontent.com/xyzshantaram/postgres.js/master/deno/polyfills.js": "318eb01f2b4cc33a46c59f3ddc11f22a56d6b1db8b7719b2ad7decee63a5bd47", - "https://raw.githubusercontent.com/xyzshantaram/postgres.js/master/deno/src/bytes.js": "f2de43bdc8fa5dc4b169f2c70d5d8b053a3dea8f85ef011d7b27dec69e14ebb7", - "https://raw.githubusercontent.com/xyzshantaram/postgres.js/master/deno/src/connection.js": "c63d53a0f35a7eb2670befef551f23fe914bbe9f0590de974e3e210c50527a29", - "https://raw.githubusercontent.com/xyzshantaram/postgres.js/master/deno/src/errors.js": "85cfbed9a5ab0db41ab8e97b806c881af29807dfe99bc656fdf1a18c1c13b6c6", - "https://raw.githubusercontent.com/xyzshantaram/postgres.js/master/deno/src/index.js": "b6fa0bd613aedc45b93ee5be4d133e8f1418b5d25fc041c56b124f28b432ce5a", - "https://raw.githubusercontent.com/xyzshantaram/postgres.js/master/deno/src/large.js": "f3e770cdb7cc695f7b50687b4c6c4b7252129515486ec8def98b7582ee7c54ef", - "https://raw.githubusercontent.com/xyzshantaram/postgres.js/master/deno/src/query.js": "67c45a5151032aa46b587abc15381fe4efd97c696e5c1b53082b8161309c4ee2", - "https://raw.githubusercontent.com/xyzshantaram/postgres.js/master/deno/src/queue.js": "15e6345adb6708bf3b99ad39fc2231c2fb61de5f6cba4b7a7a6be881482a4ec3", - "https://raw.githubusercontent.com/xyzshantaram/postgres.js/master/deno/src/result.js": "001ff5e0c8d634674f483d07fbcd620a797e3101f842d6c20ca3ace936260465", - "https://raw.githubusercontent.com/xyzshantaram/postgres.js/master/deno/src/subscribe.js": "9e4d0c3e573a6048e77ee2f15abbd5bcd17da9ca85a78c914553472c6d6c169b", - "https://raw.githubusercontent.com/xyzshantaram/postgres.js/master/deno/src/types.js": "471f4a6c35412aa202a7c177c0a7e5a7c3bd225f01bbde67c947894c1b8bf6ed", - "https://unpkg.com/nostr-relaypool2@0.6.34/lib/nostr-relaypool.worker.js": "a336e5c58b1e6946ae8943eb4fef21b810dc2a5a233438cff92b883673e29c96" + "https://raw.githubusercontent.com/ocpu/question-deno/10022b8e52555335aa510adb08b0a300df3cf904/util.ts": "a8285450db7b56a3e507f478aaad68927ecb1ee545449cb869ccc4aace13fada" }, "workspace": { "dependencies": [ @@ -2508,6 +1850,7 @@ "jsr:@std/fs@~0.229.3", "jsr:@std/json@0.223", "jsr:@std/media-types@~0.224.1", + "jsr:@std/path@^1.0.8", "jsr:@std/streams@0.223", "jsr:@std/testing@^1.0.9", "npm:@cashu/cashu-ts@^2.2.0", diff --git a/fixtures/policy.ts b/fixtures/policy.ts new file mode 100644 index 00000000..b893fe48 --- /dev/null +++ b/fixtures/policy.ts @@ -0,0 +1,9 @@ +import { NostrEvent, NostrRelayInfo, NostrRelayOK, NPolicy } from '@nostrify/types'; +import { HashtagPolicy } from '@nostrify/policies'; + +export default class TestPolicy implements NPolicy { + call(event: NostrEvent): Promise { + return new HashtagPolicy(['other-blocked-tag']).call(event); + } + info?: NostrRelayInfo | undefined; +} diff --git a/packages/ditto/app.ts b/packages/ditto/app.ts index b4ecbaec..cebb7824 100644 --- a/packages/ditto/app.ts +++ b/packages/ditto/app.ts @@ -152,6 +152,12 @@ import dittoNamesRoute from '@/routes/dittoNamesRoute.ts'; import pleromaAdminPermissionGroupsRoute from '@/routes/pleromaAdminPermissionGroupsRoute.ts'; import pleromaStatusesRoute from '@/routes/pleromaStatusesRoute.ts'; import { DittoRelayStore } from '@/storages/DittoRelayStore.ts'; +import { + adminCurrentPolicyController, + adminListPoliciesController, + adminUpdatePolicyController, +} from '@/controllers/api/policies.ts'; +import { createPolicyEvent, DEFAULT_POLICY_SPEC } from '@/utils/policies/mod.ts'; export interface AppEnv extends DittoEnv { Variables: DittoEnv['Variables'] & { @@ -198,6 +204,11 @@ const pgstore = new DittoPgStore({ const pool = new DittoPool({ conf, relay: pgstore }); const relay = new DittoRelayStore({ db, conf, pool, relay: pgstore }); +const havePolicy = await relay.count([{ kinds: [11984], authors: [await conf.signer.getPublicKey()] }]); + +if (!havePolicy.count) { + await relay.event(await createPolicyEvent(conf, DEFAULT_POLICY_SPEC)); +} await createNip89({ conf, relay }); await seedZapSplits({ conf, relay }); @@ -498,6 +509,10 @@ app.delete('/api/v1/pleroma/admin/users/tag', userMiddleware({ role: 'admin' }), app.patch('/api/v1/pleroma/admin/users/suggest', userMiddleware({ role: 'admin' }), pleromaAdminSuggestController); app.patch('/api/v1/pleroma/admin/users/unsuggest', userMiddleware({ role: 'admin' }), pleromaAdminUnsuggestController); +app.get('/api/v1/admin/ditto/policies', userMiddleware({ role: 'admin' }), adminListPoliciesController); +app.get('/api/v1/admin/ditto/policies/current', userMiddleware({ role: 'admin' }), adminCurrentPolicyController); +app.put('/api/v1/admin/ditto/policies/current', userMiddleware({ role: 'admin' }), adminUpdatePolicyController); + app.route('/api/v1/custom_emojis', customEmojisRoute); // Not (yet) implemented. @@ -560,5 +575,4 @@ app.get('*', publicFiles, staticFiles, ratelimit, frontendController); app.onError(errorHandler); export default app; - export type { AppContext, AppController, AppMiddleware }; diff --git a/packages/ditto/controllers/api/instance.ts b/packages/ditto/controllers/api/instance.ts index 0e07f385..c5a43316 100644 --- a/packages/ditto/controllers/api/instance.ts +++ b/packages/ditto/controllers/api/instance.ts @@ -2,6 +2,7 @@ import denoJson from 'deno.json' with { type: 'json' }; import { AppController } from '@/app.ts'; import { getInstanceMetadata } from '@/utils/instance.ts'; +import { logi } from '@soapbox/logi'; const version = `3.0.0 (compatible; Ditto ${denoJson.version})`; @@ -15,13 +16,60 @@ const features = [ 'v2_suggestions', ]; +const cache = (f: () => Promise, interval: number) => { + let lastCheck = 0; + let value: number | undefined; + + return async () => { + const now = Date.now(); + if (value === undefined || now - lastCheck > interval) { + lastCheck = now; + try { + value = await f(); + } catch (error) { + logi({ + level: 'error', + ns: 'ditto.routes.instanceV1', + message: `Error fetching cached value: ${error}`, + }); + value = undefined; // Ensure we retry next time + } + } + return value ?? 0; // Prevent returning undefined + }; +}; + const instanceV1Controller: AppController = async (c) => { - const { conf } = c.var; + const { conf, db } = c.var; const { host, protocol } = conf.url; const meta = await getInstanceMetadata(c.var); /** Protocol to use for WebSocket URLs, depending on the protocol of the `LOCAL_DOMAIN`. */ const wsProtocol = protocol === 'http:' ? 'ws:' : 'wss:'; + const MINS_10 = 10 * 60 * 1000; + + const userCount = cache(async () => { + return await db.kysely + .selectFrom('author_stats') + .where('nip05_domain', '=', host) + .select(({ fn }) => fn.count('pubkey').distinct().as('users')) + .executeTakeFirst().then((obj) => obj?.users || 0); + }, MINS_10); + + const domainCount = cache(async () => { + return await db.kysely + .selectFrom('author_stats') + .select(({ fn }) => fn.count('nip05_domain').distinct().as('domains')) + .executeTakeFirst().then((obj) => obj?.domains || 0); + }, MINS_10); + + const statusCount = cache(async () => { + return await db.kysely + .selectFrom('nostr_events') + .where('kind', '=', 1) + .select(({ fn }) => fn.countAll().as('events')) + .executeTakeFirst().then((obj) => obj?.events || 0); + }, MINS_10); return c.json({ uri: host, @@ -58,9 +106,9 @@ const instanceV1Controller: AppController = async (c) => { }, languages: ['en'], stats: { - domain_count: 0, - status_count: 0, - user_count: 0, + domain_count: Number(await domainCount()), + status_count: Number(await statusCount()), + user_count: Number(await userCount()), }, urls: { streaming_api: `${wsProtocol}//${host}`, diff --git a/packages/ditto/controllers/api/policies.ts b/packages/ditto/controllers/api/policies.ts new file mode 100644 index 00000000..48cdfc09 --- /dev/null +++ b/packages/ditto/controllers/api/policies.ts @@ -0,0 +1,85 @@ +import { type AppController } from '@/app.ts'; +import { createPolicyEvent } from '@/utils/policies/mod.ts'; +import { DEFAULT_POLICY_SPEC, policyRegistry } from '@/utils/policies/mod.ts'; +import { z } from 'zod'; + +export const adminListPoliciesController: AppController = (c) => { + return c.json( + Object.entries(policyRegistry.available) + .map(([internalName, item]) => { + return { + internalName, + ...item, + instantiate: undefined, + schema: undefined, + }; + }), + ); +}; + +export const adminCurrentPolicyController: AppController = async (c) => { + const { relay, conf } = c.var; + const pubkey = await conf.signer.getPublicKey(); + + const current = await relay.query([{ + authors: [pubkey], + kinds: [11984], + }]).then((events) => events[0]); + + if (current) return c.json({ spec: JSON.parse(current.content) }); + + await relay.event(await createPolicyEvent(conf, DEFAULT_POLICY_SPEC)); + return c.json({ spec: DEFAULT_POLICY_SPEC }); +}; + +const PolicySpecSchema = z.object({ + policies: z.array(z.object({ + name: z.string(), + params: z.record(z.any()), + })), +}); + +export const adminUpdatePolicyController: AppController = async (c) => { + const { relay, conf } = c.var; + try { + const req = await c.req.json(); + const parsed = PolicySpecSchema.parse(req); + + // Validate each policy against its specific schema + const invalidPolicies = parsed.policies.filter((policy) => { + const policyItem = policyRegistry.available[policy.name]; + // If policy not found in registry, it's invalid + if (!policyItem) { + return true; + } + + try { + // Try to parse the policy params against the specific schema + policyItem.schema.parse(policy.params); + return false; // Not invalid + } catch (_) { + return true; // Invalid policy + } + }); + + // If any policies are invalid, return an error + if (invalidPolicies.length > 0) { + return c.json({ + error: `Invalid policy specification for: ${invalidPolicies.map((p) => p.name).join(', ')}`, + }, 400); + } + + await relay.event(await createPolicyEvent(conf, parsed)); + return c.json({ + message: 'Settings saved successfully.', + }); + } catch (error) { + if (error instanceof SyntaxError) { + return c.json({ error: 'Invalid JSON in request body' }, 400); + } + if (error instanceof z.ZodError) { + return c.json({ error: 'Invalid policy specification', details: error.errors }, 400); + } + return c.json({ error: 'Failed to update policy' }, 500); + } +}; diff --git a/packages/ditto/utils/note.ts b/packages/ditto/utils/note.ts index 7b1405ff..9bd7eade 100644 --- a/packages/ditto/utils/note.ts +++ b/packages/ditto/utils/note.ts @@ -23,7 +23,7 @@ interface ParseNoteContentOpts { export function contentToHtml(content: string, mentions: MastodonMention[], opts: ParseNoteContentOpts): string { const { conf } = opts; - return linkifyStr(content, { + const htmlString = linkifyStr(content, { render: { hashtag: ({ content }) => { const tag = content.replace(/^#/, ''); @@ -67,6 +67,9 @@ export function contentToHtml(content: string, mentions: MastodonMention[], opts }, }, }).replace(/\n+$/, ''); + + // Replace apostrophes with ' + return htmlString.replace(/'/g, '''); } /** Remove the tokens from the _end_ of the content. */ diff --git a/packages/ditto/utils/policies/mod.ts b/packages/ditto/utils/policies/mod.ts new file mode 100644 index 00000000..7b202d83 --- /dev/null +++ b/packages/ditto/utils/policies/mod.ts @@ -0,0 +1,53 @@ +import { nostrNow } from '@/utils.ts'; +import type { DittoConf } from '@ditto/conf'; +import { PolicyRegistry } from './registry.ts'; +import { MockRelay } from '@nostrify/nostrify/test'; +import { nip19 } from 'nostr-tools'; + +type ParamValue = string | number | boolean; + +export { PolicyRegistry }; + +export const policyRegistry = new PolicyRegistry({ + antiDuplicationPolicyStore: { + get: (key: Deno.KvKey) => Promise.resolve({ key, value: null, versionstamp: null }), + set: () => Promise.resolve({ ok: true, versionstamp: '00000000000000000000' }), + }, + store: new MockRelay(), +}); + +export type PolicyParam = ParamValue | (string | number)[]; +export type PolicyParams = Record; + +interface PolicySpecItem { + name: keyof typeof policyRegistry.available; + params?: PolicyParams; +} + +export interface PolicySpec { + policies: PolicySpecItem[]; +} + +export const normalizeNpub = (itm: string) => { + if (!itm.startsWith('npub1')) return itm; + return nip19.decode(itm as `npub1${string}`).data; +}; + +export const DEFAULT_POLICY_SPEC: PolicySpec = { + policies: [ + { 'name': 'SizePolicy' }, + { 'name': 'HellthreadPolicy' }, + { 'name': 'HashtagPolicy', 'params': { 'hashtags': ['NSFW', 'explicit', 'violence', 'cp', 'porn'] } }, + { 'name': 'ReplyBotPolicy' }, + { 'name': 'AntiDuplicationPolicy' }, + ], +}; + +export const createPolicyEvent = async (conf: DittoConf, policies: PolicySpec) => { + return await conf.signer.signEvent({ + kind: 11984, + content: JSON.stringify(policies), + created_at: nostrNow(), + tags: [], + }); +}; diff --git a/packages/ditto/utils/policies/parameters.test.ts b/packages/ditto/utils/policies/parameters.test.ts new file mode 100644 index 00000000..f0e81990 --- /dev/null +++ b/packages/ditto/utils/policies/parameters.test.ts @@ -0,0 +1,105 @@ +import { assertEquals } from '@std/assert'; +import { z } from 'zod'; +import { zodSchemaToFields } from './parameters.ts'; + +Deno.test('zodSchemaToFields - basic types', () => { + const schema = z.object({ + name: z.string(), + age: z.number(), + }); + + const result = zodSchemaToFields(schema); + assertEquals(result, { + name: { type: 'string' }, + age: { type: 'number' }, + }); +}); + +Deno.test('zodSchemaToFields - array types', () => { + const schema = z.object({ + tags: z.array(z.string()), + scores: z.array(z.number()), + }); + + const result = zodSchemaToFields(schema); + assertEquals(result, { + tags: { type: 'multi_string' }, + scores: { type: 'multi_number' }, + }); +}); + +Deno.test('zodSchemaToFields - special-case NIP-01 filters', () => { + const schema = z.object({ + filters: z.array(z.string()), + keywords: z.array(z.string()), + }); + + const result = zodSchemaToFields(schema); + assertEquals(result, { + filters: { type: 'multi_string' }, + keywords: { type: 'multi_string' }, + }); +}); + +Deno.test('zodSchemaToFields - mixed types', () => { + const schema = z.object({ + id: z.string(), + values: z.array(z.number()), + flags: z.array(z.string()).describe('Test description'), + }); + + const result = zodSchemaToFields(schema); + assertEquals(result, { + id: { type: 'string' }, + values: { type: 'multi_number' }, + flags: { type: 'multi_string', description: 'Test description' }, + }); +}); + +Deno.test('zodSchemaToFields - optional fields', () => { + const schema = z.object({ + name: z.string().optional(), + age: z.number().optional(), + }); + + const result = zodSchemaToFields(schema); + assertEquals(result, { + name: { type: 'string', optional: true }, + age: { type: 'number', optional: true }, + }); +}); + +Deno.test('zodSchemaToFields - default values', () => { + const schema = z.object({ + name: z.string().default('John Doe'), + age: z.number().default(30), + }); + + const result = zodSchemaToFields(schema); + assertEquals(result, { + name: { type: 'string', default: 'John Doe' }, + age: { type: 'number', default: 30 }, + }); +}); + +Deno.test('zodSchemaToFields - boolean fields', () => { + const schema = z.object({ + active: z.boolean(), + }); + + const result = zodSchemaToFields(schema); + assertEquals(result, { + active: { type: 'boolean' }, + }); +}); + +Deno.test('zodSchemaToFields - invalid schema', () => { + const schema = z.object({ + invalid: z.any(), + }); + + const result = zodSchemaToFields(schema); + assertEquals(result, { + invalid: { type: 'unknown' }, + }); +}); diff --git a/packages/ditto/utils/policies/parameters.ts b/packages/ditto/utils/policies/parameters.ts new file mode 100644 index 00000000..45166401 --- /dev/null +++ b/packages/ditto/utils/policies/parameters.ts @@ -0,0 +1,93 @@ +import { z } from 'zod'; +import { PolicyParam } from '@/utils/policies/mod.ts'; + +type FieldType = 'string' | 'multi_string' | 'number' | 'multi_number' | 'boolean' | 'unknown'; + +export interface FieldItem { + type: FieldType; + description?: string; + optional?: boolean; + default?: PolicyParam; +} + +interface UnwrappedZodType { + baseType: z.ZodTypeAny; + optional?: boolean; + defaultValue?: PolicyParam; + description?: string; +} + +/** + * Extracts the base type from wrapped Zod types like ZodOptional and ZodDefault. + */ +function unwrapZodType(field: z.ZodTypeAny): UnwrappedZodType { + let optional = false; + let defaultValue: PolicyParam | undefined = undefined; + let description: string | undefined = undefined; + + description = field.description; + + while (field instanceof z.ZodOptional || field instanceof z.ZodDefault) { + if (field instanceof z.ZodOptional) optional = true; + if (field instanceof z.ZodDefault) defaultValue = field._def.defaultValue(); + if (!description) description = field.description; + + field = field._def.innerType; + } + + const result: UnwrappedZodType = { baseType: field }; + + if (optional) result.optional = true; + if (typeof defaultValue !== 'undefined') { + if ( + typeof defaultValue === 'string' && defaultValue.length > 0 || + (typeof defaultValue === 'number') || + (typeof defaultValue === 'object' && Object.keys(defaultValue).length > 0) || + (Array.isArray(defaultValue) && defaultValue.length > 0) + ) { + result.defaultValue = defaultValue; + } + } + if (description) result.description = description; + return result; +} + +/** + * Serializes a Zod schema into a record of field types. NOT meant to be used + * as a general-purpose serializer - this is specifically for generating policy + * parameter descriptions! This function also parses internal Zod properties, + * but there is precedent for this: + * https://github.com/colinhacks/zod/discussions/1953 + * + * With version pinning and the Zod maintainers' knowledge of this kind of + * usage, it should be fine for it to be this way. + * + * Special-cases NIP-01 filters as `multi_string`. + */ + +// deno-lint-ignore no-explicit-any +export function zodSchemaToFields(schema: z.ZodObject): Record { + const result: Record = {}; + + for (const [key, field] of Object.entries(schema.shape) as [string, z.ZodTypeAny][]) { + const { baseType, optional, defaultValue, description } = unwrapZodType(field); + result[key] = { type: 'unknown' }; + if (optional) result[key].optional = optional; + if (defaultValue) result[key].default = defaultValue; + if (description) result[key].description = description; + + if (key === 'filters') { + result[key].type = 'multi_string'; + } else if (baseType instanceof z.ZodArray) { + const elementType = unwrapZodType(baseType._def.type).baseType._def.typeName; + if (elementType === 'ZodNumber') result[key].type = 'multi_number'; + else result[key].type = 'multi_string'; + } else if (baseType instanceof z.ZodNumber) result[key].type = 'number'; + else if (baseType instanceof z.ZodBoolean) result[key].type = 'boolean'; + else if (baseType instanceof z.ZodString) result[key].type = 'string'; + + if (baseType.description && !result[key].description) result[key].description = baseType.description; + } + + return result; +} diff --git a/packages/ditto/utils/policies/registry.ts b/packages/ditto/utils/policies/registry.ts new file mode 100644 index 00000000..641b1b5d --- /dev/null +++ b/packages/ditto/utils/policies/registry.ts @@ -0,0 +1,236 @@ +import { + AntiDuplicationPolicy, + AuthorPolicy, + DomainPolicy, + FiltersPolicy, + HashtagPolicy, + HellthreadPolicy, + KeywordPolicy, + OpenAIPolicy, + PowPolicy, + PubkeyBanPolicy, + RegexPolicy, + ReplyBotPolicy, + SizePolicy, + WhitelistPolicy, + WoTPolicy, +} from '@nostrify/policies'; +import { FieldItem, zodSchemaToFields } from './parameters.ts'; +import { NPolicy, NStore } from '@nostrify/types'; +import { z } from 'zod'; +import { + AntiDuplicationPolicyOpts, + AntiDuplicationPolicyOptsSchema, + DomainPolicyOptsSchema, + FiltersPolicyOptsSchema, + HashtagPolicyOptsSchema, + HellthreadPolicyOptsSchema, + KeywordPolicyOptsSchema, + OpenAIPolicyOptsSchema, + PowPolicyOptsSchema, + PubkeyBanPolicyOptsSchema, + RegexPolicyOptsSchema, + ReplyBotPolicyOptsSchema, + SizePolicyOptsSchema, + WhitelistPolicyOptsSchema, + WoTPolicyOptsSchema, +} from '@/utils/policies/schemas.ts'; +import { normalizeNpub, PolicyParams } from '@/utils/policies/mod.ts'; + +export interface PolicyItem { + instantiate: (params: PolicyParams) => NPolicy; + name: string; + parameters: Record; + description: string; + schema: z.ZodSchema; +} + +export interface PolicyRegistryOpts { + antiDuplicationPolicyStore?: AntiDuplicationPolicyOpts['kv']; + store: NStore; +} + +export class PolicyRegistry { + constructor(private opts: PolicyRegistryOpts) {} + + available: Record = { + 'AntiDuplicationPolicy': { + instantiate: (params) => { + const parsed = AntiDuplicationPolicyOptsSchema.parse(params); + if (!this.opts.antiDuplicationPolicyStore) { + throw new Error('AntiDuplicationPolicy: tried to instantiate store but no store supplied!'); + } + return new AntiDuplicationPolicy({ + kv: this.opts.antiDuplicationPolicyStore, + ...parsed, + }); + }, + description: 'Prevent messages with the exact same content from being submitted repeatedly.', + name: 'Deduplicate messages', + parameters: zodSchemaToFields(AntiDuplicationPolicyOptsSchema), + schema: AntiDuplicationPolicyOptsSchema, + }, + 'AuthorPolicy': { + instantiate: () => { + return new AuthorPolicy(this.opts.store); + }, + description: 'Rejects events by authors without a kind 0 event associated with their pubkey.', + name: 'Block events without associated profiles', + parameters: {}, + schema: z.object({}), // Empty schema since no params are used + }, + 'DomainPolicy': { + instantiate: (params) => { + const parsed = DomainPolicyOptsSchema.parse(params); + return new DomainPolicy(this.opts.store, parsed); + }, + description: 'Ban events by pubkeys without a valid NIP-05 domain. Domains can also be whitelisted/blacklisted', + name: 'Filter by NIP-05', + parameters: zodSchemaToFields(DomainPolicyOptsSchema), + schema: DomainPolicyOptsSchema, + }, + 'FiltersPolicy': { + instantiate: (params) => { + if (!params.filters || !Array.isArray(params.filters)) throw new Error('Invalid params to FiltersPolicy'); + const filters = params.filters.map((item) => { + if (typeof item === 'number') return; + try { + return JSON.parse(item); + } catch { + return; + } + }).filter(Boolean); + const parsed = FiltersPolicyOptsSchema.parse({ filters }); + return new FiltersPolicy(parsed.filters); + }, + description: 'Only allow events matching a given Nostr filter', + name: 'Filter by Nostr filter', + parameters: zodSchemaToFields(FiltersPolicyOptsSchema), + schema: FiltersPolicyOptsSchema, + }, + 'HashtagPolicy': { + instantiate: (params) => { + const parsed = HashtagPolicyOptsSchema.parse(params); + return new HashtagPolicy(parsed.hashtags); + }, + description: 'Ban events containing the specified hashtags', + name: 'Ban hashtags', + parameters: zodSchemaToFields(HashtagPolicyOptsSchema), + schema: HashtagPolicyOptsSchema, + }, + 'HellthreadPolicy': { + instantiate: (params) => { + const parsed = HellthreadPolicyOptsSchema.parse(params); + return new HellthreadPolicy({ + ...parsed, + }); + }, + description: "Prevent 'hellthreads' - notes that tag hundreds of people to cause a nuisance and server load.", + name: 'Limit events with excessive mentions', + parameters: zodSchemaToFields(HellthreadPolicyOptsSchema), + schema: HellthreadPolicyOptsSchema, + }, + 'KeywordPolicy': { + instantiate: (params) => { + const parsed = KeywordPolicyOptsSchema.parse(params); + return new KeywordPolicy(parsed.keywords); + }, + description: 'Ban events that contain specified keywords.', + name: 'Block certain words', + parameters: zodSchemaToFields(KeywordPolicyOptsSchema), + schema: KeywordPolicyOptsSchema, + }, + 'OpenAIPolicy': { + instantiate: (params) => { + const parsed = OpenAIPolicyOptsSchema.parse(params); + return new OpenAIPolicy({ + ...parsed, + }); + }, + description: "Use OpenAI moderation integration to block posts that don't meet your community guidelines.", + name: 'Use OpenAI moderation', + parameters: zodSchemaToFields(OpenAIPolicyOptsSchema), + schema: OpenAIPolicyOptsSchema, + }, + 'PowPolicy': { + instantiate: (params) => { + const parsed = PowPolicyOptsSchema.parse(params); + return new PowPolicy({ + ...parsed, + }); + }, + description: 'Use proof-of-work to limit events from spammers.', + name: 'Require proof-of-work for events', + parameters: zodSchemaToFields(PowPolicyOptsSchema), + schema: PowPolicyOptsSchema, + }, + 'PubkeyBanPolicy': { + instantiate: (params) => { + const parsed = PubkeyBanPolicyOptsSchema.parse(params); + return new PubkeyBanPolicy(parsed.pubkeys.map(normalizeNpub)); + }, + description: 'Ban events from certain pubkeys', + name: 'Ban certain pubkeys', + parameters: zodSchemaToFields(PubkeyBanPolicyOptsSchema), + schema: PubkeyBanPolicyOptsSchema, + }, + 'RegexPolicy': { + instantiate: (params) => { + const parsed = RegexPolicyOptsSchema.parse(params); + return new RegexPolicy(new RegExp(parsed.expr, parsed.flags)); + }, + description: 'Ban events that match a certain regular expression.', + name: 'Filter by regex', + parameters: zodSchemaToFields(RegexPolicyOptsSchema), + schema: RegexPolicyOptsSchema, + }, + 'ReplyBotPolicy': { + instantiate: (params) => { + const parsed = ReplyBotPolicyOptsSchema.parse(params); + return new ReplyBotPolicy({ + store: this.opts.store, + ...parsed, + }); + }, + description: 'Block events that reply too quickly to other events.', + name: 'Block reply spambots', + parameters: zodSchemaToFields(ReplyBotPolicyOptsSchema), + schema: ReplyBotPolicyOptsSchema, + }, + 'SizePolicy': { + instantiate: (params) => { + const parsed = SizePolicyOptsSchema.parse(params); + return new SizePolicy({ + ...parsed, + }); + }, + description: 'Restrict events that are too big in size.', + name: 'Block events by size', + parameters: zodSchemaToFields(SizePolicyOptsSchema), + schema: SizePolicyOptsSchema, + }, + 'WhitelistPolicy': { + instantiate: (params) => { + const parsed = WhitelistPolicyOptsSchema.parse(params); + return new WhitelistPolicy(parsed.pubkeys.map(normalizeNpub)); + }, + description: 'Allow only whitelisted pubkeys to post. All other events are rejected.', + name: 'Whitelist people', + parameters: zodSchemaToFields(WhitelistPolicyOptsSchema), + schema: WhitelistPolicyOptsSchema, + }, + 'WoTPolicy': { + instantiate: (params) => { + const parsed = WoTPolicyOptsSchema.parse(params); + return new WoTPolicy({ + store: this.opts.store, + ...parsed, + }); + }, + description: 'Use a web-of-trust to only allow users a certain distance from trusted users to publish posts.', + name: 'Build a web-of-trust', + parameters: zodSchemaToFields(WoTPolicyOptsSchema), + schema: WoTPolicyOptsSchema, + }, + }; +} diff --git a/packages/ditto/utils/policies/schemas.ts b/packages/ditto/utils/policies/schemas.ts new file mode 100644 index 00000000..28f44d6a --- /dev/null +++ b/packages/ditto/utils/policies/schemas.ts @@ -0,0 +1,150 @@ +import { NostrEvent, NProfilePointer, NStore } from '@nostrify/types'; +import { z } from 'zod'; +import { NSchema as n } from '@nostrify/nostrify'; + +/** Options for the `WoTPolicy`. */ +export const WoTPolicyOptsSchema = z.object({ + pubkeys: z.array(z.string()), + depth: z.number().default(2), +}); + +export interface WoTPolicyOpts extends z.TypeOf { + store: NStore; +} + +/** Options for `FiltersPolicy`. */ +export const FiltersPolicyOptsSchema = z.object({ + filters: z.array(n.filter()), +}); + +interface FiltersPolicyOpts extends z.TypeOf {} + +/** Options for `HashtagPolicy`. */ +export const HashtagPolicyOptsSchema = z.object({ + hashtags: z.array(z.string()).describe('Banned hashtags (case-insensitive)'), +}); + +export interface HashtagPolicyOpts extends z.TypeOf {} + +/** Options for `WhitelistPolicy`. */ +export const WhitelistPolicyOptsSchema = z.object({ + pubkeys: z.array(z.string()).describe('Allowed pubkeys'), +}); + +export interface WhitelistPolicyOpts extends z.TypeOf {} + +/** Options for `RegexPolicy`. */ +export const RegexPolicyOptsSchema = z.object({ + expr: z.string().describe('Expression'), + flags: z.string().optional().describe('Additional RegExp flags. Leave blank if unsure.'), +}); + +export interface RegexPolicyOpts extends Partial> { + expr: string; +} + +/** Options for `KeywordPolicy`. */ +export const KeywordPolicyOptsSchema = z.object({ + keywords: z.array(z.string()).describe('Banned keywords (case-insensitive)'), +}); + +export interface KeywordPolicyOpts extends z.TypeOf {} + +/** Options for `DomainPolicy`. */ +export const DomainPolicyOptsSchema = z.object({ + blacklist: z.array(z.string()).default([]).describe('Domains to blacklist'), + whitelist: z.array(z.string()).optional().describe('Domains to whitelist'), +}); + +export interface DomainPolicyOpts extends Partial> { + lookup?(nip05: string, signal?: AbortSignal): Promise; + store: NStore; +} + +/** Options for `PubkeyBanPolicy`. */ +export const PubkeyBanPolicyOptsSchema = z.object({ + pubkeys: z.array(z.string()).describe('Banned pubkeys'), +}); + +export interface PubkeyBanPolicyOpts extends z.TypeOf {} + +/** Options for `OpenAIPolicy`. */ +export const OpenAIPolicyOptsSchema = z.object({ + endpoint: z.string().default('https://api.openai.com/v1/moderations').describe('OpenAI API endpoint'), + kinds: z.array(z.number()).default([1, 30023]).describe('Event kinds to filter through the policy'), + apiKey: z.string().describe('OpenAI API key'), +}); + +interface OpenAIModerationResult { + id: string; + model: string; + results: { + categories: { + 'hate': boolean; + 'hate/threatening': boolean; + 'self-harm': boolean; + 'sexual': boolean; + 'sexual/minors': boolean; + 'violence': boolean; + 'violence/graphic': boolean; + }; + category_scores: { + 'hate': number; + 'hate/threatening': number; + 'self-harm': number; + 'sexual': number; + 'sexual/minors': number; + 'violence': number; + 'violence/graphic': number; + }; + flagged: boolean; + }[]; +} + +export interface OpenAIPolicyOpts extends Partial> { + apiKey: string; + handler?(event: NostrEvent, result: OpenAIModerationResult): boolean; + fetch?: typeof fetch; +} + +/** Options for `ReplyBotPolicy`. */ +export const ReplyBotPolicyOptsSchema = z.object({ + threshold: z.number().default(1).describe('Minimum time in seconds between two posts.'), + kinds: z.array(z.number()).default([1]).describe('Event kinds to filter'), +}); + +export interface ReplyBotPolicyOpts extends Partial> { + store: NStore; +} + +/** Options for `SizePolicy`. */ +export const SizePolicyOptsSchema = z.object({ + maxBytes: z.number().default(8 * 1024).describe('Max allowed message size in bytes'), +}); + +export interface SizePolicyOpts extends Partial> {} + +/** Options for `AntiDuplicationPolicy`. */ +export const AntiDuplicationPolicyOptsSchema = z.object({ + expireIn: z.number().default(60000).describe('How long should we wait before an identical message can be reposted?'), + minLength: z.number().default(50).describe('Minimum length for filtered messages'), +}); + +export interface AntiDuplicationPolicyOpts extends Partial> { + kv: Pick; + deobfuscate?(event: NostrEvent): string; +} + +/** Options for `HellthreadPolicy`. */ +export const HellthreadPolicyOptsSchema = z.object({ + limit: z.number().default(100).describe('Maximum number of mentions to allow per post'), +}); + +export interface HellthreadPolicyOpts extends Partial> {} + +/** Options for `PowPolicy`. */ +export const PowPolicyOptsSchema = z.object({ + difficulty: z.number().default(1).describe('Number of bits of proof-of-work to require'), +}); + +export interface PowPolicyOpts extends Partial> {} diff --git a/packages/ditto/workers/policy.test.ts b/packages/ditto/workers/policy.test.ts index 623e7c98..c6c42a7c 100644 --- a/packages/ditto/workers/policy.test.ts +++ b/packages/ditto/workers/policy.test.ts @@ -1,14 +1,45 @@ import { DittoConf } from '@ditto/conf'; import { generateSecretKey, nip19 } from 'nostr-tools'; -import { PolicyWorker } from './policy.ts'; +import { PolicyWorker } from '@/workers/policy.ts'; +import { assertEquals } from '@std/assert/assert-equals'; +import { join } from '@std/path'; -Deno.test('PolicyWorker', () => { +const blocked = { + id: '19afd70437944671e7f5a02b29221ad444ef7cf60113a5731667e272e59a3979', + pubkey: '79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798', + kind: 1, + tags: [['t', 'porn'], ['t', 'other-blocked-tag']], + content: 'this is a test of the policy system', + sig: + '1d73a7480cfd737b89dc1e0e7175dff67119915f31d24a279a45d56622f4b991b01e431d07b693ee6cd652f3f27274d9e203ee43ae44af7e70ce8647e5326196', + created_at: 1743685015, +}; + +Deno.test('PolicyWorker with script policy', async () => { const conf = new DittoConf( new Map([ ['DITTO_NSEC', nip19.nsecEncode(generateSecretKey())], + ['DATABASE_URL', Deno.env.get('DATABASE_URL')], + ['DITTO_POLICY', join(Deno.cwd(), 'fixtures', 'policy.ts')], ]), ); - new PolicyWorker(conf); + const worker = new PolicyWorker(conf); + const [, , ok] = await worker.call(blocked); + assertEquals(ok, false); +}); + +Deno.test('PolicyWorker with event policy', async () => { + const conf = new DittoConf( + new Map([ + ['DITTO_NSEC', nip19.nsecEncode(generateSecretKey())], + ['DATABASE_URL', Deno.env.get('DATABASE_URL')], + ]), + ); + + const worker = new PolicyWorker(conf); + const [, , ok] = await worker.call(blocked); + + assertEquals(ok, false); }); diff --git a/packages/ditto/workers/policy.ts b/packages/ditto/workers/policy.ts index 6cddd0a0..32eb9691 100644 --- a/packages/ditto/workers/policy.ts +++ b/packages/ditto/workers/policy.ts @@ -54,27 +54,14 @@ export class PolicyWorker implements NPolicy { databaseUrl: conf.databaseUrl, pubkey: await conf.signer.getPublicKey(), }); - logi({ level: 'info', ns: 'ditto.system.policy', - msg: 'Using custom policy', + msg: `Initialising custom policy`, path: conf.policy, enabled: true, }); } catch (e) { - if (e instanceof Error && e.message.includes('Module not found')) { - logi({ - level: 'info', - ns: 'ditto.system.policy', - msg: 'Custom policy not found ', - path: null, - enabled: false, - }); - this.enabled = false; - return; - } - if (e instanceof Error && e.message.includes('PGlite is not supported in worker threads')) { logi({ level: 'warn', diff --git a/packages/ditto/workers/policy.worker.ts b/packages/ditto/workers/policy.worker.ts index 150281a3..8b15c695 100644 --- a/packages/ditto/workers/policy.worker.ts +++ b/packages/ditto/workers/policy.worker.ts @@ -2,23 +2,23 @@ import { DittoConf } from '@ditto/conf'; import { DittoPolyPg } from '@ditto/db'; import '@soapbox/safe-fetch/load'; import { NostrEvent, NostrRelayOK, NPolicy } from '@nostrify/nostrify'; -import { ReadOnlyPolicy } from '@nostrify/policies'; +import { PipePolicy, ReadOnlyPolicy } from '@nostrify/policies'; import * as Comlink from 'comlink'; import { ReadOnlySigner } from '@/signers/ReadOnlySigner.ts'; import { DittoPgStore } from '@/storages/DittoPgStore.ts'; +import { DEFAULT_POLICY_SPEC, PolicyRegistry, PolicySpec } from '@/utils/policies/mod.ts'; +import { logi } from '@soapbox/logi'; // @ts-ignore Don't try to access the env from this worker. Deno.env = new Map(); -/** Serializable object the worker can use to set up the state. */ interface PolicyInit { - /** Path to the policy module (https, jsr, file, etc) */ - path: string; /** Database URL to connect to. */ databaseUrl: string; /** Admin pubkey to use for DittoPgStore checks. */ pubkey: string; + path: string; } export class CustomPolicy implements NPolicy { @@ -29,8 +29,8 @@ export class CustomPolicy implements NPolicy { return this.policy.call(event, signal); } - async init({ path, databaseUrl, pubkey }: PolicyInit): Promise { - const Policy = (await import(path)).default; + async init(opts: PolicyInit): Promise { + const { databaseUrl, pubkey } = opts; const db = new DittoPolyPg(databaseUrl, { poolSize: 1 }); @@ -43,13 +43,47 @@ export class CustomPolicy implements NPolicy { }, }); + const policies: NPolicy[] = []; const store = new DittoPgStore({ db, conf, timeout: 5_000, }); + try { + const Policy = (await import(opts.path)).default; + policies.push(new Policy({ db, store, pubkey })); + } catch (e) { + if (e instanceof Error && e.message.includes('Module not found')) { + logi({ + level: 'info', + ns: 'ditto.system.policy', + msg: 'Custom policy not found ', + path: null, + }); + } + } + const registry = new PolicyRegistry({ store, antiDuplicationPolicyStore: await Deno.openKv() }); + const event = await store + .query([{ kinds: [11984], authors: [await conf.signer.getPublicKey()] }]) + .then((results) => results[0]); - this.policy = new Policy({ db, store, pubkey }); + const spec: PolicySpec = event ? JSON.parse(event.content) : DEFAULT_POLICY_SPEC; + + for (const item of spec.policies) { + const policy = registry.available[item.name]; + if (!policy) continue; + try { + policies.push(policy.instantiate(item.params || {})); + } catch (e) { + logi({ + level: 'error', + ns: 'ditto.system.policy.worker', + msg: `Error instantiating policy ${item.name} with params \`${JSON.stringify(item.params)}\`: ${e}`, + }); + } + } + + this.policy = new PipePolicy(policies); } }