diff --git a/package.json b/package.json index 7e0b88d..c31b5e4 100644 --- a/package.json +++ b/package.json @@ -27,6 +27,7 @@ "react": "18.2.0", "react-dom": "18.2.0", "superjson": "^1.13.1", + "ts-permissions": "^1.0.0", "zod": "^3.21.4" }, "devDependencies": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2347bb5..60de979 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -29,9 +29,18 @@ dependencies: '@trpc/server': specifier: ^10.37.1 version: 10.40.0 + bunyan: + specifier: ^1.8.15 + version: 1.8.15 + bunyan-format: + specifier: ^0.2.1 + version: 0.2.1 next: specifier: ^13.4.19 version: 13.5.4(react-dom@18.2.0)(react@18.2.0) + next-auth: + specifier: ^4.23.2 + version: 4.23.2(next@13.5.4)(react-dom@18.2.0)(react@18.2.0) react: specifier: 18.2.0 version: 18.2.0 @@ -41,11 +50,20 @@ dependencies: superjson: specifier: ^1.13.1 version: 1.13.3 + ts-permissions: + specifier: ^1.0.0 + version: 1.0.0 zod: specifier: ^3.21.4 version: 3.22.4 devDependencies: + '@types/bunyan': + specifier: ^1.8.9 + version: 1.8.9 + '@types/bunyan-format': + specifier: ^0.2.6 + version: 0.2.6 '@types/eslint': specifier: ^8.44.2 version: 8.44.3 @@ -303,7 +321,6 @@ packages: engines: {node: '>=6.9.0'} dependencies: regenerator-runtime: 0.14.0 - dev: true /@eslint-community/eslint-utils@4.4.0(eslint@8.50.0): resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} @@ -518,6 +535,10 @@ packages: engines: {node: '>=8.0.0'} dev: false + /@panva/hkdf@1.1.1: + resolution: {integrity: sha512-dhPeilub1NuIG0X5Kvhh9lH4iW3ZsHlnzwgwbOlgwQ2wG1IqFzsgHqmKPk3WzsdWAeaxKJxgM0+W433RmN45GA==} + dev: false + /@prisma/client@5.4.1(prisma@5.4.1): resolution: {integrity: sha512-xyD0DJ3gRNfLbPsC+YfMBBuLJtZKQfy1OD2qU/PZg+HKrr7SO+09174LMeTlWP0YF2wca9LxtVd4HnAiB5ketQ==} engines: {node: '>=16.13'} @@ -823,6 +844,18 @@ packages: resolution: {integrity: sha512-49SUOMWzSZtu5+OdrADmJD+u+sjSE0qj1cWgYk2FY4jLkPJunLuNRuhzM7aOeBhiUjyfhg2YTfur8FN1WBmvEw==} dev: false + /@types/bunyan-format@0.2.6: + resolution: {integrity: sha512-p8UiEPFBWOaIgPlRs5czRHkQZhLjyk8IX9Cks1gMi5CoBwJ/QPOlo9zr0gSotEK7YGbU7j/sVwEIScAfODvoQw==} + dependencies: + '@types/node': 18.18.3 + dev: true + + /@types/bunyan@1.8.9: + resolution: {integrity: sha512-ZqS9JGpBxVOvsawzmVt30sP++gSQMTejCkIAQ3VdadOcRE8izTyW66hufvwLeH+YEGP6Js2AW7Gz+RMyvrEbmw==} + dependencies: + '@types/node': 18.18.3 + dev: true + /@types/cross-spawn@6.0.3: resolution: {integrity: sha512-BDAkU7WHHRHnvBf5z89lcvACsvkz/n7Tv+HyD/uW76O29HoH1Tk/W6iQrepaZVbisvlEek4ygwT8IW7ow9XLAA==} dependencies: @@ -1125,6 +1158,14 @@ packages: dependencies: color-convert: 2.0.1 + /ansicolors@0.2.1: + resolution: {integrity: sha512-tOIuy1/SK/dr94ZA0ckDohKXNeBNqZ4us6PjMVLs5h1w2GBB6uPtOknp2+VF4F/zcy9LI70W+Z+pE2Soajky1w==} + dev: false + + /ansistyles@0.1.3: + resolution: {integrity: sha512-6QWEyvMgIXX0eO972y7YPBLSBsq7UWKFAoNNTLGaOJ9bstcEL9sCbcjf96dVfNDdUsRoGOK82vWFJlKApXds7g==} + dev: false + /any-promise@1.3.0: resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} dev: true @@ -1412,6 +1453,25 @@ packages: ieee754: 1.2.1 dev: false + /bunyan-format@0.2.1: + resolution: {integrity: sha512-xQs2LwWskjQdv7bVkMNwvMi7HnvDQoX4587H90nDGQGPPwHrmxsihBOIYHMVwjLMMOokITKPyFcbFneblvMEjQ==} + dependencies: + ansicolors: 0.2.1 + ansistyles: 0.1.3 + xtend: 2.1.2 + dev: false + + /bunyan@1.8.15: + resolution: {integrity: sha512-0tECWShh6wUysgucJcBAoYegf3JJoZWibxdqhTm7OHPeT42qdjkZ29QCMcKwbgU1kiH+auSIasNRXMLWXafXig==} + engines: {'0': node >=0.10.0} + hasBin: true + optionalDependencies: + dtrace-provider: 0.8.8 + moment: 2.29.4 + mv: 2.1.1 + safe-json-stringify: 1.2.0 + dev: false + /busboy@1.6.0: resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} engines: {node: '>=10.16.0'} @@ -1574,6 +1634,11 @@ packages: /concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + /cookie@0.5.0: + resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} + engines: {node: '>= 0.6'} + dev: false + /copy-anything@3.0.5: resolution: {integrity: sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==} engines: {node: '>=12.13'} @@ -1741,6 +1806,15 @@ packages: engines: {node: '>=12'} dev: false + /dtrace-provider@0.8.8: + resolution: {integrity: sha512-b7Z7cNtHPhH9EJhNNbbeqTcXB8LGFFZhq1PGgEvpeHlzd36bhbdTWoE/Ba/YguqpBSlAPKnARWhVlhunCMwfxg==} + engines: {node: '>=0.10'} + requiresBuild: true + dependencies: + nan: 2.18.0 + dev: false + optional: true + /ecdsa-sig-formatter@1.0.11: resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} dependencies: @@ -2400,6 +2474,18 @@ packages: resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} dev: false + /glob@6.0.4: + resolution: {integrity: sha512-MKZeRNyYZAVVVG1oZeLaWie1uweH40m9AZwIwxyPbTSX4hHrVYSzLg0Ro5Z5R7XKkIX+Cc6oD1rqeDJnwsB8/A==} + requiresBuild: true + dependencies: + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: false + optional: true + /glob@7.1.6: resolution: {integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==} dependencies: @@ -2870,6 +2956,10 @@ packages: hasBin: true dev: true + /jose@4.15.2: + resolution: {integrity: sha512-IY73F228OXRl9ar3jJagh7Vnuhj/GzBunPiZP13K0lOl7Am9SoWW3kEzq3MCllJMTtZqHTiDXQvoRd4U95aU6A==} + dev: false + /js-md4@0.3.2: resolution: {integrity: sha512-/GDnfQYsltsjRswQhN9fhv3EMw2sCpUdrdxyWDOUK7eyD++r3gRhzgiQgc/x4MAv2i1iuQ4lxO5mvqM3vj4bwA==} dev: false @@ -3219,7 +3309,21 @@ packages: /minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - dev: true + + /mkdirp@0.5.6: + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} + hasBin: true + requiresBuild: true + dependencies: + minimist: 1.2.8 + dev: false + optional: true + + /moment@2.29.4: + resolution: {integrity: sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==} + requiresBuild: true + dev: false + optional: true /mongodb-connection-string-url@2.6.0: resolution: {integrity: sha512-WvTZlI9ab0QYtTYnuMLgobULWhokRjtC7db9LtcVfJ+Hsnyr5eo6ZtNAt3Ly24XZScGMelOcGtm7lSn0332tPQ==} @@ -3311,6 +3415,17 @@ packages: - supports-color dev: false + /mv@2.1.1: + resolution: {integrity: sha512-at/ZndSy3xEGJ8i0ygALh8ru9qy7gWW1cmkaqBN29JmMlIvM//MEO9y1sk/avxuwnPcfhkejkLsuPxH81BrkSg==} + engines: {node: '>=0.8.0'} + requiresBuild: true + dependencies: + mkdirp: 0.5.6 + ncp: 2.0.0 + rimraf: 2.4.5 + dev: false + optional: true + /mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} dependencies: @@ -3319,6 +3434,12 @@ packages: thenify-all: 1.6.0 dev: true + /nan@2.18.0: + resolution: {integrity: sha512-W7tfG7vMOGtD30sHoZSSc/JVYiyDPEyQVso/Zz+/uQd0B0L46gtC+pHha5FFMRpil6fm/AoEcRWyOVi4+E/f8w==} + requiresBuild: true + dev: false + optional: true + /nanoid@3.3.6: resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -3332,11 +3453,43 @@ packages: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} dev: true + /ncp@2.0.0: + resolution: {integrity: sha512-zIdGUrPRFTUELUvr3Gmc7KZ2Sw/h1PiVM0Af/oHB6zgnV1ikqSfRk+TOufi79aHYCW3NiOXmr1BP5nWbzojLaA==} + hasBin: true + requiresBuild: true + dev: false + optional: true + /new-github-issue-url@0.2.1: resolution: {integrity: sha512-md4cGoxuT4T4d/HDOXbrUHkTKrp/vp+m3aOA7XXVYwNsUNMK49g3SQicTSeV5GIz/5QVGAeYRAOlyp9OvlgsYA==} engines: {node: '>=10'} dev: false + /next-auth@4.23.2(next@13.5.4)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-VRmInu0r/yZNFQheDFeOKtiugu3bt90Po3owAQDnFQ3YLQFmUKgFjcE2+3L0ny5jsJpBXaKbm7j7W2QTc6Ye2A==} + peerDependencies: + next: ^12.2.5 || ^13 + nodemailer: ^6.6.5 + react: ^17.0.2 || ^18 + react-dom: ^17.0.2 || ^18 + peerDependenciesMeta: + nodemailer: + optional: true + dependencies: + '@babel/runtime': 7.23.1 + '@panva/hkdf': 1.1.1 + cookie: 0.5.0 + jose: 4.15.2 + next: 13.5.4(react-dom@18.2.0)(react@18.2.0) + oauth: 0.9.15 + openid-client: 5.6.0 + preact: 10.18.1 + preact-render-to-string: 5.2.6(preact@10.18.1) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + uuid: 8.3.2 + dev: false + /next@13.5.4(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-+93un5S779gho8y9ASQhb/bTkQF17FNQOtXLKAj3lsNgltEcF0C5PMLLncDmH+8X1EnJH1kbqAERa29nRXqhjA==} engines: {node: '>=16.14.0'} @@ -3412,7 +3565,7 @@ packages: resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} dependencies: hosted-git-info: 2.8.9 - resolve: 1.22.4 + resolve: 1.22.6 semver: 5.7.2 validate-npm-package-license: 3.0.4 dev: false @@ -3456,11 +3609,20 @@ packages: path-key: 3.1.1 dev: false + /oauth@0.9.15: + resolution: {integrity: sha512-a5ERWK1kh38ExDEfoO6qUHJb32rd7aYmPHuyCu3Fta/cnICvYmgd2uhuKXvPD+PXB+gCEYYEaQdIRAjCOwAKNA==} + dev: false + /object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} dev: true + /object-hash@2.2.0: + resolution: {integrity: sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==} + engines: {node: '>= 6'} + dev: false + /object-hash@3.0.0: resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} engines: {node: '>= 6'} @@ -3469,6 +3631,10 @@ packages: /object-inspect@1.12.3: resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} + /object-keys@0.4.0: + resolution: {integrity: sha512-ncrLw+X55z7bkl5PnUvHwFK9FcGuFYo9gtjws2XtSzL+aZ8tm830P60WJ0dSmFVaSalWieW5MD7kEdnXda9yJw==} + dev: false + /object-keys@1.1.1: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} engines: {node: '>= 0.4'} @@ -3525,6 +3691,11 @@ packages: es-abstract: 1.22.2 dev: true + /oidc-token-hash@5.0.3: + resolution: {integrity: sha512-IF4PcGgzAr6XXSff26Sk/+P4KZFJVuHAJZj3wgO3vX2bMdNVp/QXTP3P7CEm9V1IdG8lDLY3HhiqpsE/nOwpPw==} + engines: {node: ^10.13.0 || >=12.0.0} + dev: false + /once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} dependencies: @@ -3554,6 +3725,15 @@ packages: is-wsl: 2.2.0 dev: false + /openid-client@5.6.0: + resolution: {integrity: sha512-uFTkN/iqgKvSnmpVAS/T6SNThukRMBcmymTQ71Ngus1F60tdtKVap7zCrleocY+fogPtpmoxi5Q1YdrgYuTlkA==} + dependencies: + jose: 4.15.2 + lru-cache: 6.0.0 + object-hash: 2.2.0 + oidc-token-hash: 5.0.3 + dev: false + /optionator@0.9.3: resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} engines: {node: '>= 0.8.0'} @@ -3877,6 +4057,19 @@ packages: xtend: 4.0.2 dev: false + /preact-render-to-string@5.2.6(preact@10.18.1): + resolution: {integrity: sha512-JyhErpYOvBV1hEPwIxc/fHWXPfnEGdRKxc8gFdAZ7XV4tlzyzG847XAyEZqoDnynP88akM4eaHcSOzNcLWFguw==} + peerDependencies: + preact: '>=10' + dependencies: + preact: 10.18.1 + pretty-format: 3.8.0 + dev: false + + /preact@10.18.1: + resolution: {integrity: sha512-mKUD7RRkQQM6s7Rkmi7IFkoEHjuFqRQUaXamO61E6Nn7vqF/bo7EZCmSyrUnp2UWHw0O7XjZ2eeXis+m7tf4lg==} + dev: false + /prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} @@ -3943,6 +4136,10 @@ packages: hasBin: true dev: true + /pretty-format@3.8.0: + resolution: {integrity: sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew==} + dev: false + /prisma@5.4.1: resolution: {integrity: sha512-op9PmU8Bcw5dNAas82wBYTG0yHnpq9/O3bhxbDBrNzwZTwBqsVCxxYRLf6wHNh9HVaDGhgjjHlu1+BcW8qdnBg==} engines: {node: '>=16.13'} @@ -4101,7 +4298,6 @@ packages: /regenerator-runtime@0.14.0: resolution: {integrity: sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==} - dev: true /regexp.prototype.flags@1.5.1: resolution: {integrity: sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==} @@ -4141,7 +4337,6 @@ packages: is-core-module: 2.13.0 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - dev: true /resolve@2.0.0-next.4: resolution: {integrity: sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==} @@ -4173,6 +4368,15 @@ packages: resolution: {integrity: sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==} dev: false + /rimraf@2.4.5: + resolution: {integrity: sha512-J5xnxTyqaiw06JjMftq7L9ouA448dw/E7dKghkP9WpKNuwmARNNg+Gk8/u5ryb9N/Yo2+z3MCwuqFK/+qPOPfQ==} + hasBin: true + requiresBuild: true + dependencies: + glob: 6.0.4 + dev: false + optional: true + /rimraf@3.0.2: resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} hasBin: true @@ -4201,6 +4405,12 @@ packages: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} dev: false + /safe-json-stringify@1.2.0: + resolution: {integrity: sha512-gH8eh2nZudPQO6TytOvbxnuhYBOvDBBLW52tz5q6X58lJcd/tkmqFR+5Z9adS8aJtURSXWThWy/xJtJwixErvg==} + requiresBuild: true + dev: false + optional: true + /safe-regex-test@1.0.0: resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} dependencies: @@ -4661,6 +4871,10 @@ packages: resolution: {integrity: sha512-pefrkcd4lmIVR0LA49Imjf9DYLK8vtWhqBPA3Ya1ir8xCW0O2yjL9dsCVvI7pCodLC5q7smNpEtDR2yVulQxOg==} dev: false + /ts-permissions@1.0.0: + resolution: {integrity: sha512-nboYcBEZF5LkSPFfHde6J9/dCBlg911sJz0DelMB59JVRhUTTMnIvunMb+QdtblcvgFuXZ0Zc4qlb1bk/LmHmw==} + dev: false + /tsconfig-paths@3.14.2: resolution: {integrity: sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==} dependencies: @@ -4913,6 +5127,13 @@ packages: /wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + /xtend@2.1.2: + resolution: {integrity: sha512-vMNKzr2rHP9Dp/e1NQFnLQlwlhp9L/LfvnsVdHxN1f+uggyVI3i08uD14GPvCToPkdsRfyPqIyYGmIk58V98ZQ==} + engines: {node: '>=0.4'} + dependencies: + object-keys: 0.4.0 + dev: false + /xtend@4.0.2: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} engines: {node: '>=0.4'} diff --git a/src/server/api/auth/permissions/ProjectPermissions.ts b/src/server/api/auth/permissions/ProjectPermissions.ts index 98b1869..e089228 100644 --- a/src/server/api/auth/permissions/ProjectPermissions.ts +++ b/src/server/api/auth/permissions/ProjectPermissions.ts @@ -1,4 +1,4 @@ -import { Permission, createPermissionsClass } from "."; +import { createPermissionsClass } from "ts-permissions"; enum ProjectPermissionsEnum { /** @@ -32,37 +32,6 @@ enum ProjectPermissionsEnum { ManageServices, } -export const ProjectPermissions = createPermissionsClass( - ProjectPermissionsEnum, -); - -// export class ProjectPermissions extends Permission< -// Record -// > { -// public static Flags = ProjectPermissionsEnum; -// } - -// const test = { -// Administrator: 0, -// ManageMembers: 1, -// CreateService: 2, -// ViewServices: 3, -// ManageServices: 4, -// }; - -// type Test = { [key in keyof typeof ProjectPermissions]: number } - -// class TestClass { -// constructor(public value: { -// [key in keyof typeof T]: number | string; -// }) {} -// use(something: T) { -// return new TestClass(something); -// } -// } - -// const inst = new TestClass(ProjectPermissions); -// inst.use(ProjectPermissions.Owner); - -// export const ProjectPermissionsClass = new Permission(ProjectPermissions); -// ProjectPermissionsClass.for(0b11111).has(ProjectPermissions.Owner); +export const ProjectPermissions = createPermissionsClass< + typeof ProjectPermissionsEnum +>(ProjectPermissionsEnum, "ProjectPermissions"); diff --git a/src/server/api/auth/permissions/index.ts b/src/server/api/auth/permissions/index.ts deleted file mode 100644 index 02a9378..0000000 --- a/src/server/api/auth/permissions/index.ts +++ /dev/null @@ -1,122 +0,0 @@ -import assert from "assert"; - -enum DefaultFlags {} - -export function createPermissionsClass< - E extends Record, - T extends string | number | symbol, ->(permissionsEnum: E) { - return class extends Permission { - public static Flags = permissionsEnum; - static from(permission: number | bigint | T[]) { - return new Permission(permission as any); - } - }; -} - -/** - * Creates a class representing a set of permissions - */ -export class Permission { - public static Flags = DefaultFlags; - private permissions: bigint = 0n; - - /** - * Creates a helper class for working with permissions - * @param allPermissions The permissions enum - * @param givenPermissions The permissions to start with - */ - constructor(givenPermissions?: number | bigint | T[] | E[]) { - if ( - typeof givenPermissions === "number" || - typeof givenPermissions === "bigint" - ) { - this.permissions = BigInt(givenPermissions); - } else if (Array.isArray(givenPermissions)) { - givenPermissions.forEach((permission) => { - this.add(permission); - }); - } - } - - static from(permission: number | bigint) { - return new Permission(permission); - } - - /** - * Converts a permission index to a bitmask - * @param index The 0-based index of the permission - * @returns the permission as a bitmask - */ - private toPermissionBitmask(permission: T | E): bigint { - let permissionIndex: number = -1; - - // if is a string, that means we reversed the enum - if (typeof permission === "string") { - // @ts-expect-error idk how to type this better - let resolved = (this.constructor as unknown as typeof Permission).Flags[ - permission - ]; - assert(typeof resolved === "number", "Invalid permission"); - permissionIndex = resolved; - } else if (typeof permission === "number") { - permissionIndex = permission; - } - - assert(permissionIndex >= 0, "Failed to resolve permission"); - return 1n << BigInt(permissionIndex); - } - - /** - * Adds a permission to the set - * @param permission The permission to add - */ - public add(permission: E) { - this.permissions |= this.toPermissionBitmask(permission); - } - - /** - * Removes a permission from the set - * @param permission The permission to remove - */ - public remove(permission: T) { - this.permissions &= ~this.toPermissionBitmask(permission); - } - - /** - * Checks if the set has a permission - * @param permission The permission(s) to check - * @returns true if the set has the permission - */ - public has(permission: T | T[]): boolean { - if (Array.isArray(permission)) { - return permission.every((perm) => this.has(perm)); - } - - return (this.permissions & this.toPermissionBitmask(permission)) !== 0n; - } - - /** - * Returns a new instance of Permission for a new set of permissions - * @param permissions The permissions to start with - */ - public for(permissions: number | bigint | T[]) { - return new Permission(permissions); - } - - /** - * Creates a copy of the current set of permissions - * @returns a new instance of Permission - */ - public copy() { - return new Permission(this.permissions); - } - - /** - * Returns the permissions as a bitmask - * @returns the permissions as a bitmask - */ - public toBits() { - return this.permissions; - } -}