Browse Source

组件更新

master
许孟阳 2 years ago
parent
commit
d0b875c3cc
  1. 25
      examples/App.vue
  2. 7
      package.json
  3. 4
      packages/base/index.ts
  4. 2
      packages/base/list-table/index.ts
  5. 2
      packages/base/list-table/src/listTable.vue
  6. 2
      packages/base/modify-form/index.ts
  7. 15
      packages/base/modify-form/src/modifyForm.vue
  8. 2
      packages/base/search-row/index.ts
  9. 0
      packages/base/search-row/src/searchRow.vue
  10. 4
      packages/base/tag/index.ts
  11. 0
      packages/base/tag/src/tag.vue
  12. 10
      packages/index.ts
  13. 2
      packages/list-table/index.ts
  14. 2
      packages/manage/home/index.ts
  15. 102
      packages/manage/home/src/home.vue
  16. 2
      packages/manage/index.ts
  17. 2
      packages/manage/menu-tree/index.ts
  18. 70
      packages/manage/menu-tree/src/menuTree.vue
  19. 23
      packages/manage/menu-tree/src/style.ts
  20. 2
      packages/modify-form/index.ts
  21. 2
      packages/search-row/index.ts
  22. 3
      packages/termimal/index.ts
  23. 2
      packages/tool/index.ts
  24. 3
      packages/tool/termimal-split/index.ts
  25. 198
      packages/tool/termimal-split/src/terminal.vue
  26. 3
      packages/tool/termimal/index.ts
  27. 118
      packages/tool/termimal/src/terminal.vue
  28. 10
      plugs/axios.ts
  29. 2
      plugs/element/index.ts
  30. 0
      plugs/element/message.ts
  31. 248
      plugs/element/rule.ts
  32. 8
      tsconfig.json
  33. 190
      yarn.lock

25
examples/App.vue

