diff --git a/package.json b/package.json index 53002ef..feefda4 100644 --- a/package.json +++ b/package.json @@ -17,14 +17,16 @@ "dependencies": { "fast-glob": "^3.2.11", "graphql": "^16.5.0", - "retes": "^0.27.1" + "jose": "^4.8.3", + "retes": "^0.29.4" }, "devDependencies": { - "@types/node": "^17.0.36", + "@types/node": "^17.0.45", + "clean-publish": "^4.0.1", "tsm": "^2.2.1", - "tsup": "^6.0.1", - "typescript": "^4.7.2", - "uvu": "^0.5.3", + "tsup": "^6.1.3", + "typescript": "^4.7.4", + "uvu": "^0.5.6", "watchlist": "^0.3.1" }, "exports": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8d11032..640b8dc 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,27 +1,31 @@ lockfileVersion: 5.4 specifiers: - '@types/node': ^17.0.36 + '@types/node': ^17.0.45 + clean-publish: ^4.0.1 fast-glob: ^3.2.11 graphql: ^16.5.0 - retes: ^0.27.1 + jose: ^4.8.3 + retes: ^0.29.4 tsm: ^2.2.1 - tsup: ^6.0.1 - typescript: ^4.7.2 - uvu: ^0.5.3 + tsup: ^6.1.3 + typescript: ^4.7.4 + uvu: ^0.5.6 watchlist: ^0.3.1 dependencies: fast-glob: 3.2.11 graphql: 16.5.0 - retes: 0.27.1 + jose: 4.8.3 + retes: 0.29.4 devDependencies: - '@types/node': 17.0.36 + '@types/node': 17.0.45 + clean-publish: 4.0.1 tsm: 2.2.1 - tsup: 6.0.1_typescript@4.7.2 - typescript: 4.7.2 - uvu: 0.5.3 + tsup: 6.1.3_typescript@4.7.4 + typescript: 4.7.4 + uvu: 0.5.6 watchlist: 0.3.1 packages: @@ -44,8 +48,8 @@ packages: '@nodelib/fs.scandir': 2.1.5 fastq: 1.13.0 - /@types/node/17.0.36: - resolution: {integrity: sha512-V3orv+ggDsWVHP99K3JlwtH20R7J4IhI1Kksgc+64q5VxgfRkQG8Ws3MFm/FZOKDYGy9feGFlZ70/HpCNe9QaA==} + /@types/node/17.0.45: + resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==} dev: true /any-promise/1.3.0: @@ -87,13 +91,13 @@ packages: dependencies: fill-range: 7.0.1 - /bundle-require/3.0.4_esbuild@0.14.42: + /bundle-require/3.0.4_esbuild@0.14.48: resolution: {integrity: sha512-VXG6epB1yrLAvWVQpl92qF347/UXmncQj7J3U8kZEbdVZ1ZkQyr4hYeL/9RvcE8vVVdp53dY78Fd/3pqfRqI1A==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} peerDependencies: esbuild: '>=0.13' dependencies: - esbuild: 0.14.42 + esbuild: 0.14.48 load-tsconfig: 0.2.3 dev: true @@ -124,6 +128,17 @@ packages: fsevents: 2.3.2 dev: true + /clean-publish/4.0.1: + resolution: {integrity: sha512-6v0bh5kQD5FDlxBgXDVNNc6KmAB7iIP/GHD91q9xsGVZT5XB9Y8TNqB7dL5u9PTZlBeLpBw+A1AseRlEEJLSWA==} + engines: {node: '>= 16.0.0'} + hasBin: true + dependencies: + cross-spawn: 7.0.3 + fast-glob: 3.2.11 + lilconfig: 2.0.5 + micromatch: 4.0.5 + dev: true + /commander/4.1.1: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} @@ -171,8 +186,8 @@ packages: path-type: 4.0.0 dev: true - /esbuild-android-64/0.14.42: - resolution: {integrity: sha512-P4Y36VUtRhK/zivqGVMqhptSrFILAGlYp0Z8r9UQqHJ3iWztRCNWnlBzD9HRx0DbueXikzOiwyOri+ojAFfW6A==} + /esbuild-android-64/0.14.48: + resolution: {integrity: sha512-3aMjboap/kqwCUpGWIjsk20TtxVoKck8/4Tu19rubh7t5Ra0Yrpg30Mt1QXXlipOazrEceGeWurXKeFJgkPOUg==} engines: {node: '>=12'} cpu: [x64] os: [android] @@ -180,8 +195,8 @@ packages: dev: true optional: true - /esbuild-android-arm64/0.14.42: - resolution: {integrity: sha512-0cOqCubq+RWScPqvtQdjXG3Czb3AWI2CaKw3HeXry2eoA2rrPr85HF7IpdU26UWdBXgPYtlTN1LUiuXbboROhg==} + /esbuild-android-arm64/0.14.48: + resolution: {integrity: sha512-vptI3K0wGALiDq+EvRuZotZrJqkYkN5282iAfcffjI5lmGG9G1ta/CIVauhY42MBXwEgDJkweiDcDMRLzBZC4g==} engines: {node: '>=12'} cpu: [arm64] os: [android] @@ -189,8 +204,8 @@ packages: dev: true optional: true - /esbuild-darwin-64/0.14.42: - resolution: {integrity: sha512-ipiBdCA3ZjYgRfRLdQwP82rTiv/YVMtW36hTvAN5ZKAIfxBOyPXY7Cejp3bMXWgzKD8B6O+zoMzh01GZsCuEIA==} + /esbuild-darwin-64/0.14.48: + resolution: {integrity: sha512-gGQZa4+hab2Va/Zww94YbshLuWteyKGD3+EsVon8EWTWhnHFRm5N9NbALNbwi/7hQ/hM1Zm4FuHg+k6BLsl5UA==} engines: {node: '>=12'} cpu: [x64] os: [darwin] @@ -198,8 +213,8 @@ packages: dev: true optional: true - /esbuild-darwin-arm64/0.14.42: - resolution: {integrity: sha512-bU2tHRqTPOaoH/4m0zYHbFWpiYDmaA0gt90/3BMEFaM0PqVK/a6MA2V/ypV5PO0v8QxN6gH5hBPY4YJ2lopXgA==} + /esbuild-darwin-arm64/0.14.48: + resolution: {integrity: sha512-bFjnNEXjhZT+IZ8RvRGNJthLWNHV5JkCtuOFOnjvo5pC0sk2/QVk0Qc06g2PV3J0TcU6kaPC3RN9yy9w2PSLEA==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] @@ -207,8 +222,8 @@ packages: dev: true optional: true - /esbuild-freebsd-64/0.14.42: - resolution: {integrity: sha512-75h1+22Ivy07+QvxHyhVqOdekupiTZVLN1PMwCDonAqyXd8TVNJfIRFrdL8QmSJrOJJ5h8H1I9ETyl2L8LQDaw==} + /esbuild-freebsd-64/0.14.48: + resolution: {integrity: sha512-1NOlwRxmOsnPcWOGTB10JKAkYSb2nue0oM1AfHWunW/mv3wERfJmnYlGzL3UAOIUXZqW8GeA2mv+QGwq7DToqA==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] @@ -216,8 +231,8 @@ packages: dev: true optional: true - /esbuild-freebsd-arm64/0.14.42: - resolution: {integrity: sha512-W6Jebeu5TTDQMJUJVarEzRU9LlKpNkPBbjqSu+GUPTHDCly5zZEQq9uHkmHHl7OKm+mQ2zFySN83nmfCeZCyNA==} + /esbuild-freebsd-arm64/0.14.48: + resolution: {integrity: sha512-gXqKdO8wabVcYtluAbikDH2jhXp+Klq5oCD5qbVyUG6tFiGhrC9oczKq3vIrrtwcxDQqK6+HDYK8Zrd4bCA9Gw==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] @@ -225,8 +240,8 @@ packages: dev: true optional: true - /esbuild-linux-32/0.14.42: - resolution: {integrity: sha512-Ooy/Bj+mJ1z4jlWcK5Dl6SlPlCgQB9zg1UrTCeY8XagvuWZ4qGPyYEWGkT94HUsRi2hKsXvcs6ThTOjBaJSMfg==} + /esbuild-linux-32/0.14.48: + resolution: {integrity: sha512-ghGyDfS289z/LReZQUuuKq9KlTiTspxL8SITBFQFAFRA/IkIvDpnZnCAKTCjGXAmUqroMQfKJXMxyjJA69c/nQ==} engines: {node: '>=12'} cpu: [ia32] os: [linux] @@ -234,8 +249,8 @@ packages: dev: true optional: true - /esbuild-linux-64/0.14.42: - resolution: {integrity: sha512-2L0HbzQfbTuemUWfVqNIjOfaTRt9zsvjnme6lnr7/MO9toz/MJ5tZhjqrG6uDWDxhsaHI2/nsDgrv8uEEN2eoA==} + /esbuild-linux-64/0.14.48: + resolution: {integrity: sha512-vni3p/gppLMVZLghI7oMqbOZdGmLbbKR23XFARKnszCIBpEMEDxOMNIKPmMItQrmH/iJrL1z8Jt2nynY0bE1ug==} engines: {node: '>=12'} cpu: [x64] os: [linux] @@ -243,8 +258,8 @@ packages: dev: true optional: true - /esbuild-linux-arm/0.14.42: - resolution: {integrity: sha512-STq69yzCMhdRaWnh29UYrLSr/qaWMm/KqwaRF1pMEK7kDiagaXhSL1zQGXbYv94GuGY/zAwzK98+6idCMUOOCg==} + /esbuild-linux-arm/0.14.48: + resolution: {integrity: sha512-+VfSV7Akh1XUiDNXgqgY1cUP1i2vjI+BmlyXRfVz5AfV3jbpde8JTs5Q9sYgaoq5cWfuKfoZB/QkGOI+QcL1Tw==} engines: {node: '>=12'} cpu: [arm] os: [linux] @@ -252,8 +267,8 @@ packages: dev: true optional: true - /esbuild-linux-arm64/0.14.42: - resolution: {integrity: sha512-c3Ug3e9JpVr8jAcfbhirtpBauLxzYPpycjWulD71CF6ZSY26tvzmXMJYooQ2YKqDY4e/fPu5K8bm7MiXMnyxuA==} + /esbuild-linux-arm64/0.14.48: + resolution: {integrity: sha512-3CFsOlpoxlKPRevEHq8aAntgYGYkE1N9yRYAcPyng/p4Wyx0tPR5SBYsxLKcgPB9mR8chHEhtWYz6EZ+H199Zw==} engines: {node: '>=12'} cpu: [arm64] os: [linux] @@ -261,8 +276,8 @@ packages: dev: true optional: true - /esbuild-linux-mips64le/0.14.42: - resolution: {integrity: sha512-QuvpHGbYlkyXWf2cGm51LBCHx6eUakjaSrRpUqhPwjh/uvNUYvLmz2LgPTTPwCqaKt0iwL+OGVL0tXA5aDbAbg==} + /esbuild-linux-mips64le/0.14.48: + resolution: {integrity: sha512-cs0uOiRlPp6ymknDnjajCgvDMSsLw5mST2UXh+ZIrXTj2Ifyf2aAP3Iw4DiqgnyYLV2O/v/yWBJx+WfmKEpNLA==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] @@ -270,8 +285,8 @@ packages: dev: true optional: true - /esbuild-linux-ppc64le/0.14.42: - resolution: {integrity: sha512-8ohIVIWDbDT+i7lCx44YCyIRrOW1MYlks9fxTo0ME2LS/fxxdoJBwHWzaDYhjvf8kNpA+MInZvyOEAGoVDrMHg==} + /esbuild-linux-ppc64le/0.14.48: + resolution: {integrity: sha512-+2F0vJMkuI0Wie/wcSPDCqXvSFEELH7Jubxb7mpWrA/4NpT+/byjxDz0gG6R1WJoeDefcrMfpBx4GFNN1JQorQ==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] @@ -279,8 +294,8 @@ packages: dev: true optional: true - /esbuild-linux-riscv64/0.14.42: - resolution: {integrity: sha512-DzDqK3TuoXktPyG1Lwx7vhaF49Onv3eR61KwQyxYo4y5UKTpL3NmuarHSIaSVlTFDDpcIajCDwz5/uwKLLgKiQ==} + /esbuild-linux-riscv64/0.14.48: + resolution: {integrity: sha512-BmaK/GfEE+5F2/QDrIXteFGKnVHGxlnK9MjdVKMTfvtmudjY3k2t8NtlY4qemKSizc+QwyombGWTBDc76rxePA==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] @@ -288,8 +303,8 @@ packages: dev: true optional: true - /esbuild-linux-s390x/0.14.42: - resolution: {integrity: sha512-YFRhPCxl8nb//Wn6SiS5pmtplBi4z9yC2gLrYoYI/tvwuB1jldir9r7JwAGy1Ck4D7sE7wBN9GFtUUX/DLdcEQ==} + /esbuild-linux-s390x/0.14.48: + resolution: {integrity: sha512-tndw/0B9jiCL+KWKo0TSMaUm5UWBLsfCKVdbfMlb3d5LeV9WbijZ8Ordia8SAYv38VSJWOEt6eDCdOx8LqkC4g==} engines: {node: '>=12'} cpu: [s390x] os: [linux] @@ -297,8 +312,8 @@ packages: dev: true optional: true - /esbuild-netbsd-64/0.14.42: - resolution: {integrity: sha512-QYSD2k+oT9dqB/4eEM9c+7KyNYsIPgzYOSrmfNGDIyJrbT1d+CFVKvnKahDKNJLfOYj8N4MgyFaU9/Ytc6w5Vw==} + /esbuild-netbsd-64/0.14.48: + resolution: {integrity: sha512-V9hgXfwf/T901Lr1wkOfoevtyNkrxmMcRHyticybBUHookznipMOHoF41Al68QBsqBxnITCEpjjd4yAos7z9Tw==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] @@ -306,8 +321,8 @@ packages: dev: true optional: true - /esbuild-openbsd-64/0.14.42: - resolution: {integrity: sha512-M2meNVIKWsm2HMY7+TU9AxM7ZVwI9havdsw6m/6EzdXysyCFFSoaTQ/Jg03izjCsK17FsVRHqRe26Llj6x0MNA==} + /esbuild-openbsd-64/0.14.48: + resolution: {integrity: sha512-+IHf4JcbnnBl4T52egorXMatil/za0awqzg2Vy6FBgPcBpisDWT2sVz/tNdrK9kAqj+GZG/jZdrOkj7wsrNTKA==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] @@ -315,8 +330,8 @@ packages: dev: true optional: true - /esbuild-sunos-64/0.14.42: - resolution: {integrity: sha512-uXV8TAZEw36DkgW8Ak3MpSJs1ofBb3Smkc/6pZ29sCAN1KzCAQzsje4sUwugf+FVicrHvlamCOlFZIXgct+iqQ==} + /esbuild-sunos-64/0.14.48: + resolution: {integrity: sha512-77m8bsr5wOpOWbGi9KSqDphcq6dFeJyun8TA+12JW/GAjyfTwVtOnN8DOt6DSPUfEV+ltVMNqtXUeTeMAxl5KA==} engines: {node: '>=12'} cpu: [x64] os: [sunos] @@ -324,8 +339,8 @@ packages: dev: true optional: true - /esbuild-windows-32/0.14.42: - resolution: {integrity: sha512-4iw/8qWmRICWi9ZOnJJf9sYt6wmtp3hsN4TdI5NqgjfOkBVMxNdM9Vt3626G1Rda9ya2Q0hjQRD9W1o+m6Lz6g==} + /esbuild-windows-32/0.14.48: + resolution: {integrity: sha512-EPgRuTPP8vK9maxpTGDe5lSoIBHGKO/AuxDncg5O3NkrPeLNdvvK8oywB0zGaAZXxYWfNNSHskvvDgmfVTguhg==} engines: {node: '>=12'} cpu: [ia32] os: [win32] @@ -333,8 +348,8 @@ packages: dev: true optional: true - /esbuild-windows-64/0.14.42: - resolution: {integrity: sha512-j3cdK+Y3+a5H0wHKmLGTJcq0+/2mMBHPWkItR3vytp/aUGD/ua/t2BLdfBIzbNN9nLCRL9sywCRpOpFMx3CxzA==} + /esbuild-windows-64/0.14.48: + resolution: {integrity: sha512-YmpXjdT1q0b8ictSdGwH3M8VCoqPpK1/UArze3X199w6u8hUx3V8BhAi1WjbsfDYRBanVVtduAhh2sirImtAvA==} engines: {node: '>=12'} cpu: [x64] os: [win32] @@ -342,8 +357,8 @@ packages: dev: true optional: true - /esbuild-windows-arm64/0.14.42: - resolution: {integrity: sha512-+lRAARnF+hf8J0mN27ujO+VbhPbDqJ8rCcJKye4y7YZLV6C4n3pTRThAb388k/zqF5uM0lS5O201u0OqoWSicw==} + /esbuild-windows-arm64/0.14.48: + resolution: {integrity: sha512-HHaOMCsCXp0rz5BT2crTka6MPWVno121NKApsGs/OIW5QC0ggC69YMGs1aJct9/9FSUF4A1xNE/cLvgB5svR4g==} engines: {node: '>=12'} cpu: [arm64] os: [win32] @@ -351,32 +366,32 @@ packages: dev: true optional: true - /esbuild/0.14.42: - resolution: {integrity: sha512-V0uPZotCEHokJdNqyozH6qsaQXqmZEOiZWrXnds/zaH/0SyrIayRXWRB98CENO73MIZ9T3HBIOsmds5twWtmgw==} + /esbuild/0.14.48: + resolution: {integrity: sha512-w6N1Yn5MtqK2U1/WZTX9ZqUVb8IOLZkZ5AdHkT6x3cHDMVsYWC7WPdiLmx19w3i4Rwzy5LqsEMtVihG3e4rFzA==} engines: {node: '>=12'} hasBin: true requiresBuild: true optionalDependencies: - esbuild-android-64: 0.14.42 - esbuild-android-arm64: 0.14.42 - esbuild-darwin-64: 0.14.42 - esbuild-darwin-arm64: 0.14.42 - esbuild-freebsd-64: 0.14.42 - esbuild-freebsd-arm64: 0.14.42 - esbuild-linux-32: 0.14.42 - esbuild-linux-64: 0.14.42 - esbuild-linux-arm: 0.14.42 - esbuild-linux-arm64: 0.14.42 - esbuild-linux-mips64le: 0.14.42 - esbuild-linux-ppc64le: 0.14.42 - esbuild-linux-riscv64: 0.14.42 - esbuild-linux-s390x: 0.14.42 - esbuild-netbsd-64: 0.14.42 - esbuild-openbsd-64: 0.14.42 - esbuild-sunos-64: 0.14.42 - esbuild-windows-32: 0.14.42 - esbuild-windows-64: 0.14.42 - esbuild-windows-arm64: 0.14.42 + esbuild-android-64: 0.14.48 + esbuild-android-arm64: 0.14.48 + esbuild-darwin-64: 0.14.48 + esbuild-darwin-arm64: 0.14.48 + esbuild-freebsd-64: 0.14.48 + esbuild-freebsd-arm64: 0.14.48 + esbuild-linux-32: 0.14.48 + esbuild-linux-64: 0.14.48 + esbuild-linux-arm: 0.14.48 + esbuild-linux-arm64: 0.14.48 + esbuild-linux-mips64le: 0.14.48 + esbuild-linux-ppc64le: 0.14.48 + esbuild-linux-riscv64: 0.14.48 + esbuild-linux-s390x: 0.14.48 + esbuild-netbsd-64: 0.14.48 + esbuild-openbsd-64: 0.14.48 + esbuild-sunos-64: 0.14.48 + esbuild-windows-32: 0.14.48 + esbuild-windows-64: 0.14.48 + esbuild-windows-arm64: 0.14.48 dev: true /execa/5.1.1: @@ -517,13 +532,17 @@ packages: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} dev: true + /jose/4.8.3: + resolution: {integrity: sha512-7rySkpW78d8LBp4YU70Wb7+OTgE3OwAALNVZxhoIhp4Kscp+p/fBkdpxGAMKxvCAMV4QfXBU9m6l9nX/vGwd2g==} + dev: false + /joycon/3.1.1: resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} engines: {node: '>=10'} dev: true - /kleur/4.1.4: - resolution: {integrity: sha512-8QADVssbrFjivHWQU7KkMgptGTl6WAcSdlbBPY4uNF+mWr6DGcKrvY2w4FQJoXch7+fKMjj0dRrL75vk3k23OA==} + /kleur/4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} engines: {node: '>=6'} dev: true @@ -601,12 +620,12 @@ packages: dev: true /object-assign/4.1.1: - resolution: {integrity: sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=} + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} dev: true /once/1.4.0: - resolution: {integrity: sha1-WDsap3WWHUsROsF9nFC6753Xa9E=} + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} dependencies: wrappy: 1.0.2 dev: true @@ -619,7 +638,7 @@ packages: dev: true /path-is-absolute/1.0.1: - resolution: {integrity: sha1-F0uSaHNVNP+8es5r9TpanhtcX18=} + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} engines: {node: '>=0.10.0'} dev: true @@ -678,8 +697,8 @@ packages: engines: {node: '>=8'} dev: true - /retes/0.27.1: - resolution: {integrity: sha512-qK+cQf39EIyMIR3nrLtEnRpGHneuL4gI0GFfQsFF56L71RZz9R+YfD6Aqiw1EKDukKSRrugvHLu8/ffCZg+q4g==} + /retes/0.29.4: + resolution: {integrity: sha512-c6Ji2oGfXN/abuLRVLUT0/eklLuAlargjBR0Ru/FAhgmL2TtEhNl2OQ3UnFSUYXa8a6v9qrEb6UvIp0A6KlJ5w==} dependencies: busboy: 1.6.0 dev: false @@ -688,8 +707,8 @@ packages: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - /rollup/2.75.3: - resolution: {integrity: sha512-YA29fLU6MAYSaDxIQYrGGOcbXlDmG96h0krGGYObroezcQ0KgEPM3+7MtKD/qeuUbFuAJXvKZee5dA1dpwq1PQ==} + /rollup/2.75.7: + resolution: {integrity: sha512-VSE1iy0eaAYNCxEXaleThdFXqZJ42qDBatAwrfnPlENEZ8erQ+0LYX4JXOLPceWfZpV1VtZwZ3dFCuOZiSyFtQ==} engines: {node: '>=10.0.0'} hasBin: true optionalDependencies: @@ -746,8 +765,8 @@ packages: engines: {node: '>=6'} dev: true - /sucrase/3.21.0: - resolution: {integrity: sha512-FjAhMJjDcifARI7bZej0Bi1yekjWQHoEvWIXhLPwDhC6O4iZ5PtGb86WV56riW87hzpgB13wwBKO9vKAiWu5VQ==} + /sucrase/3.23.0: + resolution: {integrity: sha512-xgC1xboStzGhCnRywlBf/DLmkC+SkdAKqrNCDsxGrzM0phR5oUxoFKiQNrsc2D8wDdAm03iLbSZqjHDddo3IzQ==} engines: {node: '>=8'} hasBin: true dependencies: @@ -760,7 +779,7 @@ packages: dev: true /thenify-all/1.6.0: - resolution: {integrity: sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=} + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} engines: {node: '>=0.8'} dependencies: thenify: 3.3.1 @@ -779,7 +798,7 @@ packages: is-number: 7.0.0 /tr46/1.0.1: - resolution: {integrity: sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=} + resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} dependencies: punycode: 2.1.1 dev: true @@ -798,11 +817,11 @@ packages: engines: {node: '>=12'} hasBin: true dependencies: - esbuild: 0.14.42 + esbuild: 0.14.48 dev: true - /tsup/6.0.1_typescript@4.7.2: - resolution: {integrity: sha512-2Pl1YkEEvzfg4aYgwUILaHV0wwZQKO7mNHMQChyzdCNlQqf11eug7gWk86XCb3CvRofCXBX87x73BTGjyS3cOQ==} + /tsup/6.1.3_typescript@4.7.4: + resolution: {integrity: sha512-eRpBnbfpDFng+EJNTQ90N7QAf4HAGGC7O3buHIjroKWK7D1ibk9/YnR/3cS8HsMU5T+6Oi+cnF+yU5WmCnB//Q==} engines: {node: '>=14'} hasBin: true peerDependencies: @@ -817,40 +836,40 @@ packages: typescript: optional: true dependencies: - bundle-require: 3.0.4_esbuild@0.14.42 + bundle-require: 3.0.4_esbuild@0.14.48 cac: 6.7.12 chokidar: 3.5.3 debug: 4.3.4 - esbuild: 0.14.42 + esbuild: 0.14.48 execa: 5.1.1 globby: 11.1.0 joycon: 3.1.1 postcss-load-config: 3.1.4 resolve-from: 5.0.0 - rollup: 2.75.3 + rollup: 2.75.7 source-map: 0.8.0-beta.0 - sucrase: 3.21.0 + sucrase: 3.23.0 tree-kill: 1.2.2 - typescript: 4.7.2 + typescript: 4.7.4 transitivePeerDependencies: - supports-color - ts-node dev: true - /typescript/4.7.2: - resolution: {integrity: sha512-Mamb1iX2FDUpcTRzltPxgWMKy3fhg0TN378ylbktPGPK/99KbDtMQ4W1hwgsbPAsG3a0xKa1vmw4VKZQbkvz5A==} + /typescript/4.7.4: + resolution: {integrity: sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==} engines: {node: '>=4.2.0'} hasBin: true dev: true - /uvu/0.5.3: - resolution: {integrity: sha512-brFwqA3FXzilmtnIyJ+CxdkInkY/i4ErvP7uV0DnUVxQcQ55reuHphorpF+tZoVHK2MniZ/VJzI7zJQoc9T9Yw==} + /uvu/0.5.6: + resolution: {integrity: sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==} engines: {node: '>=8'} hasBin: true dependencies: dequal: 2.0.2 diff: 5.1.0 - kleur: 4.1.4 + kleur: 4.1.5 sade: 1.8.1 dev: true @@ -883,7 +902,7 @@ packages: dev: true /wrappy/1.0.2: - resolution: {integrity: sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=} + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} dev: true /yaml/1.10.2: diff --git a/src/middleware.ts b/src/middleware.ts index ac49495..ef6540b 100644 --- a/src/middleware.ts +++ b/src/middleware.ts @@ -1,8 +1,11 @@ +import crypto from "crypto"; + +import * as jose from "jose"; import type { Middleware } from "retes"; +import { Response } from "retes/response"; -import { Response } from 'retes/response'; - -import * as Const from './const'; +import { SALEOR_DOMAIN_HEADER, SALEOR_EVENT_HEADER } from "./const"; +import { jwksUrl } from "./urls"; export const withBaseURL: Middleware = (handler) => async (request) => { const { host, "x-forwarded-proto": protocol = "http" } = request.headers; @@ -11,33 +14,101 @@ export const withBaseURL: Middleware = (handler) => async (request) => { const response = await handler(request); return response; -} - -export const withSaleorDomainPresent: Middleware = (handler) => async (request) => { - const saleor_domain = request.headers[Const.SALEOR_DOMAIN_HEADER]; - - if (!saleor_domain) { - return Response.BadRequest({ success: false, message: "Missing Saleor domain header." }); - } - - return handler(request); }; -export const withSaleorEventMatch = (expectedEvent: string): Middleware => (handler) => async (request) => { - const receivedEvent = request.headers[Const.SALEOR_EVENT_HEADER]; +export const withSaleorDomainPresent: Middleware = + (handler) => async (request) => { + const saleor_domain = request.headers[SALEOR_DOMAIN_HEADER]; - if (receivedEvent !== expectedEvent) { - return Response.BadRequest({ success: false, message: "Invalid Saleor Event" }); - } + if (!saleor_domain) { + return Response.BadRequest({ + success: false, + message: "Missing Saleor domain header.", + }); + } - return handler(request); + return handler(request); + }; + +export const withSaleorEventMatch = + (expectedEvent: string): Middleware => + (handler) => + async (request) => { + const receivedEvent = request.headers[SALEOR_EVENT_HEADER]; + + if (receivedEvent !== expectedEvent) { + return Response.BadRequest({ + success: false, + message: "Invalid Saleor Event", + }); + } + + return handler(request); + }; + +export const withAuthTokenRequired: Middleware = + (handler) => async (request) => { + const auth_token = request.params.auth_token; + if (!auth_token) { + return Response.BadRequest({ + success: false, + message: "Missing auth token.", + }); + } + + return handler(request); + }; + +export const withWebhookSignatureVerified = ( + secretKey: string | undefined = undefined +): Middleware => { + return (handler) => async (request) => { + if (request.rawBody === undefined) { + return Response.InternalServerError({ + success: false, + message: "Request payload already parsed.", + }); + } + + const { + [SALEOR_DOMAIN_HEADER]: saleorDomain, + "saleor-signature": payloadSignature, + } = request.headers; + + if (secretKey !== undefined) { + const calculatedSignature = crypto + .createHmac("sha256", secretKey) + .update(request.rawBody) + .digest("hex"); + + if (calculatedSignature !== payloadSignature) { + return Response.BadRequest({ + success: false, + message: "Invalid signature.", + }); + } + } else { + const [header, _, signature] = payloadSignature.split("."); + const jws = { + protected: header, + payload: request.rawBody, + signature, + }; + + const jwksKey = await jose.createRemoteJWKSet( + new URL(jwksUrl(saleorDomain)) + )(header, payloadSignature); + + try { + await jose.flattenedVerify(jws, jwksKey); + } catch { + return Response.BadRequest({ + success: false, + message: "Invalid signature.", + }); + } + } + + return handler(request); + }; }; - -export const withAuthTokenRequired: Middleware = (handler) => async (request) => { - const auth_token = request.params.auth_token; - if (!auth_token) { - return Response.BadRequest({ success: false, message: "Missing auth token." }); - } - - return handler(request); -}; \ No newline at end of file diff --git a/src/urls.ts b/src/urls.ts new file mode 100644 index 0000000..4dab213 --- /dev/null +++ b/src/urls.ts @@ -0,0 +1,8 @@ +const urlProtocol = (saleorDomain: string): string => + saleorDomain === "localhost:8000" ? "http" : "https"; + +export const jwksUrl = (saleorDomain: string): string => + `${urlProtocol(saleorDomain)}://${saleorDomain}/.well-known/jwks.json`; + +export const graphQLUrl = (saleorDomain: string): string => + `${urlProtocol(saleorDomain)}://${saleorDomain}/graphql/`;