@eggjs/view 4.0.0-beta.26 → 4.0.0-beta.28
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 +83 -49
- package/dist/app/extend/application.d.ts +0 -3
- package/dist/app/extend/application.js +1 -2
- package/dist/app/extend/context.d.ts +0 -3
- package/dist/app/extend/context.js +1 -2
- package/dist/config/config.default.d.ts +3 -2
- package/dist/config/config.default.js +3 -2
- package/dist/lib/context_view.d.ts +4 -13
- package/dist/lib/context_view.js +11 -15
- package/dist/lib/view_manager.js +1 -1
- package/package.json +6 -6
package/README.md
CHANGED
|
@@ -19,36 +19,42 @@ npm i @eggjs/view
|
|
|
19
19
|
## Usage
|
|
20
20
|
|
|
21
21
|
```js
|
|
22
|
-
// {app_root}/config/plugin.
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
22
|
+
// {app_root}/config/plugin.ts
|
|
23
|
+
export default {
|
|
24
|
+
view: {
|
|
25
|
+
enable: true,
|
|
26
|
+
package: '@eggjs/view',
|
|
27
|
+
},
|
|
26
28
|
};
|
|
27
29
|
```
|
|
28
30
|
|
|
29
31
|
## Use a template engine
|
|
30
32
|
|
|
31
|
-
[
|
|
33
|
+
[@eggjs/view] don't have build-in view engine, So you should choose a template engine like [ejs], and install [egg-view-ejs] plugin.
|
|
32
34
|
|
|
33
35
|
You can choose a template engine first, link [ejs], so we use [egg-view-ejs] plugin.
|
|
34
36
|
|
|
35
37
|
`egg-view` is in [eggjs], so you just need configure [egg-view-ejs].
|
|
36
38
|
|
|
37
39
|
```js
|
|
38
|
-
// config/plugin.
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
40
|
+
// config/plugin.ts
|
|
41
|
+
export default {
|
|
42
|
+
ejs: {
|
|
43
|
+
enable: true,
|
|
44
|
+
package: 'egg-view-ejs',
|
|
45
|
+
},
|
|
42
46
|
};
|
|
43
47
|
```
|
|
44
48
|
|
|
45
49
|
Configure the mapping, the file with `.ejs` extension will be rendered by ejs.
|
|
46
50
|
|
|
47
51
|
```js
|
|
48
|
-
// config/config.default.
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
+
// config/config.default.ts
|
|
53
|
+
export default {
|
|
54
|
+
view: {
|
|
55
|
+
mapping: {
|
|
56
|
+
'.ejs': 'ejs',
|
|
57
|
+
},
|
|
52
58
|
},
|
|
53
59
|
};
|
|
54
60
|
```
|
|
@@ -56,20 +62,20 @@ exports.view = {
|
|
|
56
62
|
In controller, you can call `ctx.render`.
|
|
57
63
|
|
|
58
64
|
```js
|
|
59
|
-
|
|
65
|
+
export default (app: Application) => {
|
|
60
66
|
return class UserController extends app.Controller {
|
|
61
67
|
async list() {
|
|
62
68
|
const { ctx } = this;
|
|
63
69
|
await ctx.render('user.ejs');
|
|
64
70
|
}
|
|
65
71
|
};
|
|
66
|
-
}
|
|
72
|
+
}
|
|
67
73
|
```
|
|
68
74
|
|
|
69
75
|
If you call `ctx.renderString`, you should specify viewEngine in viewOptions.
|
|
70
76
|
|
|
71
77
|
```js
|
|
72
|
-
|
|
78
|
+
export default (app: Application) => {
|
|
73
79
|
return class UserController extends app.Controller {
|
|
74
80
|
async list() {
|
|
75
81
|
const { ctx } = this;
|
|
@@ -82,7 +88,7 @@ module.exports = app => {
|
|
|
82
88
|
);
|
|
83
89
|
}
|
|
84
90
|
};
|
|
85
|
-
}
|
|
91
|
+
}
|
|
86
92
|
```
|
|
87
93
|
|
|
88
94
|
## Use multiple view engine
|
|
@@ -94,11 +100,27 @@ If you want add another template engine like [nunjucks], then you can add [egg-v
|
|
|
94
100
|
Configure the plugin and mapping
|
|
95
101
|
|
|
96
102
|
```js
|
|
97
|
-
// config/
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
103
|
+
// config/plugin.ts
|
|
104
|
+
export default {
|
|
105
|
+
ejs: {
|
|
106
|
+
enable: true,
|
|
107
|
+
package: 'egg-view-ejs',
|
|
108
|
+
},
|
|
109
|
+
nunjucks: {
|
|
110
|
+
enable: true,
|
|
111
|
+
package: 'egg-view-nunjucks',
|
|
112
|
+
},
|
|
113
|
+
};
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
```js
|
|
117
|
+
// config/config.default.ts
|
|
118
|
+
export default {
|
|
119
|
+
view: {
|
|
120
|
+
mapping: {
|
|
121
|
+
'.ejs': 'ejs',
|
|
122
|
+
'.nj': 'nunjucks',
|
|
123
|
+
},
|
|
102
124
|
},
|
|
103
125
|
};
|
|
104
126
|
```
|
|
@@ -111,28 +133,29 @@ await ctx.render('user.nj');
|
|
|
111
133
|
|
|
112
134
|
## How to write a view plugin
|
|
113
135
|
|
|
114
|
-
You can use [
|
|
136
|
+
You can use [@eggjs/view]'s API to register a plugin.
|
|
115
137
|
|
|
116
138
|
### View engine
|
|
117
139
|
|
|
118
|
-
Create a view engine class first, and implement `render` and `renderString`, if the template engine don't support, just throw an error.
|
|
140
|
+
Create a view engine class first, and implement `render` and `renderString`, if the template engine don't support, just throw an error.
|
|
141
|
+
The view engine is context level, so it receive ctx in `constructor`.
|
|
119
142
|
|
|
120
143
|
```js
|
|
121
|
-
// lib/view.
|
|
122
|
-
|
|
144
|
+
// lib/view.ts
|
|
145
|
+
export default class MyView {
|
|
123
146
|
constructor(ctx) {
|
|
124
147
|
// do some initialize
|
|
125
148
|
// get the plugin config from `ctx.app.config`
|
|
126
149
|
}
|
|
127
150
|
|
|
128
|
-
async render(fullpath, locals) {
|
|
151
|
+
async render(fullpath: string, locals: Record<string, any>) {
|
|
129
152
|
return myengine.render(fullpath, locals);
|
|
130
153
|
}
|
|
131
154
|
|
|
132
155
|
async renderString() {
|
|
133
156
|
throw new Error('not implement');
|
|
134
157
|
}
|
|
135
|
-
}
|
|
158
|
+
}
|
|
136
159
|
```
|
|
137
160
|
|
|
138
161
|
`render` and `renderString` support generator function, async function, or normal function return a promise.
|
|
@@ -178,17 +201,20 @@ These methods receive three arguments, `renderString` will pass tpl as the first
|
|
|
178
201
|
After define a view engine, you can register it.
|
|
179
202
|
|
|
180
203
|
```js
|
|
181
|
-
// app.
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
204
|
+
// app.ts
|
|
205
|
+
import type { Application } from 'egg';
|
|
206
|
+
import MyView from './lib/view';
|
|
207
|
+
|
|
208
|
+
export default (app: Application) => {
|
|
209
|
+
app.view.use('myName', MyView);
|
|
210
|
+
}
|
|
185
211
|
```
|
|
186
212
|
|
|
187
213
|
You can define a view engine name, normally it's a template name.
|
|
188
214
|
|
|
189
215
|
### Configure
|
|
190
216
|
|
|
191
|
-
Define plugin name and depend on [
|
|
217
|
+
Define plugin name and depend on [@eggjs/view]
|
|
192
218
|
|
|
193
219
|
```json
|
|
194
220
|
{
|
|
@@ -199,10 +225,12 @@ Define plugin name and depend on [egg-view]
|
|
|
199
225
|
}
|
|
200
226
|
```
|
|
201
227
|
|
|
202
|
-
Set default config in `config/config.default.
|
|
228
|
+
Set default config in `config/config.default.ts`, the name is equals to plugin name.
|
|
203
229
|
|
|
204
230
|
```js
|
|
205
|
-
|
|
231
|
+
export default {
|
|
232
|
+
myName: {},
|
|
233
|
+
};
|
|
206
234
|
```
|
|
207
235
|
|
|
208
236
|
See some examples
|
|
@@ -214,39 +242,43 @@ See some examples
|
|
|
214
242
|
|
|
215
243
|
### Root
|
|
216
244
|
|
|
217
|
-
Root is `${baseDir}/app/view` by default, but you can define multiple directory, seperated by `,`.
|
|
245
|
+
Root is `${baseDir}/app/view` by default, but you can define multiple directory, seperated by `,`.
|
|
246
|
+
[@eggjs/view] will find a file from all root directories.
|
|
218
247
|
|
|
219
248
|
```js
|
|
220
|
-
|
|
249
|
+
export default (appInfo: EggAppInfo) => {
|
|
221
250
|
const baseDir = appInfo.baseDir;
|
|
222
251
|
return {
|
|
223
252
|
view: {
|
|
224
253
|
root: `${baseDir}/app/view,${baseDir}/app/view2`,
|
|
225
254
|
},
|
|
226
255
|
};
|
|
227
|
-
}
|
|
256
|
+
}
|
|
228
257
|
```
|
|
229
258
|
|
|
230
259
|
### defaultExtension
|
|
231
260
|
|
|
232
|
-
When render a file, you should specify a extension that let [
|
|
261
|
+
When render a file, you should specify a extension that let [@eggjs/view] know whitch engine you want to use.
|
|
262
|
+
However you can define `defaultExtension` without write the extension.
|
|
233
263
|
|
|
234
264
|
```js
|
|
235
|
-
// config/config.default.
|
|
236
|
-
|
|
237
|
-
|
|
265
|
+
// config/config.default.ts
|
|
266
|
+
export default {
|
|
267
|
+
view: {
|
|
268
|
+
defaultExtension: '.html',
|
|
269
|
+
},
|
|
238
270
|
};
|
|
239
271
|
|
|
240
272
|
// controller
|
|
241
|
-
|
|
273
|
+
export default (app: Application) => {
|
|
242
274
|
return class UserController extends app.Controller {
|
|
243
275
|
async list() {
|
|
244
276
|
const { ctx } = this;
|
|
245
277
|
// render user.html
|
|
246
278
|
await ctx.render('user');
|
|
247
279
|
}
|
|
248
|
-
}
|
|
249
|
-
}
|
|
280
|
+
}
|
|
281
|
+
}
|
|
250
282
|
```
|
|
251
283
|
|
|
252
284
|
### viewEngine and defaultViewEngine
|
|
@@ -256,9 +288,11 @@ If you are using `renderString`, you should specify viewEngine in view config, s
|
|
|
256
288
|
However, you can define `defaultViewEngine` without set each time.
|
|
257
289
|
|
|
258
290
|
```js
|
|
259
|
-
// config/config.default.
|
|
260
|
-
|
|
261
|
-
|
|
291
|
+
// config/config.default.ts
|
|
292
|
+
export default {
|
|
293
|
+
view: {
|
|
294
|
+
defaultViewEngine: 'ejs',
|
|
295
|
+
},
|
|
262
296
|
};
|
|
263
297
|
```
|
|
264
298
|
|
|
@@ -281,6 +315,6 @@ Made with [contributors-img](https://contrib.rocks).
|
|
|
281
315
|
[eggjs]: https://eggjs.org
|
|
282
316
|
[ejs]: https://github.com/mde/ejs
|
|
283
317
|
[egg-view-ejs]: https://github.com/eggjs/egg-view-ejs
|
|
284
|
-
[
|
|
318
|
+
[@eggjs/view]: https://github.com/eggjs/egg/tree/next/plugins/view
|
|
285
319
|
[nunjucks]: http://mozilla.github.io/nunjucks
|
|
286
320
|
[egg-view-nunjucks]: https://github.com/eggjs/egg-view-nunjucks
|
|
@@ -1,12 +1,9 @@
|
|
|
1
1
|
import { Application } from 'egg';
|
|
2
2
|
import { ViewManager } from '../../lib/view_manager.ts';
|
|
3
|
-
declare const VIEW: unique symbol;
|
|
4
3
|
export default class ViewApplication extends Application {
|
|
5
|
-
[VIEW]: ViewManager;
|
|
6
4
|
/**
|
|
7
5
|
* Retrieve ViewManager instance
|
|
8
6
|
* @member {ViewManager} Application#view
|
|
9
7
|
*/
|
|
10
8
|
get view(): ViewManager;
|
|
11
9
|
}
|
|
12
|
-
export {};
|
|
@@ -2,7 +2,6 @@ import { Application } from 'egg';
|
|
|
2
2
|
import { ViewManager } from "../../lib/view_manager.js";
|
|
3
3
|
const VIEW = Symbol('Application#view');
|
|
4
4
|
export default class ViewApplication extends Application {
|
|
5
|
-
[VIEW];
|
|
6
5
|
/**
|
|
7
6
|
* Retrieve ViewManager instance
|
|
8
7
|
* @member {ViewManager} Application#view
|
|
@@ -14,4 +13,4 @@ export default class ViewApplication extends Application {
|
|
|
14
13
|
return this[VIEW];
|
|
15
14
|
}
|
|
16
15
|
}
|
|
17
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
16
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwbGljYXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBwL2V4dGVuZC9hcHBsaWNhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBRWxDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUV4RCxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsa0JBQWtCLENBQUMsQ0FBQztBQUV4QyxNQUFNLENBQUMsT0FBTyxPQUFPLGVBQWdCLFNBQVEsV0FBVztJQUN0RDs7O09BR0c7SUFDSCxJQUFJLElBQUk7UUFDTixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDaEIsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3JDLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQWdCLENBQUM7SUFDbkMsQ0FBQztDQUNGIn0=
|
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
import { Context } from 'egg';
|
|
2
2
|
import { ContextView } from '../../lib/context_view.ts';
|
|
3
3
|
import { type RenderOptions } from '../../lib/view_manager.ts';
|
|
4
|
-
declare const VIEW: unique symbol;
|
|
5
4
|
export default class ViewContext extends Context {
|
|
6
|
-
[VIEW]: ContextView;
|
|
7
5
|
/**
|
|
8
6
|
* Render a file by view engine, then set to body
|
|
9
7
|
* @param {String} name - the file path based on root
|
|
@@ -33,4 +31,3 @@ export default class ViewContext extends Context {
|
|
|
33
31
|
*/
|
|
34
32
|
get view(): ContextView;
|
|
35
33
|
}
|
|
36
|
-
export {};
|
|
@@ -3,7 +3,6 @@ import { ContextView } from "../../lib/context_view.js";
|
|
|
3
3
|
import {} from "../../lib/view_manager.js";
|
|
4
4
|
const VIEW = Symbol('Context#view');
|
|
5
5
|
export default class ViewContext extends Context {
|
|
6
|
-
[VIEW];
|
|
7
6
|
/**
|
|
8
7
|
* Render a file by view engine, then set to body
|
|
9
8
|
* @param {String} name - the file path based on root
|
|
@@ -45,4 +44,4 @@ export default class ViewContext extends Context {
|
|
|
45
44
|
return this[VIEW];
|
|
46
45
|
}
|
|
47
46
|
}
|
|
48
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
47
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGV4dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hcHAvZXh0ZW5kL2NvbnRleHQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLEtBQUssQ0FBQztBQUU5QixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDeEQsT0FBTyxFQUFzQixNQUFNLDJCQUEyQixDQUFDO0FBRS9ELE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztBQUVwQyxNQUFNLENBQUMsT0FBTyxPQUFPLFdBQVksU0FBUSxPQUFPO0lBQzlDOzs7OztPQUtHO0lBQ0gsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFZLEVBQUUsTUFBNEIsRUFBRSxPQUF1QjtRQUM5RSxNQUFNLElBQUksR0FBRyxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztRQUMxRCxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztJQUNuQixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsS0FBSyxDQUFDLFVBQVUsQ0FBQyxJQUFZLEVBQUUsTUFBNEIsRUFBRSxPQUF1QjtRQUNsRixPQUFPLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsS0FBSyxDQUFDLFlBQVksQ0FBQyxHQUFXLEVBQUUsTUFBNEIsRUFBRSxPQUF1QjtRQUNuRixPQUFPLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztJQUM1RCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsSUFBSSxJQUFJO1FBQ04sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ2hCLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNyQyxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFnQixDQUFDO0lBQ25DLENBQUM7Q0FDRiJ9
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type EggConfigFactory } from 'egg';
|
|
1
2
|
export interface ViewConfig {
|
|
2
3
|
/**
|
|
3
4
|
* give a path to find the file, you can specify multiple path with `,` delimiter
|
|
@@ -25,5 +26,5 @@ export interface ViewConfig {
|
|
|
25
26
|
*/
|
|
26
27
|
mapping: Record<string, string>;
|
|
27
28
|
}
|
|
28
|
-
declare const
|
|
29
|
-
export default
|
|
29
|
+
declare const config: EggConfigFactory;
|
|
30
|
+
export default config;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import path from 'node:path';
|
|
2
2
|
import { defineConfigFactory } from 'egg';
|
|
3
|
-
|
|
3
|
+
const config = defineConfigFactory(appInfo => ({
|
|
4
4
|
view: {
|
|
5
5
|
root: path.join(appInfo.baseDir, 'app/view'),
|
|
6
6
|
cache: true,
|
|
@@ -9,4 +9,5 @@ export default defineConfigFactory(appInfo => ({
|
|
|
9
9
|
mapping: {},
|
|
10
10
|
},
|
|
11
11
|
}));
|
|
12
|
-
|
|
12
|
+
export default config;
|
|
13
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmRlZmF1bHQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29uZmlnL2NvbmZpZy5kZWZhdWx0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sSUFBSSxNQUFNLFdBQVcsQ0FBQztBQUU3QixPQUFPLEVBQUUsbUJBQW1CLEVBQXlCLE1BQU0sS0FBSyxDQUFDO0FBOEJqRSxNQUFNLE1BQU0sR0FBcUIsbUJBQW1CLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQy9ELElBQUksRUFBRTtRQUNKLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDO1FBQzVDLEtBQUssRUFBRSxJQUFJO1FBQ1gsZ0JBQWdCLEVBQUUsT0FBTztRQUN6QixpQkFBaUIsRUFBRSxFQUFFO1FBQ3JCLE9BQU8sRUFBRSxFQUFFO0tBQ1o7Q0FDRixDQUFDLENBQUMsQ0FBQztBQUVKLGVBQWUsTUFBTSxDQUFDIn0=
|
|
@@ -1,9 +1,5 @@
|
|
|
1
1
|
import type { Context, Application } from 'egg';
|
|
2
2
|
import { ViewManager, type ViewManagerConfig, type RenderOptions } from './view_manager.ts';
|
|
3
|
-
declare const RENDER: unique symbol;
|
|
4
|
-
declare const RENDER_STRING: unique symbol;
|
|
5
|
-
declare const GET_VIEW_ENGINE: unique symbol;
|
|
6
|
-
declare const SET_LOCALS: unique symbol;
|
|
7
3
|
/**
|
|
8
4
|
* View instance for each request.
|
|
9
5
|
*
|
|
@@ -32,17 +28,12 @@ export declare class ContextView {
|
|
|
32
28
|
* @return {Promise<String>} result - return a promise with a render result
|
|
33
29
|
*/
|
|
34
30
|
renderString(tpl: string, locals?: Record<string, any>, options?: RenderOptions): Promise<string>;
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
31
|
+
private _render;
|
|
32
|
+
private _renderString;
|
|
33
|
+
private _getViewEngine;
|
|
38
34
|
/**
|
|
39
35
|
* set locals for view, inject `locals.ctx`, `locals.request`, `locals.helper`
|
|
40
36
|
* @private
|
|
41
37
|
*/
|
|
42
|
-
|
|
43
|
-
ctx: Context;
|
|
44
|
-
request: import("egg").Request;
|
|
45
|
-
helper: import("egg").Helper;
|
|
46
|
-
} & Record<string, any>;
|
|
38
|
+
private _setLocals;
|
|
47
39
|
}
|
|
48
|
-
export {};
|
package/dist/lib/context_view.js
CHANGED
|
@@ -1,10 +1,6 @@
|
|
|
1
1
|
import path from 'node:path';
|
|
2
2
|
import assert from 'node:assert';
|
|
3
3
|
import { ViewManager } from "./view_manager.js";
|
|
4
|
-
const RENDER = Symbol.for('contextView#render');
|
|
5
|
-
const RENDER_STRING = Symbol.for('contextView#renderString');
|
|
6
|
-
const GET_VIEW_ENGINE = Symbol.for('contextView#getViewEngine');
|
|
7
|
-
const SET_LOCALS = Symbol.for('contextView#setLocals');
|
|
8
4
|
/**
|
|
9
5
|
* View instance for each request.
|
|
10
6
|
*
|
|
@@ -30,7 +26,7 @@ export class ContextView {
|
|
|
30
26
|
* @return {Promise<String>} result - return a promise with a render result
|
|
31
27
|
*/
|
|
32
28
|
async render(name, locals, options) {
|
|
33
|
-
return await this
|
|
29
|
+
return await this._render(name, locals, options);
|
|
34
30
|
}
|
|
35
31
|
/**
|
|
36
32
|
* Render a template string by view engine
|
|
@@ -40,10 +36,10 @@ export class ContextView {
|
|
|
40
36
|
* @return {Promise<String>} result - return a promise with a render result
|
|
41
37
|
*/
|
|
42
38
|
async renderString(tpl, locals, options) {
|
|
43
|
-
return await this
|
|
39
|
+
return await this._renderString(tpl, locals, options);
|
|
44
40
|
}
|
|
45
41
|
// ext -> viewEngineName -> viewEngine
|
|
46
|
-
async
|
|
42
|
+
async _render(name, locals, options = {}) {
|
|
47
43
|
// retrieve fullpath matching name from `config.root`
|
|
48
44
|
const filename = await this.viewManager.resolve(name);
|
|
49
45
|
options.name = name;
|
|
@@ -62,20 +58,20 @@ export class ContextView {
|
|
|
62
58
|
}
|
|
63
59
|
assert(viewEngineName, `Can't find viewEngine for ${filename}`);
|
|
64
60
|
// get view engine and render
|
|
65
|
-
const viewEngine = this
|
|
66
|
-
return await viewEngine.render(filename, this
|
|
61
|
+
const viewEngine = this._getViewEngine(viewEngineName);
|
|
62
|
+
return await viewEngine.render(filename, this._setLocals(locals), options);
|
|
67
63
|
}
|
|
68
|
-
async
|
|
64
|
+
async _renderString(tpl, locals, options) {
|
|
69
65
|
let viewEngineName = options && options.viewEngine;
|
|
70
66
|
if (!viewEngineName) {
|
|
71
67
|
viewEngineName = this.config.defaultViewEngine;
|
|
72
68
|
}
|
|
73
69
|
assert(viewEngineName, "Can't find viewEngine");
|
|
74
70
|
// get view engine and render
|
|
75
|
-
const viewEngine = this
|
|
76
|
-
return await viewEngine.renderString(tpl, this
|
|
71
|
+
const viewEngine = this._getViewEngine(viewEngineName);
|
|
72
|
+
return await viewEngine.renderString(tpl, this._setLocals(locals), options);
|
|
77
73
|
}
|
|
78
|
-
|
|
74
|
+
_getViewEngine(name) {
|
|
79
75
|
// get view engine
|
|
80
76
|
const ViewEngine = this.viewManager.get(name);
|
|
81
77
|
assert(ViewEngine, `Can't find ViewEngine "${name}"`);
|
|
@@ -87,7 +83,7 @@ export class ContextView {
|
|
|
87
83
|
* set locals for view, inject `locals.ctx`, `locals.request`, `locals.helper`
|
|
88
84
|
* @private
|
|
89
85
|
*/
|
|
90
|
-
|
|
86
|
+
_setLocals(locals) {
|
|
91
87
|
return Object.assign({
|
|
92
88
|
ctx: this.ctx,
|
|
93
89
|
request: this.ctx.request,
|
|
@@ -95,4 +91,4 @@ export class ContextView {
|
|
|
95
91
|
}, this.ctx.locals, locals);
|
|
96
92
|
}
|
|
97
93
|
}
|
|
98
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
94
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGV4dF92aWV3LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xpYi9jb250ZXh0X3ZpZXcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxJQUFJLE1BQU0sV0FBVyxDQUFDO0FBQzdCLE9BQU8sTUFBTSxNQUFNLGFBQWEsQ0FBQztBQUlqQyxPQUFPLEVBQUUsV0FBVyxFQUErRCxNQUFNLG1CQUFtQixDQUFDO0FBRTdHOzs7OztHQUtHO0FBQ0gsTUFBTSxPQUFPLFdBQVc7SUFDWixHQUFHLENBQVU7SUFDYixHQUFHLENBQWM7SUFDakIsV0FBVyxDQUFjO0lBQ3pCLE1BQU0sQ0FBb0I7SUFFcEMsWUFBWSxHQUFZO1FBQ3RCLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBQ2YsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztRQUN4QixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3JDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxLQUFLLENBQUMsTUFBTSxDQUFDLElBQVksRUFBRSxNQUE0QixFQUFFLE9BQXVCO1FBQzlFLE9BQU8sTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILEtBQUssQ0FBQyxZQUFZLENBQUMsR0FBVyxFQUFFLE1BQTRCLEVBQUUsT0FBdUI7UUFDbkYsT0FBTyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBRUQsc0NBQXNDO0lBQzlCLEtBQUssQ0FBQyxPQUFPLENBQUMs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
|
package/dist/lib/view_manager.js
CHANGED
|
@@ -86,4 +86,4 @@ async function resolvePath(names, root) {
|
|
|
86
86
|
function inpath(parent, sub) {
|
|
87
87
|
return sub.indexOf(parent) > -1;
|
|
88
88
|
}
|
|
89
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
89
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlld19tYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xpYi92aWV3X21hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxNQUFNLE1BQU0sYUFBYSxDQUFDO0FBQ2pDLE9BQU8sSUFBSSxNQUFNLFdBQVcsQ0FBQztBQUM3QixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBRXJDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFFakMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBd0JqRDs7Ozs7R0FLRztBQUNILE1BQU0sT0FBTyxXQUFZLFNBQVEsR0FBNEI7SUFDM0QsTUFBTSxDQUFvQjtJQUMxQixNQUFNLENBQXNCO0lBQzVCLE9BQU8sQ0FBc0I7SUFFN0I7O09BRUc7SUFDSCxZQUFZLEdBQWdCO1FBQzFCLEtBQUssRUFBRSxDQUFDO1FBQ1IsSUFBSSxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQW9DLENBQUM7UUFDOUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUNuRyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ3pCLEtBQUssTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDbkQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUks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
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@eggjs/view",
|
|
3
|
-
"version": "4.0.0-beta.
|
|
3
|
+
"version": "4.0.0-beta.28",
|
|
4
4
|
"description": "Base view plugin for egg",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
@@ -51,14 +51,14 @@
|
|
|
51
51
|
"utility": "^2.5.0"
|
|
52
52
|
},
|
|
53
53
|
"peerDependencies": {
|
|
54
|
-
"egg": "4.1.0-beta.
|
|
54
|
+
"egg": "4.1.0-beta.28"
|
|
55
55
|
},
|
|
56
56
|
"devDependencies": {
|
|
57
|
-
"tsdown": "^0.15.
|
|
57
|
+
"tsdown": "^0.15.6",
|
|
58
58
|
"typescript": "^5.9.3",
|
|
59
|
-
"vitest": "4.0.0-beta.
|
|
60
|
-
"@eggjs/mock": "7.0.0-beta.
|
|
61
|
-
"@eggjs/tsconfig": "3.1.0-beta.
|
|
59
|
+
"vitest": "4.0.0-beta.18",
|
|
60
|
+
"@eggjs/mock": "7.0.0-beta.28",
|
|
61
|
+
"@eggjs/tsconfig": "3.1.0-beta.28"
|
|
62
62
|
},
|
|
63
63
|
"scripts": {
|
|
64
64
|
"lint": "oxlint --type-aware",
|