Refactor logic of twitter oauth

This commit is contained in:
delivan 2022-12-05 19:50:13 +09:00
parent 3ebae75689
commit 0fc5ac8f0c
51 changed files with 801 additions and 168 deletions

435
.pnp.cjs generated
View File

@ -35,6 +35,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
["@types/react-dom", "npm:18.0.9"],\ ["@types/react-dom", "npm:18.0.9"],\
["@typescript-eslint/eslint-plugin", "virtual:4b77e00d446246df1ed27001550885fbf1b51be18c660c1b5c357d3d763078ecef2a676194291a120f149b87573081e5af0621dc83cf1f83383639f39ac133c7#npm:5.45.0"],\ ["@typescript-eslint/eslint-plugin", "virtual:4b77e00d446246df1ed27001550885fbf1b51be18c660c1b5c357d3d763078ecef2a676194291a120f149b87573081e5af0621dc83cf1f83383639f39ac133c7#npm:5.45.0"],\
["@typescript-eslint/parser", "virtual:4b77e00d446246df1ed27001550885fbf1b51be18c660c1b5c357d3d763078ecef2a676194291a120f149b87573081e5af0621dc83cf1f83383639f39ac133c7#npm:5.45.0"],\ ["@typescript-eslint/parser", "virtual:4b77e00d446246df1ed27001550885fbf1b51be18c660c1b5c357d3d763078ecef2a676194291a120f149b87573081e5af0621dc83cf1f83383639f39ac133c7#npm:5.45.0"],\
["crypto", "npm:1.0.1"],\
["eslint", "npm:8.28.0"],\ ["eslint", "npm:8.28.0"],\
["eslint-config-next", "virtual:4b77e00d446246df1ed27001550885fbf1b51be18c660c1b5c357d3d763078ecef2a676194291a120f149b87573081e5af0621dc83cf1f83383639f39ac133c7#npm:13.0.5"],\ ["eslint-config-next", "virtual:4b77e00d446246df1ed27001550885fbf1b51be18c660c1b5c357d3d763078ecef2a676194291a120f149b87573081e5af0621dc83cf1f83383639f39ac133c7#npm:13.0.5"],\
["eslint-config-prettier", "virtual:4b77e00d446246df1ed27001550885fbf1b51be18c660c1b5c357d3d763078ecef2a676194291a120f149b87573081e5af0621dc83cf1f83383639f39ac133c7#npm:8.5.0"],\ ["eslint-config-prettier", "virtual:4b77e00d446246df1ed27001550885fbf1b51be18c660c1b5c357d3d763078ecef2a676194291a120f149b87573081e5af0621dc83cf1f83383639f39ac133c7#npm:8.5.0"],\
@ -45,11 +46,11 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
["eslint-plugin-react", "virtual:4b77e00d446246df1ed27001550885fbf1b51be18c660c1b5c357d3d763078ecef2a676194291a120f149b87573081e5af0621dc83cf1f83383639f39ac133c7#npm:7.31.11"],\ ["eslint-plugin-react", "virtual:4b77e00d446246df1ed27001550885fbf1b51be18c660c1b5c357d3d763078ecef2a676194291a120f149b87573081e5af0621dc83cf1f83383639f39ac133c7#npm:7.31.11"],\
["eslint-plugin-react-hooks", "virtual:4b77e00d446246df1ed27001550885fbf1b51be18c660c1b5c357d3d763078ecef2a676194291a120f149b87573081e5af0621dc83cf1f83383639f39ac133c7#npm:4.6.0"],\ ["eslint-plugin-react-hooks", "virtual:4b77e00d446246df1ed27001550885fbf1b51be18c660c1b5c357d3d763078ecef2a676194291a120f149b87573081e5af0621dc83cf1f83383639f39ac133c7#npm:4.6.0"],\
["eslint-plugin-unicorn", "virtual:4b77e00d446246df1ed27001550885fbf1b51be18c660c1b5c357d3d763078ecef2a676194291a120f149b87573081e5af0621dc83cf1f83383639f39ac133c7#npm:45.0.1"],\ ["eslint-plugin-unicorn", "virtual:4b77e00d446246df1ed27001550885fbf1b51be18c660c1b5c357d3d763078ecef2a676194291a120f149b87573081e5af0621dc83cf1f83383639f39ac133c7#npm:45.0.1"],\
["iron-session", "virtual:4b77e00d446246df1ed27001550885fbf1b51be18c660c1b5c357d3d763078ecef2a676194291a120f149b87573081e5af0621dc83cf1f83383639f39ac133c7#npm:6.3.1"],\
["next", "virtual:4b77e00d446246df1ed27001550885fbf1b51be18c660c1b5c357d3d763078ecef2a676194291a120f149b87573081e5af0621dc83cf1f83383639f39ac133c7#npm:13.0.5"],\ ["next", "virtual:4b77e00d446246df1ed27001550885fbf1b51be18c660c1b5c357d3d763078ecef2a676194291a120f149b87573081e5af0621dc83cf1f83383639f39ac133c7#npm:13.0.5"],\
["prettier", "npm:2.8.0"],\ ["prettier", "npm:2.8.0"],\
["react", "npm:18.2.0"],\ ["react", "npm:18.2.0"],\
["react-dom", "virtual:4b77e00d446246df1ed27001550885fbf1b51be18c660c1b5c357d3d763078ecef2a676194291a120f149b87573081e5af0621dc83cf1f83383639f39ac133c7#npm:18.2.0"],\ ["react-dom", "virtual:4b77e00d446246df1ed27001550885fbf1b51be18c660c1b5c357d3d763078ecef2a676194291a120f149b87573081e5af0621dc83cf1f83383639f39ac133c7#npm:18.2.0"],\
["twitter-api-sdk", "npm:1.2.1"],\
["typescript", "patch:typescript@npm%3A4.9.3#~builtin<compat/typescript>::version=4.9.3&hash=d73830"]\ ["typescript", "patch:typescript@npm%3A4.9.3#~builtin<compat/typescript>::version=4.9.3&hash=d73830"]\
],\ ],\
"linkType": "SOFT"\ "linkType": "SOFT"\
@ -345,6 +346,42 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
"linkType": "HARD"\ "linkType": "HARD"\
}]\ }]\
]],\ ]],\
["@peculiar/asn1-schema", [\
["npm:2.3.3", {\
"packageLocation": "./.yarn/cache/@peculiar-asn1-schema-npm-2.3.3-7c2b9469c4-2b1902543e.zip/node_modules/@peculiar/asn1-schema/",\
"packageDependencies": [\
["@peculiar/asn1-schema", "npm:2.3.3"],\
["asn1js", "npm:3.0.5"],\
["pvtsutils", "npm:1.3.2"],\
["tslib", "npm:2.4.1"]\
],\
"linkType": "HARD"\
}]\
]],\
["@peculiar/json-schema", [\
["npm:1.1.12", {\
"packageLocation": "./.yarn/cache/@peculiar-json-schema-npm-1.1.12-f914d2ea65-b26ececdc2.zip/node_modules/@peculiar/json-schema/",\
"packageDependencies": [\
["@peculiar/json-schema", "npm:1.1.12"],\
["tslib", "npm:2.4.1"]\
],\
"linkType": "HARD"\
}]\
]],\
["@peculiar/webcrypto", [\
["npm:1.4.1", {\
"packageLocation": "./.yarn/cache/@peculiar-webcrypto-npm-1.4.1-3595f492d1-cfcd49f6bd.zip/node_modules/@peculiar/webcrypto/",\
"packageDependencies": [\
["@peculiar/webcrypto", "npm:1.4.1"],\
["@peculiar/asn1-schema", "npm:2.3.3"],\
["@peculiar/json-schema", "npm:1.1.12"],\
["pvtsutils", "npm:1.3.2"],\
["tslib", "npm:2.4.1"],\
["webcrypto-core", "npm:1.7.5"]\
],\
"linkType": "HARD"\
}]\
]],\
["@pkgr/utils", [\ ["@pkgr/utils", [\
["npm:2.3.1", {\ ["npm:2.3.1", {\
"packageLocation": "./.yarn/cache/@pkgr-utils-npm-2.3.1-c89c217c08-118a197112.zip/node_modules/@pkgr/utils/",\ "packageLocation": "./.yarn/cache/@pkgr-utils-npm-2.3.1-c89c217c08-118a197112.zip/node_modules/@pkgr/utils/",\
@ -379,6 +416,68 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
"linkType": "HARD"\ "linkType": "HARD"\
}]\ }]\
]],\ ]],\
["@types/accepts", [\
["npm:1.3.5", {\
"packageLocation": "./.yarn/cache/@types-accepts-npm-1.3.5-1d59cd2a7a-590b758057.zip/node_modules/@types/accepts/",\
"packageDependencies": [\
["@types/accepts", "npm:1.3.5"],\
["@types/node", "npm:18.11.9"]\
],\
"linkType": "HARD"\
}]\
]],\
["@types/body-parser", [\
["npm:1.19.2", {\
"packageLocation": "./.yarn/cache/@types-body-parser-npm-1.19.2-f845b7b538-e17840c7d7.zip/node_modules/@types/body-parser/",\
"packageDependencies": [\
["@types/body-parser", "npm:1.19.2"],\
["@types/connect", "npm:3.4.35"],\
["@types/node", "npm:18.11.9"]\
],\
"linkType": "HARD"\
}]\
]],\
["@types/connect", [\
["npm:3.4.35", {\
"packageLocation": "./.yarn/cache/@types-connect-npm-3.4.35-7337eee0a3-fe81351470.zip/node_modules/@types/connect/",\
"packageDependencies": [\
["@types/connect", "npm:3.4.35"],\
["@types/node", "npm:18.11.9"]\
],\
"linkType": "HARD"\
}]\
]],\
["@types/content-disposition", [\
["npm:0.5.5", {\
"packageLocation": "./.yarn/cache/@types-content-disposition-npm-0.5.5-2219aba782-fdf7379db1.zip/node_modules/@types/content-disposition/",\
"packageDependencies": [\
["@types/content-disposition", "npm:0.5.5"]\
],\
"linkType": "HARD"\
}]\
]],\
["@types/cookie", [\
["npm:0.5.1", {\
"packageLocation": "./.yarn/cache/@types-cookie-npm-0.5.1-4b655a0ac0-9a8d60fc84.zip/node_modules/@types/cookie/",\
"packageDependencies": [\
["@types/cookie", "npm:0.5.1"]\
],\
"linkType": "HARD"\
}]\
]],\
["@types/cookies", [\
["npm:0.7.7", {\
"packageLocation": "./.yarn/cache/@types-cookies-npm-0.7.7-0fbdd53be5-d3759efc11.zip/node_modules/@types/cookies/",\
"packageDependencies": [\
["@types/cookies", "npm:0.7.7"],\
["@types/connect", "npm:3.4.35"],\
["@types/express", "npm:4.17.14"],\
["@types/keygrip", "npm:1.0.2"],\
["@types/node", "npm:18.11.9"]\
],\
"linkType": "HARD"\
}]\
]],\
["@types/eslint", [\ ["@types/eslint", [\
["npm:8.4.10", {\ ["npm:8.4.10", {\
"packageLocation": "./.yarn/cache/@types-eslint-npm-8.4.10-9df5f4bc78-21e009ed9e.zip/node_modules/@types/eslint/",\ "packageLocation": "./.yarn/cache/@types-eslint-npm-8.4.10-9df5f4bc78-21e009ed9e.zip/node_modules/@types/eslint/",\
@ -399,6 +498,31 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
"linkType": "HARD"\ "linkType": "HARD"\
}]\ }]\
]],\ ]],\
["@types/express", [\
["npm:4.17.14", {\
"packageLocation": "./.yarn/cache/@types-express-npm-4.17.14-076e1b4711-15c1af46d0.zip/node_modules/@types/express/",\
"packageDependencies": [\
["@types/express", "npm:4.17.14"],\
["@types/body-parser", "npm:1.19.2"],\
["@types/express-serve-static-core", "npm:4.17.31"],\
["@types/qs", "npm:6.9.7"],\
["@types/serve-static", "npm:1.15.0"]\
],\
"linkType": "HARD"\
}]\
]],\
["@types/express-serve-static-core", [\
["npm:4.17.31", {\
"packageLocation": "./.yarn/cache/@types-express-serve-static-core-npm-4.17.31-846873f446-009bfbe107.zip/node_modules/@types/express-serve-static-core/",\
"packageDependencies": [\
["@types/express-serve-static-core", "npm:4.17.31"],\
["@types/node", "npm:18.11.9"],\
["@types/qs", "npm:6.9.7"],\
["@types/range-parser", "npm:1.2.4"]\
],\
"linkType": "HARD"\
}]\
]],\
["@types/glob", [\ ["@types/glob", [\
["npm:7.2.0", {\ ["npm:7.2.0", {\
"packageLocation": "./.yarn/cache/@types-glob-npm-7.2.0-772334bf9a-6ae717fedf.zip/node_modules/@types/glob/",\ "packageLocation": "./.yarn/cache/@types-glob-npm-7.2.0-772334bf9a-6ae717fedf.zip/node_modules/@types/glob/",\
@ -410,6 +534,24 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
"linkType": "HARD"\ "linkType": "HARD"\
}]\ }]\
]],\ ]],\
["@types/http-assert", [\
["npm:1.5.3", {\
"packageLocation": "./.yarn/cache/@types-http-assert-npm-1.5.3-d45bf58309-9553e5a0b8.zip/node_modules/@types/http-assert/",\
"packageDependencies": [\
["@types/http-assert", "npm:1.5.3"]\
],\
"linkType": "HARD"\
}]\
]],\
["@types/http-errors", [\
["npm:2.0.1", {\
"packageLocation": "./.yarn/cache/@types-http-errors-npm-2.0.1-c59d5079a7-3bb0c50b0a.zip/node_modules/@types/http-errors/",\
"packageDependencies": [\
["@types/http-errors", "npm:2.0.1"]\
],\
"linkType": "HARD"\
}]\
]],\
["@types/json-schema", [\ ["@types/json-schema", [\
["npm:7.0.11", {\ ["npm:7.0.11", {\
"packageLocation": "./.yarn/cache/@types-json-schema-npm-7.0.11-79462ae5ca-527bddfe62.zip/node_modules/@types/json-schema/",\ "packageLocation": "./.yarn/cache/@types-json-schema-npm-7.0.11-79462ae5ca-527bddfe62.zip/node_modules/@types/json-schema/",\
@ -428,6 +570,51 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
"linkType": "HARD"\ "linkType": "HARD"\
}]\ }]\
]],\ ]],\
["@types/keygrip", [\
["npm:1.0.2", {\
"packageLocation": "./.yarn/cache/@types-keygrip-npm-1.0.2-2e57be51bc-60bc2738a4.zip/node_modules/@types/keygrip/",\
"packageDependencies": [\
["@types/keygrip", "npm:1.0.2"]\
],\
"linkType": "HARD"\
}]\
]],\
["@types/koa", [\
["npm:2.13.5", {\
"packageLocation": "./.yarn/cache/@types-koa-npm-2.13.5-ee6d93204c-e3b634d934.zip/node_modules/@types/koa/",\
"packageDependencies": [\
["@types/koa", "npm:2.13.5"],\
["@types/accepts", "npm:1.3.5"],\
["@types/content-disposition", "npm:0.5.5"],\
["@types/cookies", "npm:0.7.7"],\
["@types/http-assert", "npm:1.5.3"],\
["@types/http-errors", "npm:2.0.1"],\
["@types/keygrip", "npm:1.0.2"],\
["@types/koa-compose", "npm:3.2.5"],\
["@types/node", "npm:18.11.9"]\
],\
"linkType": "HARD"\
}]\
]],\
["@types/koa-compose", [\
["npm:3.2.5", {\
"packageLocation": "./.yarn/cache/@types-koa-compose-npm-3.2.5-b9ab25d904-5d1147c4b0.zip/node_modules/@types/koa-compose/",\
"packageDependencies": [\
["@types/koa-compose", "npm:3.2.5"],\
["@types/koa", "npm:2.13.5"]\
],\
"linkType": "HARD"\
}]\
]],\
["@types/mime", [\
["npm:3.0.1", {\
"packageLocation": "./.yarn/cache/@types-mime-npm-3.0.1-dec03536dc-4040fac73f.zip/node_modules/@types/mime/",\
"packageDependencies": [\
["@types/mime", "npm:3.0.1"]\
],\
"linkType": "HARD"\
}]\
]],\
["@types/minimatch", [\ ["@types/minimatch", [\
["npm:5.1.2", {\ ["npm:5.1.2", {\
"packageLocation": "./.yarn/cache/@types-minimatch-npm-5.1.2-aab9c394d3-0391a28286.zip/node_modules/@types/minimatch/",\ "packageLocation": "./.yarn/cache/@types-minimatch-npm-5.1.2-aab9c394d3-0391a28286.zip/node_modules/@types/minimatch/",\
@ -438,6 +625,13 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
}]\ }]\
]],\ ]],\
["@types/node", [\ ["@types/node", [\
["npm:17.0.45", {\
"packageLocation": "./.yarn/cache/@types-node-npm-17.0.45-fdb38d1624-aa04366b91.zip/node_modules/@types/node/",\
"packageDependencies": [\
["@types/node", "npm:17.0.45"]\
],\
"linkType": "HARD"\
}],\
["npm:18.11.9", {\ ["npm:18.11.9", {\
"packageLocation": "./.yarn/cache/@types-node-npm-18.11.9-d21dd6ec05-cc0aae109e.zip/node_modules/@types/node/",\ "packageLocation": "./.yarn/cache/@types-node-npm-18.11.9-d21dd6ec05-cc0aae109e.zip/node_modules/@types/node/",\
"packageDependencies": [\ "packageDependencies": [\
@ -464,6 +658,24 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
"linkType": "HARD"\ "linkType": "HARD"\
}]\ }]\
]],\ ]],\
["@types/qs", [\
["npm:6.9.7", {\
"packageLocation": "./.yarn/cache/@types-qs-npm-6.9.7-4a3e6ca0d0-7fd6f9c250.zip/node_modules/@types/qs/",\
"packageDependencies": [\
["@types/qs", "npm:6.9.7"]\
],\
"linkType": "HARD"\
}]\
]],\
["@types/range-parser", [\
["npm:1.2.4", {\
"packageLocation": "./.yarn/cache/@types-range-parser-npm-1.2.4-23d797fbde-b7c0dfd508.zip/node_modules/@types/range-parser/",\
"packageDependencies": [\
["@types/range-parser", "npm:1.2.4"]\
],\
"linkType": "HARD"\
}]\
]],\
["@types/react", [\ ["@types/react", [\
["npm:18.0.25", {\ ["npm:18.0.25", {\
"packageLocation": "./.yarn/cache/@types-react-npm-18.0.25-0d729c976f-231d658c45.zip/node_modules/@types/react/",\ "packageLocation": "./.yarn/cache/@types-react-npm-18.0.25-0d729c976f-231d658c45.zip/node_modules/@types/react/",\
@ -504,6 +716,17 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
"linkType": "HARD"\ "linkType": "HARD"\
}]\ }]\
]],\ ]],\
["@types/serve-static", [\
["npm:1.15.0", {\
"packageLocation": "./.yarn/cache/@types-serve-static-npm-1.15.0-ec80a4ac87-b6ac93d471.zip/node_modules/@types/serve-static/",\
"packageDependencies": [\
["@types/serve-static", "npm:1.15.0"],\
["@types/mime", "npm:3.0.1"],\
["@types/node", "npm:18.11.9"]\
],\
"linkType": "HARD"\
}]\
]],\
["@typescript-eslint/eslint-plugin", [\ ["@typescript-eslint/eslint-plugin", [\
["npm:5.45.0", {\ ["npm:5.45.0", {\
"packageLocation": "./.yarn/cache/@typescript-eslint-eslint-plugin-npm-5.45.0-af83fa2940-7cff671a9b.zip/node_modules/@typescript-eslint/eslint-plugin/",\ "packageLocation": "./.yarn/cache/@typescript-eslint-eslint-plugin-npm-5.45.0-af83fa2940-7cff671a9b.zip/node_modules/@typescript-eslint/eslint-plugin/",\
@ -713,16 +936,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
"linkType": "HARD"\ "linkType": "HARD"\
}]\ }]\
]],\ ]],\
["abort-controller", [\
["npm:3.0.0", {\
"packageLocation": "./.yarn/cache/abort-controller-npm-3.0.0-2f3a9a2bcb-170bdba9b4.zip/node_modules/abort-controller/",\
"packageDependencies": [\
["abort-controller", "npm:3.0.0"],\
["event-target-shim", "npm:5.0.1"]\
],\
"linkType": "HARD"\
}]\
]],\
["acorn", [\ ["acorn", [\
["npm:8.8.1", {\ ["npm:8.8.1", {\
"packageLocation": "./.yarn/cache/acorn-npm-8.8.1-20e4aea981-4079b67283.zip/node_modules/acorn/",\ "packageLocation": "./.yarn/cache/acorn-npm-8.8.1-20e4aea981-4079b67283.zip/node_modules/acorn/",\
@ -877,6 +1090,18 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
"linkType": "HARD"\ "linkType": "HARD"\
}]\ }]\
]],\ ]],\
["asn1js", [\
["npm:3.0.5", {\
"packageLocation": "./.yarn/cache/asn1js-npm-3.0.5-cf5558af33-3b6af1bbad.zip/node_modules/asn1js/",\
"packageDependencies": [\
["asn1js", "npm:3.0.5"],\
["pvtsutils", "npm:1.3.2"],\
["pvutils", "npm:1.1.3"],\
["tslib", "npm:2.4.1"]\
],\
"linkType": "HARD"\
}]\
]],\
["ast-types-flow", [\ ["ast-types-flow", [\
["npm:0.0.7", {\ ["npm:0.0.7", {\
"packageLocation": "./.yarn/cache/ast-types-flow-npm-0.0.7-7d32a3abf5-a26dcc2182.zip/node_modules/ast-types-flow/",\ "packageLocation": "./.yarn/cache/ast-types-flow-npm-0.0.7-7d32a3abf5-a26dcc2182.zip/node_modules/ast-types-flow/",\
@ -913,6 +1138,15 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
"linkType": "HARD"\ "linkType": "HARD"\
}]\ }]\
]],\ ]],\
["base64-js", [\
["npm:1.5.1", {\
"packageLocation": "./.yarn/cache/base64-js-npm-1.5.1-b2f7275641-669632eb37.zip/node_modules/base64-js/",\
"packageDependencies": [\
["base64-js", "npm:1.5.1"]\
],\
"linkType": "HARD"\
}]\
]],\
["brace-expansion", [\ ["brace-expansion", [\
["npm:1.1.11", {\ ["npm:1.1.11", {\
"packageLocation": "./.yarn/cache/brace-expansion-npm-1.1.11-fb95eb05ad-faf34a7bb0.zip/node_modules/brace-expansion/",\ "packageLocation": "./.yarn/cache/brace-expansion-npm-1.1.11-fb95eb05ad-faf34a7bb0.zip/node_modules/brace-expansion/",\
@ -934,6 +1168,17 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
"linkType": "HARD"\ "linkType": "HARD"\
}]\ }]\
]],\ ]],\
["buffer", [\
["npm:6.0.3", {\
"packageLocation": "./.yarn/cache/buffer-npm-6.0.3-cd90dfedfe-5ad23293d9.zip/node_modules/buffer/",\
"packageDependencies": [\
["buffer", "npm:6.0.3"],\
["base64-js", "npm:1.5.1"],\
["ieee754", "npm:1.2.1"]\
],\
"linkType": "HARD"\
}]\
]],\
["builtin-modules", [\ ["builtin-modules", [\
["npm:3.3.0", {\ ["npm:3.3.0", {\
"packageLocation": "./.yarn/cache/builtin-modules-npm-3.3.0-db4f3d32de-db021755d7.zip/node_modules/builtin-modules/",\ "packageLocation": "./.yarn/cache/builtin-modules-npm-3.3.0-db4f3d32de-db021755d7.zip/node_modules/builtin-modules/",\
@ -1073,6 +1318,15 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
"linkType": "HARD"\ "linkType": "HARD"\
}]\ }]\
]],\ ]],\
["cookie", [\
["npm:0.5.0", {\
"packageLocation": "./.yarn/cache/cookie-npm-0.5.0-e2d58a161a-1f4bd2ca57.zip/node_modules/cookie/",\
"packageDependencies": [\
["cookie", "npm:0.5.0"]\
],\
"linkType": "HARD"\
}]\
]],\
["core-js-pure", [\ ["core-js-pure", [\
["npm:3.26.1", {\ ["npm:3.26.1", {\
"packageLocation": "./.yarn/unplugged/core-js-pure-npm-3.26.1-d78c7431c6/node_modules/core-js-pure/",\ "packageLocation": "./.yarn/unplugged/core-js-pure-npm-3.26.1-d78c7431c6/node_modules/core-js-pure/",\
@ -1094,6 +1348,15 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
"linkType": "HARD"\ "linkType": "HARD"\
}]\ }]\
]],\ ]],\
["crypto", [\
["npm:1.0.1", {\
"packageLocation": "./.yarn/cache/crypto-npm-1.0.1-7cb8e3dca6-087fe3165b.zip/node_modules/crypto/",\
"packageDependencies": [\
["crypto", "npm:1.0.1"]\
],\
"linkType": "HARD"\
}]\
]],\
["csstype", [\ ["csstype", [\
["npm:3.1.1", {\ ["npm:3.1.1", {\
"packageLocation": "./.yarn/cache/csstype-npm-3.1.1-3857baf48b-1f7b4f5fdd.zip/node_modules/csstype/",\ "packageLocation": "./.yarn/cache/csstype-npm-3.1.1-3857baf48b-1f7b4f5fdd.zip/node_modules/csstype/",\
@ -1912,15 +2175,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
"linkType": "HARD"\ "linkType": "HARD"\
}]\ }]\
]],\ ]],\
["event-target-shim", [\
["npm:5.0.1", {\
"packageLocation": "./.yarn/cache/event-target-shim-npm-5.0.1-cb48709025-1ffe3bb22a.zip/node_modules/event-target-shim/",\
"packageDependencies": [\
["event-target-shim", "npm:5.0.1"]\
],\
"linkType": "HARD"\
}]\
]],\
["fast-deep-equal", [\ ["fast-deep-equal", [\
["npm:3.1.3", {\ ["npm:3.1.3", {\
"packageLocation": "./.yarn/cache/fast-deep-equal-npm-3.1.3-790edcfcf5-e21a9d8d84.zip/node_modules/fast-deep-equal/",\ "packageLocation": "./.yarn/cache/fast-deep-equal-npm-3.1.3-790edcfcf5-e21a9d8d84.zip/node_modules/fast-deep-equal/",\
@ -2341,6 +2595,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
["@types/react-dom", "npm:18.0.9"],\ ["@types/react-dom", "npm:18.0.9"],\
["@typescript-eslint/eslint-plugin", "virtual:4b77e00d446246df1ed27001550885fbf1b51be18c660c1b5c357d3d763078ecef2a676194291a120f149b87573081e5af0621dc83cf1f83383639f39ac133c7#npm:5.45.0"],\ ["@typescript-eslint/eslint-plugin", "virtual:4b77e00d446246df1ed27001550885fbf1b51be18c660c1b5c357d3d763078ecef2a676194291a120f149b87573081e5af0621dc83cf1f83383639f39ac133c7#npm:5.45.0"],\
["@typescript-eslint/parser", "virtual:4b77e00d446246df1ed27001550885fbf1b51be18c660c1b5c357d3d763078ecef2a676194291a120f149b87573081e5af0621dc83cf1f83383639f39ac133c7#npm:5.45.0"],\ ["@typescript-eslint/parser", "virtual:4b77e00d446246df1ed27001550885fbf1b51be18c660c1b5c357d3d763078ecef2a676194291a120f149b87573081e5af0621dc83cf1f83383639f39ac133c7#npm:5.45.0"],\
["crypto", "npm:1.0.1"],\
["eslint", "npm:8.28.0"],\ ["eslint", "npm:8.28.0"],\
["eslint-config-next", "virtual:4b77e00d446246df1ed27001550885fbf1b51be18c660c1b5c357d3d763078ecef2a676194291a120f149b87573081e5af0621dc83cf1f83383639f39ac133c7#npm:13.0.5"],\ ["eslint-config-next", "virtual:4b77e00d446246df1ed27001550885fbf1b51be18c660c1b5c357d3d763078ecef2a676194291a120f149b87573081e5af0621dc83cf1f83383639f39ac133c7#npm:13.0.5"],\
["eslint-config-prettier", "virtual:4b77e00d446246df1ed27001550885fbf1b51be18c660c1b5c357d3d763078ecef2a676194291a120f149b87573081e5af0621dc83cf1f83383639f39ac133c7#npm:8.5.0"],\ ["eslint-config-prettier", "virtual:4b77e00d446246df1ed27001550885fbf1b51be18c660c1b5c357d3d763078ecef2a676194291a120f149b87573081e5af0621dc83cf1f83383639f39ac133c7#npm:8.5.0"],\
@ -2351,16 +2606,25 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
["eslint-plugin-react", "virtual:4b77e00d446246df1ed27001550885fbf1b51be18c660c1b5c357d3d763078ecef2a676194291a120f149b87573081e5af0621dc83cf1f83383639f39ac133c7#npm:7.31.11"],\ ["eslint-plugin-react", "virtual:4b77e00d446246df1ed27001550885fbf1b51be18c660c1b5c357d3d763078ecef2a676194291a120f149b87573081e5af0621dc83cf1f83383639f39ac133c7#npm:7.31.11"],\
["eslint-plugin-react-hooks", "virtual:4b77e00d446246df1ed27001550885fbf1b51be18c660c1b5c357d3d763078ecef2a676194291a120f149b87573081e5af0621dc83cf1f83383639f39ac133c7#npm:4.6.0"],\ ["eslint-plugin-react-hooks", "virtual:4b77e00d446246df1ed27001550885fbf1b51be18c660c1b5c357d3d763078ecef2a676194291a120f149b87573081e5af0621dc83cf1f83383639f39ac133c7#npm:4.6.0"],\
["eslint-plugin-unicorn", "virtual:4b77e00d446246df1ed27001550885fbf1b51be18c660c1b5c357d3d763078ecef2a676194291a120f149b87573081e5af0621dc83cf1f83383639f39ac133c7#npm:45.0.1"],\ ["eslint-plugin-unicorn", "virtual:4b77e00d446246df1ed27001550885fbf1b51be18c660c1b5c357d3d763078ecef2a676194291a120f149b87573081e5af0621dc83cf1f83383639f39ac133c7#npm:45.0.1"],\
["iron-session", "virtual:4b77e00d446246df1ed27001550885fbf1b51be18c660c1b5c357d3d763078ecef2a676194291a120f149b87573081e5af0621dc83cf1f83383639f39ac133c7#npm:6.3.1"],\
["next", "virtual:4b77e00d446246df1ed27001550885fbf1b51be18c660c1b5c357d3d763078ecef2a676194291a120f149b87573081e5af0621dc83cf1f83383639f39ac133c7#npm:13.0.5"],\ ["next", "virtual:4b77e00d446246df1ed27001550885fbf1b51be18c660c1b5c357d3d763078ecef2a676194291a120f149b87573081e5af0621dc83cf1f83383639f39ac133c7#npm:13.0.5"],\
["prettier", "npm:2.8.0"],\ ["prettier", "npm:2.8.0"],\
["react", "npm:18.2.0"],\ ["react", "npm:18.2.0"],\
["react-dom", "virtual:4b77e00d446246df1ed27001550885fbf1b51be18c660c1b5c357d3d763078ecef2a676194291a120f149b87573081e5af0621dc83cf1f83383639f39ac133c7#npm:18.2.0"],\ ["react-dom", "virtual:4b77e00d446246df1ed27001550885fbf1b51be18c660c1b5c357d3d763078ecef2a676194291a120f149b87573081e5af0621dc83cf1f83383639f39ac133c7#npm:18.2.0"],\
["twitter-api-sdk", "npm:1.2.1"],\
["typescript", "patch:typescript@npm%3A4.9.3#~builtin<compat/typescript>::version=4.9.3&hash=d73830"]\ ["typescript", "patch:typescript@npm%3A4.9.3#~builtin<compat/typescript>::version=4.9.3&hash=d73830"]\
],\ ],\
"linkType": "SOFT"\ "linkType": "SOFT"\
}]\ }]\
]],\ ]],\
["ieee754", [\
["npm:1.2.1", {\
"packageLocation": "./.yarn/cache/ieee754-npm-1.2.1-fb63b3caeb-5144c0c981.zip/node_modules/ieee754/",\
"packageDependencies": [\
["ieee754", "npm:1.2.1"]\
],\
"linkType": "HARD"\
}]\
]],\
["ignore", [\ ["ignore", [\
["npm:5.2.1", {\ ["npm:5.2.1", {\
"packageLocation": "./.yarn/cache/ignore-npm-5.2.1-208dc99ae8-7251d00cba.zip/node_modules/ignore/",\ "packageLocation": "./.yarn/cache/ignore-npm-5.2.1-208dc99ae8-7251d00cba.zip/node_modules/ignore/",\
@ -2431,6 +2695,49 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
"linkType": "HARD"\ "linkType": "HARD"\
}]\ }]\
]],\ ]],\
["iron-session", [\
["npm:6.3.1", {\
"packageLocation": "./.yarn/cache/iron-session-npm-6.3.1-3d184d9b5e-65f534187b.zip/node_modules/iron-session/",\
"packageDependencies": [\
["iron-session", "npm:6.3.1"]\
],\
"linkType": "SOFT"\
}],\
["virtual:4b77e00d446246df1ed27001550885fbf1b51be18c660c1b5c357d3d763078ecef2a676194291a120f149b87573081e5af0621dc83cf1f83383639f39ac133c7#npm:6.3.1", {\
"packageLocation": "./.yarn/__virtual__/iron-session-virtual-46f542dab9/0/cache/iron-session-npm-6.3.1-3d184d9b5e-65f534187b.zip/node_modules/iron-session/",\
"packageDependencies": [\
["iron-session", "virtual:4b77e00d446246df1ed27001550885fbf1b51be18c660c1b5c357d3d763078ecef2a676194291a120f149b87573081e5af0621dc83cf1f83383639f39ac133c7#npm:6.3.1"],\
["@peculiar/webcrypto", "npm:1.4.1"],\
["@types/cookie", "npm:0.5.1"],\
["@types/express", "npm:4.17.14"],\
["@types/koa", "npm:2.13.5"],\
["@types/next", null],\
["@types/node", "npm:17.0.45"],\
["cookie", "npm:0.5.0"],\
["express", null],\
["iron-webcrypto", "npm:0.2.6"],\
["koa", null],\
["next", "virtual:4b77e00d446246df1ed27001550885fbf1b51be18c660c1b5c357d3d763078ecef2a676194291a120f149b87573081e5af0621dc83cf1f83383639f39ac133c7#npm:13.0.5"]\
],\
"packagePeers": [\
"@types/next",\
"express",\
"koa",\
"next"\
],\
"linkType": "HARD"\
}]\
]],\
["iron-webcrypto", [\
["npm:0.2.6", {\
"packageLocation": "./.yarn/cache/iron-webcrypto-npm-0.2.6-8c13b11192-8b32e4f494.zip/node_modules/iron-webcrypto/",\
"packageDependencies": [\
["iron-webcrypto", "npm:0.2.6"],\
["buffer", "npm:6.0.3"]\
],\
"linkType": "HARD"\
}]\
]],\
["is-arrayish", [\ ["is-arrayish", [\
["npm:0.2.1", {\ ["npm:0.2.1", {\
"packageLocation": "./.yarn/cache/is-arrayish-npm-0.2.1-23927dfb15-eef4417e3c.zip/node_modules/is-arrayish/",\ "packageLocation": "./.yarn/cache/is-arrayish-npm-0.2.1-23927dfb15-eef4417e3c.zip/node_modules/is-arrayish/",\
@ -3027,29 +3334,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
"linkType": "HARD"\ "linkType": "HARD"\
}]\ }]\
]],\ ]],\
["node-fetch", [\
["npm:2.6.7", {\
"packageLocation": "./.yarn/cache/node-fetch-npm-2.6.7-777aa2a6df-8d816ffd1e.zip/node_modules/node-fetch/",\
"packageDependencies": [\
["node-fetch", "npm:2.6.7"]\
],\
"linkType": "SOFT"\
}],\
["virtual:15e88f013aab7f0ee21b80b2aacd9c758bcffd83a3a22c6e1971f032f68acc65ca544062c16a8bf5a5d2be6356f854582c1d469e633c7c65852e00a36d721d5f#npm:2.6.7", {\
"packageLocation": "./.yarn/__virtual__/node-fetch-virtual-7f26b10931/0/cache/node-fetch-npm-2.6.7-777aa2a6df-8d816ffd1e.zip/node_modules/node-fetch/",\
"packageDependencies": [\
["node-fetch", "virtual:15e88f013aab7f0ee21b80b2aacd9c758bcffd83a3a22c6e1971f032f68acc65ca544062c16a8bf5a5d2be6356f854582c1d469e633c7c65852e00a36d721d5f#npm:2.6.7"],\
["@types/encoding", null],\
["encoding", null],\
["whatwg-url", "npm:5.0.0"]\
],\
"packagePeers": [\
"@types/encoding",\
"encoding"\
],\
"linkType": "HARD"\
}]\
]],\
["normalize-package-data", [\ ["normalize-package-data", [\
["npm:2.5.0", {\ ["npm:2.5.0", {\
"packageLocation": "./.yarn/cache/normalize-package-data-npm-2.5.0-af0345deed-7999112efc.zip/node_modules/normalize-package-data/",\ "packageLocation": "./.yarn/cache/normalize-package-data-npm-2.5.0-af0345deed-7999112efc.zip/node_modules/normalize-package-data/",\
@ -3397,6 +3681,25 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
"linkType": "HARD"\ "linkType": "HARD"\
}]\ }]\
]],\ ]],\
["pvtsutils", [\
["npm:1.3.2", {\
"packageLocation": "./.yarn/cache/pvtsutils-npm-1.3.2-e1483da905-9b81556113.zip/node_modules/pvtsutils/",\
"packageDependencies": [\
["pvtsutils", "npm:1.3.2"],\
["tslib", "npm:2.4.1"]\
],\
"linkType": "HARD"\
}]\
]],\
["pvutils", [\
["npm:1.1.3", {\
"packageLocation": "./.yarn/cache/pvutils-npm-1.1.3-da8b07d6cf-2ee26a9e51.zip/node_modules/pvutils/",\
"packageDependencies": [\
["pvutils", "npm:1.1.3"]\
],\
"linkType": "HARD"\
}]\
]],\
["queue-microtask", [\ ["queue-microtask", [\
["npm:1.2.3", {\ ["npm:1.2.3", {\
"packageLocation": "./.yarn/cache/queue-microtask-npm-1.2.3-fcc98e4e2d-b676f8c040.zip/node_modules/queue-microtask/",\ "packageLocation": "./.yarn/cache/queue-microtask-npm-1.2.3-fcc98e4e2d-b676f8c040.zip/node_modules/queue-microtask/",\
@ -3946,15 +4249,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
"linkType": "HARD"\ "linkType": "HARD"\
}]\ }]\
]],\ ]],\
["tr46", [\
["npm:0.0.3", {\
"packageLocation": "./.yarn/cache/tr46-npm-0.0.3-de53018915-726321c5ea.zip/node_modules/tr46/",\
"packageDependencies": [\
["tr46", "npm:0.0.3"]\
],\
"linkType": "HARD"\
}]\
]],\
["tsconfig-paths", [\ ["tsconfig-paths", [\
["npm:3.14.1", {\ ["npm:3.14.1", {\
"packageLocation": "./.yarn/cache/tsconfig-paths-npm-3.14.1-17a815b5c5-8afa01c673.zip/node_modules/tsconfig-paths/",\ "packageLocation": "./.yarn/cache/tsconfig-paths-npm-3.14.1-17a815b5c5-8afa01c673.zip/node_modules/tsconfig-paths/",\
@ -4021,17 +4315,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
"linkType": "HARD"\ "linkType": "HARD"\
}]\ }]\
]],\ ]],\
["twitter-api-sdk", [\
["npm:1.2.1", {\
"packageLocation": "./.yarn/cache/twitter-api-sdk-npm-1.2.1-15e88f013a-e931578087.zip/node_modules/twitter-api-sdk/",\
"packageDependencies": [\
["twitter-api-sdk", "npm:1.2.1"],\
["abort-controller", "npm:3.0.0"],\
["node-fetch", "virtual:15e88f013aab7f0ee21b80b2aacd9c758bcffd83a3a22c6e1971f032f68acc65ca544062c16a8bf5a5d2be6356f854582c1d469e633c7c65852e00a36d721d5f#npm:2.6.7"]\
],\
"linkType": "HARD"\
}]\
]],\
["type-check", [\ ["type-check", [\
["npm:0.4.0", {\ ["npm:0.4.0", {\
"packageLocation": "./.yarn/cache/type-check-npm-0.4.0-60565800ce-ec688ebfc9.zip/node_modules/type-check/",\ "packageLocation": "./.yarn/cache/type-check-npm-0.4.0-60565800ce-ec688ebfc9.zip/node_modules/type-check/",\
@ -4108,22 +4391,16 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
"linkType": "HARD"\ "linkType": "HARD"\
}]\ }]\
]],\ ]],\
["webidl-conversions", [\ ["webcrypto-core", [\
["npm:3.0.1", {\ ["npm:1.7.5", {\
"packageLocation": "./.yarn/cache/webidl-conversions-npm-3.0.1-60310f6a2b-c92a0a6ab9.zip/node_modules/webidl-conversions/",\ "packageLocation": "./.yarn/cache/webcrypto-core-npm-1.7.5-4734fab0f3-f6e529ca5c.zip/node_modules/webcrypto-core/",\
"packageDependencies": [\ "packageDependencies": [\
["webidl-conversions", "npm:3.0.1"]\ ["webcrypto-core", "npm:1.7.5"],\
],\ ["@peculiar/asn1-schema", "npm:2.3.3"],\
"linkType": "HARD"\ ["@peculiar/json-schema", "npm:1.1.12"],\
}]\ ["asn1js", "npm:3.0.5"],\
]],\ ["pvtsutils", "npm:1.3.2"],\
["whatwg-url", [\ ["tslib", "npm:2.4.1"]\
["npm:5.0.0", {\
"packageLocation": "./.yarn/cache/whatwg-url-npm-5.0.0-374fb45e60-b8daed4ad3.zip/node_modules/whatwg-url/",\
"packageDependencies": [\
["whatwg-url", "npm:5.0.0"],\
["tr46", "npm:0.0.3"],\
["webidl-conversions", "npm:3.0.1"]\
],\ ],\
"linkType": "HARD"\ "linkType": "HARD"\
}]\ }]\

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -1,8 +0,0 @@
import { auth } from "twitter-api-sdk";
export const authClient = new auth.OAuth2User({
client_id: process.env.TWITTER_CLIENT_ID ?? "",
client_secret: process.env.TWITTER_CLIENT_SECRET,
callback: process.env.TWITTER_AUTH_CALLBACK_URI ?? "",
scopes: ["users.read", "offline.access"],
});

9
constants/twitter.ts Normal file
View File

@ -0,0 +1,9 @@
export const twitterOAuthBaseUrl = "https://twitter.com/i/oauth2/authorize";
export const twitterOAuthScopes = [
"users.read",
"tweet.read",
"offline.access",
];
export const twitterApiBaseUrl = "https://api.twitter.com/2";

7
iron.config.ts Normal file
View File

@ -0,0 +1,7 @@
export const ironOptions = {
cookieName: "twitter_verifier",
password: process.env.IRON_PASSWORD ?? "",
cookieOptions: {
secure: process.env.NODE_ENV === "production",
},
};

View File

@ -10,10 +10,11 @@
"lint": "next lint" "lint": "next lint"
}, },
"dependencies": { "dependencies": {
"crypto": "^1.0.1",
"iron-session": "^6.3.1",
"next": "13.0.5", "next": "13.0.5",
"react": "18.2.0", "react": "18.2.0",
"react-dom": "18.2.0", "react-dom": "18.2.0"
"twitter-api-sdk": "^1.2.1"
}, },
"devDependencies": { "devDependencies": {
"@next/eslint-plugin-next": "^13.0.5", "@next/eslint-plugin-next": "^13.0.5",

View File

@ -1,18 +1,66 @@
import type { NextApiRequest, NextApiResponse } from "next"; import type { NextApiRequest, NextApiResponse } from "next";
import { authClient } from "../../../client/twitter"; import { withIronSessionApiRoute } from "iron-session/next";
import { request } from "../../../utils/url";
import { ironOptions } from "../../../iron.config";
import { twitterApiBaseUrl } from "../../../constants/twitter";
export default async function handler( interface TwitterOAuth2TokenData {
token_type: string;
expires_in: number;
access_token: string;
scope: string;
refresh_token: string;
}
export default withIronSessionApiRoute(async function handler(
req: NextApiRequest, req: NextApiRequest,
res: NextApiResponse, res: NextApiResponse,
) { ) {
try { try {
if (
!process.env.TWITTER_CLIENT_ID ||
!process.env.TWITTER_CLIENT_SECRET ||
!process.env.TWITTER_AUTH_CALLBACK_URI
) {
return res
.status(500)
.send(
"Twitter app client id or client secret or callback URI is not set",
);
}
if (!req.session.code_verifier) {
return res.status(401).send("No OAuth2.0 code verifier");
}
const { code, state } = req.query; const { code, state } = req.query;
if (state !== process.env.TWITTER_AUTH_STATE) { if (state !== process.env.TWITTER_AUTH_STATE) {
return res.status(500).send("State isn't matching"); return res.status(401).send("State isn't matching");
} }
const { token } = await authClient.requestAccessToken(code as string);
res.status(200).json(token); const params = new URLSearchParams();
params.append("grant_type", "authorization_code");
params.append("code", code as string);
params.append("redirect_uri", process.env.TWITTER_AUTH_CALLBACK_URI);
params.append("code_verifier", req.session.code_verifier);
const tokenData = await request<TwitterOAuth2TokenData>(
`${twitterApiBaseUrl}/oauth2/token`,
{
method: "post",
headers: {
"Content-Type": "application/x-www-form-urlencoded",
Authorization: `Basic ${Buffer.from(
`${process.env.TWITTER_CLIENT_ID}:${process.env.TWITTER_CLIENT_SECRET}`,
).toString("base64")}`,
},
body: params,
},
);
res.status(200).json({
accessToken: tokenData.access_token,
});
} catch (error) { } catch (error) {
console.log(error); console.log(error);
} }
} },
ironOptions);

View File

@ -1,7 +1,18 @@
import type { NextApiRequest, NextApiResponse } from "next"; import type { NextApiRequest, NextApiResponse } from "next";
import { authClient } from "../../../client/twitter"; import crypto from "crypto";
import { withIronSessionApiRoute } from "iron-session/next";
import { base64URLEncode } from "../../../utils/encoding";
import { buildQueryString } from "../../../utils/url";
import { ironOptions } from "../../../iron.config";
import {
twitterOAuthBaseUrl,
twitterOAuthScopes,
} from "../../../constants/twitter";
export default function handler(req: NextApiRequest, res: NextApiResponse) { export default withIronSessionApiRoute(async function handler(
req: NextApiRequest,
res: NextApiResponse,
) {
if ( if (
!process.env.TWITTER_AUTH_STATE || !process.env.TWITTER_AUTH_STATE ||
!process.env.TWITTER_AUTH_CODE_CHALLENGE !process.env.TWITTER_AUTH_CODE_CHALLENGE
@ -9,10 +20,30 @@ export default function handler(req: NextApiRequest, res: NextApiResponse) {
return res.status(500).send("No state or code_challenge"); return res.status(500).send("No state or code_challenge");
} }
const authUrl = authClient.generateAuthURL({ const codeVerifier = base64URLEncode(crypto.randomBytes(32));
req.session.code_verifier = codeVerifier;
await req.session.save();
const codeChallenge = base64URLEncode(
crypto.createHash("sha256").update(codeVerifier).digest(),
);
const authUrlObj = new URL(twitterOAuthBaseUrl);
authUrlObj.search = buildQueryString({
client_id: process.env.TWITTER_CLIENT_ID,
redirect_uri: process.env.TWITTER_AUTH_CALLBACK_URI,
state: process.env.TWITTER_AUTH_STATE, state: process.env.TWITTER_AUTH_STATE,
code_challenge: process.env.TWITTER_AUTH_CODE_CHALLENGE, scope: twitterOAuthScopes.join(" "),
code_challenge_method: "plain", response_type: "code",
code_challenge_method: "s256",
code_challenge: codeChallenge,
}); });
const authUrl = authUrlObj.toString();
res.status(200).json({ authUrl }); res.status(200).json({ authUrl });
},
ironOptions);
declare module "iron-session" {
interface IronSessionData {
code_verifier?: string;
}
} }

View File

@ -1,5 +1,4 @@
import styles from "../styles/Home.module.css"; import styles from "../styles/Home.module.css";
import { useEffect } from "react";
interface AuthResponse { interface AuthResponse {
authUrl: string; authUrl: string;
@ -7,9 +6,9 @@ interface AuthResponse {
export default function Home() { export default function Home() {
const handleSignInWithTwitter = async () => { const handleSignInWithTwitter = async () => {
const response: AuthResponse = await (await fetch("/api/auth")).json(); const { authUrl }: AuthResponse = await (await fetch("/api/auth")).json();
window.location.href = response.authUrl; window.location.href = authUrl;
}; };
return ( return (

View File

@ -1,18 +1,18 @@
import { useEffect, useState } from "react"; import { useEffect, useState } from "react";
interface AccessTokenResponse { interface AccessTokenResponse {
access_token: string; accessToken: string;
} }
export default function VerificationPage() { export default function VerificationPage() {
const [accessToken, setAccessToken] = useState<string>(); const [accessToken, setAccessToken] = useState<string>();
const fetchAccessToken = async (state: string, code: string) => { const fetchAccessToken = async (state: string, code: string) => {
const response: AccessTokenResponse = await ( const { accessToken }: AccessTokenResponse = await (
await fetch(`/api/auth/access-token?state=${state}&code=${code}`) await fetch(`/api/auth/access-token?state=${state}&code=${code}`)
).json(); ).json();
setAccessToken(response.access_token); setAccessToken(accessToken);
}; };
useEffect(() => { useEffect(() => {

7
utils/encoding.ts Normal file
View File

@ -0,0 +1,7 @@
export function base64URLEncode(str: Buffer) {
return str
.toString("base64")
.replace(/\+/g, "-")
.replace(/\//g, "_")
.replace(/=/g, "");
}

18
utils/url.ts Normal file
View File

@ -0,0 +1,18 @@
export function request<TResponse>(
url: string,
config: RequestInit = {},
): Promise<TResponse> {
return fetch(url, config)
.then((response) => response.json())
.then((data) => data as TResponse);
}
export function buildQueryString(query: Record<string, any>): string {
return Object.entries(query)
.map(([key, value]) =>
key && value
? `${encodeURIComponent(key)}=${encodeURIComponent(value)}`
: "",
)
.join("&");
}

368
yarn.lock
View File

@ -238,6 +238,39 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@peculiar/asn1-schema@npm:^2.1.6, @peculiar/asn1-schema@npm:^2.3.0":
version: 2.3.3
resolution: "@peculiar/asn1-schema@npm:2.3.3"
dependencies:
asn1js: ^3.0.5
pvtsutils: ^1.3.2
tslib: ^2.4.0
checksum: 2b1902543ec65d677c709f05a6a845b033490444dd7c9cbfba22290a26623c55f53a13995f8401cdb67e36b8182d55ca9278d50dd3f2d9ae757fbd9ddadab927
languageName: node
linkType: hard
"@peculiar/json-schema@npm:^1.1.12":
version: 1.1.12
resolution: "@peculiar/json-schema@npm:1.1.12"
dependencies:
tslib: ^2.0.0
checksum: b26ececdc23c5ef25837f8be8d1eb5e1c8bb6e9ae7227ac59ffea57fff56bd05137734e7685e9100595d3d88d906dff638ef8d1df54264c388d3eac1b05aa060
languageName: node
linkType: hard
"@peculiar/webcrypto@npm:^1.4.0":
version: 1.4.1
resolution: "@peculiar/webcrypto@npm:1.4.1"
dependencies:
"@peculiar/asn1-schema": ^2.3.0
"@peculiar/json-schema": ^1.1.12
pvtsutils: ^1.3.2
tslib: ^2.4.1
webcrypto-core: ^1.7.4
checksum: cfcd49f6bd199016de83445f1786b17c49d02aee74b400e7e03ba3bc3707457bdebd23bbaba0e2ff3becdcd769d71b79ec64ae35e0acb80b4ab3ed6326ab111c
languageName: node
linkType: hard
"@pkgr/utils@npm:^2.3.1": "@pkgr/utils@npm:^2.3.1":
version: 2.3.1 version: 2.3.1
resolution: "@pkgr/utils@npm:2.3.1" resolution: "@pkgr/utils@npm:2.3.1"
@ -268,6 +301,60 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@types/accepts@npm:*":
version: 1.3.5
resolution: "@types/accepts@npm:1.3.5"
dependencies:
"@types/node": "*"
checksum: 590b7580570534a640510c071e09074cf63b5958b237a728f94322567350aea4d239f8a9d897a12b15c856b992ee4d7907e9812bb079886af2c00714e7fb3f60
languageName: node
linkType: hard
"@types/body-parser@npm:*":
version: 1.19.2
resolution: "@types/body-parser@npm:1.19.2"
dependencies:
"@types/connect": "*"
"@types/node": "*"
checksum: e17840c7d747a549f00aebe72c89313d09fbc4b632b949b2470c5cb3b1cb73863901ae84d9335b567a79ec5efcfb8a28ff8e3f36bc8748a9686756b6d5681f40
languageName: node
linkType: hard
"@types/connect@npm:*":
version: 3.4.35
resolution: "@types/connect@npm:3.4.35"
dependencies:
"@types/node": "*"
checksum: fe81351470f2d3165e8b12ce33542eef89ea893e36dd62e8f7d72566dfb7e448376ae962f9f3ea888547ce8b55a40020ca0e01d637fab5d99567673084542641
languageName: node
linkType: hard
"@types/content-disposition@npm:*":
version: 0.5.5
resolution: "@types/content-disposition@npm:0.5.5"
checksum: fdf7379db1d509990bcf9a21d85f05aad878596f28b1418f9179f6436cb22513262c670ce88c6055054a7f5804a9303eeacb70aa59a5e11ffdc1434559db9692
languageName: node
linkType: hard
"@types/cookie@npm:^0.5.1":
version: 0.5.1
resolution: "@types/cookie@npm:0.5.1"
checksum: 9a8d60fc84797122bc399d6bd330fe5780dc7aab032321de705049ea925339f74658bfa418de483a625d51858770efef58df633ff2e20f1bdf7fbd74a52847e2
languageName: node
linkType: hard
"@types/cookies@npm:*":
version: 0.7.7
resolution: "@types/cookies@npm:0.7.7"
dependencies:
"@types/connect": "*"
"@types/express": "*"
"@types/keygrip": "*"
"@types/node": "*"
checksum: d3759efc1182cb0651808570ae13638677b67b0ea724eef7b174e58ffe6ea044b62c7c2715e532f76f88fce4dd8101ed32ac6fbb73226db654017924e8a2a1e6
languageName: node
linkType: hard
"@types/eslint@npm:^8.4.10": "@types/eslint@npm:^8.4.10":
version: 8.4.10 version: 8.4.10
resolution: "@types/eslint@npm:8.4.10" resolution: "@types/eslint@npm:8.4.10"
@ -285,6 +372,29 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@types/express-serve-static-core@npm:^4.17.18":
version: 4.17.31
resolution: "@types/express-serve-static-core@npm:4.17.31"
dependencies:
"@types/node": "*"
"@types/qs": "*"
"@types/range-parser": "*"
checksum: 009bfbe1070837454a1056aa710d0390ee5fb8c05dfe5a1691cc3e2ca88dc256f80e1ca27cb51a978681631d2f6431bfc9ec352ea46dd0c6eb183d0170bde5df
languageName: node
linkType: hard
"@types/express@npm:*, @types/express@npm:^4.17.13":
version: 4.17.14
resolution: "@types/express@npm:4.17.14"
dependencies:
"@types/body-parser": "*"
"@types/express-serve-static-core": ^4.17.18
"@types/qs": "*"
"@types/serve-static": "*"
checksum: 15c1af46d02de834e4a225eccaa9d85c0370fdbb3ed4e1bc2d323d24872309961542b993ae236335aeb3e278630224a6ea002078d39e651d78a3b0356b1eaa79
languageName: node
linkType: hard
"@types/glob@npm:^7.1.1": "@types/glob@npm:^7.1.1":
version: 7.2.0 version: 7.2.0
resolution: "@types/glob@npm:7.2.0" resolution: "@types/glob@npm:7.2.0"
@ -295,6 +405,20 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@types/http-assert@npm:*":
version: 1.5.3
resolution: "@types/http-assert@npm:1.5.3"
checksum: 9553e5a0b8bcfdac4b51d3fa3b89a91b5450171861a667a5b4c47204e0f4a1ca865d97396e6ceaf220e87b64d06b7a8bad7bfba15ef97acb41a87507c9940dbc
languageName: node
linkType: hard
"@types/http-errors@npm:*":
version: 2.0.1
resolution: "@types/http-errors@npm:2.0.1"
checksum: 3bb0c50b0a652e679a84c30cd0340d696c32ef6558518268c238840346c077f899315daaf1c26c09c57ddd5dc80510f2a7f46acd52bf949e339e35ed3ee9654f
languageName: node
linkType: hard
"@types/json-schema@npm:*, @types/json-schema@npm:^7.0.9": "@types/json-schema@npm:*, @types/json-schema@npm:^7.0.9":
version: 7.0.11 version: 7.0.11
resolution: "@types/json-schema@npm:7.0.11" resolution: "@types/json-schema@npm:7.0.11"
@ -309,6 +433,45 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@types/keygrip@npm:*":
version: 1.0.2
resolution: "@types/keygrip@npm:1.0.2"
checksum: 60bc2738a4f107070ee3d96f44709cb38f3a96c7ccabab09f56c1b2b4d85f869fd8fb9f1f2937e863d0e9e781f005c2223b823bf32b859185b4f52370c352669
languageName: node
linkType: hard
"@types/koa-compose@npm:*":
version: 3.2.5
resolution: "@types/koa-compose@npm:3.2.5"
dependencies:
"@types/koa": "*"
checksum: 5d1147c4b057eb158195f442f0384f06503f3e69dba99fb517b30a05261a9f92928945c12bb1cfc17a5b7d60db003f38b455a3a9b125f12e4fc81fffa396b3cf
languageName: node
linkType: hard
"@types/koa@npm:*, @types/koa@npm:^2.13.5":
version: 2.13.5
resolution: "@types/koa@npm:2.13.5"
dependencies:
"@types/accepts": "*"
"@types/content-disposition": "*"
"@types/cookies": "*"
"@types/http-assert": "*"
"@types/http-errors": "*"
"@types/keygrip": "*"
"@types/koa-compose": "*"
"@types/node": "*"
checksum: e3b634d934b79ce8f394bf4130511596081f9c073dbfb4309aa32e4c421c47049a002b65111f8d9687eabec55d5a27b1b9ae0699afa83894cb7032c3536bfa17
languageName: node
linkType: hard
"@types/mime@npm:*":
version: 3.0.1
resolution: "@types/mime@npm:3.0.1"
checksum: 4040fac73fd0cea2460e29b348c1a6173da747f3a87da0dbce80dd7a9355a3d0e51d6d9a401654f3e5550620e3718b5a899b2ec1debf18424e298a2c605346e7
languageName: node
linkType: hard
"@types/minimatch@npm:*": "@types/minimatch@npm:*":
version: 5.1.2 version: 5.1.2
resolution: "@types/minimatch@npm:5.1.2" resolution: "@types/minimatch@npm:5.1.2"
@ -323,6 +486,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@types/node@npm:^17.0.41":
version: 17.0.45
resolution: "@types/node@npm:17.0.45"
checksum: aa04366b9103b7d6cfd6b2ef64182e0eaa7d4462c3f817618486ea0422984c51fc69fd0d436eae6c9e696ddfdbec9ccaa27a917f7c2e8c75c5d57827fe3d95e8
languageName: node
linkType: hard
"@types/normalize-package-data@npm:^2.4.0": "@types/normalize-package-data@npm:^2.4.0":
version: 2.4.1 version: 2.4.1
resolution: "@types/normalize-package-data@npm:2.4.1" resolution: "@types/normalize-package-data@npm:2.4.1"
@ -337,6 +507,20 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@types/qs@npm:*":
version: 6.9.7
resolution: "@types/qs@npm:6.9.7"
checksum: 7fd6f9c25053e9b5bb6bc9f9f76c1d89e6c04f7707a7ba0e44cc01f17ef5284adb82f230f542c2d5557d69407c9a40f0f3515e8319afd14e1e16b5543ac6cdba
languageName: node
linkType: hard
"@types/range-parser@npm:*":
version: 1.2.4
resolution: "@types/range-parser@npm:1.2.4"
checksum: b7c0dfd5080a989d6c8bb0b6750fc0933d9acabeb476da6fe71d8bdf1ab65e37c136169d84148034802f48378ab94e3c37bb4ef7656b2bec2cb9c0f8d4146a95
languageName: node
linkType: hard
"@types/react-dom@npm:18.0.9": "@types/react-dom@npm:18.0.9":
version: 18.0.9 version: 18.0.9
resolution: "@types/react-dom@npm:18.0.9" resolution: "@types/react-dom@npm:18.0.9"
@ -371,6 +555,16 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@types/serve-static@npm:*":
version: 1.15.0
resolution: "@types/serve-static@npm:1.15.0"
dependencies:
"@types/mime": "*"
"@types/node": "*"
checksum: b6ac93d471fb0f53ddcac1f9b67572a09cd62806f7db5855244b28f6f421139626f24799392566e97d1ffc61b12f9de7f30380c39fcae3c8a161fe161d44edf2
languageName: node
linkType: hard
"@typescript-eslint/eslint-plugin@npm:^5.45.0": "@typescript-eslint/eslint-plugin@npm:^5.45.0":
version: 5.45.0 version: 5.45.0
resolution: "@typescript-eslint/eslint-plugin@npm:5.45.0" resolution: "@typescript-eslint/eslint-plugin@npm:5.45.0"
@ -491,15 +685,6 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"abort-controller@npm:^3.0.0":
version: 3.0.0
resolution: "abort-controller@npm:3.0.0"
dependencies:
event-target-shim: ^5.0.0
checksum: 170bdba9b47b7e65906a28c8ce4f38a7a369d78e2271706f020849c1bfe0ee2067d4261df8bbb66eb84f79208fd5b710df759d64191db58cfba7ce8ef9c54b75
languageName: node
linkType: hard
"acorn-jsx@npm:^5.3.2": "acorn-jsx@npm:^5.3.2":
version: 5.3.2 version: 5.3.2
resolution: "acorn-jsx@npm:5.3.2" resolution: "acorn-jsx@npm:5.3.2"
@ -629,6 +814,17 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"asn1js@npm:^3.0.1, asn1js@npm:^3.0.5":
version: 3.0.5
resolution: "asn1js@npm:3.0.5"
dependencies:
pvtsutils: ^1.3.2
pvutils: ^1.1.3
tslib: ^2.4.0
checksum: 3b6af1bbadd5762ef8ead5daf2f6bda1bc9e23bc825c4dcc996aa1f9521ad7390a64028565d95d98090d69c8431f004c71cccb866004759169d7c203cf9075eb
languageName: node
linkType: hard
"ast-types-flow@npm:^0.0.7": "ast-types-flow@npm:^0.0.7":
version: 0.0.7 version: 0.0.7
resolution: "ast-types-flow@npm:0.0.7" resolution: "ast-types-flow@npm:0.0.7"
@ -657,6 +853,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"base64-js@npm:^1.3.1":
version: 1.5.1
resolution: "base64-js@npm:1.5.1"
checksum: 669632eb3745404c2f822a18fc3a0122d2f9a7a13f7fb8b5823ee19d1d2ff9ee5b52c53367176ea4ad093c332fd5ab4bd0ebae5a8e27917a4105a4cfc86b1005
languageName: node
linkType: hard
"brace-expansion@npm:^1.1.7": "brace-expansion@npm:^1.1.7":
version: 1.1.11 version: 1.1.11
resolution: "brace-expansion@npm:1.1.11" resolution: "brace-expansion@npm:1.1.11"
@ -676,6 +879,16 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"buffer@npm:^6":
version: 6.0.3
resolution: "buffer@npm:6.0.3"
dependencies:
base64-js: ^1.3.1
ieee754: ^1.2.1
checksum: 5ad23293d9a731e4318e420025800b42bf0d264004c0286c8cc010af7a270c7a0f6522e84f54b9ad65cbd6db20b8badbfd8d2ebf4f80fa03dab093b89e68c3f9
languageName: node
linkType: hard
"builtin-modules@npm:^3.3.0": "builtin-modules@npm:^3.3.0":
version: 3.3.0 version: 3.3.0
resolution: "builtin-modules@npm:3.3.0" resolution: "builtin-modules@npm:3.3.0"
@ -797,6 +1010,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"cookie@npm:^0.5.0":
version: 0.5.0
resolution: "cookie@npm:0.5.0"
checksum: 1f4bd2ca5765f8c9689a7e8954183f5332139eb72b6ff783d8947032ec1fdf43109852c178e21a953a30c0dd42257828185be01b49d1eb1a67fd054ca588a180
languageName: node
linkType: hard
"core-js-pure@npm:^3.25.1": "core-js-pure@npm:^3.25.1":
version: 3.26.1 version: 3.26.1
resolution: "core-js-pure@npm:3.26.1" resolution: "core-js-pure@npm:3.26.1"
@ -815,6 +1035,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"crypto@npm:^1.0.1":
version: 1.0.1
resolution: "crypto@npm:1.0.1"
checksum: 087fe3165bd94c333a49e6ed66a0193911f63eac38a24f379b3001a5fe260a59c413646e53a0f67875ba13902b2686d81dc703cb2c147a4ec727dcdc04e5645e
languageName: node
linkType: hard
"csstype@npm:^3.0.2": "csstype@npm:^3.0.2":
version: 3.1.1 version: 3.1.1
resolution: "csstype@npm:3.1.1" resolution: "csstype@npm:3.1.1"
@ -1380,13 +1607,6 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"event-target-shim@npm:^5.0.0":
version: 5.0.1
resolution: "event-target-shim@npm:5.0.1"
checksum: 1ffe3bb22a6d51bdeb6bf6f7cf97d2ff4a74b017ad12284cc9e6a279e727dc30a5de6bb613e5596ff4dc3e517841339ad09a7eec44266eccb1aa201a30448166
languageName: node
linkType: hard
"fast-deep-equal@npm:^3.1.1, fast-deep-equal@npm:^3.1.3": "fast-deep-equal@npm:^3.1.1, fast-deep-equal@npm:^3.1.3":
version: 3.1.3 version: 3.1.3
resolution: "fast-deep-equal@npm:3.1.3" resolution: "fast-deep-equal@npm:3.1.3"
@ -1759,6 +1979,7 @@ __metadata:
"@types/react-dom": 18.0.9 "@types/react-dom": 18.0.9
"@typescript-eslint/eslint-plugin": ^5.45.0 "@typescript-eslint/eslint-plugin": ^5.45.0
"@typescript-eslint/parser": ^5.45.0 "@typescript-eslint/parser": ^5.45.0
crypto: ^1.0.1
eslint: 8.28.0 eslint: 8.28.0
eslint-config-next: 13.0.5 eslint-config-next: 13.0.5
eslint-config-prettier: ^8.5.0 eslint-config-prettier: ^8.5.0
@ -1769,15 +1990,22 @@ __metadata:
eslint-plugin-react: ^7.31.11 eslint-plugin-react: ^7.31.11
eslint-plugin-react-hooks: ^4.6.0 eslint-plugin-react-hooks: ^4.6.0
eslint-plugin-unicorn: ^45.0.1 eslint-plugin-unicorn: ^45.0.1
iron-session: ^6.3.1
next: 13.0.5 next: 13.0.5
prettier: ^2.8.0 prettier: ^2.8.0
react: 18.2.0 react: 18.2.0
react-dom: 18.2.0 react-dom: 18.2.0
twitter-api-sdk: ^1.2.1
typescript: 4.9.3 typescript: 4.9.3
languageName: unknown languageName: unknown
linkType: soft linkType: soft
"ieee754@npm:^1.2.1":
version: 1.2.1
resolution: "ieee754@npm:1.2.1"
checksum: 5144c0c9815e54ada181d80a0b810221a253562422e7c6c3a60b1901154184f49326ec239d618c416c1c5945a2e197107aee8d986a3dd836b53dffefd99b5e7e
languageName: node
linkType: hard
"ignore@npm:^5.1.1, ignore@npm:^5.2.0": "ignore@npm:^5.1.1, ignore@npm:^5.2.0":
version: 5.2.1 version: 5.2.1
resolution: "ignore@npm:5.2.1" resolution: "ignore@npm:5.2.1"
@ -1837,6 +2065,41 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"iron-session@npm:^6.3.1":
version: 6.3.1
resolution: "iron-session@npm:6.3.1"
dependencies:
"@peculiar/webcrypto": ^1.4.0
"@types/cookie": ^0.5.1
"@types/express": ^4.17.13
"@types/koa": ^2.13.5
"@types/node": ^17.0.41
cookie: ^0.5.0
iron-webcrypto: ^0.2.5
peerDependencies:
express: ">=4"
koa: ">=2"
next: ">=10"
peerDependenciesMeta:
express:
optional: true
koa:
optional: true
next:
optional: true
checksum: 65f534187bd972a5fe6000bd24767e9f9718d7ee3bf071fb352836b553d1c01d83d3e34eb57d111c8275d30e81b741a94a38fb2a4104c8480018391016656636
languageName: node
linkType: hard
"iron-webcrypto@npm:^0.2.5":
version: 0.2.6
resolution: "iron-webcrypto@npm:0.2.6"
dependencies:
buffer: ^6
checksum: 8b32e4f494976ce3e44718df1f03ffd2e0168fbb79910797d1caca5899f55e854c1f3fd0baf8580fc1eba4d693b3228de85363bb38dd8d9a9721db19f83d1e7c
languageName: node
linkType: hard
"is-arrayish@npm:^0.2.1": "is-arrayish@npm:^0.2.1":
version: 0.2.1 version: 0.2.1
resolution: "is-arrayish@npm:0.2.1" resolution: "is-arrayish@npm:0.2.1"
@ -2380,20 +2643,6 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"node-fetch@npm:^2.6.1":
version: 2.6.7
resolution: "node-fetch@npm:2.6.7"
dependencies:
whatwg-url: ^5.0.0
peerDependencies:
encoding: ^0.1.0
peerDependenciesMeta:
encoding:
optional: true
checksum: 8d816ffd1ee22cab8301c7756ef04f3437f18dace86a1dae22cf81db8ef29c0bf6655f3215cb0cdb22b420b6fe141e64b26905e7f33f9377a7fa59135ea3e10b
languageName: node
linkType: hard
"normalize-package-data@npm:^2.5.0": "normalize-package-data@npm:^2.5.0":
version: 2.5.0 version: 2.5.0
resolution: "normalize-package-data@npm:2.5.0" resolution: "normalize-package-data@npm:2.5.0"
@ -2699,6 +2948,22 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"pvtsutils@npm:^1.3.2":
version: 1.3.2
resolution: "pvtsutils@npm:1.3.2"
dependencies:
tslib: ^2.4.0
checksum: 9b8155611363e2f40276879f2454e60204b45be0cd0482f9373f369308a2e9c76d5d74cdf661a3f5aae8022d75ea159eb0ba38ee78fc782ee3051e4722db98d0
languageName: node
linkType: hard
"pvutils@npm:^1.1.3":
version: 1.1.3
resolution: "pvutils@npm:1.1.3"
checksum: 2ee26a9e5176c348977d6ec00d8ee80bff62f51743b1c5fe8abeeb4c5d29d9959cdfe0ce146707a9e6801bce88190fed3002d720b072dc87d031c692820b44c9
languageName: node
linkType: hard
"queue-microtask@npm:^1.2.2": "queue-microtask@npm:^1.2.2":
version: 1.2.3 version: 1.2.3
resolution: "queue-microtask@npm:1.2.3" resolution: "queue-microtask@npm:1.2.3"
@ -3205,13 +3470,6 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"tr46@npm:~0.0.3":
version: 0.0.3
resolution: "tr46@npm:0.0.3"
checksum: 726321c5eaf41b5002e17ffbd1fb7245999a073e8979085dacd47c4b4e8068ff5777142fc6726d6ca1fd2ff16921b48788b87225cbc57c72636f6efa8efbffe3
languageName: node
linkType: hard
"tsconfig-paths@npm:^3.14.1": "tsconfig-paths@npm:^3.14.1":
version: 3.14.1 version: 3.14.1
resolution: "tsconfig-paths@npm:3.14.1" resolution: "tsconfig-paths@npm:3.14.1"
@ -3231,7 +3489,7 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"tslib@npm:^2.4.0": "tslib@npm:^2.0.0, tslib@npm:^2.4.0, tslib@npm:^2.4.1":
version: 2.4.1 version: 2.4.1
resolution: "tslib@npm:2.4.1" resolution: "tslib@npm:2.4.1"
checksum: 19480d6e0313292bd6505d4efe096a6b31c70e21cf08b5febf4da62e95c265c8f571f7b36fcc3d1a17e068032f59c269fab3459d6cd3ed6949eafecf64315fca checksum: 19480d6e0313292bd6505d4efe096a6b31c70e21cf08b5febf4da62e95c265c8f571f7b36fcc3d1a17e068032f59c269fab3459d6cd3ed6949eafecf64315fca
@ -3249,16 +3507,6 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"twitter-api-sdk@npm:^1.2.1":
version: 1.2.1
resolution: "twitter-api-sdk@npm:1.2.1"
dependencies:
abort-controller: ^3.0.0
node-fetch: ^2.6.1
checksum: e93157808725f3affb3de0d963a118ea418bb93345875ba6d360f891c889c3a65f70038d5d3c561bba140c3b202bb255af417ef698868b41d54a4ee9ff81437d
languageName: node
linkType: hard
"type-check@npm:^0.4.0, type-check@npm:~0.4.0": "type-check@npm:^0.4.0, type-check@npm:~0.4.0":
version: 0.4.0 version: 0.4.0
resolution: "type-check@npm:0.4.0" resolution: "type-check@npm:0.4.0"
@ -3340,20 +3588,16 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"webidl-conversions@npm:^3.0.0": "webcrypto-core@npm:^1.7.4":
version: 3.0.1 version: 1.7.5
resolution: "webidl-conversions@npm:3.0.1" resolution: "webcrypto-core@npm:1.7.5"
checksum: c92a0a6ab95314bde9c32e1d0a6dfac83b578f8fa5f21e675bc2706ed6981bc26b7eb7e6a1fab158e5ce4adf9caa4a0aee49a52505d4d13c7be545f15021b17c
languageName: node
linkType: hard
"whatwg-url@npm:^5.0.0":
version: 5.0.0
resolution: "whatwg-url@npm:5.0.0"
dependencies: dependencies:
tr46: ~0.0.3 "@peculiar/asn1-schema": ^2.1.6
webidl-conversions: ^3.0.0 "@peculiar/json-schema": ^1.1.12
checksum: b8daed4ad3356cc4899048a15b2c143a9aed0dfae1f611ebd55073310c7b910f522ad75d727346ad64203d7e6c79ef25eafd465f4d12775ca44b90fa82ed9e2c asn1js: ^3.0.1
pvtsutils: ^1.3.2
tslib: ^2.4.0
checksum: f6e529ca5c1175b8ccead3547f60efa7a1f8e247aaeab3bd4f096eb9fda11cfc8e6b6fb574bbc5696f608958c491a27e9682c89204412f73fb430e5fcbe9ebac
languageName: node languageName: node
linkType: hard linkType: hard