You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
188 lines
3.3 KiB
TypeScript
188 lines
3.3 KiB
TypeScript
import type { ComponentResolver, SideEffectsInfo } from 'unplugin-vue-components'
|
|
|
|
const components = [
|
|
// Form
|
|
'AutoComplete',
|
|
'Calendar',
|
|
'CascadeSelect',
|
|
'Checkbox',
|
|
'Chips',
|
|
'ColorPicker',
|
|
'Dropdown',
|
|
'Editor',
|
|
'FloatLabel',
|
|
'IconField',
|
|
'InputGroup',
|
|
'InputMask',
|
|
'InputNumber',
|
|
'InputOtp',
|
|
'InputSwitch',
|
|
'InputText',
|
|
'Knob',
|
|
'Listbox',
|
|
'MultiSelect',
|
|
'Password',
|
|
'RadioButton',
|
|
'Rating',
|
|
'SelectButton',
|
|
'Slider',
|
|
'Textarea',
|
|
'ToggleButton',
|
|
'TreeSelect',
|
|
|
|
// Button
|
|
'Button',
|
|
'SpeedDial',
|
|
'SplitButton',
|
|
|
|
// Data
|
|
'DataTable',
|
|
'DataView',
|
|
'OrderList',
|
|
'OrgChart',
|
|
'Paginator',
|
|
'PickList',
|
|
'Tree',
|
|
'TreeTable',
|
|
'Timeline',
|
|
'VirtualScroller',
|
|
|
|
// Panel
|
|
'Accordion',
|
|
'Card',
|
|
'Deferred',
|
|
'Divider',
|
|
'Fieldset',
|
|
'Panel',
|
|
'ScrollPanel',
|
|
'Splitter',
|
|
'Stepper',
|
|
'TabView',
|
|
'TabPanel',
|
|
'Toolbar',
|
|
|
|
// Overlay
|
|
'ConfirmDialog',
|
|
'ConfirmPopup',
|
|
'DynamicDialog',
|
|
'Tooltip', // need to add directive
|
|
// must be registered globally in order for the XXX service to work properly
|
|
'OverlayPanel',
|
|
'Sidebar',
|
|
|
|
// File
|
|
'FileUpload',
|
|
|
|
// Menu
|
|
'Breadcrumb',
|
|
'ContextMenu',
|
|
'Dock',
|
|
'Menu',
|
|
'Menubar',
|
|
'MegaMenu',
|
|
'PanelMenu',
|
|
'Steps',
|
|
'TabMenu',
|
|
'TieredMenu',
|
|
|
|
// Messages
|
|
'Toast',
|
|
// Toast must be registered globally in order for the XXX service to work properly
|
|
'Message',
|
|
'InlineMessage',
|
|
|
|
// Media
|
|
'Carousel',
|
|
'Galleria',
|
|
'Image',
|
|
|
|
// Misc
|
|
'Avatar',
|
|
'Badge',
|
|
'BlockUI',
|
|
'Chip',
|
|
'FocusTrap',
|
|
'Inplace',
|
|
'MeterGroup',
|
|
'ScrollTop',
|
|
'Skeleton',
|
|
'ProgressBar',
|
|
'ProgressSpinner',
|
|
'AnimateOnScroll',
|
|
'Ripple',
|
|
'StyleClass',
|
|
'Tag',
|
|
'Terminal',
|
|
]
|
|
|
|
export interface PrimeVueResolverOptions {
|
|
/**
|
|
* import style along with components
|
|
*
|
|
* @default true
|
|
*/
|
|
importStyle?: boolean
|
|
/**
|
|
* import `primeicons' icons
|
|
*
|
|
* requires package `primeicons`
|
|
*
|
|
* @default true
|
|
*/
|
|
importIcons?: boolean
|
|
/**
|
|
* imports a free theme - set theme name here (e.g. saga-blue)
|
|
*
|
|
* @default ''
|
|
*/
|
|
importTheme?: string
|
|
/**
|
|
* prefix for components (e.g. 'P' to resolve Menu from PMenu)
|
|
*
|
|
* @default ''
|
|
*/
|
|
prefix?: string
|
|
}
|
|
|
|
/**
|
|
* Resolver for PrimeVue - If you're using a component with the same tag as an native HTML element (e.g. button) the component must be in uppercase
|
|
*
|
|
* @link https://github.com/primefaces/primevue
|
|
*/
|
|
export function PrimeVueResolver(options: PrimeVueResolverOptions = {}): ComponentResolver {
|
|
return {
|
|
type: 'component',
|
|
resolve: (name: string) => {
|
|
const sideEffects: SideEffectsInfo = []
|
|
|
|
if (options.importStyle) {
|
|
sideEffects.push('primevue/resources/primevue.min.css')
|
|
}
|
|
|
|
if (options.importIcons) {
|
|
sideEffects.push('primeicons/primeicons.css')
|
|
}
|
|
|
|
if (options.importTheme) {
|
|
sideEffects.push(
|
|
`primevue/resources/themes/${options.importTheme}/theme.css`,
|
|
)
|
|
}
|
|
|
|
if (options.prefix) {
|
|
if (!name.startsWith(options.prefix)) {
|
|
return
|
|
}
|
|
name = name.substring(options.prefix.length)
|
|
}
|
|
|
|
if (components.includes(name)) {
|
|
return {
|
|
from: `primevue/${name.toLowerCase()}`,
|
|
sideEffects,
|
|
}
|
|
}
|
|
},
|
|
}
|
|
}
|