Files
vue-pure-admin/node_modules/vite/dist/node/utils/cssUtils.js
2021-03-01 15:06:11 +08:00

165 lines
6.2 KiB
JavaScript

"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.recordCssImportChain = exports.getCssImportBoundaries = exports.cssImporteeMap = exports.cssImporterMap = exports.resolvePostcssOptions = exports.compileCss = exports.rewriteCssUrls = exports.isCSSRequest = exports.cssModuleRE = exports.cssPreprocessLangRE = exports.urlRE = void 0;
const path_1 = __importDefault(require("path"));
const chalk_1 = __importDefault(require("chalk"));
const transformUtils_1 = require("./transformUtils");
const pathUtils_1 = require("./pathUtils");
const resolveVue_1 = require("./resolveVue");
const hash_sum_1 = __importDefault(require("hash-sum"));
exports.urlRE = /url\(\s*('[^']+'|"[^"]+"|[^'")]+)\s*\)/;
exports.cssPreprocessLangRE = /\.(less|sass|scss|styl|stylus|postcss)$/;
exports.cssModuleRE = /\.module\.(less|sass|scss|styl|stylus|postcss|css)$/;
exports.isCSSRequest = (file) => file.endsWith('.css') || exports.cssPreprocessLangRE.test(file);
function rewriteCssUrls(css, replacerOrBase) {
let replacer;
if (typeof replacerOrBase === 'string') {
replacer = (rawUrl) => {
return path_1.default.posix.resolve(path_1.default.posix.dirname(replacerOrBase), rawUrl);
};
}
else {
replacer = replacerOrBase;
}
return transformUtils_1.asyncReplace(css, exports.urlRE, async (match) => {
let [matched, rawUrl] = match;
let wrap = '';
const first = rawUrl[0];
if (first === `"` || first === `'`) {
wrap = first;
rawUrl = rawUrl.slice(1, -1);
}
if (pathUtils_1.isExternalUrl(rawUrl) ||
rawUrl.startsWith('data:') ||
rawUrl.startsWith('#')) {
return matched;
}
return `url(${wrap}${await replacer(rawUrl)}${wrap})`;
});
}
exports.rewriteCssUrls = rewriteCssUrls;
async function compileCss(root, publicPath, { source, filename, scoped, vars, modules, preprocessLang, preprocessOptions = {}, modulesOptions = {} }, isBuild = false) {
const id = hash_sum_1.default(publicPath);
const postcssConfig = await loadPostcssConfig(root);
const { compileStyleAsync } = resolveVue_1.resolveCompiler(root);
if (publicPath.endsWith('.css') &&
!modules &&
!postcssConfig &&
!isBuild &&
!source.includes('@import')) {
// no need to invoke compile for plain css if no postcss config is present
return source;
}
const { options: postcssOptions, plugins: postcssPlugins } = await resolvePostcssOptions(root, isBuild);
if (preprocessLang) {
preprocessOptions = preprocessOptions[preprocessLang] || preprocessOptions;
// include node_modules for imports by default
switch (preprocessLang) {
case 'scss':
case 'sass':
preprocessOptions = {
includePaths: ['node_modules'],
...preprocessOptions
};
break;
case 'less':
case 'stylus':
preprocessOptions = {
paths: ['node_modules'],
...preprocessOptions
};
}
}
return await compileStyleAsync({
source,
filename,
id: `data-v-${id}`,
scoped,
vars,
modules,
modulesOptions: {
generateScopedName: `[local]_${id}`,
localsConvention: 'camelCase',
...modulesOptions
},
preprocessLang,
preprocessCustomRequire: (id) => require(pathUtils_1.resolveFrom(root, id)),
preprocessOptions,
postcssOptions,
postcssPlugins
});
}
exports.compileCss = compileCss;
let cachedPostcssConfig;
async function loadPostcssConfig(root) {
if (cachedPostcssConfig !== undefined) {
return cachedPostcssConfig;
}
try {
const load = require('postcss-load-config');
return (cachedPostcssConfig = await load({}, root));
}
catch (e) {
if (!/No PostCSS Config found/.test(e.message)) {
console.error(chalk_1.default.red(`[vite] Error loading postcss config:`));
console.error(e);
}
return (cachedPostcssConfig = null);
}
}
async function resolvePostcssOptions(root, isBuild) {
const config = await loadPostcssConfig(root);
const options = config && config.options;
const plugins = config && config.plugins ? config.plugins.slice() : [];
plugins.unshift(require('postcss-import')());
if (isBuild) {
plugins.push(require('postcss-discard-comments')({ removeAll: true }));
}
return {
options,
plugins
};
}
exports.resolvePostcssOptions = resolvePostcssOptions;
exports.cssImporterMap = new Map();
exports.cssImporteeMap = new Map();
function getCssImportBoundaries(filePath, boundaries = new Set()) {
if (!exports.cssImporterMap.has(filePath)) {
return boundaries;
}
const importers = exports.cssImporterMap.get(filePath);
for (const importer of importers) {
boundaries.add(importer);
getCssImportBoundaries(importer, boundaries);
}
return boundaries;
}
exports.getCssImportBoundaries = getCssImportBoundaries;
function recordCssImportChain(dependencies, filePath) {
const preImportees = exports.cssImporteeMap.get(filePath);
// if import code change, should removed unused previous importee
if (preImportees) {
for (const preImportee of preImportees) {
if (!dependencies.has(preImportee)) {
const importers = exports.cssImporterMap.get(preImportee);
if (importers) {
importers.delete(filePath);
}
}
}
}
dependencies.forEach((dependency) => {
if (exports.cssImporterMap.has(dependency)) {
exports.cssImporterMap.get(dependency).add(filePath);
}
else {
exports.cssImporterMap.set(dependency, new Set([filePath]));
}
});
exports.cssImporteeMap.set(filePath, dependencies);
}
exports.recordCssImportChain = recordCssImportChain;
//# sourceMappingURL=cssUtils.js.map