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
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(),
|
||
|
};
|
||
|
}
|
||
|
},
|
||
|
};
|
||
|
}
|