@eggjs/router 4.0.0-beta.34 → 4.0.0-beta.36

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/dist/EggRouter.js CHANGED
@@ -1,241 +1,209 @@
1
- import assert from 'node:assert';
2
- import { encodeURIComponent as safeEncodeURIComponent } from 'utility';
3
- import { singularize, pluralize } from 'inflection';
4
- import methods from 'methods';
5
- import { isGeneratorFunction } from 'is-type-of';
6
- import { Layer } from "./Layer.js";
1
+ import "./Layer.js";
7
2
  import { Router } from "./Router.js";
8
- import {} from "./types.js";
3
+ import assert from "node:assert";
4
+ import methods from "methods";
5
+ import { isGeneratorFunction } from "is-type-of";
6
+ import { encodeURIComponent } from "utility";
7
+ import { pluralize, singularize } from "inflection";
8
+
9
+ //#region src/EggRouter.ts
9
10
  const REST_MAP = {
10
- index: {
11
- suffix: '',
12
- method: 'GET',
13
- },
14
- new: {
15
- namePrefix: 'new_',
16
- member: true,
17
- suffix: 'new',
18
- method: 'GET',
19
- },
20
- create: {
21
- suffix: '',
22
- method: 'POST',
23
- },
24
- show: {
25
- member: true,
26
- suffix: ':id',
27
- method: 'GET',
28
- },
29
- edit: {
30
- member: true,
31
- namePrefix: 'edit_',
32
- suffix: ':id/edit',
33
- method: 'GET',
34
- },
35
- update: {
36
- member: true,
37
- namePrefix: '',
38
- suffix: ':id',
39
- method: ['PATCH', 'PUT'],
40
- },
41
- destroy: {
42
- member: true,
43
- namePrefix: 'destroy_',
44
- suffix: ':id',
45
- method: 'DELETE',
46
- },
11
+ index: {
12
+ suffix: "",
13
+ method: "GET"
14
+ },
15
+ new: {
16
+ namePrefix: "new_",
17
+ member: true,
18
+ suffix: "new",
19
+ method: "GET"
20
+ },
21
+ create: {
22
+ suffix: "",
23
+ method: "POST"
24
+ },
25
+ show: {
26
+ member: true,
27
+ suffix: ":id",
28
+ method: "GET"
29
+ },
30
+ edit: {
31
+ member: true,
32
+ namePrefix: "edit_",
33
+ suffix: ":id/edit",
34
+ method: "GET"
35
+ },
36
+ update: {
37
+ member: true,
38
+ namePrefix: "",
39
+ suffix: ":id",
40
+ method: ["PATCH", "PUT"]
41
+ },
42
+ destroy: {
43
+ member: true,
44
+ namePrefix: "destroy_",
45
+ suffix: ":id",
46
+ method: "DELETE"
47
+ }
47
48
  };
