openxiangda-devkit-core 2.0.0-alpha.52 → 2.0.0-alpha.53
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/compiler/ai-catalog.d.ts.map +1 -1
- package/dist/compiler/ai-catalog.js +76 -20
- package/dist/compiler/ai-catalog.js.map +1 -1
- package/dist/compiler/bundle.d.ts.map +1 -1
- package/dist/compiler/bundle.js +88 -37
- package/dist/compiler/bundle.js.map +1 -1
- package/dist/compiler/config.d.ts +9 -3
- package/dist/compiler/config.d.ts.map +1 -1
- package/dist/compiler/config.js +189 -32
- package/dist/compiler/config.js.map +1 -1
- package/dist/compiler/field-codec.d.ts +7 -0
- package/dist/compiler/field-codec.d.ts.map +1 -0
- package/dist/compiler/field-codec.js +124 -0
- package/dist/compiler/field-codec.js.map +1 -0
- package/dist/compiler/field-physical-plan.d.ts +9 -0
- package/dist/compiler/field-physical-plan.d.ts.map +1 -0
- package/dist/compiler/field-physical-plan.js +59 -0
- package/dist/compiler/field-physical-plan.js.map +1 -0
- package/dist/compiler/field-policy-path.d.ts +10 -0
- package/dist/compiler/field-policy-path.d.ts.map +1 -0
- package/dist/compiler/field-policy-path.js +264 -0
- package/dist/compiler/field-policy-path.js.map +1 -0
- package/dist/compiler/field-query-plan.d.ts +13 -0
- package/dist/compiler/field-query-plan.d.ts.map +1 -0
- package/dist/compiler/field-query-plan.js +122 -0
- package/dist/compiler/field-query-plan.js.map +1 -0
- package/dist/compiler/field-surface.d.ts +5 -5
- package/dist/compiler/field-surface.d.ts.map +1 -1
- package/dist/compiler/field-surface.js +41 -24
- package/dist/compiler/field-surface.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
import { SCHEMA_VERSIONS, } from 'openxiangda-contracts';
|
|
2
|
+
const FIELD_CODE_PATTERN = /^[A-Za-z_][A-Za-z0-9_]{0,127}$/;
|
|
3
|
+
const SNAPSHOT_VALUE_TYPES = new Set([
|
|
4
|
+
'option.single',
|
|
5
|
+
'option.multiple',
|
|
6
|
+
'user.single',
|
|
7
|
+
'user.multiple',
|
|
8
|
+
'department.single',
|
|
9
|
+
'department.multiple',
|
|
10
|
+
'resource-ref.single',
|
|
11
|
+
'resource-ref.multiple',
|
|
12
|
+
]);
|
|
13
|
+
export const SEMANTIC_FIELD_PATH_PATTERN = /^[A-Za-z_][A-Za-z0-9_]{0,127}(?:\.(?:value|snapshot\.[A-Za-z_][A-Za-z0-9_]{0,127}))?$/;
|
|
14
|
+
export function semanticFieldPathRoot(path) {
|
|
15
|
+
return path.split('.', 1)[0] || '';
|
|
16
|
+
}
|
|
17
|
+
export function validateAuthzSemanticBindings(input) {
|
|
18
|
+
const diagnostics = [];
|
|
19
|
+
const resources = resourceModels(input.resources);
|
|
20
|
+
const dimensions = dimensionModels(input.dimensions);
|
|
21
|
+
const policiesByCode = new Map();
|
|
22
|
+
input.policies.forEach(rawPolicy => {
|
|
23
|
+
const policy = record(rawPolicy);
|
|
24
|
+
const code = text(policy.code);
|
|
25
|
+
if (code)
|
|
26
|
+
policiesByCode.set(code, policy);
|
|
27
|
+
});
|
|
28
|
+
for (const resource of resources.values()) {
|
|
29
|
+
if (!resource.dataPolicyCode)
|
|
30
|
+
continue;
|
|
31
|
+
const policy = policiesByCode.get(resource.dataPolicyCode);
|
|
32
|
+
if (!policy || text(policy.resourceCode) !== resource.code) {
|
|
33
|
+
diagnostics.push(issue('APP_CONFIG_AUTHZ_POLICY_RESOURCE_BINDING_INVALID', `资源 ${resource.code} 的 dataPolicyCode 必须指向同一资源的策略`, `data.resources.${resource.code}.dataPolicyCode`));
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
input.policies.forEach((rawPolicy, policyIndex) => {
|
|
37
|
+
const policy = record(rawPolicy);
|
|
38
|
+
const policyPath = `authz.dataPolicies[${policyIndex}]`;
|
|
39
|
+
const policyCode = text(policy.code);
|
|
40
|
+
const resourceCode = text(policy.resourceCode);
|
|
41
|
+
const resource = resources.get(resourceCode);
|
|
42
|
+
if (!resource) {
|
|
43
|
+
diagnostics.push(issue('APP_CONFIG_AUTHZ_POLICY_RESOURCE_INVALID', '数据策略必须引用同一应用内已声明的 Data Resource', `${policyPath}.resourceCode`));
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
if (resource.dataPolicyCode !== policyCode) {
|
|
47
|
+
diagnostics.push(issue('APP_CONFIG_AUTHZ_POLICY_RESOURCE_BINDING_INVALID', `策略 ${policyCode} 必须由资源 ${resourceCode} 的 dataPolicyCode 唯一绑定`, policyPath));
|
|
48
|
+
}
|
|
49
|
+
const rules = Array.isArray(policy.rules) ? policy.rules : [];
|
|
50
|
+
rules.forEach((rawRule, ruleIndex) => {
|
|
51
|
+
const rule = record(rawRule);
|
|
52
|
+
const rulePath = `${policyPath}.rules[${ruleIndex}]`;
|
|
53
|
+
const fieldCode = text(rule.field);
|
|
54
|
+
const field = resource.fields.get(fieldCode);
|
|
55
|
+
if (!field) {
|
|
56
|
+
diagnostics.push(issue('APP_CONFIG_AUTHZ_POLICY_FIELD_INVALID', `数据策略字段 ${fieldCode} 未在资源 ${resourceCode} 中声明`, `${rulePath}.field`));
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
if (text(rule.subject) === 'current_user') {
|
|
60
|
+
if (!['user.single', 'user.multiple'].includes(field.type)) {
|
|
61
|
+
diagnostics.push(issue('APP_CONFIG_AUTHZ_POLICY_CURRENT_USER_FIELD_INVALID', 'current_user 规则只能绑定 user.single 或 user.multiple 字段', `${rulePath}.field`));
|
|
62
|
+
}
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
const dimensionCode = text(rule.dimensionCode);
|
|
66
|
+
if (dimensionCode) {
|
|
67
|
+
const dimension = dimensions.get(dimensionCode);
|
|
68
|
+
if (dimension &&
|
|
69
|
+
!comparisonPathSupported(field, optionalText(rule.valuePath), dimension, resources)) {
|
|
70
|
+
diagnostics.push(issue('APP_CONFIG_AUTHZ_POLICY_FIELD_PATH_INVALID', '维度策略字段和值路径与字段语义或维度类型不兼容', rule.valuePath === undefined
|
|
71
|
+
? `${rulePath}.field`
|
|
72
|
+
: `${rulePath}.valuePath`));
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
const relationResourceCode = text(rule.resourceCode);
|
|
76
|
+
if (text(rule.relationCode) && !resources.has(relationResourceCode)) {
|
|
77
|
+
diagnostics.push(issue('APP_CONFIG_AUTHZ_POLICY_RELATION_RESOURCE_INVALID', 'relationship 规则必须引用同一应用内已声明的 Data Resource', `${rulePath}.resourceCode`));
|
|
78
|
+
}
|
|
79
|
+
if (text(rule.relationCode) &&
|
|
80
|
+
!genericPathSupported(field, optionalText(rule.valuePath))) {
|
|
81
|
+
diagnostics.push(issue('APP_CONFIG_AUTHZ_POLICY_FIELD_PATH_INVALID', 'relationship 规则的值路径与字段语义不兼容', rule.valuePath === undefined
|
|
82
|
+
? `${rulePath}.field`
|
|
83
|
+
: `${rulePath}.valuePath`));
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
input.scopeSources.forEach((rawSource, sourceIndex) => {
|
|
88
|
+
const source = record(rawSource);
|
|
89
|
+
const sourcePath = `authz.scopeSources[${sourceIndex}]`;
|
|
90
|
+
const resource = resources.get(text(source.resourceCode));
|
|
91
|
+
if (!resource)
|
|
92
|
+
return;
|
|
93
|
+
const subjectPath = text(record(source.subject).userIdField);
|
|
94
|
+
const subject = resolveCombinedPath(resource, subjectPath);
|
|
95
|
+
if (!subject ||
|
|
96
|
+
subject.field.type !== 'user.single' ||
|
|
97
|
+
subject.valuePath !== 'value') {
|
|
98
|
+
diagnostics.push(issue('APP_CONFIG_AUTHZ_SCOPE_SOURCE_SUBJECT_PATH_INVALID', 'scope source 主体必须引用 user.single 字段的 .value', `${sourcePath}.subject.userIdField`));
|
|
99
|
+
}
|
|
100
|
+
const grants = Array.isArray(source.grants) ? source.grants : [];
|
|
101
|
+
grants.forEach((rawGrant, grantIndex) => {
|
|
102
|
+
const grant = record(rawGrant);
|
|
103
|
+
const dimension = dimensions.get(text(grant.dimensionCode));
|
|
104
|
+
for (const key of ['valueField', 'parentValueField']) {
|
|
105
|
+
if (grant[key] === undefined)
|
|
106
|
+
continue;
|
|
107
|
+
const resolved = resolveCombinedPath(resource, text(grant[key]));
|
|
108
|
+
if (!dimension ||
|
|
109
|
+
!resolved ||
|
|
110
|
+
!comparisonPathSupported(resolved.field, resolved.valuePath, dimension, resources)) {
|
|
111
|
+
diagnostics.push(issue('APP_CONFIG_AUTHZ_SCOPE_SOURCE_GRANT_PATH_INVALID', 'scope source grant 字段路径与声明维度不兼容', `${sourcePath}.grants[${grantIndex}].${key}`));
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
const typedOptionalFields = [
|
|
116
|
+
['enabledField', new Set(['boolean'])],
|
|
117
|
+
['effectiveFromField', new Set(['date', 'datetime'])],
|
|
118
|
+
['effectiveToField', new Set(['date', 'datetime'])],
|
|
119
|
+
];
|
|
120
|
+
for (const [key, allowedTypes] of typedOptionalFields) {
|
|
121
|
+
if (source[key] === undefined)
|
|
122
|
+
continue;
|
|
123
|
+
const field = resource.fields.get(text(source[key]));
|
|
124
|
+
if (!field || !allowedTypes.has(field.type)) {
|
|
125
|
+
diagnostics.push(issue('APP_CONFIG_AUTHZ_SCOPE_SOURCE_FIELD_TYPE_INVALID', `scope source 的 ${key} 字段类型不兼容`, `${sourcePath}.${key}`));
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
});
|
|
129
|
+
return diagnostics;
|
|
130
|
+
}
|
|
131
|
+
function comparisonPathSupported(field, valuePath, dimension, resources) {
|
|
132
|
+
if (!genericPathSupported(field, valuePath))
|
|
133
|
+
return false;
|
|
134
|
+
if (!valuePath) {
|
|
135
|
+
return dimension.valueType === 'uuid'
|
|
136
|
+
? field.type === 'uuid'
|
|
137
|
+
: ['text.short', 'text.long', 'serial-number'].includes(field.type);
|
|
138
|
+
}
|
|
139
|
+
if (valuePath === 'value') {
|
|
140
|
+
if (dimension.valueSourceResourceCode &&
|
|
141
|
+
field.type.startsWith('resource-ref.') &&
|
|
142
|
+
field.source?.resourceCode !== dimension.valueSourceResourceCode) {
|
|
143
|
+
return false;
|
|
144
|
+
}
|
|
145
|
+
return true;
|
|
146
|
+
}
|
|
147
|
+
const snapshotField = valuePath.slice('snapshot.'.length);
|
|
148
|
+
const targetResource = resources.get(field.source?.resourceCode || '');
|
|
149
|
+
const targetType = targetResource?.fields.get(snapshotField)?.type;
|
|
150
|
+
return dimension.valueType === 'uuid'
|
|
151
|
+
? targetType === 'uuid'
|
|
152
|
+
: ['text.short', 'text.long', 'serial-number'].includes(targetType || '');
|
|
153
|
+
}
|
|
154
|
+
function genericPathSupported(field, valuePath) {
|
|
155
|
+
if (!valuePath)
|
|
156
|
+
return !isJsonField(field);
|
|
157
|
+
if (valuePath === 'value')
|
|
158
|
+
return SNAPSHOT_VALUE_TYPES.has(field.type);
|
|
159
|
+
if (!valuePath.startsWith('snapshot.'))
|
|
160
|
+
return false;
|
|
161
|
+
const snapshotField = valuePath.slice('snapshot.'.length);
|
|
162
|
+
return (FIELD_CODE_PATTERN.test(snapshotField) &&
|
|
163
|
+
field.type.startsWith('resource-ref.') &&
|
|
164
|
+
Boolean(field.source?.snapshotFields?.includes(snapshotField)));
|
|
165
|
+
}
|
|
166
|
+
function isJsonField(field) {
|
|
167
|
+
return [
|
|
168
|
+
'option.single',
|
|
169
|
+
'option.multiple',
|
|
170
|
+
'cascade.single',
|
|
171
|
+
'cascade.multiple',
|
|
172
|
+
'user.single',
|
|
173
|
+
'user.multiple',
|
|
174
|
+
'department.single',
|
|
175
|
+
'department.multiple',
|
|
176
|
+
'resource-ref.single',
|
|
177
|
+
'resource-ref.multiple',
|
|
178
|
+
'file',
|
|
179
|
+
'image',
|
|
180
|
+
'signature',
|
|
181
|
+
'address',
|
|
182
|
+
'location',
|
|
183
|
+
'json',
|
|
184
|
+
].includes(field.type);
|
|
185
|
+
}
|
|
186
|
+
function resolveCombinedPath(resource, path) {
|
|
187
|
+
if (!SEMANTIC_FIELD_PATH_PATTERN.test(path))
|
|
188
|
+
return undefined;
|
|
189
|
+
const fieldCode = semanticFieldPathRoot(path);
|
|
190
|
+
const field = resource.fields.get(fieldCode);
|
|
191
|
+
if (!field)
|
|
192
|
+
return undefined;
|
|
193
|
+
const valuePath = path.slice(fieldCode.length + 1) || undefined;
|
|
194
|
+
return { field, ...(valuePath ? { valuePath } : {}) };
|
|
195
|
+
}
|
|
196
|
+
function resourceModels(values) {
|
|
197
|
+
const resources = new Map();
|
|
198
|
+
values.forEach(rawResource => {
|
|
199
|
+
const resource = record(rawResource);
|
|
200
|
+
const code = text(resource.code);
|
|
201
|
+
if (!code)
|
|
202
|
+
return;
|
|
203
|
+
const schema = record(resource.schema);
|
|
204
|
+
const fields = new Map();
|
|
205
|
+
(Array.isArray(schema.fields) ? schema.fields : []).forEach(rawField => {
|
|
206
|
+
const field = record(rawField);
|
|
207
|
+
const fieldCode = text(field.code);
|
|
208
|
+
if (fieldCode)
|
|
209
|
+
fields.set(fieldCode, field);
|
|
210
|
+
});
|
|
211
|
+
resources.set(code, {
|
|
212
|
+
code,
|
|
213
|
+
...(text(resource.dataPolicyCode)
|
|
214
|
+
? { dataPolicyCode: text(resource.dataPolicyCode) }
|
|
215
|
+
: {}),
|
|
216
|
+
fields,
|
|
217
|
+
});
|
|
218
|
+
});
|
|
219
|
+
return resources;
|
|
220
|
+
}
|
|
221
|
+
function dimensionModels(values) {
|
|
222
|
+
const dimensions = new Map();
|
|
223
|
+
values.forEach(rawDimension => {
|
|
224
|
+
const dimension = record(rawDimension);
|
|
225
|
+
const code = text(dimension.code);
|
|
226
|
+
const valueType = text(dimension.valueType);
|
|
227
|
+
if (!code || !['string', 'uuid'].includes(valueType))
|
|
228
|
+
return;
|
|
229
|
+
dimensions.set(code, {
|
|
230
|
+
code,
|
|
231
|
+
valueType: valueType,
|
|
232
|
+
...(text(record(dimension.valueSource).resourceCode)
|
|
233
|
+
? {
|
|
234
|
+
valueSourceResourceCode: text(record(dimension.valueSource).resourceCode),
|
|
235
|
+
}
|
|
236
|
+
: {}),
|
|
237
|
+
});
|
|
238
|
+
});
|
|
239
|
+
return dimensions;
|
|
240
|
+
}
|
|
241
|
+
function issue(code, message, path) {
|
|
242
|
+
return {
|
|
243
|
+
schemaVersion: SCHEMA_VERSIONS.diagnostic,
|
|
244
|
+
code,
|
|
245
|
+
severity: 'error',
|
|
246
|
+
message,
|
|
247
|
+
path,
|
|
248
|
+
source: 'openxiangda-app.config.ts',
|
|
249
|
+
retryable: false,
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
function record(value) {
|
|
253
|
+
return value && typeof value === 'object' && !Array.isArray(value)
|
|
254
|
+
? value
|
|
255
|
+
: {};
|
|
256
|
+
}
|
|
257
|
+
function text(value) {
|
|
258
|
+
return typeof value === 'string' ? value.trim() : '';
|
|
259
|
+
}
|
|
260
|
+
function optionalText(value) {
|
|
261
|
+
const valueText = text(value);
|
|
262
|
+
return valueText || undefined;
|
|
263
|
+
}
|
|
264
|
+
//# sourceMappingURL=field-policy-path.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"field-policy-path.js","sourceRoot":"","sources":["../../src/compiler/field-policy-path.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { DataFieldType, DataQueryOperator } from 'openxiangda-contracts';
|
|
2
|
+
export declare function supportsSearch(type: DataFieldType): boolean;
|
|
3
|
+
export declare function supportsSort(type: DataFieldType): boolean;
|
|
4
|
+
export declare function supportsFilter(type: DataFieldType): boolean;
|
|
5
|
+
export declare function operatorsForField(type: DataFieldType): readonly DataQueryOperator[];
|
|
6
|
+
export declare function supportsOperator(type: DataFieldType, operator: DataQueryOperator): boolean;
|
|
7
|
+
export type FieldAggregateMeasure = 'countDistinct' | 'sum' | 'avg' | 'min' | 'max';
|
|
8
|
+
export interface FieldAggregatePlan {
|
|
9
|
+
valueExpression: 'column' | 'snapshot-value';
|
|
10
|
+
numericResult: boolean;
|
|
11
|
+
}
|
|
12
|
+
export declare function aggregatePlanForField(type: DataFieldType, measure: FieldAggregateMeasure): FieldAggregatePlan | null;
|
|
13
|
+
//# sourceMappingURL=field-query-plan.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"field-query-plan.d.ts","sourceRoot":"","sources":["../../src/compiler/field-query-plan.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,iBAAiB,EAClB,MAAM,uBAAuB,CAAC;AAiF/B,wBAAgB,cAAc,CAAC,IAAI,EAAE,aAAa,WAEjD;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,aAAa,WAE/C;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,aAAa,WAEjD;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,aAAa,gCAEpD;AAED,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,aAAa,EACnB,QAAQ,EAAE,iBAAiB,WAG5B;AAED,MAAM,MAAM,qBAAqB,GAC7B,eAAe,GACf,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,CAAC;AAEV,MAAM,WAAW,kBAAkB;IACjC,eAAe,EAAE,QAAQ,GAAG,gBAAgB,CAAC;IAC7C,aAAa,EAAE,OAAO,CAAC;CACxB;AAgBD,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,aAAa,EACnB,OAAO,EAAE,qBAAqB,GAC7B,kBAAkB,GAAG,IAAI,CAoB3B"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
const SEARCHABLE_TYPES = new Set([
|
|
2
|
+
'text.short', 'text.long', 'text.rich', 'option.single', 'user.single',
|
|
3
|
+
'department.single', 'resource-ref.single', 'serial-number',
|
|
4
|
+
]);
|
|
5
|
+
const UNSORTABLE_TYPES = new Set([
|
|
6
|
+
'option.multiple', 'cascade.single', 'cascade.multiple', 'user.multiple',
|
|
7
|
+
'department.multiple', 'resource-ref.multiple', 'file', 'image', 'signature',
|
|
8
|
+
'address', 'location', 'json', 'subtable',
|
|
9
|
+
]);
|
|
10
|
+
const TEXT_OPERATORS = [
|
|
11
|
+
'eq', 'neq', 'contains', 'startsWith', 'endsWith', 'in', 'isEmpty',
|
|
12
|
+
'isNotEmpty',
|
|
13
|
+
];
|
|
14
|
+
const ORDERED_OPERATORS = [
|
|
15
|
+
'eq', 'neq', 'gt', 'gte', 'lt', 'lte', 'between', 'in', 'isEmpty',
|
|
16
|
+
];
|
|
17
|
+
const BOOLEAN_OPERATORS = [
|
|
18
|
+
'eq', 'neq', 'in', 'isEmpty',
|
|
19
|
+
];
|
|
20
|
+
const SINGLE_SNAPSHOT_OPERATORS = [
|
|
21
|
+
'eq', 'neq', 'in', 'isEmpty', 'isNotEmpty',
|
|
22
|
+
];
|
|
23
|
+
const MULTI_SNAPSHOT_OPERATORS = [
|
|
24
|
+
'has', 'hasAny', 'hasAll', 'isEmpty', 'isNotEmpty',
|
|
25
|
+
];
|
|
26
|
+
const RANGE_OPERATORS = [
|
|
27
|
+
'overlaps', 'contains', 'containedBy', 'isEmpty',
|
|
28
|
+
];
|
|
29
|
+
const JSON_OPERATORS = [
|
|
30
|
+
'jsonContains', 'isEmpty', 'isNotEmpty',
|
|
31
|
+
];
|
|
32
|
+
const EMPTY_OPERATORS = [
|
|
33
|
+
'isEmpty', 'isNotEmpty',
|
|
34
|
+
];
|
|
35
|
+
const UUID_OPERATORS = [
|
|
36
|
+
'eq', 'neq', 'in', 'isEmpty',
|
|
37
|
+
];
|
|
38
|
+
const SERIAL_OPERATORS = [
|
|
39
|
+
'eq', 'neq', 'in', 'contains', 'startsWith',
|
|
40
|
+
];
|
|
41
|
+
const OPERATORS_BY_TYPE = {
|
|
42
|
+
'text.short': TEXT_OPERATORS,
|
|
43
|
+
'text.long': TEXT_OPERATORS,
|
|
44
|
+
'text.rich': TEXT_OPERATORS,
|
|
45
|
+
'number.integer': ORDERED_OPERATORS,
|
|
46
|
+
'number.decimal': ORDERED_OPERATORS,
|
|
47
|
+
boolean: BOOLEAN_OPERATORS,
|
|
48
|
+
date: ORDERED_OPERATORS,
|
|
49
|
+
time: ORDERED_OPERATORS,
|
|
50
|
+
datetime: ORDERED_OPERATORS,
|
|
51
|
+
'date-range': RANGE_OPERATORS,
|
|
52
|
+
'datetime-range': RANGE_OPERATORS,
|
|
53
|
+
'option.single': SINGLE_SNAPSHOT_OPERATORS,
|
|
54
|
+
'option.multiple': MULTI_SNAPSHOT_OPERATORS,
|
|
55
|
+
'cascade.single': MULTI_SNAPSHOT_OPERATORS,
|
|
56
|
+
'cascade.multiple': MULTI_SNAPSHOT_OPERATORS,
|
|
57
|
+
'user.single': SINGLE_SNAPSHOT_OPERATORS,
|
|
58
|
+
'user.multiple': MULTI_SNAPSHOT_OPERATORS,
|
|
59
|
+
'department.single': SINGLE_SNAPSHOT_OPERATORS,
|
|
60
|
+
'department.multiple': MULTI_SNAPSHOT_OPERATORS,
|
|
61
|
+
'resource-ref.single': SINGLE_SNAPSHOT_OPERATORS,
|
|
62
|
+
'resource-ref.multiple': MULTI_SNAPSHOT_OPERATORS,
|
|
63
|
+
file: EMPTY_OPERATORS,
|
|
64
|
+
image: EMPTY_OPERATORS,
|
|
65
|
+
signature: EMPTY_OPERATORS,
|
|
66
|
+
address: JSON_OPERATORS,
|
|
67
|
+
location: JSON_OPERATORS,
|
|
68
|
+
uuid: UUID_OPERATORS,
|
|
69
|
+
json: JSON_OPERATORS,
|
|
70
|
+
'serial-number': SERIAL_OPERATORS,
|
|
71
|
+
subtable: [],
|
|
72
|
+
};
|
|
73
|
+
export function supportsSearch(type) {
|
|
74
|
+
return SEARCHABLE_TYPES.has(type);
|
|
75
|
+
}
|
|
76
|
+
export function supportsSort(type) {
|
|
77
|
+
return !UNSORTABLE_TYPES.has(type);
|
|
78
|
+
}
|
|
79
|
+
export function supportsFilter(type) {
|
|
80
|
+
return operatorsForField(type).length > 0;
|
|
81
|
+
}
|
|
82
|
+
export function operatorsForField(type) {
|
|
83
|
+
return OPERATORS_BY_TYPE[type];
|
|
84
|
+
}
|
|
85
|
+
export function supportsOperator(type, operator) {
|
|
86
|
+
return operatorsForField(type).includes(operator);
|
|
87
|
+
}
|
|
88
|
+
const AGGREGATE_NUMERIC_TYPES = new Set([
|
|
89
|
+
'number.integer', 'number.decimal',
|
|
90
|
+
]);
|
|
91
|
+
const AGGREGATE_ORDERED_TYPES = new Set([
|
|
92
|
+
'text.short', 'text.long', 'number.integer', 'number.decimal', 'date', 'time',
|
|
93
|
+
'datetime', 'serial-number',
|
|
94
|
+
]);
|
|
95
|
+
const AGGREGATE_DISTINCT_SCALAR_TYPES = new Set([
|
|
96
|
+
...AGGREGATE_ORDERED_TYPES, 'boolean', 'uuid',
|
|
97
|
+
]);
|
|
98
|
+
const AGGREGATE_DISTINCT_SNAPSHOT_TYPES = new Set([
|
|
99
|
+
'option.single', 'user.single', 'department.single', 'resource-ref.single',
|
|
100
|
+
]);
|
|
101
|
+
export function aggregatePlanForField(type, measure) {
|
|
102
|
+
if (measure === 'sum' || measure === 'avg') {
|
|
103
|
+
return AGGREGATE_NUMERIC_TYPES.has(type)
|
|
104
|
+
? { valueExpression: 'column', numericResult: true }
|
|
105
|
+
: null;
|
|
106
|
+
}
|
|
107
|
+
if (measure === 'min' || measure === 'max') {
|
|
108
|
+
return AGGREGATE_ORDERED_TYPES.has(type)
|
|
109
|
+
? {
|
|
110
|
+
valueExpression: 'column',
|
|
111
|
+
numericResult: AGGREGATE_NUMERIC_TYPES.has(type),
|
|
112
|
+
}
|
|
113
|
+
: null;
|
|
114
|
+
}
|
|
115
|
+
if (AGGREGATE_DISTINCT_SNAPSHOT_TYPES.has(type)) {
|
|
116
|
+
return { valueExpression: 'snapshot-value', numericResult: true };
|
|
117
|
+
}
|
|
118
|
+
return AGGREGATE_DISTINCT_SCALAR_TYPES.has(type)
|
|
119
|
+
? { valueExpression: 'column', numericResult: true }
|
|
120
|
+
: null;
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=field-query-plan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"field-query-plan.js","sourceRoot":"","sources":["../../src/compiler/field-query-plan.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import type { DataFieldDefinition, DataFieldSurfaceWidget } from 'openxiangda-contracts';
|
|
2
|
-
export type SurfaceWidgetSource = {
|
|
3
|
-
|
|
4
|
-
reference?: DataFieldDefinition['reference'] | undefined;
|
|
5
|
-
widget?: DataFieldSurfaceWidget | undefined;
|
|
2
|
+
export type SurfaceWidgetSource = Pick<DataFieldDefinition, 'type'> & {
|
|
3
|
+
widget?: DataFieldSurfaceWidget;
|
|
6
4
|
};
|
|
5
|
+
export declare function compatibleWidgets(type: DataFieldDefinition['type']): readonly DataFieldSurfaceWidget[];
|
|
6
|
+
export declare function isCompatibleFieldWidget(field: SurfaceWidgetSource): boolean;
|
|
7
7
|
/**
|
|
8
8
|
* Resolve the complete presentation contract from the authored field.
|
|
9
9
|
*
|
|
10
|
-
*
|
|
10
|
+
* Semantic type remains the source of truth. An explicit
|
|
11
11
|
* widget is only a presentation override; generated Surfaces must never leave
|
|
12
12
|
* widget resolution to an application renderer.
|
|
13
13
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"field-surface.d.ts","sourceRoot":"","sources":["../../src/compiler/field-surface.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,mBAAmB,EACnB,sBAAsB,EACvB,MAAM,uBAAuB,CAAC;AAE/B,MAAM,MAAM,mBAAmB,GAAG
|
|
1
|
+
{"version":3,"file":"field-surface.d.ts","sourceRoot":"","sources":["../../src/compiler/field-surface.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,mBAAmB,EACnB,sBAAsB,EACvB,MAAM,uBAAuB,CAAC;AAE/B,MAAM,MAAM,mBAAmB,GAAG,IAAI,CAAC,mBAAmB,EAAE,MAAM,CAAC,GAAG;IACpE,MAAM,CAAC,EAAE,sBAAsB,CAAC;CACjC,CAAC;AAsCF,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,mBAAmB,CAAC,MAAM,CAAC,qCAElE;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,mBAAmB,WAEjE;AAED;;;;;;GAMG;AACH,wBAAgB,6BAA6B,CAC3C,KAAK,EAAE,mBAAmB,GACzB,sBAAsB,CAGxB"}
|
|
@@ -1,34 +1,51 @@
|
|
|
1
|
+
const WIDGETS_BY_TYPE = {
|
|
2
|
+
'text.short': ['text', 'email', 'phone'],
|
|
3
|
+
'text.long': ['textarea'],
|
|
4
|
+
'text.rich': ['rich-text'],
|
|
5
|
+
'number.integer': ['number'],
|
|
6
|
+
'number.decimal': ['number', 'money', 'percent'],
|
|
7
|
+
boolean: ['switch'],
|
|
8
|
+
date: ['date'],
|
|
9
|
+
time: ['time'],
|
|
10
|
+
datetime: ['datetime'],
|
|
11
|
+
'date-range': ['date-range'],
|
|
12
|
+
'datetime-range': ['datetime-range'],
|
|
13
|
+
'option.single': ['select', 'radio'],
|
|
14
|
+
'option.multiple': ['multi-select', 'checkbox'],
|
|
15
|
+
'cascade.single': ['cascade'],
|
|
16
|
+
'cascade.multiple': ['cascade'],
|
|
17
|
+
'user.single': ['directory-user'],
|
|
18
|
+
'user.multiple': ['directory-user'],
|
|
19
|
+
'department.single': ['directory-department', 'scope'],
|
|
20
|
+
'department.multiple': ['directory-department', 'scope'],
|
|
21
|
+
'resource-ref.single': ['select', 'radio', 'resource'],
|
|
22
|
+
'resource-ref.multiple': ['multi-select', 'checkbox', 'resource'],
|
|
23
|
+
file: ['attachment'],
|
|
24
|
+
image: ['image'],
|
|
25
|
+
signature: ['signature'],
|
|
26
|
+
address: ['address'],
|
|
27
|
+
location: ['location'],
|
|
28
|
+
uuid: ['readonly'],
|
|
29
|
+
json: ['json'],
|
|
30
|
+
'serial-number': ['readonly'],
|
|
31
|
+
subtable: ['subtable'],
|
|
32
|
+
};
|
|
33
|
+
export function compatibleWidgets(type) {
|
|
34
|
+
return WIDGETS_BY_TYPE[type];
|
|
35
|
+
}
|
|
36
|
+
export function isCompatibleFieldWidget(field) {
|
|
37
|
+
return !field.widget || compatibleWidgets(field.type).includes(field.widget);
|
|
38
|
+
}
|
|
1
39
|
/**
|
|
2
40
|
* Resolve the complete presentation contract from the authored field.
|
|
3
41
|
*
|
|
4
|
-
*
|
|
42
|
+
* Semantic type remains the source of truth. An explicit
|
|
5
43
|
* widget is only a presentation override; generated Surfaces must never leave
|
|
6
44
|
* widget resolution to an application renderer.
|
|
7
45
|
*/
|
|
8
46
|
export function resolveDataFieldSurfaceWidget(field) {
|
|
9
|
-
if (field.widget)
|
|
47
|
+
if (field.widget && isCompatibleFieldWidget(field))
|
|
10
48
|
return field.widget;
|
|
11
|
-
|
|
12
|
-
return field.reference.kind;
|
|
13
|
-
switch (field.type) {
|
|
14
|
-
case 'text':
|
|
15
|
-
return 'textarea';
|
|
16
|
-
case 'integer':
|
|
17
|
-
case 'decimal':
|
|
18
|
-
return 'number';
|
|
19
|
-
case 'boolean':
|
|
20
|
-
return 'boolean';
|
|
21
|
-
case 'date':
|
|
22
|
-
return 'date';
|
|
23
|
-
case 'datetime':
|
|
24
|
-
return 'datetime';
|
|
25
|
-
case 'file':
|
|
26
|
-
return 'file';
|
|
27
|
-
case 'json':
|
|
28
|
-
return 'json';
|
|
29
|
-
case 'string':
|
|
30
|
-
case 'uuid':
|
|
31
|
-
return 'text';
|
|
32
|
-
}
|
|
49
|
+
return compatibleWidgets(field.type)[0];
|
|
33
50
|
}
|
|
34
51
|
//# sourceMappingURL=field-surface.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"field-surface.js","sourceRoot":"","sources":["../../src/compiler/field-surface.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"field-surface.js","sourceRoot":"","sources":["../../src/compiler/field-surface.ts"],"names":[],"mappings":"AASA,MAAM,eAAe,GAGjB;IACF,YAAY,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC;IACxC,WAAW,EAAE,CAAC,UAAU,CAAC;IACzB,WAAW,EAAE,CAAC,WAAW,CAAC;IAC1B,gBAAgB,EAAE,CAAC,QAAQ,CAAC;IAC5B,gBAAgB,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,SAAS,CAAC;IAChD,OAAO,EAAE,CAAC,QAAQ,CAAC;IACnB,IAAI,EAAE,CAAC,MAAM,CAAC;IACd,IAAI,EAAE,CAAC,MAAM,CAAC;IACd,QAAQ,EAAE,CAAC,UAAU,CAAC;IACtB,YAAY,EAAE,CAAC,YAAY,CAAC;IAC5B,gBAAgB,EAAE,CAAC,gBAAgB,CAAC;IACpC,eAAe,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC;IACpC,iBAAiB,EAAE,CAAC,cAAc,EAAE,UAAU,CAAC;IAC/C,gBAAgB,EAAE,CAAC,SAAS,CAAC;IAC7B,kBAAkB,EAAE,CAAC,SAAS,CAAC;IAC/B,aAAa,EAAE,CAAC,gBAAgB,CAAC;IACjC,eAAe,EAAE,CAAC,gBAAgB,CAAC;IACnC,mBAAmB,EAAE,CAAC,sBAAsB,EAAE,OAAO,CAAC;IACtD,qBAAqB,EAAE,CAAC,sBAAsB,EAAE,OAAO,CAAC;IACxD,qBAAqB,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,UAAU,CAAC;IACtD,uBAAuB,EAAE,CAAC,cAAc,EAAE,UAAU,EAAE,UAAU,CAAC;IACjE,IAAI,EAAE,CAAC,YAAY,CAAC;IACpB,KAAK,EAAE,CAAC,OAAO,CAAC;IAChB,SAAS,EAAE,CAAC,WAAW,CAAC;IACxB,OAAO,EAAE,CAAC,SAAS,CAAC;IACpB,QAAQ,EAAE,CAAC,UAAU,CAAC;IACtB,IAAI,EAAE,CAAC,UAAU,CAAC;IAClB,IAAI,EAAE,CAAC,MAAM,CAAC;IACd,eAAe,EAAE,CAAC,UAAU,CAAC;IAC7B,QAAQ,EAAE,CAAC,UAAU,CAAC;CACvB,CAAC;AAEF,MAAM,UAAU,iBAAiB,CAAC,IAAiC;IACjE,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,KAA0B;IAChE,OAAO,CAAC,KAAK,CAAC,MAAM,IAAI,iBAAiB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;AAC/E,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,6BAA6B,CAC3C,KAA0B;IAE1B,IAAI,KAAK,CAAC,MAAM,IAAI,uBAAuB,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,MAAM,CAAC;IACxE,OAAO,iBAAiB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAE,CAAC;AAC3C,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "openxiangda-devkit-core",
|
|
3
|
-
"version": "2.0.0-alpha.
|
|
3
|
+
"version": "2.0.0-alpha.53",
|
|
4
4
|
"description": "Framework-neutral OpenXiangda 2.0 workspace and control-plane use cases.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
],
|
|
27
27
|
"dependencies": {
|
|
28
28
|
"cron-parser": "5.4.0",
|
|
29
|
-
"openxiangda-contracts": "2.0.0-alpha.
|
|
29
|
+
"openxiangda-contracts": "2.0.0-alpha.40",
|
|
30
30
|
"esbuild": "0.28.2",
|
|
31
31
|
"typescript": "5.9.3"
|
|
32
32
|
},
|