next-ssr-middleware 0.7.0 → 0.8.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/ReadMe.md CHANGED
@@ -14,6 +14,16 @@
14
14
  | `>=0.7` | ✅developing | `>=6.11` | `>=0.5` |
15
15
  | `<0.7` | ❌deprecated | `>=4 <6.11` | `<0.5` |
16
16
 
17
+ ## Middlewares
18
+
19
+ 1. Router
20
+ 2. Error logger
21
+ 3. JWT verifier
22
+ 4. Props cache
23
+ 5. i18n loader
24
+ 6. OAuth 2 signer (with common providers)
25
+ 1. GitHub
26
+
17
27
  ## Usage
18
28
 
19
29
  ### `pages/user/[id].tsx`
@@ -67,6 +77,9 @@ export default function UserDetailPage({
67
77
  ## Cases
68
78
 
69
79
  1. https://github.com/idea2app/Next-Bootstrap-ts
80
+ 2. https://github.com/kaiyuanshe/kaiyuanshe.github.io
81
+ 3. https://github.com/kaiyuanshe/OpenHackathon-Web
82
+ 4. https://github.com/kaiyuanshe/OSS-toolbox
70
83
 
71
84
  [1]: https://koajs.com/
72
85
  [2]: https://nextjs.org/
package/dist/compose.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.compose = void 0;
3
+ exports.compose = compose;
4
4
  var tslib_1 = require("tslib");
5
5
  function compose() {
6
6
  var _this = this;
@@ -23,5 +23,4 @@ function compose() {
23
23
  return first(context, next);
24
24
  });
25
25
  }
26
- exports.compose = compose;
27
26
  //# sourceMappingURL=compose.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"compose.js","sourceRoot":"","sources":["../source/compose.ts"],"names":[],"mappings":";;;;AAaA,SAAgB,OAAO;IAAvB,iBAcC;IAVC,qBAAkC;SAAlC,UAAkC,EAAlC,qBAAkC,EAAlC,IAAkC;QAAlC,gCAAkC;;IAChC,OAAO,CAAC,UAAA,OAAO;QACJ,IAAA,KAAK,GAAa,WAAW,GAAxB,EAAK,IAAI,GAAI,WAAW,SAAf,CAAgB;QAErC,IAAM,IAAI,GAAG;;;;4BACR,qBAAM,CAAA,MAAA,IAAI,CAAC,KAAK,EAAE,0CAAG,OAAO,EAAE,IAAI,CAAC,CAAA,EAAA;4BAApC,sBAAA,CAAC,SAAmC,CAAC;4BACpC,EAAE,KAAK,EAAE,EAAE,EAAkC,EAAA;;;aAAA,CAAC;QAEnD,OAAO,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAChC,CAAC,CAAM,CAAC;AACZ,CAAC;AAdD,0BAcC"}
1
+ {"version":3,"file":"compose.js","sourceRoot":"","sources":["../source/compose.ts"],"names":[],"mappings":";;AAaA,0BAcC;;AAdD,SAAgB,OAAO;IAAvB,iBAcC;IAVC,qBAAkC;SAAlC,UAAkC,EAAlC,qBAAkC,EAAlC,IAAkC;QAAlC,gCAAkC;;IAChC,OAAO,CAAC,UAAA,OAAO;QACJ,IAAA,KAAK,GAAa,WAAW,GAAxB,EAAK,IAAI,GAAI,WAAW,SAAf,CAAgB;QAErC,IAAM,IAAI,GAAG;;;;4BACR,qBAAM,CAAA,MAAA,IAAI,CAAC,KAAK,EAAE,0CAAG,OAAO,EAAE,IAAI,CAAC,CAAA,EAAA;4BAApC,sBAAA,CAAC,SAAmC,CAAC;4BACpC,EAAE,KAAK,EAAE,EAAE,EAAkC,EAAA;;;aAAA,CAAC;QAEnD,OAAO,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAChC,CAAC,CAAM,CAAC;AACZ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from './local';
2
+ export * from './remote';
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ var tslib_1 = require("tslib");
4
+ tslib_1.__exportStar(require("./local"), exports);
5
+ tslib_1.__exportStar(require("./remote"), exports);
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../source/middleware/index.ts"],"names":[],"mappings":";;;AAAA,kDAAwB;AACxB,mDAAyB"}
@@ -1,9 +1,8 @@
1
- /// <reference types="node" />
2
1
  import { JwtPayload, VerifyOptions } from 'jsonwebtoken';
3
2
  import { TranslationModel } from 'mobx-i18n';
4
3
  import { GetServerSidePropsContext, GetServerSidePropsResult } from 'next';
5
4
  import { ParsedUrlQuery } from 'querystring';
6
- import { DataObject, Middleware } from './compose';
5
+ import { DataObject, Middleware } from '../compose';
7
6
  export declare function errorLogger<I extends DataObject, O extends DataObject = {}>(context: GetServerSidePropsContext<I>, next: () => Promise<GetServerSidePropsResult<O>>): Promise<GetServerSidePropsResult<O>>;
8
7
  export interface RouteProps<T extends ParsedUrlQuery = {}> {
9
8
  route: Pick<GetServerSidePropsContext<T>, 'resolvedUrl' | 'params' | 'query' | 'locales'>;
@@ -1,8 +1,13 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.translator = exports.cache = exports.jwtVerifier = exports.router = exports.errorLogger = void 0;
3
+ exports.errorLogger = errorLogger;
4
+ exports.router = router;
5
+ exports.jwtVerifier = jwtVerifier;
6
+ exports.cache = cache;
7
+ exports.translator = translator;
4
8
  var tslib_1 = require("tslib");
5
9
  var jsonwebtoken_1 = require("jsonwebtoken");
10
+ var koajax_1 = require("koajax");
6
11
  var mobx_i18n_1 = require("mobx-i18n");
7
12
  var web_utility_1 = require("web-utility");
8
13
  function errorLogger(context, next) {
@@ -17,16 +22,17 @@ function errorLogger(context, next) {
17
22
  case 2:
18
23
  error_1 = _a.sent();
19
24
  console.error(error_1);
20
- status_1 = error_1.status;
21
- if (status_1 === 404)
22
- return [2 /*return*/, { notFound: true, props: {} }];
25
+ if (error_1 instanceof koajax_1.HTTPError) {
26
+ status_1 = error_1.response.status;
27
+ if (status_1 === 404)
28
+ return [2 /*return*/, { notFound: true, props: {} }];
29
+ }
23
30
  throw error_1;
24
31
  case 3: return [2 /*return*/];
25
32
  }
26
33
  });
27
34
  });
