UNPKG

grind-assets

Version:
159 lines (125 loc) 16.6 kB
"use strict"; 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==