Files
php-flasher/rollup/targets.js
T

164 lines
5.7 KiB
JavaScript

/**
* @description Specialized build targets
* Contains configurations for specific build targets
*/
import path from 'node:path'
import { glob } from 'glob'
import { defineConfig } from 'rollup'
import resolve from '@rollup/plugin-node-resolve'
import typescript from '@rollup/plugin-typescript'
import copy from 'rollup-plugin-copy'
import terser from '@rollup/plugin-terser'
import { CONFIG } from './config.js'
import {
createThemePlugins,
} from './plugins.js'
/**
* Build configuration for the Prime plugin module
* @returns {object} Rollup configuration
*/
export function buildPrimePlugin() {
const primePath = CONFIG.paths.prime
const filename = `${primePath}/dist/plugin`
return defineConfig({
input: `${primePath}/assets/plugin.ts`,
plugins: [
resolve(),
typescript({
compilerOptions: {
outDir: `${primePath}/dist`,
},
include: [`${primePath}/assets/**/*.ts`],
}),
],
output: [
{
format: CONFIG.formats.ESM,
file: `${filename}.js`,
banner: CONFIG.build.banner,
},
],
})
}
/**
* Build configurations for all available themes
* @returns {Array<object>} Theme build configurations
*/
export function buildThemesConfigurations() {
// Find all theme entry points but exclude the main themes index
const themeFiles = glob.sync(`${CONFIG.paths.themes}/**/index.ts`)
.filter((file) => file !== `${CONFIG.paths.themes}/index.ts`)
// Create a configuration for each theme
return themeFiles.map(buildThemeConfig)
}
/**
* Build configuration for a specific theme
* @param {string} themePath - Path to theme entry file
* @returns {object} Rollup configuration for theme
*/
function buildThemeConfig(themePath) {
const primePath = CONFIG.paths.prime
const themeName = path.basename(path.dirname(themePath))
console.log(`Configuring build for theme: ${themeName} (${themePath})`)
// Define external dependencies and their global names
const globals = {
'@flasher/flasher': 'flasher',
[CONFIG.flasherId]: 'flasher',
}
return defineConfig({
input: themePath,
// Simplified external check that only looks for specific imports
external: Object.keys(globals),
plugins: [
// Add a plugin to rewrite imports to use the package name
{
name: 'rewrite-imports',
resolveId(source, importer) {
// Handle relative imports that should be external
if (source === '../../index' || source === '../../../index') {
console.log(`Rewriting ${source} to @flasher/flasher`)
return { id: '@flasher/flasher', external: true }
}
// Handle absolute path to flasher index
if (source === CONFIG.flasherId
|| (importer && source.includes(path.join(primePath, 'assets/index')))) {
console.log(`Rewriting ${source} to @flasher/flasher`)
return { id: '@flasher/flasher', external: true }
}
return null
},
},
...createThemePlugins(primePath, themeName),
],
output: [
// Minified UMD bundle
{
format: CONFIG.formats.UMD,
file: `${primePath}/dist/themes/${themeName}/${themeName}.min.js`,
name: `theme.${themeName}`,
globals,
banner: CONFIG.build.banner,
// Fix: Remove the paths option which is causing the issue
// Or explicitly force absolute (non-relative) paths:
paths: (id) => {
if (id === '@flasher/flasher' || id.includes('@flasher/flasher')) {
// Ensure we return the exact package name with no modifications
return '@flasher/flasher'
}
// For all other IDs, return as-is
return id
},
plugins: [
...CONFIG.env.isProduction ? [terser({ format: { comments: false } })] : [],
copy({
targets: [
{
src: [
`${primePath}/dist/themes/${themeName}/${themeName}.min.js`,
`${primePath}/dist/themes/${themeName}/${themeName}.min.css`,
],
dest: `${primePath}/public/themes/${themeName}`,
},
],
hook: 'writeBundle',
verbose: false,
}),
],
},
// Use the same fix for non-minified and ESM bundles
{
format: CONFIG.formats.UMD,
file: `${primePath}/dist/themes/${themeName}/${themeName}.js`,
name: `theme.${themeName}`,
globals,
banner: CONFIG.build.banner,
paths: (id) => id === '@flasher/flasher' ? '@flasher/flasher' : id,
},
{
format: CONFIG.formats.ESM,
file: `${primePath}/dist/themes/${themeName}/${themeName}.esm.js`,
globals,
banner: CONFIG.build.banner,
paths: (id) => id === '@flasher/flasher' ? '@flasher/flasher' : id,
},
],
})
}