egg 4.0.0-beta.5 → 4.0.0-beta.6

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.
Files changed (75) hide show
  1. package/dist/commonjs/app/extend/context.d.ts +151 -2
  2. package/dist/commonjs/app/extend/context.js +81 -84
  3. package/dist/commonjs/app/extend/helper.d.ts +37 -0
  4. package/dist/commonjs/app/extend/helper.js +49 -0
  5. package/dist/commonjs/app/extend/request.d.ts +128 -0
  6. package/dist/commonjs/app/extend/request.js +270 -0
  7. package/dist/commonjs/app/extend/response.d.ts +25 -0
  8. package/dist/commonjs/app/extend/response.js +37 -0
  9. package/dist/commonjs/app/middleware/meta.d.ts +2 -3
  10. package/dist/commonjs/app/middleware/meta.js +1 -1
  11. package/dist/commonjs/app/middleware/notfound.d.ts +2 -3
  12. package/dist/commonjs/app/middleware/notfound.js +1 -1
  13. package/dist/commonjs/app/middleware/site_file.d.ts +2 -2
  14. package/dist/commonjs/app/middleware/site_file.js +1 -2
  15. package/dist/commonjs/config/config.default.js +3 -2
  16. package/dist/commonjs/lib/application.d.ts +5 -12
  17. package/dist/commonjs/lib/application.js +9 -20
  18. package/dist/commonjs/lib/core/base_context_class.d.ts +2 -2
  19. package/dist/commonjs/lib/core/context_httpclient.d.ts +3 -3
  20. package/dist/commonjs/lib/core/context_httpclient.js +1 -1
  21. package/dist/commonjs/lib/core/httpclient.d.ts +2 -3
  22. package/dist/commonjs/lib/core/httpclient.js +3 -6
  23. package/dist/commonjs/lib/core/messenger/ipc.js +1 -2
  24. package/dist/commonjs/lib/egg.d.ts +19 -15
  25. package/dist/commonjs/lib/egg.js +14 -11
  26. package/dist/commonjs/lib/type.d.ts +4 -7
  27. package/dist/commonjs/lib/utils.d.ts +2 -0
  28. package/dist/commonjs/lib/utils.js +21 -0
  29. package/dist/esm/app/extend/context.d.ts +151 -2
  30. package/dist/esm/app/extend/context.js +81 -85
  31. package/dist/esm/app/extend/helper.d.ts +37 -0
  32. package/dist/esm/app/extend/helper.js +43 -0
  33. package/dist/esm/app/extend/request.d.ts +128 -0
  34. package/dist/esm/app/extend/request.js +264 -0
  35. package/dist/esm/app/extend/response.d.ts +25 -0
  36. package/dist/esm/app/extend/response.js +34 -0
  37. package/dist/esm/app/middleware/meta.d.ts +2 -3
  38. package/dist/esm/app/middleware/meta.js +1 -1
  39. package/dist/esm/app/middleware/notfound.d.ts +2 -3
  40. package/dist/esm/app/middleware/notfound.js +1 -1
  41. package/dist/esm/app/middleware/site_file.d.ts +2 -2
  42. package/dist/esm/app/middleware/site_file.js +1 -2
  43. package/dist/esm/config/config.default.js +3 -2
  44. package/dist/esm/lib/application.d.ts +5 -12
  45. package/dist/esm/lib/application.js +9 -20
  46. package/dist/esm/lib/core/base_context_class.d.ts +2 -2
  47. package/dist/esm/lib/core/context_httpclient.d.ts +3 -3
  48. package/dist/esm/lib/core/context_httpclient.js +1 -1
  49. package/dist/esm/lib/core/httpclient.d.ts +2 -3
  50. package/dist/esm/lib/core/httpclient.js +2 -2
  51. package/dist/esm/lib/core/messenger/ipc.js +1 -2
  52. package/dist/esm/lib/egg.d.ts +19 -15
  53. package/dist/esm/lib/egg.js +12 -12
  54. package/dist/esm/lib/type.d.ts +4 -7
  55. package/dist/esm/lib/utils.d.ts +2 -0
  56. package/dist/esm/lib/utils.js +14 -0
  57. package/dist/package.json +1 -1
  58. package/package.json +6 -9
  59. package/src/app/extend/context.ts +116 -100
  60. package/src/app/extend/{helper.js → helper.ts} +14 -13
  61. package/src/app/extend/{request.js → request.ts} +81 -79
  62. package/src/app/extend/response.ts +36 -0
  63. package/src/app/middleware/meta.ts +2 -3
  64. package/src/app/middleware/notfound.ts +2 -3
  65. package/src/app/middleware/site_file.ts +3 -5
  66. package/src/config/config.default.ts +2 -1
  67. package/src/lib/application.ts +14 -21
  68. package/src/lib/core/base_context_class.ts +2 -2
  69. package/src/lib/core/context_httpclient.ts +3 -3
  70. package/src/lib/core/httpclient.ts +4 -5
  71. package/src/lib/core/messenger/ipc.ts +0 -1
  72. package/src/lib/egg.ts +45 -24
  73. package/src/lib/type.ts +3 -13
  74. package/src/lib/utils.ts +16 -0
  75. package/src/app/extend/response.js +0 -101