@ -4,21 +4,22 @@ @@ -4,21 +4,22 @@
<ListTable :data="data" :height="500" :props="prop"></ListTable>
<el-dialog class="no-padding" title="实时脚本终端" v-model="flag.termial" size="tiny" :close-on-click-modal="false" top="10vh"
width="80%">
<Terminal :url="url"></Terminal>
width="90%">
<Terminal :url="url" :msgFilter="msgFilter"></Terminal>
<!-- <TerminalSplit :url="url" :msgFilter="msgFilter" :prmt="prmt"></TerminalSplit> -->
</el-dialog>
</template>
<script lang="ts" setup>
import { reactive, onMounted } from "vue";
import { reactive, onMounted, ref } from "vue";
import { useStore } from "vuex";
import { WkbTag, ListTable, Terminal } from "../packages";
import { WkbTag, ListTable, Terminal, TerminalSplit, MenuTree } from "../packages";
const store = useStore();
const prefix = "ws://localhost/websocket/";
let index = 111;
let url = "";
const prmt = ref(">");
const flag = reactive({
termial: false
})
@ -27,6 +28,10 @@ const data = [ @@ -27,6 +28,10 @@ const data = [
{ caseName: 111, taskName: 111, userId: 'test', content: 'content', createTime: 'createTime' }
]
const menus = [
{ title: "aaa", path: "aaa", icon: "" }
]
const prop = [
{
code: "caseName",
@ -60,6 +65,16 @@ const newTerminal = () => { @@ -60,6 +65,16 @@ const newTerminal = () => {
flag.termial = true;
}
const msgFilter = msg => {
if (msg.startsWith("TTY_RES|")) {
const res = JSON.parse(msg.substring(8));
prmt.value = res.prmt;
return null;
} else {
return msg;
}
}
onMounted(() => {
});

7
package.json

@ -1,7 +1,6 @@ @@ -1,7 +1,6 @@
{
"name": "noob",
"version": "0.1.0",
"private": true,
"name": "noob-mengyxu",
"version": "0.1.1",
"main": "index.ts",
"scripts": {
"dev": "vue-cli-service serve",
@ -12,7 +11,7 @@ @@ -12,7 +11,7 @@
"axios": "^0.19.2",
"core-js": "^3.8.3",
"element-plus": "2.2.18",
"vue": "^3.2.13",
"vue": "^3.2.25",
"vue-class-component": "^8.0.0-0",
"vue-router": "^4.0.3",
"vuex": "^4.0.0",

4
packages/base/index.ts

@ -0,0 +1,4 @@ @@ -0,0 +1,4 @@
export * from './tag';
export * from './list-table';
export * from './search-row';
export * from './modify-form';

2
packages/base/list-table/index.ts

@ -0,0 +1,2 @@ @@ -0,0 +1,2 @@
import ListTable from './src/listTable.vue';
export { ListTable };

2
packages/list-table/src/listTable.vue → packages/base/list-table/src/listTable.vue

@ -21,7 +21,7 @@ @@ -21,7 +21,7 @@
<script lang="ts" setup>
import { useStore } from "vuex";
import { reactive, onMounted, ref, defineEmits, defineProps } from "vue";
import { reactive, onMounted, ref } from "vue";
const {
state: { dict },

2
packages/base/modify-form/index.ts

@ -0,0 +1,2 @@ @@ -0,0 +1,2 @@
import ModifyForm from './src/modifyForm.vue';
export { ModifyForm };

15
packages/modify-form/src/modifyForm.vue → packages/base/modify-form/src/modifyForm.vue

@ -41,6 +41,7 @@ const formConfirm = () => { @@ -41,6 +41,7 @@ const formConfirm = () => {
modifyForm.value?.validate((valid, fields) => {
if (valid) {
emit("confirm");
modifyForm.value?.clearValidate();
}
});
};
@ -58,9 +59,15 @@ onMounted(() => { @@ -58,9 +59,15 @@ onMounted(() => {
</script>
<style lang="scss" scoped>
//@import url(); css
.modify-form {
.el-select {
width: 100%;
}
::v-deep .el-select {
width: 100%;
}
::v-deep .el-date-editor {
width: 100% !important;
}
::v-deep .el-autocomplete {
width: 100%;
}
</style>

2
packages/base/search-row/index.ts

@ -0,0 +1,2 @@ @@ -0,0 +1,2 @@
import SearchRow from './src/searchRow.vue';
export { SearchRow };

0
packages/search-row/src/searchRow.vue → packages/base/search-row/src/searchRow.vue

4
packages/tag/index.ts → packages/base/tag/index.ts

@ -1,5 +1,5 @@ @@ -1,5 +1,5 @@
// import { PluginObject } from 'vue'
import WkbTag from './src/tag.vue'
import WkbTag from './src/tag.vue';
// const injectInstallObject: PluginObject<null> = {
// install(Vue) {
@ -14,4 +14,4 @@ import WkbTag from './src/tag.vue' @@ -14,4 +14,4 @@ import WkbTag from './src/tag.vue'
// injectInstallObject.install(window.Vue as any)
// }
export default WkbTag
export { WkbTag };

0
packages/tag/src/tag.vue → packages/base/tag/src/tag.vue

10
packages/index.ts

@ -1,7 +1,3 @@ @@ -1,7 +1,3 @@
import WkbTag from './tag';
import ListTable from './list-table';
import SearchRow from './search-row';
import ModifyForm from './modify-form';
import Terminal from './termimal';
export { WkbTag, ListTable, SearchRow, ModifyForm, Terminal };
export * from "./base";
export * from "./tool";
export * from "./manage";

2
packages/list-table/index.ts

@ -1,2 +0,0 @@ @@ -1,2 +0,0 @@
import listTable from "./src/listTable.vue"
export default listTable;

2
packages/manage/home/index.ts

@ -0,0 +1,2 @@ @@ -0,0 +1,2 @@
import Home from './src/home.vue';
export { Home };

102
packages/manage/home/src/home.vue

@ -0,0 +1,102 @@ @@ -0,0 +1,102 @@
<template>
<el-container :style="appMain">
<el-aside :width="sizes.asideWidth">
<MenuTree v-show="state.showAside" :data="data" :type="type"></MenuTree>
</el-aside>
<el-container>
<el-header class="app-head" :height="state.sizes.headHeight">
<Header v-show="state.showHeader" ref="header" />
</el-header>
<el-main class="app-main">
<router-view />
</el-main>
</el-container>
</el-container>
</template>
<script lang="ts" setup>
import { reactive, onMounted, ref } from "vue";
import { useStore } from "vuex";
import { useRouter } from "vue-router";
import { MenuTree } from "../../menu-tree"
const { commit, dispatch, state } = useStore();
const router = useRouter()
dispatch("getWebConfig");
const appMain = reactive({
height: "",
// backgroundImage: "url(" + publik.background + ")",
});
const flag = reactive({
showHeader: true,
showAside: true
})
const sizes = reactive({
fullHeight: '',
headHeight: '',
asideWidth: '',
mainHeight: ''
})
const props = defineProps({
data: {
type: Array<any>(),
default: null
},
type: {
type: String,
default: 'def',
},
});
onMounted(() => {
router.push("/")
commit("updateState", { prop: "showHeader", value: false });
commit("updateState", { prop: "showAside", value: false });
commit("initSizes");
appMain.height = state.sizes.fullHeight;
});
const initSizes = () => {
const height = window.innerHeight;
const navHead = flag.showHeader ? 60 : 0;
const aside = flag.showAside ? 200 : 0;
sizes.headHeight = navHead + 'px';
sizes.asideWidth = aside + 'px';
appMain.height = height + 'px';
};
</script>
<style lang='scss'>
@charset "UTF-8";
// @import "./assets/style/element.scss";
// @import "./assets/style/base.scss";
.app-main {
background-size: cover;
background-position: center;
background-repeat: no-repeat;
}
.el-header,
.main-head,
.main-table {
padding: 0;
}
#app {
background-color: #edf2f7;
}
.app-head {
padding: 0px !important;
}
.app-main {
padding: 0px !important;
}
</style>

2
packages/manage/index.ts

@ -0,0 +1,2 @@ @@ -0,0 +1,2 @@
export * from './menu-tree';
export * from "./home"

2
packages/manage/menu-tree/index.ts

@ -0,0 +1,2 @@ @@ -0,0 +1,2 @@
import MenuTree from './src/menuTree.vue';
export { MenuTree };

70
packages/manage/menu-tree/src/menuTree.vue

@ -0,0 +1,70 @@ @@ -0,0 +1,70 @@
<template>
<el-menu :default-active="active" class="menu-tree">
<template v-for="menu in data">
<template v-if="menu.children && menu.children.length > 0">
<el-sub-menu :index="menu.path" :key="menu.path">
<template #title>
<Icon :color="style[type].menuColor" :name="menu.icon ? menu.icon : style[type].menuDefaultIcon" />
<span>{{ menu.title ? menu.title : defTitle }}</span>
</template>
<menu-tree :menus="menu.children"></menu-tree>
</el-sub-menu>
</template>
<template v-else>
<el-menu-item :index="menu.path" :key="menu.path" @click="clickMenu(menu)">
<Icon :color="style[type].menuColor" :name="menu.icon ? menu.icon : style[type].menuDefaultIcon" />
<span>{{ menu.title ? menu.title : defTitle }}</span>
</el-menu-item>
</template>
</template>
</el-menu>
</template>
<script setup lang="ts">
import { useStore } from "vuex";
import { useRouter } from "vue-router";
import { ref, onMounted } from "vue"
import * as style from "./style";
const store = useStore()
const props = defineProps({
data: {
type: Array<any>(),
default: null
},
type: {
type: String,
default: 'def',
},
});
const router = useRouter();
const clickMenu = (menu) => {
router.push(menu.path);
};
const active = ref("");
const defTitle = "";
onMounted(() => {
active.value = props.data[0].path;
})
</script>
<style scoped lang="scss">
.el-sub-menu .icon,
.el-menu-item .icon {
vertical-align: middle;
margin-right: 5px;
width: 24px;
text-align: center;
}
.is-active>.icon {
color: var(--el-menu-active-color) !important;
}
.el-menu-item.is-active {
background-color: v-bind('style[type].menuActiveBackground');
}
</style>

23
packages/manage/menu-tree/src/style.ts

@ -0,0 +1,23 @@ @@ -0,0 +1,23 @@
export const def = {
/* 侧边菜单 */
// 侧边菜单背景色
menuBackground: '#ffffff',
// 侧边菜单文字颜色
menuColor: '#303133',
// 侧边菜单激活项背景色
menuActiveBackground: '#ffffff',
// 侧边菜单激活项文字色
menuActiveColor: '#409eff',
// 侧边菜单顶栏背景色
menuTopBarBackground: '#fcfcfc',
// 侧边菜单宽度(展开时),单位px
menuWidth: 260,
// 侧边菜单项默认图标
menuDefaultIcon: 'el-icon-Minus',
// 是否水平折叠收起菜单
menuCollapse: false,
// 是否只保持一个子菜单的展开(手风琴)
menuUniqueOpened: false,
// 显示菜单栏顶栏(LOGO)
menuShowTopBar: true,
};

2
packages/modify-form/index.ts

@ -1,2 +0,0 @@ @@ -1,2 +0,0 @@
import ModifyForm from "./src/modifyForm.vue"
export default ModifyForm;

2
packages/search-row/index.ts

@ -1,2 +0,0 @@ @@ -1,2 +0,0 @@
import SearchRow from "./src/searchRow.vue"
export default SearchRow;

3
packages/termimal/index.ts

@ -1,3 +0,0 @@ @@ -1,3 +0,0 @@
import Terminal from './src/terminal.vue'
export default Terminal

2
packages/tool/index.ts

@ -0,0 +1,2 @@ @@ -0,0 +1,2 @@
export * from './termimal';
export * from './termimal-split';

3
packages/tool/termimal-split/index.ts

@ -0,0 +1,3 @@ @@ -0,0 +1,3 @@
import TerminalSplit from './src/terminal.vue';
export { TerminalSplit };

198
packages/tool/termimal-split/src/terminal.vue

@ -0,0 +1,198 @@ @@ -0,0 +1,198 @@
<template>
<el-row>
<el-col :span="12">
<div id="terminal" v-loading="flag.loading" ref="terminal" element-loading-text="拼命连接中"
@click.right.native="showClear($event)"></div>
</el-col>
<el-col :span="12">
<div id="response" v-loading="flag.loading" ref="response" element-loading-text="拼命连接中"></div>
</el-col>
</el-row>
</template>
<script lang="ts" setup>
import { ref, onMounted, onBeforeUnmount, watch, reactive } from "vue";
import { Terminal } from "xterm";
import "xterm/css/xterm.css";
const prop = defineProps({
url: {
type: String,
default: null
},
msgFilter: {
type: Function,
defalut: msg => {
return { unlock: false, data: msg };
}
},
prmt: {
type: String,
default: ">"
}
});
const flag = reactive({
loading: true,
lock: true
});
const terminal = ref(null);
const response = ref(null);
const terminalSocket = ref();
const term = ref();
const rsp = ref();
let text = "";
const runRealTerminal = () => {
flag.loading = false;
term.value.write(prop.prmt);
flag.lock = false;
}
const onWSReceive = (message) => {
if (prop.msgFilter) {
const data = prop.msgFilter(message.data);
if (data) {
rsp.value.writeln(data)
} else {
flag.lock = false
term.value.write(prop.prmt)
}
} else {
rsp.value.writeln(message.data)
rsp.value.write(prop.prmt)
flag.lock = false;
}
}
const errorRealTerminal = (ex) => {
let message = ex.message;
if (!message) message = 'disconnected'
term.value.write(`\x1b[31m${message}\x1b[m\r\n`)
console.log("err");
}
const closeRealTerminal = () => {
console.log("close");
}
const initWS = () => {
if (!prop.url) {
return;
}
terminalSocket.value = new WebSocket(prop.url);
terminalSocket.value.onopen = runRealTerminal;
terminalSocket.value.onmessage = onWSReceive;
terminalSocket.value.onclose = closeRealTerminal;
terminalSocket.value.onerror = errorRealTerminal;
}
const onKey = e => {
if (flag.lock) {
return;
}
//\x1B ESC
//\x1BOP-\x1B[24~ F1-F12
const key = e.key;
if (key.indexOf("\u001b") !== -1) {
return;
}
if (isWsOpen()) {
if (key === '\x7F') {
if (text.length > 0) {
term.value.write("\b \b");
text = text.substring(0, text.length - 1)
}
return;
}
if (key == '\r') {
term.value.writeln(key)
if (e.domEvent.ctrlKey) {
text += key;
} else {
sendText(text);
text = "";
}
} else {
text += key
term.value.write(key)
}
}
}
const initTerm = () => {
const options = {
lineHeight: 1.2,
fontSize: 16,
fontFamily: "Monaco, Menlo, Consolas, 'Courier New', monospace",
theme: {
background: '#181d28',
},
//
cursorBlink: true,
cursorStyle: 'underline',
scrollback: 100,
tabStopWidth: 2,
cols: 80
}
options.cols = Math.ceil((window.innerWidth - 80) / 20)
term.value = new Terminal(options);
term.value.open(terminal.value);
term.value.onKey(onKey);
options.cursorBlink = false;
rsp.value = new Terminal(options);
rsp.value.open(response.value);
}
const sendText = str => {
if (str) {
terminalSocket.value.send(str);
flag.lock = true;
} else {
term.value.write(prop.prmt);
}
}
// 0 1 2 3
const isWsOpen = () => {
const readyState = terminalSocket.value && terminalSocket.value.readyState;
return readyState === 1
}
const showClear = e => {
//
document.oncontextmenu = function (e) {
e.preventDefault();
};
navigator.clipboard.readText().then(content => {
term.value.write(content)
text += content;
// sendText(content);
})
// term.value.clear();
}
//term
watch(() => prop.url, () => {
term.value.reset();
flag.loading = true;
flag.lock = false;
terminalSocket.value && terminalSocket.value.close();
terminalSocket.value = null;
initWS();
//
})
onMounted(() => {
initWS();
initTerm();
})
onBeforeUnmount(() => {
terminalSocket.value && terminalSocket.value.close();
term.value.dispose();
})
</script>
<style lang="scss" scoped>
#terminal {
width: 100%;
height: 100%;
}
</style>

3
packages/tool/termimal/index.ts

@ -0,0 +1,3 @@ @@ -0,0 +1,3 @@
import Terminal from './src/terminal.vue';
export { Terminal };

118
packages/termimal/src/terminal.vue → packages/tool/termimal/src/terminal.vue

@ -1,5 +1,6 @@ @@ -1,5 +1,6 @@
<template>
<div id="terminal" v-loading="flag.loading" ref="terminal" element-loading-text="拼命连接中"></div>
<div id="terminal" v-loading="flag.loading" ref="terminal" element-loading-text="拼命连接中"
@click.right.native="showClear($event)"></div>
</template>
<script lang="ts" setup>
import { ref, onMounted, onBeforeUnmount, watch, reactive } from "vue";
@ -9,6 +10,16 @@ const prop = defineProps({ @@ -9,6 +10,16 @@ const prop = defineProps({
url: {
type: String,
default: null
},
msgFilter: {
type: Function,
defalut: msg => {
return { unlock: false, data: msg };
}
},
prmt: {
type: String,
default: ">"
}
});
const flag = reactive({
@ -23,11 +34,24 @@ let text = ""; @@ -23,11 +34,24 @@ let text = "";
const runRealTerminal = () => {
flag.loading = false;
term.value.write(prop.prmt);
flag.lock = false;
}
const onWSReceive = (message) => {
term.value.write(message.data)
flag.lock = false;
if (prop.msgFilter) {
const data = prop.msgFilter(message.data);
if (data) {
term.value.writeln(data)
} else {
flag.lock = false
term.value.write(prop.prmt)
}
} else {
term.value.writeln(message.data)
term.value.write(prop.prmt)
flag.lock = false;
}
}
const errorRealTerminal = (ex) => {
@ -40,6 +64,39 @@ const closeRealTerminal = () => { @@ -40,6 +64,39 @@ const closeRealTerminal = () => {
console.log("close");
}
const onKey = e => {
if (flag.lock) {
return;
}
//\x1B ESC
//\x1BOP-\x1B[24~ F1-F12
const key = e.key;
if (key.indexOf("\u001b") !== -1) {
return;
}
if (isWsOpen()) {
if (key === '\x7F') {
if (text.length > 0) {
term.value.write("\b \b");
text = text.substring(0, text.length - 1)
}
return;
}
if (key == '\r') {
term.value.writeln(key)
if (e.domEvent.ctrlKey) {
text += key;
} else {
sendText(text);
text = "";
}
} else {
text += key
term.value.write(key)
}
}
}
const initWS = () => {
if (!prop.url) {
return;
@ -53,7 +110,7 @@ const initWS = () => { @@ -53,7 +110,7 @@ const initWS = () => {
const initTerm = () => {
term.value = new Terminal({
lineHeight: 1.2,
fontSize: 18,
fontSize: 16,
fontFamily: "Monaco, Menlo, Consolas, 'Courier New', monospace",
theme: {
background: '#181d28',
@ -62,47 +119,50 @@ const initTerm = () => { @@ -62,47 +119,50 @@ const initTerm = () => {
cursorBlink: true,
cursorStyle: 'underline',
scrollback: 100,
tabStopWidth: 4,
cols: 120
tabStopWidth: 2,
cols: Math.ceil((window.innerWidth - 80) / 10)
});
term.value.open(terminal.value);
term.value.onKey(e => {
if (flag.lock) {
return;
}
//\x1B ESC
//\x1BOP-\x1B[24~ F1-F12
const key = e.key;
if (key.indexOf("\u001b") !== -1) {
return;
}
console.log(e);
if (isWsOpen()) {
if (key == '\r') {
term.value.writeln(key)
terminalSocket.value.send(text);
text = "";
} else {
text += key
term.value.write(key)
}
}
});
term.value.onKey(onKey);
}
const sendText = str => {
if (str) {
terminalSocket.value.send(str);
flag.lock = true;
} else {
term.value.write(prop.prmt);
}
}
// 0 1 2 3
const isWsOpen = () => {
const readyState = terminalSocket.value && terminalSocket.value.readyState;
return readyState === 1
}
const showClear = e => {
//
document.oncontextmenu = function (e) {
e.preventDefault();
};
navigator.clipboard.readText().then(content => {
term.value.write(content)
text += content;
// sendText(content);
})
// term.value.clear();
}
//term
watch(() => prop.url, () => {
term.value.reset();
flag.loading = true;
flag.lock = false;
terminalSocket.value && terminalSocket.value.close();
terminalSocket.value = null;
initWS();
//
term.value.reset();
})
onMounted(() => {

10
plugs/axios.ts

@ -1,8 +1,6 @@ @@ -1,8 +1,6 @@
/* eslint-disable */
import axios from 'axios';
import { useStore } from 'vuex';
import { loading, close, showMessage } from './element';
const store = useStore();
const config = {
baseURL: process.env.VUE_APP_BASE_URL ? '/api' : '',
@ -18,6 +16,12 @@ _axios.defaults.headers.delete['Content-Type'] = @@ -18,6 +16,12 @@ _axios.defaults.headers.delete['Content-Type'] =
let curMsg: any;
let logout;
export const registerLogout = (method) => {
logout = method;
};
// Add a request interceptor
_axios.interceptors.request.use(
function (config) {
@ -155,7 +159,7 @@ function handResponse(response, resolve, noMsg, noLoading) { @@ -155,7 +159,7 @@ function handResponse(response, resolve, noMsg, noLoading) {
}
} else {
if (response.message == 'session timeout') {
store.dispatch('logout');
logout();
}
if (response.message == 'no permission') {
response.message = '您暂无权访问,请联系管理员添加';

2
plugs/element/index.ts

@ -0,0 +1,2 @@ @@ -0,0 +1,2 @@
export * from "./message";
export * from "./rule";

0
plugs/element.ts → plugs/element/message.ts

248
plugs/element/rule.ts

@ -0,0 +1,248 @@ @@ -0,0 +1,248 @@
export class SimpleRequired {
required = true;
message: string;
trigger = 'blur';
constructor(name?: string) {
if (name) {
this.message = '请输入' + name;
} else {
this.message = '此处不能为空';
}
}
}
export class SimpleCharacter {
required: boolean;
message: string;
max?: number;
trigger: string = 'blur';
constructor(name?: string, max?: number, required?: boolean) {
if (required == null || required == undefined) {
this.required = true;
} else {
this.required = required;
}
if (!max) {
max = 255;
}
this.max = max;
if (name) {
if (this.required) {
this.message = '请输入不超过' + max + '字符的' + name;
} else {
this.message = name + '最长不超过' + max + '字符';
}
} else {
this.message = '此处不能为空';
}
}
}
export class Character {
pattern: RegExp;
message: string = '输入格式不正确';
trigger = 'blur';
constructor(pattern: RegExp) {
this.pattern = pattern;
}
}
export class SimpleSelection {
required: boolean;
message: string;
trigger: string;
constructor(name?: string) {
this.required = true;
this.trigger = 'change';
if (name) {
this.message = '请选择' + name;
} else {
this.message = '此处不能为空';
}
}
}
export class SimpleNumber {
trigger: string = 'blur';
min?: Number;
max?: Number;
validator = (rule: any, value: any, callback: any) => {
if (value == null || value === '') {
callback();
}
if (!new RegExp(/^(0|-?[1-9]\d*)$/).test(value)) {
callback(new Error('请输入整数'));
}
const num = parseInt(value);
if (rule.min != null && num < rule.min) {
callback(new Error('最小值为' + rule.min));
}
if (rule.max != null && num > rule.max) {
callback(new Error('最大值为' + rule.max));
}
callback();
};
constructor(min?: number, max?: Number) {
this.min = min;
this.max = max;
}
}
export class Hexadecimal {
trigger = 'blur';
min?: Number;
max?: Number;
validator = (rule: any, value: any, callback: any) => {
if (value == null) {
callback();
} else if (
value.trim().length == 0 ||
!new RegExp(/^[0-9a-fA-F\s]+$/).test(value)
) {
callback(new Error('请输入十六进制数字'));
} else if (rule.min != null && value.length < rule.min) {
callback(new Error('请输入至少' + rule.min + '位'));
} else if (rule.max != null && value.length > rule.max) {
callback(new Error('请输入最多' + rule.max + '位'));
} else {
callback();
}
};
constructor(min?: number, max?: Number) {
this.min = min;
this.max = max;
}
}
export class Longitude extends Character {
constructor() {
super(
new RegExp(
/^-?((0|1?[0-7]?[0-9]?)(([.][0-9]{1,6})?)|180(([.][0]{1,6})?))$/
)
);
}
}
export class Latitude extends Character {
constructor() {
super(
new RegExp(
/^-?((0|1?[0-7]?[0-9]?)(([.][0-9]{1,6})?)|180(([.][0]{1,6})?))$/
)
);
}
}
export class Email extends Character {
constructor() {
super(
new RegExp(
/^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/
)
);
}
}
export class Phone extends Character {
constructor() {
super(
new RegExp(
/^(0|86|17951)?(13[0-9]|15[012356789]|17[0135678]|18[0-9]|14[57])[0-9]{8}$/
)
);
}
}
export class Ipv4 extends Character {
constructor() {
super(new RegExp(/^((25[0-5]|2[0-4]\d|[01]?\d\d?)($|(?!\.$)\.)){4}$/));
}
}
export class Ipv6 extends Character {
constructor() {
super(
new RegExp(
/^([0-9a-fA-F]{1,4}:){7,7}([0-9a-fA-F]{1,4}|:)|([0-9a-fA-F]{1,4}:){1,6}(:[0-9a-fA-F]{1,4}|:)|([0-9a-fA-F]{1,4}:){1,5}((:[0-9a-fA-F]{1,4}){1,2}|:)|([0-9a-fA-F]{1,4}:){1,4}((:[0-9a-fA-F]{1,4}){1,3}|:)|([0-9a-fA-F]{1,4}:){1,3}((:[0-9a-fA-F]{1,4}){1,4}|:)|([0-9a-fA-F]{1,4}:){1,2}((:[0-9a-fA-F]{1,4}){1,5}|:)|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6}|:)|:((:[0-9a-fA-F]{1,4}){1,7}|:)/
)
);
}
}
export class IdCard {
trigger = 'blur';
validator = (rule: any, value: any, callback: any) => {
if (value != null && value.length != 0) {
let iSum = 0;
const aCity = {
11: '北京',
12: '天津',
13: '河北',
14: '山西',
15: '内蒙古',
21: '辽宁',
22: '吉林',
23: '黑龙江',
31: '上海',
32: '江苏',
33: '浙江',
34: '安徽',
35: '福建',
36: '江西',
37: '山东',
41: '河南',
42: '湖北',
43: '湖南',
44: '广东',
45: '广西',
46: '海南',
50: '重庆',
51: '四川',
52: '贵州',
53: '云南',
54: '西藏',
61: '陕西',
62: '甘肃',
63: '青海',
64: '宁夏',
65: '新疆',
71: '台湾',
81: '香港',
82: '澳门',
91: '国外',
};
if (!/^\d{17}(\d|x)$/i.test(value)) {
callback(new Error('你输入的身份证长度或格式错误'));
}
value = value.replace(/x$/i, 'a');
if (aCity[parseInt(value.substr(0, 2))] == null) {
callback(new Error('你的身份证地区非法'));
}
const sBirthday =
value.substr(6, 4) +
'-' +
Number(value.substr(10, 2)) +
'-' +
Number(value.substr(12, 2));
const d = new Date(sBirthday.replace(/-/g, '/'));
if (
sBirthday !=
d.getFullYear() + '-' + (d.getMonth() + 1) + '-' + d.getDate()
) {
callback(new Error('身份证上的出生日期非法'));
}
for (let i = 17; i >= 0; i--) {
iSum += (Math.pow(2, i) % 11) * parseInt(value.charAt(17 - i), 11);
}
if (iSum % 11 != 1) {
callback(new Error('你输入的身份证号非法'));
}
}
callback();
};
}

8
tsconfig.json

@ -13,13 +13,13 @@ @@ -13,13 +13,13 @@
"useDefineForClassFields": true,
"noImplicitAny": false,
"sourceMap": true,
"baseUrl": ".",
"baseUrl": "./",
"types": [
"webpack-env"
],
"paths": {
"@/*": [
"/*"
"@/": [
"./"
]
},
"lib": [
@ -32,7 +32,7 @@ @@ -32,7 +32,7 @@
"include": [
"examples/**/*.ts",
"examples/**/*.tsx",
// "examples/**/*.vue",
"examples/**/*.vue",
"packages/**/*.ts",
"packages/**/*.tsx",
"packages/**/*.vue"

190
yarn.lock

@ -275,7 +275,12 @@ @@ -275,7 +275,12 @@
chalk "^2.0.0"
js-tokens "^4.0.0"
"@babel/parser@^7.16.4", "@babel/parser@^7.20.7", "@babel/parser@^7.21.4":
"@babel/parser@^7.20.15", "@babel/parser@^7.21.3":
version "7.22.7"
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.7.tgz#df8cf085ce92ddbdbf668a7f186ce848c9036cae"
integrity sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==
"@babel/parser@^7.20.7", "@babel/parser@^7.21.4":
version "7.21.4"
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.21.4.tgz#94003fdfc520bbe2875d4ae557b43ddb6d880f17"
integrity sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw==
@ -1027,7 +1032,7 @@ @@ -1027,7 +1032,7 @@
resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24"
integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==
"@jridgewell/sourcemap-codec@^1.4.10":
"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.15":
version "1.4.15"
resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32"
integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==
@ -1548,47 +1553,47 @@ @@ -1548,47 +1553,47 @@
semver "^7.3.4"
strip-ansi "^6.0.0"
"@vue/compiler-core@3.2.47":
version "3.2.47"
resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.2.47.tgz#3e07c684d74897ac9aa5922c520741f3029267f8"
integrity sha512-p4D7FDnQb7+YJmO2iPEv0SQNeNzcbHdGByJDsT4lynf63AFkOTFN07HsiRSvjGo0QrxR/o3d0hUyNCUnBU2Tig==
"@vue/compiler-core@3.3.4":
version "3.3.4"
resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.3.4.tgz#7fbf591c1c19e1acd28ffd284526e98b4f581128"
integrity sha512-cquyDNvZ6jTbf/+x+AgM2Arrp6G4Dzbb0R64jiG804HRMfRiFXWI6kqUVqZ6ZR0bQhIoQjB4+2bhNtVwndW15g==
dependencies:
"@babel/parser" "^7.16.4"
"@vue/shared" "3.2.47"
"@babel/parser" "^7.21.3"
"@vue/shared" "3.3.4"
estree-walker "^2.0.2"
source-map "^0.6.1"
source-map-js "^1.0.2"
"@vue/compiler-dom@3.2.47":
version "3.2.47"
resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.2.47.tgz#a0b06caf7ef7056939e563dcaa9cbde30794f305"
integrity sha512-dBBnEHEPoftUiS03a4ggEig74J2YBZ2UIeyfpcRM2tavgMWo4bsEfgCGsu+uJIL/vax9S+JztH8NmQerUo7shQ==
dependencies:
"@vue/compiler-core" "3.2.47"
"@vue/shared" "3.2.47"
"@vue/compiler-sfc@3.2.47":
version "3.2.47"
resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.2.47.tgz#1bdc36f6cdc1643f72e2c397eb1a398f5004ad3d"
integrity sha512-rog05W+2IFfxjMcFw10tM9+f7i/+FFpZJJ5XHX72NP9eC2uRD+42M3pYcQqDXVYoj74kHMSEdQ/WmCjt8JFksQ==
dependencies:
"@babel/parser" "^7.16.4"
"@vue/compiler-core" "3.2.47"
"@vue/compiler-dom" "3.2.47"
"@vue/compiler-ssr" "3.2.47"
"@vue/reactivity-transform" "3.2.47"
"@vue/shared" "3.2.47"
"@vue/compiler-dom@3.3.4":
version "3.3.4"
resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.3.4.tgz#f56e09b5f4d7dc350f981784de9713d823341151"
integrity sha512-wyM+OjOVpuUukIq6p5+nwHYtj9cFroz9cwkfmP9O1nzH68BenTTv0u7/ndggT8cIQlnBeOo6sUT/gvHcIkLA5w==
dependencies:
"@vue/compiler-core" "3.3.4"
"@vue/shared" "3.3.4"
"@vue/compiler-sfc@3.3.4":
version "3.3.4"
resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.3.4.tgz#b19d942c71938893535b46226d602720593001df"
integrity sha512-6y/d8uw+5TkCuzBkgLS0v3lSM3hJDntFEiUORM11pQ/hKvkhSKZrXW6i69UyXlJQisJxuUEJKAWEqWbWsLeNKQ==
dependencies:
"@babel/parser" "^7.20.15"
"@vue/compiler-core" "3.3.4"
"@vue/compiler-dom" "3.3.4"
"@vue/compiler-ssr" "3.3.4"
"@vue/reactivity-transform" "3.3.4"
"@vue/shared" "3.3.4"
estree-walker "^2.0.2"
magic-string "^0.25.7"
magic-string "^0.30.0"
postcss "^8.1.10"
source-map "^0.6.1"
source-map-js "^1.0.2"
"@vue/compiler-ssr@3.2.47":
version "3.2.47"
resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.2.47.tgz#35872c01a273aac4d6070ab9d8da918ab13057ee"
integrity sha512-wVXC+gszhulcMD8wpxMsqSOpvDZ6xKXSVWkf50Guf/S+28hTAXPDYRTbLQ3EDkOP5Xz/+SY37YiwDquKbJOgZw==
"@vue/compiler-ssr@3.3.4":
version "3.3.4"
resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.3.4.tgz#9d1379abffa4f2b0cd844174ceec4a9721138777"
integrity sha512-m0v6oKpup2nMSehwA6Uuu+j+wEwcy7QmwMkVNVfrV9P2qE5KshC6RwOCq8fjGS/Eak/uNb8AaWekfiXxbBB6gQ==
dependencies:
"@vue/compiler-dom" "3.2.47"
"@vue/shared" "3.2.47"
"@vue/compiler-dom" "3.3.4"
"@vue/shared" "3.3.4"
"@vue/component-compiler-utils@^3.1.0", "@vue/component-compiler-utils@^3.3.0":
version "3.3.0"
@ -1611,53 +1616,53 @@ @@ -1611,53 +1616,53 @@
resolved "https://registry.yarnpkg.com/@vue/devtools-api/-/devtools-api-6.5.0.tgz#98b99425edee70b4c992692628fa1ea2c1e57d07"
integrity sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q==
"@vue/reactivity-transform@3.2.47":
version "3.2.47"
resolved "https://registry.yarnpkg.com/@vue/reactivity-transform/-/reactivity-transform-3.2.47.tgz#e45df4d06370f8abf29081a16afd25cffba6d84e"
integrity sha512-m8lGXw8rdnPVVIdIFhf0LeQ/ixyHkH5plYuS83yop5n7ggVJU+z5v0zecwEnX7fa7HNLBhh2qngJJkxpwEEmYA==
"@vue/reactivity-transform@3.3.4":
version "3.3.4"
resolved "https://registry.yarnpkg.com/@vue/reactivity-transform/-/reactivity-transform-3.3.4.tgz#52908476e34d6a65c6c21cd2722d41ed8ae51929"
integrity sha512-MXgwjako4nu5WFLAjpBnCj/ieqcjE2aJBINUNQzkZQfzIZA4xn+0fV1tIYBJvvva3N3OvKGofRLvQIwEQPpaXw==
dependencies:
"@babel/parser" "^7.16.4"
"@vue/compiler-core" "3.2.47"
"@vue/shared" "3.2.47"
"@babel/parser" "^7.20.15"
"@vue/compiler-core" "3.3.4"
"@vue/shared" "3.3.4"
estree-walker "^2.0.2"
magic-string "^0.25.7"
magic-string "^0.30.0"
"@vue/reactivity@3.2.47":
version "3.2.47"
resolved "https://registry.yarnpkg.com/@vue/reactivity/-/reactivity-3.2.47.tgz#1d6399074eadfc3ed35c727e2fd707d6881140b6"
integrity sha512-7khqQ/75oyyg+N/e+iwV6lpy1f5wq759NdlS1fpAhFXa8VeAIKGgk2E/C4VF59lx5b+Ezs5fpp/5WsRYXQiKxQ==
"@vue/reactivity@3.3.4":
version "3.3.4"
resolved "https://registry.yarnpkg.com/@vue/reactivity/-/reactivity-3.3.4.tgz#a27a29c6cd17faba5a0e99fbb86ee951653e2253"
integrity sha512-kLTDLwd0B1jG08NBF3R5rqULtv/f8x3rOFByTDz4J53ttIQEDmALqKqXY0J+XQeN0aV2FBxY8nJDf88yvOPAqQ==
dependencies:
"@vue/shared" "3.2.47"
"@vue/shared" "3.3.4"
"@vue/runtime-core@3.2.47":
version "3.2.47"
resolved "https://registry.yarnpkg.com/@vue/runtime-core/-/runtime-core-3.2.47.tgz#406ebade3d5551c00fc6409bbc1eeb10f32e121d"
integrity sha512-RZxbLQIRB/K0ev0K9FXhNbBzT32H9iRtYbaXb0ZIz2usLms/D55dJR2t6cIEUn6vyhS3ALNvNthI+Q95C+NOpA==
"@vue/runtime-core@3.3.4":
version "3.3.4"
resolved "https://registry.yarnpkg.com/@vue/runtime-core/-/runtime-core-3.3.4.tgz#4bb33872bbb583721b340f3088888394195967d1"
integrity sha512-R+bqxMN6pWO7zGI4OMlmvePOdP2c93GsHFM/siJI7O2nxFRzj55pLwkpCedEY+bTMgp5miZ8CxfIZo3S+gFqvA==
dependencies:
"@vue/reactivity" "3.2.47"
"@vue/shared" "3.2.47"
"@vue/reactivity" "3.3.4"
"@vue/shared" "3.3.4"
"@vue/runtime-dom@3.2.47":
version "3.2.47"
resolved "https://registry.yarnpkg.com/@vue/runtime-dom/-/runtime-dom-3.2.47.tgz#93e760eeaeab84dedfb7c3eaf3ed58d776299382"
integrity sha512-ArXrFTjS6TsDei4qwNvgrdmHtD930KgSKGhS5M+j8QxXrDJYLqYw4RRcDy1bz1m1wMmb6j+zGLifdVHtkXA7gA==
"@vue/runtime-dom@3.3.4":
version "3.3.4"
resolved "https://registry.yarnpkg.com/@vue/runtime-dom/-/runtime-dom-3.3.4.tgz#992f2579d0ed6ce961f47bbe9bfe4b6791251566"
integrity sha512-Aj5bTJ3u5sFsUckRghsNjVTtxZQ1OyMWCr5dZRAPijF/0Vy4xEoRCwLyHXcj4D0UFbJ4lbx3gPTgg06K/GnPnQ==
dependencies:
"@vue/runtime-core" "3.2.47"
"@vue/shared" "3.2.47"
csstype "^2.6.8"
"@vue/runtime-core" "3.3.4"
"@vue/shared" "3.3.4"
csstype "^3.1.1"
"@vue/server-renderer@3.2.47":
version "3.2.47"
resolved "https://registry.yarnpkg.com/@vue/server-renderer/-/server-renderer-3.2.47.tgz#8aa1d1871fc4eb5a7851aa7f741f8f700e6de3c0"
integrity sha512-dN9gc1i8EvmP9RCzvneONXsKfBRgqFeFZLurmHOveL7oH6HiFXJw5OGu294n1nHc/HMgTy6LulU/tv5/A7f/LA==
"@vue/server-renderer@3.3.4":
version "3.3.4"
resolved "https://registry.yarnpkg.com/@vue/server-renderer/-/server-renderer-3.3.4.tgz#ea46594b795d1536f29bc592dd0f6655f7ea4c4c"
integrity sha512-Q6jDDzR23ViIb67v+vM1Dqntu+HUexQcsWKhhQa4ARVzxOY2HbC7QRW/ggkDBd5BU+uM1sV6XOAP0b216o34JQ==
dependencies:
"@vue/compiler-ssr" "3.2.47"
"@vue/shared" "3.2.47"
"@vue/compiler-ssr" "3.3.4"
"@vue/shared" "3.3.4"
"@vue/shared@3.2.47":
version "3.2.47"
resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.2.47.tgz#e597ef75086c6e896ff5478a6bfc0a7aa4bbd14c"
integrity sha512-BHGyyGN3Q97EZx0taMQ+OLNuZcW3d37ZEVmEAyeoA9ERdGvm9Irc/0Fua8SNyOtV1w6BS4q25wbMzJujO9HIfQ==
"@vue/shared@3.3.4":
version "3.3.4"
resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.3.4.tgz#06e83c5027f464eef861c329be81454bc8b70780"
integrity sha512-7OjdcV8vQ74eiz1TZLzZP4JwqM5fA94K6yntPS5Z25r9HDuGNzaGdgvwKYq6S+MxwF0TFRwe50fIR/MYnakdkQ==
"@vue/vue-loader-v15@npm:vue-loader@^15.9.7":
version "15.10.1"
@ -2630,10 +2635,10 @@ csso@^4.2.0: @@ -2630,10 +2635,10 @@ csso@^4.2.0:
dependencies:
css-tree "^1.1.2"
csstype@^2.6.8:
version "2.6.21"
resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.21.tgz#2efb85b7cc55c80017c66a5ad7cbd931fda3a90e"
integrity sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==
csstype@^3.1.1:
version "3.1.2"
resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b"
integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==
dayjs@^1.11.3:
version "1.11.7"
@ -3866,12 +3871,12 @@ lru-cache@^6.0.0: @@ -3866,12 +3871,12 @@ lru-cache@^6.0.0:
dependencies:
yallist "^4.0.0"
magic-string@^0.25.7:
version "0.25.9"
resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.9.tgz#de7f9faf91ef8a1c91d02c2e5314c8277dbcdd1c"
integrity sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==
magic-string@^0.30.0:
version "0.30.1"
resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.1.tgz#ce5cd4b0a81a5d032bd69aab4522299b2166284d"
integrity sha512-mbVKXPmS0z0G4XqFDCTllmDQ6coZzn94aMlb0o/A4HEHJCKcanlDZwYJgwnkmgD3jyWhUgj9VsPrfd972yPffA==
dependencies:
sourcemap-codec "^1.4.8"
"@jridgewell/sourcemap-codec" "^1.4.15"
make-dir@^3.0.2, make-dir@^3.1.0:
version "3.1.0"
@ -5160,11 +5165,6 @@ source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: @@ -5160,11 +5165,6 @@ source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1:
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
sourcemap-codec@^1.4.8:
version "1.4.8"
resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4"
integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==
spdx-correct@^3.0.0:
version "3.2.0"
resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.2.0.tgz#4f5ab0668f0059e34f9c00dce331784a12de4e9c"
@ -5599,16 +5599,16 @@ vue-template-es2015-compiler@^1.9.0: @@ -5599,16 +5599,16 @@ vue-template-es2015-compiler@^1.9.0:
resolved "https://registry.yarnpkg.com/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.9.1.tgz#1ee3bc9a16ecbf5118be334bb15f9c46f82f5825"
integrity sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==
vue@^3.2.13:
version "3.2.47"
resolved "https://registry.yarnpkg.com/vue/-/vue-3.2.47.tgz#3eb736cbc606fc87038dbba6a154707c8a34cff0"
integrity sha512-60188y/9Dc9WVrAZeUVSDxRQOZ+z+y5nO2ts9jWXSTkMvayiWxCWOWtBQoYjLeccfXkiiPZWAHcV+WTPhkqJHQ==
vue@^3.2.25:
version "3.3.4"
resolved "https://registry.yarnpkg.com/vue/-/vue-3.3.4.tgz#8ed945d3873667df1d0fcf3b2463ada028f88bd6"
integrity sha512-VTyEYn3yvIeY1Py0WaYGZsXnz3y5UnGi62GjVEqvEGPl6nxbOrCXbVOTQWBEJUqAyTUk2uJ5JLVnYJ6ZzGbrSw==
dependencies:
"@vue/compiler-dom" "3.2.47"
"@vue/compiler-sfc" "3.2.47"
"@vue/runtime-dom" "3.2.47"
"@vue/server-renderer" "3.2.47"
"@vue/shared" "3.2.47"
"@vue/compiler-dom" "3.3.4"
"@vue/compiler-sfc" "3.3.4"
"@vue/runtime-dom" "3.3.4"
"@vue/server-renderer" "3.3.4"
"@vue/shared" "3.3.4"
vuex@^4.0.0:
version "4.1.0"

Loading…
Cancel
Save