next-ssr-middleware 0.10.0-rc.3 → 1.0.0

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
@@ -1,137 +1,165 @@
1
- # Next SSR middleware
2
-
3
- [Koa][1]-like middlewares for [Next.js][2] **Server Side Rendering**
4
-
5
- [![NPM Dependency](https://img.shields.io/librariesio/github/idea2app/Next-SSR-middleware.svg)][3]
6
- [![CI & CD](https://github.com/idea2app/Next-SSR-middleware/actions/workflows/main.yml/badge.svg)][4]
7
-
8
- [![NPM](https://nodei.co/npm/next-ssr-middleware.png?downloads=true&downloadRank=true&stars=true)][5]
9
-
10
- ## Versions
11
-
12
- | SemVer | status | Next.js | MobX | [MobX i18n][6] |
13
- | :----------: | :----------: | :-------: | :---------: | :------------: |
14
- | `>=0.9` | ✅developing | `>=15` | `>=6.11` | `>=0.5` |
15
- | `>=0.7 <0.9` | ❌deprecated | `>=9 <15` | `>=6.11` | `>=0.5` |
16
- | `<0.7` | ❌deprecated | `>=9 <15` | `>=4 <6.11` | `<0.5` |
17
-
18
- ## Middlewares
19
-
20
- 1. Router
21
- 2. Error logger
22
- 3. JWT verifier
23
- 4. Props cache
24
- 5. i18n loader
25
- 6. OAuth 2 signer (with common providers)
26
- 1. GitHub
27
-
28
- ## Usage
29
-
30
- ### Page router
31
-
32
- #### `pages/user/[id].tsx`
33
-
34
- ```tsx
35
- import {
36
- JWTProps,
37
- RouterProps,
38
- jwtVerifier,
39
- cache,
40
- errorLogger,
41
- router,
42
- translator
43
- } from 'next-ssr-middleware';
44
-
45
- import i18n from '../../model/Translation';
46
- import { User, UserModel } from '../../model/User';
47
-
48
- type UserDetailPageProps = User & JWTProps & RouterProps;
49
-
50
- export const getServerSideProps = compose<{ id: string }, UserDetailPageProps>(
51
- jwtVerifier(), // set `JWT_SECRET` in `.env.local` first
52
- cache(),
53
- errorLogger,
54
- router,
55
- translator(i18n),
56
- async ({ params }) => {
57
- const props = await new UserModel().getOne(params!.id);
58
-
59
- return { notFound: !props, props };
60
- }
61
- );
62
-
63
- export default function UserDetailPage({
64
- jwtPayload,
65
- route,
66
- name,
67
- summary
68
- }: UserDetailPageProps) {
69
- return (
70
- <>
71
- <h1>
72
- {name} - {route.params!.id}
73
- </h1>
74
- <p>{summary}</p>
75
- </>
76
- );
77
- }
78
- ```
79
-
80
- ### App router
81
-
82
- #### `middleware.ts`
83
-
84
- ```ts
85
- import { NextRequest, NextResponse } from 'next/server';
86
- import { parseHeaders } from 'next-ssr-middleware';
87
-
88
- export const config = {
89
- // Matcher ignoring `/_next/`, `/api/` & icons
90
- matcher: [
91
- '/((?!api|_next/static|_next/image|favicon.ico|apple-icon|icon).*)'
92
- ]
93
- };
94
- export const middleware = ({ headers }: NextRequest) =>
95
- NextResponse.next({ headers: parseHeaders(headers) });
96
- ```
97
-
98
- #### `app/page.tsx`
99
-
100
- ```tsx
101
- import { compose, withMiddleware, ServerProps } from 'next-ssr-middleware';
102
-
103
- const getServerSideProps = compose(async () => {
104
- const props = await (
105
- await fetch('https://api.github.com/orgs/idea2app')
106
- ).json();
107
-
108
- return { props };
109
- });
110
-
111
- const HomePage = withMiddleware(getServerSideProps, Home);
112
-
113
- export default HomePage;
114
-
115
- async function Home({ params, searchParams, ...props }: ServerProps) {
116
- return (
117
- <>
118
- <h1>Home</h1>
119
- <pre>{JSON.stringify(props, null, 4)}</pre>
120
- </>
121
- );
122
- }
123
- ```
124
-
125
- ## Cases
126
-
127
- 1. https://github.com/idea2app/Next-Bootstrap-ts
128
- 2. https://github.com/kaiyuanshe/kaiyuanshe.github.io
129
- 3. https://github.com/kaiyuanshe/OpenHackathon-Web
130
- 4. https://github.com/kaiyuanshe/OSS-toolbox
131
-
132
- [1]: https://koajs.com/
133
- [2]: https://nextjs.org/
134
- [3]: https://libraries.io/npm/next-ssr-middleware
135
- [4]: https://github.com/idea2app/Next-SSR-middleware/actions/workflows/main.yml
136
- [5]: https://nodei.co/npm/next-ssr-middleware/
137
- [6]: https://github.com/idea2app/MobX-i18n
1
+ # Next SSR middleware
2
+
3
+ [Koa][1]-like middlewares for [Next.js][2] **Back-end API** & **Server Side Rendering**
4
+
5
+ [![NPM Dependency](https://img.shields.io/librariesio/github/idea2app/Next-SSR-middleware.svg)][3]
6
+ [![CI & CD](https://github.com/idea2app/Next-SSR-middleware/actions/workflows/main.yml/badge.svg)][4]
7
+
8
+ [![NPM](https://nodei.co/npm/next-ssr-middleware.png?downloads=true&downloadRank=true&stars=true)][5]
9
+
10
+ ## Versions
11
+
12
+ | SemVer | status | Next.js | MobX | [MobX i18n][6] |
13
+ | :----------: | :----------: | :-------: | :---------: | :------------: |
14
+ | `>=1.0` | ✅developing | `>=15` | `>=6.11` | ❌ |
15
+ | `>=0.9` | ✅developing | `>=15` | `>=6.11` | `>=0.5` |
16
+ | `>=0.7 <0.9` | ❌deprecated | `>=9 <15` | `>=6.11` | `>=0.5` |
17
+ | `<0.7` | ❌deprecated | `>=9 <15` | `>=4 <6.11` | `<0.5` |
18
+
19
+ ## Middlewares
20
+
21
+ 1. Router
22
+ 2. Error logger
23
+ 3. JWT verifier
24
+ 4. Props cache
25
+ 5. ~~i18n loader~~ (use [MobX-i18n utility][7] directly)
26
+ 6. OAuth 2 signer (with common providers)
27
+ 1. GitHub
28
+
29
+ ## Usage
30
+
31
+ ### Page router
32
+
33
+ #### `pages/user/[id].tsx`
34
+
35
+ ```tsx
36
+ import {
37
+ JWTProps,
38
+ RouterProps,
39
+ jwtVerifier,
40
+ cache,
41
+ errorLogger,
42
+ router
43
+ } from 'next-ssr-middleware';
44
+
45
+ import { User, UserModel } from '../../model/User';
46
+
47
+ type UserDetailPageProps = User & JWTProps & RouterProps;
48
+
49
+ export const getServerSideProps = compose<{ id: string }, UserDetailPageProps>(
50
+ jwtVerifier(), // set `JWT_SECRET` in `.env.local` first
51
+ cache(),
52
+ errorLogger,
53
+ router,
54
+ async ({ params }) => {
55
+ const props = await new UserModel().getOne(params!.id);
56
+
57
+ return { notFound: !props, props };
58
+ }
59
+ );
60
+
61
+ export default function UserDetailPage({
62
+ jwtPayload,
63
+ route,
64
+ name,
65
+ summary
66
+ }: UserDetailPageProps) {
67
+ return (
68
+ <>
69
+ <h1>
70
+ {name} - {route.params!.id}
71
+ </h1>
72
+ <p>{summary}</p>
73
+ </>
74
+ );
75
+ }
76
+ ```
77
+
78
+ ### App router
79
+
80
+ #### `middleware.ts`
81
+
82
+ ```ts
83
+ import { NextRequest, NextResponse } from 'next/server';
84
+ import { parseHeaders } from 'next-ssr-middleware';
85
+
86
+ export const config = {
87
+ // Matcher ignoring `/_next/`, `/api/` & icons
88
+ matcher: [
89
+ '/((?!api|_next/static|_next/image|favicon.ico|apple-icon|icon).*)'
90
+ ]
91
+ };
92
+ export const middleware = ({ headers }: NextRequest) =>
93
+ NextResponse.next({ headers: parseHeaders(headers) });
94
+ ```
95
+
96
+ #### `app/page.tsx`
97
+
98
+ ```tsx
99
+ import { compose, withMiddleware, ServerProps } from 'next-ssr-middleware';
100
+
101
+ const getServerSideProps = compose(async () => {
102
+ const props = await (
103
+ await fetch('https://api.github.com/orgs/idea2app')
104
+ ).json();
105
+
106
+ return { props };
107
+ });
108
+
109
+ const HomePage = withMiddleware(getServerSideProps, Home);
110
+
111
+ export default HomePage;
112
+
113
+ async function Home({ params, searchParams, ...props }: ServerProps) {
114
+ return (
115
+ <>
116
+ <h1>Home</h1>
117
+ <pre>{JSON.stringify(props, null, 4)}</pre>
118
+ </>
119
+ );
120
+ }
121
+ ```
122
+
123
+ ### API router
124
+
125
+ Located in [`pages/api/` of a Next.js project][8] or [`api/` of a Vercel serverless project][9].
126
+
127
+ #### `pages/api/echo.ts`
128
+
129
+ ```ts
130
+ import { createKoaRouter, withKoaRouter } from 'next-ssr-middleware';
131
+
132
+ export const config = { api: { bodyParser: false } };
133
+
134
+ const router = createKoaRouter(import.meta.url);
135
+
136
+ router
137
+ .get('/', async context => {
138
+ context.body = context.request.query;
139
+ })
140
+ .post('/', async context => {
141
+ context.status = 201;
142
+ context.body = Reflect.get(context.request, 'body');
143
+ });
144
+
145
+ export default withKoaRouter(router);
146
+ ```
147
+
148
+ ## Cases
149
+
150
+ 1. https://github.com/idea2app/Next-Bootstrap-ts
151
+ 2. https://github.com/idea2app/Lark-Next-Bootstrap-ts
152
+ 3. https://github.com/FreeCodeCamp-Chengdu/FreeCodeCamp-Chengdu.github.io
153
+ 4. https://github.com/kaiyuanshe/kaiyuanshe.github.io
154
+ 5. https://github.com/kaiyuanshe/OpenHackathon-Web
155
+ 6. https://github.com/kaiyuanshe/OSS-toolbox
156
+
157
+ [1]: https://koajs.com/
158
+ [2]: https://nextjs.org/
159
+ [3]: https://libraries.io/npm/next-ssr-middleware
160
+ [4]: https://github.com/idea2app/Next-SSR-middleware/actions/workflows/main.yml
161
+ [5]: https://nodei.co/npm/next-ssr-middleware/
162
+ [6]: https://github.com/idea2app/MobX-i18n
163
+ [7]: https://github.com/idea2app/MobX-i18n#server-side-rendering-nextjs-example
164
+ [8]: https://github.com/idea2app/Lark-Next-Bootstrap-ts/tree/main/pages/api
165
+ [9]: https://github.com/idea2app/Vercel-Node-serverless/tree/master/api
package/dist/API.d.ts CHANGED
@@ -5,6 +5,6 @@ export type KoaCallback = ReturnType<(typeof Koa)['prototype']['callback']>;
5
5
  export declare function withKoa<S, C>(...middlewares: Middleware<S, C>[]): KoaCallback;
6
6
  export declare function withKoa<S, C>(option: KoaOption, ...middlewares: Middleware<S, C>[]): KoaCallback;
7
7
  export declare const pageApiRouteOf: (path: string) => string;
8
- export declare const createRouter: <S, C extends RouterParamContext<S>>(moduleURI: string, option?: RouterOptions) => Router<S, C>;
8
+ export declare const createKoaRouter: <S, C extends RouterParamContext<S>>(moduleURI: string, option?: RouterOptions) => Router<S, C>;
9
9
  export declare function withKoaRouter<S, C extends RouterParamContext<S>>(router: Router<S, C>, ...middlewares: Middleware<S, C>[]): KoaCallback;
10
10
  export declare function withKoaRouter<S, C extends RouterParamContext<S>>(option: KoaOption, router: Router<S, C>, ...middlewares: Middleware<S, C>[]): KoaCallback;
package/dist/API.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createRouter = exports.pageApiRouteOf = void 0;
3
+ exports.createKoaRouter = exports.pageApiRouteOf = void 0;
4
4
  exports.withKoa = withKoa;
5
5
  exports.withKoaRouter = withKoaRouter;
6
6
  var tslib_1 = require("tslib");
@@ -43,8 +43,8 @@ var pageApiRouteOf = function (path) {
43
43
  .match(/pages(\/api\/.+)\.(j|t)s/)) === null || _a === void 0 ? void 0 : _a[1]) === null || _b === void 0 ? void 0 : _b.split('/[')[0]) === null || _c === void 0 ? void 0 : _c.replace(/\/index$/, '');
44
44
  };
45
45
  exports.pageApiRouteOf = pageApiRouteOf;
46
- var createRouter = function (moduleURI, option) { return new router_1.default(tslib_1.__assign(tslib_1.__assign({}, option), { prefix: (0, exports.pageApiRouteOf)(moduleURI) })); };
47
- exports.createRouter = createRouter;
46
+ var createKoaRouter = function (moduleURI, option) { return new router_1.default(tslib_1.__assign(tslib_1.__assign({}, option), { prefix: (0, exports.pageApiRouteOf)(moduleURI) })); };
47
+ exports.createKoaRouter = createKoaRouter;
48
48
  function withKoaRouter() {
49
49
  var _a, _b;
50
50
  var parameters = [];
package/dist/API.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"API.js","sourceRoot":"","sources":["../source/API.ts"],"names":[],"mappings":";;;AAaA,0BAcC;AAsBD,sCAiBC;;AAlED,uEAAyC;AACzC,+DAAwE;AACxE,oDAAsC;AAWtC,SAAgB,OAAO;;IAAO,oBAAoB;SAApB,UAAoB,EAApB,qBAAoB,EAApB,IAAoB;QAApB,+BAAoB;;IAC9C,IAAI,MAA6B,CAAC;IAClC,IAAI,WAAW,GAAuB,EAAE,CAAC;IAEzC,IAAI,OAAO,UAAU,CAAC,CAAC,CAAC,KAAK,UAAU,EAAE,CAAC;QACtC,MAAM,GAAG,SAAS,CAAC;QACnB,WAAW,GAAG,UAAU,CAAC;IAC7B,CAAC;;QAAM,KAAA,eAA2B,UAAU,CAAA,EAApC,MAAM,QAAA,EAAK,WAAW,cAAA,CAAe;IAE7C,IAAM,GAAG,GAAG,IAAI,aAAG,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,IAAA,oBAAU,GAAE,CAAC,CAAC;;QAE9C,KAAyB,IAAA,gBAAA,iBAAA,WAAW,CAAA,wCAAA;YAA/B,IAAM,UAAU,wBAAA;YAAiB,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;SAAA;;;;;;;;;IAE1D,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC;AAC1B,CAAC;AAEM,IAAM,cAAc,GAAG,UAAC,IAAY;;IACvC,OAAA,MAAA,MAAA,MAAA,SAAS,CAAC,IAAI,CAAC;SACV,KAAK,CAAC,0BAA0B,CAAC,0CAAG,CAAC,CAAC,0CACrC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,0CACd,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAA;CAAA,CAAC;AAJrB,QAAA,cAAc,kBAIO;AAE3B,IAAM,YAAY,GAAG,UACxB,SAAiB,EACjB,MAAsB,IACrB,OAAA,IAAI,gBAAM,uCAAY,MAAM,KAAE,MAAM,EAAE,IAAA,sBAAc,EAAC,SAAS,CAAC,IAAG,EAAlE,CAAkE,CAAC;AAH3D,QAAA,YAAY,gBAG+C;AAWxE,SAAgB,aAAa;;IACzB,oBAAoB;SAApB,UAAoB,EAApB,qBAAoB,EAApB,IAAoB;QAApB,+BAAoB;;IAEpB,IAAI,MAA6B,CAAC;IAClC,IAAI,MAAoB,CAAC;IACzB,IAAI,WAAW,GAAuB,EAAE,CAAC;IAEzC,IAAI,OAAO,UAAU,CAAC,CAAC,CAAC,KAAK,UAAU;QACnC,KAAA,eAA2B,UAAU,CAAA,EAApC,MAAM,QAAA,EAAK,WAAW,cAAA,CAAe;;QACrC,KAAA,eAAmC,UAAU,CAAA,EAA5C,MAAM,QAAA,EAAE,MAAM,QAAA,EAAK,WAAW,cAAA,CAAe;IAEnD,OAAO,OAAO,sCACV,MAAM;QACN,MAAM,CAAC,MAAM,EAAE;QACf,MAAM,CAAC,cAAc,EAAE,kBACpB,WAAW,WAChB;AACN,CAAC"}
1
+ {"version":3,"file":"API.js","sourceRoot":"","sources":["../source/API.ts"],"names":[],"mappings":";;;AAaA,0BAcC;AAsBD,sCAiBC;;AAlED,uEAAyC;AACzC,+DAAwE;AACxE,oDAAsC;AAWtC,SAAgB,OAAO;;IAAO,oBAAoB;SAApB,UAAoB,EAApB,qBAAoB,EAApB,IAAoB;QAApB,+BAAoB;;IAC9C,IAAI,MAA6B,CAAC;IAClC,IAAI,WAAW,GAAuB,EAAE,CAAC;IAEzC,IAAI,OAAO,UAAU,CAAC,CAAC,CAAC,KAAK,UAAU,EAAE,CAAC;QACtC,MAAM,GAAG,SAAS,CAAC;QACnB,WAAW,GAAG,UAAU,CAAC;IAC7B,CAAC;;QAAM,KAAA,eAA2B,UAAU,CAAA,EAApC,MAAM,QAAA,EAAK,WAAW,cAAA,CAAe;IAE7C,IAAM,GAAG,GAAG,IAAI,aAAG,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,IAAA,oBAAU,GAAE,CAAC,CAAC;;QAE9C,KAAyB,IAAA,gBAAA,iBAAA,WAAW,CAAA,wCAAA;YAA/B,IAAM,UAAU,wBAAA;YAAiB,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;SAAA;;;;;;;;;IAE1D,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC;AAC1B,CAAC;AAEM,IAAM,cAAc,GAAG,UAAC,IAAY;;IACvC,OAAA,MAAA,MAAA,MAAA,SAAS,CAAC,IAAI,CAAC;SACV,KAAK,CAAC,0BAA0B,CAAC,0CAAG,CAAC,CAAC,0CACrC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,0CACd,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAA;CAAA,CAAC;AAJrB,QAAA,cAAc,kBAIO;AAE3B,IAAM,eAAe,GAAG,UAC3B,SAAiB,EACjB,MAAsB,IACrB,OAAA,IAAI,gBAAM,uCAAY,MAAM,KAAE,MAAM,EAAE,IAAA,sBAAc,EAAC,SAAS,CAAC,IAAG,EAAlE,CAAkE,CAAC;AAH3D,QAAA,eAAe,mBAG4C;AAWxE,SAAgB,aAAa;;IACzB,oBAAoB;SAApB,UAAoB,EAApB,qBAAoB,EAApB,IAAoB;QAApB,+BAAoB;;IAEpB,IAAI,MAA6B,CAAC;IAClC,IAAI,MAAoB,CAAC;IACzB,IAAI,WAAW,GAAuB,EAAE,CAAC;IAEzC,IAAI,OAAO,UAAU,CAAC,CAAC,CAAC,KAAK,UAAU;QACnC,KAAA,eAA2B,UAAU,CAAA,EAApC,MAAM,QAAA,EAAK,WAAW,cAAA,CAAe;;QACrC,KAAA,eAAmC,UAAU,CAAA,EAA5C,MAAM,QAAA,EAAE,MAAM,QAAA,EAAK,WAAW,cAAA,CAAe;IAEnD,OAAO,OAAO,sCACV,MAAM;QACN,MAAM,CAAC,MAAM,EAAE;QACf,MAAM,CAAC,cAAc,EAAE,kBACpB,WAAW,WAChB;AACN,CAAC"}
@@ -1,5 +1,4 @@
1
1
  import { JwtPayload, VerifyOptions } from 'jsonwebtoken';
2
- import { TranslationModel } from 'mobx-i18n';
3
2
  import { GetServerSidePropsContext, GetServerSidePropsResult } from 'next';
4
3
  import { ParsedUrlQuery } from 'querystring';
5
4
  import { DataObject, Middleware } from '../compose';
@@ -13,4 +12,3 @@ export interface JWTProps<T extends DataObject = {}> {
13
12
  }
14
13
  export declare function jwtVerifier<I extends DataObject, O extends DataObject = {}>(tokenKey?: string, secretKey?: string, options?: VerifyOptions): Middleware<I, O & JWTProps>;
15
14
  export declare function cache<I extends DataObject, O extends DataObject = {}>(oneInterval?: number, allInterval?: number): Middleware<I, O>;
16
- export declare function translator<I extends DataObject, O extends DataObject = {}>(i18n: TranslationModel<string, string>): Middleware<I, O>;
@@ -4,11 +4,9 @@ exports.errorLogger = errorLogger;
4
4
  exports.router = router;
5
5
  exports.jwtVerifier = jwtVerifier;
6
6
  exports.cache = cache;
7
- exports.translator = translator;
8
7
  var tslib_1 = require("tslib");
9
8
  var jsonwebtoken_1 = require("jsonwebtoken");
10
9
  var koajax_1 = require("koajax");
11
- var mobx_i18n_1 = require("mobx-i18n");
12
10
  var web_utility_1 = require("web-utility");
13
11
  function errorLogger(context, next) {
14
12
  return tslib_1.__awaiter(this, void 0, void 0, function () {
@@ -121,21 +119,4 @@ function cache(oneInterval, allInterval) {
121
119
  });
122
120
  }); });
123
121
  }
124
- function translator(i18n) {
125
- var _this = this;
126
- return function (_a, next_1) { return tslib_1.__awaiter(_this, [_a, next_1], void 0, function (_b, next) {
127
- var _c, language, languages;
128
- var _d = _b.req, headers = _d.headers, cookies = _d.cookies;
129
- return tslib_1.__generator(this, function (_e) {
130
- switch (_e.label) {
131
- case 0:
132
- _c = cookies.language, language = _c === void 0 ? '' : _c, languages = (0, mobx_i18n_1.parseLanguageHeader)(headers['accept-language'] || '');
133
- return [4 /*yield*/, i18n.loadLanguages(tslib_1.__spreadArray([language], tslib_1.__read(languages), false).filter(Boolean))];
134
- case 1:
135
- _e.sent();
136
- return [2 /*return*/, next()];
137
- }
138
- });
139
- }); };
140
- }
141
122
  //# sourceMappingURL=local.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"local.js","sourceRoot":"","sources":["../../../source/SSR/middleware/local.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"local.js","sourceRoot":"","sources":["../../../source/SSR/middleware/local.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "name": "next-ssr-middleware",
3
- "version": "0.10.0-rc.3",
3
+ "version": "1.0.0",
4
4
  "license": "LGPL-3.0-or-later",
5
5
  "author": "shiy2008@gmail.com",
6
- "description": "Koa-like middlewares for Next.js Server Side Rendering",
6
+ "description": "Koa-like middlewares for Next.js Back-end API & Server Side Rendering",
7
7
  "keywords": [
8
8
  "koa",
9
9
  "middleware",
@@ -22,37 +22,30 @@
22
22
  "types": "dist/index.d.ts",
23
23
  "main": "dist/index.js",
24
24
  "dependencies": {
25
+ "@koa/bodyparser": "^5.1.1",
26
+ "@koa/router": "^13.1.0",
25
27
  "@types/jsonwebtoken": "^9.0.9",
26
28
  "@types/koa": "^2.15.0",
27
29
  "@types/koa__router": "^12.0.4",
28
- "@types/react": ">=18",
30
+ "@types/react": "^19.1.3",
31
+ "jsonwebtoken": "^9.0.2",
32
+ "koa": ">=2",
29
33
  "tslib": "^2.8.1",
30
34
  "web-utility": "^4.4.3"
31
35
  },
32
36
  "peerDependencies": {
33
- "@koa/bodyparser": ">=5",
34
- "@koa/router": ">=13",
35
- "jsonwebtoken": ">=9",
36
- "koa": ">=2",
37
- "mobx-i18n": ">=0.5 <1",
38
37
  "next": ">=9.3",
39
38
  "react": ">=18"
40
39
  },
41
40
  "devDependencies": {
42
- "@koa/bodyparser": "^5.1.1",
43
- "@koa/router": "^13.1.0",
44
- "@types/node": "^22.15.2",
45
- "@types/react": "^19.1.2",
41
+ "@types/node": "^22.15.14",
46
42
  "husky": "^9.1.7",
47
- "jsonwebtoken": "^9.0.2",
48
- "koa": "^2.16.1",
49
43
  "koajax": "^3.1.2",
50
- "lint-staged": "^15.5.1",
51
- "mobx-i18n": "^0.6.0",
44
+ "lint-staged": "^15.5.2",
52
45
  "next": "^15.3.1",
53
46
  "open-cli": "^8.0.0",
54
47
  "prettier": "^3.5.3",
55
- "typedoc": "^0.28.3",
48
+ "typedoc": "^0.28.4",
56
49
  "typescript": "~5.8.3"
57
50
  },
58
51
  "prettier": {
package/source/API.ts CHANGED
@@ -33,7 +33,7 @@ export const pageApiRouteOf = (path: string) =>
33
33
  ?.split('/[')[0]
34
34
  ?.replace(/\/index$/, '');
35
35
 
36
- export const createRouter = <S, C extends RouterParamContext<S>>(
36
+ export const createKoaRouter = <S, C extends RouterParamContext<S>>(
37
37
  moduleURI: string,
38
38
  option?: RouterOptions
39
39
  ) => new Router<S, C>({ ...option, prefix: pageApiRouteOf(moduleURI) });
@@ -1,6 +1,5 @@
1
1
  import { JwtPayload, VerifyOptions, verify } from 'jsonwebtoken';
2
2
  import { HTTPError } from 'koajax';
3
- import { TranslationModel, parseLanguageHeader } from 'mobx-i18n';
4
3
  import { GetServerSidePropsContext, GetServerSidePropsResult } from 'next';
5
4
  import { ParsedUrlQuery } from 'querystring';
6
5
  import { Day, Second } from 'web-utility';
@@ -126,19 +125,3 @@ export function cache<I extends DataObject, O extends DataObject = {}>(
126
125
  return data || cache.buffer;
127
126
  }) as Middleware<I, O>;
128
127
  }
129
-
130
- export function translator<I extends DataObject, O extends DataObject = {}>(
131
- i18n: TranslationModel<string, string>
132
- ): Middleware<I, O> {
133
- return async (
134
- { req: { headers, cookies } }: GetServerSidePropsContext<I>,
135
- next: () => Promise<GetServerSidePropsResult<O>>
136
- ) => {
137
- const { language = '' } = cookies,
138
- languages = parseLanguageHeader(headers['accept-language'] || '');
139
-
140
- await i18n.loadLanguages([language, ...languages].filter(Boolean));
141
-
142
- return next();
143
- };
144
- }