UNPKG

uni-plugin-light

Version:

uni-app相关插件、loader及webpack基础配置

182 lines (173 loc) 6.21 kB
'use strict'; 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;