UNPKG

@midwayjs/view

Version:

Midway Component for render view

94 lines 4.27 kB
"use strict"; var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; var __metadata = (this && this.__metadata) || function (k, v) { if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.ContextView = void 0; const viewManager_1 = require("./viewManager"); const core_1 = require("@midwayjs/core"); const assert = require("assert"); const path_1 = require("path"); /** * View instance for each request. * * It will find the view engine, and render it. * The view engine should be registered in {@link ViewManager}. */ let ContextView = class ContextView { async render(name, locals, options) { // retrieve fullpath matching name from `config.root` const filename = await this.viewManager.resolve(name); options = options !== null && options !== void 0 ? options : {}; options.name = name; options.root = filename.replace((0, path_1.normalize)(name), '').replace(/[/\\]$/, ''); options.locals = locals; // get the name of view engine, // if viewEngine is specified in options, don't match extension let viewEngineName = options.viewEngine; if (!viewEngineName) { const ext = (0, path_1.extname)(filename); viewEngineName = this.viewManager.findEngine(ext); } // use the default view engine that is configured if no matching above if (!viewEngineName) { viewEngineName = this.viewConfig.defaultViewEngine; } assert(viewEngineName, `Can't find viewEngine for ${filename}`); // get view engine and render const view = await this.getViewEngine(viewEngineName); return await view.render(filename, this.setLocals(locals), options); } async renderString(tpl, locals, options) { var _a; options = options !== null && options !== void 0 ? options : {}; const viewEngineName = (_a = options.viewEngine) !== null && _a !== void 0 ? _a : this.viewConfig.defaultViewEngine; assert(viewEngineName, "Can't find viewEngine"); // get view engine and render const view = await this.getViewEngine(viewEngineName); return await view.renderString(tpl, this.setLocals(locals), options); } async getViewEngine(name) { // get view engine const ViewEngine = this.viewManager.get(name); assert(ViewEngine, `Can't find ViewEngine "${name}"`); // use view engine to render const engine = await this.ctx.requestContext.getAsync(ViewEngine); // wrap render and renderString to support both async function and generator function if (engine.render) { engine.render = core_1.Utils.toAsyncFunction(engine.render); } if (engine.renderString) { engine.renderString = core_1.Utils.toAsyncFunction(engine.renderString); } return engine; } setLocals(locals) { return Object.assign({}, this.viewManager.getLocals(), { ctx: this.ctx, request: this.ctx.request, }, this.ctx.locals, locals); } }; __decorate([ (0, core_1.Inject)(), __metadata("design:type", viewManager_1.ViewManager) ], ContextView.prototype, "viewManager", void 0); __decorate([ (0, core_1.Config)('view'), __metadata("design:type", Object) ], ContextView.prototype, "viewConfig", void 0); __decorate([ (0, core_1.Inject)(), __metadata("design:type", Object) ], ContextView.prototype, "ctx", void 0); ContextView = __decorate([ (0, core_1.Provide)() ], ContextView); exports.ContextView = ContextView; //# sourceMappingURL=contextView.js.map