@eggjs/view 3.0.1 → 4.0.0-beta.17
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 +18 -15
- package/dist/app/extend/application.d.ts +15 -0
- package/dist/app/extend/application.js +19 -0
- package/dist/app/extend/context.d.ts +39 -0
- package/dist/app/extend/context.js +49 -0
- package/dist/config/config.default.d.ts +33 -0
- package/dist/config/config.default.js +14 -0
- package/dist/config/config.local.d.ts +6 -0
- package/dist/config/config.local.js +5 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +8 -0
- package/dist/lib/context_view.d.ts +52 -0
- package/dist/lib/context_view.js +86 -0
- package/dist/lib/index.d.ts +3 -0
- package/dist/lib/index.js +4 -0
- package/dist/lib/view_manager.d.ts +61 -0
- package/dist/lib/view_manager.js +83 -0
- package/dist/types.d.ts +28 -0
- package/dist/types.js +1 -0
- package/package.json +41 -66
- package/dist/commonjs/app/extend/application.d.ts +0 -17
- package/dist/commonjs/app/extend/application.js +0 -20
- package/dist/commonjs/app/extend/context.d.ts +0 -44
- package/dist/commonjs/app/extend/context.js +0 -50
- package/dist/commonjs/config/config.default.d.ts +0 -52
- package/dist/commonjs/config/config.default.js +0 -16
- package/dist/commonjs/config/config.local.d.ts +0 -3
- package/dist/commonjs/config/config.local.js +0 -8
- package/dist/commonjs/index.d.ts +0 -3
- package/dist/commonjs/index.js +0 -6
- package/dist/commonjs/lib/context_view.d.ts +0 -48
- package/dist/commonjs/lib/context_view.js +0 -104
- package/dist/commonjs/lib/view_manager.d.ts +0 -57
- package/dist/commonjs/lib/view_manager.js +0 -98
- package/dist/commonjs/package.json +0 -3
- package/dist/esm/app/extend/application.d.ts +0 -17
- package/dist/esm/app/extend/application.js +0 -17
- package/dist/esm/app/extend/context.d.ts +0 -44
- package/dist/esm/app/extend/context.js +0 -47
- package/dist/esm/config/config.default.d.ts +0 -52
- package/dist/esm/config/config.default.js +0 -11
- package/dist/esm/config/config.local.d.ts +0 -3
- package/dist/esm/config/config.local.js +0 -6
- package/dist/esm/index.d.ts +0 -3
- package/dist/esm/index.js +0 -4
- package/dist/esm/lib/context_view.d.ts +0 -48
- package/dist/esm/lib/context_view.js +0 -97
- package/dist/esm/lib/view_manager.d.ts +0 -57
- package/dist/esm/lib/view_manager.js +0 -91
- package/dist/esm/package.json +0 -3
- package/dist/package.json +0 -4
- package/src/app/extend/application.ts +0 -25
- package/src/app/extend/context.ts +0 -66
- package/src/config/config.default.ts +0 -56
- package/src/config/config.local.ts +0 -7
- package/src/index.ts +0 -3
- package/src/lib/context_view.ts +0 -111
- package/src/lib/view_manager.ts +0 -122
- package/src/typings/index.d.ts +0 -4
|
@@ -1,98 +0,0 @@
|
|
|
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
|
-
exports.ViewManager = void 0;
|
|
7
|
-
const node_assert_1 = __importDefault(require("node:assert"));
|
|
8
|
-
const node_path_1 = __importDefault(require("node:path"));
|
|
9
|
-
const node_fs_1 = require("node:fs");
|
|
10
|
-
const utility_1 = require("utility");
|
|
11
|
-
const is_type_of_1 = require("is-type-of");
|
|
12
|
-
/**
|
|
13
|
-
* ViewManager will manage all view engine that is registered.
|
|
14
|
-
*
|
|
15
|
-
* It can find the real file, then retrieve the view engine based on extension.
|
|
16
|
-
* The plugin just register view engine using {@link ViewManager#use}
|
|
17
|
-
*/
|
|
18
|
-
class ViewManager extends Map {
|
|
19
|
-
config;
|
|
20
|
-
extMap;
|
|
21
|
-
fileMap;
|
|
22
|
-
/**
|
|
23
|
-
* @param {Application} app - application instance
|
|
24
|
-
*/
|
|
25
|
-
constructor(app) {
|
|
26
|
-
super();
|
|
27
|
-
this.config = app.config.view;
|
|
28
|
-
this.config.root = app.config.view.root
|
|
29
|
-
.split(/\s*,\s*/g)
|
|
30
|
-
.filter(filepath => (0, node_fs_1.existsSync)(filepath));
|
|
31
|
-
this.extMap = new Map();
|
|
32
|
-
this.fileMap = new Map();
|
|
33
|
-
for (const ext of Object.keys(this.config.mapping)) {
|
|
34
|
-
this.extMap.set(ext, this.config.mapping[ext]);
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
/**
|
|
38
|
-
* This method can register view engine.
|
|
39
|
-
*
|
|
40
|
-
* You can define a view engine class contains two method, `render` and `renderString`
|
|
41
|
-
*
|
|
42
|
-
* ```js
|
|
43
|
-
* class View {
|
|
44
|
-
* render() {}
|
|
45
|
-
* renderString() {}
|
|
46
|
-
* }
|
|
47
|
-
* ```
|
|
48
|
-
* @param {String} name - the name of view engine
|
|
49
|
-
* @param {Object} viewEngine - the class of view engine
|
|
50
|
-
*/
|
|
51
|
-
use(name, viewEngine) {
|
|
52
|
-
(0, node_assert_1.default)(name, 'name is required');
|
|
53
|
-
(0, node_assert_1.default)(!this.has(name), `${name} has been registered`);
|
|
54
|
-
(0, node_assert_1.default)(viewEngine, 'viewEngine is required');
|
|
55
|
-
(0, node_assert_1.default)(viewEngine.prototype.render, 'viewEngine should implement `render` method');
|
|
56
|
-
(0, node_assert_1.default)(!(0, is_type_of_1.isGeneratorFunction)(viewEngine.prototype.render), 'viewEngine `render` method should not be generator function');
|
|
57
|
-
(0, node_assert_1.default)(viewEngine.prototype.renderString, 'viewEngine should implement `renderString` method');
|
|
58
|
-
(0, node_assert_1.default)(!(0, is_type_of_1.isGeneratorFunction)(viewEngine.prototype.renderString), 'viewEngine `renderString` method should not be generator function');
|
|
59
|
-
this.set(name, viewEngine);
|
|
60
|
-
}
|
|
61
|
-
/**
|
|
62
|
-
* Resolve the path based on the given name,
|
|
63
|
-
* if the name is `user.html` and root is `app/view` (by default),
|
|
64
|
-
* it will return `app/view/user.html`
|
|
65
|
-
* @param {String} name - the given path name, it's relative to config.root
|
|
66
|
-
* @return {String} filename - the full path
|
|
67
|
-
*/
|
|
68
|
-
async resolve(name) {
|
|
69
|
-
const config = this.config;
|
|
70
|
-
// check cache
|
|
71
|
-
let filename = this.fileMap.get(name);
|
|
72
|
-
if (config.cache && filename)
|
|
73
|
-
return filename;
|
|
74
|
-
// try find it with default extension
|
|
75
|
-
filename = await resolvePath([name, name + config.defaultExtension], config.root);
|
|
76
|
-
(0, node_assert_1.default)(filename, `Can't find ${name} from ${config.root.join(',')}`);
|
|
77
|
-
// set cache
|
|
78
|
-
this.fileMap.set(name, filename);
|
|
79
|
-
return filename;
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
exports.ViewManager = ViewManager;
|
|
83
|
-
async function resolvePath(names, root) {
|
|
84
|
-
for (const name of names) {
|
|
85
|
-
for (const dir of root) {
|
|
86
|
-
const filename = node_path_1.default.join(dir, name);
|
|
87
|
-
if (await (0, utility_1.exists)(filename)) {
|
|
88
|
-
if (inpath(dir, filename)) {
|
|
89
|
-
return filename;
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
function inpath(parent, sub) {
|
|
96
|
-
return sub.indexOf(parent) > -1;
|
|
97
|
-
}
|
|
98
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlld19tYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi92aWV3X21hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsOERBQWlDO0FBQ2pDLDBEQUE2QjtBQUM3QixxQ0FBcUM7QUFDckMscUNBQWlDO0FBRWpDLDJDQUFpRDtBQXVCakQ7Ozs7O0dBS0c7QUFDSCxNQUFhLFdBQVksU0FBUSxHQUE0QjtJQUMzRCxNQUFNLENBQW9CO0lBQzFCLE1BQU0sQ0FBc0I7SUFDNUIsT0FBTyxDQUFzQjtJQUU3Qjs7T0FFRztJQUNILFlBQVksR0FBWTtRQUN0QixLQUFLLEVBQUUsQ0FBQztRQUNSLElBQUksQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFXLENBQUM7UUFDckMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSTthQUNwQyxLQUFLLENBQUMsVUFBVSxDQUFDO2FBQ2pCLE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLElBQUEsb0JBQVUsRUFBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQzVDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7UUFDekIsS0FBSyxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNuRCxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNqRCxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7O09BYUc7SUFDSCxHQUFHLENBQUMsSUFBWSxFQUFFLFVBQTJCO1FBQzNDLElBQUEscUJBQU0sRUFBQyxJQUFJLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztRQUNqQyxJQUFBLHFCQUFNLEVBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxzQkFBc0IsQ0FBQyxDQUFDO1FBRXZELElBQUEscUJBQU0sRUFBQyxVQUFVLEVBQUUsd0JBQXdCLENBQUMsQ0FBQztRQUM3QyxJQUFBLHFCQUFNLEVBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsNkNBQTZDLENBQUMsQ0FBQztRQUNuRixJQUFBLHFCQUFNLEVBQUMsQ0FBQyxJQUFBLGdDQUFtQixFQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEVBQUUsNkRBQTZELENBQUMsQ0FBQztRQUN6SCxJQUFBLHFCQUFNLEVBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxZQUFZLEVBQUUsbURBQW1ELENBQUMsQ0FBQztRQUMvRixJQUFBLHFCQUFNLEVBQUMsQ0FBQyxJQUFBLGdDQUFtQixFQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLEVBQUUsbUVBQW1FLENBQUMsQ0FBQztRQUVySSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFZO1FBQ3hCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7UUFFM0IsY0FBYztRQUNkLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3RDLElBQUksTUFBTSxDQUFDLEtBQUssSUFBSSxRQUFRO1lBQUUsT0FBTyxRQUFRLENBQUM7UUFFOUMscUNBQXFDO1FBQ3JDLFFBQVEsR0FBRyxNQUFNLFdBQVcsQ0FBQyxDQUFFLElBQUksRUFBRSxJQUFJLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFFLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3BGLElBQUEscUJBQU0sRUFBQyxRQUFRLEVBQUUsY0FBYyxJQUFJLFNBQVMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRXJFLFlBQVk7UUFDWixJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDakMsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztDQUNGO0FBdEVELGtDQXNFQztBQUVELEtBQUssVUFBVSxXQUFXLENBQUMsS0FBZSxFQUFFLElBQWM7SUFDeEQsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUN6QixLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ3ZCLE1BQU0sUUFBUSxHQUFHLG1CQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUN0QyxJQUFJLE1BQU0sSUFBQSxnQkFBTSxFQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7Z0JBQzNCLElBQUksTUFBTSxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsRUFBRSxDQUFDO29CQUMxQixPQUFPLFFBQVEsQ0FBQztnQkFDbEIsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztBQUNILENBQUM7QUFFRCxTQUFTLE1BQU0sQ0FBQyxNQUFjLEVBQUUsR0FBVztJQUN6QyxPQUFPLEdBQUcsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDbEMsQ0FBQyJ9
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import { EggCore } from '@eggjs/core';
|
|
2
|
-
import { ViewManager } from '../../lib/view_manager.js';
|
|
3
|
-
declare const VIEW: unique symbol;
|
|
4
|
-
export default class Application extends EggCore {
|
|
5
|
-
[VIEW]: ViewManager;
|
|
6
|
-
/**
|
|
7
|
-
* Retrieve ViewManager instance
|
|
8
|
-
* @member {ViewManager} Application#view
|
|
9
|
-
*/
|
|
10
|
-
get view(): ViewManager;
|
|
11
|
-
}
|
|
12
|
-
declare module '@eggjs/core' {
|
|
13
|
-
interface EggCore {
|
|
14
|
-
get view(): ViewManager;
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
export {};
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import { EggCore } from '@eggjs/core';
|
|
2
|
-
import { ViewManager } from '../../lib/view_manager.js';
|
|
3
|
-
const VIEW = Symbol('Application#view');
|
|
4
|
-
export default class Application extends EggCore {
|
|
5
|
-
[VIEW];
|
|
6
|
-
/**
|
|
7
|
-
* Retrieve ViewManager instance
|
|
8
|
-
* @member {ViewManager} Application#view
|
|
9
|
-
*/
|
|
10
|
-
get view() {
|
|
11
|
-
if (!this[VIEW]) {
|
|
12
|
-
this[VIEW] = new ViewManager(this);
|
|
13
|
-
}
|
|
14
|
-
return this[VIEW];
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwbGljYXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYXBwL2V4dGVuZC9hcHBsaWNhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUV4RCxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsa0JBQWtCLENBQUMsQ0FBQztBQUV4QyxNQUFNLENBQUMsT0FBTyxPQUFPLFdBQVksU0FBUSxPQUFPO0lBQzlDLENBQUMsSUFBSSxDQUFDLENBQWM7SUFFcEI7OztPQUdHO0lBQ0gsSUFBSSxJQUFJO1FBQ04sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ2hCLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNyQyxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDcEIsQ0FBQztDQUNGIn0=
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
import { Context } from '@eggjs/core';
|
|
2
|
-
import { ContextView } from '../../lib/context_view.js';
|
|
3
|
-
import { RenderOptions } from '../../lib/view_manager.js';
|
|
4
|
-
declare const VIEW: unique symbol;
|
|
5
|
-
export default class ViewContext extends Context {
|
|
6
|
-
[VIEW]: ContextView;
|
|
7
|
-
/**
|
|
8
|
-
* Render a file by view engine, then set to body
|
|
9
|
-
* @param {String} name - the file path based on root
|
|
10
|
-
* @param {Object} [locals] - data used by template
|
|
11
|
-
* @param {Object} [options] - view options, you can use `options.viewEngine` to specify view engine
|
|
12
|
-
*/
|
|
13
|
-
render(name: string, locals?: Record<string, any>, options?: RenderOptions): Promise<void>;
|
|
14
|
-
/**
|
|
15
|
-
* Render a file by view engine and return it
|
|
16
|
-
* @param {String} name - the file path based on root
|
|
17
|
-
* @param {Object} [locals] - data used by template
|
|
18
|
-
* @param {Object} [options] - view options, you can use `options.viewEngine` to specify view engine
|
|
19
|
-
* @return {Promise<String>} result - return a promise with a render result
|
|
20
|
-
*/
|
|
21
|
-
renderView(name: string, locals?: Record<string, any>, options?: RenderOptions): Promise<string>;
|
|
22
|
-
/**
|
|
23
|
-
* Render template string by view engine and return it
|
|
24
|
-
* @param {String} tpl - template string
|
|
25
|
-
* @param {Object} [locals] - data used by template
|
|
26
|
-
* @param {Object} [options] - view options, you can use `options.viewEngine` to specify view engine
|
|
27
|
-
* @return {Promise<String>} result - return a promise with a render result
|
|
28
|
-
*/
|
|
29
|
-
renderString(tpl: string, locals?: Record<string, any>, options?: RenderOptions): Promise<string>;
|
|
30
|
-
/**
|
|
31
|
-
* View instance that is created every request
|
|
32
|
-
* @member {ContextView} Context#view
|
|
33
|
-
*/
|
|
34
|
-
get view(): ContextView;
|
|
35
|
-
}
|
|
36
|
-
declare module '@eggjs/core' {
|
|
37
|
-
interface Context {
|
|
38
|
-
view: ContextView;
|
|
39
|
-
render(name: string, locals?: Record<string, any>, options?: RenderOptions): Promise<void>;
|
|
40
|
-
renderView(name: string, locals?: Record<string, any>, options?: RenderOptions): Promise<string>;
|
|
41
|
-
renderString(tpl: string, locals?: Record<string, any>, options?: RenderOptions): Promise<string>;
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
export {};
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
import { Context } from '@eggjs/core';
|
|
2
|
-
import { ContextView } from '../../lib/context_view.js';
|
|
3
|
-
const VIEW = Symbol('Context#view');
|
|
4
|
-
export default class ViewContext extends Context {
|
|
5
|
-
[VIEW];
|
|
6
|
-
/**
|
|
7
|
-
* Render a file by view engine, then set to body
|
|
8
|
-
* @param {String} name - the file path based on root
|
|
9
|
-
* @param {Object} [locals] - data used by template
|
|
10
|
-
* @param {Object} [options] - view options, you can use `options.viewEngine` to specify view engine
|
|
11
|
-
*/
|
|
12
|
-
async render(name, locals, options) {
|
|
13
|
-
const body = await this.renderView(name, locals, options);
|
|
14
|
-
this.body = body;
|
|
15
|
-
}
|
|
16
|
-
/**
|
|
17
|
-
* Render a file by view engine and return it
|
|
18
|
-
* @param {String} name - the file path based on root
|
|
19
|
-
* @param {Object} [locals] - data used by template
|
|
20
|
-
* @param {Object} [options] - view options, you can use `options.viewEngine` to specify view engine
|
|
21
|
-
* @return {Promise<String>} result - return a promise with a render result
|
|
22
|
-
*/
|
|
23
|
-
async renderView(name, locals, options) {
|
|
24
|
-
return await this.view.render(name, locals, options);
|
|
25
|
-
}
|
|
26
|
-
/**
|
|
27
|
-
* Render template string by view engine and return it
|
|
28
|
-
* @param {String} tpl - template string
|
|
29
|
-
* @param {Object} [locals] - data used by template
|
|
30
|
-
* @param {Object} [options] - view options, you can use `options.viewEngine` to specify view engine
|
|
31
|
-
* @return {Promise<String>} result - return a promise with a render result
|
|
32
|
-
*/
|
|
33
|
-
async renderString(tpl, locals, options) {
|
|
34
|
-
return await this.view.renderString(tpl, locals, options);
|
|
35
|
-
}
|
|
36
|
-
/**
|
|
37
|
-
* View instance that is created every request
|
|
38
|
-
* @member {ContextView} Context#view
|
|
39
|
-
*/
|
|
40
|
-
get view() {
|
|
41
|
-
if (!this[VIEW]) {
|
|
42
|
-
this[VIEW] = new ContextView(this);
|
|
43
|
-
}
|
|
44
|
-
return this[VIEW];
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGV4dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9hcHAvZXh0ZW5kL2NvbnRleHQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN0QyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFHeEQsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0FBRXBDLE1BQU0sQ0FBQyxPQUFPLE9BQU8sV0FBWSxTQUFRLE9BQU87SUFDOUMsQ0FBQyxJQUFJLENBQUMsQ0FBYztJQUVwQjs7Ozs7T0FLRztJQUNILEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBWSxFQUFFLE1BQTRCLEVBQUUsT0FBdUI7UUFDOUUsTUFBTSxJQUFJLEdBQUcsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDMUQsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7SUFDbkIsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILEtBQUssQ0FBQyxVQUFVLENBQ2QsSUFBWSxFQUNaLE1BQTRCLEVBQzVCLE9BQXVCO1FBRXZCLE9BQU8sTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxLQUFLLENBQUMsWUFBWSxDQUFDLEdBQVcsRUFBRSxNQUE0QixFQUFFLE9BQXVCO1FBQ25GLE9BQU8sTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzVELENBQUM7SUFFRDs7O09BR0c7SUFDSCxJQUFJLElBQUk7UUFDTixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDaEIsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3JDLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNwQixDQUFDO0NBQ0YifQ==
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
import type { EggAppInfo } from '@eggjs/core';
|
|
2
|
-
/**
|
|
3
|
-
* view default config
|
|
4
|
-
* @member Config#view
|
|
5
|
-
* @property {String} [root=${baseDir}/app/view] - give a path to find the file, you can specify multiple path with `,` delimiter
|
|
6
|
-
* @property {Boolean} [cache=true] - whether cache the file's path
|
|
7
|
-
* @property {String} [defaultExtension] - defaultExtension can be added automatically when there is no extension when call `ctx.render`
|
|
8
|
-
* @property {String} [defaultViewEngine] - set the default view engine if you don't want specify the viewEngine every request.
|
|
9
|
-
* @property {Object} mapping - map the file extension to view engine, such as `{ '.ejs': 'ejs' }`
|
|
10
|
-
*/
|
|
11
|
-
export interface ViewConfig {
|
|
12
|
-
/**
|
|
13
|
-
* give a path to find the file, you can specify multiple path with `,` delimiter
|
|
14
|
-
* Default is `${baseDir}/app/view`
|
|
15
|
-
*/
|
|
16
|
-
root: string;
|
|
17
|
-
/**
|
|
18
|
-
* whether cache the file's path
|
|
19
|
-
* Default is `true`
|
|
20
|
-
*/
|
|
21
|
-
cache: boolean;
|
|
22
|
-
/**
|
|
23
|
-
* defaultExtension can be added automatically when there is no extension when call `ctx.render`
|
|
24
|
-
* Default is `.html`
|
|
25
|
-
*/
|
|
26
|
-
defaultExtension: string;
|
|
27
|
-
/**
|
|
28
|
-
* set the default view engine if you don't want specify the viewEngine every request.
|
|
29
|
-
* Default is `''`
|
|
30
|
-
*/
|
|
31
|
-
defaultViewEngine: string;
|
|
32
|
-
/**
|
|
33
|
-
* map the file extension to view engine, such as `{ '.ejs': 'ejs' }`
|
|
34
|
-
* Default is `{}`
|
|
35
|
-
*/
|
|
36
|
-
mapping: Record<string, string>;
|
|
37
|
-
}
|
|
38
|
-
declare const _default: (appInfo: EggAppInfo) => {
|
|
39
|
-
view: {
|
|
40
|
-
root: string;
|
|
41
|
-
cache: boolean;
|
|
42
|
-
defaultExtension: string;
|
|
43
|
-
defaultViewEngine: string;
|
|
44
|
-
mapping: {};
|
|
45
|
-
};
|
|
46
|
-
};
|
|
47
|
-
export default _default;
|
|
48
|
-
declare module '@eggjs/core' {
|
|
49
|
-
interface EggAppConfig {
|
|
50
|
-
view: ViewConfig;
|
|
51
|
-
}
|
|
52
|
-
}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import path from 'node:path';
|
|
2
|
-
export default (appInfo) => ({
|
|
3
|
-
view: {
|
|
4
|
-
root: path.join(appInfo.baseDir, 'app/view'),
|
|
5
|
-
cache: true,
|
|
6
|
-
defaultExtension: '.html',
|
|
7
|
-
defaultViewEngine: '',
|
|
8
|
-
mapping: {},
|
|
9
|
-
},
|
|
10
|
-
});
|
|
11
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmRlZmF1bHQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29uZmlnL2NvbmZpZy5kZWZhdWx0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sSUFBSSxNQUFNLFdBQVcsQ0FBQztBQXdDN0IsZUFBZSxDQUFDLE9BQW1CLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDdkMsSUFBSSxFQUFFO1FBQ0osSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxVQUFVLENBQUM7UUFDNUMsS0FBSyxFQUFFLElBQUk7UUFDWCxnQkFBZ0IsRUFBRSxPQUFPO1FBQ3pCLGlCQUFpQixFQUFFLEVBQUU7UUFDckIsT0FBTyxFQUFFLEVBQUU7S0FDWjtDQUNGLENBQUMsQ0FBQyJ9
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
export default {
|
|
2
|
-
view: {
|
|
3
|
-
cache: false,
|
|
4
|
-
},
|
|
5
|
-
};
|
|
6
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmxvY2FsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbmZpZy9jb25maWcubG9jYWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsZUFBZTtJQUNiLElBQUksRUFBRTtRQUNKLEtBQUssRUFBRSxLQUFLO0tBQ2I7Q0FDYyxDQUFDIn0=
|
package/dist/esm/index.d.ts
DELETED
package/dist/esm/index.js
DELETED
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import './config/config.default.js';
|
|
2
|
-
import './app/extend/application.js';
|
|
3
|
-
import './app/extend/context.js';
|
|
4
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyw0QkFBNEIsQ0FBQztBQUNwQyxPQUFPLDZCQUE2QixDQUFDO0FBQ3JDLE9BQU8seUJBQXlCLENBQUMifQ==
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
import type { Context, EggCore } from '@eggjs/core';
|
|
2
|
-
import { ViewManager, type ViewManagerConfig, type RenderOptions } from './view_manager.js';
|
|
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
|
-
/**
|
|
8
|
-
* View instance for each request.
|
|
9
|
-
*
|
|
10
|
-
* It will find the view engine, and render it.
|
|
11
|
-
* The view engine should be registered in {@link ViewManager}.
|
|
12
|
-
*/
|
|
13
|
-
export declare class ContextView {
|
|
14
|
-
protected ctx: Context;
|
|
15
|
-
protected app: EggCore;
|
|
16
|
-
protected viewManager: ViewManager;
|
|
17
|
-
protected config: ViewManagerConfig;
|
|
18
|
-
constructor(ctx: Context);
|
|
19
|
-
/**
|
|
20
|
-
* Render a file by view engine
|
|
21
|
-
* @param {String} name - the file path based on root
|
|
22
|
-
* @param {Object} [locals] - data used by template
|
|
23
|
-
* @param {Object} [options] - view options, you can use `options.viewEngine` to specify view engine
|
|
24
|
-
* @return {Promise<String>} result - return a promise with a render result
|
|
25
|
-
*/
|
|
26
|
-
render(name: string, locals?: Record<string, any>, options?: RenderOptions): Promise<string>;
|
|
27
|
-
/**
|
|
28
|
-
* Render a template string by view engine
|
|
29
|
-
* @param {String} tpl - template string
|
|
30
|
-
* @param {Object} [locals] - data used by template
|
|
31
|
-
* @param {Object} [options] - view options, you can use `options.viewEngine` to specify view engine
|
|
32
|
-
* @return {Promise<String>} result - return a promise with a render result
|
|
33
|
-
*/
|
|
34
|
-
renderString(tpl: string, locals?: Record<string, any>, options?: RenderOptions): Promise<string>;
|
|
35
|
-
[RENDER](name: string, locals?: Record<string, any>, options?: RenderOptions): Promise<string>;
|
|
36
|
-
[RENDER_STRING](tpl: string, locals?: Record<string, any>, options?: RenderOptions): Promise<string>;
|
|
37
|
-
[GET_VIEW_ENGINE](name: string): import("./view_manager.js").ViewEngine;
|
|
38
|
-
/**
|
|
39
|
-
* set locals for view, inject `locals.ctx`, `locals.request`, `locals.helper`
|
|
40
|
-
* @private
|
|
41
|
-
*/
|
|
42
|
-
[SET_LOCALS](locals?: Record<string, any>): {
|
|
43
|
-
ctx: Context;
|
|
44
|
-
request: import("@eggjs/core").Request;
|
|
45
|
-
helper: import("egg").Helper;
|
|
46
|
-
} & Record<string, any>;
|
|
47
|
-
}
|
|
48
|
-
export {};
|
|
@@ -1,97 +0,0 @@
|
|
|
1
|
-
import path from 'node:path';
|
|
2
|
-
import assert from 'node:assert';
|
|
3
|
-
const RENDER = Symbol.for('contextView#render');
|
|
4
|
-
const RENDER_STRING = Symbol.for('contextView#renderString');
|
|
5
|
-
const GET_VIEW_ENGINE = Symbol.for('contextView#getViewEngine');
|
|
6
|
-
const SET_LOCALS = Symbol.for('contextView#setLocals');
|
|
7
|
-
/**
|
|
8
|
-
* View instance for each request.
|
|
9
|
-
*
|
|
10
|
-
* It will find the view engine, and render it.
|
|
11
|
-
* The view engine should be registered in {@link ViewManager}.
|
|
12
|
-
*/
|
|
13
|
-
export class ContextView {
|
|
14
|
-
ctx;
|
|
15
|
-
app;
|
|
16
|
-
viewManager;
|
|
17
|
-
config;
|
|
18
|
-
constructor(ctx) {
|
|
19
|
-
this.ctx = ctx;
|
|
20
|
-
this.app = this.ctx.app;
|
|
21
|
-
this.viewManager = this.app.view;
|
|
22
|
-
this.config = this.app.view.config;
|
|
23
|
-
}
|
|
24
|
-
/**
|
|
25
|
-
* Render a file by view engine
|
|
26
|
-
* @param {String} name - the file path based on root
|
|
27
|
-
* @param {Object} [locals] - data used by template
|
|
28
|
-
* @param {Object} [options] - view options, you can use `options.viewEngine` to specify view engine
|
|
29
|
-
* @return {Promise<String>} result - return a promise with a render result
|
|
30
|
-
*/
|
|
31
|
-
async render(name, locals, options) {
|
|
32
|
-
return await this[RENDER](name, locals, options);
|
|
33
|
-
}
|
|
34
|
-
/**
|
|
35
|
-
* Render a template string by view engine
|
|
36
|
-
* @param {String} tpl - template string
|
|
37
|
-
* @param {Object} [locals] - data used by template
|
|
38
|
-
* @param {Object} [options] - view options, you can use `options.viewEngine` to specify view engine
|
|
39
|
-
* @return {Promise<String>} result - return a promise with a render result
|
|
40
|
-
*/
|
|
41
|
-
async renderString(tpl, locals, options) {
|
|
42
|
-
return await this[RENDER_STRING](tpl, locals, options);
|
|
43
|
-
}
|
|
44
|
-
// ext -> viewEngineName -> viewEngine
|
|
45
|
-
async [RENDER](name, locals, options = {}) {
|
|
46
|
-
// retrieve fullpath matching name from `config.root`
|
|
47
|
-
const filename = await this.viewManager.resolve(name);
|
|
48
|
-
options.name = name;
|
|
49
|
-
options.root = filename.replace(path.normalize(name), '').replace(/[\/\\]$/, '');
|
|
50
|
-
options.locals = locals;
|
|
51
|
-
// get the name of view engine,
|
|
52
|
-
// if viewEngine is specified in options, don't match extension
|
|
53
|
-
let viewEngineName = options.viewEngine;
|
|
54
|
-
if (!viewEngineName) {
|
|
55
|
-
const ext = path.extname(filename);
|
|
56
|
-
viewEngineName = this.viewManager.extMap.get(ext);
|
|
57
|
-
}
|
|
58
|
-
// use the default view engine that is configured if no matching above
|
|
59
|
-
if (!viewEngineName) {
|
|
60
|
-
viewEngineName = this.config.defaultViewEngine;
|
|
61
|
-
}
|
|
62
|
-
assert(viewEngineName, `Can't find viewEngine for ${filename}`);
|
|
63
|
-
// get view engine and render
|
|
64
|
-
const viewEngine = this[GET_VIEW_ENGINE](viewEngineName);
|
|
65
|
-
return await viewEngine.render(filename, this[SET_LOCALS](locals), options);
|
|
66
|
-
}
|
|
67
|
-
async [RENDER_STRING](tpl, locals, options) {
|
|
68
|
-
let viewEngineName = options && options.viewEngine;
|
|
69
|
-
if (!viewEngineName) {
|
|
70
|
-
viewEngineName = this.config.defaultViewEngine;
|
|
71
|
-
}
|
|
72
|
-
assert(viewEngineName, 'Can\'t find viewEngine');
|
|
73
|
-
// get view engine and render
|
|
74
|
-
const viewEngine = this[GET_VIEW_ENGINE](viewEngineName);
|
|
75
|
-
return await viewEngine.renderString(tpl, this[SET_LOCALS](locals), options);
|
|
76
|
-
}
|
|
77
|
-
[GET_VIEW_ENGINE](name) {
|
|
78
|
-
// get view engine
|
|
79
|
-
const ViewEngine = this.viewManager.get(name);
|
|
80
|
-
assert(ViewEngine, `Can't find ViewEngine "${name}"`);
|
|
81
|
-
// use view engine to render
|
|
82
|
-
const engine = new ViewEngine(this.ctx);
|
|
83
|
-
return engine;
|
|
84
|
-
}
|
|
85
|
-
/**
|
|
86
|
-
* set locals for view, inject `locals.ctx`, `locals.request`, `locals.helper`
|
|
87
|
-
* @private
|
|
88
|
-
*/
|
|
89
|
-
[SET_LOCALS](locals) {
|
|
90
|
-
return Object.assign({
|
|
91
|
-
ctx: this.ctx,
|
|
92
|
-
request: this.ctx.request,
|
|
93
|
-
helper: this.ctx.helper,
|
|
94
|
-
}, this.ctx.locals, locals);
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGV4dF92aWV3LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9jb250ZXh0X3ZpZXcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxJQUFJLE1BQU0sV0FBVyxDQUFDO0FBQzdCLE9BQU8sTUFBTSxNQUFNLGFBQWEsQ0FBQztBQUlqQyxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLG9CQUFvQixDQUFDLENBQUM7QUFDaEQsTUFBTSxhQUFhLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO0FBQzdELE1BQU0sZUFBZSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsMkJBQTJCLENBQUMsQ0FBQztBQUNoRSxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLHVCQUF1QixDQUFDLENBQUM7QUFFdkQ7Ozs7O0dBS0c7QUFDSCxNQUFNLE9BQU8sV0FBVztJQUNaLEdBQUcsQ0FBVTtJQUNiLEdBQUcsQ0FBVTtJQUNiLFdBQVcsQ0FBYztJQUN6QixNQUFNLENBQW9CO0lBRXBDLFlBQVksR0FBWTtRQUN0QixJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztRQUNmLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7UUFDeEIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQztRQUNqQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNyQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFZLEVBQUUsTUFBNEIsRUFBRSxPQUF1QjtRQUM5RSxPQUFPLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFD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
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
import type { Context, EggCore } from '@eggjs/core';
|
|
2
|
-
import type { ViewConfig } from '../config/config.default.js';
|
|
3
|
-
export interface ViewManagerConfig extends Omit<ViewConfig, 'root'> {
|
|
4
|
-
root: string[];
|
|
5
|
-
}
|
|
6
|
-
export type PlainObject<T = any> = {
|
|
7
|
-
[key: string]: T;
|
|
8
|
-
};
|
|
9
|
-
export interface RenderOptions extends PlainObject {
|
|
10
|
-
name?: string;
|
|
11
|
-
root?: string;
|
|
12
|
-
locals?: PlainObject;
|
|
13
|
-
viewEngine?: string;
|
|
14
|
-
}
|
|
15
|
-
export interface ViewEngine {
|
|
16
|
-
render: (name: string, locals?: Record<string, any>, options?: RenderOptions) => Promise<string>;
|
|
17
|
-
renderString: (tpl: string, locals?: Record<string, any>, options?: RenderOptions) => Promise<string>;
|
|
18
|
-
}
|
|
19
|
-
export type ViewEngineClass = new (app: Context) => ViewEngine;
|
|
20
|
-
/**
|
|
21
|
-
* ViewManager will manage all view engine that is registered.
|
|
22
|
-
*
|
|
23
|
-
* It can find the real file, then retrieve the view engine based on extension.
|
|
24
|
-
* The plugin just register view engine using {@link ViewManager#use}
|
|
25
|
-
*/
|
|
26
|
-
export declare class ViewManager extends Map<string, ViewEngineClass> {
|
|
27
|
-
config: ViewManagerConfig;
|
|
28
|
-
extMap: Map<string, string>;
|
|
29
|
-
fileMap: Map<string, string>;
|
|
30
|
-
/**
|
|
31
|
-
* @param {Application} app - application instance
|
|
32
|
-
*/
|
|
33
|
-
constructor(app: EggCore);
|
|
34
|
-
/**
|
|
35
|
-
* This method can register view engine.
|
|
36
|
-
*
|
|
37
|
-
* You can define a view engine class contains two method, `render` and `renderString`
|
|
38
|
-
*
|
|
39
|
-
* ```js
|
|
40
|
-
* class View {
|
|
41
|
-
* render() {}
|
|
42
|
-
* renderString() {}
|
|
43
|
-
* }
|
|
44
|
-
* ```
|
|
45
|
-
* @param {String} name - the name of view engine
|
|
46
|
-
* @param {Object} viewEngine - the class of view engine
|
|
47
|
-
*/
|
|
48
|
-
use(name: string, viewEngine: ViewEngineClass): void;
|
|
49
|
-
/**
|
|
50
|
-
* Resolve the path based on the given name,
|
|
51
|
-
* if the name is `user.html` and root is `app/view` (by default),
|
|
52
|
-
* it will return `app/view/user.html`
|
|
53
|
-
* @param {String} name - the given path name, it's relative to config.root
|
|
54
|
-
* @return {String} filename - the full path
|
|
55
|
-
*/
|
|
56
|
-
resolve(name: string): Promise<string>;
|
|
57
|
-
}
|
|
@@ -1,91 +0,0 @@
|
|
|
1
|
-
import assert from 'node:assert';
|
|
2
|
-
import path from 'node:path';
|
|
3
|
-
import { existsSync } from 'node:fs';
|
|
4
|
-
import { exists } from 'utility';
|
|
5
|
-
import { isGeneratorFunction } from 'is-type-of';
|
|
6
|
-
/**
|
|
7
|
-
* ViewManager will manage all view engine that is registered.
|
|
8
|
-
*
|
|
9
|
-
* It can find the real file, then retrieve the view engine based on extension.
|
|
10
|
-
* The plugin just register view engine using {@link ViewManager#use}
|
|
11
|
-
*/
|
|
12
|
-
export class ViewManager extends Map {
|
|
13
|
-
config;
|
|
14
|
-
extMap;
|
|
15
|
-
fileMap;
|
|
16
|
-
/**
|
|
17
|
-
* @param {Application} app - application instance
|
|
18
|
-
*/
|
|
19
|
-
constructor(app) {
|
|
20
|
-
super();
|
|
21
|
-
this.config = app.config.view;
|
|
22
|
-
this.config.root = app.config.view.root
|
|
23
|
-
.split(/\s*,\s*/g)
|
|
24
|
-
.filter(filepath => existsSync(filepath));
|
|
25
|
-
this.extMap = new Map();
|
|
26
|
-
this.fileMap = new Map();
|
|
27
|
-
for (const ext of Object.keys(this.config.mapping)) {
|
|
28
|
-
this.extMap.set(ext, this.config.mapping[ext]);
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
/**
|
|
32
|
-
* This method can register view engine.
|
|
33
|
-
*
|
|
34
|
-
* You can define a view engine class contains two method, `render` and `renderString`
|
|
35
|
-
*
|
|
36
|
-
* ```js
|
|
37
|
-
* class View {
|
|
38
|
-
* render() {}
|
|
39
|
-
* renderString() {}
|
|
40
|
-
* }
|
|
41
|
-
* ```
|
|
42
|
-
* @param {String} name - the name of view engine
|
|
43
|
-
* @param {Object} viewEngine - the class of view engine
|
|
44
|
-
*/
|
|
45
|
-
use(name, viewEngine) {
|
|
46
|
-
assert(name, 'name is required');
|
|
47
|
-
assert(!this.has(name), `${name} has been registered`);
|
|
48
|
-
assert(viewEngine, 'viewEngine is required');
|
|
49
|
-
assert(viewEngine.prototype.render, 'viewEngine should implement `render` method');
|
|
50
|
-
assert(!isGeneratorFunction(viewEngine.prototype.render), 'viewEngine `render` method should not be generator function');
|
|
51
|
-
assert(viewEngine.prototype.renderString, 'viewEngine should implement `renderString` method');
|
|
52
|
-
assert(!isGeneratorFunction(viewEngine.prototype.renderString), 'viewEngine `renderString` method should not be generator function');
|
|
53
|
-
this.set(name, viewEngine);
|
|
54
|
-
}
|
|
55
|
-
/**
|
|
56
|
-
* Resolve the path based on the given name,
|
|
57
|
-
* if the name is `user.html` and root is `app/view` (by default),
|
|
58
|
-
* it will return `app/view/user.html`
|
|
59
|
-
* @param {String} name - the given path name, it's relative to config.root
|
|
60
|
-
* @return {String} filename - the full path
|
|
61
|
-
*/
|
|
62
|
-
async resolve(name) {
|
|
63
|
-
const config = this.config;
|
|
64
|
-
// check cache
|
|
65
|
-
let filename = this.fileMap.get(name);
|
|
66
|
-
if (config.cache && filename)
|
|
67
|
-
return filename;
|
|
68
|
-
// try find it with default extension
|
|
69
|
-
filename = await resolvePath([name, name + config.defaultExtension], config.root);
|
|
70
|
-
assert(filename, `Can't find ${name} from ${config.root.join(',')}`);
|
|
71
|
-
// set cache
|
|
72
|
-
this.fileMap.set(name, filename);
|
|
73
|
-
return filename;
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
async function resolvePath(names, root) {
|
|
77
|
-
for (const name of names) {
|
|
78
|
-
for (const dir of root) {
|
|
79
|
-
const filename = path.join(dir, name);
|
|
80
|
-
if (await exists(filename)) {
|
|
81
|
-
if (inpath(dir, filename)) {
|
|
82
|
-
return filename;
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
function inpath(parent, sub) {
|
|
89
|
-
return sub.indexOf(parent) > -1;
|
|
90
|
-
}
|
|
91
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlld19tYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi92aWV3X21hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxNQUFNLE1BQU0sYUFBYSxDQUFDO0FBQ2pDLE9BQU8sSUFBSSxNQUFNLFdBQVcsQ0FBQztBQUM3QixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ3JDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFFakMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBdUJqRDs7Ozs7R0FLRztBQUNILE1BQU0sT0FBTyxXQUFZLFNBQVEsR0FBNEI7SUFDM0QsTUFBTSxDQUFvQjtJQUMxQixNQUFNLENBQXNCO0lBQzVCLE9BQU8sQ0FBc0I7SUFFN0I7O09BRUc7SUFDSCxZQUFZLEdBQVk7UUFDdEIsS0FBSyxFQUFFLENBQUM7UUFDUixJQUFJLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBVyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUk7YUFDcEMsS0FBSyxDQUFDLFVBQVUsQ0FBQzthQUNqQixNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUM1QyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ3pCLEtBQUssTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDbkQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElB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
|
package/dist/esm/package.json
DELETED
package/dist/package.json
DELETED