uni-plugin-light
Version:
uni-app相关插件、loader及webpack基础配置
182 lines (173 loc) • 6.21 kB
JavaScript
;
var tComm = require('t-comm');
var loaderUtils = require('loader-utils');
var fs = require('fs');
var path = require('path');
function _interopNamespace(e) {
if (e && e.__esModule) return e;
var n = Object.create(null);
if (e) {
Object.keys(e).forEach(function (k) {
if (k !== 'default') {
var d = Object.getOwnPropertyDescriptor(e, k);
Object.defineProperty(n, k, d.get ? d : {
enumerable: true,
get: function () { return e[k]; }
});
}
});
}
n["default"] = e;
return Object.freeze(n);
}
var fs__namespace = /*#__PURE__*/_interopNamespace(fs);
var path__namespace = /*#__PURE__*/_interopNamespace(path);
/* eslint-disable @typescript-eslint/no-require-imports */
var rootPath = process.cwd();
/**
* 返回示意:
*
* [
* '/Users/mike/Documents/web/src/project/user/views/index/index-home.vue',
'/Users/mike/Documents/web/src/project/user/packages/views/webview/webview.vue',
'/Users/mike/Documents/web/src/project/user/views/sche/sche.vue',
'/Users/mike/Documents/web/src/project/user/views/sche/cycle-set.vue'
]
*/
function getAllPagesFromJson(data) {
var _data$pages = data.pages,
pages = _data$pages === void 0 ? [] : _data$pages,
_data$subPackages = data.subPackages,
subPackages = _data$subPackages === void 0 ? [] : _data$subPackages;
var res = pages.map(function (item) {
return item.path;
}).concat(subPackages.map(function (item) {
return item.pages.map(function (sub) {
return path__namespace.join(item.root, sub.path);
});
}).flat()).map(function (item) {
return "".concat(path__namespace.resolve(rootPath, item), ".vue");
}).filter(function (item) {
return fs__namespace.existsSync(item);
});
return res;
}
function getPagePath() {
rootPath = path__namespace.resolve(process.cwd(), './src', process.env.VUE_APP_DIR || '');
var pagesJsonPath = path__namespace.resolve(rootPath, 'pages.json');
if (!fs__namespace.existsSync(pagesJsonPath)) {
return [];
}
var pagesJson = tComm.readCommentJson(pagesJsonPath);
return getAllPagesFromJson(pagesJson);
}
var PLATFORM_MAP = {
MP_WX: 'mp-weixin',
MP_QQ: 'mp-qq',
H5: 'h5'
};
var ALL_PLATFORM = 'ALL';
function shouldUseLoader() {
var defaultPlatforms = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
var options = loaderUtils.getOptions(this) || {};
var _options$platforms = options.platforms,
platforms = _options$platforms === void 0 ? defaultPlatforms : _options$platforms;
var platform = process.env.UNI_PLATFORM || '';
if (platforms === ALL_PLATFORM || platforms.indexOf(ALL_PLATFORM) > -1) {
return true;
}
return platforms.includes(platform);
}
var PLATFORMS_MP = [PLATFORM_MAP.MP_WX, PLATFORM_MAP.MP_QQ];
var oneTagReg = /(?<=<template>\s*)(<[^>]+\/?>)(?=\s*<\/template>)/;
var firstCommentReg = /(?<=<template>[\s\n]*(?:<!--.*?-->\s*)<\w+[^>]*>)([\s\S]*)(?=<\/\w+>[\s\n]*<\/template>)/;
var notFirstDivReg = /(?<=<template>\s*)(<(?!\w+)[^>]+>[\s\S]*)(?=\s*<\/template>)/;
var htmlReg = /(?<=<template>[\s\n]*<\w+[^>]*>)([\s\S]*)(?=<\/\w+>[\s\n]*<\/template>)/;
function insertGlobalComponent(source) {
tComm.replaceAllPolyfill();
var options = loaderUtils.getOptions(this) || {};
var _options$components = options.components,
components = _options$components === void 0 ? [] : _options$components;
if (!shouldUseLoader.call(this, PLATFORMS_MP)) return source;
var pages = options.pages;
if (pages === undefined) {
pages = getPagePath();
}
// @ts-ignore
var resourcePath = this.resourcePath;
if (!pages.includes(resourcePath)) {
return source;
}
var res = insertComp(source, components);
return res;
}
function getExtraStr(props, events) {
var extra = props.reduce(function (acc, prop) {
var key = prop.key,
value = prop.value,
custom = prop.custom;
acc += "".concat(custom ? ':' : '').concat(key, "=\"").concat(value, "\" ");
return acc;
}, '');
extra += events.reduce(function (acc, e) {
var name = e.name,
event = e.event;
acc += " @".concat(name, "=\"").concat(event, "\" ");
return acc;
}, '');
return extra;
}
function composeCompStr(components, isOnTop) {
components = components.filter(function (item) {
return !!item.isOnTop === !!isOnTop;
});
var str = '<template>';
str += components.map(function (item) {
var name = item.name,
id = item.id,
_item$props = item.props,
props = _item$props === void 0 ? [] : _item$props,
_item$events = item.events,
events = _item$events === void 0 ? [] : _item$events;
var extra = getExtraStr(props, events);
return "<".concat(name, " id=\"").concat(id, "\" ").concat(extra, "/>");
}).join('\n');
str += '</template>';
return str;
}
function insertComp(source, components) {
var newComponents = components.filter(function (item) {
var name = item.name;
return !isAlreadyInPage(source, name);
});
if (!newComponents.length) {
return source;
}
var insertTopStr = composeCompStr(newComponents, true);
var insertBottomStr = composeCompStr(newComponents, false);
if (source.match(oneTagReg)) {
return source.replace(oneTagReg, function (a, b) {
return "<div>".concat(insertTopStr, " ").concat(b, " ").concat(insertBottomStr, "</div>");
});
}
if (source.match(firstCommentReg)) {
return source.replace(firstCommentReg, function (a, b) {
return insertTopStr + b + insertBottomStr;
});
}
if (source.match(notFirstDivReg)) {
return source.replace(notFirstDivReg, function (a, b) {
return "<div>".concat(insertTopStr, " ").concat(b, " ").concat(insertBottomStr, "</div>");
});
}
var res = source.replace(htmlReg, function (a, b) {
return insertTopStr + b + insertBottomStr;
});
return res;
}
function isAlreadyInPage(source, comp) {
var compReg = new RegExp("<template>[\\s\\S]*(".concat(comp, "|").concat(tComm.hyphenate(comp), ")([\\s\\S]+)<\\/template>"));
if (source.match(compReg)) return true;
return false;
}
module.exports = insertGlobalComponent;