@midwayjs/view
Version:
Midway Component for render view
94 lines • 4.27 kB
JavaScript
;
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