@elora-cloud/elora-unplugin-vue-components
Version:
unplugin-vue-components for elora
141 lines (137 loc) • 5.27 kB
JavaScript
;
var compareVersions = require('compare-versions');
var utils = require('./utils.cjs');
const eloraPackageName = '@elora-cloud/elora-plus/theme';
/**
* @deprecated
* @param partialName
* @param options
*/
function getSideEffectsLegacy(partialName, options) {
const { importStyle } = options;
if (!importStyle)
return;
if (importStyle === 'sass') {
return ['element-plus/packages/theme-chalk/src/base.scss', `element-plus/packages/theme-chalk/src/${partialName}.scss`];
}
if (importStyle === true || importStyle === 'css') {
return ['element-plus/lib/theme-chalk/base.css', `element-plus/lib/theme-chalk/el-${partialName}.css`];
}
}
function getSideEffects(dirName, options) {
const { importStyle, ssr, nightly } = options;
const themeFolder = nightly ? '@element-plus/nightly/theme-chalk' : 'element-plus/theme-chalk';
const esComponentsFolder = nightly ? '@element-plus/nightly/es/components' : 'element-plus/es/components';
if (importStyle === 'sass') {
return ssr
? [`${themeFolder}/src/base.scss`, `${themeFolder}/src/${dirName}.scss`, `${eloraPackageName}/src/styles/${dirName}.scss`]
: [`${esComponentsFolder}/base/style/index`, `${esComponentsFolder}/${dirName}/style/index`, `${eloraPackageName}/src/styles/${dirName}.scss`];
}
if (importStyle === true || importStyle === 'css') {
return ssr
? [`${themeFolder}/base.css`, `${themeFolder}/el-${dirName}.css`, `${eloraPackageName}/styles/${dirName}.css`]
: [`${esComponentsFolder}/base/style/css`, `${esComponentsFolder}/${dirName}/style/css`, `${eloraPackageName}/styles/${dirName}.css`];
}
}
function resolveComponent(name, options) {
if (options.exclude && name.match(options.exclude))
return;
if (!name.match(/^El[A-Z]/))
return;
if (name.match(/^ElIcon.+/)) {
return {
name: name.replace(/^ElIcon/, ''),
from: '@element-plus/icons-vue',
};
}
const partialName = utils.kebabCase(name.slice(2)); // ElTableColumn -> table-column
const { version, ssr, nightly } = options;
// >=1.1.0-beta.1
if (compareVersions.compare(version, '1.1.0-beta.1', '>=') || nightly) {
return {
name,
from: `${nightly ? '@element-plus/nightly' : 'element-plus'}/${ssr ? 'lib' : 'es'}`,
sideEffects: getSideEffects(partialName, options),
};
}
// >=1.0.2-beta.28
if (compareVersions.compare(version, '1.0.2-beta.28', '>=')) {
return {
from: `element-plus/es/el-${partialName}`,
sideEffects: getSideEffectsLegacy(partialName, options),
};
}
// for <=1.0.1
return {
from: `element-plus/lib/el-${partialName}`,
sideEffects: getSideEffectsLegacy(partialName, options),
};
}
function resolveDirective(name, options) {
if (!options.directives)
return;
const directives = {
Loading: { importName: 'ElLoadingDirective', styleName: 'loading' },
Popover: { importName: 'ElPopoverDirective', styleName: 'popover' },
InfiniteScroll: { importName: 'ElInfiniteScroll', styleName: 'infinite-scroll' },
};
const directive = directives[name];
if (!directive)
return;
const { version, ssr, nightly } = options;
// >=1.1.0-beta.1
if (compareVersions.compare(version, '1.1.0-beta.1', '>=') || nightly) {
return {
name: directive.importName,
from: `${nightly ? '@element-plus/nightly' : 'element-plus'}/${ssr ? 'lib' : 'es'}`,
sideEffects: getSideEffects(directive.styleName, options),
};
}
}
const noStylesComponents = ['ElAutoResizer'];
/**
* Resolver for Element Plus
*
* See https://github.com/antfu/vite-plugin-components/pull/28 for more details
* See https://github.com/antfu/vite-plugin-components/issues/117 for more details
*
* @author @develar @nabaonan @sxzz
* @link https://element-plus.org/ for element-plus
*
*/
function ElementPlusResolver(options = {}) {
let optionsResolved;
async function resolveOptions() {
if (optionsResolved)
return optionsResolved;
optionsResolved = {
ssr: false,
version: await utils.getPkgVersion('element-plus', '2.2.2'),
importStyle: 'css',
directives: true,
exclude: undefined,
noStylesComponents: options.noStylesComponents || [],
nightly: false,
...options,
};
return optionsResolved;
}
return [
{
type: 'component',
resolve: async (name) => {
const options = await resolveOptions();
if ([...options.noStylesComponents, ...noStylesComponents].includes(name))
return resolveComponent(name, { ...options, importStyle: false });
return resolveComponent(name, options);
},
},
{
type: 'directive',
resolve: async (name) => {
return resolveDirective(name, await resolveOptions());
},
},
];
}
exports.ElementPlusResolver = ElementPlusResolver;