28
35
  }
29
- exports.errorLogger = errorLogger;
30
36
  function router(context, next) {
31
37
  return tslib_1.__awaiter(this, void 0, void 0, function () {
32
38
  var options, resolvedUrl, params, query, locales;
@@ -40,38 +46,34 @@ function router(context, next) {
40
46
  });
41
47
  });
42
48
  }
43
- exports.router = router;
44
49
  function jwtVerifier(tokenKey, secretKey, options) {
45
50
  var _this = this;
46
51
  if (tokenKey === void 0) { tokenKey = 'token'; }
47
52
  if (secretKey === void 0) { secretKey = 'JWT_SECRET'; }
48
53
  if (options === void 0) { options = {}; }
49
- return function (_a, next) {
50
- var _b = _a.req, url = _b.url, cookies = _b.cookies;
51
- return tslib_1.__awaiter(_this, void 0, void 0, function () {
52
- var token, jwtPayload, data;
53
- return tslib_1.__generator(this, function (_c) {
54
- switch (_c.label) {
55
- case 0:
56
- token = cookies[tokenKey];
57
- try {
58
- jwtPayload = (0, jsonwebtoken_1.verify)(token, process.env[secretKey], options);
59
- }
60
- catch (error) {
61
- console.error(url, error);
62
- }
63
- return [4 /*yield*/, next()];
64
- case 1:
65
- data = _c.sent();
66
- if ('props' in data && jwtPayload)
67
- data.props['jwtPayload'] = jwtPayload;
68
- return [2 /*return*/, data];
69
- }
70
- });
54
+ return function (_a, next_1) { return tslib_1.__awaiter(_this, [_a, next_1], void 0, function (_b, next) {
55
+ var token, jwtPayload, data;
56
+ var _c = _b.req, url = _c.url, cookies = _c.cookies;
57
+ return tslib_1.__generator(this, function (_d) {
58
+ switch (_d.label) {
59
+ case 0:
60
+ token = cookies[tokenKey];
61
+ try {
62
+ jwtPayload = (0, jsonwebtoken_1.verify)(token, process.env[secretKey], options);
63
+ }
64
+ catch (error) {
65
+ console.error(url, error);
66
+ }
67
+ return [4 /*yield*/, next()];
68
+ case 1:
69
+ data = _d.sent();
70
+ if ('props' in data && jwtPayload)
71
+ data.props['jwtPayload'] = jwtPayload;
72
+ return [2 /*return*/, data];
73
+ }
71
74
  });
72
- };
75
+ }); };
73
76
  }
74
- exports.jwtVerifier = jwtVerifier;
75
77
  var serverRenderCache = {};
76
78
  function cache(oneInterval, allInterval) {
77
79
  var _this = this;
@@ -109,22 +111,21 @@ function cache(oneInterval, allInterval) {
109
111
  });
110
112
  }); });
