@nguniversal/express-engine
Version:
Express Engine for running Server Angular Apps
59 lines • 8.22 kB
JavaScript
import * as fs from 'fs';
import { ɵCommonEngine as CommonEngine } from '@nguniversal/common/engine';
import { REQUEST, RESPONSE } from '@nguniversal/express-engine/tokens';
/**
* This holds a cached version of each index used.
*/
const templateCache = {};
/**
* This is an express engine for handling Angular Applications
*/
export function ngExpressEngine(setupOptions) {
const engine = new CommonEngine(setupOptions.bootstrap, setupOptions.providers);
return function (filePath, options, callback) {
try {
const renderOptions = Object.assign({}, options);
if (!setupOptions.bootstrap && !renderOptions.bootstrap) {
throw new Error('You must pass in a NgModule or NgModuleFactory to be bootstrapped');
}
const req = renderOptions.req;
const res = renderOptions.res || req.res;
renderOptions.url =
renderOptions.url || `${req.protocol}://${(req.get('host') || '')}${req.originalUrl}`;
renderOptions.document = renderOptions.document || getDocument(filePath);
renderOptions.providers = renderOptions.providers || [];
renderOptions.providers = renderOptions.providers.concat(getReqResProviders(req, res));
engine.render(renderOptions)
.then(html => callback(null, html))
.catch(callback);
}
catch (err) {
callback(err);
}
};
}
/**
* Get providers of the request and response
*/
function getReqResProviders(req, res) {
const providers = [
{
provide: REQUEST,
useValue: req
}
];
if (res) {
providers.push({
provide: RESPONSE,
useValue: res
});
}
return providers;
}
/**
* Get the document at the file path
*/
function getDocument(filePath) {
return templateCache[filePath] = templateCache[filePath] || fs.readFileSync(filePath).toString();
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL21vZHVsZXMvZXhwcmVzcy1lbmdpbmUvc3JjL21haW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBUUEsT0FBTyxLQUFLLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFHekIsT0FBTyxFQUFFLGFBQWEsSUFBSSxZQUFZLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMzRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBb0J2RTs7R0FFRztBQUNILE1BQU0sYUFBYSxHQUE4QixFQUFFLENBQUM7QUFFcEQ7O0dBRUc7QUFDSCxNQUFNLFVBQVUsZUFBZSxDQUFDLFlBQXNDO0lBQ3BFLE1BQU0sTUFBTSxHQUFHLElBQUksWUFBWSxDQUFDLFlBQVksQ0FBQyxTQUFTLEVBQUUsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBRWhGLE9BQU8sVUFBVSxRQUFnQixFQUNoQixPQUFlLEVBQ2YsUUFBcUQ7UUFDcEUsSUFBSTtZQUNGLE1BQU0sYUFBYSxHQUFHLGtCQUFLLE9BQU8sQ0FBbUIsQ0FBQztZQUN0RCxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLEVBQUU7Z0JBQ3ZELE1BQU0sSUFBSSxLQUFLLENBQUMsbUVBQW1FLENBQUMsQ0FBQzthQUN0RjtZQUVELE1BQU0sR0FBRyxHQUFHLGFBQWEsQ0FBQyxHQUFHLENBQUM7WUFDOUIsTUFBTSxHQUFHLEdBQUcsYUFBYSxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDO1lBRXpDLGFBQWEsQ0FBQyxHQUFHO2dCQUNqQixhQUFhLENBQUMsR0FBRyxJQUFJLEdBQUcsR0FBRyxDQUFDLFFBQVEsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3RGLGFBQWEsQ0FBQyxRQUFRLEdBQUcsYUFBYSxDQUFDLFFBQVEsSUFBSSxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7WUFFekUsYUFBYSxDQUFDLFNBQVMsR0FBRyxhQUFhLENBQUMsU0FBUyxJQUFJLEVBQUUsQ0FBQztZQUN4RCxhQUFhLENBQUMsU0FBUyxHQUFHLGFBQWEsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBRXZGLE1BQU0sQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDO2lCQUN6QixJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO2lCQUNsQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDcEI7UUFBQyxPQUFPLEdBQUcsRUFBRTtZQUNaLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUNmO0lBQ0gsQ0FBQyxDQUFDO0FBQ0osQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBUyxrQkFBa0IsQ0FBQyxHQUFZLEVBQUUsR0FBYztJQUN0RCxNQUFNLFNBQVMsR0FBcUI7UUFDbEM7WUFDRSxPQUFPLEVBQUUsT0FBTztZQUNoQixRQUFRLEVBQUUsR0FBRztTQUNkO0tBQ0YsQ0FBQztJQUNGLElBQUksR0FBRyxFQUFFO1FBQ1AsU0FBUyxDQUFDLElBQUksQ0FBQztZQUNiLE9BQU8sRUFBRSxRQUFRO1lBQ2pCLFFBQVEsRUFBRSxHQUFHO1NBQ2QsQ0FBQyxDQUFDO0tBQ0o7SUFFRCxPQUFPLFNBQVMsQ0FBQztBQUNuQixDQUFDO0FBRUQ7O0dBRUc7QUFDSCxTQUFTLFdBQVcsQ0FBQyxRQUFnQjtJQUNuQyxPQUFPLGFBQWEsQ0FBQyxRQUFRLENBQUMsR0FBRyxhQUFhLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztBQUNuRyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5pbXBvcnQgeyBSZXF1ZXN0LCBSZXNwb25zZSB9IGZyb20gJ2V4cHJlc3MnO1xuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xuXG5pbXBvcnQgeyBOZ01vZHVsZUZhY3RvcnksIFN0YXRpY1Byb3ZpZGVyLCBUeXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyDJtUNvbW1vbkVuZ2luZSBhcyBDb21tb25FbmdpbmUgfSBmcm9tICdAbmd1bml2ZXJzYWwvY29tbW9uL2VuZ2luZSc7XG5pbXBvcnQgeyBSRVFVRVNULCBSRVNQT05TRSB9IGZyb20gJ0BuZ3VuaXZlcnNhbC9leHByZXNzLWVuZ2luZS90b2tlbnMnO1xuXG4vKipcbiAqIFRoZXNlIGFyZSB0aGUgYWxsb3dlZCBvcHRpb25zIGZvciB0aGUgZW5naW5lXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTmdTZXR1cE9wdGlvbnMge1xuICBib290c3RyYXA6IFR5cGU8e30+IHwgTmdNb2R1bGVGYWN0b3J5PHt9PjtcbiAgcHJvdmlkZXJzPzogU3RhdGljUHJvdmlkZXJbXTtcbn1cblxuLyoqXG4gKiBUaGVzZSBhcmUgdGhlIGFsbG93ZWQgb3B0aW9ucyBmb3IgdGhlIHJlbmRlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlbmRlck9wdGlvbnMgZXh0ZW5kcyBOZ1NldHVwT3B0aW9ucyB7XG4gIHJlcTogUmVxdWVzdDtcbiAgcmVzPzogUmVzcG9uc2U7XG4gIHVybD86IHN0cmluZztcbiAgZG9jdW1lbnQ/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhpcyBob2xkcyBhIGNhY2hlZCB2ZXJzaW9uIG9mIGVhY2ggaW5kZXggdXNlZC5cbiAqL1xuY29uc3QgdGVtcGxhdGVDYWNoZTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHt9O1xuXG4vKipcbiAqIFRoaXMgaXMgYW4gZXhwcmVzcyBlbmdpbmUgZm9yIGhhbmRsaW5nIEFuZ3VsYXIgQXBwbGljYXRpb25zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBuZ0V4cHJlc3NFbmdpbmUoc2V0dXBPcHRpb25zOiBSZWFkb25seTxOZ1NldHVwT3B0aW9ucz4pIHtcbiAgY29uc3QgZW5naW5lID0gbmV3IENvbW1vbkVuZ2luZShzZXR1cE9wdGlvbnMuYm9vdHN0cmFwLCBzZXR1cE9wdGlvbnMucHJvdmlkZXJzKTtcblxuICByZXR1cm4gZnVuY3Rpb24gKGZpbGVQYXRoOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgb3B0aW9uczogb2JqZWN0LFxuICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrOiAoZXJyPzogRXJyb3IgfCBudWxsLCBodG1sPzogc3RyaW5nKSA9PiB2b2lkKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlbmRlck9wdGlvbnMgPSB7IC4uLm9wdGlvbnMgfSBhcyBSZW5kZXJPcHRpb25zO1xuICAgICAgaWYgKCFzZXR1cE9wdGlvbnMuYm9vdHN0cmFwICYmICFyZW5kZXJPcHRpb25zLmJvb3RzdHJhcCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBtdXN0IHBhc3MgaW4gYSBOZ01vZHVsZSBvciBOZ01vZHVsZUZhY3RvcnkgdG8gYmUgYm9vdHN0cmFwcGVkJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlcSA9IHJlbmRlck9wdGlvbnMucmVxO1xuICAgICAgY29uc3QgcmVzID0gcmVuZGVyT3B0aW9ucy5yZXMgfHwgcmVxLnJlcztcblxuICAgICAgcmVuZGVyT3B0aW9ucy51cmwgPVxuICAgICAgcmVuZGVyT3B0aW9ucy51cmwgfHwgYCR7cmVxLnByb3RvY29sfTovLyR7KHJlcS5nZXQoJ2hvc3QnKSB8fCAnJyl9JHtyZXEub3JpZ2luYWxVcmx9YDtcbiAgICAgIHJlbmRlck9wdGlvbnMuZG9jdW1lbnQgPSByZW5kZXJPcHRpb25zLmRvY3VtZW50IHx8IGdldERvY3VtZW50KGZpbGVQYXRoKTtcblxuICAgICAgcmVuZGVyT3B0aW9ucy5wcm92aWRlcnMgPSByZW5kZXJPcHRpb25zLnByb3ZpZGVycyB8fCBbXTtcbiAgICAgIHJlbmRlck9wdGlvbnMucHJvdmlkZXJzID0gcmVuZGVyT3B0aW9ucy5wcm92aWRlcnMuY29uY2F0KGdldFJlcVJlc1Byb3ZpZGVycyhyZXEsIHJlcykpO1xuXG4gICAgICBlbmdpbmUucmVuZGVyKHJlbmRlck9wdGlvbnMpXG4gICAgICAgIC50aGVuKGh0bWwgPT4gY2FsbGJhY2sobnVsbCwgaHRtbCkpXG4gICAgICAgIC5jYXRjaChjYWxsYmFjayk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjYWxsYmFjayhlcnIpO1xuICAgIH1cbiAgfTtcbn1cblxuLyoqXG4gKiBHZXQgcHJvdmlkZXJzIG9mIHRoZSByZXF1ZXN0IGFuZCByZXNwb25zZVxuICovXG5mdW5jdGlvbiBnZXRSZXFSZXNQcm92aWRlcnMocmVxOiBSZXF1ZXN0LCByZXM/OiBSZXNwb25zZSk6IFN0YXRpY1Byb3ZpZGVyW10ge1xuICBjb25zdCBwcm92aWRlcnM6IFN0YXRpY1Byb3ZpZGVyW10gPSBbXG4gICAge1xuICAgICAgcHJvdmlkZTogUkVRVUVTVCxcbiAgICAgIHVzZVZhbHVlOiByZXFcbiAgICB9XG4gIF07XG4gIGlmIChyZXMpIHtcbiAgICBwcm92aWRlcnMucHVzaCh7XG4gICAgICBwcm92aWRlOiBSRVNQT05TRSxcbiAgICAgIHVzZVZhbHVlOiByZXNcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBwcm92aWRlcnM7XG59XG5cbi8qKlxuICogR2V0IHRoZSBkb2N1bWVudCBhdCB0aGUgZmlsZSBwYXRoXG4gKi9cbmZ1bmN0aW9uIGdldERvY3VtZW50KGZpbGVQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gdGVtcGxhdGVDYWNoZVtmaWxlUGF0aF0gPSB0ZW1wbGF0ZUNhY2hlW2ZpbGVQYXRoXSB8fCBmcy5yZWFkRmlsZVN5bmMoZmlsZVBhdGgpLnRvU3RyaW5nKCk7XG59XG4iXX0=