import alias from '@rollup/plugin-alias'; import { babel } from '@rollup/plugin-babel'; import terser from '@rollup/plugin-terser'; import postcss from 'rollup-plugin-postcss'; import vue from 'rollup-plugin-vue'; import fs from 'fs-extra'; import path from 'path'; import viteConfig, { THEME_PRESETS } from './nuxt-vite.config.js'; import pkg from './package.json'; // globals const GLOBALS = { vue: 'Vue' }; // externals const GLOBAL_EXTERNALS = ['vue', 'chart.js/auto', 'quill']; const INLINE_EXTERNALS = Object.keys(viteConfig.resolve.alias); const EXTERNALS = [...GLOBAL_EXTERNALS, ...INLINE_EXTERNALS]; // alias const ALIAS_ENTRIES = Object.entries(viteConfig.resolve.alias).map(([key, value]) => ({ find: key, replacement: value })); // plugins const BABEL_PLUGIN_OPTIONS = { extensions: ['.js', '.vue'], exclude: 'node_modules/**', presets: ['@babel/preset-env'], plugins: [], skipPreflightCheck: true, babelHelpers: 'runtime', babelrc: false }; const ALIAS_PLUGIN_OPTIONS = { entries: ALIAS_ENTRIES }; const POSTCSS_PLUGIN_OPTIONS = { sourceMap: false }; const TERSER_PLUGIN_OPTIONS = { compress: { keep_infinity: true, pure_getters: true, reduce_funcs: true }, mangle: { reserved: ['theme', 'css'] } }; const PLUGINS = [vue(), postcss(POSTCSS_PLUGIN_OPTIONS), babel(BABEL_PLUGIN_OPTIONS)]; const ENTRY = { entries: [], onwarn(warning) { if (warning.code === 'CIRCULAR_DEPENDENCY') { //console.error(`(!) ${warning.message}`); return; } }, format: { cjs_es(options) { return ENTRY.format.cjs(options).es(options); }, cjs({ input, output, minify }) { ENTRY.entries.push({ onwarn: ENTRY.onwarn, input, plugins: [...PLUGINS, minify && terser(TERSER_PLUGIN_OPTIONS)], external: EXTERNALS, inlineDynamicImports: true, output: [ { format: 'cjs', file: `${output}${minify ? '.min' : ''}.cjs`, sourcemap: true, exports: 'auto' } ] }); return ENTRY.format; }, es({ input, output, minify }) { ENTRY.entries.push({ onwarn: ENTRY.onwarn, input, plugins: [...PLUGINS, minify && terser(TERSER_PLUGIN_OPTIONS)], external: EXTERNALS, inlineDynamicImports: true, output: [ { format: 'es', file: `${output}${minify ? '.min' : ''}.mjs`, sourcemap: true, exports: 'auto' } ] }); return ENTRY.format; }, umd({ name, input, output, minify }) { ENTRY.entries.push({ onwarn: ENTRY.onwarn, input, plugins: [alias(ALIAS_PLUGIN_OPTIONS), ...PLUGINS, minify && terser(TERSER_PLUGIN_OPTIONS)], external: GLOBAL_EXTERNALS, inlineDynamicImports: true, output: [ { format: 'umd', name: name ?? 'PrimeVue', file: `${output}${minify ? '.min' : ''}.js`, globals: GLOBALS, exports: 'auto' } ] }); return ENTRY.format; } } }; function addFile() { fs.readdirSync(path.resolve(__dirname, process.env.INPUT_DIR), { withFileTypes: true }) .filter((dir) => dir.isDirectory()) .forEach(({ name: folderName }) => { fs.readdirSync(path.resolve(__dirname, process.env.INPUT_DIR + folderName)).forEach((file) => { let name = file.split(/(.vue)$|(.js)$/)[0].toLowerCase(); if (name === folderName) { const input = process.env.INPUT_DIR + folderName + '/' + file; const output = process.env.OUTPUT_DIR + folderName + '/' + name; ENTRY.format.es({ input, output }); } }); }); } function addIcon() { const iconDir = path.resolve(__dirname, process.env.INPUT_DIR + 'icons'); fs.readdirSync(path.resolve(__dirname, iconDir), { withFileTypes: true }) .filter((dir) => dir.isDirectory()) .forEach(({ name: folderName }) => { fs.readdirSync(path.resolve(__dirname, iconDir + '/' + folderName)).forEach((file) => { if (/\.vue$/.test(file)) { const name = file.split(/(.vue)$/)[0].toLowerCase(); const input = process.env.INPUT_DIR + 'icons/' + folderName + '/' + file; const output = process.env.OUTPUT_DIR + 'icons/' + folderName + '/' + name; ENTRY.format.es({ input, output }); } }); }); } function addStyle() { fs.readdirSync(path.resolve(__dirname, process.env.INPUT_DIR), { withFileTypes: true }) .filter((dir) => dir.isDirectory()) .forEach(({ name: folderName }) => { try { fs.readdirSync(path.resolve(__dirname, process.env.INPUT_DIR + folderName + '/style')).forEach((file) => { if (/\.js$/.test(file)) { const name = file.split(/(.js)$/)[0].toLowerCase(); const input = process.env.INPUT_DIR + folderName + '/style/' + file; const output = process.env.OUTPUT_DIR + folderName + '/style/' + name; ENTRY.format.es({ input, output }); } }); } catch {} }); } function traverseDir(dir, condition, callback) { try { const files = fs.readdirSync(dir); files.forEach((file) => { const filePath = path.join(dir, file); const fileStat = fs.statSync(filePath); if (fileStat.isDirectory()) { traverseDir(filePath, condition, callback); } else if (condition?.(file) && fileStat.isFile()) { callback?.(file, filePath, dir); } }); } catch {} } function addThemes() { traverseDir( path.resolve(__dirname, process.env.INPUT_DIR + 'themes'), (file) => file === 'index.js', (file, filePath, folderPath) => { const searchFolder = '/' + process.env.INPUT_DIR; const folderName = folderPath.substring(folderPath.indexOf(searchFolder) + searchFolder.length); const input = process.env.INPUT_DIR + folderName + '/' + file; const output = process.env.OUTPUT_DIR + folderName + '/' + 'index'; ENTRY.format.es({ input, output }); } ); } function addCore() { ENTRY.format.es({ input: process.env.INPUT_DIR + 'config/PrimeVue.js', output: process.env.OUTPUT_DIR + 'config/config' }); ENTRY.format.es({ input: process.env.INPUT_DIR + 'service/PrimeVueService.js', output: process.env.OUTPUT_DIR + 'service/primevueservice' }); } function addPassThrough() { ENTRY.format.es({ input: process.env.INPUT_DIR + 'passthrough/index.js', output: process.env.OUTPUT_DIR + 'passthrough/index' }); } function addLibrary() { THEME_PRESETS?.forEach((preset) => { ENTRY.format.umd({ name: `PrimeVue.Themes.${preset[0].toUpperCase() + preset.slice(1)}`, input: process.env.INPUT_DIR + `themes/${preset}/index.js`, output: process.env.OUTPUT_DIR + `umd/themes/${preset}`, minify: true }); }); ENTRY.format.umd({ name: 'PrimeVue', input: process.env.INPUT_DIR + 'primevue.js', output: process.env.OUTPUT_DIR + 'umd/primevue', minify: true }); } function addPackageJson() { const outputDir = path.resolve(__dirname, process.env.OUTPUT_DIR); const packageJson = `{ "name": "primevue", "version": "${pkg.version}", "private": "false", "author": "PrimeTek Informatics", "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 370+ ready to use UI blocks to build spectacular applications in no time.", "homepage": "https://primevue.org/", "repository": { "type": "git", "url": "https://github.com/primefaces/primevue.git" }, "license": "MIT", "bugs": { "url": "https://github.com/primefaces/primevue/issues" }, "keywords": [ "primevue", "vue", "vue.js", "vue2", "vue3", "ui library", "component library", "material", "bootstrap", "fluent", "tailwind", "unstyled", "passthrough" ], "unpkg": "umd/primevue.min.js", "jsdelivr": "umd/primevue.min.js", "web-types": "./web-types.json", "vetur": { "tags": "./vetur-tags.json", "attributes": "./vetur-attributes.json" }, "sideEffects": [ "*.vue" ], "peerDependencies": { "vue": "^3.0.0" }, "engines": { "node": ">=12.11.0" } }`; !fs.existsSync(outputDir) && fs.mkdirSync(outputDir); fs.writeFileSync(path.resolve(outputDir, 'package.json'), packageJson); } addCore(); addStyle(); addThemes(); addIcon(); addFile(); addPassThrough(); addLibrary(); addPackageJson(); export default ENTRY.entries;