uniViteTemplate/vite/plugins/build.unocss.config.ts
2024-09-05 18:52:22 +08:00

120 lines
3.3 KiB
TypeScript

import * as fs from 'node:fs';
import { buildTheme } from '../../src/theme/theme';
export default function buildThemeConfig() {
const fileName = './unocss.config.ts';
const _data = buildTheme();
// 写入时会先清空文件
fs.writeFile(fileName, `${createFileByTemplate(_data)}`, (err: any) => {
if (err) {
console.error(err);
} else {
// console.log('构建 css 提示文件完成');
console.table(flatten(_data));
}
});
// 写完文件后使用编辑器格式化一下
}
function flatten(obj: any, parentKey = ''): any {
let result: any = {};
for (const [key, value] of Object.entries(obj)) {
const newKey = parentKey ? `${parentKey}.${key}` : key;
if (typeof value === 'object' && value !== null) {
const flattened = flatten(value, newKey);
result = { ...result, ...flattened };
} else {
result[newKey] = value;
}
}
return result;
}
// 通过模版生成文件
function createFileByTemplate(theme: any) {
const file_string = `
/**
* unocss defineConfig
* @link unocss: https://github.com/unocss/unocss
* @link unocss-preset-weapp: https://github.com/MellowCo/unocss-preset-weapp
* */
import { defineConfig, presetIcons } from 'unocss';
import presetWeapp from 'unocss-preset-weapp';
import { transformerAttributify, transformerClass } from 'unocss-preset-weapp/transformer';
import transformerDirectives from '@unocss/transformer-directives';
const transformRules = {
'.': '-d111-',
'/': '-s111-',
':': '-c111-',
'%': '-p111-',
'!': '-e111-',
'#': '-w111-',
'(': '-b111l-',
')': '-b111r-',
'[': '-f111l-',
']': '-f111r-',
$: '-r111-',
',': '-r222-',
};
const prefix = '';
export default defineConfig({
presets: [
// https://github.com/MellowCo/unocss-preset-weapp
presetWeapp({
nonValuedAttribute: true,
prefix: prefix,
whRpx: true,
transform: true,
platform: 'uniapp',
transformRules,
}),
// 由 Iconify 提供支持的纯 CSS 图标解决方案
presetIcons({
scale: 1,
warn: true,
extraProperties: {
'display': 'inline-block',
'vertical-align': 'middle',
},
}),
],
// transformers: [transformerDirectives()],
// attributify: false,
shortcuts: [
{
'border-base': 'border border-gray-500_10',
'z-tar-both': 'z-988',
'head-fixed': 'fixed top-0 left-0 w-full z-tar-both',
center: 'flex justify-center items-center',
},
],
theme: ${JSON.stringify(theme)},
transformers: [
transformerDirectives({
applyVariable: ['--at-apply', '--uno-apply', '--uno'],
enforce: 'pre'
}),
transformerAttributify({
classPrefix: prefix,
transformRules,
nonValuedAttribute: true,
}),
transformerClass({
transformRules,
}),
],
});
`;
return file_string;
}