/// import { extname, relative, resolve } from 'path' import { fileURLToPath } from 'node:url' import { glob } from 'glob' import { defineConfig } from 'vite' import react from '@vitejs/plugin-react' import dts from 'vite-plugin-dts' import { libInjectCss } from 'vite-plugin-lib-inject-css' import libAssetsPlugin from '@laynezh/vite-plugin-lib-assets' import ensureDirectives from './plugins/rollup-plugin-ensure-directives' import fs from 'node:fs' // https://vitejs.dev/config/ export default defineConfig({ plugins: [ react(), libInjectCss(), dts({ include: ['lib'], exclude: ['node_modules', '**/*.test.ts', '**/*.stories.tsx'], rollupTypes: true, bundledPackages: ['class-variance-authority', 'clsx'], }), libAssetsPlugin({ name: '[name].[contenthash:8].[ext]', limit: 1024 * 1, }), ], build: { copyPublicDir: false, lib: { entry: [ resolve(__dirname, 'lib/new.ts'), resolve(__dirname, 'lib/current.ts'), ], formats: ['es'], }, rollupOptions: { plugins: [ensureDirectives()], external: [ 'react', 'react-dom', 'react/jsx-runtime', 'react-aria-components', ], onwarn(warning, defaultHandler) { if ( warning.code === 'MODULE_LEVEL_DIRECTIVE' && warning.message.includes('use client') ) { return } // When using the directive 'use client' in components, rollup throws an error. // See: https://github.com/vitejs/vite/issues/15012#issuecomment-1815854072 // We ignore sourcemap_error on the first character for component files // to be caused by the 'use client' directive if ( warning.code === 'SOURCEMAP_ERROR' && warning.loc?.file && warning.loc.line === 1 && warning.loc.column === 0 ) { if (fs.statSync(warning.loc.file)) { const file = fs.readFileSync(warning.loc.file, { encoding: 'utf-8', }) const lines = file.split('\n') if (lines[0] === "'use client'") { return } } } defaultHandler(warning) }, input: Object.fromEntries( glob .sync( [ 'lib/new.ts', 'lib/current.ts', 'lib/style-new.css', 'lib/style-current.css', 'lib/components/**/*.{ts,tsx}', ], { ignore: '**/*.stories.{ts,tsx}', }, ) .map((file) => { return [ // The name of the entry point // lib/nested/foo.ts becomes nested/foo relative( 'lib', file.slice(0, file.length - extname(file).length), ), // The absolute path to the entry file // lib/nested/foo.ts becomes /project/lib/nested/foo.ts fileURLToPath(new URL(file, import.meta.url)), ] }), ), output: { assetFileNames: 'assets/[name][extname]', entryFileNames: '[name].js', }, }, }, server: { open: './example/index.html', }, })