grind-assets
Version:
Asset management for Grind
142 lines (112 loc) • 15.1 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.ScssCompiler = void 0;
var _Compiler = require("./Compiler.js");
var _makeSyntaxError = require("../Errors/makeSyntaxError.js");
var _optional = require("../Support/optional.js");
var _grindSupport = require("grind-support");
function _isnil(val) { return val === null || typeof val === 'undefined'; }
const path = require('path');
const sass = (0, _optional.optional)('sass', '>=1.34.0');
const fibers = (0, _optional.optional)('fibers', '>=5.0.0');
class ScssCompiler extends _Compiler.Compiler {
constructor(app, ...args) {
super(app, ...args);
this.supportedExtensions = ['scss', 'sass'];
this.options = {};
this.priority = 1000;
this.kind = 'style';
this.options = app.config.get('assets.compilers.scss', {});
if (_isnil(this.options.sourceMap) && _isnil(this.options.sourceMapEmbed) && _isnil(this.options.sourceMapContents)) {
this.options.sourceMap = this.sourceMaps === 'auto';
this.options.sourceMapEmbed = this.sourceMaps === 'auto';
this.options.sourceMapContents = this.sourceMaps === 'auto';
}
}
async compile(pathname, context) {
sass.assert();
fibers.resolve(false);
const liveReload = await this.getLiveReloadImports(pathname);
return new Promise((resolve, reject) => {
sass.pkg.render(Object.assign({}, this.options, {
file: pathname,
outputStyle: context || 'expanded',
fiber: fibers.pkg
}), (err, result) => {
if (!_isnil(err)) {
if (typeof err.file !== 'string') {
return reject(err);
}
return (0, _makeSyntaxError.makeSyntaxError)(this.app, {
causedBy: err
}).catch(reject).then(reject);
}
if (!this.liveReload) {
return resolve(result.css);
}
return resolve(result.css.toString() + this.constructor.buildLiveReloadInjection(this.app, pathname, liveReload));
});
});
}
async enumerateImports(pathname, callback) {
const exists = await _grindSupport.FS.exists(pathname);
if (!exists) {
return;
}
const contents = await _grindSupport.FS.readFile(pathname);
const importPaths = [];
contents.toString().replace(/@import\s?([^\s]+);/gi, (_, importPath) => {
importPaths.push(importPath);
});
for (let importPath of importPaths) {
const dirname = path.dirname(pathname);
importPath = importPath.replace(/("|'|url|\(|\))/g, '').trim();
let partial = null;
if (importPath.indexOf('/') >= 0) {
partial = path.join(dirname, path.dirname(importPath), `_${path.basename(importPath)}`);
} else {
partial = path.join(dirname, `_${importPath}`);
}
importPath = path.join(dirname, importPath);
const ext = path.extname(importPath);
const files = [];
if (ext !== '.scss' && ext !== '.sass') {
files.push(`${importPath}.scss`);
files.push(`${partial}.scss`);
files.push(`${importPath}.sass`);
files.push(`${partial}.sass`);
} else {
files.push(importPath);
}
for (const file of files) {
const exists = await _grindSupport.FS.exists(file);
if (!exists) {
continue;
}
await callback(file);
break;
}
}
}
static buildLiveReloadInjection(app, pathname, files = []) {
const relative = path.relative(app.paths.base(), pathname);
files.unshift(relative);
let css = '\n\n#__liveReloadModule {';
css += `content: ${JSON.stringify(JSON.stringify(files))};`;
css += '}';
return css;
}
mime() {
return 'text/css';
}
type() {
return 'css';
}
extension() {
return 'css';
}
}
exports.ScssCompiler = ScssCompiler;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9Db21waWxlcnMvU2Nzc0NvbXBpbGVyLmpzIl0sIm5hbWVzIjpbInBhdGgiLCJyZXF1aXJlIiwic2FzcyIsImZpYmVycyIsIlNjc3NDb21waWxlciIsIkNvbXBpbGVyIiwiY29uc3RydWN0b3IiLCJhcHAiLCJhcmdzIiwic3VwcG9ydGVkRXh0ZW5zaW9ucyIsIm9wdGlvbnMiLCJwcmlvcml0eSIsImtpbmQiLCJjb25maWciLCJnZXQiLCJzb3VyY2VNYXAiLCJzb3VyY2VNYXBFbWJlZCIsInNvdXJjZU1hcENvbnRlbnRzIiwic291cmNlTWFwcyIsImNvbXBpbGUiLCJwYXRobmFtZSIsImNvbnRleHQiLCJhc3NlcnQiLCJyZXNvbHZlIiwibGl2ZVJlbG9hZCIsImdldExpdmVSZWxvYWRJbXBvcnRzIiwiUHJvbWlzZSIsInJlamVjdCIsInBrZyIsInJlbmRlciIsIk9iamVjdCIsImFzc2lnbiIsImZpbGUiLCJvdXRwdXRTdHlsZSIsImZpYmVyIiwiZXJyIiwicmVzdWx0IiwiY2F1c2VkQnkiLCJjYXRjaCIsInRoZW4iLCJjc3MiLCJ0b1N0cmluZyIsImJ1aWxkTGl2ZVJlbG9hZEluamVjdGlvbiIsImVudW1lcmF0ZUltcG9ydHMiLCJjYWxsYmFjayIsImV4aXN0cyIsIkZTIiwiY29udGVudHMiLCJyZWFkRmlsZSIsImltcG9ydFBhdGhzIiwicmVwbGFjZSIsIl8iLCJpbXBvcnRQYXRoIiwicHVzaCIsImRpcm5hbWUiLCJ0cmltIiwicGFydGlhbCIsImluZGV4T2YiLCJqb2luIiwiYmFzZW5hbWUiLCJleHQiLCJleHRuYW1lIiwiZmlsZXMiLCJyZWxhdGl2ZSIsInBhdGhzIiwiYmFzZSIsInVuc2hpZnQiLCJKU09OIiwic3RyaW5naWZ5IiwibWltZSIsInR5cGUiLCJleHRlbnNpb24iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFJQTs7OztBQUVBLE1BQU1BLElBQUksR0FBR0MsT0FBTyxDQUFDLE1BQUQsQ0FBcEI7O0FBQ0EsTUFBTUMs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RUEsV0FBT0EsR0FBUDtBQUNBOztBQUVENkIsRUFBQUEsSUFBSSxHQUFHO0FBQ04sV0FBTyxVQUFQO0FBQ0E7O0FBRURDLEVBQUFBLElBQUksR0FBRztBQUNOLFdBQU8sS0FBUDtBQUNBOztBQUVEQyxFQUFBQSxTQUFTLEdBQUc7QUFDWCxXQUFPLEtBQVA7QUFDQTs7QUEzSXlDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICcuL0NvbXBpbGVyJ1xuaW1wb3J0ICcuLi9FcnJvcnMvbWFrZVN5bnRheEVycm9yJ1xuaW1wb3J0ICcuLi9TdXBwb3J0L29wdGlvbmFsJ1xuXG5pbXBvcnQgeyBGUyB9IGZyb20gJ2dyaW5kLXN1cHBvcnQnXG5cbmNvbnN0IHBhdGggPSByZXF1aXJlKCdwYXRoJylcbmNvbnN0IHNhc3MgPSBvcHRpb25hbCgnc2FzcycsICc+PTEuMzQuMCcpXG5jb25zdCBmaWJlcnMgPSBvcHRpb25hbCgnZmliZXJzJywgJz49NS4wLjAnKVxuXG5leHBvcnQgY2xhc3MgU2Nzc0NvbXBpbGVyIGV4dGVuZHMgQ29tcGlsZXIge1xuXHRzdXBwb3J0ZWRFeHRlbnNpb25zID0gWydzY3NzJywgJ3Nhc3MnXVxuXHRvcHRpb25zID0ge31cblx0cHJpb3JpdHkgPSAxMDAwXG5cdGtpbmQgPSAnc3R5bGUnXG5cblx0Y29uc3RydWN0b3IoYXBwLCAuLi5hcmdzKSB7XG5cdFx0c3VwZXIoYXBwLCAuLi5hcmdzKVxuXG5cdFx0dGhpcy5vcHRpb25zID0gYXBwLmNvbmZpZy5nZXQoJ2Fzc2V0cy5jb21waWxlcnMuc2NzcycsIHt9KVxuXG5cdFx0aWYgKFxuXHRcdFx0dGhpcy5vcHRpb25zLnNvdXJjZU1hcC5pc05pbCAmJlxuXHRcdFx0dGhpcy5vcHRpb25zLnNvdXJjZU1hcEVtYmVkLmlzTmlsICYmXG5cdFx0XHR0aGlzLm9wdGlvbnMuc291cmNlTWFwQ29udGVudHMuaXNOaWxcblx0XHQpIHtcblx0XHRcdHRoaXMub3B0aW9ucy5zb3VyY2VNYXAgPSB0aGlzLnNvdXJjZU1hcHMgPT09ICdhdXRvJ1xuXHRcdFx0dGhpcy5vcHRpb25zLnNvdXJjZU1hcEVtYmVkID0gdGhpcy5zb3VyY2VNYXBzID09PSAnYXV0bydcblx0XHRcdHRoaXMub3B0aW9ucy5zb3VyY2VNYXBDb250ZW50cyA9IHRoaXMuc291cmNlTWFwcyA9PT0gJ2F1dG8nXG5cdFx0fVxuXHR9XG5cblx0YXN5bmMgY29tcGlsZShwYXRobmFtZSwgY29udGV4dCkge1xuXHRcdHNhc3MuYXNzZXJ0KClcblx0XHRmaWJlcnMucmVzb2x2ZShmYWxzZSlcblxuXHRcdGNvbnN0IGxpdmVSZWxvYWQgPSBhd2FpdCB0aGlzLmdldExpdmVSZWxvYWRJbXBvcnRzKHBhdGhuYW1lKVxuXG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRcdHNhc3MucGtnLnJlbmRlcihcblx0XHRcdFx0T2JqZWN0LmFzc2lnbih7fSwgdGhpcy5vcHRpb25zLCB7XG5cdFx0XHRcdFx0ZmlsZTogcGF0aG5hbWUsXG5cdFx0XHRcdFx0b3V0cHV0U3R5bGU6IGNvbnRleHQgfHwgJ2V4cGFuZGVkJyxcblx0XHRcdFx0XHRmaWJlcjogZmliZXJzLnBrZyxcblx0XHRcdFx0fSksXG5cdFx0XHRcdChlcnIsIHJlc3VsdCkgPT4ge1xuXHRcdFx0XHRcdGlmICghZXJyLmlzTmlsKSB7XG5cdFx0XHRcdFx0XHRpZiAodHlwZW9mIGVyci5maWxlICE9PSAnc3RyaW5nJykge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gcmVqZWN0KGVycilcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0cmV0dXJuIG1ha2VTeW50YXhFcnJvcih0aGlzLmFwcCwgeyBjYXVzZWRCeTogZXJyIH0pXG5cdFx0XHRcdFx0XHRcdC5jYXRjaChyZWplY3QpXG5cdFx0XHRcdFx0XHRcdC50aGVuKHJlamVjdClcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAoIXRoaXMubGl2ZVJlbG9hZCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHJlc29sdmUocmVzdWx0LmNzcylcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRyZXR1cm4gcmVzb2x2ZShcblx0XHRcdFx0XHRcdHJlc3VsdC5jc3MudG9TdHJpbmcoKSArXG5cdFx0XHRcdFx0XHRcdHRoaXMuY29uc3RydWN0b3IuYnVpbGRMaXZlUmVsb2FkSW5qZWN0aW9uKFxuXHRcdFx0XHRcdFx0XHRcdHRoaXMuYXBwLFxuXHRcdFx0XHRcdFx0XHRcdHBhdGhuYW1lLFxuXHRcdFx0XHRcdFx0XHRcdGxpdmVSZWxvYWQsXG5cdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0KVxuXHRcdFx0XHR9LFxuXHRcdFx0KVxuXHRcdH0pXG5cdH1cblxuXHRhc3luYyBlbnVtZXJhdGVJbXBvcnRzKHBhdGhuYW1lLCBjYWxsYmFjaykge1xuXHRcdGNvbnN0IGV4aXN0cyA9IGF3YWl0IEZTLmV4aXN0cyhwYXRobmFtZSlcblxuXHRcdGlmICghZXhpc3RzKSB7XG5cdFx0XHRyZXR1cm5cblx0XHR9XG5cblx0XHRjb25zdCBjb250ZW50cyA9IGF3YWl0IEZTLnJlYWRGaWxlKHBhdGhuYW1lKVxuXHRcdGNvbnN0IGltcG9ydFBhdGhzID0gW11cblxuXHRcdGNvbnRlbnRzLnRvU3RyaW5nKCkucmVwbGFjZSgvQGltcG9ydFxccz8oW15cXHNdKyk7L2dpLCAoXywgaW1wb3J0UGF0aCkgPT4ge1xuXHRcdFx0aW1wb3J0UGF0aHMucHVzaChpbXBvcnRQYXRoKVxuXHRcdH0pXG5cblx0XHRmb3IgKGxldCBpbXBvcnRQYXRoIG9mIGltcG9ydFBhdGhzKSB7XG5cdFx0XHRjb25zdCBkaXJuYW1lID0gcGF0aC5kaXJuYW1lKHBhdGhuYW1lKVxuXHRcdFx0aW1wb3J0UGF0aCA9IGltcG9ydFBhdGgucmVwbGFjZSgvKFwifCd8dXJsfFxcKHxcXCkpL2csICcnKS50cmltKClcblx0XHRcdGxldCBwYXJ0aWFsID0gbnVsbFxuXG5cdFx0XHRpZiAoaW1wb3J0UGF0aC5pbmRleE9mKCcvJykgPj0gMCkge1xuXHRcdFx0XHRwYXJ0aWFsID0gcGF0aC5qb2luKFxuXHRcdFx0XHRcdGRpcm5hbWUsXG5cdFx0XHRcdFx0cGF0aC5kaXJuYW1lKGltcG9ydFBhdGgpLFxuXHRcdFx0XHRcdGBfJHtwYXRoLmJhc2VuYW1lKGltcG9ydFBhdGgpfWAsXG5cdFx0XHRcdClcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHBhcnRpYWwgPSBwYXRoLmpvaW4oZGlybmFtZSwgYF8ke2ltcG9ydFBhdGh9YClcblx0XHRcdH1cblxuXHRcdFx0aW1wb3J0UGF0aCA9IHBhdGguam9pbihkaXJuYW1lLCBpbXBvcnRQYXRoKVxuXHRcdFx0Y29uc3QgZXh0ID0gcGF0aC5leHRuYW1lKGltcG9ydFBhdGgpXG5cdFx0XHRjb25zdCBmaWxlcyA9IFtdXG5cblx0XHRcdGlmIChleHQgIT09ICcuc2NzcycgJiYgZXh0ICE9PSAnLnNhc3MnKSB7XG5cdFx0XHRcdGZpbGVzLnB1c2goYCR7aW1wb3J0UGF0aH0uc2Nzc2ApXG5cdFx0XHRcdGZpbGVzLnB1c2goYCR7cGFydGlhbH0uc2Nzc2ApXG5cdFx0XHRcdGZpbGVzLnB1c2goYCR7aW1wb3J0UGF0aH0uc2Fzc2ApXG5cdFx0XHRcdGZpbGVzLnB1c2goYCR7cGFydGlhbH0uc2Fzc2ApXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRmaWxlcy5wdXNoKGltcG9ydFBhdGgpXG5cdFx0XHR9XG5cblx0XHRcdGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xuXHRcdFx0XHRjb25zdCBleGlzdHMgPSBhd2FpdCBGUy5leGlzdHMoZmlsZSlcblxuXHRcdFx0XHRpZiAoIWV4aXN0cykge1xuXHRcdFx0XHRcdGNvbnRpbnVlXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRhd2FpdCBjYWxsYmFjayhmaWxlKVxuXHRcdFx0XHRicmVha1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHN0YXRpYyBidWlsZExpdmVSZWxvYWRJbmplY3Rpb24oYXBwLCBwYXRobmFtZSwgZmlsZXMgPSBbXSkge1xuXHRcdGNvbnN0IHJlbGF0aXZlID0gcGF0aC5yZWxhdGl2ZShhcHAucGF0aHMuYmFzZSgpLCBwYXRobmFtZSlcblx0XHRmaWxlcy51bnNoaWZ0KHJlbGF0aXZlKVxuXG5cdFx0bGV0IGNzcyA9ICdcXG5cXG4jX19saXZlUmVsb2FkTW9kdWxlIHsnXG5cdFx0Y3NzICs9IGBjb250ZW50OiAke0pTT04uc3RyaW5naWZ5KEpTT04uc3RyaW5naWZ5KGZpbGVzKSl9O2Bcblx0XHRjc3MgKz0gJ30nXG5cblx0XHRyZXR1cm4gY3NzXG5cdH1cblxuXHRtaW1lKCkge1xuXHRcdHJldHVybiAndGV4dC9jc3MnXG5cdH1cblxuXHR0eXBlKCkge1xuXHRcdHJldHVybiAnY3NzJ1xuXHR9XG5cblx0ZXh0ZW5zaW9uKCkge1xuXHRcdHJldHVybiAnY3NzJ1xuXHR9XG59XG4iXX0=