@@ -1,2 +1,151 @@
1
- declare const Context: any;
2
- export default Context;
1
+ import { Context as EggCoreContext, Router, type ContextDelegation as EggCoreContextDelegation } from '@eggjs/core';
2
+ import type { Cookies as ContextCookies } from '@eggjs/cookies';
3
+ import type { Application } from '../../lib/application.js';
4
+ import type { ContextHttpClient } from '../../lib/core/context_httpclient.js';
5
+ import type { BaseContextClass } from '../../lib//core/base_context_class.js';
6
+ import Request from './request.js';
7
+ import Response from './response.js';
8
+ import { EggLogger } from 'egg-logger';
9
+ interface Cookies extends ContextCookies {
10
+ request: any;
11
+ response: any;
12
+ }
13
+ export default class Context extends EggCoreContext {
14
+ app: Application;
15
+ request: Request;
16
+ service: BaseContextClass;
17
+ /**
18
+ * Request start time
19
+ * @member {Number} Context#starttime
20
+ */
21
+ starttime: number;
22
+ /**
23
+ * Request start timer using `performance.now()`
24
+ * @member {Number} Context#performanceStarttime
25
+ */
26
+ performanceStarttime: number;
27
+ /**
28
+ * Get the current visitor's cookies.
29
+ */
30
+ get cookies(): Cookies;
31
+ /**
32
+ * Get a wrapper httpclient instance contain ctx in the hold request process
33
+ *
34
+ * @return {ContextHttpClient} the wrapper httpclient instance
35
+ */
36
+ get httpclient(): ContextHttpClient;
37
+ /**
38
+ * Alias to {@link Context#httpclient}
39
+ */
40
+ get httpClient(): ContextHttpClient;
41
+ /**
42
+ * Shortcut for httpclient.curl
43
+ *
44
+ * @function Context#curl
45
+ * @param {String|Object} url - request url address.
46
+ * @param {Object} [options] - options for request.
47
+ * @return {Object} see {@link ContextHttpClient#curl}
48
+ */
49
+ curl(url: string, options?: object): ReturnType<ContextHttpClient['curl']>;
50
+ /**
51
+ * Alias to {@link Application#router}
52
+ *
53
+ * @member {Router} Context#router
54
+ * @since 1.0.0
55
+ * @example
56
+ * ```js
57
+ * this.router.pathFor('post', { id: 12 });
58
+ * ```
59
+ */
60
+ get router(): Router;
61
+ /**
62
+ * Set router to Context, only use on EggRouter
63
+ * @param {Router} val router instance
64
+ */
65
+ set router(val: Router);
66
+ /**
67
+ * Get helper instance from {@link Application#Helper}
68
+ *
69
+ * @member {Helper} Context#helper
70
+ * @since 1.0.0
71
+ */
72
+ get helper(): unknown;
73
+ /**
74
+ * Wrap app.loggers with context information,
75
+ * if a custom logger is defined by naming aLogger, then you can `ctx.getLogger('aLogger')`
76
+ *
77
+ * @param {String} name - logger name
78
+ */
79
+ getLogger(name: string): EggLogger;
80
+ /**
81
+ * Logger for Application
82
+ *
83
+ * @member {Logger} Context#logger
84
+ * @since 1.0.0
85
+ * @example
86
+ * ```js
87
+ * this.logger.info('some request data: %j', this.request.body);
88
+ * this.logger.warn('WARNING!!!!');
89
+ * ```
90
+ */
91
+ get logger(): EggLogger;
92
+ /**
93
+ * Logger for frameworks and plugins
94
+ *
95
+ * @member {Logger} Context#coreLogger
96
+ * @since 1.0.0
97
+ */
98
+ get coreLogger(): EggLogger;
99
+ /**
100
+ * locals is an object for view, you can use `app.locals` and `ctx.locals` to set variables,
101
+ * which will be used as data when view is rendering.
102
+ * The difference between `app.locals` and `ctx.locals` is the context level, `app.locals` is global level, and `ctx.locals` is request level. when you get `ctx.locals`, it will merge `app.locals`.
103
+ *
104
+ * when you set locals, only object is available
105
+ *
106
+ * ```js
107
+ * this.locals = {
108
+ * a: 1
109
+ * };
110
+ * this.locals = {
111
+ * b: 1
112
+ * };
113
+ * this.locals.c = 1;
114
+ * console.log(this.locals);
115
+ * {
116
+ * a: 1,
117
+ * b: 1,
118
+ * c: 1,
119
+ * };
120
+ * ```
121
+ *
122
+ * `ctx.locals` has cache, it only merges `app.locals` once in one request.
123
+ *
124
+ * @member {Object} Context#locals
125
+ */
126
+ get locals(): Record<string, any>;
127
+ set locals(val: Record<string, any>);
128
+ /**
129
+ * alias to {@link Context#locals}, compatible with koa that use this variable
130
+ * @member {Object} state
131
+ * @see Context#locals
132
+ */
133
+ get state(): Record<string, any>;
134
+ set state(val: Record<string, any>);
135
+ /**
136
+ * Run async function in the background
137
+ * @param {Function} scope - the first args is ctx
138
+ * ```js
139
+ * this.body = 'hi';
140
+ *
141
+ * this.runInBackground(async ctx => {
142
+ * await ctx.mysql.query(sql);
143
+ * await ctx.curl(url);
144
+ * });
145
+ * ```
146
+ */
147
+ runInBackground(scope: (ctx: ContextDelegation) => Promise<void>, taskName?: string): void;
148
+ _runInBackground(scope: (ctx: ContextDelegation) => Promise<void>, taskName: string): Promise<void>;
149
+ }
150
+ export type ContextDelegation = EggCoreContextDelegation & Context & Pick<Request, 'acceptJSON' | 'queries' | 'accept' | 'ip'> & Pick<Response, 'realStatus'>;
151
+ export {};
@@ -3,27 +3,37 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- const node_perf_hooks_1 = require("node:perf_hooks");
7
6
  const delegates_1 = __importDefault(require("delegates"));
