133 lines
4.8 KiB
JavaScript
133 lines
4.8 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.createRollupError = exports.uniAppCssPlugin = exports.APP_CSS_JS = void 0;
|
|||
|
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|||
|
const uni_cli_shared_1 = require("@dcloudio/uni-cli-shared");
|
|||
|
exports.APP_CSS_JS = './app.css.js';
|
|||
|
function uniAppCssPlugin() {
|
|||
|
const inputDir = process.env.UNI_INPUT_DIR;
|
|||
|
const appVueFilename = (0, uni_cli_shared_1.resolveAppVue)(inputDir);
|
|||
|
return {
|
|||
|
name: 'uni:app-nvue-app-style',
|
|||
|
// 提前到 @vite/plugin-vue 之前执行,因为在 nvue 编译时,仅 import 了 App.vue 的 styles,这样导致 descriptor
|
|||
|
// 一直使用的是上一次的(plugin-vue 会在 transformMain 中生成新的 descriptor),故不再交由 plugin-vue 来 load
|
|||
|
// 而是当前插件直接处理
|
|||
|
enforce: 'pre',
|
|||
|
resolveId(id) {
|
|||
|
if (id === exports.APP_CSS_JS) {
|
|||
|
return exports.APP_CSS_JS;
|
|||
|
}
|
|||
|
},
|
|||
|
load(id) {
|
|||
|
if (id === exports.APP_CSS_JS) {
|
|||
|
return genAppStylesCode(appVueFilename, this);
|
|||
|
}
|
|||
|
const { filename, query } = (0, uni_cli_shared_1.parseVueRequest)(id);
|
|||
|
if (query.vue && query.type === 'style' && appVueFilename === filename) {
|
|||
|
const descriptor = createAppDescriptor(filename, this);
|
|||
|
const block = descriptor.styles[query.index];
|
|||
|
if (block) {
|
|||
|
return {
|
|||
|
code: block.content,
|
|||
|
map: '',
|
|||
|
};
|
|||
|
}
|
|||
|
}
|
|||
|
},
|
|||
|
};
|
|||
|
}
|
|||
|
exports.uniAppCssPlugin = uniAppCssPlugin;
|
|||
|
const defaultAppStylesCode = `exports.styles = []`;
|
|||
|
async function genAppStylesCode(filename, pluginContext) {
|
|||
|
pluginContext.addWatchFile(filename);
|
|||
|
const descriptor = createAppDescriptor(filename, pluginContext);
|
|||
|
if (!descriptor.styles.length) {
|
|||
|
return defaultAppStylesCode;
|
|||
|
}
|
|||
|
let stylesCode = ``;
|
|||
|
const styleVars = [];
|
|||
|
for (let i = 0; i < descriptor.styles.length; i++) {
|
|||
|
const style = descriptor.styles[i];
|
|||
|
const src = style.src || descriptor.filename;
|
|||
|
const attrsQuery = attrsToQuery(style.attrs, 'css');
|
|||
|
const srcQuery = style.src ? `&src=${descriptor.id}` : ``;
|
|||
|
const query = `?vue&type=style&index=${i}${srcQuery}&inline`;
|
|||
|
const styleRequest = src + query + attrsQuery;
|
|||
|
stylesCode += `\nimport _style_${i} from ${JSON.stringify(styleRequest)}`;
|
|||
|
styleVars.push(`_style_${i}`);
|
|||
|
}
|
|||
|
return `
|
|||
|
${stylesCode}
|
|||
|
exports.styles = [${styleVars.join(',')}]
|
|||
|
`;
|
|||
|
}
|
|||
|
function readAppCode(filename) {
|
|||
|
if (!fs_extra_1.default.existsSync(filename)) {
|
|||
|
return ``;
|
|||
|
}
|
|||
|
const source = fs_extra_1.default.readFileSync(filename, 'utf8');
|
|||
|
if (source.includes('#endif')) {
|
|||
|
return (0, uni_cli_shared_1.preNVueJs)((0, uni_cli_shared_1.preNVueHtml)(source));
|
|||
|
}
|
|||
|
return source;
|
|||
|
}
|
|||
|
let appDescriptor;
|
|||
|
function createAppDescriptor(filename, pluginContext) {
|
|||
|
const source = readAppCode(filename);
|
|||
|
const id = (0, uni_cli_shared_1.hash)(source);
|
|||
|
if (!appDescriptor || appDescriptor.id !== id) {
|
|||
|
const { descriptor, errors } = require('@vue/compiler-sfc').parse(source, {
|
|||
|
filename,
|
|||
|
});
|
|||
|
descriptor.id = id;
|
|||
|
if (errors.length) {
|
|||
|
errors.forEach((error) => pluginContext.error(createRollupError(filename, error)));
|
|||
|
}
|
|||
|
appDescriptor = descriptor;
|
|||
|
}
|
|||
|
return appDescriptor;
|
|||
|
}
|
|||
|
function createRollupError(id, error) {
|
|||
|
const { message, name, stack } = error;
|
|||
|
const rollupError = {
|
|||
|
id,
|
|||
|
plugin: 'vue',
|
|||
|
message,
|
|||
|
name,
|
|||
|
stack,
|
|||
|
};
|
|||
|
if ('code' in error && error.loc) {
|
|||
|
rollupError.loc = {
|
|||
|
file: id,
|
|||
|
line: error.loc.start.line,
|
|||
|
column: error.loc.start.column,
|
|||
|
};
|
|||
|
}
|
|||
|
return rollupError;
|
|||
|
}
|
|||
|
exports.createRollupError = createRollupError;
|
|||
|
// these are built-in query parameters so should be ignored
|
|||
|
// if the user happen to add them as attrs
|
|||
|
const ignoreList = ['id', 'index', 'src', 'type', 'lang', 'module'];
|
|||
|
function attrsToQuery(attrs, langFallback, forceLangFallback = false) {
|
|||
|
let query = ``;
|
|||
|
for (const name in attrs) {
|
|||
|
const value = attrs[name];
|
|||
|
if (!ignoreList.includes(name)) {
|
|||
|
query += `&${encodeURIComponent(name)}${value ? `=${encodeURIComponent(value)}` : ``}`;
|
|||
|
}
|
|||
|
}
|
|||
|
if (langFallback || attrs.lang) {
|
|||
|
query +=
|
|||
|
`lang` in attrs
|
|||
|
? forceLangFallback
|
|||
|
? `&lang.${langFallback}`
|
|||
|
: `&lang.${attrs.lang}`
|
|||
|
: `&lang.${langFallback}`;
|
|||
|
}
|
|||
|
return query;
|
|||
|
}
|