UNPKG

@varlet/cli

Version:
56 lines (55 loc) 2.44 kB
import { parse, resolve } from 'path'; import fse from 'fs-extra'; import glob from 'glob'; import less from 'less'; import * as sass from 'sass'; import { CWD } from '../shared/constant.js'; import { replaceExt, smartAppendFileSync } from '../shared/fsUtils.js'; import { getScriptExtname } from './compileScript.js'; const { render: renderLess } = less; const { readFileSync, writeFileSync, unlinkSync } = fse; export const EMPTY_SPACE_RE = /[\s]+/g; export const EMPTY_LINE_RE = /[\n\r]*/g; export const IMPORT_CSS_RE = /(?<!['"`])import\s+['"](\.{1,2}\/.+\.css)['"]\s*;?(?!\s*['"`])/g; export const IMPORT_LESS_RE = /(?<!['"`])import\s+['"](\.{1,2}\/.+\.less)['"]\s*;?(?!\s*['"`])/g; export const IMPORT_SCSS_RE = /(?<!['"`])import\s+['"](\.{1,2}\/.+\.scss)['"]\s*;?(?!\s*['"`])/g; export const STYLE_EXTNAME_RE = /(\.less)|(\.scss)|(\.css)/; export const STYLE_IMPORT_RE = /@import\s+['"](.+)['"]\s*;/g; export const compressCss = (s) => s.replace(EMPTY_LINE_RE, '').replace(EMPTY_SPACE_RE, ' '); export function normalizeStyleDependency(styleImport, reg) { let relativePath = styleImport.replace(reg, '$1'); relativePath = relativePath.replace(STYLE_EXTNAME_RE, ''); if (relativePath.startsWith('./')) { return '.' + relativePath; } return '../' + relativePath; } export function extractStyleDependencies(file, code, styleReg) { const styleImports = code.match(styleReg) ?? []; const cssFile = resolve(parse(file).dir, `./style/index${getScriptExtname()}`); styleImports.forEach((styleImport) => { const normalizedPath = normalizeStyleDependency(styleImport, styleReg); smartAppendFileSync(cssFile, `import '${normalizedPath}.css'\n`); }); return code.replace(styleReg, ''); } export async function compileLess(file) { const source = readFileSync(file, 'utf-8'); const { css } = await renderLess(source, { filename: file, paths: [resolve(CWD, 'node_modules')], }); writeFileSync(replaceExt(file, '.css'), compressCss(css), 'utf-8'); } export function compileScss(file) { const { css } = sass.compile(file, { loadPaths: [resolve(CWD, 'node_modules')], }); writeFileSync(replaceExt(file, '.css'), compressCss(css), 'utf-8'); } export function clearLessFiles(dir) { glob.sync(`${dir}/**/*.less`).forEach(unlinkSync); } export function clearScssFiles(dir) { glob.sync(`${dir}/**/*.scss`).forEach(unlinkSync); }