8
7
  const utility_1 = require("utility");
8
+ const performance_ms_1 = require("performance-ms");
9
9
  const core_1 = require("@eggjs/core");
10
- const HELPER = Symbol('Context#helper');
11
- const LOCALS = Symbol('Context#locals');
12
- const LOCALS_LIST = Symbol('Context#localsList');
13
- const COOKIES = Symbol('Context#cookies');
14
- const CONTEXT_LOGGERS = Symbol('Context#logger');
15
- const CONTEXT_HTTPCLIENT = Symbol('Context#httpclient');
16
- const CONTEXT_ROUTER = Symbol('Context#router');
17
- const Context = {
10
+ const HELPER = Symbol('ctx helper');
11
+ const LOCALS = Symbol('ctx locals');
12
+ const LOCALS_LIST = Symbol('ctx localsList');
13
+ const COOKIES = Symbol('ctx cookies');
14
+ const CONTEXT_HTTPCLIENT = Symbol('ctx httpclient');
15
+ const CONTEXT_ROUTER = Symbol('ctx router');
16
+ class Context extends core_1.Context {
17
+ /**
18
+ * Request start time
19
+ * @member {Number} Context#starttime
20
+ */
21
+ starttime;
22
+ /**
23
+ * Request start timer using `performance.now()`
24
+ * @member {Number} Context#performanceStarttime
25
+ */
26
+ performanceStarttime;
18
27
  /**
19
28
  * Get the current visitor's cookies.
20
29
  */
21
30
  get cookies() {
22
- if (!this[COOKIES]) {
23
- this[COOKIES] = new this.app.ContextCookies(this, this.app.keys, this.app.config.cookies);
31
+ let cookies = this[COOKIES];
32
+ if (!cookies) {
33
+ this[COOKIES] = cookies = new this.app.ContextCookies(this, this.app.keys, this.app.config.cookies);
24
34
  }
25
- return this[COOKIES];
26
- },
35
+ return cookies;
36
+ }
27
37
  /**
28
38
  * Get a wrapper httpclient instance contain ctx in the hold request process
29
39
  *
@@ -34,7 +44,13 @@ const Context = {
34
44
  this[CONTEXT_HTTPCLIENT] = new this.app.ContextHttpClient(this);
35
45
  }
36
46
  return this[CONTEXT_HTTPCLIENT];
37
- },
47
+ }
48
+ /**
49
+ * Alias to {@link Context#httpclient}
50
+ */
51
+ get httpClient() {
52
+ return this.httpclient;
53
+ }
38
54
  /**
39
55
  * Shortcut for httpclient.curl
40
56
  *
@@ -43,9 +59,9 @@ const Context = {
43
59
  * @param {Object} [options] - options for request.
44
60
  * @return {Object} see {@link ContextHttpClient#curl}
45
61
  */
46
- curl(url, options) {
47
- return this.httpclient.curl(url, options);
48
- },
62
+ async curl(url, options) {
63
+ return await this.httpclient.curl(url, options);
64
+ }
49
65
  /**
50
66
  * Alias to {@link Application#router}
51
67
  *
@@ -57,18 +73,18 @@ const Context = {
57
73
  * ```
58
74
  */
59
75
  get router() {
60
- if (!this[CONTEXT_ROUTER]) {
61
- this[CONTEXT_ROUTER] = this.app.router;
76
+ if (this[CONTEXT_ROUTER]) {
77
+ return this[CONTEXT_ROUTER];
62
78
  }
63
- return this[CONTEXT_ROUTER];
64
- },
79
+ return this.app.router;
80
+ }
65
81
  /**
66
82
  * Set router to Context, only use on EggRouter
67
- * @param {EggRouter} val router instance
83
+ * @param {Router} val router instance
68
84
  */
69
85
  set router(val) {
70
86
  this[CONTEXT_ROUTER] = val;
71
- },
87
+ }
72
88
  /**
73
89
  * Get helper instance from {@link Application#Helper}
74
90
  *
@@ -80,37 +96,20 @@ const Context = {
80
96
  this[HELPER] = new this.app.Helper(this);
81
97
  }
82
98
  return this[HELPER];
83
- },
99
+ }
84
100
  /**
85
101
  * Wrap app.loggers with context information,
86
102
  * if a custom logger is defined by naming aLogger, then you can `ctx.getLogger('aLogger')`
87
103
  *
88
104
  * @param {String} name - logger name
89
- * @return {Logger} logger
90
105
  */
91
106
  getLogger(name) {
92
- if (this.app.config.logger.enableFastContextLogger) {
93
- return this.app.getLogger(name);
94
- }
95
- let cache = this[CONTEXT_LOGGERS];
96
- if (!cache) {
97
- cache = this[CONTEXT_LOGGERS] = {};
98
- }
99
- // read from cache
100
- if (cache[name])
101
- return cache[name];
102
- // get no exist logger
103
- const appLogger = this.app.getLogger(name);
104
- if (!appLogger)
105
- return null;
106
- // write to cache
107
- cache[name] = new this.app.ContextLogger(this, appLogger);
108
- return cache[name];
109
- },
107
+ return this.app.getLogger(name);
108
+ }
110
109
  /**
111
- * Logger for Application, wrapping app.coreLogger with context infomation
110
+ * Logger for Application
112
111
  *
113
- * @member {ContextLogger} Context#logger
112
+ * @member {Logger} Context#logger
114
113
  * @since 1.0.0
115
114
  * @example
116
115
  * ```js
@@ -120,17 +119,16 @@ const Context = {
120
119
  */
