diff --git a/.env.development b/.env.development index 8e9da3e..5a5e098 100644 --- a/.env.development +++ b/.env.development @@ -1 +1,2 @@ -AUTH_JWKS_URL="https://hidra.omni.dev/realms/test/protocol/openid-connect/certs" +# TODO change once base path changes (https://linear.app/omnidev/issue/OMNI-254/move-apiauth-paths-to-base-path-or-subpath-eg-auth) +AUTH_BASE_URL="https://localhost:8000/api/auth" diff --git a/.env.production b/.env.production index 885f864..c30c03a 100644 --- a/.env.production +++ b/.env.production @@ -1 +1,2 @@ -AUTH_JWKS_URL="https://hidra.omni.dev/realms/omni/protocol/openid-connect/certs" +# TODO change once base path changes (https://linear.app/omnidev/issue/OMNI-254/move-apiauth-paths-to-base-path-or-subpath-eg-auth) +AUTH_BASE_URL="https://identity.omni.dev/api/auth" diff --git a/Tiltfile b/Tiltfile new file mode 100644 index 0000000..f1b2174 --- /dev/null +++ b/Tiltfile @@ -0,0 +1,13 @@ +# load environment variables +load("ext://dotenv", "dotenv") + +dotenv(fn=".env.local") + +project_name = "backfeed-api" + +local_resource( + "install-deps-%s" % project_name, + cmd="bun i", + deps=["package.json"], + labels=[project_name], +) diff --git a/biome.json b/biome.jsonc similarity index 79% rename from biome.json rename to biome.jsonc index 4127caf..9712d73 100644 --- a/biome.json +++ b/biome.jsonc @@ -29,13 +29,5 @@ "noNonNullAssertion": "off" } } - }, - "javascript": { - "formatter": { - "quoteStyle": "double", - "arrowParentheses": "always", - "semicolons": "always", - "trailingCommas": "es5" - } } } diff --git a/bun.lock b/bun.lock index 364599b..008665f 100644 --- a/bun.lock +++ b/bun.lock @@ -3,34 +3,34 @@ "workspaces": { "": { "dependencies": { - "@envelop/generic-auth": "^8.0.1", + "@envelop/generic-auth": "^9.1.3", "@envelop/parser-cache": "^8.1.3", "@envelop/validation-cache": "^8.1.3", "@escape.tech/graphql-armor": "^3.1.2", "@graphile/pg-aggregates": "0.2.0-beta.7", "@graphile/simplify-inflection": "8.0.0-beta.5", "dayjs": "^1.11.13", - "drizzle-orm": "^0.38.2", - "drizzle-seed": "^0.3.0", + "drizzle-orm": "^0.41.0", + "drizzle-seed": "^0.3.1", "graphile-export": "0.0.2-beta.24", - "graphql": "^16.9.0", - "graphql-yoga": "^5.8.0", - "hono": "^4.6.8", - "jose": "^5.9.6", - "pg": "^8.13.1", + "graphql": "^16.10.0", + "graphql-yoga": "^5.13.2", + "hono": "^4.7.5", + "jose": "^6.0.10", + "pg": "^8.14.1", "postgraphile": "5.0.0-beta.37", "postgraphile-plugin-connection-filter": "3.0.0-beta.7", }, "devDependencies": { "@biomejs/biome": "^1.9.4", - "@faker-js/faker": "^9.1.0", - "@types/bun": "^1.1.12", - "@types/node": "^22.8.6", - "@types/pg": "^8.11.10", - "drizzle-kit": "^0.30.1", - "husky": "^9.1.6", - "replace-in-file": "^8.2.0", - "typescript": "^5.6.3", + "@faker-js/faker": "^9.6.0", + "@types/bun": "^1.2.8", + "@types/node": "^22.13.14", + "@types/pg": "^8.11.11", + "drizzle-kit": "^0.30.6", + "husky": "^9.1.7", + "replace-in-file": "^8.3.0", + "typescript": "^5.8.2", }, }, }, @@ -83,15 +83,17 @@ "@emotion/memoize": ["@emotion/memoize@0.9.0", "", {}, "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ=="], - "@envelop/core": ["@envelop/core@5.0.2", "", { "dependencies": { "@envelop/types": "5.0.0", "tslib": "^2.5.0" } }, "sha512-tVL6OrMe6UjqLosiE+EH9uxh2TQC0469GwF4tE014ugRaDDKKVWwFwZe0TBMlcyHKh5MD4ZxktWo/1hqUxIuhw=="], + "@envelop/core": ["@envelop/core@5.2.3", "", { "dependencies": { "@envelop/instrumentation": "^1.0.0", "@envelop/types": "^5.2.1", "@whatwg-node/promise-helpers": "^1.2.4", "tslib": "^2.5.0" } }, "sha512-KfoGlYD/XXQSc3BkM1/k15+JQbkQ4ateHazeZoWl9P71FsLTDXSjGy6j7QqfhpIDSbxNISqhPMfZHYSbDFOofQ=="], - "@envelop/extended-validation": ["@envelop/extended-validation@4.1.0", "", { "dependencies": { "@graphql-tools/utils": "^10.0.0", "tslib": "^2.5.0" }, "peerDependencies": { "@envelop/core": "^5.0.2", "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0" } }, "sha512-S90LQanW+xg3Lkp2sNiHa2KJnXXpKLucKys05Wk5zpiV0vL0SDX+/cuV+tnDhShWJucunAGi34n8xFCXsUUOkA=="], + "@envelop/extended-validation": ["@envelop/extended-validation@5.1.3", "", { "dependencies": { "@graphql-tools/utils": "^10.0.0", "tslib": "^2.5.0" }, "peerDependencies": { "@envelop/core": "^5.2.3", "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0" } }, "sha512-mp7CCN+KNp375FEFN3gRdl7M8rqdmqOUfUIEHkP6O7injeuxd86nbFuS4f/uJGcTubFOaCs1IKIFBcuYZk33iQ=="], - "@envelop/generic-auth": ["@envelop/generic-auth@8.0.1", "", { "dependencies": { "@envelop/extended-validation": "^4.1.0", "@graphql-tools/executor": "^1.3.6", "@graphql-tools/utils": "^10.5.1", "tslib": "^2.5.0" }, "peerDependencies": { "@envelop/core": "^5.0.2", "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0" } }, "sha512-QznhYwj1Ri8Afkc6djtBTWI28xMdmKUxyqLc85XfpjxVnKrGcd8jdgV08SKiRQC29AH/rhSZprt6vXAXIsqRJA=="], + "@envelop/generic-auth": ["@envelop/generic-auth@9.1.3", "", { "dependencies": { "@envelop/extended-validation": "^5.1.3", "@graphql-tools/executor": "^1.3.6", "@graphql-tools/utils": "^10.5.1", "@whatwg-node/promise-helpers": "^1.2.1", "tslib": "^2.5.0" }, "peerDependencies": { "@envelop/core": "^5.2.3", "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0" } }, "sha512-HH8X0qcz4lb1xQfG4LhXbvwUU0oWiwBdLNKbjJo6JL2frYXFWCQNUbkIzQL7S64+ZOuTU0LnTSVucyI2Nd0Hqw=="], + + "@envelop/instrumentation": ["@envelop/instrumentation@1.0.0", "", { "dependencies": { "@whatwg-node/promise-helpers": "^1.2.1", "tslib": "^2.5.0" } }, "sha512-cxgkB66RQB95H3X27jlnxCRNTmPuSTgmBAq6/4n2Dtv4hsk4yz8FadA1ggmd0uZzvKqWD6CR+WFgTjhDqg7eyw=="], "@envelop/parser-cache": ["@envelop/parser-cache@8.1.3", "", { "dependencies": { "lru-cache": "^10.0.0", "tslib": "^2.5.0" }, "peerDependencies": { "@envelop/core": "^5.2.3", "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0" } }, "sha512-JOKf8bL999DyZ1j8Ugka4xmbAoGaTRlArXf34fM4Vx7TfsapwwEaLPqdG/tA9921HvCZLlFfcimk7+Q06ujK4g=="], - "@envelop/types": ["@envelop/types@5.0.0", "", { "dependencies": { "tslib": "^2.5.0" } }, "sha512-IPjmgSc4KpQRlO4qbEDnBEixvtb06WDmjKfi/7fkZaryh5HuOmTtixe1EupQI5XfXO8joc3d27uUZ0QdC++euA=="], + "@envelop/types": ["@envelop/types@5.2.1", "", { "dependencies": { "@whatwg-node/promise-helpers": "^1.0.0", "tslib": "^2.5.0" } }, "sha512-CsFmA3u3c2QoLDTfEpGr4t25fjMU31nyvse7IzWTvb0ZycuPjMjb0fjlheh+PbhBYb9YLugnT2uY6Mwcg1o+Zg=="], "@envelop/validation-cache": ["@envelop/validation-cache@8.1.3", "", { "dependencies": { "hash-it": "^6.0.0", "lru-cache": "^10.0.0", "tslib": "^2.5.0" }, "peerDependencies": { "@envelop/core": "^5.2.3", "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0" } }, "sha512-npsHXijQi2cNSpHQLnYLdsmembh72kj+d9L9qNqIRgPAgNCsTsEE6lBUjhcgudc0XOQW2cvmsSW1E3MBEBZt5w=="], @@ -161,7 +163,7 @@ "@escape.tech/graphql-armor-types": ["@escape.tech/graphql-armor-types@0.7.0", "", { "dependencies": { "graphql": "^16.0.0" } }, "sha512-RHxyyp6PDgS6NAPnnmB6JdmUJ6oqhpSHFbsglGWeCcnNzceA5AkQFpir7VIDbVyS8LNC1xhipOtk7f9ycrIemQ=="], - "@faker-js/faker": ["@faker-js/faker@9.3.0", "", {}, "sha512-r0tJ3ZOkMd9xsu3VRfqlFR6cz0V/jFYRswAIpC+m/DIfAUXq7g8N7wTAlhSANySXYGKzGryfDXwtwsY8TxEIDw=="], + "@faker-js/faker": ["@faker-js/faker@9.6.0", "", {}, "sha512-3vm4by+B5lvsFPSyep3ELWmZfE3kicDtmemVpuwl1yH7tqtnHdsA6hG8fbXedMVdkzgtvzWoRgjSB4Q+FHnZiw=="], "@graphile/lru": ["@graphile/lru@5.0.0-beta.3", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-atoHRmLuYMCoMeCjS1pIA442eqAHwFZ3+bnjm3Mn+kAvujyXzGs8uup39gfmMgxOFjRAPNmPEiPw2oJUbOk65Q=="], @@ -179,11 +181,11 @@ "@graphql-typed-document-node/core": ["@graphql-typed-document-node/core@3.2.0", "", { "peerDependencies": { "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, "sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ=="], - "@graphql-yoga/logger": ["@graphql-yoga/logger@2.0.0", "", { "dependencies": { "tslib": "^2.5.2" } }, "sha512-Mg8psdkAp+YTG1OGmvU+xa6xpsAmSir0hhr3yFYPyLNwzUj95DdIwsMpKadDj9xDpYgJcH3Hp/4JMal9DhQimA=="], + "@graphql-yoga/logger": ["@graphql-yoga/logger@2.0.1", "", { "dependencies": { "tslib": "^2.8.1" } }, "sha512-Nv0BoDGLMg9QBKy9cIswQ3/6aKaKjlTh87x3GiBg2Z4RrjyrM48DvOOK0pJh1C1At+b0mUIM67cwZcFTDLN4sA=="], - "@graphql-yoga/subscription": ["@graphql-yoga/subscription@5.0.2", "", { "dependencies": { "@graphql-yoga/typed-event-target": "^3.0.1", "@repeaterjs/repeater": "^3.0.4", "@whatwg-node/events": "^0.1.0", "tslib": "^2.5.2" } }, "sha512-KGacW1FtUXR5e3qk4YmEFQRGTov8lOkpW7syjTD3EN2t5HRWrSsut2LwjVdK+HcP3H9UEuZ9RXw/+shqV+1exQ=="], + "@graphql-yoga/subscription": ["@graphql-yoga/subscription@5.0.3", "", { "dependencies": { "@graphql-yoga/typed-event-target": "^3.0.2", "@repeaterjs/repeater": "^3.0.4", "@whatwg-node/events": "^0.1.0", "tslib": "^2.8.1" } }, "sha512-xLGEataxCULjL9rlTCVFL1IW2E90TnDIL+mE4lZBi9X92jc6s+Q+jk6Ax3I98kryCJh0UMiwjit7CaIIczTiJg=="], - "@graphql-yoga/typed-event-target": ["@graphql-yoga/typed-event-target@3.0.1", "", { "dependencies": { "@repeaterjs/repeater": "^3.0.4", "tslib": "^2.5.2" } }, "sha512-SWVkyFivzlDqGTBrGTWTNg+aFGP/cIiotirUFnvwuUGt2gla6UJoKhII6aPoHNg3/5vpUAL1KzyoaXMK2PO0JA=="], + "@graphql-yoga/typed-event-target": ["@graphql-yoga/typed-event-target@3.0.2", "", { "dependencies": { "@repeaterjs/repeater": "^3.0.4", "tslib": "^2.8.1" } }, "sha512-ZpJxMqB+Qfe3rp6uszCQoag4nSw42icURnBRfFYSOmTgEeOe4rD0vYlbA8spvCu2TlCesNTlEN9BLWtQqLxabA=="], "@isaacs/cliui": ["@isaacs/cliui@8.0.2", "", { "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", "strip-ansi": "^7.0.1", "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" } }, "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA=="], @@ -197,7 +199,7 @@ "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.25", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ=="], - "@kamilkisiela/fast-url-parser": ["@kamilkisiela/fast-url-parser@1.1.4", "", {}, "sha512-gbkePEBupNydxCelHCESvFSFM8XPh1Zs/OAVRW/rKpEqPAl5PbOM90Si8mv9bvnR53uPD2s/FiRxdvSejpRJew=="], + "@petamoriken/float16": ["@petamoriken/float16@3.9.2", "", {}, "sha512-VgffxawQde93xKxT3qap3OH+meZf7VaSB5Sqd4Rqc+FP5alWbpOyan/7tRbOAvynjpG3GpdtAuGU/NdhQpmrog=="], "@pkgjs/parseargs": ["@pkgjs/parseargs@0.11.0", "", {}, "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg=="], @@ -205,13 +207,13 @@ "@tsconfig/node20": ["@tsconfig/node20@20.1.4", "", {}, "sha512-sqgsT69YFeLWf5NtJ4Xq/xAF8p4ZQHlmGW74Nu2tD4+g5fAsposc4ZfaaPixVu4y01BEiDCWLRDCvDM5JOsRxg=="], - "@types/bun": ["@types/bun@1.1.14", "", { "dependencies": { "bun-types": "1.1.37" } }, "sha512-opVYiFGtO2af0dnWBdZWlioLBoxSdDO5qokaazLhq8XQtGZbY4pY3/JxY8Zdf/hEwGubbp7ErZXoN1+h2yesxA=="], + "@types/bun": ["@types/bun@1.2.8", "", { "dependencies": { "bun-types": "1.2.7" } }, "sha512-t8L1RvJVUghW5V+M/fL3Thbxcs0HwNsXsnTEBEfEVqGteiJToOlZ/fyOEaR1kZsNqnu+3XA4RI/qmnX4w6+S+w=="], "@types/interpret": ["@types/interpret@1.1.3", "", { "dependencies": { "@types/node": "*" } }, "sha512-uBaBhj/BhilG58r64mtDb/BEdH51HIQLgP5bmWzc5qCtFMja8dCk/IOJmk36j0lbi9QHwI6sbtUNGuqXdKCAtQ=="], - "@types/node": ["@types/node@22.10.4", "", { "dependencies": { "undici-types": "~6.20.0" } }, "sha512-99l6wv4HEzBQhvaU/UGoeBoCK61SCROQaCCGyQSgX2tEQ3rKkNZ2S7CEWnS/4s1LV+8ODdK21UeyR1fHP2mXug=="], + "@types/node": ["@types/node@22.13.14", "", { "dependencies": { "undici-types": "~6.20.0" } }, "sha512-Zs/Ollc1SJ8nKUAgc7ivOEdIBM8JAKgrqqUYi2J997JuKO7/tpQC+WCetQ1sypiKCQWHdvdg9wBNpUPEWZae7w=="], - "@types/pg": ["@types/pg@8.11.10", "", { "dependencies": { "@types/node": "*", "pg-protocol": "*", "pg-types": "^4.0.1" } }, "sha512-LczQUW4dbOQzsH2RQ5qoeJ6qJPdrcM/DcMLoqWQkMLMsq83J5lAX3LXjdkWdpscFy67JSOWDnh7Ny/sPFykmkg=="], + "@types/pg": ["@types/pg@8.11.11", "", { "dependencies": { "@types/node": "*", "pg-protocol": "*", "pg-types": "^4.0.1" } }, "sha512-kGT1qKM8wJQ5qlawUrEkXgvMSXoV213KfMGXcwfDwUIfUHXqXYXOfS1nE1LINRJVVVx5wCm70XnFlMHaIcQAfw=="], "@types/pluralize": ["@types/pluralize@0.0.30", "", {}, "sha512-kVww6xZrW/db5BR9OqiT71J9huRdQ+z/r+LbDuT7/EK50mCmj5FoaIARnVv0rvjUS/YpDox0cDU9lpQT011VBA=="], @@ -223,11 +225,13 @@ "@whatwg-node/events": ["@whatwg-node/events@0.1.2", "", { "dependencies": { "tslib": "^2.6.3" } }, "sha512-ApcWxkrs1WmEMS2CaLLFUEem/49erT3sxIVjpzU5f6zmVcnijtDSrhoK2zVobOIikZJdH63jdAXOrvjf6eOUNQ=="], - "@whatwg-node/fetch": ["@whatwg-node/fetch@0.10.1", "", { "dependencies": { "@whatwg-node/node-fetch": "^0.7.1", "urlpattern-polyfill": "^10.0.0" } }, "sha512-gmPOLrsjSZWEZlr9Oe5+wWFBq3CG6fN13rGlM91Jsj/vZ95G9CCvrORGBAxMXy0AJGiC83aYiHXn3JzTzXQmbA=="], + "@whatwg-node/fetch": ["@whatwg-node/fetch@0.10.5", "", { "dependencies": { "@whatwg-node/node-fetch": "^0.7.11", "urlpattern-polyfill": "^10.0.0" } }, "sha512-+yFJU3hmXPAHJULwx0VzCIsvr/H0lvbPvbOH3areOH3NAuCxCwaJsQ8w6/MwwMcvEWIynSsmAxoyaH04KeosPg=="], + + "@whatwg-node/node-fetch": ["@whatwg-node/node-fetch@0.7.17", "", { "dependencies": { "@whatwg-node/disposablestack": "^0.0.6", "@whatwg-node/promise-helpers": "^1.2.5", "busboy": "^1.6.0", "tslib": "^2.6.3" } }, "sha512-Ni8A2H/r6brNf4u8Y7ATxmWUD0xltsQ6a4NnjWSbw4PgaT34CbY+u4QtVsFj9pTC3dBKJADKjac3AieAig+PZA=="], - "@whatwg-node/node-fetch": ["@whatwg-node/node-fetch@0.7.5", "", { "dependencies": { "@kamilkisiela/fast-url-parser": "^1.1.4", "@whatwg-node/disposablestack": "^0.0.5", "busboy": "^1.6.0", "fast-querystring": "^1.1.1", "tslib": "^2.6.3" } }, "sha512-t7kGrt2fdfNvzy1LCAE9/OnIyMtizgFhgJmk7iLJwQsLmR7S86F8Q4aDRPbCfo7pISJP6Fx/tPdfFNjHS23WTA=="], + "@whatwg-node/promise-helpers": ["@whatwg-node/promise-helpers@1.3.0", "", { "dependencies": { "tslib": "^2.6.3" } }, "sha512-486CouizxHXucj8Ky153DDragfkMcHtVEToF5Pn/fInhUUSiCmt9Q4JVBa6UK5q4RammFBtGQ4C9qhGlXU9YbA=="], - "@whatwg-node/server": ["@whatwg-node/server@0.9.65", "", { "dependencies": { "@whatwg-node/disposablestack": "^0.0.5", "@whatwg-node/fetch": "^0.10.0", "tslib": "^2.6.3" } }, "sha512-CnYTFEUJkbbAcuBXnXirVIgKBfs2YA6sSGjxeq07AUiyXuoQ0fbvTIQoteMglmn09QeGzcH/l0B7nIml83xvVw=="], + "@whatwg-node/server": ["@whatwg-node/server@0.10.3", "", { "dependencies": { "@envelop/instrumentation": "^1.0.0", "@whatwg-node/disposablestack": "^0.0.6", "@whatwg-node/fetch": "^0.10.5", "@whatwg-node/promise-helpers": "^1.2.3", "tslib": "^2.6.3" } }, "sha512-2Dnfey57vWR+hDUMjPhNzJQc9z116BBzSQwR9eD0vhnzYmN2rJXuY0QuMaHDCCqEZRmFHg2bo8iJ+/1uHOlxpg=="], "ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], @@ -241,7 +245,7 @@ "buffer-from": ["buffer-from@1.1.2", "", {}, "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="], - "bun-types": ["bun-types@1.1.37", "", { "dependencies": { "@types/node": "~20.12.8", "@types/ws": "~8.5.10" } }, "sha512-C65lv6eBr3LPJWFZ2gswyrGZ82ljnH8flVE03xeXxKhi2ZGtFiO4isRKTKnitbSqtRAcaqYSR6djt1whI66AbA=="], + "bun-types": ["bun-types@1.2.7", "", { "dependencies": { "@types/node": "*", "@types/ws": "*" } }, "sha512-P4hHhk7kjF99acXqKvltyuMQ2kf/rzIw3ylEDpCxDS9Xa0X0Yp/gJu/vDCucmWpiur5qJ0lwB2bWzOXa2GlHqA=="], "busboy": ["busboy@1.6.0", "", { "dependencies": { "streamsearch": "^1.1.0" } }, "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA=="], @@ -261,11 +265,11 @@ "debug": ["debug@4.4.0", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA=="], - "drizzle-kit": ["drizzle-kit@0.30.1", "", { "dependencies": { "@drizzle-team/brocli": "^0.10.2", "@esbuild-kit/esm-loader": "^2.5.5", "esbuild": "^0.19.7", "esbuild-register": "^3.5.0" }, "bin": { "drizzle-kit": "bin.cjs" } }, "sha512-HmA/NeewvHywhJ2ENXD3KvOuM/+K2dGLJfxVfIHsGwaqKICJnS+Ke2L6UcSrSrtMJLJaT0Im1Qv4TFXfaZShyw=="], + "drizzle-kit": ["drizzle-kit@0.30.6", "", { "dependencies": { "@drizzle-team/brocli": "^0.10.2", "@esbuild-kit/esm-loader": "^2.5.5", "esbuild": "^0.19.7", "esbuild-register": "^3.5.0", "gel": "^2.0.0" }, "bin": { "drizzle-kit": "bin.cjs" } }, "sha512-U4wWit0fyZuGuP7iNmRleQyK2V8wCuv57vf5l3MnG4z4fzNTjY/U13M8owyQ5RavqvqxBifWORaR3wIUzlN64g=="], - "drizzle-orm": ["drizzle-orm@0.38.3", "", { "peerDependencies": { "@aws-sdk/client-rds-data": ">=3", "@cloudflare/workers-types": ">=4", "@electric-sql/pglite": ">=0.2.0", "@libsql/client": ">=0.10.0", "@libsql/client-wasm": ">=0.10.0", "@neondatabase/serverless": ">=0.10.0", "@op-engineering/op-sqlite": ">=2", "@opentelemetry/api": "^1.4.1", "@planetscale/database": ">=1", "@prisma/client": "*", "@tidbcloud/serverless": "*", "@types/better-sqlite3": "*", "@types/pg": "*", "@types/react": ">=18", "@types/sql.js": "*", "@vercel/postgres": ">=0.8.0", "@xata.io/client": "*", "better-sqlite3": ">=7", "bun-types": "*", "expo-sqlite": ">=14.0.0", "knex": "*", "kysely": "*", "mysql2": ">=2", "pg": ">=8", "postgres": ">=3", "react": ">=18", "sql.js": ">=1", "sqlite3": ">=5" }, "optionalPeers": ["@aws-sdk/client-rds-data", "@cloudflare/workers-types", "@electric-sql/pglite", "@libsql/client", "@libsql/client-wasm", "@neondatabase/serverless", "@op-engineering/op-sqlite", "@opentelemetry/api", "@planetscale/database", "@prisma/client", "@tidbcloud/serverless", "@types/better-sqlite3", "@types/pg", "@types/react", "@types/sql.js", "@vercel/postgres", "@xata.io/client", "better-sqlite3", "bun-types", "expo-sqlite", "knex", "kysely", "mysql2", "pg", "postgres", "react", "sql.js", "sqlite3"] }, "sha512-w41Y+PquMpSff/QDRGdItG0/aWca+/J3Sda9PPGkTxBtjWQvgU1jxlFBXdjog5tYvTu58uvi3PwR1NuCx0KeZg=="], + "drizzle-orm": ["drizzle-orm@0.41.0", "", { "peerDependencies": { "@aws-sdk/client-rds-data": ">=3", "@cloudflare/workers-types": ">=4", "@electric-sql/pglite": ">=0.2.0", "@libsql/client": ">=0.10.0", "@libsql/client-wasm": ">=0.10.0", "@neondatabase/serverless": ">=0.10.0", "@op-engineering/op-sqlite": ">=2", "@opentelemetry/api": "^1.4.1", "@planetscale/database": ">=1", "@prisma/client": "*", "@tidbcloud/serverless": "*", "@types/better-sqlite3": "*", "@types/pg": "*", "@types/sql.js": "*", "@vercel/postgres": ">=0.8.0", "@xata.io/client": "*", "better-sqlite3": ">=7", "bun-types": "*", "expo-sqlite": ">=14.0.0", "gel": ">=2", "knex": "*", "kysely": "*", "mysql2": ">=2", "pg": ">=8", "postgres": ">=3", "sql.js": ">=1", "sqlite3": ">=5" }, "optionalPeers": ["@aws-sdk/client-rds-data", "@cloudflare/workers-types", "@electric-sql/pglite", "@libsql/client", "@libsql/client-wasm", "@neondatabase/serverless", "@op-engineering/op-sqlite", "@opentelemetry/api", "@planetscale/database", "@prisma/client", "@tidbcloud/serverless", "@types/better-sqlite3", "@types/pg", "@types/sql.js", "@vercel/postgres", "@xata.io/client", "better-sqlite3", "bun-types", "expo-sqlite", "gel", "knex", "kysely", "mysql2", "pg", "postgres", "sql.js", "sqlite3"] }, "sha512-7A4ZxhHk9gdlXmTdPj/lREtP+3u8KvZ4yEN6MYVxBzZGex5Wtdc+CWSbu7btgF6TB0N+MNPrvW7RKBbxJchs/Q=="], - "drizzle-seed": ["drizzle-seed@0.3.0", "", { "dependencies": { "pure-rand": "^6.1.0" }, "peerDependencies": { "drizzle-orm": ">=0.36.4" }, "optionalPeers": ["drizzle-orm"] }, "sha512-8WSt1WdtYWqClsCxKeAmU/bw8X+weYtuA/h8M3gVc8LiHU2AZX5ZUnvUxwdBsP+SkN26ARGhmU0XIJ2OEmHmfA=="], + "drizzle-seed": ["drizzle-seed@0.3.1", "", { "dependencies": { "pure-rand": "^6.1.0" }, "peerDependencies": { "drizzle-orm": ">=0.36.4" }, "optionalPeers": ["drizzle-orm"] }, "sha512-F/0lgvfOAsqlYoHM/QAGut4xXIOXoE5VoAdv2FIl7DpGYVXlAzKuJO+IphkKUFK3Dz+rFlOsQLnMNrvoQ0cx7g=="], "dset": ["dset@3.1.4", "", {}, "sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA=="], @@ -275,6 +279,8 @@ "emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], + "env-paths": ["env-paths@3.0.0", "", {}, "sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A=="], + "esbuild": ["esbuild@0.19.12", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.19.12", "@esbuild/android-arm": "0.19.12", "@esbuild/android-arm64": "0.19.12", "@esbuild/android-x64": "0.19.12", "@esbuild/darwin-arm64": "0.19.12", "@esbuild/darwin-x64": "0.19.12", "@esbuild/freebsd-arm64": "0.19.12", "@esbuild/freebsd-x64": "0.19.12", "@esbuild/linux-arm": "0.19.12", "@esbuild/linux-arm64": "0.19.12", "@esbuild/linux-ia32": "0.19.12", "@esbuild/linux-loong64": "0.19.12", "@esbuild/linux-mips64el": "0.19.12", "@esbuild/linux-ppc64": "0.19.12", "@esbuild/linux-riscv64": "0.19.12", "@esbuild/linux-s390x": "0.19.12", "@esbuild/linux-x64": "0.19.12", "@esbuild/netbsd-x64": "0.19.12", "@esbuild/openbsd-x64": "0.19.12", "@esbuild/sunos-x64": "0.19.12", "@esbuild/win32-arm64": "0.19.12", "@esbuild/win32-ia32": "0.19.12", "@esbuild/win32-x64": "0.19.12" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg=="], "esbuild-register": ["esbuild-register@3.6.0", "", { "dependencies": { "debug": "^4.3.4" }, "peerDependencies": { "esbuild": ">=0.12 <1" } }, "sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg=="], @@ -283,14 +289,12 @@ "eventemitter3": ["eventemitter3@5.0.1", "", {}, "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA=="], - "fast-decode-uri-component": ["fast-decode-uri-component@1.0.1", "", {}, "sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg=="], - - "fast-querystring": ["fast-querystring@1.1.2", "", { "dependencies": { "fast-decode-uri-component": "^1.0.1" } }, "sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg=="], - "follow-redirects": ["follow-redirects@1.15.9", "", {}, "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ=="], "foreground-child": ["foreground-child@3.3.0", "", { "dependencies": { "cross-spawn": "^7.0.0", "signal-exit": "^4.0.1" } }, "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg=="], + "gel": ["gel@2.0.1", "", { "dependencies": { "@petamoriken/float16": "^3.8.7", "debug": "^4.3.4", "env-paths": "^3.0.0", "semver": "^7.6.2", "shell-quote": "^1.8.1", "which": "^4.0.0" }, "bin": { "gel": "dist/cli.mjs" } }, "sha512-gfem3IGvqKqXwEq7XseBogyaRwGsQGuE7Cw/yQsjLGdgiyqX92G1xENPCE0ltunPGcsJIa6XBOTx/PK169mOqw=="], + "get-caller-file": ["get-caller-file@2.0.5", "", {}, "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="], "get-tsconfig": ["get-tsconfig@4.8.1", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg=="], @@ -317,13 +321,13 @@ "graphql-ws": ["graphql-ws@5.16.0", "", { "peerDependencies": { "graphql": ">=0.11 <=16" } }, "sha512-Ju2RCU2dQMgSKtArPbEtsK5gNLnsQyTNIo/T7cZNp96niC1x0KdJNZV0TIoilceBPQwfb5itrGl8pkFeOUMl4A=="], - "graphql-yoga": ["graphql-yoga@5.10.8", "", { "dependencies": { "@envelop/core": "^5.0.2", "@graphql-tools/executor": "^1.3.7", "@graphql-tools/schema": "^10.0.11", "@graphql-tools/utils": "^10.6.2", "@graphql-yoga/logger": "^2.0.0", "@graphql-yoga/subscription": "^5.0.2", "@whatwg-node/fetch": "^0.10.1", "@whatwg-node/server": "^0.9.64", "dset": "^3.1.1", "lru-cache": "^10.0.0", "tslib": "^2.8.1" }, "peerDependencies": { "graphql": "^15.2.0 || ^16.0.0" } }, "sha512-a3qJOd7t/sWp6yQ0n+M/7KmhGRm6ulSeY7WTdyb/pPCZGccPW9iLz4O2k0DPsF50k8VHJLS2VSlnZOeqkR2mOg=="], + "graphql-yoga": ["graphql-yoga@5.13.2", "", { "dependencies": { "@envelop/core": "^5.2.3", "@envelop/instrumentation": "^1.0.0", "@graphql-tools/executor": "^1.4.0", "@graphql-tools/schema": "^10.0.11", "@graphql-tools/utils": "^10.6.2", "@graphql-yoga/logger": "^2.0.1", "@graphql-yoga/subscription": "^5.0.3", "@whatwg-node/fetch": "^0.10.5", "@whatwg-node/promise-helpers": "^1.2.4", "@whatwg-node/server": "^0.10.1", "dset": "^3.1.4", "lru-cache": "^10.0.0", "tslib": "^2.8.1" }, "peerDependencies": { "graphql": "^15.2.0 || ^16.0.0" } }, "sha512-ZXhIoAPCV2K2ozwpxDL1ZXhhI2SvIp3hJMaSRaHcojLGE9w9iV8oYGPnZKcV5eisF3VE13RcIF4Ys6TTkU338Q=="], "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], "hash-it": ["hash-it@6.0.0", "", {}, "sha512-KHzmSFx1KwyMPw0kXeeUD752q/Kfbzhy6dAZrjXV9kAIXGqzGvv8vhkUqj+2MGZldTo0IBpw6v7iWE7uxsvH0w=="], - "hono": ["hono@4.6.15", "", {}, "sha512-OiQwvAOAaI2JrABBH69z5rsctHDzFzIKJge0nYXgtzGJ0KftwLWcBXm1upJC23/omNRtnqM0gjRMbtXshPdqhQ=="], + "hono": ["hono@4.7.5", "", {}, "sha512-fDOK5W2C1vZACsgLONigdZTRZxuBqFtcKh7bUQ5cVSbwI2RWjloJDcgFOVzbQrlI6pCmhlTsVYZ7zpLj4m4qMQ=="], "http-proxy": ["http-proxy@1.18.1", "", { "dependencies": { "eventemitter3": "^4.0.0", "follow-redirects": "^1.0.0", "requires-port": "^1.0.0" } }, "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ=="], @@ -333,13 +337,13 @@ "is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="], - "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], + "isexe": ["isexe@3.1.1", "", {}, "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ=="], "iterall": ["iterall@1.3.0", "", {}, "sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg=="], "jackspeak": ["jackspeak@3.4.3", "", { "dependencies": { "@isaacs/cliui": "^8.0.2" }, "optionalDependencies": { "@pkgjs/parseargs": "^0.11.0" } }, "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw=="], - "jose": ["jose@5.9.6", "", {}, "sha512-AMlnetc9+CV9asI19zHmrgS/WYsWUwCn2R7RzlbJWD7F9eWYUTGyBmU9o6PxngtLGOiDGPRu+Uc4fhKzbpteZQ=="], + "jose": ["jose@6.0.10", "", {}, "sha512-skIAxZqcMkOrSwjJvplIPYrlXGpxTPnro2/QWTDCxAdWQrSTV5/KqspMWmi5WAx5+ULswASJiZ0a+1B/Lxt9cw=="], "js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], @@ -385,7 +389,7 @@ "path-scurry": ["path-scurry@1.11.1", "", { "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" } }, "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA=="], - "pg": ["pg@8.13.1", "", { "dependencies": { "pg-connection-string": "^2.7.0", "pg-pool": "^3.7.0", "pg-protocol": "^1.7.0", "pg-types": "^2.1.0", "pgpass": "1.x" }, "optionalDependencies": { "pg-cloudflare": "^1.1.1" }, "peerDependencies": { "pg-native": ">=3.0.1" }, "optionalPeers": ["pg-native"] }, "sha512-OUir1A0rPNZlX//c7ksiu7crsGZTKSOXJPgtNiHGIlC9H0lO+NC6ZDYksSgBYY/thSWhnSRBv8w1lieNNGATNQ=="], + "pg": ["pg@8.14.1", "", { "dependencies": { "pg-connection-string": "^2.7.0", "pg-pool": "^3.8.0", "pg-protocol": "^1.8.0", "pg-types": "^2.1.0", "pgpass": "1.x" }, "optionalDependencies": { "pg-cloudflare": "^1.1.1" }, "peerDependencies": { "pg-native": ">=3.0.1" }, "optionalPeers": ["pg-native"] }, "sha512-0TdbqfjwIun9Fm/r89oB7RFQ0bLgduAhiIqIXOsyKoiC/L54DbuAAzIEN/9Op0f1Po9X7iCPXGoa/Ah+2aI8Xw=="], "pg-cloudflare": ["pg-cloudflare@1.1.1", "", {}, "sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q=="], @@ -397,7 +401,7 @@ "pg-numeric": ["pg-numeric@1.0.2", "", {}, "sha512-BM/Thnrw5jm2kKLE5uJkXqqExRUY/toLHda65XgFTBTFYZyopbKjBe29Ii3RbkvlsMoFwD+tHeGaCjjv0gHlyw=="], - "pg-pool": ["pg-pool@3.7.0", "", { "peerDependencies": { "pg": ">=8.0" } }, "sha512-ZOBQForurqh4zZWjrgSwwAtzJ7QiRX0ovFkZr2klsen3Nm0aoh33Ls0fzfv3imeH/nw/O27cjdz5kzYJfeGp/g=="], + "pg-pool": ["pg-pool@3.8.0", "", { "peerDependencies": { "pg": ">=8.0" } }, "sha512-VBw3jiVm6ZOdLBTIcXLNdSotb6Iy3uOCwDGFAksZCXmi10nyRvnP2v3jl4d+IsLYRyXf6o9hIm/ZtUzlByNUdw=="], "pg-protocol": ["pg-protocol@1.7.0", "", {}, "sha512-hTK/mE36i8fDDhgDFjy6xNOG+LCorxLG3WO17tku+ij6sVHXh1jQUJ8hYAnRhNla4QVD2H8er/FOjc/+EgC6yQ=="], @@ -447,6 +451,8 @@ "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], + "shell-quote": ["shell-quote@1.8.2", "", {}, "sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA=="], + "signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], "source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], @@ -471,7 +477,7 @@ "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], - "typescript": ["typescript@5.7.2", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg=="], + "typescript": ["typescript@5.8.2", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ=="], "undici-types": ["undici-types@6.20.0", "", {}, "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg=="], @@ -479,7 +485,7 @@ "value-or-promise": ["value-or-promise@1.0.12", "", {}, "sha512-Z6Uz+TYwEqE7ZN50gwn+1LCVo9ZVrpxRPOhOLnncYkY1ZzOYtrX8Fwf/rFktZ8R5mJms6EZf5TqNOMeZmnPq9Q=="], - "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], + "which": ["which@4.0.0", "", { "dependencies": { "isexe": "^3.1.1" }, "bin": { "node-which": "bin/which.js" } }, "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg=="], "wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], @@ -501,15 +507,37 @@ "@dataplan/pg/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + "@envelop/extended-validation/@graphql-tools/utils": ["@graphql-tools/utils@10.8.6", "", { "dependencies": { "@graphql-typed-document-node/core": "^3.1.1", "@whatwg-node/promise-helpers": "^1.0.0", "cross-inspect": "1.0.1", "dset": "^3.1.4", "tslib": "^2.4.0" }, "peerDependencies": { "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, "sha512-Alc9Vyg0oOsGhRapfL3xvqh1zV8nKoFUdtLhXX7Ki4nClaIJXckrA86j+uxEuG3ic6j4jlM1nvcWXRn/71AVLQ=="], + "@esbuild-kit/core-utils/esbuild": ["esbuild@0.18.20", "", { "optionalDependencies": { "@esbuild/android-arm": "0.18.20", "@esbuild/android-arm64": "0.18.20", "@esbuild/android-x64": "0.18.20", "@esbuild/darwin-arm64": "0.18.20", "@esbuild/darwin-x64": "0.18.20", "@esbuild/freebsd-arm64": "0.18.20", "@esbuild/freebsd-x64": "0.18.20", "@esbuild/linux-arm": "0.18.20", "@esbuild/linux-arm64": "0.18.20", "@esbuild/linux-ia32": "0.18.20", "@esbuild/linux-loong64": "0.18.20", "@esbuild/linux-mips64el": "0.18.20", "@esbuild/linux-ppc64": "0.18.20", "@esbuild/linux-riscv64": "0.18.20", "@esbuild/linux-s390x": "0.18.20", "@esbuild/linux-x64": "0.18.20", "@esbuild/netbsd-x64": "0.18.20", "@esbuild/openbsd-x64": "0.18.20", "@esbuild/sunos-x64": "0.18.20", "@esbuild/win32-arm64": "0.18.20", "@esbuild/win32-ia32": "0.18.20", "@esbuild/win32-x64": "0.18.20" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA=="], + "@escape.tech/graphql-armor-block-field-suggestions/@envelop/core": ["@envelop/core@5.0.2", "", { "dependencies": { "@envelop/types": "5.0.0", "tslib": "^2.5.0" } }, "sha512-tVL6OrMe6UjqLosiE+EH9uxh2TQC0469GwF4tE014ugRaDDKKVWwFwZe0TBMlcyHKh5MD4ZxktWo/1hqUxIuhw=="], + + "@escape.tech/graphql-armor-cost-limit/@envelop/core": ["@envelop/core@5.0.2", "", { "dependencies": { "@envelop/types": "5.0.0", "tslib": "^2.5.0" } }, "sha512-tVL6OrMe6UjqLosiE+EH9uxh2TQC0469GwF4tE014ugRaDDKKVWwFwZe0TBMlcyHKh5MD4ZxktWo/1hqUxIuhw=="], + + "@escape.tech/graphql-armor-max-aliases/@envelop/core": ["@envelop/core@5.0.2", "", { "dependencies": { "@envelop/types": "5.0.0", "tslib": "^2.5.0" } }, "sha512-tVL6OrMe6UjqLosiE+EH9uxh2TQC0469GwF4tE014ugRaDDKKVWwFwZe0TBMlcyHKh5MD4ZxktWo/1hqUxIuhw=="], + + "@escape.tech/graphql-armor-max-depth/@envelop/core": ["@envelop/core@5.0.2", "", { "dependencies": { "@envelop/types": "5.0.0", "tslib": "^2.5.0" } }, "sha512-tVL6OrMe6UjqLosiE+EH9uxh2TQC0469GwF4tE014ugRaDDKKVWwFwZe0TBMlcyHKh5MD4ZxktWo/1hqUxIuhw=="], + + "@escape.tech/graphql-armor-max-directives/@envelop/core": ["@envelop/core@5.0.2", "", { "dependencies": { "@envelop/types": "5.0.0", "tslib": "^2.5.0" } }, "sha512-tVL6OrMe6UjqLosiE+EH9uxh2TQC0469GwF4tE014ugRaDDKKVWwFwZe0TBMlcyHKh5MD4ZxktWo/1hqUxIuhw=="], + + "@escape.tech/graphql-armor-max-tokens/@envelop/core": ["@envelop/core@5.0.2", "", { "dependencies": { "@envelop/types": "5.0.0", "tslib": "^2.5.0" } }, "sha512-tVL6OrMe6UjqLosiE+EH9uxh2TQC0469GwF4tE014ugRaDDKKVWwFwZe0TBMlcyHKh5MD4ZxktWo/1hqUxIuhw=="], + "@isaacs/cliui/string-width": ["string-width@5.1.2", "", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="], "@isaacs/cliui/strip-ansi": ["strip-ansi@7.1.0", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ=="], "@isaacs/cliui/wrap-ansi": ["wrap-ansi@8.1.0", "", { "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", "strip-ansi": "^7.0.1" } }, "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ=="], - "bun-types/@types/node": ["@types/node@20.12.14", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-scnD59RpYD91xngrQQLGkE+6UrHUPzeKZWhhjBSa3HSkwjbQc38+q3RoIVEwxQGRw3M+j5hpNAM+lgV3cVormg=="], + "@types/interpret/@types/node": ["@types/node@22.10.4", "", { "dependencies": { "undici-types": "~6.20.0" } }, "sha512-99l6wv4HEzBQhvaU/UGoeBoCK61SCROQaCCGyQSgX2tEQ3rKkNZ2S7CEWnS/4s1LV+8ODdK21UeyR1fHP2mXug=="], + + "@types/ws/@types/node": ["@types/node@22.10.4", "", { "dependencies": { "undici-types": "~6.20.0" } }, "sha512-99l6wv4HEzBQhvaU/UGoeBoCK61SCROQaCCGyQSgX2tEQ3rKkNZ2S7CEWnS/4s1LV+8ODdK21UeyR1fHP2mXug=="], + + "@whatwg-node/node-fetch/@whatwg-node/disposablestack": ["@whatwg-node/disposablestack@0.0.6", "", { "dependencies": { "@whatwg-node/promise-helpers": "^1.0.0", "tslib": "^2.6.3" } }, "sha512-LOtTn+JgJvX8WfBVJtF08TGrdjuFzGJc4mkP8EdDI8ADbvO7kiexYep1o8dwnt0okb0jYclCDXF13xU7Ge4zSw=="], + + "@whatwg-node/server/@whatwg-node/disposablestack": ["@whatwg-node/disposablestack@0.0.6", "", { "dependencies": { "@whatwg-node/promise-helpers": "^1.0.0", "tslib": "^2.6.3" } }, "sha512-LOtTn+JgJvX8WfBVJtF08TGrdjuFzGJc4mkP8EdDI8ADbvO7kiexYep1o8dwnt0okb0jYclCDXF13xU7Ge4zSw=="], + + "cross-spawn/which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], "grafast/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], @@ -525,12 +553,20 @@ "graphile-export/@types/node": ["@types/node@20.12.14", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-scnD59RpYD91xngrQQLGkE+6UrHUPzeKZWhhjBSa3HSkwjbQc38+q3RoIVEwxQGRw3M+j5hpNAM+lgV3cVormg=="], + "graphql-yoga/@graphql-tools/executor": ["@graphql-tools/executor@1.4.7", "", { "dependencies": { "@graphql-tools/utils": "^10.8.6", "@graphql-typed-document-node/core": "^3.2.0", "@repeaterjs/repeater": "^3.0.4", "@whatwg-node/disposablestack": "^0.0.6", "@whatwg-node/promise-helpers": "^1.0.0", "tslib": "^2.4.0" }, "peerDependencies": { "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, "sha512-U0nK9jzJRP9/9Izf1+0Gggd6K6RNRsheFo1gC/VWzfnsr0qjcOSS9qTjY0OTC5iTPt4tQ+W5Zpw/uc7mebI6aA=="], + "http-proxy/eventemitter3": ["eventemitter3@4.0.7", "", {}, "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw=="], + "pg/pg-protocol": ["pg-protocol@1.8.0", "", {}, "sha512-jvuYlEkL03NRvOoyoRktBK7+qU5kOvlAwvmrH8sr3wbLrOdVWsRxQfz8mMy9sZFsqJ1hEWNfdWKI4SAmoL+j7g=="], + "pg/pg-types": ["pg-types@2.2.0", "", { "dependencies": { "pg-int8": "1.0.1", "postgres-array": "~2.0.0", "postgres-bytea": "~1.0.0", "postgres-date": "~1.0.4", "postgres-interval": "^1.1.0" } }, "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA=="], "postgraphile/@types/node": ["@types/node@20.12.14", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-scnD59RpYD91xngrQQLGkE+6UrHUPzeKZWhhjBSa3HSkwjbQc38+q3RoIVEwxQGRw3M+j5hpNAM+lgV3cVormg=="], + "postgraphile/@types/pg": ["@types/pg@8.11.10", "", { "dependencies": { "@types/node": "*", "pg-protocol": "*", "pg-types": "^4.0.1" } }, "sha512-LczQUW4dbOQzsH2RQ5qoeJ6qJPdrcM/DcMLoqWQkMLMsq83J5lAX3LXjdkWdpscFy67JSOWDnh7Ny/sPFykmkg=="], + + "postgraphile/pg": ["pg@8.13.1", "", { "dependencies": { "pg-connection-string": "^2.7.0", "pg-pool": "^3.7.0", "pg-protocol": "^1.7.0", "pg-types": "^2.1.0", "pgpass": "1.x" }, "optionalDependencies": { "pg-cloudflare": "^1.1.1" }, "peerDependencies": { "pg-native": ">=3.0.1" }, "optionalPeers": ["pg-native"] }, "sha512-OUir1A0rPNZlX//c7ksiu7crsGZTKSOXJPgtNiHGIlC9H0lO+NC6ZDYksSgBYY/thSWhnSRBv8w1lieNNGATNQ=="], + "@dataplan/pg/@types/node/undici-types": ["undici-types@5.26.5", "", {}, "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="], "@esbuild-kit/core-utils/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.18.20", "", { "os": "android", "cpu": "arm" }, "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw=="], @@ -577,13 +613,25 @@ "@esbuild-kit/core-utils/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.18.20", "", { "os": "win32", "cpu": "x64" }, "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ=="], + "@escape.tech/graphql-armor-block-field-suggestions/@envelop/core/@envelop/types": ["@envelop/types@5.0.0", "", { "dependencies": { "tslib": "^2.5.0" } }, "sha512-IPjmgSc4KpQRlO4qbEDnBEixvtb06WDmjKfi/7fkZaryh5HuOmTtixe1EupQI5XfXO8joc3d27uUZ0QdC++euA=="], + + "@escape.tech/graphql-armor-cost-limit/@envelop/core/@envelop/types": ["@envelop/types@5.0.0", "", { "dependencies": { "tslib": "^2.5.0" } }, "sha512-IPjmgSc4KpQRlO4qbEDnBEixvtb06WDmjKfi/7fkZaryh5HuOmTtixe1EupQI5XfXO8joc3d27uUZ0QdC++euA=="], + + "@escape.tech/graphql-armor-max-aliases/@envelop/core/@envelop/types": ["@envelop/types@5.0.0", "", { "dependencies": { "tslib": "^2.5.0" } }, "sha512-IPjmgSc4KpQRlO4qbEDnBEixvtb06WDmjKfi/7fkZaryh5HuOmTtixe1EupQI5XfXO8joc3d27uUZ0QdC++euA=="], + + "@escape.tech/graphql-armor-max-depth/@envelop/core/@envelop/types": ["@envelop/types@5.0.0", "", { "dependencies": { "tslib": "^2.5.0" } }, "sha512-IPjmgSc4KpQRlO4qbEDnBEixvtb06WDmjKfi/7fkZaryh5HuOmTtixe1EupQI5XfXO8joc3d27uUZ0QdC++euA=="], + + "@escape.tech/graphql-armor-max-directives/@envelop/core/@envelop/types": ["@envelop/types@5.0.0", "", { "dependencies": { "tslib": "^2.5.0" } }, "sha512-IPjmgSc4KpQRlO4qbEDnBEixvtb06WDmjKfi/7fkZaryh5HuOmTtixe1EupQI5XfXO8joc3d27uUZ0QdC++euA=="], + + "@escape.tech/graphql-armor-max-tokens/@envelop/core/@envelop/types": ["@envelop/types@5.0.0", "", { "dependencies": { "tslib": "^2.5.0" } }, "sha512-IPjmgSc4KpQRlO4qbEDnBEixvtb06WDmjKfi/7fkZaryh5HuOmTtixe1EupQI5XfXO8joc3d27uUZ0QdC++euA=="], + "@isaacs/cliui/string-width/emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="], "@isaacs/cliui/strip-ansi/ansi-regex": ["ansi-regex@6.1.0", "", {}, "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA=="], "@isaacs/cliui/wrap-ansi/ansi-styles": ["ansi-styles@6.2.1", "", {}, "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug=="], - "bun-types/@types/node/undici-types": ["undici-types@5.26.5", "", {}, "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="], + "cross-spawn/which/isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], "graphile-build-pg/@types/node/undici-types": ["undici-types@5.26.5", "", {}, "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="], @@ -593,6 +641,10 @@ "graphile-export/@types/node/undici-types": ["undici-types@5.26.5", "", {}, "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="], + "graphql-yoga/@graphql-tools/executor/@graphql-tools/utils": ["@graphql-tools/utils@10.8.6", "", { "dependencies": { "@graphql-typed-document-node/core": "^3.1.1", "@whatwg-node/promise-helpers": "^1.0.0", "cross-inspect": "1.0.1", "dset": "^3.1.4", "tslib": "^2.4.0" }, "peerDependencies": { "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, "sha512-Alc9Vyg0oOsGhRapfL3xvqh1zV8nKoFUdtLhXX7Ki4nClaIJXckrA86j+uxEuG3ic6j4jlM1nvcWXRn/71AVLQ=="], + + "graphql-yoga/@graphql-tools/executor/@whatwg-node/disposablestack": ["@whatwg-node/disposablestack@0.0.6", "", { "dependencies": { "@whatwg-node/promise-helpers": "^1.0.0", "tslib": "^2.6.3" } }, "sha512-LOtTn+JgJvX8WfBVJtF08TGrdjuFzGJc4mkP8EdDI8ADbvO7kiexYep1o8dwnt0okb0jYclCDXF13xU7Ge4zSw=="], + "pg/pg-types/postgres-array": ["postgres-array@2.0.0", "", {}, "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA=="], "pg/pg-types/postgres-bytea": ["postgres-bytea@1.0.0", "", {}, "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w=="], @@ -602,5 +654,19 @@ "pg/pg-types/postgres-interval": ["postgres-interval@1.2.0", "", { "dependencies": { "xtend": "^4.0.0" } }, "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ=="], "postgraphile/@types/node/undici-types": ["undici-types@5.26.5", "", {}, "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="], + + "postgraphile/@types/pg/@types/node": ["@types/node@22.10.4", "", { "dependencies": { "undici-types": "~6.20.0" } }, "sha512-99l6wv4HEzBQhvaU/UGoeBoCK61SCROQaCCGyQSgX2tEQ3rKkNZ2S7CEWnS/4s1LV+8ODdK21UeyR1fHP2mXug=="], + + "postgraphile/pg/pg-pool": ["pg-pool@3.7.0", "", { "peerDependencies": { "pg": ">=8.0" } }, "sha512-ZOBQForurqh4zZWjrgSwwAtzJ7QiRX0ovFkZr2klsen3Nm0aoh33Ls0fzfv3imeH/nw/O27cjdz5kzYJfeGp/g=="], + + "postgraphile/pg/pg-types": ["pg-types@2.2.0", "", { "dependencies": { "pg-int8": "1.0.1", "postgres-array": "~2.0.0", "postgres-bytea": "~1.0.0", "postgres-date": "~1.0.4", "postgres-interval": "^1.1.0" } }, "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA=="], + + "postgraphile/pg/pg-types/postgres-array": ["postgres-array@2.0.0", "", {}, "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA=="], + + "postgraphile/pg/pg-types/postgres-bytea": ["postgres-bytea@1.0.0", "", {}, "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w=="], + + "postgraphile/pg/pg-types/postgres-date": ["postgres-date@1.0.7", "", {}, "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q=="], + + "postgraphile/pg/pg-types/postgres-interval": ["postgres-interval@1.2.0", "", { "dependencies": { "xtend": "^4.0.0" } }, "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ=="], } } diff --git a/drizzle.config.ts b/drizzle.config.ts index 0ffc3d4..5305c19 100644 --- a/drizzle.config.ts +++ b/drizzle.config.ts @@ -1,6 +1,6 @@ import { defineConfig } from "drizzle-kit"; -import { DATABASE_URL } from "./src/lib/config/env"; +import { DATABASE_URL } from "./src/lib/config/env.config"; export default defineConfig({ out: "./src/lib/drizzle/migrations", diff --git a/graphile.config.ts b/graphile.config.ts index 68e527e..5b21dbf 100644 --- a/graphile.config.ts +++ b/graphile.config.ts @@ -4,7 +4,7 @@ import { PostGraphileConnectionFilterPreset } from "postgraphile-plugin-connecti import { makePgService } from "postgraphile/adaptors/pg"; import { PostGraphileAmberPreset } from "postgraphile/presets/amber"; -import { DATABASE_URL, isProdEnv } from "./src/lib/config/env"; +import { DATABASE_URL, isProdEnv } from "./src/lib/config/env.config"; import { CommentRBACPlugin, DownvoteRBACPlugin, diff --git a/package.json b/package.json index 7cfadb4..1941cc0 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "scripts": { "dev": "GRAPHILE_ENV=development NODE_ENV=development bun run --hot src/server.ts", "build": "bun build --target node --outdir build src/server.ts", - "start": "GRAPHILE_ENV=production NODE_ENV=production bun run build/server.js", + "start": "GRAPHILE_ENV=production NODE_ENV=production bun db:migrate && GRAPHILE_ENV=production NODE_ENV=production bun run build/server.js", "lint": "biome lint src", "format": "biome format --write src", "db:check": "bun --env-file .env.local drizzle-kit check", @@ -22,33 +22,36 @@ }, "devDependencies": { "@biomejs/biome": "^1.9.4", - "@faker-js/faker": "^9.1.0", - "@types/bun": "^1.1.12", - "@types/node": "^22.8.6", - "@types/pg": "^8.11.10", - "drizzle-kit": "^0.30.1", - "husky": "^9.1.6", - "replace-in-file": "^8.2.0", - "typescript": "^5.6.3" + "@faker-js/faker": "^9.6.0", + "@types/bun": "^1.2.8", + "@types/node": "^22.13.14", + "@types/pg": "^8.11.11", + "drizzle-kit": "^0.30.6", + "husky": "^9.1.7", + "replace-in-file": "^8.3.0", + "typescript": "^5.8.2" }, "dependencies": { - "@envelop/generic-auth": "^8.0.1", + "@envelop/generic-auth": "^9.1.3", "@envelop/parser-cache": "^8.1.3", "@envelop/validation-cache": "^8.1.3", "@escape.tech/graphql-armor": "^3.1.2", "@graphile/pg-aggregates": "0.2.0-beta.7", "@graphile/simplify-inflection": "8.0.0-beta.5", "dayjs": "^1.11.13", - "drizzle-orm": "^0.38.2", - "drizzle-seed": "^0.3.0", + "drizzle-orm": "^0.41.0", + "drizzle-seed": "^0.3.1", "graphile-export": "0.0.2-beta.24", - "graphql": "^16.9.0", - "graphql-yoga": "^5.8.0", - "hono": "^4.6.8", - "jose": "^5.9.6", - "pg": "^8.13.1", + "graphql": "^16.10.0", + "graphql-yoga": "^5.13.2", + "hono": "^4.7.5", + "jose": "^6.0.10", + "pg": "^8.14.1", "postgraphile": "5.0.0-beta.37", "postgraphile-plugin-connection-filter": "3.0.0-beta.7" }, - "trustedDependencies": ["@biomejs/biome", "esbuild"] + "trustedDependencies": [ + "@biomejs/biome", + "esbuild" + ] } diff --git a/src/generated/graphql/schema.executable.ts b/src/generated/graphql/schema.executable.ts index e7e4ae5..326c0c5 100644 --- a/src/generated/graphql/schema.executable.ts +++ b/src/generated/graphql/schema.executable.ts @@ -148,7 +148,7 @@ const spec_downvote = { }), description: undefined, extensions: { - oid: "62509", + oid: "64252", isTableLike: true, pg: { serviceName: "main", @@ -228,7 +228,7 @@ const spec_invitation = { }), description: undefined, extensions: { - oid: "62609", + oid: "64351", isTableLike: true, pg: { serviceName: "main", @@ -308,7 +308,7 @@ const spec_upvote = { }), description: undefined, extensions: { - oid: "62422", + oid: "64165", isTableLike: true, pg: { serviceName: "main", @@ -400,7 +400,7 @@ const spec_comment = { }), description: undefined, extensions: { - oid: "62489", + oid: "64232", isTableLike: true, pg: { serviceName: "main", @@ -469,7 +469,7 @@ const spec_organization = { description: undefined, codec: TYPES.text, notNull: true, - hasDefault: true, + hasDefault: false, extensions: { tags: {}, canSelect: true, @@ -480,7 +480,7 @@ const spec_organization = { }), description: undefined, extensions: { - oid: "62384", + oid: "64127", isTableLike: true, pg: { serviceName: "main", @@ -596,7 +596,7 @@ const spec_project = { }), description: undefined, extensions: { - oid: "62408", + oid: "64151", isTableLike: true, pg: { serviceName: "main", @@ -724,7 +724,7 @@ const spec_post = { }), description: undefined, extensions: { - oid: "62398", + oid: "64141", isTableLike: true, pg: { serviceName: "main", @@ -742,7 +742,7 @@ const roleCodec = enumCodec({ values: ["owner", "admin", "member"], description: undefined, extensions: { - oid: "62528", + oid: "64271", pg: { serviceName: "main", schemaName: "public", @@ -819,7 +819,7 @@ const spec_member = { }), description: undefined, extensions: { - oid: "62444", + oid: "64187", isTableLike: true, pg: { serviceName: "main", @@ -935,7 +935,7 @@ const spec_postStatus = { }), description: undefined, extensions: { - oid: "62583", + oid: "64325", isTableLike: true, pg: { serviceName: "main", @@ -1051,7 +1051,7 @@ const spec_user = { }), description: undefined, extensions: { - oid: "62432", + oid: "64175", isTableLike: true, pg: { serviceName: "main", @@ -10739,7 +10739,7 @@ input OrganizationInput { name: String! createdAt: Datetime updatedAt: Datetime - slug: String + slug: String! } """The output of our create \`Project\` mutation.""" diff --git a/src/lib/config/app.config.ts b/src/lib/config/app.config.ts new file mode 100644 index 0000000..b7780e1 --- /dev/null +++ b/src/lib/config/app.config.ts @@ -0,0 +1,9 @@ +/** + * Application configuration. + */ +const app = { + name: "Backfeed", + url: "https://backfeed.omni.dev", +}; + +export default app; diff --git a/src/lib/config/app.ts b/src/lib/config/app.ts deleted file mode 100644 index 7ff3f06..0000000 --- a/src/lib/config/app.ts +++ /dev/null @@ -1,4 +0,0 @@ -export const app = { - name: "Backfeed", - url: "https://backfeed.omni.dev", -}; diff --git a/src/lib/config/env.ts b/src/lib/config/env.config.ts similarity index 94% rename from src/lib/config/env.ts rename to src/lib/config/env.config.ts index 3274d30..2264ad8 100644 --- a/src/lib/config/env.ts +++ b/src/lib/config/env.config.ts @@ -7,7 +7,7 @@ export const { // https://stackoverflow.com/a/68578294 HOST = "0.0.0.0", DATABASE_URL, - AUTH_JWKS_URL, + AUTH_BASE_URL, } = process.env; export const isDevEnv = NODE_ENV === "development"; diff --git a/src/lib/db/client.ts b/src/lib/db/client.ts index 5638946..3d22223 100644 --- a/src/lib/db/client.ts +++ b/src/lib/db/client.ts @@ -1,6 +1,6 @@ import { Client } from "pg"; -import { DATABASE_URL } from "lib/config/env"; +import { DATABASE_URL } from "lib/config/env.config"; /** * Postgres database client. diff --git a/src/lib/db/pool.ts b/src/lib/db/pool.ts index dc8fcda..fd669a8 100644 --- a/src/lib/db/pool.ts +++ b/src/lib/db/pool.ts @@ -1,6 +1,6 @@ import { Pool } from "pg"; -import { DATABASE_URL } from "lib/config/env"; +import { DATABASE_URL } from "lib/config/env.config"; /** * Postgres database pool. diff --git a/src/lib/drizzle/schema/comment.table.ts b/src/lib/drizzle/schema/comment.table.ts index f2ded00..5b9c76f 100644 --- a/src/lib/drizzle/schema/comment.table.ts +++ b/src/lib/drizzle/schema/comment.table.ts @@ -31,7 +31,7 @@ export const comments = pgTable( uniqueIndex().on(table.id), index().on(table.postId), index().on(table.userId), - ] + ], ); /** diff --git a/src/lib/drizzle/schema/downvote.table.ts b/src/lib/drizzle/schema/downvote.table.ts index 54b080e..ec51892 100644 --- a/src/lib/drizzle/schema/downvote.table.ts +++ b/src/lib/drizzle/schema/downvote.table.ts @@ -31,7 +31,7 @@ export const downvotes = pgTable( uniqueIndex().on(table.id), index().on(table.postId), index().on(table.userId), - ] + ], ); /** diff --git a/src/lib/drizzle/schema/invitation.table.ts b/src/lib/drizzle/schema/invitation.table.ts index b03815b..f445741 100644 --- a/src/lib/drizzle/schema/invitation.table.ts +++ b/src/lib/drizzle/schema/invitation.table.ts @@ -23,7 +23,7 @@ export const invitations = pgTable( uniqueIndex().on(table.id), uniqueIndex().on(table.email), index().on(table.organizationId), - ] + ], ); /** diff --git a/src/lib/drizzle/schema/member.table.ts b/src/lib/drizzle/schema/member.table.ts index 7d8ddb9..13686a4 100644 --- a/src/lib/drizzle/schema/member.table.ts +++ b/src/lib/drizzle/schema/member.table.ts @@ -43,7 +43,7 @@ export const members = pgTable( uniqueIndex().on(table.id), index().on(table.userId), index().on(table.organizationId), - ] + ], ); /** diff --git a/src/lib/drizzle/schema/organization.table.ts b/src/lib/drizzle/schema/organization.table.ts index cc3bce3..0ed6a77 100644 --- a/src/lib/drizzle/schema/organization.table.ts +++ b/src/lib/drizzle/schema/organization.table.ts @@ -16,7 +16,7 @@ export const organizations = pgTable( createdAt: defaultDate(), updatedAt: defaultDate(), }, - (table) => [uniqueIndex().on(table.id), uniqueIndex().on(table.slug)] + (table) => [uniqueIndex().on(table.id), uniqueIndex().on(table.slug)], ); /** diff --git a/src/lib/drizzle/schema/post.table.ts b/src/lib/drizzle/schema/post.table.ts index 8e0efd5..447b7ac 100644 --- a/src/lib/drizzle/schema/post.table.ts +++ b/src/lib/drizzle/schema/post.table.ts @@ -38,7 +38,7 @@ export const posts = pgTable( index().on(table.projectId), index().on(table.userId), index().on(table.statusId), - ] + ], ); /** diff --git a/src/lib/drizzle/schema/postStatus.table.ts b/src/lib/drizzle/schema/postStatus.table.ts index 9f1ae26..acb797e 100644 --- a/src/lib/drizzle/schema/postStatus.table.ts +++ b/src/lib/drizzle/schema/postStatus.table.ts @@ -37,7 +37,7 @@ export const postStatuses = pgTable( uniqueIndex("post_status_unique_id_index").on(table.id), uniqueIndex().on(table.status, table.projectId), index().on(table.projectId), - ] + ], ); /** diff --git a/src/lib/drizzle/schema/project.table.ts b/src/lib/drizzle/schema/project.table.ts index fa0a651..b10e341 100644 --- a/src/lib/drizzle/schema/project.table.ts +++ b/src/lib/drizzle/schema/project.table.ts @@ -35,7 +35,7 @@ export const projects = pgTable( unique().on(table.slug, table.organizationId), uniqueIndex().on(table.id), index().on(table.organizationId), - ] + ], ); /** diff --git a/src/lib/drizzle/schema/upvote.table.ts b/src/lib/drizzle/schema/upvote.table.ts index 053099f..dcbca93 100644 --- a/src/lib/drizzle/schema/upvote.table.ts +++ b/src/lib/drizzle/schema/upvote.table.ts @@ -31,7 +31,7 @@ export const upvotes = pgTable( uniqueIndex().on(table.id), index().on(table.postId), index().on(table.userId), - ] + ], ); /** diff --git a/src/lib/drizzle/schema/user.table.ts b/src/lib/drizzle/schema/user.table.ts index 8bc4909..1fd0158 100644 --- a/src/lib/drizzle/schema/user.table.ts +++ b/src/lib/drizzle/schema/user.table.ts @@ -20,7 +20,7 @@ export const users = pgTable( createdAt: defaultDate(), updatedAt: defaultDate(), }, - (table) => [uniqueIndex().on(table.id), uniqueIndex().on(table.hidraId)] + (table) => [uniqueIndex().on(table.id), uniqueIndex().on(table.hidraId)], ); /** diff --git a/src/lib/plugins/envelop/index.ts b/src/lib/plugins/envelop/index.ts index 84d3011..f1a46bb 100644 --- a/src/lib/plugins/envelop/index.ts +++ b/src/lib/plugins/envelop/index.ts @@ -1 +1 @@ -export { default as useAuth } from "./useAuth"; +export { default as useAuth } from "./useAuth.plugin"; diff --git a/src/lib/plugins/envelop/useAuth.plugin.ts b/src/lib/plugins/envelop/useAuth.plugin.ts new file mode 100644 index 0000000..61d8f29 --- /dev/null +++ b/src/lib/plugins/envelop/useAuth.plugin.ts @@ -0,0 +1,81 @@ +import { useGenericAuth } from "@envelop/generic-auth"; +import * as jose from "jose"; + +import { AUTH_BASE_URL } from "lib/config/env.config"; +import { users } from "lib/drizzle/schema"; + +import type { ResolveUserFn } from "@envelop/generic-auth"; +import type { InsertUser, SelectUser } from "lib/drizzle/schema"; +import type { GraphQLContext } from "lib/graphql"; + +// TODO research best practices for all of this file (token validation, caching, etc.). Validate access token (introspection endpoint)? Cache userinfo output? etc. (https://linear.app/omnidev/issue/OMNI-302/increase-security-of-useauth-plugin) + +/** + * Validate user session and resolve user if successful. + * @see https://the-guild.dev/graphql/envelop/plugins/use-generic-auth#getting-started + */ +const resolveUser: ResolveUserFn = async ( + context, +) => { + try { + const accessToken = context.request.headers + .get("authorization") + ?.split("Bearer ")[1]; + + if (!accessToken) throw new Error("Invalid or missing access token"); + + // TODO validate access token (introspection endpoint?) here? + + // TODO cache so this doesn't occur on every request. Research best practices + const userInfo = await fetch(`${AUTH_BASE_URL}/oauth2/userinfo`, { + headers: { + Authorization: `Bearer ${accessToken}`, + }, + }); + + if (!userInfo.ok) throw new Error("Invalid access token or request failed"); + + const idToken: jose.JWTPayload = await userInfo.json(); + + // TODO validate token, currently major security flaw (pending BA OIDC JWKS support: https://www.better-auth.com/docs/plugins/oidc-provider#jwks-endpoint-not-fully-implemented) (https://linear.app/omnidev/issue/OMNI-302/validate-id-token-with-jwks) + // const jwks = jose.createRemoteJWKSet(new URL(`${AUTH_BASE_URL}/jwks`)); + // const { payload } = await jose.jwtVerify(JSON.stringify(idToken), jwks); + // if (!payload) throw new Error("Failed to verify token"); + + const insertedUser: InsertUser = { + hidraId: idToken.sub!, + username: idToken.preferred_username as string, + firstName: idToken.given_name as string, + lastName: idToken.family_name as string, + email: idToken.email as string, + }; + + const { hidraId, ...rest } = insertedUser; + + const [user] = await context.db + .insert(users) + .values(insertedUser) + .onConflictDoUpdate({ + target: users.hidraId, + set: { + ...rest, + updatedAt: new Date().toISOString(), + }, + }) + .returning(); + + return user; + } catch (err) { + console.error(err); + + return null; + } +}; + +const useAuth = () => + useGenericAuth({ + resolveUserFn: resolveUser, + mode: "protect-all", + }); + +export default useAuth; diff --git a/src/lib/plugins/envelop/useAuth.ts b/src/lib/plugins/envelop/useAuth.ts deleted file mode 100644 index 79b98b9..0000000 --- a/src/lib/plugins/envelop/useAuth.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { useGenericAuth } from "@envelop/generic-auth"; -import * as jose from "jose"; - -import { AUTH_JWKS_URL } from "lib/config/env"; -import { users } from "lib/drizzle/schema"; - -import type { ResolveUserFn } from "@envelop/generic-auth"; -import type { InsertUser, SelectUser } from "lib/drizzle/schema"; -import type { GraphQLContext } from "lib/graphql"; - -/** - * Validate user session and resolve user if successful. - * @see https://the-guild.dev/graphql/envelop/plugins/use-generic-auth#getting-started - */ -const resolveUser: ResolveUserFn = async ( - context -) => { - try { - const sessionToken = context.request.headers - .get("authorization") - ?.split("Bearer ")[1]; - - if (!sessionToken) throw new Error("Invalid or missing session token"); - - const jwks = jose.createRemoteJWKSet(new URL(AUTH_JWKS_URL!)); - - const { payload } = await jose.jwtVerify(sessionToken, jwks); - - if (!payload) throw new Error("Invalid or missing session token"); - - const insertedUser: InsertUser = { - hidraId: payload.sub!, - username: payload.preferred_username as string, - firstName: payload.given_name as string, - lastName: payload.family_name as string, - email: payload.email as string, - }; - - const { hidraId, ...rest } = insertedUser; - - const [user] = await context.db - .insert(users) - .values(insertedUser) - .onConflictDoUpdate({ - target: users.hidraId, - set: { - ...rest, - updatedAt: new Date().toISOString(), - }, - }) - .returning(); - - return user; - } catch (err) { - console.error(err); - - return null; - } -}; - -const useAuth = () => - useGenericAuth({ - resolveUserFn: resolveUser, - mode: "protect-all", - }); - -export default useAuth; diff --git a/src/lib/plugins/postgraphile/CommentRBACPlugin.ts b/src/lib/plugins/postgraphile/CommentRBAC.plugin.ts similarity index 96% rename from src/lib/plugins/postgraphile/CommentRBACPlugin.ts rename to src/lib/plugins/postgraphile/CommentRBAC.plugin.ts index 4a7a76b..2f93299 100644 --- a/src/lib/plugins/postgraphile/CommentRBACPlugin.ts +++ b/src/lib/plugins/postgraphile/CommentRBAC.plugin.ts @@ -43,8 +43,8 @@ const validatePermissions = (propName: string) => .where( and( eq(members.userId, currentUser.id), - eq(members.organizationId, comment.organizationId) - ) + eq(members.organizationId, comment.organizationId), + ), ); // Allow admins and owners to edit and delete comments @@ -52,12 +52,12 @@ const validatePermissions = (propName: string) => throw new Error("Insufficient permissions"); } } - } + }, ); return plan(); }, - [and, eq, dbSchema, context, sideEffect, propName] + [and, eq, dbSchema, context, sideEffect, propName], ); /** diff --git a/src/lib/plugins/postgraphile/DownvoteRBACPlugin.ts b/src/lib/plugins/postgraphile/DownvoteRBAC.plugin.ts similarity index 96% rename from src/lib/plugins/postgraphile/DownvoteRBACPlugin.ts rename to src/lib/plugins/postgraphile/DownvoteRBAC.plugin.ts index de3aab2..a2ccaf9 100644 --- a/src/lib/plugins/postgraphile/DownvoteRBACPlugin.ts +++ b/src/lib/plugins/postgraphile/DownvoteRBAC.plugin.ts @@ -35,12 +35,12 @@ const validatePermissions = (propName: string) => if (currentUser.id !== downvote.userId) { throw new Error("Insufficient permissions"); } - } + }, ); return plan(); }, - [and, eq, dbSchema, context, sideEffect, propName] + [and, eq, dbSchema, context, sideEffect, propName], ); /** diff --git a/src/lib/plugins/postgraphile/InvitationRBACPlugin.ts b/src/lib/plugins/postgraphile/InvitationRBACPlugin.ts index c6a4fbd..9012e4b 100644 --- a/src/lib/plugins/postgraphile/InvitationRBACPlugin.ts +++ b/src/lib/plugins/postgraphile/InvitationRBACPlugin.ts @@ -12,7 +12,7 @@ type MutationScope = "create" | "delete"; const validateInvitationPermissions = ( propName: string, - scope: MutationScope + scope: MutationScope, ) => EXPORTABLE( (and, eq, dbSchema, context, sideEffect, propName, scope) => @@ -49,8 +49,8 @@ const validateInvitationPermissions = ( .where( and( eq(members.userId, currentUser.id), - eq(members.organizationId, invitation.organizationId) - ) + eq(members.organizationId, invitation.organizationId), + ), ); if (scope === "create") { @@ -60,7 +60,7 @@ const validateInvitationPermissions = ( (userRole.role !== "owner" && userRole.role !== "admin") ) { throw new Error( - "Only organization owners or admins can send invitations" + "Only organization owners or admins can send invitations", ); } @@ -76,13 +76,13 @@ const validateInvitationPermissions = ( .where( and( eq(invitations.email, invitation.email), - eq(invitations.organizationId, invitation.organizationId) - ) + eq(invitations.organizationId, invitation.organizationId), + ), ); if (existingInvitation) { throw new Error( - "An invitation has already been sent to this email." + "An invitation has already been sent to this email.", ); } @@ -99,13 +99,13 @@ const validateInvitationPermissions = ( .where( and( eq(members.userId, existingUser.id), - eq(members.organizationId, invitation.organizationId) - ) + eq(members.organizationId, invitation.organizationId), + ), ); if (existingMember) { throw new Error( - "User is already a member of the organization." + "User is already a member of the organization.", ); } } @@ -118,16 +118,16 @@ const validateInvitationPermissions = ( // Only allow owner or recipient to delete if (!isOwner || !isRecipient) { throw new Error( - "Only the recipient or owner can delete the invitation" + "Only the recipient or owner can delete the invitation", ); } } - } + }, ); return plan(); }, - [and, eq, dbSchema, context, sideEffect, propName, scope] + [and, eq, dbSchema, context, sideEffect, propName, scope], ); /** diff --git a/src/lib/plugins/postgraphile/MemberRBACPlugin.ts b/src/lib/plugins/postgraphile/MemberRBAC.plugin.ts similarity index 95% rename from src/lib/plugins/postgraphile/MemberRBACPlugin.ts rename to src/lib/plugins/postgraphile/MemberRBAC.plugin.ts index 4ea52b2..9096447 100644 --- a/src/lib/plugins/postgraphile/MemberRBACPlugin.ts +++ b/src/lib/plugins/postgraphile/MemberRBAC.plugin.ts @@ -41,7 +41,7 @@ const validatePermissions = (propName: string, scope: MutationScope) => if (organizationUsers.length) { const userRole = organizationUsers.find( - (user) => user.userId === currentUser.id + (user) => user.userId === currentUser.id, )?.role; // Allow users to join an organization as a member @@ -69,8 +69,8 @@ const validatePermissions = (propName: string, scope: MutationScope) => .where( and( eq(members.userId, currentUser.id), - eq(members.organizationId, member.organizationId) - ) + eq(members.organizationId, member.organizationId), + ), ); // Only allow owners to update roles and/or kick other members from the organization @@ -84,12 +84,12 @@ const validatePermissions = (propName: string, scope: MutationScope) => } } } - } + }, ); return plan(); }, - [and, eq, dbSchema, context, sideEffect, propName, scope] + [and, eq, dbSchema, context, sideEffect, propName, scope], ); /** diff --git a/src/lib/plugins/postgraphile/OrganizationRBACPlugin.ts b/src/lib/plugins/postgraphile/OrganizationRBAC.plugin.ts similarity index 95% rename from src/lib/plugins/postgraphile/OrganizationRBACPlugin.ts rename to src/lib/plugins/postgraphile/OrganizationRBAC.plugin.ts index e2fefa1..4bea288 100644 --- a/src/lib/plugins/postgraphile/OrganizationRBACPlugin.ts +++ b/src/lib/plugins/postgraphile/OrganizationRBAC.plugin.ts @@ -34,8 +34,8 @@ const validatePermissions = (propName: string, scope: MutationScope) => .where( and( eq(members.userId, currentUser.id), - eq(members.organizationId, organizationId as string) - ) + eq(members.organizationId, organizationId as string), + ), ); // Only allow owners to delete organizations @@ -50,12 +50,12 @@ const validatePermissions = (propName: string, scope: MutationScope) => ) { throw new Error("Insufficient permissions"); } - } + }, ); return plan(); }, - [and, eq, dbSchema, context, sideEffect, propName, scope] + [and, eq, dbSchema, context, sideEffect, propName, scope], ); /** diff --git a/src/lib/plugins/postgraphile/PostRBACPlugin.ts b/src/lib/plugins/postgraphile/PostRBAC.plugin.ts similarity index 96% rename from src/lib/plugins/postgraphile/PostRBACPlugin.ts rename to src/lib/plugins/postgraphile/PostRBAC.plugin.ts index a877283..513b89b 100644 --- a/src/lib/plugins/postgraphile/PostRBACPlugin.ts +++ b/src/lib/plugins/postgraphile/PostRBAC.plugin.ts @@ -44,8 +44,8 @@ const validatePermissions = (propName: string) => .where( and( eq(members.userId, currentUser.id), - eq(members.organizationId, post.organizationId) - ) + eq(members.organizationId, post.organizationId), + ), ); // Allow admins and owners to update and delete posts @@ -53,12 +53,12 @@ const validatePermissions = (propName: string) => throw new Error("Insufficient permissions"); } } - } + }, ); return plan(); }, - [and, eq, dbSchema, context, sideEffect, propName] + [and, eq, dbSchema, context, sideEffect, propName], ); /** diff --git a/src/lib/plugins/postgraphile/PostStatusRBACPlugin.ts b/src/lib/plugins/postgraphile/PostStatusRBAC.plugin.ts similarity index 96% rename from src/lib/plugins/postgraphile/PostStatusRBACPlugin.ts rename to src/lib/plugins/postgraphile/PostStatusRBAC.plugin.ts index 38263ad..5300a7d 100644 --- a/src/lib/plugins/postgraphile/PostStatusRBACPlugin.ts +++ b/src/lib/plugins/postgraphile/PostStatusRBAC.plugin.ts @@ -55,20 +55,20 @@ const validatePermissions = (propName: string, scope: MutationScope) => .where( and( eq(members.userId, currentUser.id), - eq(members.organizationId, project.organizationId) - ) + eq(members.organizationId, project.organizationId), + ), ); // Allow admins and owners to create, update and delete post statuses if (!userRole || userRole.role === "member") { throw new Error("Insufficient permissions"); } - } + }, ); return plan(); }, - [and, eq, dbSchema, context, sideEffect, propName, scope] + [and, eq, dbSchema, context, sideEffect, propName, scope], ); /** diff --git a/src/lib/plugins/postgraphile/PrimaryKeyMutationsOnlyPlugin.ts b/src/lib/plugins/postgraphile/PrimaryKeyMutationsOnly.plugin.ts similarity index 100% rename from src/lib/plugins/postgraphile/PrimaryKeyMutationsOnlyPlugin.ts rename to src/lib/plugins/postgraphile/PrimaryKeyMutationsOnly.plugin.ts diff --git a/src/lib/plugins/postgraphile/ProjectRBACPlugin.ts b/src/lib/plugins/postgraphile/ProjectRBAC.plugin.ts similarity index 94% rename from src/lib/plugins/postgraphile/ProjectRBACPlugin.ts rename to src/lib/plugins/postgraphile/ProjectRBAC.plugin.ts index f7bbf70..4cbbf88 100644 --- a/src/lib/plugins/postgraphile/ProjectRBACPlugin.ts +++ b/src/lib/plugins/postgraphile/ProjectRBAC.plugin.ts @@ -48,20 +48,20 @@ const validatePermissions = (propName: string, scope: MutationScope) => .where( and( eq(members.userId, currentUser.id), - eq(members.organizationId, organizationId) - ) + eq(members.organizationId, organizationId), + ), ); // Only allow owners and admins to create, update, and delete projects if (!userRole || userRole.role === "member") { throw new Error("Insufficient permissions"); } - } + }, ); return plan(); }, - [and, eq, dbSchema, context, sideEffect, propName, scope] + [and, eq, dbSchema, context, sideEffect, propName, scope], ); /** diff --git a/src/lib/plugins/postgraphile/UpvoteRBACPlugin.ts b/src/lib/plugins/postgraphile/UpvoteRBAC.plugin.ts similarity index 96% rename from src/lib/plugins/postgraphile/UpvoteRBACPlugin.ts rename to src/lib/plugins/postgraphile/UpvoteRBAC.plugin.ts index e378908..7997ea8 100644 --- a/src/lib/plugins/postgraphile/UpvoteRBACPlugin.ts +++ b/src/lib/plugins/postgraphile/UpvoteRBAC.plugin.ts @@ -35,12 +35,12 @@ const validatePermissions = (propName: string) => if (currentUser.id !== upvote.userId) { throw new Error("Insufficient permissions"); } - } + }, ); return plan(); }, - [and, eq, dbSchema, context, sideEffect, propName] + [and, eq, dbSchema, context, sideEffect, propName], ); /** diff --git a/src/lib/plugins/postgraphile/UserRBACPlugin.ts b/src/lib/plugins/postgraphile/UserRBAC.plugin.ts similarity index 97% rename from src/lib/plugins/postgraphile/UserRBACPlugin.ts rename to src/lib/plugins/postgraphile/UserRBAC.plugin.ts index ec8be29..0defd77 100644 --- a/src/lib/plugins/postgraphile/UserRBACPlugin.ts +++ b/src/lib/plugins/postgraphile/UserRBAC.plugin.ts @@ -27,7 +27,7 @@ const validatePermissions = (propName: string) => return plan(); }, - [context, sideEffect, propName] + [context, sideEffect, propName], ); /** diff --git a/src/lib/plugins/postgraphile/index.ts b/src/lib/plugins/postgraphile/index.ts index b323175..66f186a 100644 --- a/src/lib/plugins/postgraphile/index.ts +++ b/src/lib/plugins/postgraphile/index.ts @@ -1,10 +1,10 @@ -export { default as CommentRBACPlugin } from "./CommentRBACPlugin"; -export { default as DownvoteRBACPlugin } from "./DownvoteRBACPlugin"; -export { default as MemberRBACPlugin } from "./MemberRBACPlugin"; -export { default as OrganizationRBACPlugin } from "./OrganizationRBACPlugin"; -export { default as PostRBACPlugin } from "./PostRBACPlugin"; -export { default as PostStatusRBACPlugin } from "./PostStatusRBACPlugin"; -export { default as PrimaryKeyMutationsOnlyPlugin } from "./PrimaryKeyMutationsOnlyPlugin"; -export { default as ProjectRBACPlugin } from "./ProjectRBACPlugin"; -export { default as UpvoteRBACPlugin } from "./UpvoteRBACPlugin"; -export { default as UserRBACPlugin } from "./UserRBACPlugin"; +export { default as CommentRBACPlugin } from "./CommentRBAC.plugin"; +export { default as DownvoteRBACPlugin } from "./DownvoteRBAC.plugin"; +export { default as MemberRBACPlugin } from "./MemberRBAC.plugin"; +export { default as OrganizationRBACPlugin } from "./OrganizationRBAC.plugin"; +export { default as PostRBACPlugin } from "./PostRBAC.plugin"; +export { default as PostStatusRBACPlugin } from "./PostStatusRBAC.plugin"; +export { default as PrimaryKeyMutationsOnlyPlugin } from "./PrimaryKeyMutationsOnly.plugin"; +export { default as ProjectRBACPlugin } from "./ProjectRBAC.plugin"; +export { default as UpvoteRBACPlugin } from "./UpvoteRBAC.plugin"; +export { default as UserRBACPlugin } from "./UserRBAC.plugin"; diff --git a/src/scripts/seedDatabase.ts b/src/scripts/seedDatabase.ts index a8118c6..3781cfb 100644 --- a/src/scripts/seedDatabase.ts +++ b/src/scripts/seedDatabase.ts @@ -2,7 +2,7 @@ import dayjs from "dayjs"; import { drizzle } from "drizzle-orm/node-postgres"; import { reset, seed } from "drizzle-seed"; -import { DATABASE_URL, isDevEnv } from "lib/config/env"; +import { DATABASE_URL, isDevEnv } from "lib/config/env.config"; import * as schema from "lib/drizzle/schema"; /** diff --git a/src/server.ts b/src/server.ts index cd59d44..482083c 100644 --- a/src/server.ts +++ b/src/server.ts @@ -7,8 +7,8 @@ import { Hono } from "hono"; import { cors } from "hono/cors"; import { schema } from "generated/graphql/schema.executable"; -import { app as appConfig } from "lib/config/app"; -import { HOST, PORT, isDevEnv, isProdEnv } from "lib/config/env"; +import appConfig from "lib/config/app.config"; +import { HOST, PORT, isDevEnv, isProdEnv } from "lib/config/env.config"; import { createGraphQLContext } from "lib/graphql/context"; import { useAuth } from "lib/plugins/envelop"; @@ -68,7 +68,7 @@ app.use( origin: isProdEnv ? appConfig.url : "https://localhost:3000", credentials: true, allowMethods: ["GET", "POST"], - }) + }), ); // mount GraphQL API @@ -77,7 +77,7 @@ app.use("/graphql", async (c) => yoga.handle(c.req.raw, {})); // GraphQL Yoga suppresses logging the startup message in production environments by default if (isProdEnv) console.log( - `🚀 ${appConfig.name} GraphQL API running at http://${HOST}:${PORT}` + `🚀 ${appConfig.name} GraphQL API running at http://${HOST}:${PORT}`, ); export default {