@fieldia/core 0.5.0 → 0.7.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/package.json +1 -1
- package/schema/page.schema.json +430 -17
- package/src/index.d.mts +5 -14
- package/src/index.d.ts +5 -14
- package/src/index.js +4 -28
- package/src/index.js.map +1 -1
- package/src/index.mjs +4 -11
- package/src/index.mjs.map +1 -1
- package/src/lib/format/check-page.d.mts +9 -0
- package/src/lib/format/check-page.d.ts +9 -0
- package/src/lib/format/check-page.js +54 -0
- package/src/lib/format/check-page.js.map +1 -0
- package/src/lib/format/check-page.mjs +51 -0
- package/src/lib/format/check-page.mjs.map +1 -0
- package/src/lib/format/columns.d.mts +3 -0
- package/src/lib/format/columns.d.ts +3 -0
- package/src/lib/format/columns.js +8 -0
- package/src/lib/format/columns.js.map +1 -0
- package/src/lib/format/columns.mjs +5 -0
- package/src/lib/format/columns.mjs.map +1 -0
- package/src/lib/format/field.d.mts +163 -35
- package/src/lib/format/field.d.ts +163 -35
- package/src/lib/format/field.js +36 -38
- package/src/lib/format/field.js.map +1 -1
- package/src/lib/format/field.mjs +25 -29
- package/src/lib/format/field.mjs.map +1 -1
- package/src/lib/format/layout.d.mts +216 -3
- package/src/lib/format/layout.d.ts +216 -3
- package/src/lib/format/layout.js +19 -3
- package/src/lib/format/layout.js.map +1 -1
- package/src/lib/format/layout.mjs +17 -2
- package/src/lib/format/layout.mjs.map +1 -1
- package/src/lib/format/names.d.mts +5 -0
- package/src/lib/format/names.d.ts +5 -0
- package/src/lib/format/names.js +27 -0
- package/src/lib/format/names.js.map +1 -0
- package/src/lib/format/names.mjs +24 -0
- package/src/lib/format/names.mjs.map +1 -0
- package/src/lib/format/page.d.mts +132 -10
- package/src/lib/format/page.d.ts +132 -10
- package/src/lib/format/page.js +6 -3
- package/src/lib/format/page.js.map +1 -1
- package/src/lib/format/page.mjs +4 -2
- package/src/lib/format/page.mjs.map +1 -1
- package/src/lib/format/references.d.mts +35 -0
- package/src/lib/format/references.d.ts +35 -0
- package/src/lib/format/references.js +278 -0
- package/src/lib/format/references.js.map +1 -0
- package/src/lib/format/references.mjs +274 -0
- package/src/lib/format/references.mjs.map +1 -0
- package/src/lib/format/translate.d.mts +8 -0
- package/src/lib/format/translate.d.ts +8 -0
- package/src/lib/format/translate.js +36 -0
- package/src/lib/format/translate.js.map +1 -0
- package/src/lib/format/translate.mjs +33 -0
- package/src/lib/format/translate.mjs.map +1 -0
- package/src/lib/format/validate.d.mts +2 -13
- package/src/lib/format/validate.d.ts +2 -13
- package/src/lib/format/validate.js +2 -258
- package/src/lib/format/validate.js.map +1 -1
- package/src/lib/format/validate.mjs +1 -257
- package/src/lib/format/validate.mjs.map +1 -1
- package/src/lib/format/version.d.mts +2 -0
- package/src/lib/format/version.d.ts +2 -0
- package/src/lib/format/version.js +6 -0
- package/src/lib/format/version.js.map +1 -0
- package/src/lib/format/version.mjs +3 -0
- package/src/lib/format/version.mjs.map +1 -0
- package/src/lib/record/data-source.d.mts +27 -1
- package/src/lib/record/data-source.d.ts +27 -1
- package/src/lib/record/data-source.js +16 -0
- package/src/lib/record/data-source.js.map +1 -1
- package/src/lib/record/data-source.mjs +14 -1
- package/src/lib/record/data-source.mjs.map +1 -1
- package/src/lib/record/filter.d.mts +8 -0
- package/src/lib/record/filter.d.ts +8 -0
- package/src/lib/record/filter.js +66 -0
- package/src/lib/record/filter.js.map +1 -0
- package/src/lib/record/filter.mjs +63 -0
- package/src/lib/record/filter.mjs.map +1 -0
- package/src/lib/record/form.d.mts +15 -1
- package/src/lib/record/form.d.ts +15 -1
- package/src/lib/record/form.js +103 -14
- package/src/lib/record/form.js.map +1 -1
- package/src/lib/record/form.mjs +103 -14
- package/src/lib/record/form.mjs.map +1 -1
- package/src/lib/record/memory-data-source.js +2 -28
- package/src/lib/record/memory-data-source.js.map +1 -1
- package/src/lib/record/memory-data-source.mjs +2 -28
- package/src/lib/record/memory-data-source.mjs.map +1 -1
- package/src/runtime.d.mts +26 -0
- package/src/runtime.d.ts +26 -0
- package/src/runtime.js +44 -0
- package/src/runtime.js.map +1 -0
- package/src/runtime.mjs +16 -0
- package/src/runtime.mjs.map +1 -0
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { PageSchema } from './page.mjs';
|
|
2
|
-
import {
|
|
2
|
+
import { ReferenceCheck } from './references.mjs';
|
|
3
3
|
/**
|
|
4
4
|
* Check a page in two passes: its shape against the format, then every
|
|
5
5
|
* reference inside it — ids unique, every field a layout, title, statusbar,
|
|
@@ -31,260 +31,4 @@ function describe(issue) {
|
|
|
31
31
|
}
|
|
32
32
|
return issue.message;
|
|
33
33
|
}
|
|
34
|
-
const has = (record, key) => Object.prototype.hasOwnProperty.call(record, key);
|
|
35
|
-
class ReferenceCheck {
|
|
36
|
-
page;
|
|
37
|
-
issues = [];
|
|
38
|
-
ids = new Map();
|
|
39
|
-
constructor(page) {
|
|
40
|
-
this.page = page;
|
|
41
|
-
}
|
|
42
|
-
run() {
|
|
43
|
-
this.checkFields(this.page.fields, 'fields');
|
|
44
|
-
this.walkRoot(this.page.layout, 'layout');
|
|
45
|
-
return this.issues;
|
|
46
|
-
}
|
|
47
|
-
report(path, message) {
|
|
48
|
-
this.issues.push({ path, message });
|
|
49
|
-
}
|
|
50
|
-
claim(id, path) {
|
|
51
|
-
const first = this.ids.get(id);
|
|
52
|
-
if (first !== undefined)
|
|
53
|
-
this.report(path, `duplicate id "${id}", also used at ${first}`);
|
|
54
|
-
else
|
|
55
|
-
this.ids.set(id, path);
|
|
56
|
-
}
|
|
57
|
-
/** The field a reference names, or a reported issue and undefined. */
|
|
58
|
-
need(name, path, scope = this.page.fields) {
|
|
59
|
-
if (has(scope, name))
|
|
60
|
-
return scope[name];
|
|
61
|
-
this.report(path, `no field "${name}"`);
|
|
62
|
-
return undefined;
|
|
63
|
-
}
|
|
64
|
-
/** Every modifier on `owner` must read, and read only fields of this page. */
|
|
65
|
-
checkModifiers(owner, path, keys = ['invisible']) {
|
|
66
|
-
for (const key of keys) {
|
|
67
|
-
const value = owner[key];
|
|
68
|
-
if (typeof value !== 'string')
|
|
69
|
-
continue;
|
|
70
|
-
let fields;
|
|
71
|
-
try {
|
|
72
|
-
fields = compileModifier(value).fields;
|
|
73
|
-
}
|
|
74
|
-
catch (error) {
|
|
75
|
-
this.report(`${path}.${key}`, `cannot read "${value}": ${error.message}`);
|
|
76
|
-
continue;
|
|
77
|
-
}
|
|
78
|
-
for (const name of fields) {
|
|
79
|
-
if (!has(this.page.fields, name)) {
|
|
80
|
-
this.report(`${path}.${key}`, `"${value}" reads "${name}", which is not a field of this page`);
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
checkFields(fields, base) {
|
|
86
|
-
for (const [name, def] of Object.entries(fields)) {
|
|
87
|
-
const path = `${base}.${name}`;
|
|
88
|
-
if (def.type === 'monetary' && def.currencyField !== undefined) {
|
|
89
|
-
const currency = this.need(def.currencyField, `${path}.currencyField`, fields);
|
|
90
|
-
if (currency && !['many2one', 'selection', 'char'].includes(currency.type)) {
|
|
91
|
-
this.report(`${path}.currencyField`, `"${def.currencyField}" is a ${currency.type}; a currency field must be a many2one, selection or char`);
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
if ((def.type === 'many2one' || def.type === 'many2many') && def.filter) {
|
|
95
|
-
def.filter.forEach((condition, i) => {
|
|
96
|
-
if (condition.valueFrom !== undefined)
|
|
97
|
-
this.need(condition.valueFrom, `${path}.filter[${i}].valueFrom`, fields);
|
|
98
|
-
});
|
|
99
|
-
}
|
|
100
|
-
if (def.type === 'properties' && def.definitions) {
|
|
101
|
-
const seen = new Set();
|
|
102
|
-
def.definitions.forEach((property, i) => {
|
|
103
|
-
if (property.type === 'selection' && !property.options) {
|
|
104
|
-
this.report(`${path}.definitions[${i}].options`, 'a choice property needs its choices');
|
|
105
|
-
}
|
|
106
|
-
if (seen.has(property.name))
|
|
107
|
-
this.report(`${path}.definitions[${i}].name`, `"${property.name}" is named twice`);
|
|
108
|
-
seen.add(property.name);
|
|
109
|
-
});
|
|
110
|
-
}
|
|
111
|
-
if (def.type === 'one2many') {
|
|
112
|
-
this.checkFields(def.fields, `${path}.fields`);
|
|
113
|
-
if (def.lineKinds)
|
|
114
|
-
this.checkLineKinds(name, def.lineKinds, def.fields, `${path}.lineKinds`);
|
|
115
|
-
if (def.sequenceField !== undefined) {
|
|
116
|
-
const sequence = def.fields[def.sequenceField];
|
|
117
|
-
if (!sequence)
|
|
118
|
-
this.report(`${path}.sequenceField`, `"${def.sequenceField}" is not a field of the lines of "${name}"`);
|
|
119
|
-
else if (sequence.type !== 'integer') {
|
|
120
|
-
this.report(`${path}.sequenceField`, `"${def.sequenceField}" is a ${sequence.type}; the field that keeps the order of lines must be an integer`);
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
checkLineKinds(field, kinds, lineFields, path) {
|
|
127
|
-
const kindField = lineFields[kinds.field];
|
|
128
|
-
if (!kindField)
|
|
129
|
-
this.report(`${path}.field`, `"${kinds.field}" is not a field of the lines of "${field}"`);
|
|
130
|
-
else if (kindField.type !== 'selection' && kindField.type !== 'char') {
|
|
131
|
-
this.report(`${path}.field`, `"${kinds.field}" is a ${kindField.type}; the field that says what a line is must be a selection or char`);
|
|
132
|
-
}
|
|
133
|
-
else if (kindField.type === 'selection') {
|
|
134
|
-
for (const which of ['section', 'note']) {
|
|
135
|
-
const value = kinds[which] ?? which;
|
|
136
|
-
if (!kindField.options.some((o) => o.value === value))
|
|
137
|
-
this.report(`${path}.${which}`, `"${kinds.field}" has no option "${value}"`);
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
const text = lineFields[kinds.text];
|
|
141
|
-
if (!text)
|
|
142
|
-
this.report(`${path}.text`, `"${kinds.text}" is not a field of the lines of "${field}"`);
|
|
143
|
-
else if (text.type !== 'char' && text.type !== 'text') {
|
|
144
|
-
this.report(`${path}.text`, `"${kinds.text}" is a ${text.type}; a section's or note's text must be a char or text field`);
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
walkRoot(root, path) {
|
|
148
|
-
if (root.type === 'tabs')
|
|
149
|
-
return this.walkNode(root, path);
|
|
150
|
-
this.claim(root.id, path);
|
|
151
|
-
if (root.type === 'sheet')
|
|
152
|
-
return this.walkSheet(root, path);
|
|
153
|
-
if (root.type === 'sections')
|
|
154
|
-
return this.walkChildren(root.children, path);
|
|
155
|
-
root.children.forEach((step, i) => {
|
|
156
|
-
const stepPath = `${path}.children[${i}]`;
|
|
157
|
-
this.claim(step.id, stepPath);
|
|
158
|
-
this.checkModifiers(step, stepPath);
|
|
159
|
-
this.walkChildren(step.children, stepPath);
|
|
160
|
-
});
|
|
161
|
-
}
|
|
162
|
-
walkChildren(children, path) {
|
|
163
|
-
children.forEach((child, i) => this.walkNode(child, `${path}.children[${i}]`));
|
|
164
|
-
}
|
|
165
|
-
walkNode(node, path) {
|
|
166
|
-
this.claim(node.id, path);
|
|
167
|
-
this.checkModifiers(node, path, node.type === 'field' ? ['invisible', 'readonly', 'required'] : ['invisible']);
|
|
168
|
-
switch (node.type) {
|
|
169
|
-
case 'field':
|
|
170
|
-
return this.checkFieldNode(node, path);
|
|
171
|
-
case 'section':
|
|
172
|
-
if (node.collapsible && !node.title)
|
|
173
|
-
this.report(path, 'a collapsible section needs a title to fold it by');
|
|
174
|
-
if (node.collapsed && !node.collapsible)
|
|
175
|
-
this.report(path, 'collapsed needs collapsible: true');
|
|
176
|
-
return this.walkChildren(node.children, path);
|
|
177
|
-
case 'tabs':
|
|
178
|
-
return this.walkTabs(node, path);
|
|
179
|
-
default:
|
|
180
|
-
return;
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
walkTabs(node, path) {
|
|
184
|
-
node.children.forEach((tab, i) => {
|
|
185
|
-
const tabPath = `${path}.children[${i}]`;
|
|
186
|
-
this.claim(tab.id, tabPath);
|
|
187
|
-
this.checkModifiers(tab, tabPath);
|
|
188
|
-
this.walkChildren(tab.children, tabPath);
|
|
189
|
-
});
|
|
190
|
-
}
|
|
191
|
-
walkSheet(sheet, path) {
|
|
192
|
-
if (sheet.title) {
|
|
193
|
-
this.need(sheet.title.field, `${path}.title.field`);
|
|
194
|
-
if (sheet.title.subtitleField !== undefined)
|
|
195
|
-
this.need(sheet.title.subtitleField, `${path}.title.subtitleField`);
|
|
196
|
-
if (sheet.title.avatarField !== undefined)
|
|
197
|
-
this.need(sheet.title.avatarField, `${path}.title.avatarField`);
|
|
198
|
-
}
|
|
199
|
-
if (sheet.statusbar) {
|
|
200
|
-
const { field, visibleStates } = sheet.statusbar;
|
|
201
|
-
const def = this.need(field, `${path}.statusbar.field`);
|
|
202
|
-
if (def && def.type !== 'selection' && def.type !== 'many2one') {
|
|
203
|
-
this.report(`${path}.statusbar.field`, `"${field}" is a ${def.type}; a statusbar needs a selection or many2one`);
|
|
204
|
-
}
|
|
205
|
-
if (def?.type === 'selection' && visibleStates) {
|
|
206
|
-
const values = new Set(def.options.map((o) => o.value));
|
|
207
|
-
visibleStates.forEach((state, i) => {
|
|
208
|
-
if (!values.has(state)) {
|
|
209
|
-
this.report(`${path}.statusbar.visibleStates[${i}]`, `"${state}" is not an option of "${field}"`);
|
|
210
|
-
}
|
|
211
|
-
});
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
sheet.buttons?.forEach((button, i) => {
|
|
215
|
-
this.claim(button.id, `${path}.buttons[${i}]`);
|
|
216
|
-
this.checkModifiers(button, `${path}.buttons[${i}]`);
|
|
217
|
-
});
|
|
218
|
-
sheet.statButtons?.forEach((stat, i) => {
|
|
219
|
-
this.claim(stat.id, `${path}.statButtons[${i}]`);
|
|
220
|
-
this.checkModifiers(stat, `${path}.statButtons[${i}]`);
|
|
221
|
-
if (stat.field !== undefined)
|
|
222
|
-
this.need(stat.field, `${path}.statButtons[${i}].field`);
|
|
223
|
-
});
|
|
224
|
-
if (sheet.ribbon) {
|
|
225
|
-
this.claim(sheet.ribbon.id, `${path}.ribbon`);
|
|
226
|
-
this.checkModifiers(sheet.ribbon, `${path}.ribbon`);
|
|
227
|
-
}
|
|
228
|
-
sheet.alerts?.forEach((alert, i) => {
|
|
229
|
-
this.claim(alert.id, `${path}.alerts[${i}]`);
|
|
230
|
-
this.checkModifiers(alert, `${path}.alerts[${i}]`);
|
|
231
|
-
});
|
|
232
|
-
this.walkChildren(sheet.children, path);
|
|
233
|
-
if (sheet.sidePanel) {
|
|
234
|
-
this.claim(sheet.sidePanel.id, `${path}.sidePanel`);
|
|
235
|
-
this.checkModifiers(sheet.sidePanel, `${path}.sidePanel`);
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
checkFieldNode(node, path) {
|
|
239
|
-
const def = this.need(node.field, `${path}.field`);
|
|
240
|
-
if (def && node.totals) {
|
|
241
|
-
if (def.type !== 'one2many') {
|
|
242
|
-
this.report(`${path}.totals`, `totals only apply to one2many fields; "${node.field}" is a ${def.type}`);
|
|
243
|
-
}
|
|
244
|
-
else {
|
|
245
|
-
node.totals.forEach((column, i) => {
|
|
246
|
-
const sub = has(def.fields, column) ? def.fields[column] : undefined;
|
|
247
|
-
if (!sub)
|
|
248
|
-
this.report(`${path}.totals[${i}]`, `"${column}" is not a field of the lines of "${node.field}"`);
|
|
249
|
-
else if (!['integer', 'float', 'monetary'].includes(sub.type)) {
|
|
250
|
-
this.report(`${path}.totals[${i}]`, `"${column}" is a ${sub.type}; only integer, float and monetary columns add up`);
|
|
251
|
-
}
|
|
252
|
-
});
|
|
253
|
-
}
|
|
254
|
-
}
|
|
255
|
-
// Options that point at another field: by convention their names end in "Field".
|
|
256
|
-
for (const [key, value] of Object.entries(node.options ?? {})) {
|
|
257
|
-
if (key.endsWith('Field') && typeof value === 'string')
|
|
258
|
-
this.need(value, `${path}.options.${key}`);
|
|
259
|
-
}
|
|
260
|
-
if (def && node.editMode && def.type !== 'one2many') {
|
|
261
|
-
this.report(`${path}.editMode`, `editMode only applies to one2many fields; "${node.field}" is a ${def.type}`);
|
|
262
|
-
}
|
|
263
|
-
if (def && node.optionalColumns) {
|
|
264
|
-
if (def.type !== 'one2many') {
|
|
265
|
-
this.report(`${path}.optionalColumns`, `optional columns only apply to one2many fields; "${node.field}" is a ${def.type}`);
|
|
266
|
-
}
|
|
267
|
-
else {
|
|
268
|
-
// The columns the table shows: those named, or every line field but the structural ones.
|
|
269
|
-
const shown = node.columns ?? Object.keys(def.fields).filter((c) => c !== def.lineKinds?.field && c !== def.sequenceField);
|
|
270
|
-
for (const column of Object.keys(node.optionalColumns)) {
|
|
271
|
-
if (!shown.includes(column))
|
|
272
|
-
this.report(`${path}.optionalColumns.${column}`, `"${column}" is not a column of "${node.field}"`);
|
|
273
|
-
}
|
|
274
|
-
}
|
|
275
|
-
}
|
|
276
|
-
if (!def || !node.columns)
|
|
277
|
-
return;
|
|
278
|
-
if (def.type === 'one2many') {
|
|
279
|
-
node.columns.forEach((column, i) => {
|
|
280
|
-
if (!has(def.fields, column)) {
|
|
281
|
-
this.report(`${path}.columns[${i}]`, `"${column}" is not a field of the lines of "${node.field}"`);
|
|
282
|
-
}
|
|
283
|
-
});
|
|
284
|
-
}
|
|
285
|
-
else if (def.type !== 'many2many') {
|
|
286
|
-
this.report(`${path}.columns`, `columns only apply to one2many and many2many fields; "${node.field}" is a ${def.type}`);
|
|
287
|
-
}
|
|
288
|
-
}
|
|
289
|
-
}
|
|
290
34
|
//# sourceMappingURL=validate.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate.mjs","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/format/validate.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAa,MAAM,QAAQ,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAUzD;;;;;;;;GAQG;AACH,MAAM,UAAU,YAAY,CAAC,KAAc;IACzC,MAAM,MAAM,GAAG,UAAU,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAC3C,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;IACjI,CAAC;IACD,MAAM,IAAI,GAAS,MAAM,CAAC,IAAI,CAAC;IAC/B,MAAM,MAAM,GAAG,IAAI,cAAc,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC;IAC9C,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AACpE,CAAC;AAED,SAAS,UAAU,CAAC,IAA4B;IAC9C,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,QAAQ,CAAC;IACvC,OAAO,IAAI;SACR,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;SACvH,IAAI,CAAC,EAAE,CAAC,CAAC;AACd,CAAC;AAED,SAAS,QAAQ,CAAC,KAAuB;IACvC,IAAI,KAAK,CAAC,IAAI,KAAK,eAAe,IAAI,eAAe,IAAI,KAAK,IAAI,KAAK,CAAC,aAAa,EAAE,CAAC;QACtF,OAAO,IAAI,KAAK,CAAC,aAAa,wCAAwC,CAAC;IACzE,CAAC;IACD,OAAO,KAAK,CAAC,OAAO,CAAC;AACvB,CAAC;AAED,MAAM,GAAG,GAAG,CAAC,MAAc,EAAE,GAAW,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAE/F,MAAM,cAAc;IAIW;IAHZ,MAAM,GAAgB,EAAE,CAAC;IACzB,GAAG,GAAG,IAAI,GAAG,EAAkB,CAAC;IAEjD,YAA6B,IAAU;QAAV,SAAI,GAAJ,IAAI,CAAM;IAAG,CAAC;IAE3C,GAAG;QACD,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC7C,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC1C,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAEO,MAAM,CAAC,IAAY,EAAE,OAAe;QAC1C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IACtC,CAAC;IAEO,KAAK,CAAC,EAAU,EAAE,IAAY;QACpC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC/B,IAAI,KAAK,KAAK,SAAS;YAAE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,iBAAiB,EAAE,mBAAmB,KAAK,EAAE,CAAC,CAAC;;YACrF,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IAC9B,CAAC;IAED,sEAAsE;IAC9D,IAAI,CAAC,IAAY,EAAE,IAAY,EAAE,QAA2C,IAAI,CAAC,IAAI,CAAC,MAAM;QAClG,IAAI,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC;YAAE,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,aAAa,IAAI,GAAG,CAAC,CAAC;QACxC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,8EAA8E;IACtE,cAAc,CAAC,KAAa,EAAE,IAAY,EAAE,OAA0B,CAAC,WAAW,CAAC;QACzF,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,KAAK,GAAI,KAAiC,CAAC,GAAG,CAAC,CAAC;YACtD,IAAI,OAAO,KAAK,KAAK,QAAQ;gBAAE,SAAS;YACxC,IAAI,MAAyB,CAAC;YAC9B,IAAI,CAAC;gBACH,MAAM,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC;YACzC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,IAAI,GAAG,EAAE,EAAE,gBAAgB,KAAK,MAAO,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;gBACrF,SAAS;YACX,CAAC;YACD,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;gBAC1B,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC;oBACjC,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,IAAI,GAAG,EAAE,EAAE,IAAI,KAAK,YAAY,IAAI,sCAAsC,CAAC,CAAC;gBACjG,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAEO,WAAW,CAAC,MAA0C,EAAE,IAAY;QAC1E,KAAK,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YACjD,MAAM,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC;YAC/B,IAAI,GAAG,CAAC,IAAI,KAAK,UAAU,IAAI,GAAG,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;gBAC/D,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,GAAG,IAAI,gBAAgB,EAAE,MAAM,CAAC,CAAC;gBAC/E,IAAI,QAAQ,IAAI,CAAC,CAAC,UAAU,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC3E,IAAI,CAAC,MAAM,CACT,GAAG,IAAI,gBAAgB,EACvB,IAAI,GAAG,CAAC,aAAa,UAAU,QAAQ,CAAC,IAAI,0DAA0D,CACvG,CAAC;gBACJ,CAAC;YACH,CAAC;YACD,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,UAAU,IAAI,GAAG,CAAC,IAAI,KAAK,WAAW,CAAC,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;gBACxE,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,CAAC,EAAE,EAAE;oBAClC,IAAI,SAAS,CAAC,SAAS,KAAK,SAAS;wBAAE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,GAAG,IAAI,WAAW,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;gBAClH,CAAC,CAAC,CAAC;YACL,CAAC;YACD,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC;gBACjD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;gBAC/B,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE;oBACtC,IAAI,QAAQ,CAAC,IAAI,KAAK,WAAW,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;wBACvD,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,gBAAgB,CAAC,WAAW,EAAE,qCAAqC,CAAC,CAAC;oBAC1F,CAAC;oBACD,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC;wBAAE,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,gBAAgB,CAAC,QAAQ,EAAE,IAAI,QAAQ,CAAC,IAAI,kBAAkB,CAAC,CAAC;oBAChH,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;gBAC1B,CAAC,CAAC,CAAC;YACL,CAAC;YACD,IAAI,GAAG,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;gBAC5B,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,IAAI,SAAS,CAAC,CAAC;gBAC/C,IAAI,GAAG,CAAC,SAAS;oBAAE,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,IAAI,YAAY,CAAC,CAAC;gBAC7F,IAAI,GAAG,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;oBACpC,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;oBAC/C,IAAI,CAAC,QAAQ;wBAAE,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,gBAAgB,EAAE,IAAI,GAAG,CAAC,aAAa,qCAAqC,IAAI,GAAG,CAAC,CAAC;yBAClH,IAAI,QAAQ,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;wBACrC,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,gBAAgB,EAAE,IAAI,GAAG,CAAC,aAAa,UAAU,QAAQ,CAAC,IAAI,8DAA8D,CAAC,CAAC;oBACnJ,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAEO,cAAc,CAAC,KAAa,EAAE,KAAgB,EAAE,UAAqC,EAAE,IAAY;QACzG,MAAM,SAAS,GAAG,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC1C,IAAI,CAAC,SAAS;YAAE,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,QAAQ,EAAE,IAAI,KAAK,CAAC,KAAK,qCAAqC,KAAK,GAAG,CAAC,CAAC;aACtG,IAAI,SAAS,CAAC,IAAI,KAAK,WAAW,IAAI,SAAS,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YACrE,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,QAAQ,EAAE,IAAI,KAAK,CAAC,KAAK,UAAU,SAAS,CAAC,IAAI,kEAAkE,CAAC,CAAC;QAC1I,CAAC;aAAM,IAAI,SAAS,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YAC1C,KAAK,MAAM,KAAK,IAAI,CAAC,SAAS,EAAE,MAAM,CAAU,EAAE,CAAC;gBACjD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC;gBACpC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC;oBAAE,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,IAAI,KAAK,EAAE,EAAE,IAAI,KAAK,CAAC,KAAK,oBAAoB,KAAK,GAAG,CAAC,CAAC;YACtI,CAAC;QACH,CAAC;QACD,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACpC,IAAI,CAAC,IAAI;YAAE,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,OAAO,EAAE,IAAI,KAAK,CAAC,IAAI,qCAAqC,KAAK,GAAG,CAAC,CAAC;aAC/F,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YACtD,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,OAAO,EAAE,IAAI,KAAK,CAAC,IAAI,UAAU,IAAI,CAAC,IAAI,2DAA2D,CAAC,CAAC;QAC5H,CAAC;IACH,CAAC;IAEO,QAAQ,CAAC,IAAgB,EAAE,IAAY;QAC7C,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM;YAAE,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC3D,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QAC1B,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO;YAAE,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC7D,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU;YAAE,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAC5E,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;YAChC,MAAM,QAAQ,GAAG,GAAG,IAAI,aAAa,CAAC,GAAG,CAAC;YAC1C,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;YAC9B,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YACpC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,YAAY,CAAC,QAAsB,EAAE,IAAY;QACvD,QAAQ,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG,IAAI,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC;IACjF,CAAC;IAEO,QAAQ,CAAC,IAAgB,EAAE,IAAY;QAC7C,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QAC1B,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;QAC/G,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;YAClB,KAAK,OAAO;gBACV,OAAO,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YACzC,KAAK,SAAS;gBACZ,IAAI,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,KAAK;oBAAE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,mDAAmD,CAAC,CAAC;gBAC5G,IAAI,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,WAAW;oBAAE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,mCAAmC,CAAC,CAAC;gBAChG,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YAChD,KAAK,MAAM;gBACT,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YACnC;gBACE,OAAO;QACX,CAAC;IACH,CAAC;IAEO,QAAQ,CAAC,IAAc,EAAE,IAAY;QAC3C,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;YAC/B,MAAM,OAAO,GAAG,GAAG,IAAI,aAAa,CAAC,GAAG,CAAC;YACzC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;YAC5B,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;YAClC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC3C,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,SAAS,CAAC,KAAgB,EAAE,IAAY;QAC9C,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;YAChB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,IAAI,cAAc,CAAC,CAAC;YACpD,IAAI,KAAK,CAAC,KAAK,CAAC,aAAa,KAAK,SAAS;gBAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,EAAE,GAAG,IAAI,sBAAsB,CAAC,CAAC;YACjH,IAAI,KAAK,CAAC,KAAK,CAAC,WAAW,KAAK,SAAS;gBAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,EAAE,GAAG,IAAI,oBAAoB,CAAC,CAAC;QAC7G,CAAC;QACD,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;YACpB,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,GAAG,KAAK,CAAC,SAAS,CAAC;YACjD,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,IAAI,kBAAkB,CAAC,CAAC;YACxD,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,KAAK,WAAW,IAAI,GAAG,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;gBAC/D,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,kBAAkB,EAAE,IAAI,KAAK,UAAU,GAAG,CAAC,IAAI,6CAA6C,CAAC,CAAC;YACnH,CAAC;YACD,IAAI,GAAG,EAAE,IAAI,KAAK,WAAW,IAAI,aAAa,EAAE,CAAC;gBAC/C,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;gBACxD,aAAa,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;oBACjC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;wBACvB,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,4BAA4B,CAAC,GAAG,EAAE,IAAI,KAAK,0BAA0B,KAAK,GAAG,CAAC,CAAC;oBACpG,CAAC;gBACH,CAAC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QACD,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACnC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,IAAI,YAAY,CAAC,GAAG,CAAC,CAAC;YAC/C,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,GAAG,IAAI,YAAY,CAAC,GAAG,CAAC,CAAC;QACvD,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;YACrC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,GAAG,IAAI,gBAAgB,CAAC,GAAG,CAAC,CAAC;YACjD,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,IAAI,gBAAgB,CAAC,GAAG,CAAC,CAAC;YACvD,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS;gBAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,IAAI,gBAAgB,CAAC,SAAS,CAAC,CAAC;QACzF,CAAC,CAAC,CAAC;QACH,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YACjB,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,IAAI,SAAS,CAAC,CAAC;YAC9C,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,IAAI,SAAS,CAAC,CAAC;QACtD,CAAC;QACD,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;YACjC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,EAAE,GAAG,IAAI,WAAW,CAAC,GAAG,CAAC,CAAC;YAC7C,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,GAAG,IAAI,WAAW,CAAC,GAAG,CAAC,CAAC;QACrD,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QACxC,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;YACpB,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,EAAE,GAAG,IAAI,YAAY,CAAC,CAAC;YACpD,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,SAAS,EAAE,GAAG,IAAI,YAAY,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;IAEO,cAAc,CAAC,IAAe,EAAE,IAAY;QAClD,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,IAAI,QAAQ,CAAC,CAAC;QACnD,IAAI,GAAG,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACvB,IAAI,GAAG,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;gBAC5B,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,SAAS,EAAE,0CAA0C,IAAI,CAAC,KAAK,UAAU,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;YAC1G,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;oBAChC,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;oBACrE,IAAI,CAAC,GAAG;wBAAE,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,WAAW,CAAC,GAAG,EAAE,IAAI,MAAM,qCAAqC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;yBACvG,IAAI,CAAC,CAAC,SAAS,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;wBAC9D,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,WAAW,CAAC,GAAG,EAAE,IAAI,MAAM,UAAU,GAAG,CAAC,IAAI,mDAAmD,CAAC,CAAC;oBACvH,CAAC;gBACH,CAAC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QACD,iFAAiF;QACjF,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,CAAC;YAC9D,IAAI,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,OAAO,KAAK,KAAK,QAAQ;gBAAE,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,IAAI,YAAY,GAAG,EAAE,CAAC,CAAC;QACrG,CAAC;QACD,IAAI,GAAG,IAAI,IAAI,CAAC,QAAQ,IAAI,GAAG,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YACpD,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,WAAW,EAAE,8CAA8C,IAAI,CAAC,KAAK,UAAU,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;QAChH,CAAC;QACD,IAAI,GAAG,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YAChC,IAAI,GAAG,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;gBAC5B,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,kBAAkB,EAAE,oDAAoD,IAAI,CAAC,KAAK,UAAU,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;YAC7H,CAAC;iBAAM,CAAC;gBACN,yFAAyF;gBACzF,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,GAAG,CAAC,SAAS,EAAE,KAAK,IAAI,CAAC,KAAK,GAAG,CAAC,aAAa,CAAC,CAAC;gBAC3H,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC;oBACvD,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;wBAAE,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,oBAAoB,MAAM,EAAE,EAAE,IAAI,MAAM,yBAAyB,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;gBAClI,CAAC;YACH,CAAC;QACH,CAAC;QACD,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO;QAClC,IAAI,GAAG,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YAC5B,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBACjC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;oBAC7B,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,YAAY,CAAC,GAAG,EAAE,IAAI,MAAM,qCAAqC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;gBACrG,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;aAAM,IAAI,GAAG,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YACpC,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,UAAU,EAAE,yDAAyD,IAAI,CAAC,KAAK,UAAU,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;QAC1H,CAAC;IACH,CAAC;CACF"}
|
|
1
|
+
{"version":3,"file":"validate.mjs","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/format/validate.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAa,MAAM,QAAQ,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAuB,MAAM,cAAc,CAAC;AAInE;;;;;;;;GAQG;AACH,MAAM,UAAU,YAAY,CAAC,KAAc;IACzC,MAAM,MAAM,GAAG,UAAU,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAC3C,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;IACjI,CAAC;IACD,MAAM,IAAI,GAAS,MAAM,CAAC,IAAI,CAAC;IAC/B,MAAM,MAAM,GAAG,IAAI,cAAc,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC;IAC9C,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AACpE,CAAC;AAED,SAAS,UAAU,CAAC,IAA4B;IAC9C,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,QAAQ,CAAC;IACvC,OAAO,IAAI;SACR,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;SACvH,IAAI,CAAC,EAAE,CAAC,CAAC;AACd,CAAC;AAED,SAAS,QAAQ,CAAC,KAAuB;IACvC,IAAI,KAAK,CAAC,IAAI,KAAK,eAAe,IAAI,eAAe,IAAI,KAAK,IAAI,KAAK,CAAC,aAAa,EAAE,CAAC;QACtF,OAAO,IAAI,KAAK,CAAC,aAAa,wCAAwC,CAAC;IACzE,CAAC;IACD,OAAO,KAAK,CAAC,OAAO,CAAC;AACvB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/format/version.ts"],"names":[],"mappings":";;;AAAA,2DAA2D;AAC9C,QAAA,cAAc,GAAG,KAAc,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.mjs","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/format/version.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,MAAM,CAAC,MAAM,cAAc,GAAG,KAAc,CAAC"}
|
|
@@ -64,12 +64,21 @@ export interface SearchRequest {
|
|
|
64
64
|
model: string;
|
|
65
65
|
query: string;
|
|
66
66
|
/** The field's filter, with every `valueFrom` already replaced by its value. */
|
|
67
|
-
filter?:
|
|
67
|
+
filter?: ResolvedFilter[];
|
|
68
68
|
limit?: number;
|
|
69
69
|
}
|
|
70
70
|
export type ResolvedFilterCondition = Omit<FilterCondition, 'valueFrom' | 'value'> & {
|
|
71
71
|
value: JsonValue;
|
|
72
72
|
};
|
|
73
|
+
/**
|
|
74
|
+
* A filter as a search receives it: each `valueFrom` already replaced by its
|
|
75
|
+
* value. An adapter must keep the groups: `any` is an OR, `all` an AND.
|
|
76
|
+
*/
|
|
77
|
+
export type ResolvedFilter = ResolvedFilterCondition | {
|
|
78
|
+
any: ResolvedFilter[];
|
|
79
|
+
} | {
|
|
80
|
+
all: ResolvedFilter[];
|
|
81
|
+
};
|
|
73
82
|
export interface SubmitRequest {
|
|
74
83
|
pageId: string;
|
|
75
84
|
/** The answers to the questions that were shown. Skipped steps are left out. */
|
|
@@ -114,3 +123,20 @@ export type LinkOp = {
|
|
|
114
123
|
} | {
|
|
115
124
|
op: 'clear';
|
|
116
125
|
};
|
|
126
|
+
/**
|
|
127
|
+
* Why a save was refused, so each kind is shown where it belongs: `fields`
|
|
128
|
+
* under those fields, a `rule` (a backend's business rule) in a dialog,
|
|
129
|
+
* `network` in a banner with Retry, and `other` beside Save with Retry.
|
|
130
|
+
*/
|
|
131
|
+
export interface SaveProblem {
|
|
132
|
+
kind: 'fields' | 'rule' | 'network' | 'other';
|
|
133
|
+
message: string;
|
|
134
|
+
/** For `fields`: a message for each field, by name. */
|
|
135
|
+
fields?: Record<string, string>;
|
|
136
|
+
}
|
|
137
|
+
/** An error for a data source's save to throw when the backend refuses it. */
|
|
138
|
+
export declare function saveRefused(problem: SaveProblem): Error & {
|
|
139
|
+
problem: SaveProblem;
|
|
140
|
+
};
|
|
141
|
+
/** What a failed save tells: its own problem, a failed fetch as the network, anything else as it is. */
|
|
142
|
+
export declare function saveProblemOf(error: unknown): SaveProblem;
|
|
@@ -64,12 +64,21 @@ export interface SearchRequest {
|
|
|
64
64
|
model: string;
|
|
65
65
|
query: string;
|
|
66
66
|
/** The field's filter, with every `valueFrom` already replaced by its value. */
|
|
67
|
-
filter?:
|
|
67
|
+
filter?: ResolvedFilter[];
|
|
68
68
|
limit?: number;
|
|
69
69
|
}
|
|
70
70
|
export type ResolvedFilterCondition = Omit<FilterCondition, 'valueFrom' | 'value'> & {
|
|
71
71
|
value: JsonValue;
|
|
72
72
|
};
|
|
73
|
+
/**
|
|
74
|
+
* A filter as a search receives it: each `valueFrom` already replaced by its
|
|
75
|
+
* value. An adapter must keep the groups: `any` is an OR, `all` an AND.
|
|
76
|
+
*/
|
|
77
|
+
export type ResolvedFilter = ResolvedFilterCondition | {
|
|
78
|
+
any: ResolvedFilter[];
|
|
79
|
+
} | {
|
|
80
|
+
all: ResolvedFilter[];
|
|
81
|
+
};
|
|
73
82
|
export interface SubmitRequest {
|
|
74
83
|
pageId: string;
|
|
75
84
|
/** The answers to the questions that were shown. Skipped steps are left out. */
|
|
@@ -114,3 +123,20 @@ export type LinkOp = {
|
|
|
114
123
|
} | {
|
|
115
124
|
op: 'clear';
|
|
116
125
|
};
|
|
126
|
+
/**
|
|
127
|
+
* Why a save was refused, so each kind is shown where it belongs: `fields`
|
|
128
|
+
* under those fields, a `rule` (a backend's business rule) in a dialog,
|
|
129
|
+
* `network` in a banner with Retry, and `other` beside Save with Retry.
|
|
130
|
+
*/
|
|
131
|
+
export interface SaveProblem {
|
|
132
|
+
kind: 'fields' | 'rule' | 'network' | 'other';
|
|
133
|
+
message: string;
|
|
134
|
+
/** For `fields`: a message for each field, by name. */
|
|
135
|
+
fields?: Record<string, string>;
|
|
136
|
+
}
|
|
137
|
+
/** An error for a data source's save to throw when the backend refuses it. */
|
|
138
|
+
export declare function saveRefused(problem: SaveProblem): Error & {
|
|
139
|
+
problem: SaveProblem;
|
|
140
|
+
};
|
|
141
|
+
/** What a failed save tells: its own problem, a failed fetch as the network, anything else as it is. */
|
|
142
|
+
export declare function saveProblemOf(error: unknown): SaveProblem;
|
|
@@ -1,3 +1,19 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.saveRefused = saveRefused;
|
|
4
|
+
exports.saveProblemOf = saveProblemOf;
|
|
5
|
+
/** An error for a data source's save to throw when the backend refuses it. */
|
|
6
|
+
function saveRefused(problem) {
|
|
7
|
+
return Object.assign(new Error(problem.message), { problem });
|
|
8
|
+
}
|
|
9
|
+
/** What a failed save tells: its own problem, a failed fetch as the network, anything else as it is. */
|
|
10
|
+
function saveProblemOf(error) {
|
|
11
|
+
const carried = error?.problem;
|
|
12
|
+
if (carried && typeof carried.kind === 'string')
|
|
13
|
+
return carried;
|
|
14
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
15
|
+
if (error instanceof TypeError && /fetch|network|load failed/i.test(message))
|
|
16
|
+
return { kind: 'network', message };
|
|
17
|
+
return { kind: 'other', message };
|
|
18
|
+
}
|
|
3
19
|
//# sourceMappingURL=data-source.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-source.js","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/record/data-source.ts"],"names":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"data-source.js","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/record/data-source.ts"],"names":[],"mappings":";;AAqIA,kCAEC;AAGD,sCAMC;AAZD,8EAA8E;AAC9E,SAAgB,WAAW,CAAC,OAAoB;IAC9C,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;AAChE,CAAC;AAED,wGAAwG;AACxG,SAAgB,aAAa,CAAC,KAAc;IAC1C,MAAM,OAAO,GAAI,KAA0C,EAAE,OAAO,CAAC;IACrE,IAAI,OAAO,IAAI,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO,OAAO,CAAC;IAChE,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvE,IAAI,KAAK,YAAY,SAAS,IAAI,4BAA4B,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;IAClH,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;AACpC,CAAC"}
|
|
@@ -1,2 +1,15 @@
|
|
|
1
|
-
|
|
1
|
+
/** An error for a data source's save to throw when the backend refuses it. */
|
|
2
|
+
export function saveRefused(problem) {
|
|
3
|
+
return Object.assign(new Error(problem.message), { problem });
|
|
4
|
+
}
|
|
5
|
+
/** What a failed save tells: its own problem, a failed fetch as the network, anything else as it is. */
|
|
6
|
+
export function saveProblemOf(error) {
|
|
7
|
+
const carried = error?.problem;
|
|
8
|
+
if (carried && typeof carried.kind === 'string')
|
|
9
|
+
return carried;
|
|
10
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
11
|
+
if (error instanceof TypeError && /fetch|network|load failed/i.test(message))
|
|
12
|
+
return { kind: 'network', message };
|
|
13
|
+
return { kind: 'other', message };
|
|
14
|
+
}
|
|
2
15
|
//# sourceMappingURL=data-source.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-source.mjs","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/record/data-source.ts"],"names":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"data-source.mjs","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/record/data-source.ts"],"names":[],"mappings":"AAoIA,8EAA8E;AAC9E,MAAM,UAAU,WAAW,CAAC,OAAoB;IAC9C,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;AAChE,CAAC;AAED,wGAAwG;AACxG,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,MAAM,OAAO,GAAI,KAA0C,EAAE,OAAO,CAAC;IACrE,IAAI,OAAO,IAAI,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO,OAAO,CAAC;IAChE,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvE,IAAI,KAAK,YAAY,SAAS,IAAI,4BAA4B,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;IAClH,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;AACpC,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ResolvedFilter } from './data-source.mjs';
|
|
2
|
+
import type { Values } from './values.mjs';
|
|
3
|
+
/**
|
|
4
|
+
* Whether a record passes a filter, the way a search should judge it: every
|
|
5
|
+
* item of the list holds, an `any` group when one of its items holds, an `all`
|
|
6
|
+
* group when each does. The memory data source searches with it; an app may too.
|
|
7
|
+
*/
|
|
8
|
+
export declare function matchesFilter(values: Values, filter: readonly ResolvedFilter[]): boolean;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ResolvedFilter } from './data-source';
|
|
2
|
+
import type { Values } from './values';
|
|
3
|
+
/**
|
|
4
|
+
* Whether a record passes a filter, the way a search should judge it: every
|
|
5
|
+
* item of the list holds, an `any` group when one of its items holds, an `all`
|
|
6
|
+
* group when each does. The memory data source searches with it; an app may too.
|
|
7
|
+
*/
|
|
8
|
+
export declare function matchesFilter(values: Values, filter: readonly ResolvedFilter[]): boolean;
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.matchesFilter = matchesFilter;
|
|
4
|
+
/**
|
|
5
|
+
* Whether a record passes a filter, the way a search should judge it: every
|
|
6
|
+
* item of the list holds, an `any` group when one of its items holds, an `all`
|
|
7
|
+
* group when each does. The memory data source searches with it; an app may too.
|
|
8
|
+
*/
|
|
9
|
+
function matchesFilter(values, filter) {
|
|
10
|
+
return filter.every((item) => holds(values, item));
|
|
11
|
+
}
|
|
12
|
+
function holds(values, item) {
|
|
13
|
+
if ('any' in item)
|
|
14
|
+
return item.any.some((inner) => holds(values, inner));
|
|
15
|
+
if ('all' in item)
|
|
16
|
+
return item.all.every((inner) => holds(values, inner));
|
|
17
|
+
return meets(values, item);
|
|
18
|
+
}
|
|
19
|
+
/** Empty is not set: no value, empty text, an empty list. */
|
|
20
|
+
function isSet(value) {
|
|
21
|
+
return value !== null && value !== undefined && value !== '' && value !== false && !(Array.isArray(value) && !value.length);
|
|
22
|
+
}
|
|
23
|
+
function meets(values, condition) {
|
|
24
|
+
const raw = values[condition.field];
|
|
25
|
+
// A link compares by its id.
|
|
26
|
+
const actual = raw !== null && typeof raw === 'object' && !Array.isArray(raw) && 'id' in raw ? raw.id : raw;
|
|
27
|
+
const expected = condition.value;
|
|
28
|
+
const text = String(actual ?? '');
|
|
29
|
+
switch (condition.op) {
|
|
30
|
+
case '=':
|
|
31
|
+
return actual === expected;
|
|
32
|
+
case '!=':
|
|
33
|
+
return actual !== expected;
|
|
34
|
+
case '<':
|
|
35
|
+
return isSet(actual) && actual < expected;
|
|
36
|
+
case '>':
|
|
37
|
+
return isSet(actual) && actual > expected;
|
|
38
|
+
case '<=':
|
|
39
|
+
return isSet(actual) && actual <= expected;
|
|
40
|
+
case '>=':
|
|
41
|
+
return isSet(actual) && actual >= expected;
|
|
42
|
+
case 'in':
|
|
43
|
+
return Array.isArray(expected) && expected.includes(actual);
|
|
44
|
+
case 'not in':
|
|
45
|
+
return Array.isArray(expected) && !expected.includes(actual);
|
|
46
|
+
case 'like':
|
|
47
|
+
return text.includes(String(expected));
|
|
48
|
+
case 'ilike':
|
|
49
|
+
return text.toLowerCase().includes(String(expected).toLowerCase());
|
|
50
|
+
case 'startswith':
|
|
51
|
+
return text.toLowerCase().startsWith(String(expected).toLowerCase());
|
|
52
|
+
case 'endswith':
|
|
53
|
+
return text.toLowerCase().endsWith(String(expected).toLowerCase());
|
|
54
|
+
case 'set':
|
|
55
|
+
return isSet(raw);
|
|
56
|
+
case 'notset':
|
|
57
|
+
return !isSet(raw);
|
|
58
|
+
case 'between': {
|
|
59
|
+
if (!isSet(actual) || !Array.isArray(expected))
|
|
60
|
+
return false;
|
|
61
|
+
const [low, high] = expected;
|
|
62
|
+
return actual >= low && actual <= high;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=filter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filter.js","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/record/filter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Whether a record passes a filter, the way a search should judge it: every
|
|
3
|
+
* item of the list holds, an `any` group when one of its items holds, an `all`
|
|
4
|
+
* group when each does. The memory data source searches with it; an app may too.
|
|
5
|
+
*/
|
|
6
|
+
export function matchesFilter(values, filter) {
|
|
7
|
+
return filter.every((item) => holds(values, item));
|
|
8
|
+
}
|
|
9
|
+
function holds(values, item) {
|
|
10
|
+
if ('any' in item)
|
|
11
|
+
return item.any.some((inner) => holds(values, inner));
|
|
12
|
+
if ('all' in item)
|
|
13
|
+
return item.all.every((inner) => holds(values, inner));
|
|
14
|
+
return meets(values, item);
|
|
15
|
+
}
|
|
16
|
+
/** Empty is not set: no value, empty text, an empty list. */
|
|
17
|
+
function isSet(value) {
|
|
18
|
+
return value !== null && value !== undefined && value !== '' && value !== false && !(Array.isArray(value) && !value.length);
|
|
19
|
+
}
|
|
20
|
+
function meets(values, condition) {
|
|
21
|
+
const raw = values[condition.field];
|
|
22
|
+
// A link compares by its id.
|
|
23
|
+
const actual = raw !== null && typeof raw === 'object' && !Array.isArray(raw) && 'id' in raw ? raw.id : raw;
|
|
24
|
+
const expected = condition.value;
|
|
25
|
+
const text = String(actual ?? '');
|
|
26
|
+
switch (condition.op) {
|
|
27
|
+
case '=':
|
|
28
|
+
return actual === expected;
|
|
29
|
+
case '!=':
|
|
30
|
+
return actual !== expected;
|
|
31
|
+
case '<':
|
|
32
|
+
return isSet(actual) && actual < expected;
|
|
33
|
+
case '>':
|
|
34
|
+
return isSet(actual) && actual > expected;
|
|
35
|
+
case '<=':
|
|
36
|
+
return isSet(actual) && actual <= expected;
|
|
37
|
+
case '>=':
|
|
38
|
+
return isSet(actual) && actual >= expected;
|
|
39
|
+
case 'in':
|
|
40
|
+
return Array.isArray(expected) && expected.includes(actual);
|
|
41
|
+
case 'not in':
|
|
42
|
+
return Array.isArray(expected) && !expected.includes(actual);
|
|
43
|
+
case 'like':
|
|
44
|
+
return text.includes(String(expected));
|
|
45
|
+
case 'ilike':
|
|
46
|
+
return text.toLowerCase().includes(String(expected).toLowerCase());
|
|
47
|
+
case 'startswith':
|
|
48
|
+
return text.toLowerCase().startsWith(String(expected).toLowerCase());
|
|
49
|
+
case 'endswith':
|
|
50
|
+
return text.toLowerCase().endsWith(String(expected).toLowerCase());
|
|
51
|
+
case 'set':
|
|
52
|
+
return isSet(raw);
|
|
53
|
+
case 'notset':
|
|
54
|
+
return !isSet(raw);
|
|
55
|
+
case 'between': {
|
|
56
|
+
if (!isSet(actual) || !Array.isArray(expected))
|
|
57
|
+
return false;
|
|
58
|
+
const [low, high] = expected;
|
|
59
|
+
return actual >= low && actual <= high;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=filter.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filter.mjs","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/record/filter.ts"],"names":[],"mappings":"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"}
|