This commit is contained in:
神仙都没用 2024-12-24 15:57:02 +08:00
parent c205a67d8b
commit 17f7288328
12 changed files with 162 additions and 143 deletions

View File

@ -12,7 +12,7 @@
"format": "prettier --write src/" "format": "prettier --write src/"
}, },
"dependencies": { "dependencies": {
"@cool-vue/crud": "^7.2.3", "@cool-vue/crud": "^7.2.5",
"@element-plus/icons-vue": "^2.3.1", "@element-plus/icons-vue": "^2.3.1",
"@vueuse/core": "^11.1.0", "@vueuse/core": "^11.1.0",
"@wangeditor/editor": "^5.1.23", "@wangeditor/editor": "^5.1.23",
@ -40,7 +40,7 @@
"xlsx": "^0.18.5" "xlsx": "^0.18.5"
}, },
"devDependencies": { "devDependencies": {
"@cool-vue/vite-plugin": "^7.2.4", "@cool-vue/vite-plugin": "^7.2.5",
"@rushstack/eslint-patch": "^1.10.4", "@rushstack/eslint-patch": "^1.10.4",
"@tsconfig/node20": "^20.1.4", "@tsconfig/node20": "^20.1.4",
"@types/file-saver": "^2.0.7", "@types/file-saver": "^2.0.7",

View File

@ -9,12 +9,12 @@ declare namespace Vue {
// element-plus // element-plus
declare namespace ElementPlus { declare namespace ElementPlus {
type Size = 'large' | 'default' | 'small'; type Size = "large" | "default" | "small";
type Align = 'left' | 'center' | 'right'; type Align = "left" | "center" | "right";
interface FormProps { interface FormProps {
inline?: boolean; inline?: boolean;
labelPosition?: 'left' | 'right' | 'top'; labelPosition?: "left" | "right" | "top";
labelWidth?: string | number; labelWidth?: string | number;
labelSuffix?: string; labelSuffix?: string;
hideRequiredAsterisk?: boolean; hideRequiredAsterisk?: boolean;
@ -60,8 +60,8 @@ declare type obj = {
declare type DeepPartial<T> = T extends Function declare type DeepPartial<T> = T extends Function
? T ? T
: T extends object : T extends object
? { [P in keyof T]?: DeepPartial<T[P]> } ? { [P in keyof T]?: DeepPartial<T[P]> }
: T; : T;
// 合并 // 合并
declare type Merge<A, B> = Omit<A, keyof B> & B; declare type Merge<A, B> = Omit<A, keyof B> & B;
@ -240,51 +240,51 @@ declare namespace ClCrud {
interface Service { interface Service {
api: { api: {
page(params?: Params['page']): Promise<Response['page']>; page(params?: Params["page"]): Promise<Response["page"]>;
list(params?: Params['list']): Promise<Response['list']>; list(params?: Params["list"]): Promise<Response["list"]>;
add(params?: Params['add']): Promise<Response['add']>; add(params?: Params["add"]): Promise<Response["add"]>;
update(params?: Params['update']): Promise<Response['update']>; update(params?: Params["update"]): Promise<Response["update"]>;
info(params?: Params['info']): Promise<Response['info']>; info(params?: Params["info"]): Promise<Response["info"]>;
delete(params?: Params['delete']): Promise<Response['delete']>; delete(params?: Params["delete"]): Promise<Response["delete"]>;
[key: string]: (params?: any) => Promise<any>; [key: string]: (params?: any) => Promise<any>;
}; };
} }
interface Config { interface Config {
name: string; name: string;
service: Service['api']; service: Service["api"];
permission: Permission; permission: Permission;
dict: Dict; dict: Dict;
onRefresh( onRefresh(
params: obj, params: obj,
event: { event: {
done: fn; done: fn;
next: Service['api']['page']; next: Service["api"]["page"];
render: (data: any | any[], pagination?: Response['page']['pagination']) => void; render: (data: any | any[], pagination?: Response["page"]["pagination"]) => void;
} }
): void; ): void;
onDelete( onDelete(
selection: obj[], selection: obj[],
event: { event: {
next: Service['api']['delete']; next: Service["api"]["delete"];
} }
): void; ): void;
} }
interface Ref { interface Ref {
'cl-table': ClTable.Ref; "cl-table": ClTable.Ref;
'cl-upsert': ClUpsert.Ref; "cl-upsert": ClUpsert.Ref;
id: number; id: number;
mitt: Mitt; mitt: Mitt;
name: string; name: string;
routePath: string; routePath: string;
permission: Permission; permission: Permission;
dict: Dict; dict: Dict;
service: Service['api']; service: Service["api"];
loading: boolean; loading: boolean;
params: obj; params: obj;
selection: obj[]; selection: obj[];
set(key: 'dict' | 'style' | 'service' | 'permission', value: any): void; set(key: "dict" | "style" | "service" | "permission", value: any): void;
done(): void; done(): void;
getParams(): obj; getParams(): obj;
getPermission(key?: string): boolean; getPermission(key?: string): boolean;
@ -296,7 +296,7 @@ declare namespace ClCrud {
rowDelete(...selection: obj[]): void; rowDelete(...selection: obj[]): void;
proxy(name: string, data?: any[]): any; proxy(name: string, data?: any[]): any;
paramsReplace(params: obj): obj; paramsReplace(params: obj): obj;
refresh: Service['api']['page']; refresh: Service["api"]["page"];
[key: string]: any; [key: string]: any;
} }
@ -306,9 +306,9 @@ declare namespace ClCrud {
} }
declare namespace ClTable { declare namespace ClTable {
type OpButton = Array<'info' | 'edit' | 'delete' | AnyString | Render.OpButton>; type OpButton = Array<"info" | "edit" | "delete" | AnyString | Render.OpButton>;
type ColumnType = 'index' | 'selection' | 'expand' | 'op' | AnyString; type ColumnType = "index" | "selection" | "expand" | "op" | AnyString;
interface Column<T = any> { interface Column<T = any> {
type: ColumnType; type: ColumnType;
@ -334,7 +334,7 @@ declare namespace ClTable {
width: RefData<number | string>; width: RefData<number | string>;
minWidth: RefData<number | string>; minWidth: RefData<number | string>;
renderHeader: (options: { column: any; $index: number }) => any; renderHeader: (options: { column: any; $index: number }) => any;
sortable: boolean | 'desc' | 'descending' | 'ascending' | 'asc' | 'custom'; sortable: boolean | "desc" | "descending" | "ascending" | "asc" | "custom";
sortMethod: fn; sortMethod: fn;
sortBy: string | ((row: T, index: number) => any) | any[]; sortBy: string | ((row: T, index: number) => any) | any[];
resizable: boolean; resizable: boolean;
@ -359,14 +359,14 @@ declare namespace ClTable {
type ContextMenu = Array< type ContextMenu = Array<
| ClContextMenu.Item | ClContextMenu.Item
| ((row: obj, column: obj, event: PointerEvent) => ClContextMenu.Item) | ((row: obj, column: obj, event: PointerEvent) => ClContextMenu.Item)
| 'refresh' | "refresh"
| 'check' | "check"
| 'update' | "update"
| 'edit' | "edit"
| 'delete' | "delete"
| 'info' | "info"
| 'order-desc' | "order-desc"
| 'order-asc' | "order-asc"
>; >;
type Plugin = (options: { exposed: Ref }) => void; type Plugin = (options: { exposed: Ref }) => void;
@ -378,7 +378,7 @@ declare namespace ClTable {
contextMenu: ContextMenu; contextMenu: ContextMenu;
defaultSort: { defaultSort: {
prop: string; prop: string;
order: 'descending' | 'ascending'; order: "descending" | "ascending";
}; };
sortRefresh: boolean; sortRefresh: boolean;
emptyText: string; emptyText: string;
@ -432,25 +432,25 @@ declare namespace ClFormTabs {
} }
declare namespace ClForm { declare namespace ClForm {
type CloseAction = 'close' | 'save' | AnyString; type CloseAction = "close" | "save" | AnyString;
interface Rule { interface Rule {
type?: type?:
| 'string' | "string"
| 'number' | "number"
| 'boolean' | "boolean"
| 'method' | "method"
| 'regexp' | "regexp"
| 'integer' | "integer"
| 'float' | "float"
| 'array' | "array"
| 'object' | "object"
| 'enum' | "enum"
| 'date' | "date"
| 'url' | "url"
| 'hex' | "hex"
| 'email' | "email"
| 'any'; | "any";
required?: boolean; required?: boolean;
message?: string; message?: string;
min?: number; min?: number;
@ -462,37 +462,37 @@ declare namespace ClForm {
type HookFn = ( type HookFn = (
value: any, value: any,
options: { form: obj; prop: string; method: 'submit' | 'bind' } options: { form: obj; prop: string; method: "submit" | "bind" }
) => any; ) => any;
type HookKey = type HookKey =
| 'number' | "number"
| 'string' | "string"
| 'split' | "split"
| 'join' | "join"
| 'boolean' | "boolean"
| 'booleanNumber' | "booleanNumber"
| 'datetimeRange' | "datetimeRange"
| 'splitJoin' | "splitJoin"
| 'json' | "json"
| 'empty' | "empty"
| AnyString; | AnyString;
type HookPipe = HookKey | HookFn; type HookPipe = HookKey | HookFn;
interface Item<T = any> { interface Item<T = any> {
type?: 'tabs'; type?: "tabs";
prop?: PropKey<T>; prop?: PropKey<T>;
props?: { props?: {
labels?: ClFormTabs.labels; labels?: ClFormTabs.labels;
justify?: 'left' | 'center' | 'right'; justify?: "left" | "center" | "right";
color?: string; color?: string;
mergeProp?: boolean; mergeProp?: boolean;
labelWidth?: string; labelWidth?: string;
error?: string; error?: string;
showMessage?: boolean; showMessage?: boolean;
inlineMessage?: boolean; inlineMessage?: boolean;
size?: 'medium' | 'default' | 'small'; size?: "medium" | "default" | "small";
[key: string]: any; [key: string]: any;
}; };
span?: number; span?: number;
@ -548,7 +548,7 @@ declare namespace ClForm {
hidden?: boolean; hidden?: boolean;
saveButtonText?: string; saveButtonText?: string;
closeButtonText?: string; closeButtonText?: string;
justify?: 'flex-start' | 'center' | 'flex-end'; justify?: "flex-start" | "center" | "flex-end";
buttons?: Array<CloseAction | Render.OpButton>; buttons?: Array<CloseAction | Render.OpButton>;
}; };
dialog: { dialog: {
@ -556,7 +556,7 @@ declare namespace ClForm {
height?: string; height?: string;
width?: string; width?: string;
hideHeader?: boolean; hideHeader?: boolean;
controls?: Array<'fullscreen' | 'close' | AnyString>; controls?: Array<"fullscreen" | "close" | AnyString>;
[key: string]: any; [key: string]: any;
}; };
[key: string]: any; [key: string]: any;
@ -619,26 +619,26 @@ declare namespace ClUpsert {
interface Config<T = any> { interface Config<T = any> {
sync: boolean; sync: boolean;
items: ClForm.Item[]; items: ClForm.Item[];
props: ClForm.Config['props']; props: ClForm.Config["props"];
op: ClForm.Config['op']; op: ClForm.Config["op"];
dialog: ClForm.Config['dialog']; dialog: ClForm.Config["dialog"];
onOpen?(): void; onOpen?(): void;
onOpened?(data: T): void; onOpened?(data: T): void;
onClose?(action: ClForm.CloseAction, done: fn): void; onClose?(action: ClForm.CloseAction, done: fn): void;
onClosed?(): void; onClosed?(): void;
onInfo?( onInfo?(
data: T, data: T,
event: { close: fn; done(data: T): void; next: ClCrud.Service['api']['info'] } event: { close: fn; done(data: T): void; next: ClCrud.Service["api"]["info"] }
): void; ): void;
onSubmit?( onSubmit?(
data: T, data: T,
event: { close: fn; done: fn; next: ClCrud.Service['api']['update'] } event: { close: fn; done: fn; next: ClCrud.Service["api"]["update"] }
): void; ): void;
plugins?: ClForm.Plugin[]; plugins?: ClForm.Plugin[];
} }
interface Ref<T = any> extends ClForm.Ref<T> { interface Ref<T = any> extends ClForm.Ref<T> {
mode: 'add' | 'update' | 'info' | AnyString; mode: "add" | "update" | "info" | AnyString;
} }
interface Options<T = any> extends DeepPartial<Config<T>> { interface Options<T = any> extends DeepPartial<Config<T>> {
@ -651,8 +651,8 @@ declare namespace ClAdvSearch {
items?: ClForm.Item[]; items?: ClForm.Item[];
title?: string; title?: string;
size?: string | number; size?: string | number;
op?: ('clear' | 'reset' | 'close' | 'search' | `slot-${string}`)[]; op?: ("clear" | "reset" | "close" | "search" | `slot-${string}`)[];
onSearch?(data: T, options: { next: ClCrud.Service['api']['page']; close(): void }): void; onSearch?(data: T, options: { next: ClCrud.Service["api"]["page"]; close(): void }): void;
} }
interface Ref<T = any> extends ClForm.Ref<T> {} interface Ref<T = any> extends ClForm.Ref<T> {}
@ -672,7 +672,7 @@ declare namespace ClSearch {
Form?: ClForm.Ref; Form?: ClForm.Ref;
onChange?(data: T, prop: string): void; onChange?(data: T, prop: string): void;
onLoad?(data: T): void; onLoad?(data: T): void;
onSearch?(data: T, options: { next: ClCrud.Service['api']['page'] }): void; onSearch?(data: T, options: { next: ClCrud.Service["api"]["page"] }): void;
} }
interface Ref<T = any> extends ClForm.Ref<T> { interface Ref<T = any> extends ClForm.Ref<T> {
@ -743,8 +743,8 @@ declare interface Config {
size: ElementPlus.Size; size: ElementPlus.Size;
colors: string[]; colors: string[];
form: { form: {
labelPosition: ElementPlus.FormProps['labelPosition']; labelPosition: ElementPlus.FormProps["labelPosition"];
labelWidth: ElementPlus.FormProps['labelWidth']; labelWidth: ElementPlus.FormProps["labelWidth"];
span: number; span: number;
plugins: ClForm.Plugin[]; plugins: ClForm.Plugin[];
}; };

View File

@ -1,6 +1,6 @@
{ {
"name": "@cool-vue/crud", "name": "@cool-vue/crud",
"version": "7.2.3", "version": "7.2.5",
"private": false, "private": false,
"main": "./dist/index.umd.min.js", "main": "./dist/index.umd.min.js",
"typings": "types/index.d.ts", "typings": "types/index.d.ts",

View File

@ -1,11 +1,10 @@
<template> <template>
<div> <div>
<div class="title">CRUD DEMO v7.0.0</div> <div class="title">CRUD DEMO v7</div>
<cl-crud ref="Crud"> <cl-crud ref="Crud">
<cl-row> <cl-row>
<cl-add-btn /> <cl-add-btn />
<cl-adv-btn />
<cl-flex1 /> <cl-flex1 />
@ -22,7 +21,7 @@
} }
]" ]"
refreshOnInput refreshOnInput
></cl-search-key> />
</cl-row> </cl-row>
<cl-row> <cl-row>
@ -35,12 +34,12 @@
</cl-row> </cl-row>
<cl-upsert ref="Upsert"></cl-upsert> <cl-upsert ref="Upsert"></cl-upsert>
<cl-adv-search ref="AdvSearch"></cl-adv-search>
</cl-crud> </cl-crud>
</div> </div>
</template> </template>
<script setup lang="tsx"> <script setup lang="tsx">
import { computed } from "vue";
import { useTable, useForm, useUpsert, useCrud } from "./hooks"; import { useTable, useForm, useUpsert, useCrud } from "./hooks";
import { EditPen } from "@element-plus/icons-vue"; import { EditPen } from "@element-plus/icons-vue";
@ -103,54 +102,59 @@ const Upsert = useUpsert<Data>({
} }
}); });
const Table = useTable<Data>({ const Table = useTable<Data>(
contextMenu: [ {
{ contextMenu: [
label: "带图标", {
prefixIcon: EditPen label: "带图标",
}, prefixIcon: EditPen
{ },
label: "多层级", {
children: [ label: "多层级",
{ children: [
label: "A", {
children: [ label: "A",
{ children: [
label: "A-1" {
} label: "A-1"
] }
}, ]
{ },
label: "B" {
} label: "B"
] }
} ]
], }
],
columns: [ columns: [
{ {
label: "姓名", label: "姓名",
prop: "name", prop: "name",
search: { search: {
component: { component: {
name: "el-date-picker" name: "el-date-picker"
}
} }
} },
}, {
{ label: "手机号",
label: "手机号", prop: "phone",
prop: "phone", search: {
search: { component: {
component: { name: "el-date-picker"
name: "el-date-picker" }
} }
},
{
type: "op"
} }
}, ]
{ },
type: "op" (table) => {
} console.log(table);
] }
}); );
const Crud = useCrud( const Crud = useCrud(
{ {

View File

@ -82,7 +82,10 @@ export default defineComponent({
...params, ...params,
[selectField.value]: value.value || undefined, [selectField.value]: value.value || undefined,
...newParams ...newParams
}); })
.catch(err => {
console.error(err);
})
loading.value = false; loading.value = false;
} }

View File

@ -120,7 +120,7 @@ export function useUpsert<T = any>(options?: ClUpsert.Options<T>) {
} }
// 表格 // 表格
export function useTable<T = any>(options?: ClTable.Options<T>) { export function useTable<T = any>(options?: ClTable.Options<T>, cb?: (table: ClTable.Ref) => void) {
const Table = ref<ClTable.Ref<T>>(); const Table = ref<ClTable.Ref<T>>();
useParent("cl-table", Table); useParent("cl-table", Table);
@ -128,6 +128,14 @@ export function useTable<T = any>(options?: ClTable.Options<T>) {
provide("useTable__options", options); provide("useTable__options", options);
} }
watch(Table, (val) => {
if (val) {
if (cb) {
cb(val);
}
}
});
return Table; return Table;
} }

View File

@ -20,6 +20,6 @@
"paths": {}, "paths": {},
"lib": ["esnext", "dom", "dom.iterable", "scripthost"] "lib": ["esnext", "dom", "dom.iterable", "scripthost"]
}, },
"include": ["src/**/*.ts", "src/**/*.tsx"], "include": ["src"],
"exclude": ["node_modules", "src/demo/*", "src/main.ts", "src/components/*"] "exclude": ["node_modules", "src/main.ts"]
} }

View File

@ -6,7 +6,7 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
default: () => never[]; default: () => never[];
}; };
justify: { justify: {
type: PropType<"center" | "justify" | "left" | "right" | "start" | "end" | "match-parent">; type: PropType<"center" | "left" | "right" | "justify" | "start" | "end" | "match-parent">;
default: string; default: string;
}; };
type: { type: {
@ -20,7 +20,7 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
default: () => never[]; default: () => never[];
}; };
justify: { justify: {
type: PropType<"center" | "justify" | "left" | "right" | "start" | "end" | "match-parent">; type: PropType<"center" | "left" | "right" | "justify" | "start" | "end" | "match-parent">;
default: string; default: string;
}; };
type: { type: {
@ -33,6 +33,6 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
}>, { }>, {
type: "default" | "card"; type: "default" | "card";
labels: unknown[]; labels: unknown[];
justify: "center" | "justify" | "left" | "right" | "start" | "end" | "match-parent"; justify: "center" | "left" | "right" | "justify" | "start" | "end" | "match-parent";
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>; }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
export default _default; export default _default;

View File

@ -206,7 +206,7 @@ export declare function useForm(): {
saveButtonText?: string | undefined; saveButtonText?: string | undefined;
closeButtonText?: string | undefined; closeButtonText?: string | undefined;
justify?: "center" | "flex-start" | "flex-end" | undefined; justify?: "center" | "flex-start" | "flex-end" | undefined;
buttons?: (ClForm.CloseAction | `slot-${string}` | { buttons?: (`slot-${string}` | ClForm.CloseAction | {
[x: string]: any; [x: string]: any;
label: string; label: string;
type?: string | undefined; type?: string | undefined;

View File

@ -114,13 +114,17 @@ export declare function useTable(props: any): {
className: string; className: string;
prop: string & {}; prop: string & {};
orderNum: number; orderNum: number;
width: number; width: string | number | {
minWidth: string | number; value: string | number;
};
minWidth: string | number | {
value: string | number;
};
renderHeader: (options: { renderHeader: (options: {
column: any; column: any;
$index: number; $index: number;
}) => any; }) => any;
sortable: boolean | "asc" | "desc" | "custom" | "descending" | "ascending"; sortable: boolean | "asc" | "desc" | "descending" | "ascending" | "custom";
sortMethod: fn; sortMethod: fn;
sortBy: string | any[] | ((row: any, index: number) => any); sortBy: string | any[] | ((row: any, index: number) => any);
resizable: boolean; resizable: boolean;

View File

@ -2,7 +2,7 @@
import { Ref } from "vue"; import { Ref } from "vue";
export declare function useCrud(options?: ClCrud.Options, cb?: (app: ClCrud.Ref) => void): Ref<ClCrud.Ref | undefined, ClCrud.Ref | undefined>; export declare function useCrud(options?: ClCrud.Options, cb?: (app: ClCrud.Ref) => void): Ref<ClCrud.Ref | undefined, ClCrud.Ref | undefined>;
export declare function useUpsert<T = any>(options?: ClUpsert.Options<T>): Ref<ClUpsert.Ref<any> | undefined, ClUpsert.Ref<any> | undefined>; export declare function useUpsert<T = any>(options?: ClUpsert.Options<T>): Ref<ClUpsert.Ref<any> | undefined, ClUpsert.Ref<any> | undefined>;
export declare function useTable<T = any>(options?: ClTable.Options<T>): Ref<ClTable.Ref<T> | undefined, ClTable.Ref<T> | undefined>; export declare function useTable<T = any>(options?: ClTable.Options<T>, cb?: (table: ClTable.Ref) => void): Ref<ClTable.Ref<T> | undefined, ClTable.Ref<T> | undefined>;
export declare function useForm<T = any>(cb?: (app: ClForm.Ref<T>) => void): Ref<ClForm.Ref<T> | undefined, ClForm.Ref<T> | undefined>; export declare function useForm<T = any>(cb?: (app: ClForm.Ref<T>) => void): Ref<ClForm.Ref<T> | undefined, ClForm.Ref<T> | undefined>;
export declare function useAdvSearch<T = any>(options?: ClAdvSearch.Options<T>): Ref<ClAdvSearch.Ref<T> | undefined, ClAdvSearch.Ref<T> | undefined>; export declare function useAdvSearch<T = any>(options?: ClAdvSearch.Options<T>): Ref<ClAdvSearch.Ref<T> | undefined, ClAdvSearch.Ref<T> | undefined>;
export declare function useSearch<T = any>(options?: ClSearch.Options<T>): Ref<ClSearch.Ref<T> | undefined, ClSearch.Ref<T> | undefined>; export declare function useSearch<T = any>(options?: ClSearch.Options<T>): Ref<ClSearch.Ref<T> | undefined, ClSearch.Ref<T> | undefined>;

10
pnpm-lock.yaml generated
View File

@ -9,8 +9,8 @@ importers:
.: .:
dependencies: dependencies:
'@cool-vue/crud': '@cool-vue/crud':
specifier: ^7.2.3 specifier: ^7.2.5
version: 7.2.3(typescript@5.5.4) version: 7.2.5(typescript@5.5.4)
'@element-plus/icons-vue': '@element-plus/icons-vue':
specifier: ^2.3.1 specifier: ^2.3.1
version: 2.3.1(vue@3.5.13(typescript@5.5.4)) version: 2.3.1(vue@3.5.13(typescript@5.5.4))
@ -330,8 +330,8 @@ packages:
resolution: {integrity: sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==} resolution: {integrity: sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==}
engines: {node: '>=6.9.0'} engines: {node: '>=6.9.0'}
'@cool-vue/crud@7.2.3': '@cool-vue/crud@7.2.5':
resolution: {integrity: sha512-TItRbZBGrTcHby9iKWG27PxD9KppUnfDXEj7ZCn8s41p8+5g3za2O1UU12xj/1/UhEqq9xbkDlyDeseJuxLdug==} resolution: {integrity: sha512-+kvWAfz77jTDZqDfQPDsl2dzOeJs7TptOH/maBfwO3iyZcTaYBbcFEBpWG5vjaUeva8Fuo1rlmlr5q/OykuX7Q==}
'@cool-vue/vite-plugin@7.2.4': '@cool-vue/vite-plugin@7.2.4':
resolution: {integrity: sha512-lRVoCHeOQ+ZYnpCbVtfTGafdQ/glpb9Nk4YydGseNjVoXLfeJBGkZx2xsHOt54fjlFQMWyi+k4Qo28Ymgigtsg==} resolution: {integrity: sha512-lRVoCHeOQ+ZYnpCbVtfTGafdQ/glpb9Nk4YydGseNjVoXLfeJBGkZx2xsHOt54fjlFQMWyi+k4Qo28Ymgigtsg==}
@ -3283,7 +3283,7 @@ snapshots:
'@babel/helper-string-parser': 7.25.9 '@babel/helper-string-parser': 7.25.9
'@babel/helper-validator-identifier': 7.25.9 '@babel/helper-validator-identifier': 7.25.9
'@cool-vue/crud@7.2.3(typescript@5.5.4)': '@cool-vue/crud@7.2.5(typescript@5.5.4)':
dependencies: dependencies:
'@element-plus/icons-vue': 2.3.1(vue@3.5.13(typescript@5.5.4)) '@element-plus/icons-vue': 2.3.1(vue@3.5.13(typescript@5.5.4))
array.prototype.flat: 1.3.3 array.prototype.flat: 1.3.3