48
49
  /**
49
- * FIXME: move these patch into @eggjs/router
50
- */
51
- export class EggRouter extends Router {
52
- app;
53
- /**
54
- * @class
55
- * @param {Object} opts - Router options.
56
- * @param {Application} app - Application object.
57
- */
58
- constructor(opts, app) {
59
- super(opts);
60
- this.app = app;
61
- }
62
- verb(method, nameOrPath, pathOrMiddleware, ...middleware) {
63
- const { path, middlewares, options } = this._formatRouteParams(nameOrPath, pathOrMiddleware, middleware);
64
- if (typeof method === 'string') {
65
- method = [method];
66
- }
67
- this.register(path, method, middlewares, options);
68
- return this;
69
- }
70
- head(nameOrPath, pathOrMiddleware, ...middlewares) {
71
- return this.verb('head', nameOrPath, pathOrMiddleware, ...middlewares);
72
- }
73
- options(nameOrPath, pathOrMiddleware, ...middlewares) {
74
- return this.verb('options', nameOrPath, pathOrMiddleware, ...middlewares);
75
- }
76
- get(nameOrPath, pathOrMiddleware, ...middlewares) {
77
- return this.verb('get', nameOrPath, pathOrMiddleware, ...middlewares);
78
- }
79
- put(nameOrPath, pathOrMiddleware, ...middlewares) {
80
- return this.verb('put', nameOrPath, pathOrMiddleware, ...middlewares);
81
- }
82
- patch(nameOrPath, pathOrMiddleware, ...middlewares) {
83
- return this.verb('patch', nameOrPath, pathOrMiddleware, ...middlewares);
84
- }
85
- post(nameOrPath, pathOrMiddleware, ...middlewares) {
86
- return this.verb('post', nameOrPath, pathOrMiddleware, ...middlewares);
87
- }
88
- delete(nameOrPath, pathOrMiddleware, ...middlewares) {
89
- return this.verb('delete', nameOrPath, pathOrMiddleware, ...middlewares);
90
- }
91
- all(nameOrPath, pathOrMiddleware, ...middlewares) {
92
- return this.verb(methods, nameOrPath, pathOrMiddleware, ...middlewares);
93
- }
94
- register(path, methods, middleware, opts) {
95
- // patch register to support bind ctx function middleware and string controller
96
- middleware = Array.isArray(middleware) ? middleware : [middleware];
97
- for (const mw of middleware) {
98
- if (isGeneratorFunction(mw)) {
99
- throw new TypeError(methods.toString() + ' `' + path + '`: Please use async function instead of generator function');
100
- }
101
- }
102
- const middlewares = convertMiddlewares(middleware, this.app);
103
- return super.register(path, methods, middlewares, opts);
104
- }
105
- resources(nameOrPath, pathOrMiddleware, ...middleware) {
106
- const { path, middlewares, options } = this._formatRouteParams(nameOrPath, pathOrMiddleware, middleware);
107
- // last argument is Controller object
108
- const controller = resolveController(middlewares.pop(), this.app);
109
- for (const key in REST_MAP) {
110
- const action = controller[key];
111
- if (!action)
112
- continue;
113
- const opts = REST_MAP[key];
114
- let routeName;
115
- if (opts.member) {
116
- routeName = singularize(options.name ?? '');
117
- }
118
- else {
119
- routeName = pluralize(options.name ?? '');
120
- }
121
- if (opts.namePrefix) {
122
- routeName = opts.namePrefix + routeName;
123
- }
124
- const prefix = path.replace(/\/$/, '');
125
- const urlPath = opts.suffix ? `${prefix}/${opts.suffix}` : prefix;
126
- const method = Array.isArray(opts.method) ? opts.method : [opts.method];
127
- this.register(urlPath, method, middlewares.concat(action), {
128
- name: routeName,
129
- });
130
- }
131
- return this;
132
- }
133
- /**
134
- * @param {String} name - Router name
135
- * @param {Object} params - more parameters
136
- * @example
137
- * ```js
138
- * router.url('edit_post', { id: 1, name: 'foo', page: 2 })
139
- * => /posts/1/edit?name=foo&page=2
140
- * router.url('posts', { name: 'foo&1', page: 2 })
141
- * => /posts?name=foo%261&page=2
142
- * ```
143
- * @return {String} url by path name and query params.
144
- * @since 1.0.0
145
- */
146
- url(name, params) {
147
- const route = this.route(name);
148
- if (!route)
149
- return '';
150
- const args = params;
151
- let url = route.path;
152
- assert(!(url instanceof RegExp), `Can't get the url for regExp ${url} for by name '${name}'`);
153
- const queries = [];
154
- if (typeof args === 'object' && args !== null) {
155
- const replacedParams = [];
156
- url = url.replace(/:([a-zA-Z_]\w*)/g, ($0, key) => {
157
- if (key in args) {
158
- const values = args[key];
159
- replacedParams.push(key);
160
- return safeEncodeURIComponent(Array.isArray(values) ? String(values[0]) : String(values));
161
- }
162
- return $0;
163
- });
164
- for (const key in args) {
165
- if (replacedParams.includes(key)) {
166
- continue;
167
- }
168
- const values = args[key];
169
- const encodedKey = safeEncodeURIComponent(key);
170
- if (Array.isArray(values)) {
171
- for (const val of values) {
172
- queries.push(`${encodedKey}=${safeEncodeURIComponent(String(val))}`);
173
- }
174
- }
175
- else {
176
- queries.push(`${encodedKey}=${safeEncodeURIComponent(String(values))}`);
177
- }
178
- }
179
- }
180
- if (queries.length > 0) {
181
- const queryStr = queries.join('&');
182
- if (!url.includes('?')) {
183
- url = `${url}?${queryStr}`;
184
- }
185
- else {
186
- url = `${url}&${queryStr}`;
187
- }
188
- }
189
- return url;
190
- }
191
- /**
192
- * @alias to url()
193
- */
194
- pathFor(name, params) {
195
- return this.url(name, params);
196
- }
197
- }
50
+ * FIXME: move these patch into @eggjs/router
51
+ */
52
+ var EggRouter = class extends Router {
53
+ app;
54
+ /**
55
+ * @class
56
+ * @param {Object} opts - Router options.
57
+ * @param {Application} app - Application object.
58
+ */
59
+ constructor(opts, app) {
60
+ super(opts);
61
+ this.app = app;
62
+ }
63
+ verb(method, nameOrPath, pathOrMiddleware, ...middleware) {
64
+ const { path, middlewares, options } = this._formatRouteParams(nameOrPath, pathOrMiddleware, middleware);
65
+ if (typeof method === "string") method = [method];
66
+ this.register(path, method, middlewares, options);
67
+ return this;
68
+ }
69
+ head(nameOrPath, pathOrMiddleware, ...middlewares) {
70
+ return this.verb("head", nameOrPath, pathOrMiddleware, ...middlewares);
71
+ }
72
+ options(nameOrPath, pathOrMiddleware, ...middlewares) {
73
+ return this.verb("options", nameOrPath, pathOrMiddleware, ...middlewares);
74
+ }
75
+ get(nameOrPath, pathOrMiddleware, ...middlewares) {
76
+ return this.verb("get", nameOrPath, pathOrMiddleware, ...middlewares);
77
+ }
78
+ put(nameOrPath, pathOrMiddleware, ...middlewares) {
79
+ return this.verb("put", nameOrPath, pathOrMiddleware, ...middlewares);
80
+ }
81
+ patch(nameOrPath, pathOrMiddleware, ...middlewares) {
82
+ return this.verb("patch", nameOrPath, pathOrMiddleware, ...middlewares);
83
+ }
84
+ post(nameOrPath, pathOrMiddleware, ...middlewares) {
85
+ return this.verb("post", nameOrPath, pathOrMiddleware, ...middlewares);
86
+ }
87
+ delete(nameOrPath, pathOrMiddleware, ...middlewares) {
88
+ return this.verb("delete", nameOrPath, pathOrMiddleware, ...middlewares);
89
+ }
90
+ all(nameOrPath, pathOrMiddleware, ...middlewares) {
91
+ return this.verb(methods, nameOrPath, pathOrMiddleware, ...middlewares);
92
+ }
93
+ register(path, methods$1, middleware, opts) {
94
+ middleware = Array.isArray(middleware) ? middleware : [middleware];
95
+ for (const mw of middleware) if (isGeneratorFunction(mw)) throw new TypeError(methods$1.toString() + " `" + path + "`: Please use async function instead of generator function");
96
+ const middlewares = convertMiddlewares(middleware, this.app);
97
+ return super.register(path, methods$1, middlewares, opts);
98
+ }
99
+ resources(nameOrPath, pathOrMiddleware, ...middleware) {
100
+ const { path, middlewares, options } = this._formatRouteParams(nameOrPath, pathOrMiddleware, middleware);
101
+ const controller = resolveController(middlewares.pop(), this.app);
102
+ for (const key in REST_MAP) {
103
+ const action = controller[key];
104
+ if (!action) continue;
105
+ const opts = REST_MAP[key];
106
+ let routeName;
107
+ if (opts.member) routeName = singularize(options.name ?? "");
108
+ else routeName = pluralize(options.name ?? "");
109
+ if (opts.namePrefix) routeName = opts.namePrefix + routeName;
110
+ const prefix = path.replace(/\/$/, "");
111
+ const urlPath = opts.suffix ? `${prefix}/${opts.suffix}` : prefix;
112
+ const method = Array.isArray(opts.method) ? opts.method : [opts.method];
113
+ this.register(urlPath, method, middlewares.concat(action), { name: routeName });
114
+ }
115
+ return this;
116
+ }
117
+ /**
118
+ * @param {String} name - Router name
119
+ * @param {Object} params - more parameters
120
+ * @example
121
+ * ```js
122
+ * router.url('edit_post', { id: 1, name: 'foo', page: 2 })
123
+ * => /posts/1/edit?name=foo&page=2
124
+ * router.url('posts', { name: 'foo&1', page: 2 })
125
+ * => /posts?name=foo%261&page=2
126
+ * ```
127
+ * @return {String} url by path name and query params.
128
+ * @since 1.0.0
129
+ */
130
+ url(name, params) {
131
+ const route = this.route(name);
132
+ if (!route) return "";
133
+ const args = params;
134
+ let url = route.path;
135
+ assert(!(url instanceof RegExp), `Can't get the url for regExp ${url} for by name '${name}'`);
136
+ const queries = [];
137
+ if (typeof args === "object" && args !== null) {
138
+ const replacedParams = [];
139
+ url = url.replace(/:([a-zA-Z_]\w*)/g, ($0, key) => {
140
+ if (key in args) {
141
+ const values = args[key];
142
+ replacedParams.push(key);
143
+ return encodeURIComponent(Array.isArray(values) ? String(values[0]) : String(values));
144
+ }
145
+ return $0;
146
+ });
147
+ for (const key in args) {
148
+ if (replacedParams.includes(key)) continue;
149
+ const values = args[key];
150
+ const encodedKey = encodeURIComponent(key);
151
+ if (Array.isArray(values)) for (const val of values) queries.push(`${encodedKey}=${encodeURIComponent(String(val))}`);
152
+ else queries.push(`${encodedKey}=${encodeURIComponent(String(values))}`);
153
+ }
154
+ }
155
+ if (queries.length > 0) {
156
+ const queryStr = queries.join("&");
157
+ if (!url.includes("?")) url = `${url}?${queryStr}`;
158
+ else url = `${url}&${queryStr}`;
159
+ }
160
+ return url;
161
+ }
162
+ /**
163
+ * @alias to url()
164
+ */
165
+ pathFor(name, params) {
166
+ return this.url(name, params);
167
+ }
168
+ };
198
169
  /**
199
- * resolve controller from string to function
200
- * @param {String|Function} controller input controller
201
- * @param {Application} app egg application instance
202
- */
170
+ * resolve controller from string to function
171
+ * @param {String|Function} controller input controller
172
+ * @param {Application} app egg application instance
173
+ */
203
174
  function resolveController(controller, app) {
204
- if (typeof controller === 'string') {
205
- // resolveController('foo.bar.Home', app)
206
- const actions = controller.split('.');
207
- let obj = app.controller;
208
- actions.forEach((key) => {
209
- obj = obj[key];
210
- if (!obj)
211
- throw new Error(`app.controller.${controller} not exists`);
212
- });
213
- controller = obj;
214
- }
215
- // ensure controller is exists
216
- if (!controller)
217
- throw new Error('controller not exists');
218
- return controller;
175
+ if (typeof controller === "string") {
176
+ const actions = controller.split(".");
177
+ let obj = app.controller;
178
+ actions.forEach((key) => {
179
+ obj = obj[key];
180
+ if (!obj) throw new Error(`app.controller.${controller} not exists`);
181
+ });
182
+ controller = obj;
183
+ }
184
+ if (!controller) throw new Error("controller not exists");
185
+ return controller;
219
186
  }
