diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 000000000..3f430af82 --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +v18 diff --git a/.prettierignore b/.prettierignore index a1759d04e..38279529e 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 378cd3b2e..b398198e8 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 1138bb376..3d3b269ee 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 5dbf5b700..4331b2b90 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 92c693421..22d3393ea 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 de0677b47..81f55413b 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 a203e49ff..16fea3083 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 e69de29bb..fcb073fef 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 000000000..ba6029c0a --- /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 5e83847e1..f0807e39a 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 c93879230..e8188ad93 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 3b7dd4c4e..3d70a072c 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 083545f68..3d19effeb 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 db9042b50..a756e4919 100644 --- a/src/components/CodeEditor/src/CodeEditor.vue +++ b/src/components/CodeEditor/src/CodeEditor.vue @@ -9,9 +9,9 @@