From eee3d13161fe6d93f848946e760ba506e303031e Mon Sep 17 00:00:00 2001 From: sight <1453017105@qq.com> Date: Wed, 27 Apr 2022 20:17:39 +0800 Subject: [PATCH 1/2] feat(resolver): add resolver for layui-vue --- src/core/resolvers/index.ts | 1 + src/core/resolvers/layui-vue.ts | 170 ++++++++++++++++++++++++++++++++ 2 files changed, 171 insertions(+) create mode 100644 src/core/resolvers/layui-vue.ts diff --git a/src/core/resolvers/index.ts b/src/core/resolvers/index.ts index 71f30efa..c9f22856 100644 --- a/src/core/resolvers/index.ts +++ b/src/core/resolvers/index.ts @@ -16,3 +16,4 @@ export * from './quasar' export * from './devui' export * from './arco' export * from './tdesign' +export * from './layui-vue' diff --git a/src/core/resolvers/layui-vue.ts b/src/core/resolvers/layui-vue.ts new file mode 100644 index 00000000..27591cb3 --- /dev/null +++ b/src/core/resolvers/layui-vue.ts @@ -0,0 +1,170 @@ +import type { ComponentInfo, ComponentResolver, SideEffectsInfo } from '../../types' +import { camelCase } from '../utils' + +const matchComponents = [ + { + pattern: /^LayAvatarList$/, + styleDir: "avatar", + }, + { + pattern: /^LayBreadcrumbItem$/, + styleDir: "breadcrumb", + }, + { + pattern: /^(LayCarouselItem)$/, + styleDir: "carousel", + }, + { + pattern: /^(LayCheckboxGroup)$/, + styleDir: "checkbox", + }, + { + pattern: /^LayCol$/, + styleDir: "row", + }, + { + pattern: /^(LayCollapseItem)$/, + styleDir: "collapse", + }, + { + pattern: /^LayConfigProvider$/, + styleDir: undefined, + }, + { + pattern: /^LayCountUp$/, + styleDir: undefined, + }, + { + pattern: /^(LayDropdownMenu|LayDropdownMenuItem)$/, + styleDir: "dropdown", + }, + { + pattern: /^(LayFormItem)$/, + styleDir: "form", + }, + { + pattern: /^(LayMenuItem|LaySubMenu)$/, + styleDir: "menu", + }, + { + pattern: /^LaySelectOption$/, + styleDir: "select", + }, + { + pattern: /^LaySkeletonItem$/, + styleDir: "skeleton", + }, + { + pattern: /^LaySplitPanelItem$/, + styleDir: "splitPanel", + }, + { + pattern: /^LayStepItem$/, + styleDir: "step", + }, + { + pattern: /^(LayTabItem)$/, + styleDir: "tab", + }, + { + pattern: /^LayTimelineItem$/, + styleDir: "timeline", + }, +]; + +export interface LayuiVueResolverOptions { + /** + * import style along with components + * + * @default 'css' + */ + importStyle?: boolean | "css"; + + /** + * resolve `@layui/layui-vue' icons + * requires package `@layui/icons-vue` + * + * @default false + */ + resolveIcons?: boolean; + + /** + * exclude components that do not require automatic import + * + */ + exclude?: Array; +} + +const layuiRE: RegExp = /^Lay[A-Z]/ +const layerRE: RegExp = /^(layer|LayLayer)$/ +const iconsRE: RegExp = /^([A-Z][\w]+Icon|LayIcon)$/ +let libName: string = '@layui/layui-vue' + +function getSideEffects(importName: string, options: LayuiVueResolverOptions): SideEffectsInfo | undefined { + const { importStyle = "css" } = options + if (!importStyle) { + return undefined + } + if (libName != '@layui/layui-vue') { + return `${libName}/lib/index.css` + } + let styleDir: string | undefined = camelCase(importName.slice(3)); // LayBackTop -> backTop + for (const item of matchComponents) { + if (item.pattern.test(importName)) { + styleDir = item.styleDir + break + } + } + if (importStyle === 'css' || importStyle) { + return styleDir + ? [`@layui/layui-vue/es/${styleDir}/index.css`, `@layui/layui-vue/es/index/index.css`] + : undefined + } +} + +function resolveComponent(importName: string, options: LayuiVueResolverOptions): ComponentInfo | undefined { + let name: string | undefined = undefined + + if (options.exclude && isExclude(importName, options.exclude)) { + return undefined + } + if (options.resolveIcons && importName.match(iconsRE)) { + name = importName + libName = '@layui/icons-vue' + } else if (importName.match(layerRE)) { + name = importName + libName = '@layui/layer-vue' + } else if (importName.match(layuiRE)) { + name = importName + libName = '@layui/layui-vue' + } + return name + ? { name, from: libName, sideEffects: getSideEffects(name, options) } + : undefined +} + +function isExclude(name: string, exclude: Array): boolean { + for (const item of exclude) { + if (name === item || name.match(item)) { + return true + } + } + return false +} + +/** + * Resolver for layui-vue + * + * @link http://www.layui-vue.com/ for layui-vue + * + */ +export function LayuiVueResolver( + options: LayuiVueResolverOptions = {} +): ComponentResolver { + return { + type: "component", + resolve: (name: string) => { + return resolveComponent(name, options) + }, + } +} \ No newline at end of file From cf8e042c7bf7ed1bca6a76d31222e134cc5ebea7 Mon Sep 17 00:00:00 2001 From: sight <1453017105@qq.com> Date: Wed, 27 Apr 2022 20:51:01 +0800 Subject: [PATCH 2/2] fix: fix lint --- src/core/resolvers/layui-vue.ts | 87 +++++++++++++++++---------------- 1 file changed, 44 insertions(+), 43 deletions(-) diff --git a/src/core/resolvers/layui-vue.ts b/src/core/resolvers/layui-vue.ts index 27591cb3..56fc60ab 100644 --- a/src/core/resolvers/layui-vue.ts +++ b/src/core/resolvers/layui-vue.ts @@ -4,27 +4,27 @@ import { camelCase } from '../utils' const matchComponents = [ { pattern: /^LayAvatarList$/, - styleDir: "avatar", + styleDir: 'avatar', }, { pattern: /^LayBreadcrumbItem$/, - styleDir: "breadcrumb", + styleDir: 'breadcrumb', }, { pattern: /^(LayCarouselItem)$/, - styleDir: "carousel", + styleDir: 'carousel', }, { pattern: /^(LayCheckboxGroup)$/, - styleDir: "checkbox", + styleDir: 'checkbox', }, { pattern: /^LayCol$/, - styleDir: "row", + styleDir: 'row', }, { pattern: /^(LayCollapseItem)$/, - styleDir: "collapse", + styleDir: 'collapse', }, { pattern: /^LayConfigProvider$/, @@ -36,41 +36,41 @@ const matchComponents = [ }, { pattern: /^(LayDropdownMenu|LayDropdownMenuItem)$/, - styleDir: "dropdown", + styleDir: 'dropdown', }, { pattern: /^(LayFormItem)$/, - styleDir: "form", + styleDir: 'form', }, { pattern: /^(LayMenuItem|LaySubMenu)$/, - styleDir: "menu", + styleDir: 'menu', }, { pattern: /^LaySelectOption$/, - styleDir: "select", + styleDir: 'select', }, { pattern: /^LaySkeletonItem$/, - styleDir: "skeleton", + styleDir: 'skeleton', }, { pattern: /^LaySplitPanelItem$/, - styleDir: "splitPanel", + styleDir: 'splitPanel', }, { pattern: /^LayStepItem$/, - styleDir: "step", + styleDir: 'step', }, { pattern: /^(LayTabItem)$/, - styleDir: "tab", + styleDir: 'tab', }, { pattern: /^LayTimelineItem$/, - styleDir: "timeline", + styleDir: 'timeline', }, -]; +] export interface LayuiVueResolverOptions { /** @@ -78,37 +78,37 @@ export interface LayuiVueResolverOptions { * * @default 'css' */ - importStyle?: boolean | "css"; + importStyle?: boolean | 'css' /** - * resolve `@layui/layui-vue' icons + * resolve '@layui/layui-vue' icons * requires package `@layui/icons-vue` * * @default false */ - resolveIcons?: boolean; + resolveIcons?: boolean /** * exclude components that do not require automatic import * */ - exclude?: Array; + exclude?: Array } -const layuiRE: RegExp = /^Lay[A-Z]/ -const layerRE: RegExp = /^(layer|LayLayer)$/ -const iconsRE: RegExp = /^([A-Z][\w]+Icon|LayIcon)$/ -let libName: string = '@layui/layui-vue' +const layuiRE = /^Lay[A-Z]/ +const layerRE = /^(layer|LayLayer)$/ +const iconsRE = /^([A-Z][\w]+Icon|LayIcon)$/ +let libName = '@layui/layui-vue' function getSideEffects(importName: string, options: LayuiVueResolverOptions): SideEffectsInfo | undefined { - const { importStyle = "css" } = options - if (!importStyle) { + const { importStyle = 'css' } = options + if (!importStyle) return undefined - } - if (libName != '@layui/layui-vue') { + + if (libName !== '@layui/layui-vue') return `${libName}/lib/index.css` - } - let styleDir: string | undefined = camelCase(importName.slice(3)); // LayBackTop -> backTop + + let styleDir: string | undefined = camelCase(importName.slice(3)) // LayBackTop -> backTop for (const item of matchComponents) { if (item.pattern.test(importName)) { styleDir = item.styleDir @@ -117,24 +117,26 @@ function getSideEffects(importName: string, options: LayuiVueResolverOptions): S } if (importStyle === 'css' || importStyle) { return styleDir - ? [`@layui/layui-vue/es/${styleDir}/index.css`, `@layui/layui-vue/es/index/index.css`] + ? [`@layui/layui-vue/es/${styleDir}/index.css`, '@layui/layui-vue/es/index/index.css'] : undefined } } -function resolveComponent(importName: string, options: LayuiVueResolverOptions): ComponentInfo | undefined { - let name: string | undefined = undefined +function resolveComponent(importName: string, options: LayuiVueResolverOptions): ComponentInfo | undefined { + let name: string | undefined - if (options.exclude && isExclude(importName, options.exclude)) { + if (options.exclude && isExclude(importName, options.exclude)) return undefined - } + if (options.resolveIcons && importName.match(iconsRE)) { name = importName libName = '@layui/icons-vue' - } else if (importName.match(layerRE)) { + } + else if (importName.match(layerRE)) { name = importName libName = '@layui/layer-vue' - } else if (importName.match(layuiRE)) { + } + else if (importName.match(layuiRE)) { name = importName libName = '@layui/layui-vue' } @@ -145,26 +147,25 @@ function resolveComponent(importName: string, options: LayuiVueResolverOptions): function isExclude(name: string, exclude: Array): boolean { for (const item of exclude) { - if (name === item || name.match(item)) { + if (name === item || name.match(item)) return true - } } return false } /** * Resolver for layui-vue - * + * * @link http://www.layui-vue.com/ for layui-vue * */ export function LayuiVueResolver( - options: LayuiVueResolverOptions = {} + options: LayuiVueResolverOptions = {}, ): ComponentResolver { return { - type: "component", + type: 'component', resolve: (name: string) => { return resolveComponent(name, options) }, } -} \ No newline at end of file +} pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy