import pkg from '../../../package.json'; import { services } from './services'; const PrimeVue = { version: '^3.31.0', description: 'PrimeVue is an open source UI library for Vue featuring a rich set of 80+ components, a theme designer, various theme alternatives such as Material, Bootstrap, Tailwind, premium templates and professional support. In addition, it integrates with PrimeBlock, which has 400+ ready to use UI blocks to build spectacular applications in no time.' }; const app_dependencies = pkg ? pkg.devDependencies : {}; const core_dependencies = { vue: '^3.2.45', 'vue-router': '^4.1.6', '@vitejs/plugin-vue': '^4.0.0', vite: '^4.0.0', primevue: PrimeVue.version || 'latest', primeicons: app_dependencies['primeicons'] || 'latest' }; // create-vue -> https://github.com/vuejs/create-vue const getVueApp = (props = {}, sourceType) => { const path = 'src/'; const { code: sources, title = 'primevue_demo', description = '', service, extPages, dependencies: deps, component, extFiles, embedded } = props; const dependencies = { ...core_dependencies, ...deps }; const fileExtension = '.vue'; const mainFileName = 'App'; const sourceFileName = `${path}${mainFileName}${fileExtension}`; let element = '', imports = '', unstyled = '', pvTheme = '', routeFiles = {}; sources.routeFiles && Object.entries(sources.routeFiles).forEach(([key, value]) => { routeFiles[`${path + key}`] = { content: value }; }); let extFilesSource = extFiles ? extFiles[sourceType.language] ? { ...extFiles[sourceType.language] } : Object.keys(extFiles) .filter((k) => !sourceTypes.includes(k)) .reduce((result, current) => (result[current] = extFiles[current]) && result, {}) : {}; if (deps !== null && component !== null) { imports += `import ${component} from 'primevue/${component.toLowerCase()}';`; element += `app.component('${component}', ${component});`; } if (embedded) { unstyled += `, unstyled: true, pt: Tailwind`; imports += `import Tailwind from 'primevue/tailwind';`; dependencies['tailwindcss'] = '^3.3.2'; dependencies['postcss'] = '^8.4.27'; dependencies['autoprefixer'] = '^10.4.14'; } else { pvTheme += `import "primeflex/primeflex.css"; import "primevue/resources/themes/lara-light-blue/theme.css";`; dependencies['primeflex'] = app_dependencies['primeflex'] || 'latest'; } const files = { 'package.json': { content: { name: title.toLowerCase().replaceAll(' ', '_'), description: `**${description}** ${PrimeVue.description}`, keywords: [], scripts: { dev: 'vite', build: 'vite build', preview: 'vite preview' }, dependencies, main: 'src/App.vue' } }, 'vite.config.js': { content: `import { fileURLToPath, URL } from 'node:url'; import { defineConfig } from 'vite'; import vue from '@vitejs/plugin-vue'; // https://vitejs.dev/config/ export default defineConfig({ plugins: [vue()], resolve: { alias: { '@': fileURLToPath(new URL('./src', import.meta.url)) } } });` }, 'index.html': { content: ` PrimeVue App
` }, [`${path}main.js`]: { content: `${pvTheme} import "primevue/resources/primevue.min.css"; /* Deprecated */ import "primeicons/primeicons.css"; import "./style.css"; import "./flags.css"; import { createApp } from "vue"; import App from "./App.vue"; import { router } from "./router"; import PrimeVue from "primevue/config"; import AutoComplete from 'primevue/autocomplete'; import Accordion from 'primevue/accordion'; import AccordionTab from 'primevue/accordiontab'; import Avatar from 'primevue/avatar'; import AvatarGroup from 'primevue/avatargroup'; import Badge from 'primevue/badge'; import BadgeDirective from "primevue/badgedirective"; import BlockUI from 'primevue/blockui'; import Button from 'primevue/button'; import Breadcrumb from 'primevue/breadcrumb'; import Calendar from 'primevue/calendar'; import Card from 'primevue/card'; import CascadeSelect from 'primevue/cascadeselect'; import Carousel from 'primevue/carousel'; import Checkbox from 'primevue/checkbox'; import Chip from 'primevue/chip'; import Chips from 'primevue/chips'; import ColorPicker from 'primevue/colorpicker'; import Column from 'primevue/column'; import ColumnGroup from 'primevue/columngroup'; import ConfirmDialog from 'primevue/confirmdialog'; import ConfirmPopup from 'primevue/confirmpopup'; import ConfirmationService from 'primevue/confirmationservice'; import ContextMenu from 'primevue/contextmenu'; import DataTable from 'primevue/datatable'; import DataView from 'primevue/dataview'; import DataViewLayoutOptions from 'primevue/dataviewlayoutoptions'; import DeferredContent from 'primevue/deferredcontent'; import Dialog from 'primevue/dialog'; import DialogService from 'primevue/dialogservice' import Divider from 'primevue/divider'; import Dock from 'primevue/dock'; import Dropdown from 'primevue/dropdown'; import DynamicDialog from 'primevue/dynamicdialog'; import Fieldset from 'primevue/fieldset'; import FileUpload from 'primevue/fileupload'; import FocusTrap from 'primevue/focustrap'; import Galleria from 'primevue/galleria'; import Image from 'primevue/image'; import InlineMessage from 'primevue/inlinemessage'; import Inplace from 'primevue/inplace'; import InputSwitch from 'primevue/inputswitch'; import InputText from 'primevue/inputtext'; import InputMask from 'primevue/inputmask'; import InputNumber from 'primevue/inputnumber'; import Knob from 'primevue/knob'; import Listbox from 'primevue/listbox'; import MegaMenu from 'primevue/megamenu'; import Menu from 'primevue/menu'; import Menubar from 'primevue/menubar'; import Message from 'primevue/message'; import MultiSelect from 'primevue/multiselect'; import OrderList from 'primevue/orderlist'; import OrganizationChart from 'primevue/organizationchart'; import OverlayPanel from 'primevue/overlaypanel'; import Paginator from 'primevue/paginator'; import Panel from 'primevue/panel'; import PanelMenu from 'primevue/panelmenu'; import Password from 'primevue/password'; import PickList from 'primevue/picklist'; import ProgressBar from 'primevue/progressbar'; import ProgressSpinner from 'primevue/progressspinner'; import Rating from 'primevue/rating'; import RadioButton from 'primevue/radiobutton'; import Ripple from 'primevue/ripple'; import Row from 'primevue/row'; import SelectButton from 'primevue/selectbutton'; import ScrollPanel from 'primevue/scrollpanel'; import ScrollTop from 'primevue/scrolltop'; import Skeleton from 'primevue/skeleton'; import Slider from 'primevue/slider'; import Sidebar from 'primevue/sidebar'; import SpeedDial from 'primevue/speeddial'; import SplitButton from 'primevue/splitbutton'; import Splitter from 'primevue/splitter'; import SplitterPanel from 'primevue/splitterpanel'; import Steps from 'primevue/steps'; import StyleClass from 'primevue/styleclass'; import TabMenu from 'primevue/tabmenu'; import TieredMenu from 'primevue/tieredmenu'; import Textarea from 'primevue/textarea'; import Toast from 'primevue/toast'; import ToastService from 'primevue/toastservice'; import Toolbar from 'primevue/toolbar'; import TabView from 'primevue/tabview'; import TabPanel from 'primevue/tabpanel'; import Tag from 'primevue/tag'; import Terminal from 'primevue/terminal'; import Timeline from 'primevue/timeline'; import ToggleButton from 'primevue/togglebutton'; import Tooltip from 'primevue/tooltip'; import Tree from 'primevue/tree'; import TreeSelect from 'primevue/treeselect'; import TreeTable from 'primevue/treetable'; import TriStateCheckbox from 'primevue/tristatecheckbox'; import VirtualScroller from 'primevue/virtualscroller'; ${imports} const app = createApp(App); app.use(PrimeVue, { ripple: true ${unstyled} }); app.use(ConfirmationService); app.use(ToastService); app.use(DialogService); app.use(router); app.directive('tooltip', Tooltip); app.directive('badge', BadgeDirective); app.directive('ripple', Ripple); app.directive('styleclass', StyleClass); app.directive('focustrap', FocusTrap); app.component('Accordion', Accordion); app.component('AccordionTab', AccordionTab); app.component('AutoComplete', AutoComplete); app.component('Avatar', Avatar); app.component('AvatarGroup', AvatarGroup); app.component('Badge', Badge); app.component('BlockUI', BlockUI); app.component('Breadcrumb', Breadcrumb); app.component('Button', Button); app.component('Calendar', Calendar); app.component('Card', Card); app.component('Carousel', Carousel); app.component('CascadeSelect', CascadeSelect); app.component('Checkbox', Checkbox); app.component('Chip', Chip); app.component('Chips', Chips); app.component('ColorPicker', ColorPicker); app.component('Column', Column); app.component('ColumnGroup', ColumnGroup); app.component('ConfirmDialog', ConfirmDialog); app.component('ConfirmPopup', ConfirmPopup); app.component('ContextMenu', ContextMenu); app.component('DataTable', DataTable); app.component('DataView', DataView); app.component('DataViewLayoutOptions', DataViewLayoutOptions); app.component('DeferredContent', DeferredContent); app.component('Dialog', Dialog); app.component('Divider', Divider); app.component('Dock', Dock); app.component('Dropdown', Dropdown); app.component('DynamicDialog', DynamicDialog); app.component('Fieldset', Fieldset); app.component('FileUpload', FileUpload); app.component('Galleria', Galleria); app.component('Image', Image); app.component('InlineMessage', InlineMessage); app.component('Inplace', Inplace); app.component('InputMask', InputMask); app.component('InputNumber', InputNumber); app.component('InputSwitch', InputSwitch); app.component('InputText', InputText); app.component('Knob', Knob); app.component('Listbox', Listbox); app.component('MegaMenu', MegaMenu); app.component('Menu', Menu); app.component('Menubar', Menubar); app.component('Message', Message); app.component('MultiSelect', MultiSelect); app.component('OrderList', OrderList); app.component('OrganizationChart', OrganizationChart); app.component('OverlayPanel', OverlayPanel); app.component('Paginator', Paginator); app.component('Panel', Panel); app.component('PanelMenu', PanelMenu); app.component('Password', Password); app.component('PickList', PickList); app.component('ProgressBar', ProgressBar); app.component('ProgressSpinner', ProgressSpinner); app.component('RadioButton', RadioButton); app.component('Rating', Rating); app.component('Row', Row); app.component('SelectButton', SelectButton); app.component('ScrollPanel', ScrollPanel); app.component('ScrollTop', ScrollTop); app.component('Slider', Slider); app.component('Sidebar', Sidebar); app.component('Skeleton', Skeleton); app.component('SpeedDial', SpeedDial); app.component('SplitButton', SplitButton); app.component('Splitter', Splitter); app.component('SplitterPanel', SplitterPanel); app.component('Steps', Steps); app.component('TabMenu', TabMenu); app.component('TabView', TabView); app.component('TabPanel', TabPanel); app.component('Tag', Tag); app.component('Textarea', Textarea); app.component('Terminal', Terminal); app.component('TieredMenu', TieredMenu); app.component('Timeline', Timeline); app.component('Toast', Toast); app.component('Toolbar', Toolbar); app.component('ToggleButton', ToggleButton); app.component('Tree', Tree); app.component('TreeSelect', TreeSelect); app.component('TreeTable', TreeTable); app.component('TriStateCheckbox', TriStateCheckbox); app.component('VirtualScroller', VirtualScroller); ${element} app.mount("#app"); ` }, [`${path}style.css`]: { content: embedded ? tailwindConfig : staticStyles.global }, [`${path}flags.css`]: { content: staticStyles.flags }, [`${path}router.js`]: { content: `import { createRouter, createWebHistory } from "vue-router"; import ${mainFileName} from "./${mainFileName}${fileExtension}"; export const router = createRouter({ history: createWebHistory(), routes: [{ path: "/", component: ${mainFileName} }] });` }, [`${sourceFileName}`]: { content: sources }, 'public/logo.svg': { content: ` head Created with Sketch. ` }, ...routeFiles, ...extFilesSource }; if (extPages && extPages.length >= 1) { let routePaths = ''; let viewImports = ''; extPages.forEach((page, index) => { let compPath = page.tabName.replace('Demo', '').toLowerCase(); routePaths += `{ path: "/${index === 0 ? '' : compPath}", component: ${page.tabName} },\n`; viewImports += `import ${page.tabName} from "./components/${page.tabName}${fileExtension}";\n`; files[`${path}components/${page.tabName}${fileExtension}`] = { content: page.content }; }); files[`${path}router.js`] = { content: `import { createRouter, createWebHistory } from "vue-router"; ${viewImports} export const router = createRouter({ history: createWebHistory(), routes: [ ${routePaths}] });` }; } if (service) { service.forEach((name) => { files[`${path}service/${name}.js`] = { content: services[name] }; }); } if (embedded) { files['tailwind.config.js'] = { content: `/** @type {import('tailwindcss').Config} */ export default { content: [ "./index.html", "./src/**/*.{vue,js,ts,jsx,tsx}" ], theme: { extend: {} }, plugins: [] }` }; files['postcss.config.js'] = { content: `module.exports = { plugins: { tailwindcss: {}, autoprefixer: {} } }` }; } return { files, dependencies, sourceFileName }; }; const staticStyles = { global: `html { font-size: 14px; } body { font-family: var(--font-family); font-weight: normal; background: var(--surface-ground); color: var(--text-color); padding: 1rem; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } .card { background: var(--surface-card); padding: 2rem; border-radius: 10px; margin-bottom: 1rem; } ` }; const tailwindConfig = `@tailwind base; @tailwind components; @tailwind utilities; `; export { getVueApp };