121
120
  get logger() {
122
121
  return this.getLogger('logger');
123
- },
122
+ }
124
123
  /**
125
- * Logger for frameworks and plugins,
126
- * wrapping app.coreLogger with context infomation
124
+ * Logger for frameworks and plugins
127
125
  *
128
- * @member {ContextLogger} Context#coreLogger
126
+ * @member {Logger} Context#coreLogger
129
127
  * @since 1.0.0
130
128
  */
131
129
  get coreLogger() {
132
130
  return this.getLogger('coreLogger');
133
- },
131
+ }
134
132
  /**
135
133
  * locals is an object for view, you can use `app.locals` and `ctx.locals` to set variables,
136
134
  * which will be used as data when view is rendering.
@@ -162,18 +160,17 @@ const Context = {
162
160
  if (!this[LOCALS]) {
163
161
  this[LOCALS] = (0, utility_1.assign)({}, this.app.locals);
164
162
  }
165
- if (this[LOCALS_LIST] && this[LOCALS_LIST].length) {
163
+ if (Array.isArray(this[LOCALS_LIST]) && this[LOCALS_LIST].length > 0) {
166
164
  (0, utility_1.assign)(this[LOCALS], this[LOCALS_LIST]);
167
165
  this[LOCALS_LIST] = null;
168
166
  }
169
167
  return this[LOCALS];
170
- },
168
+ }
171
169
  set locals(val) {
172
- if (!this[LOCALS_LIST]) {
173
- this[LOCALS_LIST] = [];
174
- }
175
- this[LOCALS_LIST].push(val);
176
- },
170
+ const localsList = this[LOCALS_LIST] ?? [];
171
+ localsList.push(val);
172
+ this[LOCALS_LIST] = localsList;
173
+ }
177
174
  /**
178
175
  * alias to {@link Context#locals}, compatible with koa that use this variable
179
176
  * @member {Object} state
@@ -181,10 +178,10 @@ const Context = {
181
178
  */
