diff --git a/web/apps/web-ele/src/bootstrap.ts b/web/apps/web-ele/src/bootstrap.ts index 1a46d31..bde4ab8 100644 --- a/web/apps/web-ele/src/bootstrap.ts +++ b/web/apps/web-ele/src/bootstrap.ts @@ -15,7 +15,7 @@ import { useAppContextStore } from '#/store/app-context'; import { initComponentAdapter } from './adapter/component'; import { initSetupVbenForm, useVbenForm } from './adapter/form'; import App from './app.vue'; -import { setupZqTable } from './components/zq-table'; +import { setupZqTable } from './components/zq-table/init'; import { setupElementPlus } from './plugins/element-plus'; import { router } from './router'; diff --git a/web/packages/@core/composables/package.json b/web/packages/@core/composables/package.json index 8f29a0a..a904700 100644 --- a/web/packages/@core/composables/package.json +++ b/web/packages/@core/composables/package.json @@ -37,7 +37,6 @@ "dependencies": { "@vben-core/shared": "workspace:*", "@vueuse/core": "catalog:", - "radix-vue": "catalog:", "sortablejs": "catalog:", "vue": "catalog:" }, diff --git a/web/packages/@core/composables/src/index.ts b/web/packages/@core/composables/src/index.ts index 146ff00..182e105 100644 --- a/web/packages/@core/composables/src/index.ts +++ b/web/packages/@core/composables/src/index.ts @@ -1,13 +1,8 @@ export * from './use-is-mobile'; +export * from './use-forward-props'; export * from './use-layout-style'; export * from './use-namespace'; export * from './use-priority-value'; export * from './use-scroll-lock'; export * from './use-simple-locale'; export * from './use-sortable'; -export { - useEmitAsProps, - useForwardExpose, - useForwardProps, - useForwardPropsEmits, -} from 'radix-vue'; diff --git a/web/packages/@core/composables/src/use-forward-props.ts b/web/packages/@core/composables/src/use-forward-props.ts new file mode 100644 index 0000000..3260d74 --- /dev/null +++ b/web/packages/@core/composables/src/use-forward-props.ts @@ -0,0 +1,89 @@ +import type { EmitsOptions, MaybeRefOrGetter } from 'vue'; + +import { + camelize, + computed, + getCurrentInstance, + toHandlerKey, + toValue, +} from 'vue'; + +function getEmitKeys(emits?: EmitsOptions | null) { + if (Array.isArray(emits)) { + return emits; + } + if (emits && typeof emits === 'object') { + return Object.keys(emits); + } + return []; +} + +function useEmitAsProps( + emit: (name: Name, ...args: any[]) => void, +) { + const vm = getCurrentInstance(); + const emitKeys = getEmitKeys(vm?.type.emits); + const emitProps: Record = {}; + + for (const key of emitKeys) { + emitProps[toHandlerKey(camelize(key))] = (...args: any[]) => + emit(key as Name, ...args); + } + + return emitProps; +} + +function useForwardProps>( + props: MaybeRefOrGetter, +) { + const vm = getCurrentInstance(); + const defaultProps = Object.keys(vm?.type.props ?? {}).reduce( + (defaults, key) => { + const defaultValue = (vm?.type.props as Record)[key]?.default; + if (defaultValue !== undefined) { + defaults[key] = defaultValue; + } + return defaults; + }, + {} as Record, + ); + + return computed(() => { + const forwardedProps: Record = {}; + const vnodeProps = Object.keys(vm?.vnode.props ?? {}).reduce( + (normalizedProps, key) => { + normalizedProps[camelize(key)] = vm?.vnode.props?.[key]; + return normalizedProps; + }, + {} as Record, + ); + const currentProps = toValue(props); + + for (const key of Object.keys({ ...defaultProps, ...vnodeProps })) { + const value = currentProps[key]; + if (value !== undefined) { + forwardedProps[key] = value; + } + } + + return forwardedProps as T; + }); +} + +function useForwardPropsEmits< + T extends Record, + Name extends string, +>( + props: MaybeRefOrGetter, + emit?: (name: Name, ...args: any[]) => void, +) { + const forwardedProps = useForwardProps(props); + const emitProps = emit ? useEmitAsProps(emit) : {}; + + return computed(() => ({ + ...forwardedProps.value, + ...emitProps, + })); +} + +export { useEmitAsProps, useForwardProps, useForwardPropsEmits }; diff --git a/web/packages/stores/package.json b/web/packages/stores/package.json index 46c0cb9..84444b5 100644 --- a/web/packages/stores/package.json +++ b/web/packages/stores/package.json @@ -25,7 +25,6 @@ "@vben-core/typings": "workspace:*", "pinia": "catalog:", "pinia-plugin-persistedstate": "catalog:", - "secure-ls": "catalog:", "vue": "catalog:", "vue-router": "catalog:" } diff --git a/web/packages/stores/src/setup.ts b/web/packages/stores/src/setup.ts index 3bad78f..768579e 100644 --- a/web/packages/stores/src/setup.ts +++ b/web/packages/stores/src/setup.ts @@ -3,7 +3,6 @@ import type { Pinia } from 'pinia'; import type { App } from 'vue'; import { createPinia } from 'pinia'; -import SecureLS from 'secure-ls'; let pinia: Pinia; @@ -21,27 +20,11 @@ export async function initStores(app: App, options: InitStoreOptions) { const { createPersistedState } = await import('pinia-plugin-persistedstate'); pinia = createPinia(); const { namespace } = options; - const ls = new SecureLS({ - encodingType: 'aes', - encryptionSecret: import.meta.env.VITE_APP_STORE_SECURE_KEY, - isCompression: true, - // @ts-ignore secure-ls does not have a type definition for this - metaKey: `${namespace}-secure-meta`, - }); pinia.use( createPersistedState({ // key $appName-$store.id key: (storeKey) => `${namespace}-${storeKey}`, - storage: import.meta.env.DEV - ? localStorage - : { - getItem(key) { - return ls.get(key); - }, - setItem(key, value) { - ls.set(key, value); - }, - }, + storage: localStorage, }), ); app.use(pinia); diff --git a/web/pnpm-lock.yaml b/web/pnpm-lock.yaml index 7537b51..9e10f07 100644 --- a/web/pnpm-lock.yaml +++ b/web/pnpm-lock.yaml @@ -375,9 +375,6 @@ catalogs: sass: specifier: ^1.89.2 version: 1.94.2 - secure-ls: - specifier: ^2.0.0 - version: 2.0.0 sortablejs: specifier: 1.15.6 version: 1.15.6 @@ -589,10 +586,10 @@ importers: version: link:scripts/vsh '@vitejs/plugin-vue': specifier: 'catalog:' - version: 6.0.2(vite@7.2.6(@types/node@22.19.1)(jiti@1.21.7)(less@4.4.2)(sass@1.94.2)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3)) + version: 6.0.2(vite@7.2.6(@types/node@22.19.1)(jiti@2.6.1)(less@4.4.2)(sass@1.94.2)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3)) '@vitejs/plugin-vue-jsx': specifier: 'catalog:' - version: 5.1.2(vite@7.2.6(@types/node@22.19.1)(jiti@1.21.7)(less@4.4.2)(sass@1.94.2)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3)) + version: 5.1.2(vite@7.2.6(@types/node@22.19.1)(jiti@2.6.1)(less@4.4.2)(sass@1.94.2)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3)) '@vue/test-utils': specifier: 'catalog:' version: 2.4.6 @@ -634,10 +631,10 @@ importers: version: 3.6.1(sass@1.94.2)(typescript@5.9.3)(vue-tsc@2.2.10(typescript@5.9.3))(vue@3.5.25(typescript@5.9.3)) vite: specifier: 'catalog:' - version: 7.2.6(@types/node@22.19.1)(jiti@1.21.7)(less@4.4.2)(sass@1.94.2)(terser@5.44.1)(yaml@2.8.2) + version: 7.2.6(@types/node@22.19.1)(jiti@2.6.1)(less@4.4.2)(sass@1.94.2)(terser@5.44.1)(yaml@2.8.2) vitest: specifier: 'catalog:' - version: 3.2.4(@types/debug@4.1.13)(@types/node@22.19.1)(happy-dom@17.6.3)(jiti@1.21.7)(jsdom@26.1.0(canvas@3.2.2))(less@4.4.2)(sass@1.94.2)(terser@5.44.1)(yaml@2.8.2) + version: 3.2.4(@types/debug@4.1.13)(@types/node@22.19.1)(happy-dom@17.6.3)(jiti@2.6.1)(jsdom@26.1.0(canvas@3.2.2))(less@4.4.2)(sass@1.94.2)(terser@5.44.1)(yaml@2.8.2) vue: specifier: ^3.5.17 version: 3.5.25(typescript@5.9.3) @@ -1247,9 +1244,6 @@ importers: '@vueuse/core': specifier: 'catalog:' version: 13.4.0(vue@3.5.25(typescript@5.9.3)) - radix-vue: - specifier: 'catalog:' - version: 1.9.17(vue@3.5.25(typescript@5.9.3)) sortablejs: specifier: 'catalog:' version: 1.15.6 @@ -1733,9 +1727,6 @@ importers: pinia-plugin-persistedstate: specifier: 'catalog:' version: 4.7.1(@nuxt/kit@3.20.1(magicast@0.5.1))(pinia@3.0.4(typescript@5.9.3)(vue@3.5.25(typescript@5.9.3))) - secure-ls: - specifier: 'catalog:' - version: 2.0.0 vue: specifier: ^3.5.17 version: 3.5.25(typescript@5.9.3) @@ -5768,9 +5759,6 @@ packages: crossws@0.3.5: resolution: {integrity: sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==} - crypto-js@4.2.0: - resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==} - crypto-random-string@2.0.0: resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==} engines: {node: '>=8'} @@ -7843,10 +7831,6 @@ packages: resolution: {integrity: sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew==} engines: {node: '>=12'} - lz-string@1.5.0: - resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} - hasBin: true - magic-string@0.25.9: resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} @@ -9423,10 +9407,6 @@ packages: resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} engines: {node: '>=4'} - secure-ls@2.0.0: - resolution: {integrity: sha512-Wgtnw0QSm0v7gVKv11nOoeyGS65EThGXnBB7jfd4IhZd2eq3B4AMPcXAL5qJ1h55+Qolun7TONTwX7H5m6e2pQ==} - engines: {node: '>=8.0'} - select@1.1.2: resolution: {integrity: sha512-OwpTSOfy6xSs1+pwcNrv0RBMOzI39Lp3qQKUTPVVPRjCdNa5JH/oPRiqsesIskK8TVgmRiHwO4KXlV2Li9dANA==} @@ -14345,14 +14325,14 @@ snapshots: dependencies: vite: 7.2.6(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(sass@1.94.2)(terser@5.44.1)(yaml@2.8.2) - '@vitejs/plugin-vue-jsx@5.1.2(vite@7.2.6(@types/node@22.19.1)(jiti@1.21.7)(less@4.4.2)(sass@1.94.2)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3))': + '@vitejs/plugin-vue-jsx@5.1.2(vite@7.2.6(@types/node@22.19.1)(jiti@2.6.1)(less@4.4.2)(sass@1.94.2)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3))': dependencies: '@babel/core': 7.28.5 '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.5) '@babel/plugin-transform-typescript': 7.28.5(@babel/core@7.28.5) '@rolldown/pluginutils': 1.0.0-beta.52 '@vue/babel-plugin-jsx': 2.0.1(@babel/core@7.28.5) - vite: 7.2.6(@types/node@22.19.1)(jiti@1.21.7)(less@4.4.2)(sass@1.94.2)(terser@5.44.1)(yaml@2.8.2) + vite: 7.2.6(@types/node@22.19.1)(jiti@2.6.1)(less@4.4.2)(sass@1.94.2)(terser@5.44.1)(yaml@2.8.2) vue: 3.5.25(typescript@5.9.3) transitivePeerDependencies: - supports-color @@ -14374,10 +14354,10 @@ snapshots: vite: 5.4.21(@types/node@24.10.1)(less@4.4.2)(sass@1.94.2)(terser@5.44.1) vue: 3.5.25(typescript@5.9.3) - '@vitejs/plugin-vue@6.0.2(vite@7.2.6(@types/node@22.19.1)(jiti@1.21.7)(less@4.4.2)(sass@1.94.2)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3))': + '@vitejs/plugin-vue@6.0.2(vite@7.2.6(@types/node@22.19.1)(jiti@2.6.1)(less@4.4.2)(sass@1.94.2)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3))': dependencies: '@rolldown/pluginutils': 1.0.0-beta.50 - vite: 7.2.6(@types/node@22.19.1)(jiti@1.21.7)(less@4.4.2)(sass@1.94.2)(terser@5.44.1)(yaml@2.8.2) + vite: 7.2.6(@types/node@22.19.1)(jiti@2.6.1)(less@4.4.2)(sass@1.94.2)(terser@5.44.1)(yaml@2.8.2) vue: 3.5.25(typescript@5.9.3) '@vitejs/plugin-vue@6.0.2(vite@7.2.6(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(sass@1.94.2)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3))': @@ -14394,13 +14374,13 @@ snapshots: chai: 5.3.3 tinyrainbow: 2.0.0 - '@vitest/mocker@3.2.4(vite@7.2.6(@types/node@22.19.1)(jiti@1.21.7)(less@4.4.2)(sass@1.94.2)(terser@5.44.1)(yaml@2.8.2))': + '@vitest/mocker@3.2.4(vite@7.2.6(@types/node@22.19.1)(jiti@2.6.1)(less@4.4.2)(sass@1.94.2)(terser@5.44.1)(yaml@2.8.2))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 7.2.6(@types/node@22.19.1)(jiti@1.21.7)(less@4.4.2)(sass@1.94.2)(terser@5.44.1)(yaml@2.8.2) + vite: 7.2.6(@types/node@22.19.1)(jiti@2.6.1)(less@4.4.2)(sass@1.94.2)(terser@5.44.1)(yaml@2.8.2) '@vitest/pretty-format@3.2.4': dependencies: @@ -15579,8 +15559,6 @@ snapshots: dependencies: uncrypto: 0.1.3 - crypto-js@4.2.0: {} - crypto-random-string@2.0.0: {} cspell-config-lib@8.19.4: @@ -17823,8 +17801,6 @@ snapshots: luxon@3.7.2: {} - lz-string@1.5.0: {} - magic-string@0.25.9: dependencies: sourcemap-codec: 1.4.8 @@ -19464,11 +19440,6 @@ snapshots: extend-shallow: 2.0.1 kind-of: 6.0.3 - secure-ls@2.0.0: - dependencies: - crypto-js: 4.2.0 - lz-string: 1.5.0 - select@1.1.2: {} semver-compare@1.0.0: {} @@ -20579,13 +20550,13 @@ snapshots: dependencies: vite: 7.2.6(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(sass@1.94.2)(terser@5.44.1)(yaml@2.8.2) - vite-node@3.2.4(@types/node@22.19.1)(jiti@1.21.7)(less@4.4.2)(sass@1.94.2)(terser@5.44.1)(yaml@2.8.2): + vite-node@3.2.4(@types/node@22.19.1)(jiti@2.6.1)(less@4.4.2)(sass@1.94.2)(terser@5.44.1)(yaml@2.8.2): dependencies: cac: 6.7.14 debug: 4.4.3 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 7.2.6(@types/node@22.19.1)(jiti@1.21.7)(less@4.4.2)(sass@1.94.2)(terser@5.44.1)(yaml@2.8.2) + vite: 7.2.6(@types/node@22.19.1)(jiti@2.6.1)(less@4.4.2)(sass@1.94.2)(terser@5.44.1)(yaml@2.8.2) transitivePeerDependencies: - '@types/node' - jiti @@ -20754,7 +20725,7 @@ snapshots: sass: 1.94.2 terser: 5.44.1 - vite@7.2.6(@types/node@22.19.1)(jiti@1.21.7)(less@4.4.2)(sass@1.94.2)(terser@5.44.1)(yaml@2.8.2): + vite@7.2.6(@types/node@22.19.1)(jiti@2.6.1)(less@4.4.2)(sass@1.94.2)(terser@5.44.1)(yaml@2.8.2): dependencies: esbuild: 0.25.3 fdir: 6.5.0(picomatch@4.0.3) @@ -20765,7 +20736,7 @@ snapshots: optionalDependencies: '@types/node': 22.19.1 fsevents: 2.3.3 - jiti: 1.21.7 + jiti: 2.6.1 less: 4.4.2 sass: 1.94.2 terser: 5.44.1 @@ -20845,11 +20816,11 @@ snapshots: - typescript - universal-cookie - vitest@3.2.4(@types/debug@4.1.13)(@types/node@22.19.1)(happy-dom@17.6.3)(jiti@1.21.7)(jsdom@26.1.0(canvas@3.2.2))(less@4.4.2)(sass@1.94.2)(terser@5.44.1)(yaml@2.8.2): + vitest@3.2.4(@types/debug@4.1.13)(@types/node@22.19.1)(happy-dom@17.6.3)(jiti@2.6.1)(jsdom@26.1.0(canvas@3.2.2))(less@4.4.2)(sass@1.94.2)(terser@5.44.1)(yaml@2.8.2): dependencies: '@types/chai': 5.2.3 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@7.2.6(@types/node@22.19.1)(jiti@1.21.7)(less@4.4.2)(sass@1.94.2)(terser@5.44.1)(yaml@2.8.2)) + '@vitest/mocker': 3.2.4(vite@7.2.6(@types/node@22.19.1)(jiti@2.6.1)(less@4.4.2)(sass@1.94.2)(terser@5.44.1)(yaml@2.8.2)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -20867,8 +20838,8 @@ snapshots: tinyglobby: 0.2.15 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 7.2.6(@types/node@22.19.1)(jiti@1.21.7)(less@4.4.2)(sass@1.94.2)(terser@5.44.1)(yaml@2.8.2) - vite-node: 3.2.4(@types/node@22.19.1)(jiti@1.21.7)(less@4.4.2)(sass@1.94.2)(terser@5.44.1)(yaml@2.8.2) + vite: 7.2.6(@types/node@22.19.1)(jiti@2.6.1)(less@4.4.2)(sass@1.94.2)(terser@5.44.1)(yaml@2.8.2) + vite-node: 3.2.4(@types/node@22.19.1)(jiti@2.6.1)(less@4.4.2)(sass@1.94.2)(terser@5.44.1)(yaml@2.8.2) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.13 @@ -20893,7 +20864,7 @@ snapshots: dependencies: '@types/chai': 5.2.3 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@7.2.6(@types/node@22.19.1)(jiti@1.21.7)(less@4.4.2)(sass@1.94.2)(terser@5.44.1)(yaml@2.8.2)) + '@vitest/mocker': 3.2.4(vite@7.2.6(@types/node@22.19.1)(jiti@2.6.1)(less@4.4.2)(sass@1.94.2)(terser@5.44.1)(yaml@2.8.2)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4