111
113
  }
112
- exports.cache = cache;
113
114
  function translator(i18n) {
114
115
  var _this = this;
115
- return function (context, next) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
116
- var _a, language, languages;
117
- return tslib_1.__generator(this, function (_b) {
118
- switch (_b.label) {
116
+ return function (_a, next_1) { return tslib_1.__awaiter(_this, [_a, next_1], void 0, function (_b, next) {
117
+ var _c, language, languages;
118
+ var _d = _b.req, headers = _d.headers, cookies = _d.cookies;
119
+ return tslib_1.__generator(this, function (_e) {
120
+ switch (_e.label) {
119
121
  case 0:
120
- _a = context.req.cookies.language, language = _a === void 0 ? '' : _a, languages = (0, mobx_i18n_1.parseLanguageHeader)(context.req.headers['accept-language'] || '');
122
+ _c = cookies.language, language = _c === void 0 ? '' : _c, languages = (0, mobx_i18n_1.parseLanguageHeader)(headers['accept-language'] || '');
121
123
  return [4 /*yield*/, i18n.loadLanguages(tslib_1.__spreadArray([language], languages, true).filter(Boolean))];
122
124
  case 1:
123
- _b.sent();
125
+ _e.sent();
124
126
  return [2 /*return*/, next()];
125
127
  }
126
128
  });
127
129
  }); };
128
130
  }
129
- exports.translator = translator;
130
- //# sourceMappingURL=middleware.js.map
131
+ //# sourceMappingURL=local.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local.js","sourceRoot":"","sources":["../../source/middleware/local.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import { DataObject, Middleware } from '../compose';
2
+ export type OAuth2Ticket = {
3
+ code: string;
4
+ state?: string;
5
+ [key: string]: string;
6
+ };
7
+ export interface OAuth2Option {
8
+ signInURL: (pageURL: string) => string;
9
+ accessToken: (ticket: OAuth2Ticket) => Promise<string>;
10
+ userProfile: (token: string) => Promise<DataObject>;
11
+ tokenKey?: string;
12
+ }
13
+ export interface OAuth2Props<T extends DataObject> {
14
+ token: string;
15
+ user: T;
16
+ }
17
+ export declare function oauth2Signer<I extends DataObject, O extends DataObject = {}>({ signInURL, accessToken, userProfile, tokenKey }: OAuth2Option): Middleware<I, O>;
18
+ export type GitHubAPIOperation = 'admin' | 'write' | 'read' | 'delete';
19
+ export type GitHubOAuthScope = `repo${'' | ':status' | '_deployment' | ':invite'}` | 'public_repo' | 'security_events' | `${Exclude<GitHubAPIOperation, 'delete'>}:${'repo_hook' | 'org' | 'public_key' | 'gpg_key'}` | 'admin:org_hook' | 'gist' | 'notifications' | `user${'' | ':email' | ':follow'}` | `read:${'user' | 'project'}` | 'project' | 'delete_repo' | `${Exclude<GitHubAPIOperation, 'admin'>}:packages` | 'codespace' | 'workflow';
20
+ /**
21
+ * @see {@link https://docs.github.com/en/apps/oauth-apps/building-oauth-apps/authorizing-oauth-apps#web-application-flow}
22
+ */
23
+ export interface GitHubOAuthOption extends Partial<Record<'rootBaseURL' | 'apiBaseURL' | 'login', string>>, Record<'client_id' | 'client_secret', string> {
24
+ scopes?: GitHubOAuthScope[];
25
+ allow_signup?: boolean;
26
+ }
27
+ export declare function githubOAuth2<I extends DataObject, O extends DataObject = {}>({ rootBaseURL, apiBaseURL, client_id, client_secret, scopes, allow_signup }: GitHubOAuthOption): Middleware<I, O>;
@@ -0,0 +1,116 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.oauth2Signer = oauth2Signer;
4
+ exports.githubOAuth2 = githubOAuth2;
5
+ var tslib_1 = require("tslib");
6
+ var web_utility_1 = require("web-utility");
7
+ var DOMAIN = process.env.VERCEL_PROJECT_PRODUCTION_URL;
8
+ var Host = DOMAIN ? "https://".concat(DOMAIN) : 'http://127.0.0.1:3000';
9
+ function oauth2Signer(_a) {
10
+ var _this = this;
11
+ var signInURL = _a.signInURL, accessToken = _a.accessToken, userProfile = _a.userProfile, _b = _a.tokenKey, tokenKey = _b === void 0 ? 'token' : _b;
12
+ return function (_a, next_1) { return tslib_1.__awaiter(_this, [_a, next_1], void 0, function (_b, next) {
13
+ var token, pageURL, token_1, user, data, props, _c;
14
+ var _d = _b.req, url = _d.url, headers = _d.headers, cookies = _d.cookies, query = _b.query, res = _b.res;
15
+ return tslib_1.__generator(this, function (_e) {
16
+ switch (_e.label) {
17
+ case 0:
18
+ token = cookies[tokenKey];
19
+ pageURL = new URL(url || '/', headers['origin'] || Host) + '';
20
+ if (!query.code) return [3 /*break*/, 2];
21
+ return [4 /*yield*/, accessToken(query)];
22
+ case 1:
23
+ token_1 = _e.sent();
24
+ res.setHeader('Set-Cookie', "token=".concat(token_1, "; Path=/"));
25
+ return [2 /*return*/, {
26
+ redirect: {
27
+ destination: pageURL.split('?')[0],
28
+ permanent: false
29
+ },
30
+ props: {}
31
+ }];
32
+ case 2:
33
+ if (!token) return [3 /*break*/, 7];
34
+ _e.label = 3;
35
+ case 3:
36
+ _e.trys.push([3, 6, , 7]);
37
+ return [4 /*yield*/, userProfile(token)];
38
+ case 4:
39
+ user = _e.sent();
40
+ return [4 /*yield*/, next()];
41
+ case 5:
42
+ data = _e.sent();
43
+ props = 'props' in data
44
+ ? tslib_1.__assign(tslib_1.__assign({}, data.props), { token: token, user: user }) : {};
45
+ return [2 /*return*/, tslib_1.__assign(tslib_1.__assign({}, data), { props: props })];
46
+ case 6:
47
+ _c = _e.sent();
48
+ return [3 /*break*/, 7];
49
+ case 7: return [2 /*return*/, {
50
+ redirect: {
51
+ destination: signInURL(pageURL + ''),
52
+ permanent: false
53
+ },
54
+ props: {}
55
+ }];
56
+ }
57
+ });
58
+ }); };
59
+ }
60
+ function githubOAuth2(_a) {
61
+ var _this = this;
62
+ var _b = _a.rootBaseURL, rootBaseURL = _b === void 0 ? 'https://github.com' : _b, _c = _a.apiBaseURL, apiBaseURL = _c === void 0 ? 'https://api.github.com' : _c, client_id = _a.client_id, client_secret = _a.client_secret, scopes = _a.scopes, _d = _a.allow_signup, allow_signup = _d === void 0 ? true : _d;
63
+ return oauth2Signer({
64
+ signInURL: function (redirect_uri) {
65
+ return "https://github.com/login/oauth/authorize?".concat((0, web_utility_1.buildURLData)({
66
+ client_id: client_id,
67
+ scope: scopes === null || scopes === void 0 ? void 0 : scopes.join(' '),
68
+ allow_signup: allow_signup,
69
+ redirect_uri: redirect_uri
70
+ }));
71
+ },
72
+ accessToken: function (_a) { return tslib_1.__awaiter(_this, [_a], void 0, function (_b) {
73
+ var response, _c, error, access_token;
74
+ var code = _b.code;
75
+ return tslib_1.__generator(this, function (_d) {
76
+ switch (_d.label) {
77
+ case 0: return [4 /*yield*/, fetch(new URL('login/oauth/access_token', rootBaseURL), {
78
+ method: 'POST',
79
+ headers: {
80
+ Accept: 'application/json',
81
+ 'Content-Type': 'application/json'
82
+ },
83
+ body: JSON.stringify({ client_id: client_id, client_secret: client_secret, code: code })
84
+ })];
85
+ case 1:
86
+ response = _d.sent();
87
+ return [4 /*yield*/, response.json()];
88
+ case 2:
89
+ _c = _d.sent(), error = _c.error, access_token = _c.access_token;
90
+ if (error)
91
+ throw new URIError(error);
92
+ return [2 /*return*/, access_token];
93
+ }
94
+ });
95
+ }); },
96
+ userProfile: function (token) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
97
+ var response;
98
+ return tslib_1.__generator(this, function (_a) {
99
+ switch (_a.label) {
100
+ case 0: return [4 /*yield*/, fetch(new URL('user', apiBaseURL), {
101
+ headers: {
102
+ Authorization: "Bearer ".concat(token),
103
+ Accept: 'application/json'
104
+ }
105
+ })];
106
+ case 1:
107
+ response = _a.sent();
108
+ if (response.status < 300)
109
+ return [2 /*return*/, response.json()];
110
+ throw new URIError('Invalid GitHub access token');
111
+ }
112
+ });
113
+ }); }
114
+ });
115
+ }
116
+ //# sourceMappingURL=remote.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remote.js","sourceRoot":"","sources":["../../source/middleware/remote.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "next-ssr-middleware",
3
- "version": "0.7.0",
3
+ "version": "0.8.7",
4
4
  "license": "LGPL-3.0-or-later",