182
179
  get state() {
183
180
  return this.locals;
184
- },
181
+ }
185
182
  set state(val) {
186
183
  this.locals = val;
187
- },
184
+ }
188
185
  /**
189
186
  * Run async function in the background
190
187
  * @param {Function} scope - the first args is ctx
@@ -197,37 +194,38 @@ const Context = {
197
194
  * });
198
195
  * ```
199
196
  */
200
- runInBackground(scope) {
197
+ runInBackground(scope, taskName) {
201
198
  // try to use custom function name first
202
- /* istanbul ignore next */
203
- const taskName = Reflect.get(scope, '_name') || scope.name || core_1.utils.getCalleeFromStack(true);
204
- this._runInBackground(scope, taskName);
205
- },
199
+ if (!taskName) {
200
+ taskName = Reflect.get(scope, '_name') || scope.name || core_1.utils.getCalleeFromStack(true);
201
+ }
202
+ // use setImmediate to ensure all sync logic will run async
203
+ setImmediate(() => {
204
+ this._runInBackground(scope, taskName);
205
+ });
206
+ }
206
207
  // let plugins or frameworks to reuse _runInBackground in some cases.
207
208
  // e.g.: https://github.com/eggjs/egg-mock/pull/78
208
- _runInBackground(scope, taskName) {
209
- // eslint-disable-next-line @typescript-eslint/no-this-alias
210
- const ctx = this;
211
- const start = node_perf_hooks_1.performance.now();
212
- // use setImmediate to ensure all sync logic will run async
213
- return new Promise(resolve => setImmediate(resolve))
214
- .then(() => scope(ctx))
215
- .then(() => {
216
- ctx.coreLogger.info('[egg:background] task:%s success (%dms)', taskName, Math.floor((node_perf_hooks_1.performance.now() - start) * 1000) / 1000);
217
- })
218
- .catch(err => {
209
+ async _runInBackground(scope, taskName) {
210
+ const startTime = (0, performance_ms_1.now)();
211
+ try {
212
+ await scope(this);
213
+ this.coreLogger.info('[egg:background] task:%s success (%dms)', taskName, (0, performance_ms_1.diff)(startTime));
214
+ }
215
+ catch (err) {
219
216
  // background task process log
220
- ctx.coreLogger.info('[egg:background] task:%s fail (%dms)', taskName, Math.floor((node_perf_hooks_1.performance.now() - start) * 1000) / 1000);
217
+ this.coreLogger.info('[egg:background] task:%s fail (%dms)', taskName, (0, performance_ms_1.diff)(startTime));
221
218
  // emit error when promise catch, and set err.runInBackground flag
222
219
  err.runInBackground = true;
223
- ctx.app.emit('error', err, ctx);
224
- });
225
- },
226
- };
220
+ this.app.emit('error', err, this);
221
+ }
222
+ }
223
+ }
224
+ exports.default = Context;
227
225
  /**
228
226
  * Context delegation.
229
227
  */
