import path from 'node:path'
import tailwindCss from 'tailwindcss'
import fg from 'fast-glob'
import fs from 'fs-extra'
export const delStaticPlugin = () => {
let config
return {
name: 'inline-plugin-del-static',
apply: 'build',
configResolved(_config) {
config = _config
},
async closeBundle() {
const targetPath = path.join(config.build.outDir, '@demos')
const files = await fg(['**/*.spec.js', '**/*.spec.ts'], {
dot: true,
cwd: targetPath
})
files.forEach((filename) => {
const filePath = path.join(targetPath, filename)
fs.unlink(filePath)
})
}
}
}
export const viteDocsearchPlugin = (env) => {
return {
name: 'vite-docsearch-plugin',
enforce: 'pre',
transform(code, id) {
if (id.includes('@docsearch')) {
const newCode = code.replace(
'Promise((function(t){var n=new XMLHttpRequest;',
'Promise((function(t){t=window.handleGlobalSearchData(t);var n=new XMLHttpRequest;'
)
return {
code: newCode,
map: null
}
}
}
}
}
const createFixIconSrcPlugin = (packageName, packagePath, pluginName) => {
const currentFileUrl = import.meta.url
const currentDir = path.dirname(new URL(currentFileUrl).pathname)
const normalizedDir = process.platform === 'win32' ? currentDir.replace(/^\//, '') : currentDir
const workspaceRoot = path.resolve(normalizedDir, '../..')
const iconSrcPath = path.resolve(workspaceRoot, packagePath, 'src')
const iconIndexPath = path.resolve(workspaceRoot, packagePath, 'index.ts')
return {
name: pluginName,
enforce: 'pre',
resolveId(id) {
if (id === packageName) {
return iconIndexPath
}
if (id === `${packageName}/src`) {
return iconIndexPath
}
const normalizedId = id.replace(/\\/g, '/')
const normalizedSrcPath = iconSrcPath.replace(/\\/g, '/')
if (normalizedId === normalizedSrcPath) {
return iconIndexPath
}
return null
},
load(id) {
const normalizedId = id.replace(/\\/g, '/')
const normalizedSrcPath = iconSrcPath.replace(/\\/g, '/')
if (normalizedId === normalizedSrcPath) {
if (fs.existsSync(iconIndexPath)) {
return fs.readFileSync(iconIndexPath, 'utf-8')
}
}
return null
}
}
}
export const fixIconSrcPlugins = () => {
return [
createFixIconSrcPlugin('@opentiny/vue-icon', 'packages/vue-icon', 'fix-icon-src-plugin'),
createFixIconSrcPlugin('@opentiny/vue-icon-saas', 'packages/vue-icon-saas', 'fix-icon-saas-src-plugin')
]
}
export const fixIconSrcPlugin = () => {
return createFixIconSrcPlugin('@opentiny/vue-icon', 'packages/vue-icon', 'fix-icon-src-plugin')
}
export const fixIconSaasSrcPlugin = () => {
return createFixIconSrcPlugin('@opentiny/vue-icon-saas', 'packages/vue-icon-saas', 'fix-icon-saas-src-plugin')
}
const themeModifyMap = {
saas(viteConfig) {
viteConfig.css = {
postcss: {
plugins: [tailwindCss]
}
}
viteConfig.tinyCustom.copyTarget.push({
src: `./demos/mobile-first/*`,
dest: '@demos/mobile-first'
})
const menuPath = path.resolve('./demos/saas')
viteConfig.resolve.alias['@menu'] = menuPath
if (!viteConfig.resolve.alias['@opentiny/vue-theme']) {
viteConfig.resolve.alias['@opentiny/vue-theme'] = '@opentiny/vue-theme-saas'
viteConfig.resolve.alias['@opentiny/vue-icon'] = '@opentiny/vue-icon-saas'
viteConfig.resolve.alias['@opentiny/vue-search-box'] = '@opentiny/vue-search-box-saas'
}
return viteConfig
}
}
const modeModifyMap = {
mobile(viteConfig) {
viteConfig.build.rollupOptions.input.mobile = path.resolve(__dirname, './mobile.html')
},
plus(viteConfig) {
const demosPath = '../plusdocs'
const apisPath = '../plusdocs/apis'
viteConfig.resolve.alias['@menu'] = path.resolve(demosPath)
viteConfig.resolve.alias['@demos'] = path.resolve(demosPath)
viteConfig.tinyCustom.copyTarget = [
{
src: `${demosPath}/*`,
dest: '@demos'
},
{
src: `${apisPath}/*`,
dest: '@demos/apis'
}
]
}
}
export const modifyViteConfig = (viteConfig, env) => {
const { VITE_TINY_THEME, VITE_APP_MODE } = env
const doModeModify = modeModifyMap[VITE_APP_MODE]
if (doModeModify) {
doModeModify(viteConfig)
}
const doThemeModify = themeModifyMap[VITE_TINY_THEME]
return doThemeModify ? doThemeModify(viteConfig) : viteConfig
}