@eggjs/view
Version:
Base view plugin for egg
98 lines • 7.26 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.ViewManager = void 0;
const node_assert_1 = __importDefault(require("node:assert"));
const node_path_1 = __importDefault(require("node:path"));
const node_fs_1 = require("node:fs");
const utility_1 = require("utility");
const is_type_of_1 = require("is-type-of");
/**
* ViewManager will manage all view engine that is registered.
*
* It can find the real file, then retrieve the view engine based on extension.
* The plugin just register view engine using {@link ViewManager#use}
*/
class ViewManager extends Map {
config;
extMap;
fileMap;
/**
* @param {Application} app - application instance
*/
constructor(app) {
super();
this.config = app.config.view;
this.config.root = app.config.view.root
.split(/\s*,\s*/g)
.filter(filepath => (0, node_fs_1.existsSync)(filepath));
this.extMap = new Map();
this.fileMap = new Map();
for (const ext of Object.keys(this.config.mapping)) {
this.extMap.set(ext, this.config.mapping[ext]);
}
}
/**
* This method can register view engine.
*
* You can define a view engine class contains two method, `render` and `renderString`
*
* ```js
* class View {
* render() {}
* renderString() {}
* }
* ```
* @param {String} name - the name of view engine
* @param {Object} viewEngine - the class of view engine
*/
use(name, viewEngine) {
(0, node_assert_1.default)(name, 'name is required');
(0, node_assert_1.default)(!this.has(name), `${name} has been registered`);
(0, node_assert_1.default)(viewEngine, 'viewEngine is required');
(0, node_assert_1.default)(viewEngine.prototype.render, 'viewEngine should implement `render` method');
(0, node_assert_1.default)(!(0, is_type_of_1.isGeneratorFunction)(viewEngine.prototype.render), 'viewEngine `render` method should not be generator function');
(0, node_assert_1.default)(viewEngine.prototype.renderString, 'viewEngine should implement `renderString` method');
(0, node_assert_1.default)(!(0, is_type_of_1.isGeneratorFunction)(viewEngine.prototype.renderString), 'viewEngine `renderString` method should not be generator function');
this.set(name, viewEngine);
}
/**
* Resolve the path based on the given name,
* if the name is `user.html` and root is `app/view` (by default),
* it will return `app/view/user.html`
* @param {String} name - the given path name, it's relative to config.root
* @return {String} filename - the full path
*/
async resolve(name) {
const config = this.config;
// check cache
let filename = this.fileMap.get(name);
if (config.cache && filename)
return filename;
// try find it with default extension
filename = await resolvePath([name, name + config.defaultExtension], config.root);
(0, node_assert_1.default)(filename, `Can't find ${name} from ${config.root.join(',')}`);
// set cache
this.fileMap.set(name, filename);
return filename;
}
}
exports.ViewManager = ViewManager;
async function resolvePath(names, root) {
for (const name of names) {
for (const dir of root) {
const filename = node_path_1.default.join(dir, name);
if (await (0, utility_1.exists)(filename)) {
if (inpath(dir, filename)) {
return filename;
}
}
}
}
}
function inpath(parent, sub) {
return sub.indexOf(parent) > -1;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlld19tYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi92aWV3X21hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsOERBQWlDO0FBQ2pDLDBEQUE2QjtBQUM3QixxQ0FBcUM7QUFDckMscUNBQWlDO0FBRWpDLDJDQUFpRDtBQXVCakQ7Ozs7O0dBS0c7QUFDSCxNQUFhLFdBQVksU0FBUSxHQUE0QjtJQUMzRCxNQUFNLENBQW9CO0lBQzFCLE1BQU0sQ0FBc0I7SUFDNUIsT0FBTyxDQUFzQjtJQUU3Qjs7T0FFRztJQUNILFlBQVksR0FBWTtRQUN0QixLQUFLLEVBQUUsQ0FBQztRQUNSLElBQUksQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFXLENBQUM7UUFDckMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSTthQUNwQyxLQUFLLENBQUMsVUFBVSxDQUFDO2FBQ2pCLE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLElBQUEsb0JBQVUsRUFBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQzVDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7UUFDekIsS0FBSyxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNuRCxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNqRCxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7O09BYUc7SUFDSCxHQUFHLENBQUMsSUFBWSxFQUFF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