@varlet/cli
Version:
cli of varlet
47 lines (44 loc) • 1.86 kB
JavaScript
import { resolve } from 'path';
import fse from 'fs-extra';
import { getVarletConfig } from '../config/varlet.config.js';
import { SRC_DIR, TYPES_DIR } from '../shared/constant.js';
import { isDir, isMD } from '../shared/fsUtils.js';
const { ensureDirSync, readdirSync, readFileSync, writeFileSync } = fse;
export function compileMD(path, keys) {
const content = readFileSync(path, 'utf-8');
const result = content.match(/`--[\w-]+`/g) ?? [];
result.forEach((key) => {
keys.add(key.replace(/`/g, ''));
});
}
export function compileDir(path, keys, defaultLanguage) {
const dir = readdirSync(path);
dir.forEach((filename) => {
const filePath = resolve(path, filename);
isDir(filePath) && compileDir(filePath, keys, defaultLanguage);
if (isMD(filePath) && filename.includes(defaultLanguage)) {
compileMD(filePath, keys);
}
});
}
export async function compileStyleVars() {
ensureDirSync(TYPES_DIR);
const { defaultLanguage } = await getVarletConfig();
const keys = new Set();
compileDir(SRC_DIR, keys, defaultLanguage);
const assistanceType = `type RemoveTwoDashes<T extends string> = T extends \`--$\{infer Rest}\` ? Rest : T
type CamelCase<S extends string> =
S extends \`$\{infer P1}-$\{infer P2}\`
? \`$\{P1}$\{CamelCase<Capitalize<P2>>}\`
: S
type FormatStyleVars<T> = {
[K in keyof T as CamelCase<RemoveTwoDashes<K & string>>]?: T[K];
} & T`;
let baseStyleVars = [...keys].reduce((template, key) => {
template += ` '${key}'?: string\n`;
return template;
}, '\n\ninterface BaseStyleVars {\n');
baseStyleVars += ' [key: PropertyKey]: string\n}\n';
writeFileSync(resolve(TYPES_DIR, 'styleVars.d.ts'), `${assistanceType}${baseStyleVars}
export interface StyleVars extends FormatStyleVars<BaseStyleVars> {}`);
}