rollup-plugin-vue
Version:
> Roll Vue 3 SFCs with Rollup.
80 lines (79 loc) • 2.84 kB
JavaScript
import { createFilter } from 'rollup-pluginutils';
import * as queryString from 'querystring';
import * as path from 'path';
const GET_QUERY = /\.vue(\.[a-z]+?)?\?(.+)$/i;
const PARAM_NAME = 'rollup-plugin-vue';
export function createVueFilter(include = [/\.vue$/i], exclude = []) {
const filter = createFilter(include, exclude);
return id => filter(id);
}
export function getVueMetaFromQuery(id) {
const match = GET_QUERY.exec(id);
if (match) {
const query = queryString.parse(match[2]);
if (PARAM_NAME in query) {
const data = (Array.isArray(query[PARAM_NAME])
? query[PARAM_NAME][0]
: query[PARAM_NAME]);
const [type, index, lang] = data.split('.');
return (lang
? { type, lang, index: parseInt(index) } // styles.0.css
: { type, lang: index }); // script.js
}
}
return null;
}
export function isVuePartRequest(id) {
return getVueMetaFromQuery(id) !== null;
}
export const createVuePartRequest = ((filename, lang, type, index) => {
lang = lang || createVuePartRequest.defaultLang[type];
const match = GET_QUERY.exec(filename);
const query = match ? queryString.parse(match[2]) : {};
query[PARAM_NAME] = [type, index, lang]
.filter(it => it !== undefined)
.join('.');
return `${path.basename(filename)}?${queryString.stringify(query)}`;
});
createVuePartRequest.defaultLang = {
template: 'html',
styles: 'css',
script: 'js'
};
export function parseVuePartRequest(id) {
if (!id.includes('.vue'))
return;
const filename = id.substr(0, id.lastIndexOf('.vue') + 4);
const params = getVueMetaFromQuery(id);
if (params === null)
return;
return {
filename,
meta: params
};
}
export function resolveVuePart(descriptors, { filename, meta }) {
const descriptor = descriptors.get(filename);
if (!descriptor)
throw Error('File not processed yet, ' + filename);
const blocks = descriptor[meta.type];
const block = Array.isArray(blocks) ? blocks[meta.index] : blocks;
if (!block)
throw Error(`Requested (type=${meta.type} & index=${meta.index}) block not found in ${filename}`);
return block;
}
export function transformRequireToImport(code) {
const imports = {};
let strImports = '';
code = code.replace(/require\(("(?:[^"\\]|\\.)+"|'(?:[^'\\]|\\.)+')\)/g, (_, name) => {
if (!(name in imports)) {
imports[name] = `__$_require_${name
.replace(/[^a-z0-9]/g, '_')
.replace(/_{2,}/g, '_')
.replace(/^_|_$/g, '')}__`;
strImports += 'import ' + imports[name] + ' from ' + name + '\n';
}
return imports[name];
});
return strImports + code;
}