rollup-plugin-vue-global-styles
Version:
Inject global code into your styles
72 lines (63 loc) • 2.79 kB
JavaScript
;
function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }
var rollupPluginutils = require('rollup-pluginutils');
var fs = require('fs');
var path = require('path');
var glob = _interopDefault(require('glob'));
var tc = _interopDefault(require('turbocolor'));
const getStyles = (globalStylePaths) => {
return globalStylePaths
.reduce((res, path) => [res, fs.readFileSync(path)].join('\n'), '');
};
const getStylePaths = (paths) => {
return paths.reduce((arr, path$1) => [...arr, ...glob.sync(path.resolve(process.cwd(), path$1))], []);
};
const unicodeRegExp = /a-zA-Z\u00B7\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u037D\u037F-\u1FFF\u200C-\u200D\u203F-\u2040\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD/;
const ncname = "[a-zA-Z_][\\-\\.0-9_a-zA-Z" + (unicodeRegExp.source) + "]*";
const qnameCapture = "((?:" + ncname + "\\:)?" + ncname + ")";
const startTagOpen = new RegExp(("^<" + qnameCapture));
const langAttr = /lang=["']sc|ass["']/;
const isCorrectLang = (line) => line.match(langAttr);
const isStyleTag = (line) => {
const match = line.match(startTagOpen);
return match && match[1] === 'style';
};
const injectStyle = (code, globalStyles) => {
const lines = code.split(/\r\n?|\n/);
return lines.reduce((arr, line) => {
arr.push(line);
if (isStyleTag(line) && isCorrectLang(line))
arr.push(globalStyles);
return arr;
}, []).join('\n');
};
var log = (title, body, color = 'yellow') => {
let output = body;
if (Array.isArray(body))
output = body.join('\n');
console.log(`${tc.gray('[vue-global-styles]')} ${tc.bold[color](title)}: ${body}`);
};
var index = (options = {}) => {
const filter = rollupPluginutils.createFilter(options.include || './**/*.vue', options.exclude);
const patterns = options.patterns || [];
const debug = (name, body, color) => options.debug && log(name, body, color);
const globalStylePaths = getStylePaths(patterns);
debug('resolved style paths', globalStylePaths);
return {
name: 'vue-global-styles',
transform(code, id) {
const skip = !filter(id);
skip ? debug('Skipping', id) : debug('Processing', id, 'green');
if (skip || !globalStylePaths.length)
return code;
globalStylePaths.forEach(path => {
this.addWatchFile(path);
});
const globalStyles = getStyles(globalStylePaths);
debug('globalStyles', globalStyles);
const codeWithStyle = injectStyle(code, globalStyles);
return codeWithStyle;
}
};
};
module.exports = index;