UNPKG

@eggjs/view

Version:

Base view plugin for egg

91 lines 6.74 kB
import assert from 'node:assert'; import path from 'node:path'; import { existsSync } from 'node:fs'; import { exists } from 'utility'; import { isGeneratorFunction } from '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} */ export 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 => 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) { assert(name, 'name is required'); assert(!this.has(name), `${name} has been registered`); assert(viewEngine, 'viewEngine is required'); assert(viewEngine.prototype.render, 'viewEngine should implement `render` method'); assert(!isGeneratorFunction(viewEngine.prototype.render), 'viewEngine `render` method should not be generator function'); assert(viewEngine.prototype.renderString, 'viewEngine should implement `renderString` method'); assert(!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); assert(filename, `Can't find ${name} from ${config.root.join(',')}`); // set cache this.fileMap.set(name, filename); return filename; } } async function resolvePath(names, root) { for (const name of names) { for (const dir of root) { const filename = path.join(dir, name); if (await exists(filename)) { if (inpath(dir, filename)) { return filename; } } } } } function inpath(parent, sub) { return sub.indexOf(parent) > -1; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlld19tYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi92aWV3X21hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxNQUFNLE1BQU0sYUFBYSxDQUFDO0FBQ2pDLE9BQU8sSUFBSSxNQUFNLFdBQVcsQ0FBQztBQUM3QixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ3JDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFFakMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBdUJqRDs7Ozs7R0FLRztBQUNILE1BQU0sT0FBTyxXQUFZLFNBQVEsR0FBNEI7SUFDM0QsTUFBTSxDQUFvQjtJQUMxQixNQUFNLENBQXNCO0lBQzVCLE9BQU8sQ0FBc0I7SUFFN0I7O09BRUc7SUFDSCxZQUFZLEdBQVk7UUFDdEIsS0FBSyxFQUFFLENBQUM7UUFDUixJQUFJLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBVyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUk7YUFDcEMsS0FBSyxDQUFDLFVBQVUsQ0FBQzthQUNqQixNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUM1QyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ3pCLEtBQUssTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDbkQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElB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