220
187
  /**
221
- * 1. ensure controller(last argument) support string
222
- * - [url, controller]: app.get('/home', 'home');
223
- * - [name, url, controller(string)]: app.get('posts', '/posts', 'posts.list');
224
- * - [name, url, controller]: app.get('posts', '/posts', app.controller.posts.list);
225
- * - [name, url(regexp), controller]: app.get('regRouter', /\/home\/index/, 'home.index');
226
- * - [name, url, middleware, [...], controller]: `app.get(/user/:id', hasLogin, canGetUser, 'user.show');`
227
- *
228
- * 2. bind ctx to controller `this`
229
- *
230
- * @param {Array} middlewares middlewares and controller(last middleware)
231
- * @param {Application} app egg application instance
232
- */
188
+ * 1. ensure controller(last argument) support string
189
+ * - [url, controller]: app.get('/home', 'home');
190
+ * - [name, url, controller(string)]: app.get('posts', '/posts', 'posts.list');
191
+ * - [name, url, controller]: app.get('posts', '/posts', app.controller.posts.list);
192
+ * - [name, url(regexp), controller]: app.get('regRouter', /\/home\/index/, 'home.index');
193
+ * - [name, url, middleware, [...], controller]: `app.get(/user/:id', hasLogin, canGetUser, 'user.show');`
194
+ *
195
+ * 2. bind ctx to controller `this`
196
+ *
197
+ * @param {Array} middlewares middlewares and controller(last middleware)
198
+ * @param {Application} app egg application instance
199
+ */
233
200
  function convertMiddlewares(middlewares, app) {
234
- // ensure controller is resolved
235
- const controller = resolveController(middlewares.pop(), app);
236
- function wrappedController(ctx, next) {
237
- return controller.apply(ctx, [ctx, next]);
238
- }
239
- return [...middlewares, wrappedController];
201
+ const controller = resolveController(middlewares.pop(), app);
202
+ function wrappedController(ctx, next) {
203
+ return controller.apply(ctx, [ctx, next]);
204
+ }
205
+ return [...middlewares, wrappedController];
240
206
  }
