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