You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

114 lines
3.2 KiB

6 months ago
import path from 'path';
import { ResolvedConfig, normalizePath, Plugin } from 'vite';
import { ViteThemeOptions } from '.';
import { CLIENT_PUBLIC_PATH, CLIENT_PUBLIC_ABSOLUTE_PATH } from './constants';
import { debug as Debug } from 'debug';
const debug = Debug('vite:inject-vite-plugin-theme-client');
type PluginType = 'colorPlugin' | 'antdDarkPlugin';
export function injectClientPlugin(
type: PluginType,
{
colorPluginOptions,
colorPluginCssOutputName,
antdDarkCssOutputName,
antdDarkExtractCss,
antdDarkLoadLink,
}: {
colorPluginOptions?: ViteThemeOptions;
antdDarkCssOutputName?: string;
colorPluginCssOutputName?: string;
antdDarkExtractCss?: boolean;
antdDarkLoadLink?: boolean;
}
): Plugin {
let config: ResolvedConfig;
let isServer: boolean;
let needSourcemap = false;
return {
name: 'vite:inject-vite-plugin-theme-client',
enforce: 'pre',
configResolved(resolvedConfig) {
config = resolvedConfig;
isServer = resolvedConfig.command === 'serve';
needSourcemap = !!resolvedConfig.build.sourcemap;
},
transformIndexHtml: {
enforce: 'pre',
async transform(html) {
if (html.includes(CLIENT_PUBLIC_PATH)) {
return html;
}
return {
html,
tags: [
{
tag: 'script',
attrs: {
type: 'module',
src: path.posix.join(CLIENT_PUBLIC_PATH),
},
injectTo: 'head-prepend',
},
],
};
},
},
async transform(code, id) {
const nid = normalizePath(id);
const path = normalizePath('vite-plugin-theme/es/client.js');
const getMap = () => (needSourcemap ? this.getCombinedSourcemap() : null);
if (
nid === CLIENT_PUBLIC_ABSOLUTE_PATH ||
nid.includes(path) ||
// support .vite cache
nid.includes(path.replace(/\//gi, '_'))
) {
debug('transform client file:', id, code);
const {
build: { assetsDir },
} = config;
const getOutputFile = (name?: string) => {
return JSON.stringify(`${config.base}${assetsDir}/${name}`);
};
if (type === 'colorPlugin') {
code = code
.replace('__COLOR_PLUGIN_OUTPUT_FILE_NAME__', getOutputFile(colorPluginCssOutputName))
.replace('__COLOR_PLUGIN_OPTIONS__', JSON.stringify(colorPluginOptions));
}
if (type === 'antdDarkPlugin') {
code = code.replace(
'__ANTD_DARK_PLUGIN_OUTPUT_FILE_NAME__',
getOutputFile(antdDarkCssOutputName)
);
if (typeof antdDarkExtractCss === 'boolean') {
code = code.replace(
'__ANTD_DARK_PLUGIN_EXTRACT_CSS__',
JSON.stringify(antdDarkExtractCss)
);
}
if (typeof antdDarkLoadLink === 'boolean') {
code = code.replace(
'__ANTD_DARK_PLUGIN_LOAD_LINK__',
JSON.stringify(antdDarkExtractCss)
);
}
}
return {
code: code.replace('__PROD__', JSON.stringify(!isServer)),
map: getMap(),
};
}
},
};
}