241
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRWdnUm91dGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL0VnZ1JvdXRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLE1BQU0sTUFBTSxhQUFhLENBQUM7QUFFakMsT0FBTyxFQUFFLGtCQUFrQixJQUFJLHNCQUFzQixFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3BELE9BQU8sT0FBTyxNQUFNLFNBQVMsQ0FBQztBQUM5QixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFakQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNuQyxPQUFPLEVBQXdCLE1BQU0sRUFBeUMsTUFBTSxhQUFhLENBQUM7QUFDbEcsT0FBTyxFQUE0RCxNQUFNLFlBQVksQ0FBQztBQVN0RixNQUFNLFFBQVEsR0FBbUM7SUFDL0MsS0FBSyxFQUFFO1FBQ0wsTUFBTSxFQUFFLEVBQUU7UUFDVixNQUFNLEVBQUUsS0FBSztLQUNkO0lBQ0QsR0FBRyxFQUFFO1FBQ0gsVUFBVSxFQUFFLE1BQU07UUFDbEIsTUFBTSxFQUFFLElBQUk7UUFDWixNQUFNLEVBQUUsS0FBSztRQUNiLE1BQU0sRUFBRSxLQUFLO0tBQ2Q7SUFDRCxNQUFNLEVBQUU7UUFDTixNQUFNLEVBQUUsRUFBRTtRQUNWLE1BQU0sRUFBRSxNQUFNO0tBQ2Y7SUFDRCxJQUFJLEVBQUU7UUFDSixNQUFNLEVBQUUsSUFBSTtRQUNaLE1BQU0sRUFBRSxLQUFLO1FBQ2IsTUFBTSxFQUFFLEtBQUs7S0FDZDtJQUNELElBQUksRUFBRTtRQUNKLE1BQU0sRUFBRSxJQUFJO1FBQ1osVUFBVSxFQUFFLE9BQU87UUFDbkIsTUFBTSxFQUFFLFVBQVU7UUFDbEIsTUFBTSxFQUFFLEtBQUs7S0FDZDtJQUNELE1BQU0sRUFBRTtRQUNOLE1BQU0sRUFBRSxJQUFJO1FBQ1os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
207
+
208
+ //#endregion
209
+ export { EggRouter };