@alauda-fe/crd-form 0.0.1
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/esm2022/alauda-fe-crd-form.mjs +5 -0
- package/esm2022/lib/abstract/base-array.mjs +117 -0
- package/esm2022/lib/crd-form/component.mjs +334 -0
- package/esm2022/lib/crd-form/helper.mjs +32 -0
- package/esm2022/lib/crd-form.module.mjs +117 -0
- package/esm2022/lib/field-controls/expressions/expression-core.mjs +2 -0
- package/esm2022/lib/field-controls/expressions/props-expression.mjs +58 -0
- package/esm2022/lib/field-controls/form-item.component.mjs +121 -0
- package/esm2022/lib/field-controls/index.mjs +8 -0
- package/esm2022/lib/field-controls/module.mjs +141 -0
- package/esm2022/lib/field-controls/operand-advanced-field-group.component.mjs +80 -0
- package/esm2022/lib/field-controls/operand-array-field-group.component.mjs +112 -0
- package/esm2022/lib/field-controls/operand-field-group.component.mjs +98 -0
- package/esm2022/lib/field-controls/operand-field.component.mjs +870 -0
- package/esm2022/lib/field-controls/widgets/array-table/component.mjs +109 -0
- package/esm2022/lib/field-controls/widgets/basic-auth-secret/component.mjs +116 -0
- package/esm2022/lib/field-controls/widgets/basic-auth-secret/create/component.mjs +211 -0
- package/esm2022/lib/field-controls/widgets/basic-auth-secret/type.mjs +2 -0
- package/esm2022/lib/field-controls/widgets/index.mjs +8 -0
- package/esm2022/lib/field-controls/widgets/k8s-resource-prefix/component.mjs +169 -0
- package/esm2022/lib/field-controls/widgets/k8s-resource-prefix/util.mjs +40 -0
- package/esm2022/lib/field-controls/widgets/link/component.mjs +68 -0
- package/esm2022/lib/field-controls/widgets/resource-requirements/resource-requirements.component.mjs +524 -0
- package/esm2022/lib/field-controls/widgets/utils.mjs +73 -0
- package/esm2022/lib/field-controls/widgets/yaml-editor/yaml-editor.component.mjs +94 -0
- package/esm2022/lib/field-widgets/htpasswd/component.mjs +35 -0
- package/esm2022/lib/field-widgets/htpasswd/form.mjs +171 -0
- package/esm2022/lib/field-widgets/htpasswd/index.mjs +4 -0
- package/esm2022/lib/field-widgets/htpasswd/module.mjs +54 -0
- package/esm2022/lib/field-widgets/index.mjs +2 -0
- package/esm2022/lib/remote-widgets/constants.mjs +4 -0
- package/esm2022/lib/remote-widgets/index.mjs +4 -0
- package/esm2022/lib/remote-widgets/remote-widget.service.mjs +42 -0
- package/esm2022/lib/remote-widgets/token.mjs +7 -0
- package/esm2022/lib/spec-descriptors/capability/capability.component.mjs +139 -0
- package/esm2022/lib/spec-descriptors/capability-list/capability-list.component.mjs +189 -0
- package/esm2022/lib/spec-descriptors/index.mjs +4 -0
- package/esm2022/lib/spec-descriptors/util.mjs +13 -0
- package/esm2022/lib/types/index.mjs +73 -0
- package/esm2022/lib/utils/capability.mjs +295 -0
- package/esm2022/lib/utils/constant.mjs +22 -0
- package/esm2022/lib/utils/directives.mjs +19 -0
- package/esm2022/lib/utils/helper.mjs +201 -0
- package/esm2022/lib/utils/index.mjs +7 -0
- package/esm2022/lib/utils/service-model.mjs +12 -0
- package/esm2022/lib/utils/util.mjs +310 -0
- package/esm2022/public-api.mjs +13 -0
- package/index.d.ts +5 -0
- package/lib/abstract/base-array.d.ts +31 -0
- package/lib/crd-form/component.d.ts +61 -0
- package/lib/crd-form/helper.d.ts +7 -0
- package/lib/crd-form.module.d.ts +16 -0
- package/lib/field-controls/expressions/expression-core.d.ts +6 -0
- package/lib/field-controls/expressions/props-expression.d.ts +36 -0
- package/lib/field-controls/form-item.component.d.ts +11 -0
- package/lib/field-controls/index.d.ts +7 -0
- package/lib/field-controls/module.d.ts +23 -0
- package/lib/field-controls/operand-advanced-field-group.component.d.ts +16 -0
- package/lib/field-controls/operand-array-field-group.component.d.ts +8 -0
- package/lib/field-controls/operand-field-group.component.d.ts +24 -0
- package/lib/field-controls/operand-field.component.d.ts +110 -0
- package/lib/field-controls/widgets/array-table/component.d.ts +8 -0
- package/lib/field-controls/widgets/basic-auth-secret/component.d.ts +26 -0
- package/lib/field-controls/widgets/basic-auth-secret/create/component.d.ts +45 -0
- package/lib/field-controls/widgets/basic-auth-secret/type.d.ts +11 -0
- package/lib/field-controls/widgets/index.d.ts +7 -0
- package/lib/field-controls/widgets/k8s-resource-prefix/component.d.ts +35 -0
- package/lib/field-controls/widgets/k8s-resource-prefix/util.d.ts +3 -0
- package/lib/field-controls/widgets/link/component.d.ts +20 -0
- package/lib/field-controls/widgets/resource-requirements/resource-requirements.component.d.ts +88 -0
- package/lib/field-controls/widgets/utils.d.ts +17 -0
- package/lib/field-controls/widgets/yaml-editor/yaml-editor.component.d.ts +36 -0
- package/lib/field-widgets/htpasswd/component.d.ts +9 -0
- package/lib/field-widgets/htpasswd/form.d.ts +32 -0
- package/lib/field-widgets/htpasswd/index.d.ts +3 -0
- package/lib/field-widgets/htpasswd/module.d.ts +13 -0
- package/lib/field-widgets/index.d.ts +1 -0
- package/lib/remote-widgets/constants.d.ts +3 -0
- package/lib/remote-widgets/index.d.ts +3 -0
- package/lib/remote-widgets/remote-widget.service.d.ts +28 -0
- package/lib/remote-widgets/token.d.ts +3 -0
- package/lib/spec-descriptors/capability/capability.component.d.ts +20 -0
- package/lib/spec-descriptors/capability-list/capability-list.component.d.ts +34 -0
- package/lib/spec-descriptors/index.d.ts +3 -0
- package/lib/spec-descriptors/util.d.ts +4 -0
- package/lib/types/index.d.ts +122 -0
- package/lib/utils/capability.d.ts +54 -0
- package/lib/utils/constant.d.ts +12 -0
- package/lib/utils/directives.d.ts +9 -0
- package/lib/utils/helper.d.ts +61 -0
- package/lib/utils/index.d.ts +6 -0
- package/lib/utils/service-model.d.ts +44 -0
- package/lib/utils/util.d.ts +48 -0
- package/package.json +30 -0
- package/public-api.d.ts +9 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export * from './capability';
|
|
2
|
+
export * from './constant';
|
|
3
|
+
export * from './directives';
|
|
4
|
+
export * from './helper';
|
|
5
|
+
export * from './service-model';
|
|
6
|
+
export * from './util';
|
|
7
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NyZC1mb3JtL3NyYy9saWIvdXRpbHMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxjQUFjLENBQUM7QUFDN0IsY0FBYyxZQUFZLENBQUM7QUFDM0IsY0FBYyxjQUFjLENBQUM7QUFDN0IsY0FBYyxVQUFVLENBQUM7QUFDekIsY0FBYyxpQkFBaUIsQ0FBQztBQUNoQyxjQUFjLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vY2FwYWJpbGl0eSc7XG5leHBvcnQgKiBmcm9tICcuL2NvbnN0YW50JztcbmV4cG9ydCAqIGZyb20gJy4vZGlyZWN0aXZlcyc7XG5leHBvcnQgKiBmcm9tICcuL2hlbHBlcic7XG5leHBvcnQgKiBmcm9tICcuL3NlcnZpY2UtbW9kZWwnO1xuZXhwb3J0ICogZnJvbSAnLi91dGlsJztcbiJdfQ==
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export const NodeModel = {
|
|
2
|
+
apiVersion: 'v1',
|
|
3
|
+
label: 'Node',
|
|
4
|
+
labelKey: 'public~Node',
|
|
5
|
+
plural: 'nodes',
|
|
6
|
+
abbr: 'N',
|
|
7
|
+
kind: 'Node',
|
|
8
|
+
id: 'node',
|
|
9
|
+
labelPlural: 'Nodes',
|
|
10
|
+
labelPluralKey: 'public~Nodes',
|
|
11
|
+
};
|
|
12
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS1tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY3JkLWZvcm0vc3JjL2xpYi91dGlscy9zZXJ2aWNlLW1vZGVsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQW1EQSxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQVk7SUFDaEMsVUFBVSxFQUFFLElBQUk7SUFDaEIsS0FBSyxFQUFFLE1BQU07SUFFYixRQUFRLEVBQUUsYUFBYTtJQUN2QixNQUFNLEVBQUUsT0FBTztJQUNmLElBQUksRUFBRSxHQUFHO0lBQ1QsSUFBSSxFQUFFLE1BQU07SUFDWixFQUFFLEVBQUUsTUFBTTtJQUNWLFdBQVcsRUFBRSxPQUFPO0lBRXBCLGNBQWMsRUFBRSxjQUFjO0NBQy9CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSBLOHNWZXJiID1cbiAgfCAnY3JlYXRlJ1xuICB8ICdnZXQnXG4gIHwgJ2xpc3QnXG4gIHwgJ3VwZGF0ZSdcbiAgfCAncGF0Y2gnXG4gIHwgJ2RlbGV0ZSdcbiAgfCAnZGVsZXRlY29sbGVjdGlvbidcbiAgfCAnd2F0Y2gnO1xuXG5leHBvcnQgaW50ZXJmYWNlIE1hdGNoRXhwcmVzc2lvbldpdGhWYWx1ZXMge1xuICBrZXk6IHN0cmluZztcbiAgb3BlcmF0b3I6ICdJbicgfCAnTm90SW4nIHwgJ0V4aXN0cycgfCAnRG9lc05vdEV4aXN0JztcbiAgdmFsdWVzOiBzdHJpbmdbXTtcbn1cbmV4cG9ydCB0eXBlIE1hdGNoRXhwcmVzc2lvbiA9XG4gIHwgeyBrZXk6IHN0cmluZzsgb3BlcmF0b3I6ICdFeGlzdHMnIHwgJ0RvZXNOb3RFeGlzdCcgfVxuICB8IE1hdGNoRXhwcmVzc2lvbldpdGhWYWx1ZXM7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWF0Y2hMYWJlbHMge1xuICBba2V5OiBzdHJpbmddOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VsZWN0b3Ige1xuICBtYXRjaExhYmVscz86IE1hdGNoTGFiZWxzO1xuICBtYXRjaEV4cHJlc3Npb25zPzogTWF0Y2hFeHByZXNzaW9uW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSzhzS2luZCB7XG4gIGFiYnI6IHN0cmluZztcbiAga2luZDogc3RyaW5nO1xuICBsYWJlbDogc3RyaW5nO1xuICBsYWJlbEtleT86IHN0cmluZztcbiAgbGFiZWxQbHVyYWw6IHN0cmluZztcbiAgbGFiZWxQbHVyYWxLZXk/OiBzdHJpbmc7XG4gIHBsdXJhbDogc3RyaW5nO1xuICBwcm9wYWdhdGlvblBvbGljeT86ICdGb3JlZ3JvdW5kJyB8ICdCYWNrZ3JvdW5kJztcbiAgaWQ/OiBzdHJpbmc7XG4gIGNyZD86IGJvb2xlYW47XG4gIGFwaVZlcnNpb246IHN0cmluZztcbiAgYXBpR3JvdXA/OiBzdHJpbmc7XG4gIG5hbWVzcGFjZWQ/OiBib29sZWFuO1xuICBzZWxlY3Rvcj86IFNlbGVjdG9yO1xuICBsYWJlbHM/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuICBhbm5vdGF0aW9ucz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG4gIHZlcmJzPzogSzhzVmVyYltdO1xuICBzaG9ydE5hbWVzPzogc3RyaW5nW107XG4gIGNvbG9yPzogc3RyaW5nO1xuICBsZWdhY3lQbHVyYWxVUkw/OiBib29sZWFuO1xufVxuXG5leHBvcnQgY29uc3QgTm9kZU1vZGVsOiBLOHNLaW5kID0ge1xuICBhcGlWZXJzaW9uOiAndjEnLFxuICBsYWJlbDogJ05vZGUnLFxuXG4gIGxhYmVsS2V5OiAncHVibGljfk5vZGUnLFxuICBwbHVyYWw6ICdub2RlcycsXG4gIGFiYnI6ICdOJyxcbiAga2luZDogJ05vZGUnLFxuICBpZDogJ25vZGUnLFxuICBsYWJlbFBsdXJhbDogJ05vZGVzJyxcblxuICBsYWJlbFBsdXJhbEtleTogJ3B1YmxpY35Ob2RlcycsXG59O1xuIl19
|
|
@@ -0,0 +1,310 @@
|
|
|
1
|
+
import { isEqual } from '@alauda-fe/common';
|
|
2
|
+
import { find, flatMap, flatMapDepth, flatten, get, groupBy, isArray, map, parseInt, pick, reduce, sortBy, startCase, times, toPath, union, uniqWith, } from 'lodash-es';
|
|
3
|
+
import { SpecCapability, SpecCapabilityUIPrefix, SpecCapabilityWidgetsPrefix, Validations, } from '../types';
|
|
4
|
+
import { fieldShouldReveal, getBasicCapabilityType, getCapabilityDisabled, getCapabilityValidations, getDisplayByCapability, } from './capability';
|
|
5
|
+
import { DESCRIPTOR_DEFINITION_KEY, GROUP_PATTERN, MAX_DEPTH, SCHEMA_PATH, } from './constant';
|
|
6
|
+
import { getRelatedFields, getTreeFields, hasDescriptor, parseArrayPath, } from './helper';
|
|
7
|
+
export function getPropertyDepth(property, depth = 0) {
|
|
8
|
+
if (!property || !['object', 'array'].includes(property.type)) {
|
|
9
|
+
return depth;
|
|
10
|
+
}
|
|
11
|
+
return Math.max(0, ...Object.values(property.properties || property.items?.properties || {}).map(nestedProperty => getPropertyDepth(nestedProperty, depth + 1)));
|
|
12
|
+
}
|
|
13
|
+
export function getFieldsFromDescriptor({ path, description, displayName, 'x-descriptors': capabilities = [], }, data, openApi, _originDescriptors) {
|
|
14
|
+
const { match, pathBeforeIndex, pathAfterIndex } = parseArrayPath(path);
|
|
15
|
+
const filedBasicType = getBasicCapabilityType(capabilities);
|
|
16
|
+
const disabled = getCapabilityDisabled(capabilities);
|
|
17
|
+
const validations = getCapabilityValidations(capabilities);
|
|
18
|
+
if (match) {
|
|
19
|
+
const n = get(data, toPath(`spec.${pathBeforeIndex}`), []).length || 1;
|
|
20
|
+
const pathAfterIndexStr = `.${pathAfterIndex}`;
|
|
21
|
+
let extra = [];
|
|
22
|
+
if (_originDescriptors) {
|
|
23
|
+
extra = flatten(_originDescriptors
|
|
24
|
+
.filter(d => d.path.startsWith(`${pathBeforeIndex}[0]`) && d.path !== path)
|
|
25
|
+
.map(d => times(n, index => {
|
|
26
|
+
const oPath = d.path.replace(`${pathBeforeIndex}[0]`, `${pathBeforeIndex}[${index}]`);
|
|
27
|
+
return {
|
|
28
|
+
...d,
|
|
29
|
+
path: oPath,
|
|
30
|
+
};
|
|
31
|
+
}).slice(1)));
|
|
32
|
+
}
|
|
33
|
+
return flatten([
|
|
34
|
+
...times(n, index => {
|
|
35
|
+
const propertyPath = `spec.${pathBeforeIndex}[${index}]${pathAfterIndex && pathAfterIndexStr}`;
|
|
36
|
+
const property = getOpenApiPropertyByPath(`spec.${path}`, openApi);
|
|
37
|
+
return {
|
|
38
|
+
path: propertyPath,
|
|
39
|
+
value: get(data, propertyPath),
|
|
40
|
+
description,
|
|
41
|
+
displayName,
|
|
42
|
+
capabilities,
|
|
43
|
+
type: filedBasicType || property?.type,
|
|
44
|
+
required: null,
|
|
45
|
+
disabled,
|
|
46
|
+
validations: {
|
|
47
|
+
...validations,
|
|
48
|
+
...(property?.required && { required: true }),
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
}),
|
|
52
|
+
...extra.map(e => getFieldsFromDescriptor(e, data, openApi)),
|
|
53
|
+
]);
|
|
54
|
+
}
|
|
55
|
+
// 通过 descriptor 查找原始 CRD 节点,推导类型、validation 等信息
|
|
56
|
+
const propertyPath = `spec.${path}`;
|
|
57
|
+
const property = getOpenApiPropertyByPath(propertyPath, openApi);
|
|
58
|
+
return [
|
|
59
|
+
{
|
|
60
|
+
path: propertyPath,
|
|
61
|
+
description,
|
|
62
|
+
displayName,
|
|
63
|
+
capabilities,
|
|
64
|
+
disabled,
|
|
65
|
+
value: get(data, propertyPath),
|
|
66
|
+
type: filedBasicType || property?.type,
|
|
67
|
+
required: null,
|
|
68
|
+
validations: {
|
|
69
|
+
...validations,
|
|
70
|
+
...(property?.required && { required: true }),
|
|
71
|
+
},
|
|
72
|
+
},
|
|
73
|
+
];
|
|
74
|
+
}
|
|
75
|
+
export function getOpenApiPropertyByPath(descriptorPath, openApi) {
|
|
76
|
+
const paths = descriptorPath.split('.');
|
|
77
|
+
try {
|
|
78
|
+
return paths.reduce((acc, path) => {
|
|
79
|
+
acc = path.includes('[0]')
|
|
80
|
+
? acc.items.properties[path.split('[0]')[0]]
|
|
81
|
+
: acc.properties[path];
|
|
82
|
+
return acc;
|
|
83
|
+
}, openApi);
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
return null;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
export function getFieldsFromOpenApiSchema(openApi, descriptors, data, openApiSchemaPath = SCHEMA_PATH, maxDepth = MAX_DEPTH) {
|
|
90
|
+
const path = isArray(openApiSchemaPath)
|
|
91
|
+
? openApiSchemaPath
|
|
92
|
+
: openApiSchemaPath.split('.').filter(Boolean);
|
|
93
|
+
const properties = get(openApi, [...path, 'properties'], {});
|
|
94
|
+
const required = get(openApi, [...path, 'required'], []);
|
|
95
|
+
return reduce(properties, (accumulator, _property, propertyName) => {
|
|
96
|
+
const property = _property;
|
|
97
|
+
if (!property.type || getPropertyDepth(property) > maxDepth) {
|
|
98
|
+
return accumulator;
|
|
99
|
+
}
|
|
100
|
+
return [
|
|
101
|
+
...accumulator,
|
|
102
|
+
...flattenNestedProperties(propertyName, property, descriptors, data, {
|
|
103
|
+
required: required.includes(propertyName),
|
|
104
|
+
}),
|
|
105
|
+
];
|
|
106
|
+
}, []);
|
|
107
|
+
}
|
|
108
|
+
export function flattenNestedProperties(propertyName, property, descriptors, data, { currentCapabilities = [], currentPath = [], required = false, }) {
|
|
109
|
+
if (!property) {
|
|
110
|
+
return [];
|
|
111
|
+
}
|
|
112
|
+
const handleObjectProperty = () => flatMap(property.properties, (nestedProperty, nestedPropertyName) => flattenNestedProperties(nestedPropertyName, nestedProperty, descriptors, data, {
|
|
113
|
+
currentCapabilities: [
|
|
114
|
+
...currentCapabilities,
|
|
115
|
+
`${SpecCapability.fieldGroup}${propertyName}`,
|
|
116
|
+
],
|
|
117
|
+
currentPath: [...currentPath, propertyName],
|
|
118
|
+
required: (property.required || []).includes(nestedPropertyName),
|
|
119
|
+
}));
|
|
120
|
+
const handleArrayProperty = () => {
|
|
121
|
+
// Find the number of array elements that are already defined in the provided object
|
|
122
|
+
const n = get(data, `spec.${currentPath.join('.')}${propertyName}`, []).length || 1;
|
|
123
|
+
// Since _.times will return a multidimensional array of OperandFields (OperandField[][]), we
|
|
124
|
+
// need to flatten one level deeper than _.flatMap provides.
|
|
125
|
+
return flatMapDepth(property.items.properties, (nestedProperty, nestedPropertyName) =>
|
|
126
|
+
// Repeat recursion (n) times so that the correct number of fields are created for
|
|
127
|
+
// existing values in obj. This ensures that further nested fields also get created.
|
|
128
|
+
times(n, index => flattenNestedProperties(nestedPropertyName, nestedProperty, descriptors, data, {
|
|
129
|
+
currentCapabilities: [
|
|
130
|
+
...currentCapabilities,
|
|
131
|
+
`${SpecCapability.arrayFieldGroup}${propertyName}`,
|
|
132
|
+
],
|
|
133
|
+
currentPath: [...currentPath, `${propertyName}[${index}]`], // Array field paths must include an index
|
|
134
|
+
required: (property?.required || []).includes(nestedPropertyName),
|
|
135
|
+
})), 2);
|
|
136
|
+
};
|
|
137
|
+
const handleAtomicProperty = () => {
|
|
138
|
+
const path = [...currentPath, propertyName].join('.');
|
|
139
|
+
const descriptor = descriptors.find(item => item.path === modifyArrayFieldPathIndex(path, () => 0));
|
|
140
|
+
const capabilities = union(descriptor?.[DESCRIPTOR_DEFINITION_KEY] || [], currentCapabilities, getCapabilitiesForOpenApiProperty(property, descriptor?.[DESCRIPTOR_DEFINITION_KEY]));
|
|
141
|
+
const validations = getCapabilityValidations(capabilities);
|
|
142
|
+
const fieldPath = `spec.${path}`;
|
|
143
|
+
return [
|
|
144
|
+
{
|
|
145
|
+
path: fieldPath,
|
|
146
|
+
type: property.type,
|
|
147
|
+
required,
|
|
148
|
+
capabilities,
|
|
149
|
+
description: descriptor?.description || property.description,
|
|
150
|
+
displayName: descriptor?.displayName || startCase(propertyName),
|
|
151
|
+
validations: {
|
|
152
|
+
...pick(property, Object.keys(Validations)),
|
|
153
|
+
...validations,
|
|
154
|
+
},
|
|
155
|
+
value: get(data, fieldPath),
|
|
156
|
+
},
|
|
157
|
+
];
|
|
158
|
+
};
|
|
159
|
+
switch (property.type) {
|
|
160
|
+
case 'object': {
|
|
161
|
+
return handleObjectProperty();
|
|
162
|
+
}
|
|
163
|
+
case 'array': {
|
|
164
|
+
return handleArrayProperty();
|
|
165
|
+
}
|
|
166
|
+
default: {
|
|
167
|
+
return handleAtomicProperty();
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
// Accepts an OpenAPI spec property and returns a corresponding SpecCapability[] array.
|
|
172
|
+
export function getCapabilitiesForOpenApiProperty(property, capabilities = []) {
|
|
173
|
+
const formControlCapabilities = [
|
|
174
|
+
SpecCapabilityUIPrefix,
|
|
175
|
+
SpecCapabilityWidgetsPrefix,
|
|
176
|
+
SpecCapability.k8sResourcePrefix,
|
|
177
|
+
];
|
|
178
|
+
if (capabilities.some(i => formControlCapabilities.some(k => i.startsWith(k)))) {
|
|
179
|
+
return [];
|
|
180
|
+
}
|
|
181
|
+
if (property.enum) {
|
|
182
|
+
return (property.enum || []).map((option) => `${SpecCapability.select}${option}`);
|
|
183
|
+
}
|
|
184
|
+
switch (property.type) {
|
|
185
|
+
case 'integer': {
|
|
186
|
+
return [SpecCapability.number];
|
|
187
|
+
}
|
|
188
|
+
case 'boolean': {
|
|
189
|
+
return [SpecCapability.booleanSwitch];
|
|
190
|
+
}
|
|
191
|
+
default: {
|
|
192
|
+
return [SpecCapability.text];
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
export function modifyArrayFieldPathIndex(path, operation) {
|
|
197
|
+
const { match, index, pathBeforeIndex, pathAfterIndex } = parseArrayPath(path);
|
|
198
|
+
const pathAfterIndexStr = `.${pathAfterIndex}`;
|
|
199
|
+
return match
|
|
200
|
+
? `${pathBeforeIndex}[${operation(index)}]${pathAfterIndex && pathAfterIndexStr}`
|
|
201
|
+
: path;
|
|
202
|
+
}
|
|
203
|
+
export function pathToArray(path) {
|
|
204
|
+
return map(toPath(path), subPath => /^\d+$/.test(subPath) ? parseInt(subPath, 10) : subPath);
|
|
205
|
+
}
|
|
206
|
+
export function parseGroupDescriptor(field) {
|
|
207
|
+
const groupDescriptor = find(field.capabilities, descriptor => descriptor.startsWith(SpecCapability.fieldGroup) ||
|
|
208
|
+
descriptor.startsWith(SpecCapability.arrayFieldGroup));
|
|
209
|
+
const [match, groupType, groupName] = GROUP_PATTERN.exec(groupDescriptor) || [];
|
|
210
|
+
return { match, groupName, groupType };
|
|
211
|
+
}
|
|
212
|
+
export function normalizePath(path) {
|
|
213
|
+
return path?.startsWith('spec.') ? path : `spec.${path}`;
|
|
214
|
+
}
|
|
215
|
+
export function getFormData(formData, path, enableConvert = true) {
|
|
216
|
+
const value = formData.getIn(pathToArray(normalizePath(path)));
|
|
217
|
+
return enableConvert && value == null ? null : value;
|
|
218
|
+
}
|
|
219
|
+
export function createCapabilityField(descriptors = [], openApiSchema, data, openApiSchemaPath) {
|
|
220
|
+
const openApiFields = getFieldsFromOpenApiSchema(openApiSchema, descriptors, data, openApiSchemaPath);
|
|
221
|
+
const descriptorFields = uniqWith(reduce(descriptors, (accumulator, descriptor) => openApiFields?.some(field => field.path === `spec.${descriptor.path}`)
|
|
222
|
+
? accumulator
|
|
223
|
+
: [
|
|
224
|
+
...accumulator,
|
|
225
|
+
...getFieldsFromDescriptor(descriptor, data, openApiSchema, descriptors),
|
|
226
|
+
], []), isEqual);
|
|
227
|
+
const basicFields = [...openApiFields, ...descriptorFields];
|
|
228
|
+
const relationFields = getRelatedFields(basicFields.filter(fieldShouldReveal));
|
|
229
|
+
const treeFields = [
|
|
230
|
+
...getTreeFields(relationFields.filter(f => !f.parent), relationFields.filter(f => !!f.parent)),
|
|
231
|
+
// 兼容老的数据结构
|
|
232
|
+
...relationFields.filter(f => !f._dirty),
|
|
233
|
+
];
|
|
234
|
+
// 保留,兼容老数据结构
|
|
235
|
+
const [advancedFields = [], arrayFields = [], groupFields = [], normalFields = [],] = reduce(treeFields, ([advancedFieldsAccumulator = [], arrayFieldsAccumulator = [], groupFieldsAccumulator = [], normalFieldsAccumulator = [],], field) => {
|
|
236
|
+
const mappers = [
|
|
237
|
+
{ spec: SpecCapability.arrayFieldGroup, acc: arrayFieldsAccumulator },
|
|
238
|
+
{ spec: SpecCapability.fieldGroup, acc: groupFieldsAccumulator },
|
|
239
|
+
{ spec: SpecCapability.advanced, acc: advancedFieldsAccumulator },
|
|
240
|
+
];
|
|
241
|
+
const acc = mappers.find(mapper => hasDescriptor(field, mapper.spec))?.acc;
|
|
242
|
+
return [
|
|
243
|
+
advancedFieldsAccumulator,
|
|
244
|
+
arrayFieldsAccumulator,
|
|
245
|
+
groupFieldsAccumulator,
|
|
246
|
+
normalFieldsAccumulator,
|
|
247
|
+
].map(r => {
|
|
248
|
+
if ((!acc && r === normalFieldsAccumulator) || r === acc) {
|
|
249
|
+
return [...r, field];
|
|
250
|
+
}
|
|
251
|
+
return r;
|
|
252
|
+
});
|
|
253
|
+
}, []);
|
|
254
|
+
return {
|
|
255
|
+
normalFields: sortFields(normalFields, descriptors),
|
|
256
|
+
fieldGroups: sortGroupFields(groupFields, descriptors, descriptorFields),
|
|
257
|
+
arrayFieldGroups: getArrayFields(arrayFields, descriptorFields),
|
|
258
|
+
advancedFields: sortFields(advancedFields, descriptors),
|
|
259
|
+
descriptorFields,
|
|
260
|
+
openApiFields,
|
|
261
|
+
basicFields,
|
|
262
|
+
treeFields,
|
|
263
|
+
};
|
|
264
|
+
}
|
|
265
|
+
function getArrayFields(fields, descriptorFields) {
|
|
266
|
+
// array fields
|
|
267
|
+
const groupedArrayFieldsByName = groupBy(fields, field => {
|
|
268
|
+
const { groupName } = parseGroupDescriptor(field);
|
|
269
|
+
return groupName;
|
|
270
|
+
});
|
|
271
|
+
// Map {groupName: string, fieldLists: OperandField[][]}, where OperandField is a nested array
|
|
272
|
+
// of the appropriate fields, grouped by index.
|
|
273
|
+
return map(groupedArrayFieldsByName, (fieldsInGroup, groupName) => ({
|
|
274
|
+
groupName,
|
|
275
|
+
displayName: startCase(groupName),
|
|
276
|
+
capabilities: descriptorFields.find(field => field.path === `spec.${groupName}`)
|
|
277
|
+
?.capabilities ?? [],
|
|
278
|
+
fieldLists: reduce(fieldsInGroup, (fieldListsAccumulator, field) => {
|
|
279
|
+
const { index, match } = parseArrayPath(field.path);
|
|
280
|
+
if (match) {
|
|
281
|
+
fieldListsAccumulator[index] = [
|
|
282
|
+
...(fieldListsAccumulator[index] || []),
|
|
283
|
+
field,
|
|
284
|
+
];
|
|
285
|
+
}
|
|
286
|
+
return fieldListsAccumulator;
|
|
287
|
+
}, []),
|
|
288
|
+
_dirty: false,
|
|
289
|
+
}));
|
|
290
|
+
}
|
|
291
|
+
function sortFields(fields, descriptors) {
|
|
292
|
+
return sortBy(fields, field => descriptors.findIndex(d => normalizePath(d.path) === normalizePath(field.path)));
|
|
293
|
+
}
|
|
294
|
+
function sortGroupFields(fields, descriptors, descriptorFields) {
|
|
295
|
+
const groupedFieldsByName = groupBy(sortFields(fields, descriptors), field => {
|
|
296
|
+
const { groupName } = parseGroupDescriptor(field);
|
|
297
|
+
return groupName;
|
|
298
|
+
});
|
|
299
|
+
return map(groupedFieldsByName, (fieldList, groupName) => ({
|
|
300
|
+
groupName,
|
|
301
|
+
displayName: startCase(groupName),
|
|
302
|
+
groupDisplay: fieldList
|
|
303
|
+
.map(field => getDisplayByCapability(field.capabilities, SpecCapability.fieldGroupName))
|
|
304
|
+
.find(d => !!d),
|
|
305
|
+
capabilities: descriptorFields.find(field => field.path === `spec.${groupName}`)
|
|
306
|
+
?.capabilities ?? [],
|
|
307
|
+
fieldList,
|
|
308
|
+
}));
|
|
309
|
+
}
|
|
310
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY3JkLWZvcm0vc3JjL2xpYi91dGlscy91dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBeUIsT0FBTyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDbkUsT0FBTyxFQUNMLElBQUksRUFDSixPQUFPLEVBQ1AsWUFBWSxFQUNaLE9BQU8sRUFDUCxHQUFHLEVBQ0gsT0FBTyxFQUNQLE9BQU8sRUFDUCxHQUFHLEVBQ0gsUUFBUSxFQUNSLElBQUksRUFDSixNQUFNLEVBQ04sTUFBTSxFQUNOLFNBQVMsRUFDVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLEtBQUssRUFDTCxRQUFRLEdBQ1QsTUFBTSxXQUFXLENBQUM7QUFFbkIsT0FBTyxFQUtMLGNBQWMsRUFDZCxzQkFBc0IsRUFDdEIsMkJBQTJCLEVBQzNCLFdBQVcsR0FDWixNQUFNLFVBQVUsQ0FBQztBQUVsQixPQUFPLEVBQ0wsaUJBQWlCLEVBQ2pCLHNCQUFzQixFQUN0QixxQkFBcUIsRUFDckIsd0JBQXdCLEVBQ3hCLHNCQUFzQixHQUN2QixNQUFNLGNBQWMsQ0FBQztBQUN0QixPQUFPLEVBQ0wseUJBQXlCLEVBQ3pCLGFBQWEsRUFDYixTQUFTLEVBQ1QsV0FBVyxHQUNaLE1BQU0sWUFBWSxDQUFDO0FBQ3BCLE9BQU8sRUFDTCxnQkFBZ0IsRUFDaEIsYUFBYSxFQUNiLGFBQWEsRUFDYixjQUFjLEdBQ2YsTUFBTSxVQUFVLENBQUM7QUFTbEIsTUFBTSxVQUFVLGdCQUFnQixDQUM5QixRQUErQixFQUMvQixLQUFLLEdBQUcsQ0FBQztJQUVULElBQUksQ0FBQyxRQUFRLElBQUksQ0FBQyxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDOUQsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBQ0QsT0FBTyxJ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UzthQUNwQixHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FDWCxzQkFBc0IsQ0FDcEIsS0FBSyxDQUFDLFlBQVksRUFDbEIsY0FBYyxDQUFDLGNBQWMsQ0FDOUIsQ0FDRjthQUNBLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakIsWUFBWSxFQUNWLGdCQUFnQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssUUFBUSxTQUFTLEVBQUUsQ0FBQztZQUNoRSxFQUFFLFlBQVksSUFBSSxFQUFFO1FBQ3hCLFNBQVM7S0FDVixDQUFDLENBQUMsQ0FBQztBQUNOLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPcGVuQVBJVjNTY2hlbWFPYmplY3QsIGlzRXF1YWwgfSBmcm9tICdAYWxhdWRhLWZlL2NvbW1vbic7XG5pbXBvcnQge1xuICBmaW5kLFxuICBmbGF0TWFwLFxuICBmbGF0TWFwRGVwdGgsXG4gIGZsYXR0ZW4sXG4gIGdldCxcbiAgZ3JvdXBCeSxcbiAgaXNBcnJheSxcbiAgbWFwLFxuICBwYXJzZUludCxcbiAgcGljayxcbiAgcmVkdWNlLFxuICBzb3J0QnksXG4gIHN0YXJ0Q2FzZSxcbiAgdGltZXMsXG4gIHRvUGF0aCxcbiAgdW5pb24sXG4gIHVuaXFXaXRoLFxufSBmcm9tICdsb2Rhc2gtZXMnO1xuXG5pbXBvcnQge1xuICBEZXNjcmlwdG9yLFxuICBGb3JtRGF0YVN0YXRlLFxuICBPcGVyYW5kRmllbGQsXG4gIE9wZXJhbmRGaWVsZFZhbGlkYXRpb24sXG4gIFNwZWNDYXBhYmlsaXR5LFxuICBTcGVjQ2FwYWJpbGl0eVVJUHJlZml4LFxuICBTcGVjQ2FwYWJpbGl0eVdpZGdldHNQcmVmaXgsXG4gIFZhbGlkYXRpb25zLFxufSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7XG4gIGZpZWxkU2hvdWxkUmV2ZWFsLFxuICBnZXRCYXNpY0NhcGFiaWxpdHlUeXBlLFxuICBnZXRDYXBhYmlsaXR5RGlzYWJsZWQsXG4gIGdldENhcGFiaWxpdHlWYWxpZGF0aW9ucyxcbiAgZ2V0RGlzcGxheUJ5Q2FwYWJpbGl0eSxcbn0gZnJvbSAnLi9jYXBhYmlsaXR5JztcbmltcG9ydCB7XG4gIERFU0NSSVBUT1JfREVGSU5JVElPTl9LRVksXG4gIEdST1VQX1BBVFRFUk4sXG4gIE1BWF9ERVBUSCxcbiAgU0NIRU1BX1BBVEgsXG59IGZyb20gJy4vY29uc3RhbnQnO1xuaW1wb3J0IHtcbiAgZ2V0UmVsYXRlZEZpZWxkcyxcbiAgZ2V0VHJlZUZpZWxkcyxcbiAgaGFzRGVzY3JpcHRvcixcbiAgcGFyc2VBcnJheVBhdGgsXG59IGZyb20gJy4vaGVscGVyJztcblxuZXhwb3J0IGludGVyZmFjZSBGbGF0dGVuTmVzdGVkUHJvcGVydGllc0FjY3VtdWxhdG9yIHtcbiAgY3VycmVudENhcGFiaWxpdGllcz86IFNwZWNDYXBhYmlsaXR5W107XG4gIGN1cnJlbnRQYXRoPzogc3RyaW5nW107XG4gIGZpZWxkcz86IE9wZXJhbmRGaWVsZFtdO1xuICByZXF1aXJlZDogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFByb3BlcnR5RGVwdGgoXG4gIHByb3BlcnR5OiBPcGVuQVBJVjNTY2hlbWFPYmplY3QsXG4gIGRlcHRoID0gMCxcbik6IG51bWJlciB7XG4gIGlmICghcHJvcGVydHkgfHwgIVsnb2JqZWN0JywgJ2FycmF5J10uaW5jbHVkZXMocHJvcGVydHkudHlwZSkpIHtcbiAgICByZXR1cm4gZGVwdGg7XG4gIH1cbiAgcmV0dXJuIE1hdGgubWF4KFxuICAgIDAsXG4gICAgLi4uT2JqZWN0LnZhbHVlcyhcbiAgICAgIHByb3BlcnR5LnByb3BlcnRpZXMgfHwgcHJvcGVydHkuaXRlbXM/LnByb3BlcnRpZXMgfHwge30sXG4gICAgKS5tYXAobmVzdGVkUHJvcGVydHkgPT4gZ2V0UHJvcGVydHlEZXB0aChuZXN0ZWRQcm9wZXJ0eSwgZGVwdGggKyAxKSksXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRGaWVsZHNGcm9tRGVzY3JpcHRvcihcbiAge1xuICAgIHBhdGgsXG4gICAgZGVzY3JpcHRpb24sXG4gICAgZGlzcGxheU5hbWUsXG4gICAgJ3gtZGVzY3JpcHRvcnMnOiBjYXBhYmlsaXRpZXMgPSBbXSxcbiAgfTogRGVzY3JpcHRvcixcbiAgZGF0YTogYW55LFxuICBvcGVuQXBpOiBPcGVuQVBJVjNTY2hlbWFPYmplY3QsXG4gIF9vcmlnaW5EZXNjcmlwdG9ycz86IERlc2NyaXB0b3JbXSxcbik6IE9wZXJhbmRGaWVsZFtdIHtcbiAgY29uc3QgeyBtYXRjaCwgcGF0aEJlZm9yZUluZGV4LCBwYXRoQWZ0ZXJJbmRleCB9ID0gcGFyc2VBcnJheVBhdGgocGF0aCk7XG4gIGNvbnN0IGZpbGVkQmFzaWNUeXBlID0gZ2V0QmFzaWNDYXBhYmlsaXR5VHlwZShjYXBhYmlsaXRpZXMpO1xuICBjb25zdCBkaXNhYmxlZCA9IGdldENhcGFiaWxpdHlEaXNhYmxlZChjYXBhYmlsaXRpZXMpO1xuICBjb25zdCB2YWxpZGF0aW9ucyA9IGdldENhcGFiaWxpdHlWYWxpZGF0aW9ucyhjYXBhYmlsaXRpZXMpO1xuICBpZiAobWF0Y2gpIHtcbiAgICBjb25zdCBuOiBudW1iZXIgPVxuICAgICAgZ2V0KGRhdGEsIHRvUGF0aChgc3BlYy4ke3BhdGhCZWZvcmVJbmRleH1gKSwgW10pLmxlbmd0aCB8fCAxO1xuICAgIGNvbnN0IHBhdGhBZnRlckluZGV4U3RyID0gYC4ke3BhdGhBZnRlckluZGV4fWA7XG4gICAgbGV0IGV4dHJhOiBEZXNjcmlwdG9yW10gPSBbXTtcbiAgICBpZiAoX29yaWdpbkRlc2NyaXB0b3JzKSB7XG4gICAgICBleHRyYSA9IGZsYXR0ZW4oXG4gICAgICAgIF9vcmlnaW5EZXNjcmlwdG9yc1xuICAgICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgICBkID0+IGQucGF0aC5zdGFydHNXaXRoKGAke3BhdGhCZWZvcmVJbmRleH1bMF1gKSAmJiBkLnBhdGggIT09IHBhdGgsXG4gICAgICAgICAgKVxuICAgICAgICAgIC5tYXAoZCA9PlxuICAgICAgICAgICAgdGltZXMobiwgaW5kZXggPT4ge1xuICAgICAgICAgICAgICBjb25zdCBvUGF0aCA9IGQucGF0aC5yZXBsYWNlKFxuICAgICAgICAgICAgICAgIGAke3BhdGhCZWZvcmVJbmRleH1bMF1gLFxuICAgICAgICAgICAgICAgIGAke3BhdGhCZWZvcmVJbmRleH1bJHtpbmRleH1dYCxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAuLi5kLFxuICAgICAgICAgICAgICAgIHBhdGg6IG9QYXRoLFxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSkuc2xpY2UoMSksXG4gICAgICAgICAgKSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZsYXR0ZW4oW1xuICAgICAgLi4udGltZXMobiwgaW5kZXggPT4ge1xuICAgICAgICBjb25zdCBwcm9wZXJ0eVBhdGggPSBgc3BlYy4ke3BhdGhCZWZvcmVJbmRleH1bJHtpbmRleH1dJHtcbiAgICAgICAgICBwYXRoQWZ0ZXJJbmRleCAmJiBwYXRoQWZ0ZXJJbmRleFN0clxuICAgICAgICB9YDtcbiAgICAgICAgY29uc3QgcHJvcGVydHkgPSBnZXRPcGVuQXBpUHJvcGVydHlCeVBhdGgoYHNwZWMuJHtwYXRofWAsIG9wZW5BcGkpO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgcGF0aDogcHJvcGVydHlQYXRoLFxuICAgICAgICAgIHZhbHVlOiBnZXQoZGF0YSwgcHJvcGVydHlQYXRoKSxcbiAgICAgICAgICBkZXNjcmlwdGlvbixcbiAgICAgICAgICBkaXNwbGF5TmFtZSxcbiAgICAgICAgICBjYXBhYmlsaXRpZXMsXG4gICAgICAgICAgdHlwZTogZmlsZWRCYXNpY1R5cGUgfHwgcHJvcGVydHk/LnR5cGUsXG4gICAgICAgICAgcmVxdWlyZWQ6IG51bGwsXG4gICAgICAgICAgZGlzYWJsZWQsXG4gICAgICAgICAgdmFsaWRhdGlvbnM6IHtcbiAgICAgICAgICAgIC4uLnZhbGlkYXRpb25zLFxuICAgICAgICAgICAgLi4uKHByb3BlcnR5Py5yZXF1aXJlZCAmJiB7IHJlcXVpcmVkOiB0cnVlIH0pLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICB9KSxcbiAgICAgIC4uLmV4dHJhLm1hcChlID0+IGdldEZpZWxkc0Zyb21EZXNjcmlwdG9yKGUsIGRhdGEsIG9wZW5BcGkpKSxcbiAgICBdKTtcbiAgfVxuICAvLyDpgJrov4cgZGVzY3JpcHRvciDmn6Xmib7ljp/lp4sgQ1JEIOiKgueCue+8jOaOqOWvvOexu+Wei+OAgXZhbGlkYXRpb24g562J5L+h5oGvXG4gIGNvbnN0IHByb3BlcnR5UGF0aCA9IGBzcGVjLiR7cGF0aH1gO1xuICBjb25zdCBwcm9wZXJ0eSA9IGdldE9wZW5BcGlQcm9wZXJ0eUJ5UGF0aChwcm9wZXJ0eVBhdGgsIG9wZW5BcGkpO1xuICByZXR1cm4gW1xuICAgIHtcbiAgICAgIHBhdGg6IHByb3BlcnR5UGF0aCxcbiAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgZGlzcGxheU5hbWUsXG4gICAgICBjYXBhYmlsaXRpZXMsXG4gICAgICBkaXNhYmxlZCxcbiAgICAgIHZhbHVlOiBnZXQoZGF0YSwgcHJvcGVydHlQYXRoKSxcbiAgICAgIHR5cGU6IGZpbGVkQmFzaWNUeXBlIHx8IHByb3BlcnR5Py50eXBlLFxuICAgICAgcmVxdWlyZWQ6IG51bGwsXG4gICAgICB2YWxpZGF0aW9uczoge1xuICAgICAgICAuLi52YWxpZGF0aW9ucyxcbiAgICAgICAgLi4uKHByb3BlcnR5Py5yZXF1aXJlZCAmJiB7IHJlcXVpcmVkOiB0cnVlIH0pLFxuICAgICAgfSxcbiAgICB9LFxuICBdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0T3BlbkFwaVByb3BlcnR5QnlQYXRoKFxuICBkZXNjcmlwdG9yUGF0aDogc3RyaW5nLFxuICBvcGVuQXBpOiBPcGVuQVBJVjNTY2hlbWFPYmplY3QsXG4pIHtcbiAgY29uc3QgcGF0aHMgPSBkZXNjcmlwdG9yUGF0aC5zcGxpdCgnLicpO1xuICB0cnkge1xuICAgIHJldHVybiBwYXRocy5yZWR1Y2UoKGFjYywgcGF0aCkgPT4ge1xuICAgICAgYWNjID0gcGF0aC5pbmNsdWRlcygnWzBdJylcbiAgICAgICAgPyBhY2MuaXRlbXMucHJvcGVydGllc1twYXRoLnNwbGl0KCdbMF0nKVswXV1cbiAgICAgICAgOiBhY2MucHJvcGVydGllc1twYXRoXTtcbiAgICAgIHJldHVybiBhY2M7XG4gICAgfSwgb3BlbkFwaSk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRGaWVsZHNGcm9tT3BlbkFwaVNjaGVtYShcbiAgb3BlbkFwaTogT3BlbkFQSVYzU2NoZW1hT2JqZWN0LFxuICBkZXNjcmlwdG9yczogRGVzY3JpcHRvcltdLFxuICBkYXRhOiB1bmtub3duLFxuICBvcGVuQXBpU2NoZW1hUGF0aDogc3RyaW5nIHwgc3RyaW5nW10gPSBTQ0hFTUFfUEFUSCxcbiAgbWF4RGVwdGggPSBNQVhfREVQVEgsXG4pOiBPcGVyYW5kRmllbGRbXSB7XG4gIGNvbnN0IHBhdGggPSBpc0FycmF5KG9wZW5BcGlTY2hlbWFQYXRoKVxuICAgID8gb3BlbkFwaVNjaGVtYVBhdGhcbiAgICA6IG9wZW5BcGlTY2hlbWFQYXRoLnNwbGl0KCcuJykuZmlsdGVyKEJvb2xlYW4pO1xuICBjb25zdCBwcm9wZXJ0aWVzID0gZ2V0KG9wZW5BcGksIFsuLi5wYXRoLCAncHJvcGVydGllcyddLCB7fSk7XG4gIGNvbnN0IHJlcXVpcmVkID0gZ2V0KG9wZW5BcGksIFsuLi5wYXRoLCAncmVxdWlyZWQnXSwgW10pIGFzIHN0cmluZ1tdO1xuXG4gIHJldHVybiByZWR1Y2UoXG4gICAgcHJvcGVydGllcyxcbiAgICAoYWNjdW11bGF0b3IsIF9wcm9wZXJ0eSwgcHJvcGVydHlOYW1lKSA9PiB7XG4gICAgICBjb25zdCBwcm9wZXJ0eSA9IF9wcm9wZXJ0eSBhcyBPcGVuQVBJVjNTY2hlbWFPYmplY3Q7XG4gICAgICBpZiAoIXByb3BlcnR5LnR5cGUgfHwgZ2V0UHJvcGVydHlEZXB0aChwcm9wZXJ0eSkgPiBtYXhEZXB0aCkge1xuICAgICAgICByZXR1cm4gYWNjdW11bGF0b3I7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBbXG4gICAgICAgIC4uLmFjY3VtdWxhdG9yLFxuICAgICAgICAuLi5mbGF0dGVuTmVzdGVkUHJvcGVydGllcyhwcm9wZXJ0eU5hbWUsIHByb3BlcnR5LCBkZXNjcmlwdG9ycywgZGF0YSwge1xuICAgICAgICAgIHJlcXVpcmVkOiByZXF1aXJlZC5pbmNsdWRlcyhwcm9wZXJ0eU5hbWUpLFxuICAgICAgICB9KSxcbiAgICAgIF07XG4gICAgfSxcbiAgICBbXSxcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZsYXR0ZW5OZXN0ZWRQcm9wZXJ0aWVzKFxuICBwcm9wZXJ0eU5hbWU6IHN0cmluZyxcbiAgcHJvcGVydHk6IE9wZW5BUElWM1NjaGVtYU9iamVjdCxcbiAgZGVzY3JpcHRvcnM6IERlc2NyaXB0b3JbXSxcbiAgZGF0YTogYW55LFxuICB7XG4gICAgY3VycmVudENhcGFiaWxpdGllcyA9IFtdLFxuICAgIGN1cnJlbnRQYXRoID0gW10sXG4gICAgcmVxdWlyZWQgPSBmYWxzZSxcbiAgfTogRmxhdHRlbk5lc3RlZFByb3BlcnRpZXNBY2N1bXVsYXRvcixcbikge1xuICBpZiAoIXByb3BlcnR5KSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgY29uc3QgaGFuZGxlT2JqZWN0UHJvcGVydHkgPSAoKTogT3BlcmFuZEZpZWxkW10gPT5cbiAgICBmbGF0TWFwKHByb3BlcnR5LnByb3BlcnRpZXMsIChuZXN0ZWRQcm9wZXJ0eSwgbmVzdGVkUHJvcGVydHlOYW1lKSA9PlxuICAgICAgZmxhdHRlbk5lc3RlZFByb3BlcnRpZXMoXG4gICAgICAgIG5lc3RlZFByb3BlcnR5TmFtZSxcbiAgICAgICAgbmVzdGVkUHJvcGVydHksXG4gICAgICAgIGRlc2NyaXB0b3JzLFxuICAgICAgICBkYXRhLFxuICAgICAgICB7XG4gICAgICAgICAgY3VycmVudENhcGFiaWxpdGllczogW1xuICAgICAgICAgICAgLi4uY3VycmVudENhcGFiaWxpdGllcyxcbiAgICAgICAgICAgIGAke1NwZWNDYXBhYmlsaXR5LmZpZWxkR3JvdXB9JHtwcm9wZXJ0eU5hbWV9YCBhcyBTcGVjQ2FwYWJpbGl0eSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIGN1cnJlbnRQYXRoOiBbLi4uY3VycmVudFBhdGgsIHByb3BlcnR5TmFtZV0sXG4gICAgICAgICAgcmVxdWlyZWQ6IChwcm9wZXJ0eS5yZXF1aXJlZCB8fCBbXSkuaW5jbHVkZXMobmVzdGVkUHJvcGVydHlOYW1lKSxcbiAgICAgICAgfSxcbiAgICAgICksXG4gICAgKTtcblxuICBjb25zdCBoYW5kbGVBcnJheVByb3BlcnR5ID0gKCk6IE9wZXJhbmRGaWVsZFtdID0+IHtcbiAgICAvLyBGaW5kIHRoZSBudW1iZXIgb2YgYXJyYXkgZWxlbWVudHMgdGhhdCBhcmUgYWxyZWFkeSBkZWZpbmVkIGluIHRoZSBwcm92aWRlZCBvYmplY3RcbiAgICBjb25zdCBuOiBudW1iZXIgPVxuICAgICAgZ2V0KGRhdGEsIGBzcGVjLiR7Y3VycmVudFBhdGguam9pbignLicpfSR7cHJvcGVydHlOYW1lfWAsIFtdKS5sZW5ndGggfHwgMTtcblxuICAgIC8vIFNpbmNlIF8udGltZXMgd2lsbCByZXR1cm4gYSBtdWx0aWRpbWVuc2lvbmFsIGFycmF5IG9mIE9wZXJhbmRGaWVsZHMgKE9wZXJhbmRGaWVsZFtdW10pLCB3ZVxuICAgIC8vIG5lZWQgdG8gZmxhdHRlbiBvbmUgbGV2ZWwgZGVlcGVyIHRoYW4gXy5mbGF0TWFwIHByb3ZpZGVzLlxuICAgIHJldHVybiBmbGF0TWFwRGVwdGgoXG4gICAgICBwcm9wZXJ0eS5pdGVtcy5wcm9wZXJ0aWVzLFxuICAgICAgKG5lc3RlZFByb3BlcnR5LCBuZXN0ZWRQcm9wZXJ0eU5hbWUpID0+XG4gICAgICAgIC8vIFJlcGVhdCByZWN1cnNpb24gKG4pIHRpbWVzIHNvIHRoYXQgdGhlIGNvcnJlY3QgbnVtYmVyIG9mIGZpZWxkcyBhcmUgY3JlYXRlZCBmb3JcbiAgICAgICAgLy8gZXhpc3RpbmcgdmFsdWVzIGluIG9iai4gVGhpcyBlbnN1cmVzIHRoYXQgZnVydGhlciBuZXN0ZWQgZmllbGRzIGFsc28gZ2V0IGNyZWF0ZWQuXG4gICAgICAgIHRpbWVzKG4sIGluZGV4ID0+XG4gICAgICAgICAgZmxhdHRlbk5lc3RlZFByb3BlcnRpZXMoXG4gICAgICAgICAgICBuZXN0ZWRQcm9wZXJ0eU5hbWUsXG4gICAgICAgICAgICBuZXN0ZWRQcm9wZXJ0eSxcbiAgICAgICAgICAgIGRlc2NyaXB0b3JzLFxuICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgY3VycmVudENhcGFiaWxpdGllczogW1xuICAgICAgICAgICAgICAgIC4uLmN1cnJlbnRDYXBhYmlsaXRpZXMsXG4gICAgICAgICAgICAgICAgYCR7U3BlY0NhcGFiaWxpdHkuYXJyYXlGaWVsZEdyb3VwfSR7cHJvcGVydHlOYW1lfWAgYXMgU3BlY0NhcGFiaWxpdHksXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIGN1cnJlbnRQYXRoOiBbLi4uY3VycmVudFBhdGgsIGAke3Byb3BlcnR5TmFtZX1bJHtpbmRleH1dYF0sIC8vIEFycmF5IGZpZWxkIHBhdGhzIG11c3QgaW5jbHVkZSBhbiBpbmRleFxuICAgICAgICAgICAgICByZXF1aXJlZDogKHByb3BlcnR5Py5yZXF1aXJlZCB8fCBbXSkuaW5jbHVkZXMobmVzdGVkUHJvcGVydHlOYW1lKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgKSxcbiAgICAgICAgKSxcbiAgICAgIDIsXG4gICAgKTtcbiAgfTtcblxuICBjb25zdCBoYW5kbGVBdG9taWNQcm9wZXJ0eSA9ICgpOiBPcGVyYW5kRmllbGRbXSA9PiB7XG4gICAgY29uc3QgcGF0aCA9IFsuLi5jdXJyZW50UGF0aCwgcHJvcGVydHlOYW1lXS5qb2luKCcuJyk7XG4gICAgY29uc3QgZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JzLmZpbmQoXG4gICAgICBpdGVtID0+IGl0ZW0ucGF0aCA9PT0gbW9kaWZ5QXJyYXlGaWVsZFBhdGhJbmRleChwYXRoLCAoKSA9PiAwKSxcbiAgICApO1xuICAgIGNvbnN0IGNhcGFiaWxpdGllcyA9IHVuaW9uKFxuICAgICAgZGVzY3JpcHRvcj8uW0RFU0NSSVBUT1JfREVGSU5JVElPTl9LRVldIHx8IFtdLFxuICAgICAgY3VycmVudENhcGFiaWxpdGllcyxcbiAgICAgIGdldENhcGFiaWxpdGllc0Zvck9wZW5BcGlQcm9wZXJ0eShcbiAgICAgICAgcHJvcGVydHksXG4gICAgICAgIGRlc2NyaXB0b3I/LltERVNDUklQVE9SX0RFRklOSVRJT05fS0VZXSxcbiAgICAgICksXG4gICAgKTtcbiAgICBjb25zdCB2YWxpZGF0aW9ucyA9IGdldENhcGFiaWxpdHlWYWxpZGF0aW9ucyhjYXBhYmlsaXRpZXMpO1xuICAgIGNvbnN0IGZpZWxkUGF0aCA9IGBzcGVjLiR7cGF0aH1gO1xuICAgIHJldHVybiBbXG4gICAgICB7XG4gICAgICAgIHBhdGg6IGZpZWxkUGF0aCxcbiAgICAgICAgdHlwZTogcHJvcGVydHkudHlwZSxcbiAgICAgICAgcmVxdWlyZWQsXG4gICAgICAgIGNhcGFiaWxpdGllcyxcbiAgICAgICAgZGVzY3JpcHRpb246IGRlc2NyaXB0b3I/LmRlc2NyaXB0aW9uIHx8IHByb3BlcnR5LmRlc2NyaXB0aW9uLFxuICAgICAgICBkaXNwbGF5TmFtZTogZGVzY3JpcHRvcj8uZGlzcGxheU5hbWUgfHwgc3RhcnRDYXNlKHByb3BlcnR5TmFtZSksXG4gICAgICAgIHZhbGlkYXRpb25zOiB7XG4gICAgICAgICAgLi4uKHBpY2soXG4gICAgICAgICAgICBwcm9wZXJ0eSxcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKFZhbGlkYXRpb25zKSxcbiAgICAgICAgICApIGFzIHVua25vd24gYXMgT3BlcmFuZEZpZWxkVmFsaWRhdGlvbiksXG4gICAgICAgICAgLi4udmFsaWRhdGlvbnMsXG4gICAgICAgIH0sXG4gICAgICAgIHZhbHVlOiBnZXQoZGF0YSwgZmllbGRQYXRoKSxcbiAgICAgIH0sXG4gICAgXSBhcyBPcGVyYW5kRmllbGRbXTtcbiAgfTtcblxuICBzd2l0Y2ggKHByb3BlcnR5LnR5cGUpIHtcbiAgICBjYXNlICdvYmplY3QnOiB7XG4gICAgICByZXR1cm4gaGFuZGxlT2JqZWN0UHJvcGVydHkoKTtcbiAgICB9XG4gICAgY2FzZSAnYXJyYXknOiB7XG4gICAgICByZXR1cm4gaGFuZGxlQXJyYXlQcm9wZXJ0eSgpO1xuICAgIH1cbiAgICBkZWZhdWx0OiB7XG4gICAgICByZXR1cm4gaGFuZGxlQXRvbWljUHJvcGVydHkoKTtcbiAgICB9XG4gIH1cbn1cblxuLy8gQWNjZXB0cyBhbiBPcGVuQVBJIHNwZWMgcHJvcGVydHkgYW5kIHJldHVybnMgYSBjb3JyZXNwb25kaW5nIFNwZWNDYXBhYmlsaXR5W10gYXJyYXkuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q2FwYWJpbGl0aWVzRm9yT3BlbkFwaVByb3BlcnR5KFxuICBwcm9wZXJ0eTogT3BlbkFQSVYzU2NoZW1hT2JqZWN0LFxuICBjYXBhYmlsaXRpZXM6IHN0cmluZ1tdID0gW10sXG4pOiBTcGVjQ2FwYWJpbGl0eVtdIHtcbiAgY29uc3QgZm9ybUNvbnRyb2xDYXBhYmlsaXRpZXMgPSBbXG4gICAgU3BlY0NhcGFiaWxpdHlVSVByZWZpeCxcbiAgICBTcGVjQ2FwYWJpbGl0eVdpZGdldHNQcmVmaXgsXG4gICAgU3BlY0NhcGFiaWxpdHkuazhzUmVzb3VyY2VQcmVmaXgsXG4gIF07XG4gIGlmIChcbiAgICBjYXBhYmlsaXRpZXMuc29tZShpID0+IGZvcm1Db250cm9sQ2FwYWJpbGl0aWVzLnNvbWUoayA9PiBpLnN0YXJ0c1dpdGgoaykpKVxuICApIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgaWYgKHByb3BlcnR5LmVudW0pIHtcbiAgICByZXR1cm4gKHByb3BlcnR5LmVudW0gfHwgW10pLm1hcChcbiAgICAgIChvcHRpb246IHN0cmluZykgPT4gYCR7U3BlY0NhcGFiaWxpdHkuc2VsZWN0fSR7b3B0aW9ufWAgYXMgU3BlY0NhcGFiaWxpdHksXG4gICAgKTtcbiAgfVxuICBzd2l0Y2ggKHByb3BlcnR5LnR5cGUpIHtcbiAgICBjYXNlICdpbnRlZ2VyJzoge1xuICAgICAgcmV0dXJuIFtTcGVjQ2FwYWJpbGl0eS5udW1iZXJdO1xuICAgIH1cbiAgICBjYXNlICdib29sZWFuJzoge1xuICAgICAgcmV0dXJuIFtTcGVjQ2FwYWJpbGl0eS5ib29sZWFuU3dpdGNoXTtcbiAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgcmV0dXJuIFtTcGVjQ2FwYWJpbGl0eS50ZXh0XTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1vZGlmeUFycmF5RmllbGRQYXRoSW5kZXgoXG4gIHBhdGg6IHN0cmluZyxcbiAgb3BlcmF0aW9uOiAoaW5kZXg/OiBudW1iZXIpID0+IHN0cmluZyB8IG51bWJlcixcbik6IHN0cmluZyB7XG4gIGNvbnN0IHsgbWF0Y2gsIGluZGV4LCBwYXRoQmVmb3JlSW5kZXgsIHBhdGhBZnRlckluZGV4IH0gPVxuICAgIHBhcnNlQXJyYXlQYXRoKHBhdGgpO1xuICBjb25zdCBwYXRoQWZ0ZXJJbmRleFN0ciA9IGAuJHtwYXRoQWZ0ZXJJbmRleH1gO1xuICByZXR1cm4gbWF0Y2hcbiAgICA/IGAke3BhdGhCZWZvcmVJbmRleH1bJHtvcGVyYXRpb24oaW5kZXgpfV0ke1xuICAgICAgICBwYXRoQWZ0ZXJJbmRleCAmJiBwYXRoQWZ0ZXJJbmRleFN0clxuICAgICAgfWBcbiAgICA6IHBhdGg7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXRoVG9BcnJheShwYXRoOiBzdHJpbmcpOiBBcnJheTxzdHJpbmcgfCBudW1iZXI+IHtcbiAgcmV0dXJuIG1hcCh0b1BhdGgocGF0aCksIHN1YlBhdGggPT5cbiAgICAvXlxcZCskLy50ZXN0KHN1YlBhdGgpID8gcGFyc2VJbnQoc3ViUGF0aCwgMTApIDogc3ViUGF0aCxcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlR3JvdXBEZXNjcmlwdG9yKGZpZWxkOiBPcGVyYW5kRmllbGQpOiB7XG4gIGdyb3VwTmFtZT86IHN0cmluZztcbiAgZ3JvdXBUeXBlPzogc3RyaW5nO1xuICBtYXRjaD86IHN0cmluZztcbn0ge1xuICBjb25zdCBncm91cERlc2NyaXB0b3IgPSBmaW5kKFxuICAgIGZpZWxkLmNhcGFiaWxpdGllcyxcbiAgICBkZXNjcmlwdG9yID0+XG4gICAgICBkZXNjcmlwdG9yLnN0YXJ0c1dpdGgoU3BlY0NhcGFiaWxpdHkuZmllbGRHcm91cCkgfHxcbiAgICAgIGRlc2NyaXB0b3Iuc3RhcnRzV2l0aChTcGVjQ2FwYWJpbGl0eS5hcnJheUZpZWxkR3JvdXApLFxuICApO1xuICBjb25zdCBbbWF0Y2gsIGdyb3VwVHlwZSwgZ3JvdXBOYW1lXSA9XG4gICAgR1JPVVBfUEFUVEVSTi5leGVjKGdyb3VwRGVzY3JpcHRvcikgfHwgW107XG4gIHJldHVybiB7IG1hdGNoLCBncm91cE5hbWUsIGdyb3VwVHlwZSB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplUGF0aChwYXRoOiBzdHJpbmcpIHtcbiAgcmV0dXJuIHBhdGg/LnN0YXJ0c1dpdGgoJ3NwZWMuJykgPyBwYXRoIDogYHNwZWMuJHtwYXRofWA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRGb3JtRGF0YShcbiAgZm9ybURhdGE6IEZvcm1EYXRhU3RhdGUsXG4gIHBhdGg6IHN0cmluZyxcbiAgZW5hYmxlQ29udmVydCA9IHRydWUsIC8vIGVuYWJsZSBjb252ZXJ0IHVuZGVmaW5lZCA9PiBudWxsXG4pIHtcbiAgY29uc3QgdmFsdWUgPSBmb3JtRGF0YS5nZXRJbihcbiAgICBwYXRoVG9BcnJheShub3JtYWxpemVQYXRoKHBhdGgpKSxcbiAgKSBhcyBGb3JtRGF0YVN0YXRlO1xuICByZXR1cm4gZW5hYmxlQ29udmVydCAmJiB2YWx1ZSA9PSBudWxsID8gbnVsbCA6IHZhbHVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQ2FwYWJpbGl0eUZpZWxkKFxuICBkZXNjcmlwdG9yczogRGVzY3JpcHRvcltdID0gW10sXG4gIG9wZW5BcGlTY2hlbWE6IE9wZW5BUElWM1NjaGVtYU9iamVjdCxcbiAgZGF0YTogdW5rbm93bixcbiAgb3BlbkFwaVNjaGVtYVBhdGg6IHN0cmluZyB8IHN0cmluZ1tdLFxuKSB7XG4gIGNvbnN0IG9wZW5BcGlGaWVsZHMgPSBnZXRGaWVsZHNGcm9tT3BlbkFwaVNjaGVtYShcbiAgICBvcGVuQXBpU2NoZW1hLFxuICAgIGRlc2NyaXB0b3JzLFxuICAgIGRhdGEsXG4gICAgb3BlbkFwaVNjaGVtYVBhdGgsXG4gICk7XG5cbiAgY29uc3QgZGVzY3JpcHRvckZpZWxkczogT3BlcmFuZEZpZWxkW10gPSB1bmlxV2l0aChcbiAgICByZWR1Y2UoXG4gICAgICBkZXNjcmlwdG9ycyxcbiAgICAgIChhY2N1bXVsYXRvciwgZGVzY3JpcHRvcikgPT5cbiAgICAgICAgb3BlbkFwaUZpZWxkcz8uc29tZShmaWVsZCA9PiBmaWVsZC5wYXRoID09PSBgc3BlYy4ke2Rlc2NyaXB0b3IucGF0aH1gKVxuICAgICAgICAgID8gYWNjdW11bGF0b3JcbiAgICAgICAgICA6IFtcbiAgICAgICAgICAgICAgLi4uYWNjdW11bGF0b3IsXG4gICAgICAgICAgICAgIC4uLmdldEZpZWxkc0Zyb21EZXNjcmlwdG9yKFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IsXG4gICAgICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgICAgICBvcGVuQXBpU2NoZW1hLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JzLFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgXSxcbiAgICAgIFtdLFxuICAgICksXG4gICAgaXNFcXVhbCxcbiAgKTtcbiAgY29uc3QgYmFzaWNGaWVsZHMgPSBbLi4ub3BlbkFwaUZpZWxkcywgLi4uZGVzY3JpcHRvckZpZWxkc107XG5cbiAgY29uc3QgcmVsYXRpb25GaWVsZHMgPSBnZXRSZWxhdGVkRmllbGRzKFxuICAgIGJhc2ljRmllbGRzLmZpbHRlcihmaWVsZFNob3VsZFJldmVhbCksXG4gICk7XG5cbiAgY29uc3QgdHJlZUZpZWxkcyA9IFtcbiAgICAuLi5nZXRUcmVlRmllbGRzKFxuICAgICAgcmVsYXRpb25GaWVsZHMuZmlsdGVyKGYgPT4gIWYucGFyZW50KSxcbiAgICAgIHJlbGF0aW9uRmllbGRzLmZpbHRlcihmID0+ICEhZi5wYXJlbnQpLFxuICAgICksXG4gICAgLy8g5YW85a656ICB55qE5pWw5o2u57uT5p6EXG4gICAgLi4ucmVsYXRpb25GaWVsZHMuZmlsdGVyKGYgPT4gIWYuX2RpcnR5KSxcbiAgXSBhcyBPcGVyYW5kRmllbGRbXTtcblxuICAvLyDkv53nlZnvvIzlhbzlrrnogIHmlbDmja7nu5PmnoRcbiAgY29uc3QgW1xuICAgIGFkdmFuY2VkRmllbGRzID0gW10sXG4gICAgYXJyYXlGaWVsZHMgPSBbXSxcbiAgICBncm91cEZpZWxkcyA9IFtdLFxuICAgIG5vcm1hbEZpZWxkcyA9IFtdLFxuICBdID0gcmVkdWNlKFxuICAgIHRyZWVGaWVsZHMsXG4gICAgKFxuICAgICAgW1xuICAgICAgICBhZHZhbmNlZEZpZWxkc0FjY3VtdWxhdG9yID0gW10gYXMgT3BlcmFuZEZpZWxkW10sXG4gICAgICAgIGFycmF5RmllbGRzQWNjdW11bGF0b3IgPSBbXSBhcyBPcGVyYW5kRmllbGRbXSxcbiAgICAgICAgZ3JvdXBGaWVsZHNBY2N1bXVsYXRvciA9IFtdIGFzIE9wZXJhbmRGaWVsZFtdLFxuICAgICAgICBub3JtYWxGaWVsZHNBY2N1bXVsYXRvciA9IFtdIGFzIE9wZXJhbmRGaWVsZFtdLFxuICAgICAgXSxcbiAgICAgIGZpZWxkOiBPcGVyYW5kRmllbGQsXG4gICAgKSA9PiB7XG4gICAgICBjb25zdCBtYXBwZXJzID0gW1xuICAgICAgICB7IHNwZWM6IFNwZWNDYXBhYmlsaXR5LmFycmF5RmllbGRHcm91cCwgYWNjOiBhcnJheUZpZWxkc0FjY3VtdWxhdG9yIH0sXG4gICAgICAgIHsgc3BlYzogU3BlY0NhcGFiaWxpdHkuZmllbGRHcm91cCwgYWNjOiBncm91cEZpZWxkc0FjY3VtdWxhdG9yIH0sXG4gICAgICAgIHsgc3BlYzogU3BlY0NhcGFiaWxpdHkuYWR2YW5jZWQsIGFjYzogYWR2YW5jZWRGaWVsZHNBY2N1bXVsYXRvciB9LFxuICAgICAgXTtcbiAgICAgIGNvbnN0IGFjYyA9IG1hcHBlcnMuZmluZChtYXBwZXIgPT5cbiAgICAgICAgaGFzRGVzY3JpcHRvcihmaWVsZCwgbWFwcGVyLnNwZWMpLFxuICAgICAgKT8uYWNjO1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgYWR2YW5jZWRGaWVsZHNBY2N1bXVsYXRvcixcbiAgICAgICAgYXJyYXlGaWVsZHNBY2N1bXVsYXRvcixcbiAgICAgICAgZ3JvdXBGaWVsZHNBY2N1bXVsYXRvcixcbiAgICAgICAgbm9ybWFsRmllbGRzQWNjdW11bGF0b3IsXG4gICAgICBdLm1hcChyID0+IHtcbiAgICAgICAgaWYgKCghYWNjICYmIHIgPT09IG5vcm1hbEZpZWxkc0FjY3VtdWxhdG9yKSB8fCByID09PSBhY2MpIHtcbiAgICAgICAgICByZXR1cm4gWy4uLnIsIGZpZWxkXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcjtcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgW10sXG4gICk7XG5cbiAgcmV0dXJuIHtcbiAgICBub3JtYWxGaWVsZHM6IHNvcnRGaWVsZHMobm9ybWFsRmllbGRzLCBkZXNjcmlwdG9ycyksXG4gICAgZmllbGRHcm91cHM6IHNvcnRHcm91cEZpZWxkcyhncm91cEZpZWxkcywgZGVzY3JpcHRvcnMsIGRlc2NyaXB0b3JGaWVsZHMpLFxuICAgIGFycmF5RmllbGRHcm91cHM6IGdldEFycmF5RmllbGRzKGFycmF5RmllbGRzLCBkZXNjcmlwdG9yRmllbGRzKSxcbiAgICBhZHZhbmNlZEZpZWxkczogc29ydEZpZWxkcyhhZHZhbmNlZEZpZWxkcywgZGVzY3JpcHRvcnMpLFxuICAgIGRlc2NyaXB0b3JGaWVsZHMsXG4gICAgb3BlbkFwaUZpZWxkcyxcbiAgICBiYXNpY0ZpZWxkcyxcbiAgICB0cmVlRmllbGRzLFxuICB9O1xufVxuXG5mdW5jdGlvbiBnZXRBcnJheUZpZWxkcyhcbiAgZmllbGRzOiBPcGVyYW5kRmllbGRbXSxcbiAgZGVzY3JpcHRvckZpZWxkczogT3BlcmFuZEZpZWxkW10sXG4pIHtcbiAgLy8gYXJyYXkgZmllbGRzXG4gIGNvbnN0IGdyb3VwZWRBcnJheUZpZWxkc0J5TmFtZSA9IGdyb3VwQnkoZmllbGRzLCBmaWVsZCA9PiB7XG4gICAgY29uc3QgeyBncm91cE5hbWUgfSA9IHBhcnNlR3JvdXBEZXNjcmlwdG9yKGZpZWxkKTtcbiAgICByZXR1cm4gZ3JvdXBOYW1lO1xuICB9KTtcblxuICAvLyBNYXAge2dyb3VwTmFtZTogc3RyaW5nLCBmaWVsZExpc3RzOiBPcGVyYW5kRmllbGRbXVtdfSwgd2hlcmUgT3BlcmFuZEZpZWxkIGlzIGEgbmVzdGVkIGFycmF5XG4gIC8vIG9mIHRoZSBhcHByb3ByaWF0ZSBmaWVsZHMsIGdyb3VwZWQgYnkgaW5kZXguXG4gIHJldHVybiBtYXAoZ3JvdXBlZEFycmF5RmllbGRzQnlOYW1lLCAoZmllbGRzSW5Hcm91cCwgZ3JvdXBOYW1lOiBzdHJpbmcpID0+ICh7XG4gICAgZ3JvdXBOYW1lLFxuICAgIGRpc3BsYXlOYW1lOiBzdGFydENhc2UoZ3JvdXBOYW1lKSxcbiAgICBjYXBhYmlsaXRpZXM6XG4gICAgICBkZXNjcmlwdG9yRmllbGRzLmZpbmQoZmllbGQgPT4gZmllbGQucGF0aCA9PT0gYHNwZWMuJHtncm91cE5hbWV9YClcbiAgICAgICAgPy5jYXBhYmlsaXRpZXMgPz8gW10sXG4gICAgZmllbGRMaXN0czogcmVkdWNlKFxuICAgICAgZmllbGRzSW5Hcm91cCxcbiAgICAgIChmaWVsZExpc3RzQWNjdW11bGF0b3IsIGZpZWxkKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgaW5kZXgsIG1hdGNoIH0gPSBwYXJzZUFycmF5UGF0aChmaWVsZC5wYXRoKTtcbiAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgZmllbGRMaXN0c0FjY3VtdWxhdG9yW2luZGV4XSA9IFtcbiAgICAgICAgICAgIC4uLihmaWVsZExpc3RzQWNjdW11bGF0b3JbaW5kZXhdIHx8IFtdKSxcbiAgICAgICAgICAgIGZpZWxkLFxuICAgICAgICAgIF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZpZWxkTGlzdHNBY2N1bXVsYXRvcjtcbiAgICAgIH0sXG4gICAgICBbXSBhcyBPcGVyYW5kRmllbGRbXVtdLFxuICAgICksXG4gICAgX2RpcnR5OiBmYWxzZSxcbiAgfSkpO1xufVxuXG5mdW5jdGlvbiBzb3J0RmllbGRzKGZpZWxkczogT3BlcmFuZEZpZWxkW10sIGRlc2NyaXB0b3JzOiBEZXNjcmlwdG9yW10pIHtcbiAgcmV0dXJuIHNvcnRCeShmaWVsZHMsIGZpZWxkID0+XG4gICAgZGVzY3JpcHRvcnMuZmluZEluZGV4KFxuICAgICAgZCA9PiBub3JtYWxpemVQYXRoKGQucGF0aCkgPT09IG5vcm1hbGl6ZVBhdGgoZmllbGQucGF0aCksXG4gICAgKSxcbiAgKTtcbn1cblxuZnVuY3Rpb24gc29ydEdyb3VwRmllbGRzKFxuICBmaWVsZHM6IE9wZXJhbmRGaWVsZFtdLFxuICBkZXNjcmlwdG9yczogRGVzY3JpcHRvcltdLFxuICBkZXNjcmlwdG9yRmllbGRzOiBPcGVyYW5kRmllbGRbXSxcbikge1xuICBjb25zdCBncm91cGVkRmllbGRzQnlOYW1lID0gZ3JvdXBCeShcbiAgICBzb3J0RmllbGRzKGZpZWxkcywgZGVzY3JpcHRvcnMpLFxuICAgIGZpZWxkID0+IHtcbiAgICAgIGNvbnN0IHsgZ3JvdXBOYW1lIH0gPSBwYXJzZUdyb3VwRGVzY3JpcHRvcihmaWVsZCk7XG4gICAgICByZXR1cm4gZ3JvdXBOYW1lO1xuICAgIH0sXG4gICk7XG4gIHJldHVybiBtYXAoZ3JvdXBlZEZpZWxkc0J5TmFtZSwgKGZpZWxkTGlzdCwgZ3JvdXBOYW1lKSA9PiAoe1xuICAgIGdyb3VwTmFtZSxcbiAgICBkaXNwbGF5TmFtZTogc3RhcnRDYXNlKGdyb3VwTmFtZSksXG4gICAgZ3JvdXBEaXNwbGF5OiBmaWVsZExpc3RcbiAgICAgIC5tYXAoZmllbGQgPT5cbiAgICAgICAgZ2V0RGlzcGxheUJ5Q2FwYWJpbGl0eShcbiAgICAgICAgICBmaWVsZC5jYXBhYmlsaXRpZXMsXG4gICAgICAgICAgU3BlY0NhcGFiaWxpdHkuZmllbGRHcm91cE5hbWUsXG4gICAgICAgICksXG4gICAgICApXG4gICAgICAuZmluZChkID0+ICEhZCksXG4gICAgY2FwYWJpbGl0aWVzOlxuICAgICAgZGVzY3JpcHRvckZpZWxkcy5maW5kKGZpZWxkID0+IGZpZWxkLnBhdGggPT09IGBzcGVjLiR7Z3JvdXBOYW1lfWApXG4gICAgICAgID8uY2FwYWJpbGl0aWVzID8/IFtdLFxuICAgIGZpZWxkTGlzdCxcbiAgfSkpO1xufVxuIl19
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Public API Surface of crd-form
|
|
3
|
+
*/
|
|
4
|
+
export * from './lib/abstract/base-array';
|
|
5
|
+
export * from './lib/crd-form.module';
|
|
6
|
+
export * from './lib/crd-form/component';
|
|
7
|
+
export * from './lib/field-controls';
|
|
8
|
+
export * from './lib/field-widgets';
|
|
9
|
+
export * from './lib/remote-widgets';
|
|
10
|
+
export * from './lib/spec-descriptors';
|
|
11
|
+
export * from './lib/types';
|
|
12
|
+
export * from './lib/utils';
|
|
13
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYnMvY3JkLWZvcm0vc3JjL3B1YmxpYy1hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLDJCQUEyQixDQUFDO0FBQzFDLGNBQWMsdUJBQXVCLENBQUM7QUFDdEMsY0FBYywwQkFBMEIsQ0FBQztBQUN6QyxjQUFjLHNCQUFzQixDQUFDO0FBQ3JDLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyxzQkFBc0IsQ0FBQztBQUNyQyxjQUFjLHdCQUF3QixDQUFDO0FBQ3ZDLGNBQWMsYUFBYSxDQUFDO0FBQzVCLGNBQWMsYUFBYSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIFB1YmxpYyBBUEkgU3VyZmFjZSBvZiBjcmQtZm9ybVxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vbGliL2Fic3RyYWN0L2Jhc2UtYXJyYXknO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvY3JkLWZvcm0ubW9kdWxlJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NyZC1mb3JtL2NvbXBvbmVudCc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9maWVsZC1jb250cm9scyc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9maWVsZC13aWRnZXRzJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL3JlbW90ZS13aWRnZXRzJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL3NwZWMtZGVzY3JpcHRvcnMnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvdHlwZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvdXRpbHMnO1xuIl19
|
package/index.d.ts
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { EventEmitter, OnChanges, SimpleChanges } from '@angular/core';
|
|
2
|
+
import { CrdFormComponent } from '../crd-form/component';
|
|
3
|
+
import { FieldValueChangeEvent, FormDataState, FormErrors, OperandArrayFieldGroup, OperandField } from '../types';
|
|
4
|
+
import { getFieldDisplayName } from '../utils';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
export declare class BaseOperandFiledArrayComponent implements OnChanges {
|
|
7
|
+
readonly crdForm: CrdFormComponent;
|
|
8
|
+
arrayFieldGroup: OperandArrayFieldGroup;
|
|
9
|
+
formDataState: FormDataState;
|
|
10
|
+
formErrors: FormErrors;
|
|
11
|
+
isArrayTable: boolean;
|
|
12
|
+
readonly: boolean;
|
|
13
|
+
valueChange: EventEmitter<any>;
|
|
14
|
+
itemRemove: EventEmitter<any>;
|
|
15
|
+
private _expanded;
|
|
16
|
+
get expanded(): boolean;
|
|
17
|
+
set expanded(expanded: boolean);
|
|
18
|
+
basicArrayFieldTemplate: OperandField[];
|
|
19
|
+
getFieldDisplayName: typeof getFieldDisplayName;
|
|
20
|
+
constructor(crdForm: CrdFormComponent);
|
|
21
|
+
ngOnChanges({ arrayFieldGroup, formDataState }: SimpleChanges): void;
|
|
22
|
+
fieldValueChange(e: FieldValueChangeEvent): void;
|
|
23
|
+
addItem(): void;
|
|
24
|
+
removeItem(index: number): void;
|
|
25
|
+
private deleteFormData;
|
|
26
|
+
fieldIsRequired(field: OperandField): boolean;
|
|
27
|
+
get columnFields(): OperandField[];
|
|
28
|
+
trackByFn(index: number): number;
|
|
29
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<BaseOperandFiledArrayComponent, never>;
|
|
30
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<BaseOperandFiledArrayComponent, never, never, { "arrayFieldGroup": { "alias": "arrayFieldGroup"; "required": false; }; "formDataState": { "alias": "formDataState"; "required": false; }; "formErrors": { "alias": "formErrors"; "required": false; }; "isArrayTable": { "alias": "isArrayTable"; "required": false; }; "readonly": { "alias": "readonly"; "required": false; }; }, { "valueChange": "valueChange"; "itemRemove": "itemRemove"; }, never, never, false, never>;
|
|
31
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { LabelPosition } from '@alauda/ui';
|
|
2
|
+
import { OpenAPIV3SchemaObject } from '@alauda-fe/common';
|
|
3
|
+
import { ComponentType } from '@angular/cdk/portal';
|
|
4
|
+
import { EventEmitter, OnChanges, QueryList, SimpleChanges } from '@angular/core';
|
|
5
|
+
import { AbstractControl, NgForm } from '@angular/forms';
|
|
6
|
+
import { Observable } from 'rxjs';
|
|
7
|
+
import { RemoteWidgetsService } from '../remote-widgets';
|
|
8
|
+
import { Descriptor, FieldValueChangeEvent, FormDataState, FormErrors, FormState, OperandArrayFieldGroup, OperandField, OperandFieldGroup } from '../types';
|
|
9
|
+
import { CrdFormCustomDescriptionDirective, getCustomDescription } from '../utils';
|
|
10
|
+
import * as i0 from "@angular/core";
|
|
11
|
+
export declare class CrdFormComponent implements OnChanges {
|
|
12
|
+
private readonly rws;
|
|
13
|
+
openApiSchema: OpenAPIV3SchemaObject;
|
|
14
|
+
descriptors: Descriptor[];
|
|
15
|
+
data: unknown;
|
|
16
|
+
debug: boolean;
|
|
17
|
+
openApiSchemaPath: string | string[];
|
|
18
|
+
readonly: boolean;
|
|
19
|
+
labelWidth: string;
|
|
20
|
+
labelPosition: LabelPosition;
|
|
21
|
+
cluster?: string;
|
|
22
|
+
namespace?: string;
|
|
23
|
+
formContext: any;
|
|
24
|
+
formContext$: Observable<any>;
|
|
25
|
+
keepEmptyPath: boolean;
|
|
26
|
+
effectControlDefaultValue: boolean;
|
|
27
|
+
uiContext?: Record<string, any>;
|
|
28
|
+
formStateChange: EventEmitter<FormState>;
|
|
29
|
+
formSchemaChange: EventEmitter<any>;
|
|
30
|
+
form: NgForm;
|
|
31
|
+
customDescriptions: QueryList<CrdFormCustomDescriptionDirective>;
|
|
32
|
+
widgets: Array<{
|
|
33
|
+
descriptor: string;
|
|
34
|
+
component: ComponentType<any>;
|
|
35
|
+
}>;
|
|
36
|
+
formDataState: FormDataState;
|
|
37
|
+
formErrors: FormErrors;
|
|
38
|
+
fields: OperandField[];
|
|
39
|
+
normalFields: OperandField[];
|
|
40
|
+
fieldGroups: OperandFieldGroup[];
|
|
41
|
+
arrayFieldGroups: OperandArrayFieldGroup[];
|
|
42
|
+
advancedFields: OperandField[];
|
|
43
|
+
private _lastUpdateField;
|
|
44
|
+
controlMap: Map<string, AbstractControl<any, any>>;
|
|
45
|
+
constructor(rws: RemoteWidgetsService);
|
|
46
|
+
remoteModuleDefinition$: Observable<import("../remote-widgets").RemoteWidgetModuleDefinition>;
|
|
47
|
+
ngOnChanges({ openApiSchema, descriptors, data }: SimpleChanges): void;
|
|
48
|
+
getCustomDescription: typeof getCustomDescription;
|
|
49
|
+
private setUpForm;
|
|
50
|
+
dirtyPathsSet: Set<string>;
|
|
51
|
+
fieldValueChange(event: FieldValueChangeEvent): void;
|
|
52
|
+
deleteFormData(path: string): void;
|
|
53
|
+
private updateValidPathValue;
|
|
54
|
+
private updateFormData;
|
|
55
|
+
refreshValidation(): void;
|
|
56
|
+
private resolveExpiredPath;
|
|
57
|
+
private initializeFormDataArrayProperty;
|
|
58
|
+
submit(): void;
|
|
59
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<CrdFormComponent, never>;
|
|
60
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<CrdFormComponent, "acl-crd-form", never, { "openApiSchema": { "alias": "openApiSchema"; "required": false; }; "descriptors": { "alias": "descriptors"; "required": false; }; "data": { "alias": "data"; "required": false; }; "debug": { "alias": "debug"; "required": false; }; "openApiSchemaPath": { "alias": "openApiSchemaPath"; "required": false; }; "readonly": { "alias": "readonly"; "required": false; }; "labelWidth": { "alias": "labelWidth"; "required": false; }; "labelPosition": { "alias": "labelPosition"; "required": false; }; "cluster": { "alias": "cluster"; "required": false; }; "namespace": { "alias": "namespace"; "required": false; }; "formContext": { "alias": "formContext"; "required": false; }; "keepEmptyPath": { "alias": "keepEmptyPath"; "required": false; }; "effectControlDefaultValue": { "alias": "effectControlDefaultValue"; "required": false; }; "uiContext": { "alias": "uiContext"; "required": false; }; "widgets": { "alias": "widgets"; "required": false; }; }, { "formStateChange": "formStateChange"; "formSchemaChange": "formSchemaChange"; }, ["customDescriptions"], never, false, never>;
|
|
61
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { OperandField } from '../types';
|
|
2
|
+
export declare function differPathsTag(paths: string[], others: string[]): string[];
|
|
3
|
+
export declare function getAllOtherTagPath(fields: OperandField[], paths: string[]): string[];
|
|
4
|
+
export declare function matchValueAgainstOneOf(field: OperandField, currentValue: any): {
|
|
5
|
+
dirtyPaths: string[];
|
|
6
|
+
validPaths: string[];
|
|
7
|
+
};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import * as i0 from "@angular/core";
|
|
2
|
+
import * as i1 from "./crd-form/component";
|
|
3
|
+
import * as i2 from "./spec-descriptors/capability/capability.component";
|
|
4
|
+
import * as i3 from "./spec-descriptors/capability-list/capability-list.component";
|
|
5
|
+
import * as i4 from "./utils/directives";
|
|
6
|
+
import * as i5 from "@alauda/ui";
|
|
7
|
+
import * as i6 from "@alauda/code-editor";
|
|
8
|
+
import * as i7 from "@angular/forms";
|
|
9
|
+
import * as i8 from "@angular/common";
|
|
10
|
+
import * as i9 from "@alauda-fe/common";
|
|
11
|
+
import * as i10 from "./field-controls/module";
|
|
12
|
+
export declare class CrdFormModule {
|
|
13
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<CrdFormModule, never>;
|
|
14
|
+
static ɵmod: i0.ɵɵNgModuleDeclaration<CrdFormModule, [typeof i1.CrdFormComponent, typeof i2.SpecCapabilityComponent, typeof i3.SpecCapabilityListComponent, typeof i4.CrdFormCustomDescriptionDirective], [typeof i5.TooltipModule, typeof i5.ButtonModule, typeof i5.CheckboxModule, typeof i6.CodeEditorModule, typeof i5.DropdownModule, typeof i5.FormModule, typeof i5.IconModule, typeof i5.InputModule, typeof i5.RadioModule, typeof i5.SelectModule, typeof i5.SwitchModule, typeof i6.CodeEditorModule, typeof i7.FormsModule, typeof i7.ReactiveFormsModule, typeof i8.CommonModule, typeof i9.ArrayFormTableModule, typeof i9.ErrorsMapperModule, typeof i9.CoreModule, typeof i9.ValidatorsModule, typeof i9.TranslateModule, typeof i9.WidgetModule, typeof i5.TagModule, typeof i10.FieldControlsModule], [typeof i1.CrdFormComponent, typeof i2.SpecCapabilityComponent, typeof i3.SpecCapabilityListComponent, typeof i4.CrdFormCustomDescriptionDirective, typeof i10.FieldControlsModule]>;
|
|
15
|
+
static ɵinj: i0.ɵɵInjectorDeclaration<CrdFormModule>;
|
|
16
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { FormDataState, OperandField } from '../../types';
|
|
2
|
+
import { FieldExpression } from './expression-core';
|
|
3
|
+
export declare const EXPRESSION_PROPS_PREFIX = "urn:alm:descriptor:expression:props.";
|
|
4
|
+
export declare const EXPRESSION_PROPS_OPTIONS_PREFIX = "urn:alm:descriptor:expression:props.options:";
|
|
5
|
+
export declare const EXPRESSION_PROPS_DEFAULT_PREFIX = "urn:alm:descriptor:expression:props.default:";
|
|
6
|
+
export declare const EXPRESSION_PROPS_HIDDEN_PREFIX = "urn:alm:descriptor:expression:props.hidden:";
|
|
7
|
+
export declare const EXPRESSION_PROPS_ALLOW_CREATE_PREFIX = "urn:alm:descriptor:expression:props.allowCreate:";
|
|
8
|
+
export interface PropsExpressions {
|
|
9
|
+
/**
|
|
10
|
+
* The form component options, such as select.
|
|
11
|
+
*/
|
|
12
|
+
options?: OptionsExpressions;
|
|
13
|
+
/**
|
|
14
|
+
* The form component default value.
|
|
15
|
+
*/
|
|
16
|
+
default?: string;
|
|
17
|
+
hidden?: string;
|
|
18
|
+
subscribedContextPaths: string[];
|
|
19
|
+
subscribedFormDataPaths: string[];
|
|
20
|
+
}
|
|
21
|
+
export interface OptionsExpressions {
|
|
22
|
+
api: string;
|
|
23
|
+
labelPath: string;
|
|
24
|
+
valuePath: string;
|
|
25
|
+
expression: string;
|
|
26
|
+
}
|
|
27
|
+
export declare class PropsFieldExpression implements FieldExpression {
|
|
28
|
+
expressions: PropsExpressions;
|
|
29
|
+
constructor(field: OperandField);
|
|
30
|
+
private evaluatePropsExpressions;
|
|
31
|
+
private evaluateOptionsExpression;
|
|
32
|
+
private evaluateCommonPropsExpression;
|
|
33
|
+
private evaluateSubscribedContextPaths;
|
|
34
|
+
private evaluateSubscribedFormDataPaths;
|
|
35
|
+
}
|
|
36
|
+
export declare const compareWithSubscribedPaths: (dynamicExpression: PropsExpressions, prev: [unknown, FormDataState], next: [unknown, FormDataState]) => boolean;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { ChangeDetectorRef } from '@angular/core';
|
|
2
|
+
import { OperandFieldComponent } from './operand-field.component';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
export declare class FormItemComponent {
|
|
5
|
+
readonly fieldComponent: OperandFieldComponent;
|
|
6
|
+
private readonly cdr;
|
|
7
|
+
plain: boolean;
|
|
8
|
+
constructor(fieldComponent: OperandFieldComponent, cdr: ChangeDetectorRef);
|
|
9
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<FormItemComponent, never>;
|
|
10
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<FormItemComponent, "acl-crd-form-item", never, { "plain": { "alias": "plain"; "required": false; }; }, {}, never, ["*"], false, never>;
|
|
11
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export * from './form-item.component';
|
|
2
|
+
export * from './module';
|
|
3
|
+
export * from './operand-advanced-field-group.component';
|
|
4
|
+
export * from './operand-array-field-group.component';
|
|
5
|
+
export * from './operand-field.component';
|
|
6
|
+
export * from './operand-field-group.component';
|
|
7
|
+
export * from './widgets';
|