5
5
  "author": "shiy2008@gmail.com",
6
6
  "description": "Koa-like middlewares for Next.js Server Side Rendering",
@@ -24,23 +24,23 @@
24
24
  "dependencies": {
25
25
  "jsonwebtoken": "^9.0.2",
26
26
  "mobx-i18n": "^0.5.0",
27
- "tslib": "^2.6.2",
28
- "web-utility": "^4.1.3"
27
+ "tslib": "^2.6.3",
28
+ "web-utility": "^4.4.0"
29
29
  },
30
30
  "peerDependencies": {
31
31
  "next": ">=9.3"
32
32
  },
33
33
  "devDependencies": {
34
- "@types/jsonwebtoken": "^9.0.5",
35
- "@types/node": "^18.19.10",
36
- "husky": "^9.0.7",
37
- "koajax": "^0.9.6",
38
- "lint-staged": "^15.2.0",
39
- "next": "^14.1.0",
34
+ "@types/jsonwebtoken": "^9.0.6",
35
+ "@types/node": "^18.19.45",
36
+ "husky": "^9.1.5",
37
+ "koajax": "^2.0.0",
38
+ "lint-staged": "^15.2.9",
39
+ "next": "^14.2.6",
40
40
  "open-cli": "^8.0.0",
41
- "prettier": "^3.2.4",
42
- "typedoc": "^0.25.7",
43
- "typescript": "~5.3.3"
41
+ "prettier": "^3.3.3",
42
+ "typedoc": "^0.26.6",
43
+ "typescript": "~5.5.4"
44
44
  },
