shendu-portal-plugin-vue
Version:
151 lines (141 loc) • 6.73 kB
JavaScript
const api = require('./api');
const arrayRefs = require('./array-refs');
const asyncComponents = require('./async-components');
const customDirectives = require('./custom-directives');
const attrsIncludesClassStyle = require('./attrs-includes-class-style');
const children = require('./children');
const emitsOptions = require('./emits-option');
const eventsApi = require('./events-api');
const filters = require('./filters');
const functionalComponents = require('./functional-components');
const globalApiTreeshaking = require('./global-api-treeshaking');
const globalApi = require('./global-api');
const keyAttribute = require('./key-attribute');
const keycodeModifiers = require('./keycode-modifiers');
const lifeCycle = require('./life-cycle');
const listenersRemoved = require('./listeners-removed');
const renderFunctionApi = require('./render-function-api');
const slotsUnification = require('./slots-unification');
const transitionGroup = require('./transition-group');
const transition = require('./transition');
const vBind = require('./v-bind');
const vIfvFor = require('./v-if-v-for');
const vModel = require('./v-model-pro');
const vOnNativeModifierRemoved = require('./v-on-native-modifier-removed');
const watch = require('./watch');
const router = require('./vue-router');
const vuex = require('./vue-vuex');
const packageJson = require('./package-json');
module.exports = [
{ name: 'api', rule: api, test: /\.vue$|\.js$|\.ts$/ },
{ name: 'router', rule: router, test: /\.vue$|\.js$|\.ts$/ },
{ name: 'vuex', rule: vuex, test: /\.js$|\.ts$/ },
{
name: 'globalApiTreeshaking',
rule: globalApiTreeshaking,
test: /\.vue$|\.js$|\.ts$/,
},
{ name: 'arrayRefs', rule: arrayRefs, test: /\.vue$/ },
{
name: 'asyncComponents',
rule: asyncComponents,
test: /\.vue$|\.js$|\.ts$/,
},
{
name: 'customDirectives',
rule: customDirectives,
test: /\.vue$|\.js$|\.ts$/,
},
{
name: 'attrsIncludesClassStyle',
rule: attrsIncludesClassStyle,
test: /\.vue$/,
},
{ name: 'children', rule: children, test: /\.vue$|\.js$|\.ts$/ },
{ name: 'emitsOptions', rule: emitsOptions, test: /\.vue$|\.js$|\.ts$/ },
{ name: 'filters', rule: filters, test: /\.vue$|\.js$|\.ts$/ },
{
name: 'functionalComponents',
rule: functionalComponents,
test: /\.vue$|\.js$|\.ts$/,
},
{ name: 'globalApi', rule: globalApi, test: /\.vue$|\.js$|\.ts$/ },
{ name: 'keycodeModifiers', rule: keycodeModifiers, test: /\.vue$/ },
{ name: 'lifeCycle', rule: lifeCycle, test: /\.vue$|\.js$|\.ts$/ },
{ name: 'listenersRemoved', rule: listenersRemoved, test: /\.vue$/ },
{
name: 'renderFunctionApi',
rule: renderFunctionApi,
test: /\.vue$|\.js$|\.ts$/,
},
{ name: 'slotsUnification', rule: slotsUnification, test: /\.vue$/ },
{ name: 'transition', rule: transition, test: /\.vue$/ },
{ name: 'transitionGroup', rule: transitionGroup, test: /\.vue$/ },
{ name: 'vBind', rule: vBind, test: /\.vue$/ },
{ name: 'vIfvFor', rule: vIfvFor, test: /\.vue$/ },
{ name: 'vModel', rule: vModel, test: /\.vue$|\.js$|\.ts$/ },
{
name: 'vOnNativeModifierRemoved',
rule: vOnNativeModifierRemoved,
test: /\.vue$/,
},
{ name: 'watch', rule: watch, test: /\.vue$|\.js$|\.ts$/ },
//keyAttribute 规则要放到 vIfvFor 后面执行
{ name: 'keyAttribute', rule: keyAttribute, test: /\.vue$/ },
{
name: 'package-json',
rule: packageJson,
test: /package\.json$/,
notParseAst: false,
},
{ name: 'eventsApi', rule: eventsApi, test: /\.vue$|\.js$|\.ts$/ },
{ name: 'common', rule: (ast, { gogocode: $ }, options) => {
let scriptAst = ast.find('<script></script>')
scriptAst.replace(`this.$store.state`, `this.$store`);
scriptAst.remove(`import {$_$} from 'vuex'`);
scriptAst.replace(`import {$$$} from 'ruibo-components-ui'`, `import {$$$} from '@/utils'`);
scriptAst.replace(`import {$$$} from 'ruibo-components-ui/packages/service/fetch'`, `import {$$$} from '@/utils'`);
// this.closeNavTab
scriptAst.replace(`this.closeNavTab`, `this.$store.closeNavTab`);
// // format="yyyy-MM-dd HH:mm:ss" 转成 format="YYYY-MM-DD HH:mm:ss"
// scriptAst.replace(`format="yyyy-MM-dd $$$1"`, 'format="YYYY-MM-DD $$$1"');
// // value-format="yyyy-MM-dd HH:mm:ss" 转成 value-format="YYYY-MM-DD HH:mm:ss"
// scriptAst.replace(`format="yyyy-MM-dd $$$1"`, 'format="YYYY-MM-DD $$$1"');
const vueContent = ast.generate();
// 使用正则表达式替换 /deep/ 选择器
let newVueContent = vueContent.replace(
/(\s*)\/deep\/(\s*)([^{]+?)\s*{/g,
(match, space1, space2, selectorGroup) => {
// 分割选择器组,确保正确处理逗号分隔的选择器
const processedSelectors = selectorGroup
.split(',')
.map(selector => {
// 清理每个选择器
const cleaned = selector
.trim()
.replace(/\s*>\s*/g, ' > ')
.replace(/\s*~\s*/g, ' ~ ')
.replace(/\s*\+\s*/g, ' + ');
// 移除可能残留的 /deep/ 并包裹在 :deep() 中
return cleaned.replace(/\s*\/deep\/\s*/g, ' ').trim();
})
.filter(selector => selector.length > 0) // 过滤空选择器
.map(selector => `:deep(${selector})`)
.join(', ');
return `${space1}${processedSelectors} {`;
}
);
newVueContent = newVueContent.replace(/format=\"yyyy-MM-dd/g, 'format="YYYY-MM-DD')
newVueContent = newVueContent.replace(/value-format=\"yyyy-MM-dd/g, 'value-format="YYYY-MM-DD')
// 重新解析为 AST
return $(newVueContent, { parseOptions: { language: 'vue' } });
}, test: /\.vue/},
{ name: 'js-common', rule: (ast, {gogocode: $}, options) => {
ast.replace(`import {http} from 'ruibo-components-ui'`, `import { http } from '@/utils/service'`);
ast.replace(`import { http } from 'ruibo-components-ui'`, `import { http } from '@/utils/service'`);
ast.replace(`import {$$$} from 'ruibo-components-ui/packages/service/fetch'`, `import {$$$} from '@/utils'`);
const vueContent = ast.generate();
let newVueContent = vueContent.replace(/ruibo-components-ui/g, '@/utils')
return $(newVueContent);
}, test: /\.js$|\.ts$/ }
];