grind-assets
Version:
Asset management for Grind
159 lines (125 loc) • 16.6 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.BabelCompiler = void 0;
var _Compiler = require("./Compiler.js");
var _BrowserifyStage = require("./BabelCompiler/BrowserifyStage.js");
var _RollupStage = require("./BabelCompiler/RollupStage.js");
var _grindSupport = require("grind-support");
function _isnil(val) { return val === null || typeof val === 'undefined'; }
const path = require('path');
const {
Readable
} = require('stream');
class BabelCompiler extends _Compiler.Compiler {
constructor(app, ...args) {
super(app, ...args);
this.alwaysProcessJs = false;
this.wantsHashSuffixOnPublish = true;
this.supportedExtensions = ['js', 'jsx', 'es', 'es6', 'es7', 'esx'];
this.priority = 1000;
this.kind = 'script';
this.stages = null;
this.alwaysProcessJs = app.config.get('assets.compilers.babel.allow_vanilla_js') === false;
const stages = [];
for (const stage of this.constructor.stages) {
stages.push(new stage(app, this.sourceMaps, app.config.get(`assets.compilers.babel.${stage.configName}`, {})));
}
this.stages = stages.filter(({
enabled
}) => enabled);
if (this.stages.length === 0) {
throw new Error('Invalid assets config: at least one stage must be enabled.');
}
}
supports(pathname) {
if (!super.supports(pathname)) {
return false;
} else if (this.alwaysProcessJs) {
return true;
}
return pathname.includes('babel') || pathname.includes('Devtools');
}
async compile(pathname, context, req) {
const files = await this.getLiveReloadImports(pathname);
let contents = null;
for (const stage of this.stages) {
stage.handleBabel = _isnil(contents);
let stream = null;
if (!stage.handleBabel) {
stream = new Readable();
stream.push(contents);
stream.push(null);
}
contents = await stage.compile(pathname, stream, req);
}
if (!this.liveReload || files.length === 0) {
return contents;
}
contents = contents.toString();
contents += this.constructor.buildLiveReloadInjection(this.app, pathname, files);
return contents;
}
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|export)\s*(?:\{[^}]+\}|[\w\s*]+)\s*from\s*((["'`]).+?(\2))/gim, (_, importPath) => {
importPaths.push(importPath);
});
contents.toString().replace(/import\s*((["'`]).+?(\2))/gi, (_, importPath) => {
importPaths.push(importPath);
});
contents.toString().replace(/require\s*\(([^)]+)\)/gi, (_, importPath) => {
importPaths.push(importPath);
});
for (let importPath of importPaths) {
const dirname = path.dirname(pathname);
importPath = path.join(dirname, importPath.replace(/["'`]/g, '').trim());
const ext = path.extname(importPath).substring(1);
const files = [];
if (ext.indexOf(this.supportedExtensions) === -1) {
for (const ext of this.supportedExtensions) {
files.push(`${importPath}.${ext}`);
files.push(`${importPath}/index.${ext}`);
}
} 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 js = '\n\n(function() {\n';
js += `document.currentScript.setAttribute("data-live-reload-module", "${relative}");\n`;
js += 'window.__liveReloadModules = window.__liveReloadModules || { };\n';
js += `window.__liveReloadModules["${relative}"] = ${JSON.stringify(files)};\n`;
js += '})();\n';
return js;
}
mime() {
return 'application/javascript';
}
type() {
return 'js';
}
extension() {
return 'js';
}
}
exports.BabelCompiler = BabelCompiler;
BabelCompiler.stages = [_RollupStage.RollupStage, _BrowserifyStage.BrowserifyStage];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9Db21waWxlcnMvQmFiZWxDb21waWxlci5qcyJdLCJuYW1lcyI6WyJwYXRoIiwicmVxdWlyZSIsIlJlYWRhYmxlIiwiQmFiZWxDb21waWxlciIsIkNvbXBpbGVyIiwiY29uc3RydWN0b3IiLCJhcHAiLCJhcmdzIiwiYWx3YXlzUHJvY2Vzc0pzIiwid2FudHNIYXNoU3VmZml4T25QdWJsaXNoIiwic3VwcG9ydGVkRXh0ZW5zaW9ucyIsInByaW9yaXR5Iiwia2luZCIsInN0YWdlcyIsImNvbmZpZyIsImdldCIsInN0YWdlIiwicHVzaCIsInNvdXJjZU1hcHMiLCJjb25maWdOYW1lIiwiZmlsdGVyIiwiZW5hYmxlZCIsImxlbmd0aCIsIkVycm9yIiwic3VwcG9ydHMiLCJwYXRobmFtZSIsImluY2x1ZGVzIiwiY29tcGlsZSIsImNvbnRleHQiLCJyZXEiLCJmaWxlcyIsImdldExpdmVSZWxvYWRJbXBvcnRzIiwiY29udGVudHMiLCJoYW5kbGVCYWJlbCIsInN0cmVhbSIsImxpdmVSZWxvYWQiLCJ0b1N0cmluZyIsImJ1aWxkTGl2ZVJlbG9hZEluamVjdGlvbiIsImVudW1lcmF0ZUltcG9ydHMiLCJjYWxsYmFjayIsImV4aXN0cyIsIkZTIiwicmVhZEZpbGUiLCJpbXBvcnRQYXRocyIsInJlcGxhY2UiLCJfIiwiaW1wb3J0UGF0aCIsImRpcm5hbWUiLCJqb2luIiwidHJpbSIsImV4dCIsImV4dG5hbWUiLCJzdWJzdHJpbmciLCJpbmRleE9mIiwiZmlsZSIsInJlbGF0aXZlIiwicGF0aHMiLCJiYXNlIiwidW5zaGlmdCIsImpzIiwiSlNPTiIsInN0cmluZ2lmeSIsIm1pbWUiLCJ0eXBlIiwiZXh0ZW5zaW9uIiwiUm9sbHVwU3RhZ2UiLCJCcm93c2VyaWZ5U3RhZ2UiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFLQTs7OztBQUVBLE1BQU1BLElBQUksR0FBR0MsT0FBTyxDQUFDLE1BQUQsQ0FBcEI7O0FBQ0EsTUFBTTtBQUFFQyxFQUFBQTtB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QUssQ0FBQzRCLE9BQU4sQ0FBY0gsUUFBZDtBQUVBLFFBQUlJLEVBQUUsR0FBRyxxQkFBVDtBQUNBQSxJQUFBQSxFQUFFLElBQUssbUVBQWtFSixRQUFTLE9BQWxGO0FBQ0FJLElBQUFBLEVBQUUsSUFBSSxtRUFBTjtBQUNBQSxJQUFBQSxFQUFFLElBQUssK0JBQThCSixRQUFTLFFBQU9LLElBQUksQ0FBQ0MsU0FBTCxDQUFlL0IsS0FBZixDQUFzQixLQUEzRTtBQUNBNkIsSUFBQUEsRUFBRSxJQUFJLFNBQU47QUFFQSxXQUFPQSxFQUFQO0FBQ0E7O0FBRURHLEVBQUFBLElBQUksR0FBRztBQUNOLFdBQU8sd0JBQVA7QUFDQTs7QUFFREMsRUFBQUEsSUFBSSxHQUFHO0FBQ04sV0FBTyxJQUFQO0FBQ0E7O0FBRURDLEVBQUFBLFNBQVMsR0FBRztBQUNYLFdBQU8sSUFBUDtBQUNBOztBQXRKMEM7OztBQUEvQjdELGEsQ0FDTFUsTSxHQUFTLENBQUNvRCx3QkFBRCxFQUFjQyxnQ0FBZCxDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICcuL0NvbXBpbGVyJ1xuXG5pbXBvcnQgJy4vQmFiZWxDb21waWxlci9Ccm93c2VyaWZ5U3RhZ2UnXG5pbXBvcnQgJy4vQmFiZWxDb21waWxlci9Sb2xsdXBTdGFnZSdcblxuaW1wb3J0IHsgRlMgfSBmcm9tICdncmluZC1zdXBwb3J0J1xuXG5jb25zdCBwYXRoID0gcmVxdWlyZSgncGF0aCcpXG5jb25zdCB7IFJlYWRhYmxlIH0gPSByZXF1aXJlKCdzdHJlYW0nKVxuXG5leHBvcnQgY2xhc3MgQmFiZWxDb21waWxlciBleHRlbmRzIENvbXBpbGVyIHtcblx0c3RhdGljIHN0YWdlcyA9IFtSb2xsdXBTdGFnZSwgQnJvd3NlcmlmeVN0YWdlXVxuXG5cdGFsd2F5c1Byb2Nlc3NKcyA9IGZhbHNlXG5cdHdhbnRzSGFzaFN1ZmZpeE9uUHVibGlzaCA9IHRydWVcblx0c3VwcG9ydGVkRXh0ZW5zaW9ucyA9IFsnanMnLCAnanN4JywgJ2VzJywgJ2VzNicsICdlczcnLCAnZXN4J11cblx0cHJpb3JpdHkgPSAxMDAwXG5cdGtpbmQgPSAnc2NyaXB0J1xuXHRzdGFnZXMgPSBudWxsXG5cblx0Y29uc3RydWN0b3IoYXBwLCAuLi5hcmdzKSB7XG5cdFx0c3VwZXIoYXBwLCAuLi5hcmdzKVxuXG5cdFx0dGhpcy5hbHdheXNQcm9jZXNzSnMgPSBhcHAuY29uZmlnLmdldCgnYXNzZXRzLmNvbXBpbGVycy5iYWJlbC5hbGxvd192YW5pbGxhX2pzJykgPT09IGZhbHNlXG5cblx0XHRjb25zdCBzdGFnZXMgPSBbXVxuXG5cdFx0Zm9yIChjb25zdCBzdGFnZSBvZiB0aGlzLmNvbnN0cnVjdG9yLnN0YWdlcykge1xuXHRcdFx0c3RhZ2VzLnB1c2goXG5cdFx0XHRcdG5ldyBzdGFnZShcblx0XHRcdFx0XHRhcHAsXG5cdFx0XHRcdFx0dGhpcy5zb3VyY2VNYXBzLFxuXHRcdFx0XHRcdGFwcC5jb25maWcuZ2V0KGBhc3NldHMuY29tcGlsZXJzLmJhYmVsLiR7c3RhZ2UuY29uZmlnTmFtZX1gLCB7fSksXG5cdFx0XHRcdCksXG5cdFx0XHQpXG5cdFx0fVxuXG5cdFx0dGhpcy5zdGFnZXMgPSBzdGFnZXMuZmlsdGVyKCh7IGVuYWJsZWQgfSkgPT4gZW5hYmxlZClcblxuXHRcdGlmICh0aGlzLnN0YWdlcy5sZW5ndGggPT09IDApIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcignSW52YWxpZCBhc3NldHMgY29uZmlnOiBhdCBsZWFzdCBvbmUgc3RhZ2UgbXVzdCBiZSBlbmFibGVkLicpXG5cdFx0fVxuXHR9XG5cblx0c3VwcG9ydHMocGF0aG5hbWUpIHtcblx0XHRpZiAoIXN1cGVyLnN1cHBvcnRzKHBhdGhuYW1lKSkge1xuXHRcdFx0cmV0dXJuIGZhbHNlXG5cdFx0fSBlbHNlIGlmICh0aGlzLmFsd2F5c1Byb2Nlc3NKcykge1xuXHRcdFx0cmV0dXJuIHRydWVcblx0XHR9XG5cblx0XHRyZXR1cm4gcGF0aG5hbWUuaW5jbHVkZXMoJ2JhYmVsJykgfHwgcGF0aG5hbWUuaW5jbHVkZXMoJ0RldnRvb2xzJylcblx0fVxuXG5cdGFzeW5jIGNvbXBpbGUocGF0aG5hbWUsIGNvbnRleHQsIHJlcSkge1xuXHRcdGNvbnN0IGZpbGVzID0gYXdhaXQgdGhpcy5nZXRMaXZlUmVsb2FkSW1wb3J0cyhwYXRobmFtZSlcblx0XHRsZXQgY29udGVudHMgPSBudWxsXG5cblx0XHRmb3IgKGNvbnN0IHN0YWdlIG9mIHRoaXMuc3RhZ2VzKSB7XG5cdFx0XHRzdGFnZS5oYW5kbGVCYWJlbCA9IGNvbnRlbnRzLmlzTmlsXG5cdFx0XHRsZXQgc3RyZWFtID0gbnVsbFxuXG5cdFx0XHRpZiAoIXN0YWdlLmhhbmRsZUJhYmVsKSB7XG5cdFx0XHRcdHN0cmVhbSA9IG5ldyBSZWFkYWJsZSgpXG5cdFx0XHRcdHN0cmVhbS5wdXNoKGNvbnRlbnRzKVxuXHRcdFx0XHRzdHJlYW0ucHVzaChudWxsKVxuXHRcdFx0fVxuXG5cdFx0XHRjb250ZW50cyA9IGF3YWl0IHN0YWdlLmNvbXBpbGUocGF0aG5hbWUsIHN0cmVhbSwgcmVxKVxuXHRcdH1cblxuXHRcdGlmICghdGhpcy5saXZlUmVsb2FkIHx8IGZpbGVzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0cmV0dXJuIGNvbnRlbnRzXG5cdFx0fVxuXG5cdFx0Y29udGVudHMgPSBjb250ZW50cy50b1N0cmluZygpXG5cdFx0Y29udGVudHMgKz0gdGhpcy5jb25zdHJ1Y3Rvci5idWlsZExpdmVSZWxvYWRJbmplY3Rpb24odGhpcy5hcHAsIHBhdGhuYW1lLCBmaWxlcylcblxuXHRcdHJldHVybiBjb250ZW50c1xuXHR9XG5cblx0YXN5bmMgZW51bWVyYXRlSW1wb3J0cyhwYXRobmFtZSwgY2FsbGJhY2spIHtcblx0XHRjb25zdCBleGlzdHMgPSBhd2FpdCBGUy5leGlzdHMocGF0aG5hbWUpXG5cblx0XHRpZiAoIWV4aXN0cykge1xuXHRcdFx0cmV0dXJuXG5cdFx0fVxuXG5cdFx0Y29uc3QgY29udGVudHMgPSBhd2FpdCBGUy5yZWFkRmlsZShwYXRobmFtZSlcblx0XHRjb25zdCBpbXBvcnRQYXRocyA9IFtdXG5cblx0XHRjb250ZW50c1xuXHRcdFx0LnRvU3RyaW5nKClcblx0XHRcdC5yZXBsYWNlKFxuXHRcdFx0XHQvKD86aW1wb3J0fGV4cG9ydClcXHMqKD86XFx7W159XStcXH18W1xcd1xccypdKylcXHMqZnJvbVxccyooKFtcIidgXSkuKz8oXFwyKSkvZ2ltLFxuXHRcdFx0XHQoXywgaW1wb3J0UGF0aCkgPT4ge1xuXHRcdFx0XHRcdGltcG9ydFBhdGhzLnB1c2goaW1wb3J0UGF0aClcblx0XHRcdFx0fSxcblx0XHRcdClcblxuXHRcdGNvbnRlbnRzLnRvU3RyaW5nKCkucmVwbGFjZSgvaW1wb3J0XFxzKigoW1wiJ2BdKS4rPyhcXDIpKS9naSwgKF8sIGltcG9ydFBhdGgpID0+IHtcblx0XHRcdGltcG9ydFBhdGhzLnB1c2goaW1wb3J0UGF0aClcblx0XHR9KVxuXG5cdFx0Y29udGVudHMudG9TdHJpbmcoKS5yZXBsYWNlKC9yZXF1aXJlXFxzKlxcKChbXildKylcXCkvZ2ksIChfLCBpbXBvcnRQYXRoKSA9PiB7XG5cdFx0XHRpbXBvcnRQYXRocy5wdXNoKGltcG9ydFBhdGgpXG5cdFx0fSlcblxuXHRcdGZvciAobGV0IGltcG9ydFBhdGggb2YgaW1wb3J0UGF0aHMpIHtcblx0XHRcdGNvbnN0IGRpcm5hbWUgPSBwYXRoLmRpcm5hbWUocGF0aG5hbWUpXG5cdFx0XHRpbXBvcnRQYXRoID0gcGF0aC5qb2luKGRpcm5hbWUsIGltcG9ydFBhdGgucmVwbGFjZSgvW1wiJ2BdL2csICcnKS50cmltKCkpXG5cblx0XHRcdGNvbnN0IGV4dCA9IHBhdGguZXh0bmFtZShpbXBvcnRQYXRoKS5zdWJzdHJpbmcoMSlcblx0XHRcdGNvbnN0IGZpbGVzID0gW11cblxuXHRcdFx0aWYgKGV4dC5pbmRleE9mKHRoaXMuc3VwcG9ydGVkRXh0ZW5zaW9ucykgPT09IC0xKSB7XG5cdFx0XHRcdGZvciAoY29uc3QgZXh0IG9mIHRoaXMuc3VwcG9ydGVkRXh0ZW5zaW9ucykge1xuXHRcdFx0XHRcdGZpbGVzLnB1c2goYCR7aW1wb3J0UGF0aH0uJHtleHR9YClcblx0XHRcdFx0XHRmaWxlcy5wdXNoKGAke2ltcG9ydFBhdGh9L2luZGV4LiR7ZXh0fWApXG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGZpbGVzLnB1c2goaW1wb3J0UGF0aClcblx0XHRcdH1cblxuXHRcdFx0Zm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG5cdFx0XHRcdGNvbnN0IGV4aXN0cyA9IGF3YWl0IEZTLmV4aXN0cyhmaWxlKVxuXG5cdFx0XHRcdGlmICghZXhpc3RzKSB7XG5cdFx0XHRcdFx0Y29udGludWVcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGF3YWl0IGNhbGxiYWNrKGZpbGUpXG5cdFx0XHRcdGJyZWFrXG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0c3RhdGljIGJ1aWxkTGl2ZVJlbG9hZEluamVjdGlvbihhcHAsIHBhdGhuYW1lLCBmaWxlcyA9IFtdKSB7XG5cdFx0Y29uc3QgcmVsYXRpdmUgPSBwYXRoLnJlbGF0aXZlKGFwcC5wYXRocy5iYXNlKCksIHBhdGhuYW1lKVxuXHRcdGZpbGVzLnVuc2hpZnQocmVsYXRpdmUpXG5cblx0XHRsZXQganMgPSAnXFxuXFxuKGZ1bmN0aW9uKCkge1xcbidcblx0XHRqcyArPSBgZG9jdW1lbnQuY3VycmVudFNjcmlwdC5zZXRBdHRyaWJ1dGUoXCJkYXRhLWxpdmUtcmVsb2FkLW1vZHVsZVwiLCBcIiR7cmVsYXRpdmV9XCIpO1xcbmBcblx0XHRqcyArPSAnd2luZG93Ll9fbGl2ZVJlbG9hZE1vZHVsZXMgPSB3aW5kb3cuX19saXZlUmVsb2FkTW9kdWxlcyB8fCB7IH07XFxuJ1xuXHRcdGpzICs9IGB3aW5kb3cuX19saXZlUmVsb2FkTW9kdWxlc1tcIiR7cmVsYXRpdmV9XCJdID0gJHtKU09OLnN0cmluZ2lmeShmaWxlcyl9O1xcbmBcblx0XHRqcyArPSAnfSkoKTtcXG4nXG5cblx0XHRyZXR1cm4ganNcblx0fVxuXG5cdG1pbWUoKSB7XG5cdFx0cmV0dXJuICdhcHBsaWNhdGlvbi9qYXZhc2NyaXB0J1xuXHR9XG5cblx0dHlwZSgpIHtcblx0XHRyZXR1cm4gJ2pzJ1xuXHR9XG5cblx0ZXh0ZW5zaW9uKCkge1xuXHRcdHJldHVybiAnanMnXG5cdH1cbn1cbiJdfQ==