@oinone/kunlun-meta 6.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/oinone-kunlun-meta.esm.js +496 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/src/element/ActionElement.d.ts +15 -0
- package/dist/types/src/element/ApiElement.d.ts +21 -0
- package/dist/types/src/element/ClearElement.d.ts +9 -0
- package/dist/types/src/element/ConfigElement.d.ts +6 -0
- package/dist/types/src/element/ContextElement.d.ts +9 -0
- package/dist/types/src/element/CustomElement.d.ts +7 -0
- package/dist/types/src/element/FieldElement.d.ts +25 -0
- package/dist/types/src/element/IBaseElement.d.ts +5 -0
- package/dist/types/src/element/PropElement.d.ts +6 -0
- package/dist/types/src/element/RequestElement.d.ts +9 -0
- package/dist/types/src/element/ResponseElement.d.ts +9 -0
- package/dist/types/src/element/SubscribeElement.d.ts +9 -0
- package/dist/types/src/element/ValidationElement.d.ts +12 -0
- package/dist/types/src/element/ViewElement.d.ts +15 -0
- package/dist/types/src/element/WidgetElement.d.ts +23 -0
- package/dist/types/src/element/index.d.ts +14 -0
- package/dist/types/src/global-config/index.d.ts +2 -0
- package/dist/types/src/global-config/runtime-config.d.ts +14 -0
- package/dist/types/src/global-config/type.d.ts +26 -0
- package/dist/types/src/index.d.ts +5 -0
- package/dist/types/src/metadata/constant/config.d.ts +1 -0
- package/dist/types/src/metadata/constant/index.d.ts +2 -0
- package/dist/types/src/metadata/constant/module-name.d.ts +20 -0
- package/dist/types/src/metadata/fragment/action.d.ts +6 -0
- package/dist/types/src/metadata/fragment/field.d.ts +2 -0
- package/dist/types/src/metadata/fragment/func.d.ts +2 -0
- package/dist/types/src/metadata/fragment/index.d.ts +13 -0
- package/dist/types/src/metadata/fragment/menu.d.ts +2 -0
- package/dist/types/src/metadata/fragment/model.d.ts +2 -0
- package/dist/types/src/metadata/fragment/page.d.ts +2 -0
- package/dist/types/src/metadata/index.d.ts +4 -0
- package/dist/types/src/metadata/runtime-fragment/action.d.ts +8 -0
- package/dist/types/src/metadata/runtime-fragment/function.d.ts +3 -0
- package/dist/types/src/metadata/runtime-fragment/index.d.ts +20 -0
- package/dist/types/src/metadata/runtime-fragment/model.d.ts +2 -0
- package/dist/types/src/metadata/runtime-fragment/module.d.ts +2 -0
- package/dist/types/src/metadata/runtime-fragment/view.d.ts +6 -0
- package/dist/types/src/metadata/types/dsl-node.d.ts +12 -0
- package/dist/types/src/metadata/types/enumeration.d.ts +18 -0
- package/dist/types/src/metadata/types/index.d.ts +8 -0
- package/dist/types/src/metadata/types/layout.d.ts +4 -0
- package/dist/types/src/metadata/types/model.d.ts +573 -0
- package/dist/types/src/metadata/types/tag.d.ts +23 -0
- package/dist/types/src/metadata/types/user.d.ts +22 -0
- package/dist/types/src/metadata/types/value.d.ts +3 -0
- package/dist/types/src/metadata/types/view.d.ts +170 -0
- package/dist/types/src/plugin-loader/factory/PluginLoaderFactory.d.ts +4 -0
- package/dist/types/src/plugin-loader/factory/index.d.ts +1 -0
- package/dist/types/src/plugin-loader/index.d.ts +5 -0
- package/dist/types/src/plugin-loader/loader/CJSPluginLoader.d.ts +7 -0
- package/dist/types/src/plugin-loader/loader/CSSPluginLoader.d.ts +7 -0
- package/dist/types/src/plugin-loader/loader/ESMPluginLoader.d.ts +7 -0
- package/dist/types/src/plugin-loader/loader/IIFEPluginLoader.d.ts +7 -0
- package/dist/types/src/plugin-loader/loader/LoadedEvent.d.ts +4 -0
- package/dist/types/src/plugin-loader/loader/PluginLoader.d.ts +5 -0
- package/dist/types/src/plugin-loader/loader/RemotePluginLoader.d.ts +5 -0
- package/dist/types/src/plugin-loader/loader/UMDPluginLoader.d.ts +6 -0
- package/dist/types/src/plugin-loader/loader/index.d.ts +1 -0
- package/dist/types/src/plugin-loader/typing/index.d.ts +2 -0
- package/dist/types/src/plugin-loader/typing/load-option.d.ts +48 -0
- package/dist/types/src/plugin-loader/typing/loader-config.d.ts +38 -0
- package/dist/types/src/plugin-loader/util/PluginLoadHelper.d.ts +7 -0
- package/dist/types/src/plugin-loader/util/index.d.ts +1 -0
- package/dist/types/src/util/element.d.ts +16 -0
- package/dist/types/src/util/field.d.ts +7 -0
- package/dist/types/src/util/helper.d.ts +2 -0
- package/dist/types/src/util/index.d.ts +6 -0
- package/dist/types/src/util/ke-common.d.ts +6 -0
- package/dist/types/src/util/lang.d.ts +4 -0
- package/dist/types/src/util/validation-utils.d.ts +3 -0
- package/index.ts +1 -0
- package/package.json +17 -0
- package/rollup.config.js +4 -0
- package/src/element/ActionElement.ts +20 -0
- package/src/element/ApiElement.ts +22 -0
- package/src/element/ClearElement.ts +10 -0
- package/src/element/ConfigElement.ts +7 -0
- package/src/element/ContextElement.ts +10 -0
- package/src/element/CustomElement.ts +22 -0
- package/src/element/FieldElement.ts +41 -0
- package/src/element/IBaseElement.ts +5 -0
- package/src/element/PropElement.ts +7 -0
- package/src/element/RequestElement.ts +10 -0
- package/src/element/ResponseElement.ts +10 -0
- package/src/element/SubscribeElement.ts +10 -0
- package/src/element/ValidationElement.ts +17 -0
- package/src/element/ViewElement.ts +23 -0
- package/src/element/WidgetElement.ts +33 -0
- package/src/element/index.ts +14 -0
- package/src/global-config/index.ts +2 -0
- package/src/global-config/runtime-config.ts +83 -0
- package/src/global-config/type.ts +48 -0
- package/src/index.ts +5 -0
- package/src/metadata/constant/config.ts +1 -0
- package/src/metadata/constant/index.ts +2 -0
- package/src/metadata/constant/module-name.ts +21 -0
- package/src/metadata/fragment/action.ts +119 -0
- package/src/metadata/fragment/field.ts +42 -0
- package/src/metadata/fragment/func.ts +21 -0
- package/src/metadata/fragment/index.ts +20 -0
- package/src/metadata/fragment/menu.ts +35 -0
- package/src/metadata/fragment/model.ts +76 -0
- package/src/metadata/fragment/page.ts +17 -0
- package/src/metadata/index.ts +4 -0
- package/src/metadata/runtime-fragment/action.ts +159 -0
- package/src/metadata/runtime-fragment/function.ts +25 -0
- package/src/metadata/runtime-fragment/index.ts +36 -0
- package/src/metadata/runtime-fragment/model.ts +18 -0
- package/src/metadata/runtime-fragment/module.ts +11 -0
- package/src/metadata/runtime-fragment/view.ts +44 -0
- package/src/metadata/types/dsl-node.ts +14 -0
- package/src/metadata/types/enumeration.ts +19 -0
- package/src/metadata/types/index.ts +8 -0
- package/src/metadata/types/layout.ts +4 -0
- package/src/metadata/types/model.ts +823 -0
- package/src/metadata/types/tag.ts +24 -0
- package/src/metadata/types/user.ts +27 -0
- package/src/metadata/types/value.ts +3 -0
- package/src/metadata/types/view.ts +194 -0
- package/src/plugin-loader/factory/PluginLoaderFactory.ts +23 -0
- package/src/plugin-loader/factory/index.ts +1 -0
- package/src/plugin-loader/index.ts +33 -0
- package/src/plugin-loader/loader/CJSPluginLoader.ts +18 -0
- package/src/plugin-loader/loader/CSSPluginLoader.ts +29 -0
- package/src/plugin-loader/loader/ESMPluginLoader.ts +53 -0
- package/src/plugin-loader/loader/IIFEPluginLoader.ts +18 -0
- package/src/plugin-loader/loader/LoadedEvent.ts +24 -0
- package/src/plugin-loader/loader/PluginLoader.ts +12 -0
- package/src/plugin-loader/loader/RemotePluginLoader.ts +54 -0
- package/src/plugin-loader/loader/UMDPluginLoader.ts +50 -0
- package/src/plugin-loader/loader/index.ts +1 -0
- package/src/plugin-loader/typing/index.ts +2 -0
- package/src/plugin-loader/typing/load-option.ts +51 -0
- package/src/plugin-loader/typing/loader-config.ts +38 -0
- package/src/plugin-loader/util/PluginLoadHelper.ts +70 -0
- package/src/plugin-loader/util/index.ts +1 -0
- package/src/util/element.ts +154 -0
- package/src/util/field.ts +63 -0
- package/src/util/helper.ts +6 -0
- package/src/util/index.ts +6 -0
- package/src/util/ke-common.ts +25 -0
- package/src/util/lang.ts +8 -0
- package/src/util/validation-utils.ts +17 -0
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { PluginLoader as InternalPluginLoader } from '../loader';
|
|
2
|
+
import { CSSPlugin, JavascriptPlugin, PluginLoadDependencies, PluginLoadDependency, PluginLoadOption } from '../typing';
|
|
3
|
+
|
|
4
|
+
let counter = 1;
|
|
5
|
+
|
|
6
|
+
function isPluginLoadOption(plugin: unknown): plugin is PluginLoadOption {
|
|
7
|
+
return !!plugin;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export class PluginLoadHelper {
|
|
11
|
+
private constructor() {
|
|
12
|
+
// reject create object
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
public static async loadDependencies(dependencies: PluginLoadDependencies): Promise<void> {
|
|
16
|
+
let readyLoadDependencies: PluginLoadDependency[];
|
|
17
|
+
if (Array.isArray(dependencies)) {
|
|
18
|
+
readyLoadDependencies = dependencies;
|
|
19
|
+
} else {
|
|
20
|
+
readyLoadDependencies = [
|
|
21
|
+
{
|
|
22
|
+
type: 'umd',
|
|
23
|
+
dependencies
|
|
24
|
+
}
|
|
25
|
+
];
|
|
26
|
+
}
|
|
27
|
+
await Promise.allSettled(
|
|
28
|
+
readyLoadDependencies.map((dependency) =>
|
|
29
|
+
InternalPluginLoader.loadDependencies(dependency.type, dependency.dependencies)
|
|
30
|
+
)
|
|
31
|
+
);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
public static loadJavascript(plugins: JavascriptPlugin[]): Promise<void> {
|
|
35
|
+
return InternalPluginLoader.load(
|
|
36
|
+
plugins
|
|
37
|
+
.map((plugin): PluginLoadOption | undefined => {
|
|
38
|
+
if (typeof plugin === 'string') {
|
|
39
|
+
return {
|
|
40
|
+
id: `plugin-${counter++}`,
|
|
41
|
+
type: 'umd',
|
|
42
|
+
path: plugin
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
if (plugin.path) {
|
|
46
|
+
return {
|
|
47
|
+
id: `plugin-${counter++}`,
|
|
48
|
+
type: plugin.type || 'umd',
|
|
49
|
+
path: plugin.path
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
console.error('Invalid javascript plugin.', plugin);
|
|
53
|
+
return undefined;
|
|
54
|
+
})
|
|
55
|
+
.filter(isPluginLoadOption)
|
|
56
|
+
);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
public static loadCSS(paths: CSSPlugin[]): Promise<void> {
|
|
60
|
+
return InternalPluginLoader.load(
|
|
61
|
+
paths.map((path): PluginLoadOption => {
|
|
62
|
+
return {
|
|
63
|
+
id: `plugin-css-${counter++}`,
|
|
64
|
+
type: 'css',
|
|
65
|
+
path
|
|
66
|
+
};
|
|
67
|
+
})
|
|
68
|
+
);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './PluginLoadHelper';
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ActionElement,
|
|
3
|
+
ApiElement,
|
|
4
|
+
ClearElement,
|
|
5
|
+
ContextElement,
|
|
6
|
+
FieldElement,
|
|
7
|
+
PropElement,
|
|
8
|
+
RequestElement,
|
|
9
|
+
ResponseElement,
|
|
10
|
+
ViewElement
|
|
11
|
+
} from '../element';
|
|
12
|
+
|
|
13
|
+
import { IModelField, ElementType, IDslNode } from '../metadata';
|
|
14
|
+
import { deepClone } from './helper';
|
|
15
|
+
|
|
16
|
+
const createViewElement = (dslNode: IDslNode | undefined): ViewElement | null => {
|
|
17
|
+
if (!dslNode) {
|
|
18
|
+
return {} as ViewElement;
|
|
19
|
+
}
|
|
20
|
+
return !Array.isArray(dslNode) ? (deepClone(dslNode) as ViewElement) : null;
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
const createPropElements = (parentNode: IDslNode | undefined): PropElement[] => {
|
|
24
|
+
if (!parentNode || !parentNode.children) {
|
|
25
|
+
return [] as FieldElement[];
|
|
26
|
+
}
|
|
27
|
+
return parentNode.children
|
|
28
|
+
.filter((a) => a.tagName === ElementType.PROP)
|
|
29
|
+
.map((node) => {
|
|
30
|
+
return {
|
|
31
|
+
name: node.name,
|
|
32
|
+
textContent: node.textContent
|
|
33
|
+
} as FieldElement;
|
|
34
|
+
});
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
const createFieldElement = (fieldNode: IDslNode | undefined): FieldElement => {
|
|
38
|
+
if (!fieldNode) {
|
|
39
|
+
return {} as FieldElement;
|
|
40
|
+
}
|
|
41
|
+
return deepClone(fieldNode) as FieldElement;
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
const createFieldElements = (parentNode: IDslNode | undefined): FieldElement[] => {
|
|
45
|
+
if (!parentNode || !parentNode.children) {
|
|
46
|
+
return [] as FieldElement[];
|
|
47
|
+
}
|
|
48
|
+
return parentNode.children
|
|
49
|
+
.filter((a) => a.tagName === ElementType.FIELD)
|
|
50
|
+
.map((node) => {
|
|
51
|
+
return {
|
|
52
|
+
name: node.name,
|
|
53
|
+
textContent: node.textContent,
|
|
54
|
+
children: createFieldElements(node)
|
|
55
|
+
} as FieldElement;
|
|
56
|
+
});
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* 创建action元素
|
|
61
|
+
* @param actionNode
|
|
62
|
+
* @param parentDslNode actionNode所在的父节点
|
|
63
|
+
*/
|
|
64
|
+
const createActionElement = (actionNode: IDslNode, parentDslNode: IDslNode): ActionElement => {
|
|
65
|
+
if (!parentDslNode) {
|
|
66
|
+
return {} as ActionElement;
|
|
67
|
+
}
|
|
68
|
+
const actionEle = deepClone(actionNode) as ActionElement;
|
|
69
|
+
const apiNode =
|
|
70
|
+
(parentDslNode.children &&
|
|
71
|
+
parentDslNode.children.find((d) => d.tagName === ElementType.API && d.name === actionEle.submitApi)) ||
|
|
72
|
+
null;
|
|
73
|
+
if (apiNode) {
|
|
74
|
+
const apiEle = createApiElement(parentDslNode, actionEle.submitApi);
|
|
75
|
+
if (!apiEle) {
|
|
76
|
+
return {} as ActionElement;
|
|
77
|
+
}
|
|
78
|
+
actionEle.api = apiEle;
|
|
79
|
+
}
|
|
80
|
+
return actionEle;
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
const createApiElement = (parentDslNode: IDslNode, apiName: string, dslFields?: IModelField[]) => {
|
|
84
|
+
const apiNode =
|
|
85
|
+
(parentDslNode.children &&
|
|
86
|
+
parentDslNode.children.find((d) => d.tagName === ElementType.API && d.name === apiName)) ||
|
|
87
|
+
null;
|
|
88
|
+
if (!apiNode) {
|
|
89
|
+
console.warn(`api not fund: ${apiName}`, parentDslNode);
|
|
90
|
+
return null;
|
|
91
|
+
}
|
|
92
|
+
const apiElement = deepClone(apiNode) as ApiElement;
|
|
93
|
+
if (!apiElement.fun) {
|
|
94
|
+
console.warn(`api fun not fund: ${apiName}`, parentDslNode);
|
|
95
|
+
}
|
|
96
|
+
if (!apiElement.type) {
|
|
97
|
+
console.warn(`api type not fund: ${apiName}`, parentDslNode);
|
|
98
|
+
}
|
|
99
|
+
apiElement.context = {
|
|
100
|
+
props: createPropElements(apiNode!.children.find((d) => d.tagName === ElementType.CONTEXT))
|
|
101
|
+
} as ContextElement;
|
|
102
|
+
apiElement.request = {
|
|
103
|
+
fields: mergeFields(
|
|
104
|
+
createFieldElements(apiNode!.children.find((d) => d.tagName === ElementType.REQUEST)),
|
|
105
|
+
dslFields
|
|
106
|
+
)
|
|
107
|
+
} as RequestElement;
|
|
108
|
+
apiElement.response = {
|
|
109
|
+
fields: mergeFields(
|
|
110
|
+
createFieldElements(apiNode!.children.find((d) => d.tagName === ElementType.RESPONSE)),
|
|
111
|
+
dslFields
|
|
112
|
+
)
|
|
113
|
+
} as ResponseElement;
|
|
114
|
+
apiElement.clear = {
|
|
115
|
+
fields: createFieldElements(apiNode!.children.find((d) => d.tagName === ElementType.CLEAR))
|
|
116
|
+
} as ClearElement;
|
|
117
|
+
return apiElement;
|
|
118
|
+
};
|
|
119
|
+
|
|
120
|
+
function mergeFields(fieldElements: FieldElement[], dslFields?: IModelField[]) {
|
|
121
|
+
return fieldElements && fieldElements.length
|
|
122
|
+
? fieldElements
|
|
123
|
+
: (dslFields || []).map((a) => modelField2fieldElement(a));
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
const fieldElement2ModelField = (fieldElement: FieldElement): IModelField => {
|
|
127
|
+
return {
|
|
128
|
+
name: fieldElement.data,
|
|
129
|
+
ttype: fieldElement.ttype,
|
|
130
|
+
references: fieldElement.references!,
|
|
131
|
+
relatedTtype: fieldElement.relatedTtype
|
|
132
|
+
} as IModelField;
|
|
133
|
+
};
|
|
134
|
+
|
|
135
|
+
const modelField2fieldElement = (modelField: IModelField): FieldElement => {
|
|
136
|
+
return {
|
|
137
|
+
data: modelField.name,
|
|
138
|
+
name: modelField.name,
|
|
139
|
+
ttype: modelField.ttype,
|
|
140
|
+
references: modelField.references,
|
|
141
|
+
relatedTtype: modelField.relatedTtype
|
|
142
|
+
} as FieldElement;
|
|
143
|
+
};
|
|
144
|
+
|
|
145
|
+
export {
|
|
146
|
+
createViewElement,
|
|
147
|
+
createApiElement,
|
|
148
|
+
createPropElements,
|
|
149
|
+
createFieldElements,
|
|
150
|
+
createActionElement,
|
|
151
|
+
createFieldElement,
|
|
152
|
+
fieldElement2ModelField,
|
|
153
|
+
modelField2fieldElement
|
|
154
|
+
};
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { IModelField, ModelFieldType } from '../metadata/types';
|
|
2
|
+
|
|
3
|
+
const isSimpleField = (field: IModelField): boolean => {
|
|
4
|
+
switch (field.ttype) {
|
|
5
|
+
case ModelFieldType.Boolean:
|
|
6
|
+
case ModelFieldType.Integer:
|
|
7
|
+
case ModelFieldType.Long:
|
|
8
|
+
case ModelFieldType.Float:
|
|
9
|
+
case ModelFieldType.Currency:
|
|
10
|
+
case ModelFieldType.String:
|
|
11
|
+
case ModelFieldType.Email:
|
|
12
|
+
case ModelFieldType.Phone:
|
|
13
|
+
case ModelFieldType.ID:
|
|
14
|
+
case ModelFieldType.Date:
|
|
15
|
+
case ModelFieldType.DateTime:
|
|
16
|
+
case ModelFieldType.Time:
|
|
17
|
+
case ModelFieldType.Year:
|
|
18
|
+
case ModelFieldType.Enum:
|
|
19
|
+
case ModelFieldType.MultiEnum:
|
|
20
|
+
case ModelFieldType.HTML:
|
|
21
|
+
case ModelFieldType.Map:
|
|
22
|
+
case ModelFieldType.Text: {
|
|
23
|
+
return true;
|
|
24
|
+
}
|
|
25
|
+
default: {
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
const isComplexTtype = (ttype: ModelFieldType): boolean => {
|
|
32
|
+
return [
|
|
33
|
+
ModelFieldType.OneToOne,
|
|
34
|
+
ModelFieldType.OneToMany,
|
|
35
|
+
ModelFieldType.ManyToOne,
|
|
36
|
+
ModelFieldType.ManyToMany
|
|
37
|
+
].includes(ttype);
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
const isDateTtype = (ttype: ModelFieldType): boolean => {
|
|
41
|
+
return [ModelFieldType.Date, ModelFieldType.DateTime, ModelFieldType.Year, ModelFieldType.Time].includes(ttype);
|
|
42
|
+
};
|
|
43
|
+
const isNumberTtype = (ttype: ModelFieldType): boolean => {
|
|
44
|
+
return [
|
|
45
|
+
ModelFieldType.ID,
|
|
46
|
+
ModelFieldType.UID,
|
|
47
|
+
ModelFieldType.Integer,
|
|
48
|
+
ModelFieldType.Long,
|
|
49
|
+
ModelFieldType.Float,
|
|
50
|
+
ModelFieldType.Currency
|
|
51
|
+
].includes(ttype);
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
const isStringTtype = (ttype: ModelFieldType) => {
|
|
55
|
+
return [
|
|
56
|
+
ModelFieldType.String,
|
|
57
|
+
ModelFieldType.Text,
|
|
58
|
+
ModelFieldType.HTML,
|
|
59
|
+
ModelFieldType.Phone,
|
|
60
|
+
ModelFieldType.Email
|
|
61
|
+
].includes(ttype);
|
|
62
|
+
};
|
|
63
|
+
export { isSimpleField, isComplexTtype, isDateTtype, isNumberTtype, isStringTtype };
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 判断对象(特指除下划线外的属性的对象,所以取名为keObject)是否为空
|
|
3
|
+
* @param value
|
|
4
|
+
*/
|
|
5
|
+
const isEmptyKeObject = (value: any): boolean => {
|
|
6
|
+
if (value === false || value === 0) {
|
|
7
|
+
return false;
|
|
8
|
+
}
|
|
9
|
+
if (!value) {
|
|
10
|
+
return true;
|
|
11
|
+
}
|
|
12
|
+
if (value instanceof Object) {
|
|
13
|
+
if (Object.keys((value as Record<string, unknown>) || {}).length === 0) {
|
|
14
|
+
return true;
|
|
15
|
+
}
|
|
16
|
+
// 老版本的代码这样判断的,猜测是 _ 开头的属于前端定义有特殊意义的属性,所以不算是业务对象的属性
|
|
17
|
+
const keys = Object.keys((value as Record<string, unknown>) || {}).filter((name) => !name.startsWith('_'));
|
|
18
|
+
return keys.length === 0;
|
|
19
|
+
}
|
|
20
|
+
if (Array.isArray(value) && value.length === 0) {
|
|
21
|
+
return true;
|
|
22
|
+
}
|
|
23
|
+
return false;
|
|
24
|
+
};
|
|
25
|
+
export { isEmptyKeObject };
|
package/src/util/lang.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Determine if the argument is shaped like a Promise
|
|
3
|
+
*/
|
|
4
|
+
export function isPromise<T = unknown>(obj: unknown): obj is Promise<T> {
|
|
5
|
+
// allow any Promise/A+ compliant thenable.
|
|
6
|
+
// It's up to the caller to ensure that obj.then conforms to the spec
|
|
7
|
+
return !!obj && typeof (obj as { then: unknown }).then === 'function';
|
|
8
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { isEmptyKeObject } from './ke-common';
|
|
2
|
+
|
|
3
|
+
const isValidateEmpty = (value: any): boolean => {
|
|
4
|
+
return isEmptyKeObject(value) || (Array.isArray(value) && value.length === 0);
|
|
5
|
+
};
|
|
6
|
+
|
|
7
|
+
const isEmptyValue = (value: any): value is null => {
|
|
8
|
+
return (
|
|
9
|
+
value === undefined ||
|
|
10
|
+
value === null ||
|
|
11
|
+
value === '' ||
|
|
12
|
+
(Array.isArray(value) && value.length === 0) ||
|
|
13
|
+
(typeof value === 'object' && Object.keys(value).length === 0)
|
|
14
|
+
);
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
export { isValidateEmpty, isEmptyValue };
|