This commit is contained in:
神仙都没用 2024-12-24 15:56:57 +08:00
parent 41d3608aac
commit c205a67d8b
5 changed files with 129 additions and 114 deletions

View File

@ -1,4 +1,3 @@
import Mitt from "mitt";
// vue // vue
declare namespace Vue { declare namespace Vue {
interface Ref<T = any> { interface Ref<T = any> {
@ -10,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;
@ -29,6 +28,26 @@ declare namespace ElementPlus {
} }
} }
// mitt
declare interface Mitt {
on(name: string, callback: (data: any) => void): void;
off(name: string, callback: (data: any) => void): void;
emit(name: string, data?: any): void;
}
// emitter
declare interface EmitterItem {
name: string;
callback(data: any, events: { refresh(params: any): void; crudList: ClCrud.Ref[] }): void;
}
declare interface Emitter {
list: EmitterItem[];
init(events: any): void;
on(name: string, callback: (data: any) => void): void;
emit(name: string, data?: any): void;
}
// 方法 // 方法
declare type fn = () => void; declare type fn = () => void;
@ -41,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;
@ -55,6 +74,21 @@ declare type RemoveIndex<T> = {
// 任用列表 // 任用列表
declare type List<T> = Array<DeepPartial<T> | (() => DeepPartial<T>)>; declare type List<T> = Array<DeepPartial<T> | (() => DeepPartial<T>)>;
// 获取keys
declare type PropKey<T> = keyof RemoveIndex<T> | (string & {});
// 任意字符串
declare type AnyString = string & {};
// 类型或者 Ref 泛型
declare type RefData<T = any> = T | Vue.Ref<T>;
// browser
declare type Browser = {
screen: string;
isMini: boolean;
};
// 字典选项 // 字典选项
declare type DictOptions = { declare type DictOptions = {
label?: string; label?: string;
@ -64,25 +98,6 @@ declare type DictOptions = {
[key: string]: any; [key: string]: any;
}[]; }[];
// emitter
declare interface EmitterItem {
name: string;
callback(data: any, events: { refresh(params: any): void; crudList: ClCrud.Ref[] }): void;
}
declare interface Emitter {
list: EmitterItem[];
init(events: any): void;
emit(name: string, data?: any): void;
on(name: string, callback: (data: any) => void): void;
}
// browser
declare type Browser = {
screen: string;
isMini: boolean;
};
// render // render
declare namespace Render { declare namespace Render {
type OpButton = type OpButton =
@ -102,8 +117,8 @@ declare namespace Render {
interface Component { interface Component {
name?: string; name?: string;
options?: DictOptions | Vue.Ref<DictOptions>; options?: RefData<DictOptions>;
props?: Props | Vue.Ref<Props>; props?: RefData<Props>;
style?: obj; style?: obj;
slots?: { slots?: {
[key: string]: (data?: any) => any; [key: string]: (data?: any) => any;
@ -113,12 +128,7 @@ declare namespace Render {
} }
} }
// 获取keys // crud
type PropKey<T> = keyof RemoveIndex<T> | (string & {});
// 任意字符串
type AnyString = string & {};
declare namespace ClCrud { declare namespace ClCrud {
interface Label { interface Label {
op: string; op: string;
@ -230,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;
@ -286,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;
} }
@ -296,13 +306,13 @@ 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;
hidden: boolean | Vue.Ref<boolean>; hidden: RefData<boolean>;
component: Render.Component; component: Render.Component;
search: { search: {
isInput: boolean; isInput: boolean;
@ -310,7 +320,7 @@ declare namespace ClTable {
refreshOnChange: boolean; refreshOnChange: boolean;
component: Render.Component; component: Render.Component;
}; };
dict: DictOptions | Vue.Ref<DictOptions>; dict: RefData<DictOptions>;
dictFormatter: (values: DictOptions) => string; dictFormatter: (values: DictOptions) => string;
dictColor: boolean; dictColor: boolean;
dictSeparator: string; dictSeparator: string;
@ -321,10 +331,10 @@ declare namespace ClTable {
className: string; className: string;
prop: PropKey<T>; prop: PropKey<T>;
orderNum: number; orderNum: number;
width: number; width: RefData<number | string>;
minWidth: 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;
@ -349,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;
@ -368,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;
@ -422,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;
@ -452,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;
@ -538,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: {
@ -546,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;
@ -609,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>> {
@ -641,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> {}
@ -662,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> {
@ -733,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

@ -77,7 +77,9 @@
function readFile(path, json) { function readFile(path, json) {
try { try {
const content = fs.readFileSync(path, "utf8"); const content = fs.readFileSync(path, "utf8");
return json ? JSON.parse(content) : content; return json
? JSON.parse(content.replace(/\/\/.*$/gm, "").replace(/\/\*[\s\S]*?\*\//g, ""))
: content;
} }
catch (err) { } catch (err) { }
return ""; return "";
@ -111,7 +113,7 @@
console.log("\x1B[31m%s\x1B[0m", message); console.log("\x1B[31m%s\x1B[0m", message);
} }
let service = {}; const service = {};
let list = []; let list = [];
let customList = []; let customList = [];
// 获取请求地址 // 获取请求地址
@ -533,7 +535,7 @@
<\/script>`); <\/script>`);
return { return {
map: str().generateMap(), map: str().generateMap(),
code: str().toString() code: str().toString(),
}; };
} }
} }

View File

@ -1,6 +1,6 @@
{ {
"name": "@cool-vue/vite-plugin", "name": "@cool-vue/vite-plugin",
"version": "7.2.4", "version": "7.2.5",
"description": "cool-admin、cool-uni builder", "description": "cool-admin、cool-uni builder",
"main": "/dist/index.js", "main": "/dist/index.js",
"scripts": { "scripts": {

View File

@ -38,7 +38,9 @@ export function createDir(path: string, recursive?: boolean) {
export function readFile(path: string, json?: boolean) { export function readFile(path: string, json?: boolean) {
try { try {
const content = fs.readFileSync(path, "utf8"); const content = fs.readFileSync(path, "utf8");
return json ? JSON.parse(content) : content; return json
? JSON.parse(content.replace(/\/\/.*$/gm, "").replace(/\/\*[\s\S]*?\*\//g, ""))
: content;
} catch (err) {} } catch (err) {}
return ""; return "";

View File

@ -8,8 +8,9 @@
"types": [ "types": [
"element-plus/global", "element-plus/global",
"@cool-vue/vite-plugin/client", "@cool-vue/vite-plugin/client",
"./build/cool/eps.d.ts", "@cool-vue/crud/index",
"./env.d.ts" "./build/cool/eps",
"./env"
], ],
"paths": { "paths": {
"/@/*": ["./src/*"], "/@/*": ["./src/*"],