UNPKG

rollup-plugin-vue-global-styles

Version:
72 lines (63 loc) 2.79 kB
'use strict'; 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;