UNPKG

grind-assets

Version:
165 lines (130 loc) 14 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.AssetContainer = void 0; function _isnil(val) { return val === null || typeof val === 'undefined'; } const path = require('path'); class AssetContainer { constructor(req, res, factory, view) { this.req = null; this.res = null; this.factory = null; this.view = null; this._styles = []; this._scripts = []; this._internalScripts = []; this.req = req; this.res = res; this.factory = factory; this.view = view; } append(type, asset) { if (_isnil(type)) { return this.infer(asset); } if (typeof this[type] !== 'function') { Log.error('Invalid asset type', type); return; } this[type](asset); } infer(asset) { switch (path.extname(asset).toLowerCase()) { case '.css': case '.scss': case '.less': case '.sass': case '.styl': case '.stylus': return this.style(asset); case '.js': case '.jsx': case '.json': case '.es': case '.es6': case '.es7': case '.babel': case '.coffee': return this.script(asset); } Log.error('Unable to infer asset type', asset); } css(asset) { return this._expand(asset, 'css', 'css', 'style'); } less(asset) { return this._expand(asset, 'less', 'less', 'style'); } sass(asset) { return this._expand(asset, 'sass', 'sass', 'style'); } scss(asset) { return this._expand(asset, 'scss', 'scss', 'style'); } styl(asset) { return this._expand(asset, 'stylus', 'styl', 'style'); } stylus(asset) { return this._expand(asset, 'stylus', 'stylus', 'style'); } babel(asset) { return this._expand(asset, 'babel', 'js', 'script'); } js(asset) { return this._expand(asset, 'js', 'js', 'script'); } coffee(asset) { return this._expand(asset, 'coffee', 'coffee', 'script'); } _expand(asset, dir, extension, type) { asset = path.join(dir, asset); if (asset.indexOf('.') === -1) { asset += `.${extension}`; } return this[type](asset); } style(asset) { this._styles.push(this.makeUrl(asset)); } script(asset) { this._scripts.push(this.makeUrl(asset)); } render(type) { switch (type.toLowerCase()) { case 'style': case 'styles': case 'css': return this.view.toHtmlString(this._styles.reverse().map(style => this.makeStyle(style)).join('')); case 'script': case 'scripts': case 'js': return this.view.toHtmlString(this._internalScripts.concat(this._scripts.reverse()).map(script => this.makeScript(script)).join('')); } Log.error('Unsupported render type', type); } makeUrl(asset) { if (asset.indexOf('://') > 0) { return asset; } return this.factory.publishedPath(asset, this.req); } makeStyle(style) { return `<link media="all" type="text/css" rel="stylesheet" href="${style}" />\n`; } makeScript(script) { let attributes = ''; if (typeof script !== 'string') { for (const [key, value] of Object.entries(script)) { if (key === 'src') { script = value; } else { attributes += ` ${key}="${value}"`; } } } return `<script src="${script}"${attributes}></script>\n`; } } exports.AssetContainer = AssetContainer; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9WaWV3L0Fzc2V0Q29udGFpbmVyLmpzIl0sIm5hbWVzIjpbInBhdGgiLCJyZXF1aXJlIiwiQXNzZXRDb250YWluZXIiLCJjb25zdHJ1Y3RvciIsInJlcSIsInJlcyIsImZhY3RvcnkiLCJ2aWV3IiwiX3N0eWxlcyIsIl9zY3JpcHRzIiwiX2ludGVybmFsU2NyaXB0cyIsImFwcGVuZCIsInR5cGUiLCJhc3NldCIsImluZmVyIiwiTG9nIiwiZXJyb3IiLCJleHRuYW1lIiwidG9Mb3dlckNhc2UiLCJzdHlsZSIsInNjcmlwdCIsImNzcyIsIl9leHBhbmQiLCJsZXNzIiwic2FzcyIsInNjc3MiLCJzdHlsIiwic3R5bHVzIiwiYmFiZWwiLCJqcyIsImNvZmZlZSIsImRpciIsImV4dGVuc2lvbiIsImpvaW4iLCJpbmRleE9mIiwicHVzaCIsIm1ha2VVcmwiLCJyZW5kZXIiLCJ0b0h0bWxTdHJpbmciLCJyZXZlcnNlIiwibWFwIiwibWFrZVN0eWxlIiwiY29uY2F0IiwibWFrZVNjcmlwdCIsInB1Ymxpc2hlZFBhdGgiLCJhdHRyaWJ1dGVzIiwia2V5IiwidmFsdWUiLCJPYmplY3QiLCJlbnRyaWVzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQSxNQUFNQSxJQUFJLEdBQUdDLE9BQU8sQ0FBQyxNQUFELENBQXBCOztBQUVPLE1BQU1DLGNBQU4sQ0FBcUI7QUFVM0JDLEVBQUFBLFdBQVcsQ0FBQ0MsR0FBRCxFQUFNQyxHQUFOLEVBQVdDLE9BQVgsRUFBb0JDLElBQXBCLEVBQTBCO0FBQUEsU0FUckNILEdBU3FDLEdBVC9CLElBUytCO0FBQUEsU0FSckNDLEdBUXFDLEdBUi9CLElBUStCO0FBQUEsU0FQckNDLE9BT3FDLEdBUDNCLElBTzJCO0FBQUEsU0FOckNDLElBTXFDLEdBTjlCLElBTThCO0FBQUEsU0FKckNDLE9BSXFDLEdBSjNCLEVBSTJCO0FBQUEsU0FIckNDLFFBR3FDLEdBSDFCLEVBRzBCO0FBQUEsU0FGckNDLGdCQUVxQyxHQUZsQixF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ZXhwb3J0IGNsYXNzIEFzc2V0Q29udGFpbmVyIHtcblx0cmVxID0gbnVsbFxuXHRyZXMgPSBudWxsXG5cdGZhY3RvcnkgPSBudWxsXG5cdHZpZXcgPSBudWxsXG5cblx0X3N0eWxlcyA9IFtdXG5cdF9zY3JpcHRzID0gW11cblx0X2ludGVybmFsU2NyaXB0cyA9IFtdXG5cblx0Y29uc3RydWN0b3IocmVxLCByZXMsIGZhY3RvcnksIHZpZXcpIHtcblx0XHR0aGlzLnJlcSA9IHJlcVxuXHRcdHRoaXMucmVzID0gcmVzXG5cdFx0dGhpcy5mYWN0b3J5ID0gZmFjdG9yeVxuXHRcdHRoaXMudmlldyA9IHZpZXdcblx0fVxuXG5cdGFwcGVuZCh0eXBlLCBhc3NldCkge1xuXHRcdGlmICh0eXBlLmlzTmlsKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5pbmZlcihhc3NldClcblx0XHR9XG5cblx0XHRpZiAodHlwZW9mIHRoaXNbdHlwZV0gIT09ICdmdW5jdGlvbicpIHtcblx0XHRcdExvZy5lcnJvcignSW52YWxpZCBhc3NldCB0eXBlJywgdHlwZSlcblx0XHRcdHJldHVyblxuXHRcdH1cblxuXHRcdHRoaXNbdHlwZV0oYXNzZXQpXG5cdH1cblxuXHRpbmZlcihhc3NldCkge1xuXHRcdHN3aXRjaCAocGF0aC5leHRuYW1lKGFzc2V0KS50b0xvd2VyQ2FzZSgpKSB7XG5cdFx0XHRjYXNlICcuY3NzJzpcblx0XHRcdGNhc2UgJy5zY3NzJzpcblx0XHRcdGNhc2UgJy5sZXNzJzpcblx0XHRcdGNhc2UgJy5zYXNzJzpcblx0XHRcdGNhc2UgJy5zdHlsJzpcblx0XHRcdGNhc2UgJy5zdHlsdXMnOlxuXHRcdFx0XHRyZXR1cm4gdGhpcy5zdHlsZShhc3NldClcblx0XHRcdGNhc2UgJy5qcyc6XG5cdFx0XHRjYXNlICcuanN4Jzpcblx0XHRcdGNhc2UgJy5qc29uJzpcblx0XHRcdGNhc2UgJy5lcyc6XG5cdFx0XHRjYXNlICcuZXM2Jzpcblx0XHRcdGNhc2UgJy5lczcnOlxuXHRcdFx0Y2FzZSAnLmJhYmVsJzpcblx0XHRcdGNhc2UgJy5jb2ZmZWUnOlxuXHRcdFx0XHRyZXR1cm4gdGhpcy5zY3JpcHQoYXNzZXQpXG5cdFx0fVxuXG5cdFx0TG9nLmVycm9yKCdVbmFibGUgdG8gaW5mZXIgYXNzZXQgdHlwZScsIGFzc2V0KVxuXHR9XG5cblx0Y3NzKGFzc2V0KSB7XG5cdFx0cmV0dXJuIHRoaXMuX2V4cGFuZChhc3NldCwgJ2NzcycsICdjc3MnLCAnc3R5bGUnKVxuXHR9XG5cblx0bGVzcyhhc3NldCkge1xuXHRcdHJldHVybiB0aGlzLl9leHBhbmQoYXNzZXQsICdsZXNzJywgJ2xlc3MnLCAnc3R5bGUnKVxuXHR9XG5cblx0c2Fzcyhhc3NldCkge1xuXHRcdHJldHVybiB0aGlzLl9leHBhbmQoYXNzZXQsICdzYXNzJywgJ3Nhc3MnLCAnc3R5bGUnKVxuXHR9XG5cblx0c2Nzcyhhc3NldCkge1xuXHRcdHJldHVybiB0aGlzLl9leHBhbmQoYXNzZXQsICdzY3NzJywgJ3Njc3MnLCAnc3R5bGUnKVxuXHR9XG5cblx0c3R5bChhc3NldCkge1xuXHRcdHJldHVybiB0aGlzLl9leHBhbmQoYXNzZXQsICdzdHlsdXMnLCAnc3R5bCcsICdzdHlsZScpXG5cdH1cblxuXHRzdHlsdXMoYXNzZXQpIHtcblx0XHRyZXR1cm4gdGhpcy5fZXhwYW5kKGFzc2V0LCAnc3R5bHVzJywgJ3N0eWx1cycsICdzdHlsZScpXG5cdH1cblxuXHRiYWJlbChhc3NldCkge1xuXHRcdHJldHVybiB0aGlzLl9leHBhbmQoYXNzZXQsICdiYWJlbCcsICdqcycsICdzY3JpcHQnKVxuXHR9XG5cblx0anMoYXNzZXQpIHtcblx0XHRyZXR1cm4gdGhpcy5fZXhwYW5kKGFzc2V0LCAnanMnLCAnanMnLCAnc2NyaXB0Jylcblx0fVxuXG5cdGNvZmZlZShhc3NldCkge1xuXHRcdHJldHVybiB0aGlzLl9leHBhbmQoYXNzZXQsICdjb2ZmZWUnLCAnY29mZmVlJywgJ3NjcmlwdCcpXG5cdH1cblxuXHRfZXhwYW5kKGFzc2V0LCBkaXIsIGV4dGVuc2lvbiwgdHlwZSkge1xuXHRcdGFzc2V0ID0gcGF0aC5qb2luKGRpciwgYXNzZXQpXG5cblx0XHRpZiAoYXNzZXQuaW5kZXhPZignLicpID09PSAtMSkge1xuXHRcdFx0YXNzZXQgKz0gYC4ke2V4dGVuc2lvbn1gXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXNbdHlwZV0oYXNzZXQpXG5cdH1cblxuXHRzdHlsZShhc3NldCkge1xuXHRcdHRoaXMuX3N0eWxlcy5wdXNoKHRoaXMubWFrZVVybChhc3NldCkpXG5cdH1cblxuXHRzY3JpcHQoYXNzZXQpIHtcblx0XHR0aGlzLl9zY3JpcHRzLnB1c2godGhpcy5tYWtlVXJsKGFzc2V0KSlcblx0fVxuXG5cdHJlbmRlcih0eXBlKSB7XG5cdFx0c3dpdGNoICh0eXBlLnRvTG93ZXJDYXNlKCkpIHtcblx0XHRcdGNhc2UgJ3N0eWxlJzpcblx0XHRcdGNhc2UgJ3N0eWxlcyc6XG5cdFx0XHRjYXNlICdjc3MnOlxuXHRcdFx0XHRyZXR1cm4gdGhpcy52aWV3LnRvSHRtbFN0cmluZyhcblx0XHRcdFx0XHR0aGlzLl9zdHlsZXNcblx0XHRcdFx0XHRcdC5yZXZlcnNlKClcblx0XHRcdFx0XHRcdC5tYXAoc3R5bGUgPT4gdGhpcy5tYWtlU3R5bGUoc3R5bGUpKVxuXHRcdFx0XHRcdFx0LmpvaW4oJycpLFxuXHRcdFx0XHQpXG5cdFx0XHRjYXNlICdzY3JpcHQnOlxuXHRcdFx0Y2FzZSAnc2NyaXB0cyc6XG5cdFx0XHRjYXNlICdqcyc6XG5cdFx0XHRcdHJldHVybiB0aGlzLnZpZXcudG9IdG1sU3RyaW5nKFxuXHRcdFx0XHRcdHRoaXMuX2ludGVybmFsU2NyaXB0c1xuXHRcdFx0XHRcdFx0LmNvbmNhdCh0aGlzLl9zY3JpcHRzLnJldmVyc2UoKSlcblx0XHRcdFx0XHRcdC5tYXAoc2NyaXB0ID0+IHRoaXMubWFrZVNjcmlwdChzY3JpcHQpKVxuXHRcdFx0XHRcdFx0LmpvaW4oJycpLFxuXHRcdFx0XHQpXG5cdFx0fVxuXG5cdFx0TG9nLmVycm9yKCdVbnN1cHBvcnRlZCByZW5kZXIgdHlwZScsIHR5cGUpXG5cdH1cblxuXHRtYWtlVXJsKGFzc2V0KSB7XG5cdFx0aWYgKGFzc2V0LmluZGV4T2YoJzovLycpID4gMCkge1xuXHRcdFx0cmV0dXJuIGFzc2V0XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuZmFjdG9yeS5wdWJsaXNoZWRQYXRoKGFzc2V0LCB0aGlzLnJlcSlcblx0fVxuXG5cdG1ha2VTdHlsZShzdHlsZSkge1xuXHRcdHJldHVybiBgPGxpbmsgbWVkaWE9XCJhbGxcIiB0eXBlPVwidGV4dC9jc3NcIiByZWw9XCJzdHlsZXNoZWV0XCIgaHJlZj1cIiR7c3R5bGV9XCIgLz5cXG5gXG5cdH1cblxuXHRtYWtlU2NyaXB0KHNjcmlwdCkge1xuXHRcdGxldCBhdHRyaWJ1dGVzID0gJydcblxuXHRcdGlmICh0eXBlb2Ygc2NyaXB0ICE9PSAnc3RyaW5nJykge1xuXHRcdFx0Zm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoc2NyaXB0KSkge1xuXHRcdFx0XHRpZiAoa2V5ID09PSAnc3JjJykge1xuXHRcdFx0XHRcdHNjcmlwdCA9IHZhbHVlXG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0YXR0cmlidXRlcyArPSBgICR7a2V5fT1cIiR7dmFsdWV9XCJgXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gYDxzY3JpcHQgc3JjPVwiJHtzY3JpcHR9XCIke2F0dHJpYnV0ZXN9Pjwvc2NyaXB0PlxcbmBcblx0fVxufVxuIl19