grind-assets
Version:
Asset management for Grind
165 lines (130 loc) • 14 kB
JavaScript
"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