126 lines
3.9 KiB
JavaScript
126 lines
3.9 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.filterPrefersColorScheme = void 0;
|
|
const shared_1 = require("@vue/shared");
|
|
const postcss_selector_parser_1 = __importDefault(require("postcss-selector-parser"));
|
|
const uni_shared_1 = require("@dcloudio/uni-shared");
|
|
const defaultUniAppCssProcessorOptions = (0, shared_1.extend)({}, uni_shared_1.defaultRpx2Unit);
|
|
const BG_PROPS = [
|
|
'background',
|
|
'background-clip',
|
|
'background-color',
|
|
'background-image',
|
|
'background-origin',
|
|
'background-position',
|
|
'background-repeat',
|
|
'background-size',
|
|
'background-attachment',
|
|
];
|
|
function transform(selector, state, { rewriteTag }) {
|
|
if (selector.type !== 'tag') {
|
|
return;
|
|
}
|
|
const { value } = selector;
|
|
selector.value = rewriteTag(value);
|
|
if (value === 'page' && selector.value === 'uni-page-body') {
|
|
state.bg = true;
|
|
}
|
|
}
|
|
function createBodyBackgroundRule(origRule) {
|
|
const bgDecls = [];
|
|
origRule.walkDecls((decl) => {
|
|
if (BG_PROPS.indexOf(decl.prop) !== -1) {
|
|
bgDecls.push(decl.clone());
|
|
}
|
|
});
|
|
if (bgDecls.length) {
|
|
const { rule } = require('postcss');
|
|
origRule.after(rule({ selector: 'body' }).append(bgDecls));
|
|
}
|
|
}
|
|
function walkRules(options) {
|
|
return (rule) => {
|
|
const state = { bg: false };
|
|
rule.selector = (0, postcss_selector_parser_1.default)((selectors) => selectors.walk((selector) => transform(selector, state, options))).processSync(rule.selector);
|
|
state.bg && createBodyBackgroundRule(rule);
|
|
};
|
|
}
|
|
function walkDecls(rpx2unit) {
|
|
return (decl) => {
|
|
const { value } = decl;
|
|
if (value.indexOf('rpx') === -1 && value.indexOf('upx') === -1) {
|
|
return;
|
|
}
|
|
decl.value = rpx2unit(decl.value);
|
|
};
|
|
}
|
|
function filterPrefersColorScheme(root, force = false) {
|
|
if (process.env.VUE_APP_DARK_MODE !== 'true') {
|
|
const filePath = root.source?.input.file;
|
|
if (force || (filePath && filePath.includes('@dcloudio'))) {
|
|
root.walkAtRules((rule) => {
|
|
if (rule.params.includes('prefers-color-scheme')) {
|
|
rule.remove();
|
|
}
|
|
});
|
|
}
|
|
}
|
|
}
|
|
exports.filterPrefersColorScheme = filterPrefersColorScheme;
|
|
const baiduTags = {
|
|
navigator: 'nav',
|
|
};
|
|
function rewriteBaiduTags(tag) {
|
|
return baiduTags[tag] || tag;
|
|
}
|
|
function rewriteUniH5Tags(tag) {
|
|
if (tag === 'page') {
|
|
return 'uni-page-body';
|
|
}
|
|
if ((0, uni_shared_1.isBuiltInComponent)(tag)) {
|
|
return uni_shared_1.COMPONENT_SELECTOR_PREFIX + tag;
|
|
}
|
|
return tag;
|
|
}
|
|
function rewriteUniAppTags(tag) {
|
|
if (tag === 'page') {
|
|
return 'body';
|
|
}
|
|
if ((0, uni_shared_1.isBuiltInComponent)(tag)) {
|
|
return uni_shared_1.COMPONENT_SELECTOR_PREFIX + tag;
|
|
}
|
|
return tag;
|
|
}
|
|
const transforms = {
|
|
h5: rewriteUniH5Tags,
|
|
app: rewriteUniAppTags,
|
|
'mp-baidu': rewriteBaiduTags,
|
|
};
|
|
const uniapp = (opts) => {
|
|
const platform = process.env.UNI_PLATFORM;
|
|
const { unit, unitRatio, unitPrecision } = (0, shared_1.extend)({}, defaultUniAppCssProcessorOptions, opts);
|
|
const rpx2unit = (0, uni_shared_1.createRpx2Unit)(unit, unitRatio, unitPrecision);
|
|
return {
|
|
postcssPlugin: 'uni-app',
|
|
prepare() {
|
|
return {
|
|
OnceExit(root) {
|
|
root.walkDecls(walkDecls(rpx2unit));
|
|
const rewriteTag = transforms[platform];
|
|
filterPrefersColorScheme(root);
|
|
if (rewriteTag) {
|
|
root.walkRules(walkRules({
|
|
rewriteTag,
|
|
}));
|
|
}
|
|
},
|
|
};
|
|
},
|
|
};
|
|
};
|
|
uniapp.postcss = true;
|
|
exports.default = uniapp;
|