230
- (0, delegates_1.default)(Context, 'request')
228
+ (0, delegates_1.default)(Context.prototype, 'request')
231
229
  /**
232
230
  * @member {Boolean} Context#acceptJSON
233
231
  * @see Request#acceptJSON
@@ -252,12 +250,11 @@ const Context = {
252
250
  * @since 1.0.0
253
251
  */
254
252
  .access('ip');
255
- (0, delegates_1.default)(Context, 'response')
253
+ (0, delegates_1.default)(Context.prototype, 'response')
256
254
  /**
257
255
  * @member {Number} Context#realStatus
258
256
  * @see Response#realStatus
259
257
  * @since 1.0.0
260
258
  */
261
259
  .access('realStatus');
262
- exports.default = Context;
263
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGV4dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9hcHAvZXh0ZW5kL2NvbnRleHQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxxREFBOEM7QUFDOUMsMERBQWlDO0FBQ2pDLHFDQUFpQztBQUNqQyxzQ0FBb0M7QUFFcEMsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUM7QUFDeEMsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUM7QUFDeEMsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLG9CQUFvQixDQUFDLENBQUM7QUFDakQsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7QUFDMUMsTUFBTSxlQUFlLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUM7QUFDakQsTUFBTSxrQkFBa0IsR0FBRyxNQUFNLENBQUMsb0JBQW9CLENBQUMsQ0FBQztBQUN4RCxNQUFNLGNBQWMsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztBQUVoRCxNQUFNLE9BQU8sR0FBRztJQUNkOztPQUVHO0lBQ0gsSUFBSSxPQUFPO1FBQ1QsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM1RixDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDdkIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxJQUFJLFVBQVU7UUFDWixJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEVBQUUsQ0FBQztZQUM5QixJ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
260
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGV4dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9hcHAvZXh0ZW5kL2NvbnRleHQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSwwREFBaUM7QUFDakMscUNBQWlDO0FBQ2pDLG1EQUEyQztBQUMzQyxzQ0FHcUI7QUFTckIsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO0FBQ3BDLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztBQUNwQyxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztBQUM3QyxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7QUFDdEMsTUFBTSxrQkFBa0IsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztBQUNwRCxNQUFNLGNBQWMsR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7QUFPNUMsTUFBcUIsT0FBUSxTQUFRLGNBQWM7SUFLakQ7OztPQUdHO0lBQ0gsU0FBUyxDQUFTO0lBQ2xCOzs7T0FHRztJQUNILG9CQUFvQixDQUFTO0lBRTdCOztPQUVHO0lBQ0gsSUFBSSxPQUFPO1FBQ1QsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzVCLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNiLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxPQUFPLEdBQUcsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdEcsQ0FBQztRQUNELE9BQU8sT0FBa0IsQ0FBQztJQUM1QixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILElBQUksVUFBVTtRQUNaLElBQUksQ0FBQyxJQUFJ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
@@ -0,0 +1,37 @@
1
+ import { BaseContextClass } from '../../lib/core/base_context_class.js';
2
+ /**
3
+ * The Helper class which can be used as utility function.
4
+ * We support developers to extend Helper through ${baseDir}/app/extend/helper.js ,
5
+ * then you can use all method on `ctx.helper` that is a instance of Helper.
6
+ */
7
+ export default class Helper extends BaseContextClass {
8
+ /**
9
+ * Generate URL path(without host) for route. Takes the route name and a map of named params.
10
+ * @function Helper#pathFor
11
+ * @param {String} name - Router Name
12
+ * @param {Object} params - Other params
13
+ *
14
+ * @example
15
+ * ```js
16
+ * app.get('home', '/index.htm', 'home.index');
17
+ * ctx.helper.pathFor('home', { by: 'recent', limit: 20 })
18
+ * => /index.htm?by=recent&limit=20
19
+ * ```
20
+ * @return {String} url path(without host)
21
+ */
22
+ pathFor(name: string, params: Record<string, any>): string;
23
+ /**
24
+ * Generate full URL(with host) for route. Takes the route name and a map of named params.
25
+ * @function Helper#urlFor
26
+ * @param {String} name - Router name
27
+ * @param {Object} params - Other params
28
+ * @example
29
+ * ```js
30
+ * app.get('home', '/index.htm', 'home.index');
31
+ * ctx.helper.urlFor('home', { by: 'recent', limit: 20 })
32
+ * => http://127.0.0.1:7001/index.htm?by=recent&limit=20
33
+ * ```
34
+ * @return {String} full url(with host)
35
+ */
36
+ urlFor(name: string, params: Record<string, any>): string;
37
+ }
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const node_url_1 = __importDefault(require("node:url"));
7
+ const base_context_class_js_1 = require("../../lib/core/base_context_class.js");
8
+ /**
9
+ * The Helper class which can be used as utility function.
10
+ * We support developers to extend Helper through ${baseDir}/app/extend/helper.js ,
11
+ * then you can use all method on `ctx.helper` that is a instance of Helper.
12
+ */
13
+ class Helper extends base_context_class_js_1.BaseContextClass {
14
+ /**
15
+ * Generate URL path(without host) for route. Takes the route name and a map of named params.
16
+ * @function Helper#pathFor
17
+ * @param {String} name - Router Name
18
+ * @param {Object} params - Other params
19
+ *
20
+ * @example
21
+ * ```js
22
+ * app.get('home', '/index.htm', 'home.index');
23
+ * ctx.helper.pathFor('home', { by: 'recent', limit: 20 })
24
+ * => /index.htm?by=recent&limit=20
25
+ * ```
26
+ * @return {String} url path(without host)
27
+ */
28
+ pathFor(name, params) {
29
+ return this.app.router.url(name, params);
30
+ }
31
+ /**
32
+ * Generate full URL(with host) for route. Takes the route name and a map of named params.
33
+ * @function Helper#urlFor
34
+ * @param {String} name - Router name
35
+ * @param {Object} params - Other params
36
+ * @example
37
+ * ```js
38
+ * app.get('home', '/index.htm', 'home.index');
39
+ * ctx.helper.urlFor('home', { by: 'recent', limit: 20 })
40
+ * => http://127.0.0.1:7001/index.htm?by=recent&limit=20
41
+ * ```
42
+ * @return {String} full url(with host)
43
+ */
44
+ urlFor(name, params) {
45
+ return this.ctx.protocol + '://' + this.ctx.host + node_url_1.default.resolve('/', this.pathFor(name, params));
46
+ }
47
+ }
48
+ exports.default = Helper;
49
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2FwcC9leHRlbmQvaGVscGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsd0RBQTJCO0FBQzNCLGdGQUF3RTtBQUV4RTs7OztHQUlHO0FBQ0gsTUFBcUIsTUFBTyxTQUFRLHdDQUFnQjtJQUNsRDs7Ozs7Ozs7Ozs7OztPQWFHO0lBQ0gsT0FBTyxDQUFDLElBQVksRUFBRSxNQUEyQjtRQUMvQyxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7T0FZRztJQUNILE1BQU0sQ0FBQyxJQUFZLEVBQUUsTUFBMkI7UUFDOUMsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsa0JBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDbEcsQ0FBQztDQUNGO0FBbkNELHlCQW1DQyJ9
@@ -0,0 +1,128 @@
1
+ import { Request as EggCoreRequest } from '@eggjs/core';
2
+ import type { Application } from '../../lib/application.js';
3
+ import type { ContextDelegation } from './context.js';
4
+ import Response from './response.js';
5
+ export default class Request extends EggCoreRequest {
6
+ app: Application;
7
+ ctx: ContextDelegation;
8
+ response: Response;
9
+ /**
10
+ * Parse the "Host" header field host
11
+ * and support X-Forwarded-Host when a
12
+ * proxy is enabled.
13
+ * @member {String} Request#host
14
+ * @example
15
+ * ip + port
16
+ * ```js
17
+ * this.request.host
18
+ * => '127.0.0.1:7001'
19
+ * ```
20
+ * or domain
21
+ * ```js
22
+ * this.request.host
23
+ * => 'demo.eggjs.org'
24
+ * ```
25
+ */
26
+ get host(): string;
27
+ /**
28
+ * @member {String} Request#protocol
29
+ * @example
30
+ * ```js
31
+ * this.request.protocol
32
+ * => 'https'
33
+ * ```
34
+ */
35
+ get protocol(): string;
36
+ /**
37
+ * Get all pass through ip addresses from the request.
38
+ * Enable only on `app.config.proxy = true`
39
+ *
40
+ * @member {Array} Request#ips
41
+ * @example
42
+ * ```js
43
+ * this.request.ips
44
+ * => ['100.23.1.2', '201.10.10.2']
45
+ * ```
46
+ */
47
+ get ips(): string[];
48
+ /**
49
+ * Get the request remote IPv4 address
50
+ * @member {String} Request#ip
51
+ * @return {String} IPv4 address
52
+ * @example
53
+ * ```js
54
+ * this.request.ip
55
+ * => '127.0.0.1'
56
+ * => '111.10.2.1'
57
+ * ```
58
+ */
59
+ get ip(): string;
60
+ /**
61
+ * Set the request remote IPv4 address
62
+ * @member {String} Request#ip
63
+ * @param {String} ip - IPv4 address
64
+ * @example
65
+ * ```js
66
+ * this.request.ip
67
+ * => '127.0.0.1'
68
+ * => '111.10.2.1'
69
+ * ```
70
+ */
71
+ set ip(ip: string);
72
+ /**
73
+ * detect if response should be json
74
+ * 1. url path ends with `.json`
75
+ * 2. response type is set to json
76
+ * 3. detect by request accept header
77
+ *
78
+ * @member {Boolean} Request#acceptJSON
79
+ * @since 1.0.0
80
+ */
81
+ get acceptJSON(): boolean;
82
+ _customQuery(cacheName: symbol, filter: (value: string | string[]) => string | string[]): Record<string, string | string[]>;
83
+ /**
84
+ * get params pass by querystring, all values are of string type.
85
+ * @member {Object} Request#query
86
+ * @example
87
+ * ```js
88
+ * GET http://127.0.0.1:7001?name=Foo&age=20&age=21
89
+ * this.query
90
+ * => { 'name': 'Foo', 'age': '20' }
91
+ *
92
+ * GET http://127.0.0.1:7001?a=b&a=c&o[foo]=bar&b[]=1&b[]=2&e=val
93
+ * this.query
94
+ * =>
95
+ * {
96
+ * "a": "b",
97
+ * "o[foo]": "bar",
98
+ * "b[]": "1",
99
+ * "e": "val"
100
+ * }
101
+ * ```
102
+ */
103
+ get query(): Record<string, string>;
104
+ /**
105
+ * get params pass by querystring, all value are Array type. {@link Request#query}
106
+ * @member {Array} Request#queries
107
+ * @example
108
+ * ```js
109
+ * GET http://127.0.0.1:7001?a=b&a=c&o[foo]=bar&b[]=1&b[]=2&e=val
110
+ * this.queries
111
+ * =>
112
+ * {
113
+ * "a": ["b", "c"],
114
+ * "o[foo]": ["bar"],
115
+ * "b[]": ["1", "2"],
116
+ * "e": ["val"]
117
+ * }
118
+ * ```
119
+ */
120
+ get queries(): Record<string, string[]>;
121
+ /**
122
+ * Set query-string as an object.
123
+ *
124
+ * @function Request#query
125
+ * @param {Object} obj set querystring and query object for request.
126
+ */
127
+ set query(obj: Record<string, string>);
128
+ }