diff --git a/package.json b/package.json index d4b09d6f..9bd9455e 100644 --- a/package.json +++ b/package.json @@ -50,6 +50,7 @@ "@nuxt/test-utils": "^3.14.1", "@nuxt/ui": "^2.18.4", "@nuxt/ui-pro": "^1.4.1", + "@octokit/types": "^13.5.0", "changelogen": "^0.5.5", "eslint": "^9.9.1", "nuxt": "^3.13.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2569f988..f6f857a8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -38,7 +38,7 @@ importers: version: 1.2.1 '@nuxt/devtools': specifier: latest - version: 1.3.14(rollup@4.19.1)(vite@5.4.3(@types/node@22.2.0)(terser@5.31.3)) + version: 1.4.1(rollup@4.19.1)(vite@5.4.3(@types/node@22.2.0)(terser@5.31.3)) '@nuxt/eslint-config': specifier: ^0.5.5 version: 0.5.5(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4) @@ -57,6 +57,9 @@ importers: '@nuxt/ui-pro': specifier: ^1.4.1 version: 1.4.1(magicast@0.3.4)(rollup@4.19.1)(vite@5.4.3(@types/node@22.2.0)(terser@5.31.3))(vue@3.5.0(typescript@5.5.4)) + '@octokit/types': + specifier: ^13.5.0 + version: 13.5.0 changelogen: specifier: ^0.5.5 version: 0.5.5(magicast@0.3.4) @@ -83,7 +86,7 @@ importers: version: 3.13.1(@parcel/watcher@2.4.1)(@types/node@22.2.0)(eslint@9.9.1(jiti@1.21.6))(ioredis@5.4.1)(magicast@0.3.4)(optionator@0.9.4)(rollup@4.21.1)(terser@5.31.3)(typescript@5.5.4)(vite@5.4.3(@types/node@22.2.0)(terser@5.31.3))(vue-tsc@2.1.4(typescript@5.5.4))(webpack-sources@3.2.3) nuxt-auth-utils: specifier: latest - version: 0.3.4(magicast@0.3.4)(rollup@4.21.1) + version: 0.3.6(magicast@0.3.4)(rollup@4.21.1) devDependencies: '@iconify-json/gravity-ui': specifier: ^1.2.1 @@ -1137,35 +1140,15 @@ packages: '@nuxt/devalue@2.0.2': resolution: {integrity: sha512-GBzP8zOc7CGWyFQS6dv1lQz8VVpz5C2yRszbXufwG/9zhStTIH50EtD87NmWbTMwXDvZLNg8GIpb1UFdH93JCA==} - '@nuxt/devtools-kit@1.3.14': - resolution: {integrity: sha512-mLPuCf5nFYLm/1JD0twt8qfFGwoVhTRA4Zx9CPiyWCQNf7XJXb3TfhCm89vHpcPP+9T6ulZxRJp+JZETjXY8+A==} - peerDependencies: - vite: '*' - - '@nuxt/devtools-kit@1.3.9': - resolution: {integrity: sha512-tgr/F+4BbI53/JxgaXl3cuV9dMuCXMsd4GEXN+JqtCdAkDbH3wL79GGWx0/6I9acGzRsB6UZ1H6U96nfgcIrAw==} - peerDependencies: - vite: '*' - '@nuxt/devtools-kit@1.4.1': resolution: {integrity: sha512-6h7T9B0tSZVap13/hf7prEAgIzraj/kyux6/Iif455Trew96jHIFCCboBApUMastYEuCo3l17tgZKe0HW+jrtA==} peerDependencies: vite: '*' - '@nuxt/devtools-wizard@1.3.14': - resolution: {integrity: sha512-5kLB53/7YUME6Y8byrOxRhl0hXWm05jPStJd1CJHKDcGrp+hjxYZaSgEwYtEIQ0A1GF04rfL4bJ+qIL+7e0+9Q==} - hasBin: true - '@nuxt/devtools-wizard@1.4.1': resolution: {integrity: sha512-X9uTh5rgt0pw3UjXcHyl8ZFYmCgw8ITRe9Nr2VLCtNROfKz9yol/ESEhYMwTFiFlqSyfJP6/qtogJBjUt6dzTw==} hasBin: true - '@nuxt/devtools@1.3.14': - resolution: {integrity: sha512-ebeVWBisXbhJ7begAZTgSDF8cPbExHv4RPDb9fWTMI1YoVVxX+elqUPw0K6T5Yi4atdGhyxRtGMqjikl7QKp9w==} - hasBin: true - peerDependencies: - vite: '*' - '@nuxt/devtools@1.4.1': resolution: {integrity: sha512-BtmGRAr/pjSE3dBrM7iceNT6OZAQ/MHxq1brkHJDs2VdyZPnqqGS4n3/98saASoRdj0dddsuIElsqC/zIABhgg==} hasBin: true @@ -1185,10 +1168,6 @@ packages: '@nuxt/icon@1.4.5': resolution: {integrity: sha512-h0Fe1VhpVB5bcQutsH37G46DyE2u+j5j7+0sFbxT2ovRm+uILqo5ONXWe4WuJ20AtngvdpqvnqT25ZQtzx4K9A==} - '@nuxt/kit@3.12.4': - resolution: {integrity: sha512-aNRD1ylzijY0oYolldNcZJXVyxdGzNTl+Xd0UYyFQCu9f4wqUZqQ9l+b7arCEzchr96pMK0xdpvLcS3xo1wDcw==} - engines: {node: ^14.18.0 || >=16.10.0} - '@nuxt/kit@3.13.1': resolution: {integrity: sha512-FkUL349lp/3nVfTIyws4UDJ3d2jyv5Pk1DC1HQUCOkSloYYMdbRcQAUcb4fe2TCLNWvHM+FhU8jnzGTzjALZYA==} engines: {node: ^14.18.0 || >=16.10.0} @@ -1200,10 +1179,6 @@ packages: '@nuxt/kit': ^3.12.4 nuxi: ^3.12.0 - '@nuxt/schema@3.12.4': - resolution: {integrity: sha512-H7FwBV4ChssMaeiLyPdVLOLUa0326ebp3pNbJfGgFt7rSoKh1MmgjorecA8JMxOQZziy3w6EELf4+5cgLh/F1w==} - engines: {node: ^14.18.0 || >=16.10.0} - '@nuxt/schema@3.13.1': resolution: {integrity: sha512-ishbhzVGspjshG9AG0hYnKYY6LWXzCtua7OXV7C/DQ2yA7rRcy1xHpzKZUDbIRyxCHHCAcBd8jfHEUmEuhEPrA==} engines: {node: ^14.18.0 || >=16.10.0} @@ -1272,6 +1247,12 @@ packages: '@nuxtjs/tailwindcss@6.12.1': resolution: {integrity: sha512-UKmaPRVpxlFqLorhL6neEba2tySlsj6w6yDb7jzS6A0AAjyBQ6k3BQqWO+AaTy2iQLX7eR+1yj3/w43HzY8RtA==} + '@octokit/openapi-types@22.2.0': + resolution: {integrity: sha512-QBhVjcUa9W7Wwhm6DBFu6ZZ+1/t/oYxqc2tp81Pi41YNuJinbFRx8B133qVOrAaBbF7D/m0Et6f9/pZt9Rc+tg==} + + '@octokit/types@13.5.0': + resolution: {integrity: sha512-HdqWTf5Z3qwDVlzCrP8UJquMwunpDiMPt5er+QjGzL4hqr/vBVY/MauQgS1xWxCDT1oMx1EULyqxncdCY/NVSQ==} + '@parcel/watcher-android-arm64@2.4.1': resolution: {integrity: sha512-LOi/WTbbh3aTn2RYddrO8pnapixAziFl6SMxHM69r3tvdSm94JtCenaKgk1GRg5FJ5wpMCpHeW+7yqPlvZv7kg==} engines: {node: '>= 10.0.0'} @@ -3690,8 +3671,8 @@ packages: engines: {node: ^16.10.0 || >=18.0.0} hasBin: true - nuxt-auth-utils@0.3.4: - resolution: {integrity: sha512-0CNREFADCyZtyAusV3n27y1jnvt2KjrZI2boaMbKPDWiyI8AcV1jESG1aBFOxyViKsF4YnXRY8QN3EJKYvxMjA==} + nuxt-auth-utils@0.3.6: + resolution: {integrity: sha512-lNo0gM6saYZPe451qcK/Pbp2ky07E6gctydKYas9UcbmYVDV5utsQQhlivyhesxEXzYoymVV+62OCWIP+miH3w==} nuxt@3.13.1: resolution: {integrity: sha512-En0vVrCJWu54ptShUlrqOGzXTcjhX+RnHShwdcpNqL9kmE9FWqeDYnPTgt2gJWrYSvVbmjJcVfEugNo9XpNmHA==} @@ -3711,11 +3692,6 @@ packages: engines: {node: ^14.16.0 || >=16.10.0} hasBin: true - nypm@0.3.9: - resolution: {integrity: sha512-BI2SdqqTHg2d4wJh8P9A1W+bslg33vOE9IZDY6eR2QC+Pu1iNBVZUqczrd43rJb+fMzHU7ltAYKsEFY/kHMFcw==} - engines: {node: ^14.16.0 || >=16.10.0} - hasBin: true - object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} @@ -6032,28 +6008,6 @@ snapshots: '@nuxt/devalue@2.0.2': {} - '@nuxt/devtools-kit@1.3.14(magicast@0.3.4)(rollup@4.19.1)(vite@5.4.3(@types/node@22.2.0)(terser@5.31.3))': - dependencies: - '@nuxt/kit': 3.13.1(magicast@0.3.4)(rollup@4.19.1) - '@nuxt/schema': 3.13.1(rollup@4.19.1) - execa: 7.2.0 - vite: 5.4.3(@types/node@22.2.0)(terser@5.31.3) - transitivePeerDependencies: - - magicast - - rollup - - supports-color - - '@nuxt/devtools-kit@1.3.9(magicast@0.3.4)(rollup@4.19.1)(vite@5.4.3(@types/node@22.2.0)(terser@5.31.3))': - dependencies: - '@nuxt/kit': 3.13.1(magicast@0.3.4)(rollup@4.19.1) - '@nuxt/schema': 3.13.1(rollup@4.19.1) - execa: 7.2.0 - vite: 5.4.3(@types/node@22.2.0)(terser@5.31.3) - transitivePeerDependencies: - - magicast - - rollup - - supports-color - '@nuxt/devtools-kit@1.4.1(magicast@0.3.4)(rollup@4.19.1)(vite@5.4.3(@types/node@22.2.0)(terser@5.31.3))': dependencies: '@nuxt/kit': 3.13.1(magicast@0.3.4)(rollup@4.19.1) @@ -6076,19 +6030,6 @@ snapshots: - rollup - supports-color - '@nuxt/devtools-wizard@1.3.14': - dependencies: - consola: 3.2.3 - diff: 5.2.0 - execa: 7.2.0 - global-directory: 4.0.1 - magicast: 0.3.4 - pathe: 1.1.2 - pkg-types: 1.1.3 - prompts: 2.4.2 - rc9: 2.1.2 - semver: 7.6.3 - '@nuxt/devtools-wizard@1.4.1': dependencies: consola: 3.2.3 @@ -6102,52 +6043,6 @@ snapshots: rc9: 2.1.2 semver: 7.6.3 - '@nuxt/devtools@1.3.14(rollup@4.19.1)(vite@5.4.3(@types/node@22.2.0)(terser@5.31.3))': - dependencies: - '@antfu/utils': 0.7.10 - '@nuxt/devtools-kit': 1.3.14(magicast@0.3.4)(rollup@4.19.1)(vite@5.4.3(@types/node@22.2.0)(terser@5.31.3)) - '@nuxt/devtools-wizard': 1.3.14 - '@nuxt/kit': 3.13.1(magicast@0.3.4)(rollup@4.19.1) - '@vue/devtools-core': 7.3.3(vite@5.4.3(@types/node@22.2.0)(terser@5.31.3)) - '@vue/devtools-kit': 7.3.3 - birpc: 0.2.17 - consola: 3.2.3 - cronstrue: 2.50.0 - destr: 2.0.3 - error-stack-parser-es: 0.1.5 - execa: 7.2.0 - fast-glob: 3.3.2 - fast-npm-meta: 0.2.2 - flatted: 3.3.1 - get-port-please: 3.1.2 - hookable: 5.5.3 - image-meta: 0.2.1 - is-installed-globally: 1.0.0 - launch-editor: 2.8.1 - local-pkg: 0.5.0 - magicast: 0.3.4 - nypm: 0.3.9 - ohash: 1.1.3 - pathe: 1.1.2 - perfect-debounce: 1.0.0 - pkg-types: 1.1.3 - rc9: 2.1.2 - scule: 1.3.0 - semver: 7.6.3 - simple-git: 3.25.0 - sirv: 2.0.4 - unimport: 3.11.1(rollup@4.19.1) - vite: 5.4.3(@types/node@22.2.0)(terser@5.31.3) - vite-plugin-inspect: 0.8.7(@nuxt/kit@3.13.1(magicast@0.3.4)(rollup@4.19.1))(rollup@4.19.1)(vite@5.4.3(@types/node@22.2.0)(terser@5.31.3)) - vite-plugin-vue-inspector: 5.1.3(vite@5.4.3(@types/node@22.2.0)(terser@5.31.3)) - which: 3.0.1 - ws: 8.18.0 - transitivePeerDependencies: - - bufferutil - - rollup - - supports-color - - utf-8-validate - '@nuxt/devtools@1.4.1(rollup@4.19.1)(vite@5.4.3(@types/node@22.2.0)(terser@5.31.3))': dependencies: '@antfu/utils': 0.7.10 @@ -6230,7 +6125,7 @@ snapshots: tinyglobby: 0.2.5 unimport: 3.11.1(rollup@4.21.1) vite: 5.4.3(@types/node@22.2.0)(terser@5.31.3) - vite-plugin-inspect: 0.8.7(@nuxt/kit@3.13.1(magicast@0.3.4)(rollup@4.19.1))(rollup@4.21.1)(vite@5.4.3(@types/node@22.2.0)(terser@5.31.3)) + vite-plugin-inspect: 0.8.7(@nuxt/kit@3.13.1(magicast@0.3.4)(rollup@4.21.1))(rollup@4.21.1)(vite@5.4.3(@types/node@22.2.0)(terser@5.31.3)) vite-plugin-vue-inspector: 5.1.3(vite@5.4.3(@types/node@22.2.0)(terser@5.31.3)) which: 3.0.1 ws: 8.18.0 @@ -6278,7 +6173,7 @@ snapshots: '@iconify/types': 2.0.0 '@iconify/utils': 2.1.29 '@iconify/vue': 4.1.3-beta.1(vue@3.5.0(typescript@5.5.4)) - '@nuxt/devtools-kit': 1.3.9(magicast@0.3.4)(rollup@4.19.1)(vite@5.4.3(@types/node@22.2.0)(terser@5.31.3)) + '@nuxt/devtools-kit': 1.4.1(magicast@0.3.4)(rollup@4.19.1)(vite@5.4.3(@types/node@22.2.0)(terser@5.31.3)) '@nuxt/kit': 3.13.1(magicast@0.3.4)(rollup@4.19.1) consola: 3.2.3 fast-glob: 3.3.2 @@ -6292,33 +6187,6 @@ snapshots: - vite - vue - '@nuxt/kit@3.12.4(magicast@0.3.4)(rollup@4.21.1)': - dependencies: - '@nuxt/schema': 3.12.4(rollup@4.21.1) - c12: 1.11.1(magicast@0.3.4) - consola: 3.2.3 - defu: 6.1.4 - destr: 2.0.3 - globby: 14.0.2 - hash-sum: 2.0.0 - ignore: 5.3.1 - jiti: 1.21.6 - klona: 2.0.6 - knitwork: 1.1.0 - mlly: 1.7.1 - pathe: 1.1.2 - pkg-types: 1.1.3 - scule: 1.3.0 - semver: 7.6.3 - ufo: 1.5.4 - unctx: 2.3.1 - unimport: 3.9.1(rollup@4.21.1) - untyped: 1.4.2 - transitivePeerDependencies: - - magicast - - rollup - - supports-color - '@nuxt/kit@3.13.1(magicast@0.3.4)(rollup@4.19.1)': dependencies: '@nuxt/schema': 3.13.1(rollup@4.19.1) @@ -6392,24 +6260,6 @@ snapshots: - typescript - vue-tsc - '@nuxt/schema@3.12.4(rollup@4.21.1)': - dependencies: - compatx: 0.1.8 - consola: 3.2.3 - defu: 6.1.4 - hookable: 5.5.3 - pathe: 1.1.2 - pkg-types: 1.2.0 - scule: 1.3.0 - std-env: 3.7.0 - ufo: 1.5.4 - uncrypto: 0.1.3 - unimport: 3.11.1(rollup@4.21.1) - untyped: 1.4.2 - transitivePeerDependencies: - - rollup - - supports-color - '@nuxt/schema@3.13.1(rollup@4.19.1)': dependencies: compatx: 0.1.8 @@ -6734,7 +6584,7 @@ snapshots: dependencies: '@nuxt/kit': 3.13.1(magicast@0.3.4)(rollup@4.19.1) pathe: 1.1.2 - pkg-types: 1.1.3 + pkg-types: 1.2.0 semver: 7.6.3 transitivePeerDependencies: - magicast @@ -6762,6 +6612,12 @@ snapshots: - ts-node - uWebSockets.js + '@octokit/openapi-types@22.2.0': {} + + '@octokit/types@13.5.0': + dependencies: + '@octokit/openapi-types': 22.2.0 + '@parcel/watcher-android-arm64@2.4.1': optional: true @@ -8772,7 +8628,7 @@ snapshots: consola: 3.2.3 defu: 6.1.4 node-fetch-native: 1.6.4 - nypm: 0.3.9 + nypm: 0.3.11 ohash: 1.1.3 pathe: 1.1.2 tar: 6.2.1 @@ -9244,7 +9100,7 @@ snapshots: local-pkg@0.5.0: dependencies: mlly: 1.7.1 - pkg-types: 1.1.3 + pkg-types: 1.2.0 locate-path@5.0.0: dependencies: @@ -9391,7 +9247,7 @@ snapshots: jiti: 1.21.6 mlly: 1.7.1 pathe: 1.1.2 - pkg-types: 1.1.3 + pkg-types: 1.2.0 postcss: 8.4.40 postcss-nested: 6.2.0(postcss@8.4.40) semver: 7.6.3 @@ -9403,7 +9259,7 @@ snapshots: dependencies: acorn: 8.12.1 pathe: 1.1.2 - pkg-types: 1.1.3 + pkg-types: 1.2.0 ufo: 1.5.4 mri@1.2.0: {} @@ -9485,7 +9341,7 @@ snapshots: openapi-typescript: 6.7.6 pathe: 1.1.2 perfect-debounce: 1.0.0 - pkg-types: 1.1.3 + pkg-types: 1.2.0 pretty-bytes: 6.1.1 radix3: 1.1.2 rollup: 4.19.1 @@ -9575,14 +9431,15 @@ snapshots: optionalDependencies: fsevents: 2.3.3 - nuxt-auth-utils@0.3.4(magicast@0.3.4)(rollup@4.21.1): + nuxt-auth-utils@0.3.6(magicast@0.3.4)(rollup@4.21.1): dependencies: - '@nuxt/kit': 3.12.4(magicast@0.3.4)(rollup@4.21.1) + '@nuxt/kit': 3.13.1(magicast@0.3.4)(rollup@4.21.1) defu: 6.1.4 hookable: 5.5.3 ofetch: 1.3.4 ohash: 1.1.3 pathe: 1.1.2 + scule: 1.3.0 uncrypto: 0.1.3 transitivePeerDependencies: - magicast @@ -9820,15 +9677,6 @@ snapshots: pkg-types: 1.2.0 ufo: 1.5.4 - nypm@0.3.9: - dependencies: - citty: 0.1.6 - consola: 3.2.3 - execa: 8.0.1 - pathe: 1.1.2 - pkg-types: 1.1.3 - ufo: 1.5.4 - object-assign@4.1.1: {} object-hash@3.0.0: {} @@ -11014,7 +10862,7 @@ snapshots: mkdist: 1.5.4(typescript@5.5.4)(vue-tsc@2.1.4(typescript@5.5.4)) mlly: 1.7.1 pathe: 1.1.2 - pkg-types: 1.1.3 + pkg-types: 1.2.0 pretty-bytes: 6.1.1 rollup: 3.29.4 rollup-plugin-dts: 6.1.1(rollup@3.29.4)(typescript@5.5.4) @@ -11113,24 +10961,6 @@ snapshots: transitivePeerDependencies: - rollup - unimport@3.9.1(rollup@4.21.1): - dependencies: - '@rollup/pluginutils': 5.1.0(rollup@4.21.1) - acorn: 8.12.1 - escape-string-regexp: 5.0.0 - estree-walker: 3.0.3 - fast-glob: 3.3.2 - local-pkg: 0.5.0 - magic-string: 0.30.11 - mlly: 1.7.1 - pathe: 1.1.2 - pkg-types: 1.2.0 - scule: 1.3.0 - strip-literal: 2.1.0 - unplugin: 1.12.0 - transitivePeerDependencies: - - rollup - universalify@2.0.1: {} unplugin-vue-router@0.10.7(rollup@4.19.1)(vue-router@4.4.3(vue@3.5.0(typescript@5.5.4)))(vue@3.5.0(typescript@5.5.4)): @@ -11335,7 +11165,7 @@ snapshots: - rollup - supports-color - vite-plugin-inspect@0.8.7(@nuxt/kit@3.13.1(magicast@0.3.4)(rollup@4.19.1))(rollup@4.21.1)(vite@5.4.3(@types/node@22.2.0)(terser@5.31.3)): + vite-plugin-inspect@0.8.7(@nuxt/kit@3.13.1(magicast@0.3.4)(rollup@4.21.1))(rollup@4.21.1)(vite@5.4.3(@types/node@22.2.0)(terser@5.31.3)): dependencies: '@antfu/utils': 0.7.10 '@rollup/pluginutils': 5.1.0(rollup@4.21.1) @@ -11348,7 +11178,7 @@ snapshots: sirv: 2.0.4 vite: 5.4.3(@types/node@22.2.0)(terser@5.31.3) optionalDependencies: - '@nuxt/kit': 3.13.1(magicast@0.3.4)(rollup@4.19.1) + '@nuxt/kit': 3.13.1(magicast@0.3.4)(rollup@4.21.1) transitivePeerDependencies: - rollup - supports-color diff --git a/src/runtime/server/lib/oauth/github.ts b/src/runtime/server/lib/oauth/github.ts index 1fa167a7..3df6ed82 100644 --- a/src/runtime/server/lib/oauth/github.ts +++ b/src/runtime/server/lib/oauth/github.ts @@ -2,10 +2,14 @@ import type { H3Event } from 'h3' import { eventHandler, getQuery, sendRedirect } from 'h3' import { withQuery } from 'ufo' import { defu } from 'defu' +import type { Endpoints } from '@octokit/types' import { handleMissingConfiguration, handleAccessTokenErrorResponse, getOAuthRedirectURL, requestAccessToken } from '../utils' import { useRuntimeConfig, createError } from '#imports' import type { OAuthConfig } from '#auth-utils' +type getUserResponse = Endpoints['GET /user']['response']['data'] +type listUserEmailsResponse = Endpoints['GET /user/emails']['response']['data'] + export interface OAuthGitHubConfig { /** * GitHub OAuth Client ID @@ -115,9 +119,7 @@ export function oauthGitHubEventHandler({ config, onSuccess, onError }: OAuthCon } const accessToken = tokens.access_token - // TODO: improve typing - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const user: any = await $fetch('https://api.github.com/user', { + const user = await $fetch('https://api.github.com/user', { headers: { 'User-Agent': `Github-OAuth-${config.clientId}`, 'Authorization': `token ${accessToken}`, @@ -126,17 +128,13 @@ export function oauthGitHubEventHandler({ config, onSuccess, onError }: OAuthCon // if no public email, check the private ones if (!user.email && config.emailRequired) { - // TODO: improve typing - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const emails: any[] = await $fetch('https://api.github.com/user/emails', { + const emails = await $fetch('https://api.github.com/user/emails', { headers: { 'User-Agent': `Github-OAuth-${config.clientId}`, 'Authorization': `token ${accessToken}`, }, }) - // TODO: improve typing - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const primaryEmail = emails.find((email: any) => email.primary) + const primaryEmail = emails.find(email => email.primary) // Still no email if (!primaryEmail) { throw new Error('GitHub login failed: no user email found')