From 4cddaee88af5b2996a95e5b65229a3d39b47c6fe Mon Sep 17 00:00:00 2001 From: vben Date: Sat, 8 Apr 2023 00:01:05 +0800 Subject: [PATCH] refactor: @vben/shared --- .nvmrc | 1 + .prettierignore | 1 + .vscode/settings.json | 2 +- internal/eslint-config/src/index.ts | 1 + internal/eslint-config/src/strict.ts | 13 ++- .../vite-config/src/config/application.ts | 3 +- package.json | 1 + packages/shared/package.json | 8 +- packages/shared/src/index.ts | 1 + packages/shared/src/types.ts | 75 ++++++++++++++ pnpm-lock.yaml | 13 ++- .../Application/src/search/useMenuSearch.ts | 5 +- src/components/Basic/src/BasicHelp.vue | 2 +- src/components/CardList/src/CardList.vue | 2 +- src/components/CodeEditor/src/CodeEditor.vue | 4 +- .../ContextMenu/src/createContextMenu.ts | 4 - src/components/CountDown/src/CountButton.vue | 4 +- src/components/CountTo/src/CountTo.vue | 2 +- src/components/Cropper/src/CopperModal.vue | 2 +- .../Description/src/Description.vue | 2 +- src/components/Drawer/src/BasicDrawer.vue | 2 +- src/components/Drawer/src/useDrawer.ts | 2 +- src/components/Dropdown/src/Dropdown.vue | 2 +- src/components/Form/src/BasicForm.vue | 4 +- .../Form/src/components/ApiCascader.vue | 6 +- .../Form/src/components/ApiRadioGroup.vue | 4 +- .../Form/src/components/ApiSelect.vue | 4 +- .../Form/src/components/ApiTransfer.vue | 10 +- .../Form/src/components/ApiTree.vue | 2 +- .../Form/src/components/ApiTreeSelect.vue | 2 +- .../Form/src/components/FormItem.vue | 13 +-- .../Form/src/components/RadioButtonGroup.vue | 2 +- src/components/Form/src/helper.ts | 2 +- src/components/Form/src/hooks/useAdvanced.ts | 2 +- .../Form/src/hooks/useFormEvents.ts | 18 ++-- .../Form/src/hooks/useFormValues.ts | 6 +- .../Form/src/hooks/useLabelWidth.ts | 2 +- src/components/Icon/Icon.vue | 2 +- src/components/Icon/src/IconPicker.vue | 3 +- src/components/Menu/src/BasicMenu.vue | 2 +- src/components/Modal/src/BasicModal.vue | 9 +- src/components/Modal/src/hooks/useModal.ts | 2 +- src/components/Preview/src/Preview.vue | 2 +- src/components/Preview/src/functional.ts | 2 - src/components/Qrcode/src/drawLogo.ts | 2 +- src/components/Scrollbar/src/Scrollbar.vue | 3 +- src/components/SimpleMenu/src/SimpleMenu.vue | 5 +- .../SimpleMenu/src/components/SubMenuItem.vue | 4 +- src/components/Table/src/BasicTable.vue | 2 +- .../Table/src/components/TableAction.vue | 2 +- .../Table/src/components/TableFooter.vue | 13 +-- .../Table/src/components/TableTitle.vue | 2 +- .../src/components/editable/EditableCell.vue | 2 +- .../Table/src/components/editable/index.ts | 2 +- .../src/components/settings/ColumnSetting.vue | 4 +- src/components/Table/src/hooks/useColumns.ts | 2 +- .../Table/src/hooks/useCustomRow.ts | 2 +- .../Table/src/hooks/useDataSource.ts | 8 +- .../Table/src/hooks/usePagination.tsx | 2 +- .../Table/src/hooks/useRowSelection.ts | 2 +- .../Table/src/hooks/useTableForm.ts | 2 +- .../Table/src/hooks/useTableHeader.ts | 2 +- .../Table/src/hooks/useTableScroll.ts | 2 +- .../Table/src/hooks/useTableStyle.ts | 2 +- src/components/Time/src/Time.vue | 2 +- src/components/Tinymce/src/Editor.vue | 4 +- src/components/Tree/src/BasicTree.vue | 9 +- src/components/Tree/src/TreeIcon.ts | 2 +- src/components/Upload/src/BasicUpload.vue | 2 +- src/components/Upload/src/FileList.vue | 2 +- src/components/Upload/src/UploadModal.vue | 2 +- .../Upload/src/UploadPreviewModal.vue | 2 +- src/directives/clickOutside.ts | 18 ++-- src/hooks/event/useScroll.ts | 2 +- src/hooks/web/useContentHeight.ts | 2 +- src/hooks/web/useCopyToClipboard.ts | 5 +- src/hooks/web/useMessage.tsx | 2 +- src/hooks/web/usePermission.ts | 2 +- src/hooks/web/useWatermark.ts | 8 +- .../default/header/components/Breadcrumb.vue | 2 +- .../header/components/notify/NoticeList.vue | 3 +- src/layouts/default/menu/index.vue | 4 +- src/layouts/default/tabs/useMultipleTabs.ts | 3 +- src/router/helper/menuHelper.ts | 4 +- src/router/menus/index.ts | 6 +- src/router/routes/index.ts | 3 +- src/store/modules/user.ts | 2 +- src/utils/bem.ts | 3 +- src/utils/cache/storageCache.ts | 6 +- src/utils/event/index.ts | 3 - src/utils/helper/treeHelper.ts | 4 +- src/utils/helper/tsxHelper.tsx | 2 +- src/utils/http/axios/Axios.ts | 4 +- src/utils/http/axios/helper.ts | 2 +- src/utils/http/axios/index.ts | 4 +- src/utils/index.ts | 2 +- src/utils/is.ts | 98 ------------------- src/utils/props.ts | 3 +- src/views/demo/tree/index.vue | 3 +- .../components/FormItemColumnProps.vue | 2 +- .../VFormDesign/components/FormItemProps.vue | 2 +- .../VFormDesign/components/RuleProps.vue | 2 +- src/views/form-design/core/formItemConfig.ts | 2 +- .../hooks/useFormInstanceMethods.ts | 3 +- .../form-design/hooks/useVFormMethods.ts | 3 +- src/views/form-design/utils/index.ts | 4 +- src/views/sys/redirect/index.vue | 3 +- 107 files changed, 287 insertions(+), 275 deletions(-) create mode 100644 .nvmrc create mode 100644 packages/shared/src/types.ts delete mode 100644 src/utils/is.ts diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 00000000..3f430af8 --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +v18 diff --git a/.prettierignore b/.prettierignore index a1759d04..38279529 100644 --- a/.prettierignore +++ b/.prettierignore @@ -2,6 +2,7 @@ dist .local .output.js node_modules +.nvmrc **/*.svg **/*.sh diff --git a/.vscode/settings.json b/.vscode/settings.json index 378cd3b2..b398198e 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -165,7 +165,7 @@ "*.tsx": "$(capture).test.ts, $(capture).test.tsx", "*.env": "$(capture).env.*", "CHANGELOG.md": "CHANGELOG*", - "package.json": "pnpm-lock.yaml,pnpm-workspace.yaml,LICENSE,.gitattributes,.gitignore,.gitpod.yml,CNAME,README*,.npmrc,.browserslistrc", + "package.json": "pnpm-lock.yaml,pnpm-workspace.yaml,LICENSE,.gitattributes,.gitignore,.gitpod.yml,CNAME,README*,.npmrc,.browserslistrc,.nvmrc", ".eslintrc.js": ".eslintignore,.prettierignore,.stylelintignore,.commitlintrc.js,.prettierrc.js,.stylelintrc.js" }, "terminal.integrated.scrollback": 10000 diff --git a/internal/eslint-config/src/index.ts b/internal/eslint-config/src/index.ts index 1138bb37..3d3b269e 100644 --- a/internal/eslint-config/src/index.ts +++ b/internal/eslint-config/src/index.ts @@ -63,6 +63,7 @@ export default { 'vue/attribute-hyphenation': 'off', 'vue/require-default-prop': 'off', 'vue/require-explicit-emits': 'off', + 'vue/prefer-import-from-vue': 'off', 'vue/html-self-closing': [ 'error', { diff --git a/internal/eslint-config/src/strict.ts b/internal/eslint-config/src/strict.ts index 5dbf5b70..4331b2b9 100644 --- a/internal/eslint-config/src/strict.ts +++ b/internal/eslint-config/src/strict.ts @@ -1,10 +1,13 @@ export default { - extends: ['@vben'], + extends: ['@vben', 'plugin:import/recommended'], plugins: ['simple-import-sort'], rules: { + 'object-shorthand': ['error', 'always', { ignoreConstructors: false, avoidQuotes: true }], + + 'import/no-unresolved': 'off', + 'simple-import-sort/imports': 'error', 'simple-import-sort/exports': 'error', - '@typescript-eslint/ban-ts-comment': [ 'error', { @@ -54,4 +57,10 @@ export default { 'vue/attributes-order': 'error', 'vue/require-default-prop': 'error', }, + + settings: { + 'import/resolver': { + node: { extensions: ['.ts', '.d.ts', '.tsx'] }, + }, + }, }; diff --git a/internal/vite-config/src/config/application.ts b/internal/vite-config/src/config/application.ts index 92c69342..22d3393e 100644 --- a/internal/vite-config/src/config/application.ts +++ b/internal/vite-config/src/config/application.ts @@ -71,7 +71,8 @@ function defineApplicationConfig(defineOptions: DefineOptions = {}) { output: { manualChunks: { vue: ['vue', 'pinia', 'vue-router'], - antd: ['ant-design-vue', '@ant-design/icons-vue'], + // antd: ['ant-design-vue', '@ant-design/icons-vue'], + // vxe: ['vxe-table', 'vxe-table-plugin-export-xlsx', 'xe-utils'], }, }, }, diff --git a/package.json b/package.json index de0677b4..81f55413 100644 --- a/package.json +++ b/package.json @@ -71,6 +71,7 @@ "@logicflow/core": "^1.2.1", "@logicflow/extension": "^1.2.1", "@vben/hooks": "workspace:*", + "@vben/shared": "workspace:*", "@vue/shared": "^3.2.47", "@vueuse/core": "^9.13.0", "@vueuse/shared": "^9.13.0", diff --git a/packages/shared/package.json b/packages/shared/package.json index a203e49f..16fea308 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -28,6 +28,10 @@ "clean": "pnpm rimraf .turbo node_modules dist", "lint": "pnpm eslint ." }, - "dependencies": {}, - "devDependencies": {} + "dependencies": { + "vue": "^3.2.47" + }, + "devDependencies": { + "@vue/shared": "^3.2.47" + } } diff --git a/packages/shared/src/index.ts b/packages/shared/src/index.ts index e69de29b..fcb073fe 100644 --- a/packages/shared/src/index.ts +++ b/packages/shared/src/index.ts @@ -0,0 +1 @@ +export * from './types'; diff --git a/packages/shared/src/types.ts b/packages/shared/src/types.ts new file mode 100644 index 00000000..ba6029c0 --- /dev/null +++ b/packages/shared/src/types.ts @@ -0,0 +1,75 @@ +import { isArray, isFunction, isObject, isString } from '@vue/shared'; +import { isBoolean, isNumber } from '@vueuse/core'; + +const toString = Object.prototype.toString; + +function is(val: unknown, type: string) { + return toString.call(val) === `[object ${type}]`; +} + +function isUndefined(val: unknown): val is undefined { + return val === undefined; +} + +function isNull(val: unknown): val is null { + return val === null; +} + +function isNullOrUndefined(val: unknown): val is undefined | null { + return isUndefined(val) || isNull(val); +} + +function isEmpty(val: T): val is T { + if (!val && val !== 0) { + return true; + } + + if (isArray(val) || isString(val)) { + return val.length === 0; + } + + if (val instanceof Map || val instanceof Set) { + return val.size === 0; + } + + if (isObject(val)) { + return Object.keys(val).length === 0; + } + + return false; +} + +/** + * 判断所给字符串是否为url类型,这里只判断是否 http/http,其他格式不支持 + * @param pathname + * @returns + */ +function isHttpUrl(pathname: string): boolean { + const reg = /^http(s)?:\/\/([\w-]+\.)+[\w-]+(\/[\w- ./?%&=]*)?/; + return reg.test(pathname); +} + +function isMap(val: unknown): val is Map { + return is(val, 'Map'); +} + +function isWindow(val: any): val is Window { + return typeof window !== 'undefined' && is(val, 'Window'); +} + +export { + is, + isArray, + isBoolean, + isEmpty, + isFunction, + isHttpUrl, + isMap, + isNull, + isNullOrUndefined, + isNumber, + isObject, + isString, + isUndefined, + isWindow, +}; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5e83847e..f0807e39 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -19,6 +19,9 @@ importers: '@vben/hooks': specifier: workspace:* version: link:packages/hooks + '@vben/shared': + specifier: workspace:* + version: link:packages/shared '@vue/shared': specifier: ^3.2.47 version: 3.2.47 @@ -471,7 +474,15 @@ importers: specifier: workspace:* version: link:../types - packages/shared: {} + packages/shared: + dependencies: + vue: + specifier: ^3.2.47 + version: 3.2.47 + devDependencies: + '@vue/shared': + specifier: ^3.2.47 + version: 3.2.47 packages/types: dependencies: diff --git a/src/components/Application/src/search/useMenuSearch.ts b/src/components/Application/src/search/useMenuSearch.ts index c9387923..e8188ad9 100644 --- a/src/components/Application/src/search/useMenuSearch.ts +++ b/src/components/Application/src/search/useMenuSearch.ts @@ -6,6 +6,7 @@ import { cloneDeep } from 'lodash-es'; import { filter, forEach } from '/@/utils/helper/treeHelper'; import { useGo } from '/@/hooks/web/usePage'; import { useScrollTo } from '@vben/hooks'; +import { isArray } from '@vben/shared'; import { onKeyStroke, useDebounceFn } from '@vueuse/core'; import { useI18n } from '/@/hooks/web/useI18n'; @@ -73,7 +74,7 @@ export function useMenuSearch(refs: Ref, scrollWrap: Ref, emit: A icon, }); } - if (!meta?.hideChildrenInMenu && Array.isArray(children) && children.length) { + if (!meta?.hideChildrenInMenu && isArray(children) && children.length) { ret.push(...handlerSearchResult(children, reg, item)); } }); @@ -110,7 +111,7 @@ export function useMenuSearch(refs: Ref, scrollWrap: Ref, emit: A // the scroll bar needs to scroll automatically function handleScroll() { const refList = unref(refs); - if (!refList || !Array.isArray(refList) || refList.length === 0 || !unref(scrollWrap)) { + if (!refList || !isArray(refList) || refList.length === 0 || !unref(scrollWrap)) { return; } diff --git a/src/components/Basic/src/BasicHelp.vue b/src/components/Basic/src/BasicHelp.vue index 3b7dd4c4..3d70a072 100644 --- a/src/components/Basic/src/BasicHelp.vue +++ b/src/components/Basic/src/BasicHelp.vue @@ -4,7 +4,7 @@ import { Tooltip } from 'ant-design-vue'; import { InfoCircleOutlined } from '@ant-design/icons-vue'; import { getPopupContainer } from '/@/utils'; - import { isString, isArray } from '/@/utils/is'; + import { isArray, isString } from '@vben/shared'; import { getSlot } from '/@/utils/helper/tsxHelper'; import { useDesign } from '/@/hooks/web/useDesign'; diff --git a/src/components/CardList/src/CardList.vue b/src/components/CardList/src/CardList.vue index 083545f6..3d19effe 100644 --- a/src/components/CardList/src/CardList.vue +++ b/src/components/CardList/src/CardList.vue @@ -88,7 +88,7 @@ import { BasicForm, useForm } from '/@/components/Form'; import { propTypes } from '/@/utils/propTypes'; import { Button } from '/@/components/Button'; - import { isFunction } from '/@/utils/is'; + import { isFunction } from '@vben/shared'; import { useSlider, grid } from './data'; const ListItem = List.Item; diff --git a/src/components/CodeEditor/src/CodeEditor.vue b/src/components/CodeEditor/src/CodeEditor.vue index db9042b5..a756e491 100644 --- a/src/components/CodeEditor/src/CodeEditor.vue +++ b/src/components/CodeEditor/src/CodeEditor.vue @@ -9,9 +9,9 @@