45
45
  "prettier": {
46
46
  "singleQuote": true,
@@ -0,0 +1,2 @@
1
+ export * from './local';
2
+ export * from './remote';
@@ -5,7 +5,7 @@ import { GetServerSidePropsContext, GetServerSidePropsResult } from 'next';
5
5
  import { ParsedUrlQuery } from 'querystring';
6
6
  import { Day, Second } from 'web-utility';
7
7
 
8
- import { DataObject, Middleware } from './compose';
8
+ import { DataObject, Middleware } from '../compose';
9
9
 
10
10
  export async function errorLogger<
11
11
  I extends DataObject,
@@ -19,10 +19,11 @@ export async function errorLogger<
19
19
  } catch (error) {
20
20
  console.error(error);
21
21
 
22
- const { status } = error as HTTPError;
23
-
24
- if (status === 404) return { notFound: true, props: {} as O };
22
+ if (error instanceof HTTPError) {
23
+ const { status } = error.response;
25
24
 
25
+ if (status === 404) return { notFound: true, props: {} as O };
26
+ }
26
27
  throw error;
27
28
  }
28
29
  }
@@ -129,13 +130,12 @@ export function translator<I extends DataObject, O extends DataObject = {}>(
129
130
  i18n: TranslationModel<string, string>
130
131
  ): Middleware<I, O> {
131
132
  return async (
132
- context: GetServerSidePropsContext<I>,
133
+ { req: { headers, cookies } }: GetServerSidePropsContext<I>,
133
134
  next: () => Promise<GetServerSidePropsResult<O>>
134
135
  ) => {
135
- const { language = '' } = context.req.cookies,
136
- languages = parseLanguageHeader(
137
- context.req.headers['accept-language'] || ''
138
- );
136
+ const { language = '' } = cookies,
137
+ languages = parseLanguageHeader(headers['accept-language'] || '');
138
+
139
139
  await i18n.loadLanguages([language, ...languages].filter(Boolean));
140
140
 
141
141
  return next();
@@ -0,0 +1,144 @@
1
+ import { buildURLData } from 'web-utility';
2
+
3
+ import { DataObject, Middleware } from '../compose';
4
+
5
+ export type OAuth2Ticket = {
6
+ code: string;
7
+ state?: string;
8
+ [key: string]: string;
9
+ };
10
+
11
+ export interface OAuth2Option {
12
+ signInURL: (pageURL: string) => string;
13
+ accessToken: (ticket: OAuth2Ticket) => Promise<string>;
14
+ userProfile: (token: string) => Promise<DataObject>;
15
+ tokenKey?: string;
16
+ }
17
+
18
+ export interface OAuth2Props<T extends DataObject> {
19
+ token: string;
20
+ user: T;
21
+ }
22
+
23
+ const DOMAIN = process.env.VERCEL_PROJECT_PRODUCTION_URL;
24
+ const Host = DOMAIN ? `https://${DOMAIN}` : 'http://127.0.0.1:3000';
25
+
26
+ export function oauth2Signer<I extends DataObject, O extends DataObject = {}>({
27
+ signInURL,
28
+ accessToken,
29
+ userProfile,
30
+ tokenKey = 'token'
31
+ }: OAuth2Option): Middleware<I, O> {
32
+ return async ({ req: { url, headers, cookies }, query, res }, next) => {
33
+ const token = cookies[tokenKey];
34
+ const pageURL = new URL(url || '/', headers['origin'] || Host) + '';
35
+
36
+ if (query.code) {
37
+ const token = await accessToken(query as OAuth2Ticket);
38
+
39
+ res.setHeader('Set-Cookie', `token=${token}; Path=/`);
40
+
41
+ return {
42
+ redirect: {
43
+ destination: pageURL.split('?')[0],
44
+ permanent: false
45
+ },
46
+ props: {} as O
47
+ };
48
+ }
49
+ if (token)
50
+ try {
51
+ const user = await userProfile(token),
52
+ data = await next();
53
+ const props =
54
+ 'props' in data
55
+ ? { ...data.props, token, user }
56
+ : ({} as O);
57
+
58
+ return { ...data, props };
59
+ } catch {}
60
+
61
+ return {
62
+ redirect: {
63
+ destination: signInURL(pageURL + ''),
64
+ permanent: false
65
+ },
66
+ props: {} as O
67
+ };
68
+ };
69
+ }
70
+
71
+ export type GitHubAPIOperation = 'admin' | 'write' | 'read' | 'delete';
72
+
73
+ export type GitHubOAuthScope =
74
+ | `repo${'' | ':status' | '_deployment' | ':invite'}`
75
+ | 'public_repo'
76
+ | 'security_events'
77
+ | `${Exclude<GitHubAPIOperation, 'delete'>}:${'repo_hook' | 'org' | 'public_key' | 'gpg_key'}`
78
+ | 'admin:org_hook'
79
+ | 'gist'
80
+ | 'notifications'
81
+ | `user${'' | ':email' | ':follow'}`
82
+ | `read:${'user' | 'project'}`
83
+ | 'project'
84
+ | 'delete_repo'
85
+ | `${Exclude<GitHubAPIOperation, 'admin'>}:packages`
86
+ | 'codespace'
87
+ | 'workflow';
88
+ /**
89
+ * @see {@link https://docs.github.com/en/apps/oauth-apps/building-oauth-apps/authorizing-oauth-apps#web-application-flow}
90
+ */
91
+ export interface GitHubOAuthOption
92
+ extends Partial<Record<'rootBaseURL' | 'apiBaseURL' | 'login', string>>,
93
+ Record<'client_id' | 'client_secret', string> {
94
+ scopes?: GitHubOAuthScope[];
95
+ allow_signup?: boolean;
96
+ }
97
+
98
+ export function githubOAuth2<I extends DataObject, O extends DataObject = {}>({
99
+ rootBaseURL = 'https://github.com',
100
+ apiBaseURL = 'https://api.github.com',
101
+ client_id,
102
+ client_secret,
103
+ scopes,
104
+ allow_signup = true
105
+ }: GitHubOAuthOption) {
106
+ return oauth2Signer<I, O>({
107
+ signInURL: redirect_uri =>
108
+ `https://github.com/login/oauth/authorize?${buildURLData({
109
+ client_id,
110
+ scope: scopes?.join(' '),
111
+ allow_signup,
112
+ redirect_uri
113
+ })}`,
114
+ accessToken: async ({ code }) => {
115
+ const response = await fetch(
116
+ new URL('login/oauth/access_token', rootBaseURL),
117
+ {
118
+ method: 'POST',
119
+ headers: {
120
+ Accept: 'application/json',
121
+ 'Content-Type': 'application/json'
122
+ },
123
+ body: JSON.stringify({ client_id, client_secret, code })
124
+ }
125
+ );
126
+ const { error, access_token } = await response.json();
127
+
128
+ if (error) throw new URIError(error);
129
+
130
+ return access_token;
131
+ },
132
+ userProfile: async token => {
133
+ const response = await fetch(new URL('user', apiBaseURL), {
134
+ headers: {
135
+ Authorization: `Bearer ${token}`,
136
+ Accept: 'application/json'
137
+ }
138
+ });
139
+ if (response.status < 300) return response.json();
140
+
141
+ throw new URIError('Invalid GitHub access token');
142
+ }
143
+ });
144
+ }
@@ -1,14 +0,0 @@
1
- {
2
- "recommendations": [
3
- "yzhang.markdown-all-in-one",
4
- "redhat.vscode-yaml",
5
- "akamud.vscode-caniuse",
6
- "visualstudioexptteam.intellicode-api-usage-examples",
7
- "pflannery.vscode-versionlens",
8
- "christian-kohler.npm-intellisense",
9
- "esbenp.prettier-vscode",
10
- "eamodio.gitlens",
11
- "github.vscode-pull-request-github",
12
- "github.vscode-github-actions"
13
- ]
14
- }
@@ -1 +0,0 @@
1
- {"version":3,"file":"middleware.js","sourceRoot":"","sources":["../source/middleware.ts"],"names":[],"mappings":"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"}