@dcupl/common 2.0.0-beta.5 → 2.0.0-beta.6
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/esm/getFacets.d.ts +23 -0
- package/dist/esm/index.js +718 -663
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/property-parser.d.ts +20 -0
- package/dist/esm/types/app-loader.types.d.ts +18 -1
- package/dist/esm/types/data.types.d.ts +5 -2
- package/dist/esm/types/dcupl.types.d.ts +12 -0
- package/dist/esm/types/facets.types.d.ts +5 -0
- package/dist/esm/types/index.d.ts +1 -0
- package/dist/esm/types/key-property.types.d.ts +11 -0
- package/dist/esm/types/list.types.d.ts +16 -0
- package/dist/esm/types/model.types.d.ts +10 -1
- package/dist/esm/types/quality.types.d.ts +55 -1
- package/dist/esm/types/query.types.d.ts +17 -8
- package/dist/node/index.cjs +2 -2
- package/dist/node/index.cjs.map +1 -1
- package/package.json +2 -2
|
@@ -1,9 +1,29 @@
|
|
|
1
1
|
import { Property, PropertyType } from './types/index.js';
|
|
2
|
+
export declare const coerceStringType: (value: string) => PropertyType;
|
|
3
|
+
export declare const looksDateLike: (value: string) => boolean;
|
|
2
4
|
export type GetPropertiesForDataOptions = {
|
|
3
5
|
deep?: boolean;
|
|
4
6
|
sampleSize?: number;
|
|
7
|
+
/** @deprecated No longer honored — empty values are always skipped for type
|
|
8
|
+
* inference and counted toward ColumnDiagnostic.emptyRate. */
|
|
5
9
|
ignoreEmpty?: boolean;
|
|
6
10
|
};
|
|
11
|
+
export type ColumnDiagnostic = {
|
|
12
|
+
column: string;
|
|
13
|
+
inferredType: PropertyType;
|
|
14
|
+
observedTypes: PropertyType[];
|
|
15
|
+
emptyRate: number;
|
|
16
|
+
conflict: boolean;
|
|
17
|
+
hint?: string;
|
|
18
|
+
};
|
|
19
|
+
export type InferModelOptions = GetPropertiesForDataOptions & {
|
|
20
|
+
coerceStrings?: boolean;
|
|
21
|
+
};
|
|
22
|
+
export type InferModelResult = {
|
|
23
|
+
properties: Property[];
|
|
24
|
+
diagnostics: ColumnDiagnostic[];
|
|
25
|
+
};
|
|
26
|
+
export declare const inferModel: (data: any[], options?: InferModelOptions) => InferModelResult;
|
|
7
27
|
export declare const getPropertiesForData: (data: any[], deepOrOptions?: boolean | GetPropertiesForDataOptions) => Property[];
|
|
8
28
|
export declare const isInt: (n: any) => boolean;
|
|
9
29
|
export declare const isFloat: (n: any) => boolean;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { AutoGeneratePropertiesOption, DataContainerType } from './index.js';
|
|
2
|
+
import { KeyPropertySpec } from './key-property.types.js';
|
|
2
3
|
export declare namespace AppLoaderConfiguration {
|
|
3
4
|
/**
|
|
4
5
|
* The base structure for configuration file contains all resources, evnironments and headers
|
|
@@ -181,7 +182,23 @@ export declare namespace AppLoaderConfiguration {
|
|
|
181
182
|
};
|
|
182
183
|
export type DataResourceOptions = {
|
|
183
184
|
updateType?: DataContainerType;
|
|
184
|
-
|
|
185
|
+
/**
|
|
186
|
+
* Property name(s) on each row that uniquely identify it.
|
|
187
|
+
*
|
|
188
|
+
* Pass a single string for a simple key (`keyProperty: 'ID'`) or a
|
|
189
|
+
* non-empty array for a composite key (`keyProperty: ['ID', 'Language']`).
|
|
190
|
+
* Composite parts are joined into the internal `.key` using
|
|
191
|
+
* `keyPropertySeparator` (default `::`). Order is preserved literally.
|
|
192
|
+
*
|
|
193
|
+
* Each part is stringified via `String(value)`, so `null`, `undefined`,
|
|
194
|
+
* and `''` produce distinct keys (`'null'`, `'undefined'`, `''`).
|
|
195
|
+
*/
|
|
196
|
+
keyProperty?: KeyPropertySpec;
|
|
197
|
+
/**
|
|
198
|
+
* Separator joining composite `keyProperty` parts. Default `'::'`.
|
|
199
|
+
* Ignored when `keyProperty` is a string or a single-element array.
|
|
200
|
+
*/
|
|
201
|
+
keyPropertySeparator?: string;
|
|
185
202
|
autoGenerateKey?: boolean;
|
|
186
203
|
autoGenerateProperties?: AutoGeneratePropertiesOption;
|
|
187
204
|
csvParserOptions?: CsvParserOptions;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { AutoGeneratePropertiesOption } from './model.types.js';
|
|
2
|
+
import { KeyPropertySpec } from './key-property.types.js';
|
|
2
3
|
export type RawItem = any;
|
|
3
4
|
export type ListItem = {
|
|
4
5
|
key: string;
|
|
@@ -8,7 +9,8 @@ export type DataContainer<ListType extends RawItem | ListItem = ListItem, ModelN
|
|
|
8
9
|
model: ModelNames;
|
|
9
10
|
type?: DataContainerType;
|
|
10
11
|
data: ListType[];
|
|
11
|
-
keyProperty?:
|
|
12
|
+
keyProperty?: KeyPropertySpec;
|
|
13
|
+
keyPropertySeparator?: string;
|
|
12
14
|
autoGenerateKey?: boolean;
|
|
13
15
|
autoGenerateProperties?: AutoGeneratePropertiesOption;
|
|
14
16
|
placeholderUid?: string;
|
|
@@ -17,6 +19,7 @@ export type DataContainerType = 'upsert' | 'update' | 'set' | 'remove';
|
|
|
17
19
|
export type ReferenceDataTypes<ListType extends ListItem = ListItem> = string | string[] | ListType | ListType[];
|
|
18
20
|
export type DataOptions<ModelNames extends string = string> = {
|
|
19
21
|
model: ModelNames;
|
|
20
|
-
keyProperty?:
|
|
22
|
+
keyProperty?: KeyPropertySpec;
|
|
23
|
+
keyPropertySeparator?: string;
|
|
21
24
|
autoGenerateKey?: boolean;
|
|
22
25
|
};
|
|
@@ -98,6 +98,18 @@ export type DcuplPartialUpdateConfig = {
|
|
|
98
98
|
};
|
|
99
99
|
export type DcuplInitQualityConfig = {
|
|
100
100
|
enabled: boolean;
|
|
101
|
+
/**
|
|
102
|
+
* Maximum number of stored error objects per (model, property, errorType)
|
|
103
|
+
* group. Quality errors are still counted exactly beyond this limit and are
|
|
104
|
+
* reachable via `getErrorCounts()`; only the retained error objects (and the
|
|
105
|
+
* `$DcuplErrorTrackingErrors` model) are bounded. Default: 1000.
|
|
106
|
+
*
|
|
107
|
+
* Note: for error groups whose true count exceeds `maxErrorsPerGroup`,
|
|
108
|
+
* partial-update cleanup may cause `getErrorCounts()` to slightly
|
|
109
|
+
* over-report, since over-cap occurrences are counted but never stored as
|
|
110
|
+
* error objects and therefore cannot be decremented on removal.
|
|
111
|
+
*/
|
|
112
|
+
maxErrorsPerGroup?: number;
|
|
101
113
|
};
|
|
102
114
|
export type DcuplInitErrorTrackingConfig = {
|
|
103
115
|
enabled: boolean;
|
|
@@ -6,6 +6,11 @@ export type DcuplFacetOptions = {
|
|
|
6
6
|
excludeUndefineds?: boolean;
|
|
7
7
|
excludeUnresolved?: boolean;
|
|
8
8
|
calculateResults?: boolean;
|
|
9
|
+
/**
|
|
10
|
+
* Opt-in deterministic ordering. See `DcuplFilterOptions.sort` for full semantics.
|
|
11
|
+
* When omitted the fast (insertion-order) path is preserved.
|
|
12
|
+
*/
|
|
13
|
+
sort?: 'size-desc' | 'size-asc' | 'value-asc' | 'value-desc';
|
|
9
14
|
};
|
|
10
15
|
export type DcuplFacet = {
|
|
11
16
|
key: string;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Specifies the property (or properties) on a row that uniquely identifies it.
|
|
3
|
+
*
|
|
4
|
+
* - A single string names one property: `keyProperty: 'id'`.
|
|
5
|
+
* - A non-empty array of strings produces a composite key by joining the
|
|
6
|
+
* stringified values of each property with the configured separator
|
|
7
|
+
* (default `::`): `keyProperty: ['ID', 'Language']` → `.key === 'A1::en'`.
|
|
8
|
+
*
|
|
9
|
+
* The order of array entries is significant and preserved verbatim.
|
|
10
|
+
*/
|
|
11
|
+
export type KeyPropertySpec = string | readonly string[];
|
|
@@ -22,6 +22,22 @@ export type DcuplFilterOptions = CatalogApiOptions & {
|
|
|
22
22
|
excludeUndefineds?: boolean;
|
|
23
23
|
excludeUnresolved?: boolean;
|
|
24
24
|
count?: number;
|
|
25
|
+
/**
|
|
26
|
+
* Opt-in deterministic ordering for facet results.
|
|
27
|
+
*
|
|
28
|
+
* When omitted (default), results are returned in inverse-index iteration
|
|
29
|
+
* order and `count` truncation is applied mid-iteration. This is the
|
|
30
|
+
* fast path and matches all existing call sites.
|
|
31
|
+
*
|
|
32
|
+
* When set, `getFacets` walks all facet keys, computes real sizes
|
|
33
|
+
* (overriding `calculateFacets: false`), applies the chosen sort with
|
|
34
|
+
* deterministic tie-break, and truncates to `count` after sorting.
|
|
35
|
+
* This is the slow but correct path — opt in when ordering matters.
|
|
36
|
+
*
|
|
37
|
+
* Tie-break for size sorts is always `value` ascending with `undefined`
|
|
38
|
+
* last. `value-desc` keeps `undefined` last as well.
|
|
39
|
+
*/
|
|
40
|
+
sort?: 'size-desc' | 'size-asc' | 'value-asc' | 'value-desc';
|
|
25
41
|
};
|
|
26
42
|
export type DcuplFiltersOptions = DcuplFilterOptions & {
|
|
27
43
|
filterKeys?: string[];
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { AggregationOptions, DcuplGlobalQueryOptions, DcuplQuery, DcuplQueryGroup, RawItem } from './index.js';
|
|
2
|
+
import { KeyPropertySpec } from './key-property.types.js';
|
|
2
3
|
import { PivotOptions } from '../pivot.js';
|
|
3
4
|
type AggregationOptionsModel = Omit<AggregationOptions, 'attribute'>;
|
|
4
5
|
export type PropertyType = 'any' | 'Array<date>' | 'Array<float>' | 'Array<int>' | 'Array<string>' | 'boolean' | 'date' | 'float' | 'int' | 'json' | 'string';
|
|
@@ -372,7 +373,15 @@ export type ModelDefinition<ModelNames extends string = string> = {
|
|
|
372
373
|
properties?: Property[];
|
|
373
374
|
references?: Reference[];
|
|
374
375
|
data?: RawItem[];
|
|
375
|
-
|
|
376
|
+
/**
|
|
377
|
+
* Property name(s) on each row that uniquely identify it.
|
|
378
|
+
* See `KeyPropertySpec` for composite-key behavior.
|
|
379
|
+
*/
|
|
380
|
+
keyProperty?: KeyPropertySpec;
|
|
381
|
+
/**
|
|
382
|
+
* Separator joining composite `keyProperty` parts. Default `'::'`.
|
|
383
|
+
*/
|
|
384
|
+
keyPropertySeparator?: string;
|
|
376
385
|
autoGenerateKey?: boolean;
|
|
377
386
|
autoGenerateProperties?: AutoGeneratePropertiesOption;
|
|
378
387
|
supportsAutoCreation?: boolean;
|
|
@@ -1,6 +1,60 @@
|
|
|
1
1
|
export declare namespace QualityAnalyzer {
|
|
2
2
|
type ModelErrorGroup = 'ReferenceDataError' | 'PropertyDataError' | 'DataContainerError' | 'ModelDefinitionError';
|
|
3
|
-
|
|
3
|
+
/**
|
|
4
|
+
* Error types emitted by the quality controller during model registration
|
|
5
|
+
* and data ingest.
|
|
6
|
+
*
|
|
7
|
+
* - `UndefinedAttribute` — A declared attribute has no corresponding column /
|
|
8
|
+
* field in an ingested data container. Fires once per (model, attribute).
|
|
9
|
+
* - `InvalidValidator` — A validator on a property could not be parsed or
|
|
10
|
+
* evaluated against the data.
|
|
11
|
+
* - `UndefinedValue` — A required property has no value on a specific
|
|
12
|
+
* data entry (the cell is `undefined`). Fires per-row.
|
|
13
|
+
* - `NullValue` — A non-nullable property has an explicit `null` on
|
|
14
|
+
* a specific data entry. Fires per-row.
|
|
15
|
+
* - `WrongDataType` — A value present on a data entry could not be
|
|
16
|
+
* coerced to the declared property type. Fires per-row. Also covers *lossy*
|
|
17
|
+
* numeric coercions where coercion succeeds but silently drops information —
|
|
18
|
+
* trailing/embedded non-numeric content (e.g. `"1.2 lbs"` → `1.2`) or
|
|
19
|
+
* fractional truncation for `int` properties (e.g. `"1.2"` → `1`). Lossy
|
|
20
|
+
* records carry `meta.lossy: true` plus `meta.rawValue` and
|
|
21
|
+
* `meta.coercedValue`; the coerced value is still kept on the data entry.
|
|
22
|
+
* Representation-only differences that preserve the value (leading/trailing
|
|
23
|
+
* zeros, surrounding whitespace, `"4.0"` → `4`) are not flagged.
|
|
24
|
+
* Aggregation (#197): when one or more cells of a typed column fail to coerce,
|
|
25
|
+
* the per-row signals are consolidated into a single `WrongDataType` per
|
|
26
|
+
* `(model, attribute)` with `meta.rowCount` = the number of failing rows
|
|
27
|
+
* (exact and cap-independent for loader/CSV sources; bounded by
|
|
28
|
+
* `maxErrorsPerGroup` for inline data). `getErrorCounts()` reports the stored
|
|
29
|
+
* *record* count (1 for an aggregated column), which is intentionally distinct
|
|
30
|
+
* from `meta.rowCount`. A column entirely absent from the source still
|
|
31
|
+
* produces `UndefinedAttribute`, not `WrongDataType`.
|
|
32
|
+
* - `NonUniqueKey` — Two or more data entries share the same key value
|
|
33
|
+
* in the same model; later rows are dropped.
|
|
34
|
+
* - `MissingModel` — A reference points to a model key that has not
|
|
35
|
+
* been registered.
|
|
36
|
+
* - `MissingProperty` — Emitted only during model-definition validation
|
|
37
|
+
* when a *derived property* declares `derive.remoteProperty` pointing to a
|
|
38
|
+
* property that does not exist on the remote model. Not used in any
|
|
39
|
+
* CSV/JSON data-ingest path — those are covered by `UndefinedAttribute`,
|
|
40
|
+
* `UndefinedValue`, and `WrongDataType`. See model.helper.ts (derived-
|
|
41
|
+
* property validator) for the sole emit site.
|
|
42
|
+
* - `MissingReference` — A derived property's `derive.localReference` names
|
|
43
|
+
* a reference that does not exist on the local model.
|
|
44
|
+
* - `UnknownExpressionVariable` — An expression property references a
|
|
45
|
+
* variable that is neither a property nor a reference on the local model.
|
|
46
|
+
* - `RemoteReferenceKeyNotFound` — A foreign-key value does not match any
|
|
47
|
+
* key in the referenced remote model. Fires per-row.
|
|
48
|
+
* - `InvalidModelDefinition` — Catch-all for structural problems detected
|
|
49
|
+
* when registering a model.
|
|
50
|
+
* - `UnknownColumn` — A CSV (or otherwise source-tracked) data
|
|
51
|
+
* container contains a column / attribute that is not declared on the
|
|
52
|
+
* target model. Values for the column are silently dropped during ingest;
|
|
53
|
+
* this error surfaces that data loss without failing the load. Fires once
|
|
54
|
+
* per (model, attribute). Only emitted when the loader registers source
|
|
55
|
+
* metadata for the container (so inline `model.data` is unaffected).
|
|
56
|
+
*/
|
|
57
|
+
type ModelErrorType = 'UndefinedAttribute' | 'InvalidValidator' | 'UndefinedValue' | 'NullValue' | 'WrongDataType' | 'NonUniqueKey' | 'MissingModel' | 'MissingProperty' | 'MissingReference' | 'UnknownExpressionVariable' | 'RemoteReferenceKeyNotFound' | 'InvalidModelDefinition' | 'UnknownColumn';
|
|
4
58
|
type DcuplErrorType = 'model' | 'loader';
|
|
5
59
|
type DcuplErrorBase = {
|
|
6
60
|
key?: string;
|
|
@@ -13,7 +13,7 @@ export declare const DcuplQueryOperatorsAsArray: readonly ["eq", "find", "gt", "
|
|
|
13
13
|
*
|
|
14
14
|
* Available operators:
|
|
15
15
|
* - `eq`: Equality check - matches exact values
|
|
16
|
-
* - `find`:
|
|
16
|
+
* - `find`: Regex / exact / object match - bare string is exact-equality, `/regex/` for substring/pattern, object for property match
|
|
17
17
|
* - `gt`: Greater than - numeric/date comparison (exclusive)
|
|
18
18
|
* - `gte`: Greater than or equal - numeric/date comparison (inclusive)
|
|
19
19
|
* - `lt`: Less than - numeric/date comparison (exclusive)
|
|
@@ -30,8 +30,8 @@ export declare const DcuplQueryOperatorsAsArray: readonly ["eq", "find", "gt", "
|
|
|
30
30
|
* // Numeric comparison
|
|
31
31
|
* { operator: 'gte', attribute: 'price', value: 100 }
|
|
32
32
|
*
|
|
33
|
-
* //
|
|
34
|
-
* { operator: 'find', attribute: 'name', value: 'search term' }
|
|
33
|
+
* // Substring search (slash-delimited regex; bare string would be exact-match)
|
|
34
|
+
* { operator: 'find', attribute: 'name', value: '/search term/' }
|
|
35
35
|
* ```
|
|
36
36
|
*/
|
|
37
37
|
export type DcuplQueryOperator = (typeof DcuplQueryOperatorsAsArray)[number];
|
|
@@ -128,13 +128,22 @@ type DcuplQueryEq = DcuplQueryBase & {
|
|
|
128
128
|
value: any;
|
|
129
129
|
};
|
|
130
130
|
/**
|
|
131
|
-
* Find query -
|
|
132
|
-
*
|
|
131
|
+
* Find query - regex / exact / object match.
|
|
132
|
+
*
|
|
133
|
+
* Matching depends on the shape of `value`:
|
|
134
|
+
* - **Bare string** (e.g. `'search'`) — exact-equality against the *whole* field
|
|
135
|
+
* value, NOT a substring. `find` with `'Ball'` does not match `'Soccer Ball'`.
|
|
136
|
+
* - **Slash-delimited regex** (e.g. `'/search/'`, `'/^foo/i'`) — JS regex literal;
|
|
137
|
+
* use this for substring and pattern matching.
|
|
138
|
+
* - **Object** (e.g. `{ key: 'value' }`) — property matching against the field.
|
|
133
139
|
*
|
|
134
140
|
* @example
|
|
135
141
|
* ```typescript
|
|
136
|
-
* //
|
|
137
|
-
* { operator: 'find', attribute: 'description', value: 'search' }
|
|
142
|
+
* // Substring search — slash-delimited regex (bare string would be exact-match)
|
|
143
|
+
* { operator: 'find', attribute: 'description', value: '/search/' }
|
|
144
|
+
*
|
|
145
|
+
* // Exact-match the whole field value
|
|
146
|
+
* { operator: 'find', attribute: 'status', value: 'active' }
|
|
138
147
|
*
|
|
139
148
|
* // Find items with specific nested property
|
|
140
149
|
* { operator: 'find', attribute: 'metadata', value: { key: 'value' } }
|
|
@@ -143,7 +152,7 @@ type DcuplQueryEq = DcuplQueryBase & {
|
|
|
143
152
|
type DcuplQueryFind = DcuplQueryBase & {
|
|
144
153
|
operator: 'find';
|
|
145
154
|
/**
|
|
146
|
-
*
|
|
155
|
+
* Bare string (exact-match), `/regex/` (substring/pattern), or object (property match).
|
|
147
156
|
*/
|
|
148
157
|
value: Record<string, unknown> | string;
|
|
149
158
|
};
|
package/dist/node/index.cjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const p=require("lodash-es");function I(o){const e=S(o);return X(e)}function S(o){if(typeof o!="object"||o===null)return String(o);if(Array.isArray(o))return"["+o.map(S).join(",")+"]";const e=Object.keys(o).sort();let t="{";for(let r=0;r<e.length;r++){const s=e[r];t+=s+":"+S(o[s]),r<e.length-1&&(t+=",")}return t+="}",t}function X(o){let e=0;for(let t=0;t<o.length;t++){const r=o.charCodeAt(t);e=(e<<5)-e+r,e|=0}return e.toString(16)}const x={now:()=>typeof performance<"u"&&performance.now?performance.now():new Date().getTime(),mark:o=>{typeof performance<"u"&&performance.mark&&performance.mark(o)},measure:(o,e,t)=>{typeof performance<"u"&&performance.measure&&performance.measure(o,e,t)},getEntriesByName(o){if(typeof performance<"u"&&performance.getEntriesByName)return performance.getEntriesByName(o)},getEntriesByType(o){if(typeof performance<"u"&&performance.getEntriesByType)return performance.getEntriesByType(o)}};class ee{data;enabled=!1;constructor(){}init(e){this.data=new Map,this.enabled=e}set(e){if(!this.enabled)return e.value;const t=this.getKey(e.value.name,e.context);return this.data.set(t,e.value),this.data.get(t)}mark(e){if(!this.enabled)return;const t=this.getKey(e.name,e.context),r={name:e.name,type:"mark",value:x.now(),createdAt:Date.now()};return this.data.set(t,r),r}measure(e){if(!this.enabled)return;const t=this.getKey(e.name,e.context),r=this.data.get(this.getKey(e.start,e.context)),s=this.data.get(this.getKey(e.end,e.context));if(!r||!s)return;const i=s.value-r.value,n=Math.round(i*100)/100,a=this.data.get(t);if(a&&e.sum){const c=a.value+n,f={...a,value:c};return this.data.set(t,f),f}const u={name:e.name,type:"measure",value:n,createdAt:Date.now()};return e.detail&&(u.detail=e.detail),this.data.set(t,u),u}update(e){if(!this.enabled)return e.value;const t=this.getKey(e.value.name,e.context),r=this.data.get(t);if(r){const s={...r,...e.value};this.data.set(t,s)}else this.data.set(t,e.value);return this.data.get(t)}getResourceInfosFromPerformanceAPI(){return typeof performance>"u"?[]:x.getEntriesByType("resource")}get(e){const t=this.getKey(e.name,e.context);return this.data.get(t)}getByType(e){return Array.from(this.data.values()).filter(t=>t.type===e)}getByName(e){return Array.from(this.data.values()).filter(t=>t.name===e)}clear(){this.data.clear()}getKey(e,t){if(!t)return e;const r=I(t);return e+"_"+r}}let T=class G{nodes;edges;nodeKinds=new Map;nodeMeta=new Map;edgePolicy;constructor(){this.nodes=new Set,this.edges=new Map}addNode(e,t){this.nodes.has(e)||(this.nodes.add(e),this.edges.set(e,new Set)),t?.kind!==void 0&&this.nodeKinds.set(e,t.kind),t?.meta!==void 0&&this.nodeMeta.set(e,t.meta)}addDependency(e,t){if(!this.nodes.has(e)||!this.nodes.has(t))throw new Error("Both nodes must exist before adding a dependency.");if(this.edgePolicy&&!this.edgePolicy({name:e,kind:this.nodeKinds.get(e)},{name:t,kind:this.nodeKinds.get(t)}))throw new Error(`Edge policy rejected dependency from "${e}" to "${t}".`);this.edges.get(e).add(t)}setEdgePolicy(e){this.edgePolicy=e}setNodeKind(e,t){if(!this.nodes.has(e))throw new Error("Node does not exist.");t===void 0?this.nodeKinds.delete(e):this.nodeKinds.set(e,t)}getNodeKind(e){return this.nodeKinds.get(e)}setNodeMeta(e,t){if(!this.nodes.has(e))throw new Error("Node does not exist.");this.nodeMeta.set(e,t)}getNodeMeta(e){return this.nodeMeta.get(e)}removeNode(e){if(!this.nodes.has(e))throw new Error("Node does not exist.");this.nodes.delete(e),this.edges.delete(e);for(let t of this.edges.values())t.delete(e)}removeDependency(e,t){if(!this.edges.has(e))throw new Error("From node does not exist.");this.edges.get(e).delete(t)}hasNode(e){return this.nodes.has(e)}hasDependency(e,t){return this.edges.has(e)?this.edges.get(e).has(t):!1}getDependencies(e){if(!this.edges.has(e))throw new Error("Node does not exist.");return Array.from(this.edges.get(e))}getDependents(e){const t=[];for(let[r,s]of this.edges)s.has(e)&&t.push(r);return t}isCyclic(){const e=new Set,t=new Set,r=s=>{if(e.has(s))return!1;if(t.has(s))return!0;t.add(s);const i=this.edges.get(s);if(i){for(let n of i)if(r(n))return!0}return t.delete(s),e.add(s),!1};for(let s of this.nodes)if(r(s))return!0;return!1}validateNoCycles(){const e=new Set,t=new Set,r=[],s=i=>{if(e.has(i))return null;if(t.has(i)){const a=r.indexOf(i);return r.slice(a).concat([i])}t.add(i),r.push(i);const n=this.edges.get(i);if(n)for(let a of n){const u=s(a);if(u)return u}return r.pop(),t.delete(i),e.add(i),null};for(let i of this.nodes){const n=s(i);if(n)return{hasCycle:!0,path:n}}return{hasCycle:!1}}order(e){const t=new Set,r=new Set,s=[],i=e?.allowCycles??!1,n=a=>{if(t.has(a))return;if(r.has(a)){if(i)return;throw new Error("Graph has a cycle.")}r.add(a);const u=this.edges.get(a);if(u)for(let c of u)n(c);r.delete(a),t.add(a),s.push(a)};for(let a of this.nodes)t.has(a)||n(a);return s}clear(){this.nodes.clear(),this.edges.clear()}getNodes(){return Array.from(this.nodes)}getAllEdges(){const e=[];for(let[t,r]of this.edges)for(let s of r)e.push([t,s]);return e}getNodesWithNoDependants(){if(this.nodes.size===0)return[];const e=new Set;for(const r of this.edges.values())for(const s of r)e.add(s);const t=[];for(const r of this.nodes)e.has(r)||t.push(r);return t}getNodesByKind(e){const t=[];for(const r of this.nodes)this.nodeKinds.get(r)===e&&t.push(r);return t}getRootsByKind(e){const t=new Set(this.getNodesWithNoDependants()),r=Array.from(t);return e?r.filter(s=>this.nodeKinds.get(s)===e):r}getLeavesByKind(e){const t=[];for(const r of this.nodes){const s=this.edges.get(r);(!s||s.size===0)&&(!e||this.nodeKinds.get(r)===e)&&t.push(r)}return t}getDependenciesOfKind(e,t){return this.getDependencies(e).filter(s=>this.nodeKinds.get(s)===t)}getDependentsOfKind(e,t){return this.getDependents(e).filter(s=>this.nodeKinds.get(s)===t)}plan(e){const t=new Map;for(const n of this.nodes)t.set(n,0);for(const n of this.edges.values())for(const a of n)t.set(a,(t.get(a)||0)+1);const r=[];let s=Array.from(this.nodes).filter(n=>(t.get(n)||0)===0);const i=new Set;for(;s.length>0;){const n=s.slice();r.push(n),s=[];for(const a of n){if(i.has(a))continue;i.add(a);const u=this.edges.get(a);if(u)for(const c of u)t.set(c,(t.get(c)||0)-1),(t.get(c)||0)===0&&s.push(c)}}if(i.size!==this.nodes.size)throw new Error("Graph has a cycle.");if(e?.filterKinds&&e.filterKinds.length>0){const n=new Set(e.filterKinds);return{batches:r.map(a=>a.filter(u=>n.has(this.nodeKinds.get(u))))}}return{batches:r}}getImpactedNodes(e,t="downstream",r){const s=new Set(e),i=c=>!r||r.length===0||r.includes(this.nodeKinds.get(c)??void 0),n=()=>{const c=new Set,f=Array.from(s);for(;f.length;){const l=f.shift();for(const[d,h]of this.edges)h.has(l)&&!c.has(d)&&(c.add(d),f.push(d))}return c},a=()=>{const c=new Set,f=Array.from(s);for(;f.length;){const l=f.shift(),d=this.edges.get(l);if(d)for(const h of d)c.has(h)||(c.add(h),f.push(h))}return c};let u;return t==="both"?u=new Set([...n(),...a()]):t==="upstream"?u=a():u=n(),Array.from(u).filter(i)}toJSON(){const e=Array.from(this.nodes).map(r=>({name:r,kind:this.nodeKinds.get(r),meta:this.nodeMeta.get(r)})),t=this.getAllEdges().map(([r,s])=>({from:r,to:s}));return{nodes:e,edges:t}}static fromJSON(e){const t=new G;for(const r of e.nodes)t.addNode(r.name,{kind:r.kind,meta:r.meta});for(const r of e.edges)t.addDependency(r.from,r.to);return t}diff(e){const t=new Set(this.getNodes()),r=new Set(e.getNodes()),s=Array.from(r).filter(l=>!t.has(l)),i=Array.from(t).filter(l=>!r.has(l)),n=new Set(this.getAllEdges().map(l=>l.join("→"))),a=new Set(e.getAllEdges().map(l=>l.join("→"))),u=Array.from(a).filter(l=>!n.has(l)).map(l=>l.split("→")),c=Array.from(n).filter(l=>!a.has(l)).map(l=>l.split("→")),f=[];for(const l of new Set([...t,...r])){const d=this.nodeKinds.get(l),h=e.nodeKinds.get(l);d!==h&&f.push({name:l,from:d,to:h})}return{addedNodes:s,removedNodes:i,addedEdges:u,removedEdges:c,kindChanges:f}}};class te{graph;nodeIndex;constructor(){this.graph=new T,this.nodeIndex=new Map}getNodeId(e,t){return`${e}.${t}`}parseNodeId(e){const t=e.split(".");return{modelKey:t[0],attributeKey:t.slice(1).join(".")}}addAttribute(e){const t=this.getNodeId(e.modelKey,e.attributeKey);this.nodeIndex.has(t)||(this.graph.addNode(t,{meta:e}),this.nodeIndex.set(t,e))}addAttributeDependency(e,t){this.addAttribute(e),this.addAttribute(t);const r=this.getNodeId(e.modelKey,e.attributeKey),s=this.getNodeId(t.modelKey,t.attributeKey);this.graph.hasDependency(r,s)||this.graph.addDependency(r,s)}getImpactedAttributes(e){const t=e.map(a=>this.getNodeId(a.modelKey,a.attributeKey)),s=this.graph.getImpactedNodes(t,"downstream").map(a=>this.nodeIndex.get(a)).filter(a=>a!==void 0),i=[...e,...s],n=new Set;return i.filter(a=>{const u=this.getNodeId(a.modelKey,a.attributeKey);return n.has(u)?!1:(n.add(u),!0)})}getProcessingOrder(e){const t=new Map,r=[...e].sort((s,i)=>s.processingStep-i.processingStep);for(const s of r){const{modelKey:i,attributeKey:n,processingStep:a}=s;t.has(i)||t.set(i,new Map);const u=t.get(i);u.has(a)||u.set(a,new Set),u.get(a).add(n)}return t}getAttributesForModel(e){const t=[];for(const r of this.nodeIndex.values())r.modelKey===e&&t.push(r);return t}getDependencies(e){const t=this.getNodeId(e.modelKey,e.attributeKey);return this.graph.hasNode(t)?this.graph.getDependencies(t).map(s=>this.nodeIndex.get(s)).filter(s=>s!==void 0):[]}getDependents(e){const t=this.getNodeId(e.modelKey,e.attributeKey);return this.graph.hasNode(t)?this.graph.getDependents(t).map(s=>this.nodeIndex.get(s)).filter(s=>s!==void 0):[]}hasDependencies(e){const t=this.getNodeId(e.modelKey,e.attributeKey);return this.graph.hasNode(t)?this.graph.getDependencies(t).length>0:!1}hasNode(e){return this.nodeIndex.has(e)}getAllAttributes(){return Array.from(this.nodeIndex.values())}getMaxDepth(){let e=0;const t=(r,s=new Set)=>{if(s.has(r))return 0;s.add(r);const i=this.graph.getDependencies(r);if(i.length===0)return 1;let n=0;for(const a of i){const u=t(a,new Set(s));n=Math.max(n,u)}return n+1};for(const r of this.graph.getNodes()){const s=t(r);e=Math.max(e,s)}return e}validateCompleteness(e){const t=[];for(const[r,s]of e)for(const i of s){const n=this.getNodeId(r,i);this.hasNode(n)||t.push({modelKey:r,attributeKey:i})}return{isComplete:t.length===0,missing:t}}clear(){this.graph.clear(),this.nodeIndex.clear()}getStats(){const e=new Map,t=new Map;for(const r of this.nodeIndex.values())e.set(r.modelKey,(e.get(r.modelKey)||0)+1),t.set(r.processingStep,(t.get(r.processingStep)||0)+1);return{totalAttributes:this.nodeIndex.size,totalDependencies:this.graph.getAllEdges().length,maxDepth:this.getMaxDepth(),attributesByModel:e,attributesByStep:t}}toJSON(){return{nodes:Array.from(this.nodeIndex.values()),edges:this.graph.getAllEdges().map(([e,t])=>{const r=this.parseNodeId(e),s=this.parseNodeId(t);return{from:r,to:s}})}}}const O={silent:0,error:1,warn:2,info:3,debug:4};class g{config;static globalConfig={};constructor(e={}){this.config={level:e.level??g.globalConfig.level??this.getDefaultLevel(),format:e.format??g.globalConfig.format??this.getDefaultFormat(),prefix:e.prefix,onLog:e.onLog??g.globalConfig.onLog,onTrackError:e.onTrackError??g.globalConfig.onTrackError}}static setGlobalConfig(e){g.globalConfig={...g.globalConfig,...e}}static getGlobalConfig(){return{...g.globalConfig}}static setModuleLevel(e,t){g.globalConfig.onLog||(g.globalConfig.onLog=void 0),g._moduleOverrides||(g._moduleOverrides=new Map),g._moduleOverrides.set(e,t)}static getModuleLevel(e){if(!(!e||!g._moduleOverrides))return g._moduleOverrides.get(e)}getDefaultLevel(){return"info"}getDefaultFormat(){return"pretty"}getEffectiveLevel(){if(this.config.prefix){const e=g.getModuleLevel(this.config.prefix);if(e)return e}return this.config.level}shouldLog(e){const t=this.getEffectiveLevel();return O[e]<=O[t]}formatMessage(e){if(this.config.format==="json"){const n={timestamp:new Date(e.timestamp).toISOString(),level:e.level,message:e.message};return e.prefix&&(n.module=e.prefix),e.context&&(n.context=e.context),e.error&&(n.error={name:e.error.name,message:e.error.message,stack:e.error.stack}),JSON.stringify(n)}const t=new Date(e.timestamp).toISOString().substring(11,23),r=e.prefix?`[${e.prefix}]`:"",s=this.getLevelIcon(e.level),i=e.context?` ${JSON.stringify(e.context)}`:"";return`${t} ${s} ${r} ${e.message}${i}`.trim()}getLevelIcon(e){switch(e){case"error":return"✖";case"warn":return"⚠";case"info":return"ℹ";case"debug":return"⚙";default:return" "}}log(e,t,r,s){if(!this.shouldLog(e))return;const i={level:e,message:t,timestamp:Date.now(),prefix:this.config.prefix,context:r,error:s};if(this.config.onLog){this.config.onLog(i);return}const n=this.formatMessage(i);if(typeof console<"u")switch(e){case"error":s?console.error(n,s):console.error(n);break;case"warn":console.warn(n);break;case"debug":console.debug?console.debug(n):console.log(n);break;default:console.log(n)}}error(e,t,r){const s=t instanceof Error?t:void 0,i=t instanceof Error?r:t;this.log("error",e,i,s)}trackError(e,t,r){if(this.error(e,t,r?.context),this.config.onTrackError){const s={level:"error",message:e,timestamp:Date.now(),prefix:this.config.prefix,context:r?.context,error:t,errorType:r?.errorType,errorGroup:r?.errorGroup};this.config.onTrackError(s)}}warn(e,t){this.log("warn",e,t)}info(e,t){this.log("info",e,t)}debug(e,t){this.log("debug",e,t)}child(e){const t={...this.config,...e,prefix:e.prefix?this.config.prefix?`${this.config.prefix}:${e.prefix}`:e.prefix:this.config.prefix};return new g(t)}configure(e){Object.assign(this.config,e)}}const B=new g;class re{constructor(e){this.enabled=e,this.cache=new Map,this.cacheDependencies=new Map}cache;cacheDependencies;hitCount=0;missCount=0;log=B.child({prefix:"CacheController"});get(e,t){if(!this.enabled)return;const r=this.getCacheName(e,t);return this.cache.has(r)?this.hitCount++:this.missCount++,this.cache.get(r)}set(e,t,r,s){if(!this.enabled)return;const i=this.getCacheName(e,t);this.cache.set(i,r),s?this.cacheDependencies.set(i,s):this.log.debug(`Cache entry '${e}' stored without dependencies. This prevents granular invalidation and may cause stale data.`)}has(e,t){return this.cache.has(this.getCacheName(e,t))}clear(){this.cache.clear(),this.cacheDependencies.clear(),this.hitCount=0,this.missCount=0}invalidateByDependencies(e){if(!this.enabled)return;const t=[];for(const[r,s]of this.cacheDependencies){let i=!1;for(const[n,a]of e){if(s.models.has(n))if(s.modelAttributes.has(n)){const u=s.modelAttributes.get(n);for(const c of a)if(u.has(c)){i=!0;break}}else i=!0;if(i)break}i&&t.push(r)}for(const r of t)this.cache.delete(r),this.cacheDependencies.delete(r)}invalidateByModels(e){if(!this.enabled)return;const t=new Set(e),r=[];for(const[s,i]of this.cacheDependencies)for(const n of t)if(i.models.has(n)){r.push(s);break}for(const s of r)this.cache.delete(s),this.cacheDependencies.delete(s)}invalidateByKeyPrefix(e){if(!this.enabled)return;const t=[];for(const r of this.cache.keys())r.startsWith(e+"_")&&t.push(r);for(const r of t)this.cache.delete(r),this.cacheDependencies.delete(r)}invalidateForModel(e){this.invalidateByModels([e])}invalidateForAttribute(e,t){if(!this.enabled)return;const r=new Map;r.set(e,new Set([t])),this.invalidateByDependencies(r)}invalidateMatching(e){if(!this.enabled)return;const t=[];for(const r of this.cache.keys())e(r)&&t.push(r);for(const r of t)this.cache.delete(r),this.cacheDependencies.delete(r)}generateContext(e){try{return p.cloneDeep(e)}catch(t){return this.log.error("Error in cache generateContext",t),e}}getCacheName(e,t){const r=I(t);return e+"_"+r}getStats(){const e=this.hitCount+this.missCount,t=e>0?this.hitCount/e:0;return{size:this.cache.size,hitRate:t,totalEntries:this.cache.size,entriesWithDependencies:this.cacheDependencies.size,hits:this.hitCount,misses:this.missCount}}}const se=(o,e="")=>`${o}#${e}`,ne=o=>`${o.gt}_${o.gte}_${o.lt}_${o.lte}_${o.eq}_${o.ne}`,ie=o=>`${o.gt}_${o.gte}_${o.lt}_${o.lte}_${o.eq}_${o.ne}`,oe=(o,e)=>{const t=typeof e=="function"?e:r=>r[e];return[...o.reduce((r,s)=>{const i=s==null?s:t(s);return r.has(i)||r.set(i,s),r},new Map).values()]},ae=(o,e)=>o.reduce(function(t,r){const s=typeof e=="function"?e(r):r[e];return Object.prototype.hasOwnProperty.call(t,s)||(t[s]=[]),t[s].push(r),t},{});function P(o=10){let e="";const t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";for(let r=0;r<o;r++)e+=t.charAt(Math.floor(Math.random()*t.length));return e}const ue=o=>o.replace(/\/+$/,""),j=o=>typeof o!="string"?"":o.replace(/[[\]{}()*+?.,\\^$|#]/g,"\\$&"),ce=o=>typeof o!="string"?"":o.replace(/\\([[\]{}()*+?.,\\^$|#])/g,"$1"),fe=(o,e)=>{try{return R(o,e)>=0}catch{return!1}},R=(o,e)=>{if(!K(o)||!K(e))throw new Error(`Invalid version format: v1="${o}", v2="${e}". Expected format: "x.y.z"`);const t=o.split(".").map(Number),r=e.split(".").map(Number);for(let s=0;s<3;s++){const i=t[s]||0,n=r[s]||0;if(i>n)return 1;if(i<n)return-1}return 0},K=o=>/^\d+(\.\d+){0,2}$/.test(o);class le{key;parentCd;dcuplInitOptions;analyticsController;off;updateListener=new Set;counter=0;constructor(){}_init(e){this.key=e.cdRefKey,this.analyticsController=e.analyticsController,this.parentCd=e.parentCd,this.dcuplInitOptions=e.dcuplInitOptions,this.parentCd&&(this.off=this.parentCd.on(t=>{t.action==="update"&&t.originCdRefKey===this.parentCd?.key&&(t.connectMessage=!1,this.trigger(t))}))}getCounter(){return this.parentCd?this.parentCd.getCounter():this.counter}increaseCounter(){this.parentCd?this.parentCd.increaseCounter():this.counter++}destroy(){this.off&&this.off()}trigger(e){e.originCdRefKey||(e.originCdRefKey=this.key),e.key||(this.increaseCounter(),e.key=this.getCounter()),e.end||(e.end=x.now(),e.duration=e.start-e.end),this.updateListener.forEach(t=>{t(e)})}on(e){return this.updateListener.add(e),()=>{this.updateListener.delete(e)}}}const M=(o,e)=>e?typeof structuredClone<"u"?structuredClone(o):p.cloneDeep(o):o,$=(o,e,t,r,s,i)=>{try{const n=!!e.dcuplInitOptions.performance?.clone?.enabled&&!!t.cloneResult,a=M(i,n);if(t.scope==="list"&&(t.listKey=o.cdRef?.key||o.key,t.modelKey=o.model?.key||o.modelKey),t.type==="list_created"&&t.args[0].listKey.startsWith("__global_list__")||t.listKey?.startsWith("__global_list__"))return a;const u=x.now(),c=u-r,f=Math.round(c*1e3)/1e3;t.duration=f,t.start=r,t.end=u;const l={duration:t.duration};return t.modelKey&&(l.model=t.modelKey),t.connectMessageResult&&(t.result=a),t.args&&(l.args=t.args),e?.trigger(t),e.analyticsController.mark({name:`${t.type}:end`,context:s}),e.analyticsController.measure({name:t.type,start:`${t.type}:start`,end:`${t.type}:end`,context:s,detail:l}),a}catch{return i}},de=o=>(t,r,s)=>{const i=s.value;return s.value=function(...n){const a=x.now(),u=this.cdRef,c=M(o,!0);c.key||(u.increaseCounter(),c.key=u.getCounter());const f=P();u.analyticsController.mark({name:`${c.type}:start`,context:f});const l=this.model?.key;!c.originCdRefKey&&u.key&&(c.originCdRefKey=u.key),l&&(c.modelKey=l);const d=i.apply(this,n);return c.method=r,c.args=n,d&&typeof d=="object"&&"then"in d?d.then(h=>$(this,u,c,a,f,h)):$(this,u,c,a,f,d)},s};function he(o,e,t,r){t.max||(t.max=20);const s=[],i=t.transform?r.transformValue(t.value,t.transform):t.value;for(const[n,a]of e.entries()){const u=Array.from(a).some(f=>o.has(f)),c=t.transform?r.transformValue(n,t.transform):n;if(!(t.excludeUndefineds&&typeof n>"u")&&!(t.excludeNulls&&n===null)){if(u&&(i===""||i==="//")){const f={value:n,keys:t.calculateResultKeys?Array.from(a):[]};s.push(f)}else if(u&&typeof i=="string"&&i.startsWith("/")&&i.endsWith("/")){if(r.queryFind(c,i,"some")){const f={value:n,keys:t.calculateResultKeys?Array.from(a):[]};s.push(f)}}else if(u&&typeof i=="string"){const f=String(c??""),l=i;if(f.toLowerCase().startsWith(l.toLowerCase())){const d={value:n,keys:t.calculateResultKeys?Array.from(a):[]};s.push(d)}}else if(u&&r.queryFind(c,i,"some")){const f={value:n,keys:t.calculateResultKeys?Array.from(a):[]};s.push(f)}if(s.length===t.max)break}}return s}function z(o){return o instanceof Date}function _(o){return o instanceof Date&&!isNaN(o.getTime())}const pe={yyyy:{type:"year",pattern:"yyyy",regex:"(\\d{4})"},yy:{type:"year",pattern:"yy",regex:"(\\d{2})"},MM:{type:"month",pattern:"MM",regex:"(\\d{2})"},M:{type:"month",pattern:"M",regex:"(\\d{1,2})"},dd:{type:"day",pattern:"dd",regex:"(\\d{2})"},d:{type:"day",pattern:"d",regex:"(\\d{1,2})"},HH:{type:"hour",pattern:"HH",regex:"(\\d{2})"},H:{type:"hour",pattern:"H",regex:"(\\d{1,2})"},mm:{type:"minute",pattern:"mm",regex:"(\\d{2})"},m:{type:"minute",pattern:"m",regex:"(\\d{1,2})"},ss:{type:"second",pattern:"ss",regex:"(\\d{2})"},s:{type:"second",pattern:"s",regex:"(\\d{1,2})"},SSS:{type:"millisecond",pattern:"SSS",regex:"(\\d{3})"}};function ge(o){let e="^";const t=[];let r=o;const s=Object.entries(pe).sort((i,n)=>n[0].length-i[0].length);for(;r.length>0;){let i=!1;for(const[n,a]of s)if(r.startsWith(n)){e+=a.regex,t.push({type:a.type,pattern:n}),r=r.slice(n.length),i=!0;break}if(!i){const n=r[0];if(!n)break;e+=n.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),r=r.slice(1)}}return e+="$",{regex:new RegExp(e),tokenOrder:t}}function ye(o,e){const t={year:1970,month:1,day:1,hour:0,minute:0,second:0,millisecond:0};for(let r=0;r<e.length;r++){const s=o[r+1];if(!s)continue;const i=parseInt(s,10),n=e[r];n&&(n.type==="year"&&n.pattern==="yy"?t.year=2e3+i:t[n.type]=i)}return t}function me(o){if(o.month<1||o.month>12)return new Date(NaN);if(o.day<1||o.day>31)return new Date(NaN);if(o.hour<0||o.hour>23)return new Date(NaN);if(o.minute<0||o.minute>59)return new Date(NaN);if(o.second<0||o.second>59)return new Date(NaN);if(o.millisecond<0||o.millisecond>999)return new Date(NaN);const e=new Date(o.year,o.month-1,o.day,o.hour,o.minute,o.second,o.millisecond);return _(e)?e.getFullYear()!==o.year||e.getMonth()!==o.month-1||e.getDate()!==o.day?new Date(NaN):e:new Date(NaN)}function ve(o,e,t){if(o=o.trim(),e==="t"){const a=Number(o);return isNaN(a)?new Date(NaN):new Date(a*1e3)}if(e==="T"){const a=Number(o);return isNaN(a)?new Date(NaN):new Date(a)}const{regex:r,tokenOrder:s}=ge(e),i=o.match(r);if(!i)return new Date(NaN);const n=ye(i,s);return me(n)}class we{cache;maxSize;accessOrder;constructor(e){this.cache=new Map,this.maxSize=e,this.accessOrder=[]}get(e){const t=this.cache.get(e);return t!==void 0&&this.updateAccessOrder(e),t}set(e,t){if(this.cache.has(e))this.cache.set(e,t),this.updateAccessOrder(e);else{if(this.cache.size>=this.maxSize){const r=this.accessOrder.shift();r!==void 0&&this.cache.delete(r)}this.cache.set(e,t),this.accessOrder.push(e)}}has(e){return this.cache.has(e)}clear(){this.cache.clear(),this.accessOrder=[]}get size(){return this.cache.size}updateAccessOrder(e){const t=this.accessOrder.indexOf(e);t>-1&&this.accessOrder.splice(t,1),this.accessOrder.push(e)}getStats(){return{size:this.cache.size,maxSize:this.maxSize}}}class xe{graph;constructor(){this.graph=new Map}addDependency(e,t){this.graph.has(e)||this.graph.set(e,new Set),this.graph.get(e).add(t)}hasCycle(e){if(e.length===0)return!1;const t=new Set,r=new Set,s=i=>{t.add(i),r.add(i);const n=this.graph.get(i);if(n){for(const a of n)if(t.has(a)){if(r.has(a))return!0}else if(s(a))return!0}return r.delete(i),!1};for(let i=0;i<e.length-1;i++){const n=e[i],a=e[i+1];n&&a&&this.addDependency(n,a)}for(const i of e)if(!t.has(i)&&s(i))return!0;return!1}clear(){this.graph.clear()}}class W{parseCache;circularRefDetector;cacheHits=0;cacheMisses=0;constructor(e=1e3){this.parseCache=new we(e),this.circularRefDetector=new xe}parse(e){if(this.parseCache.has(e))return this.cacheHits++,this.parseCache.get(e);this.cacheMisses++;let t,r;const s=e.includes("."),i=e.includes("["),n=s||i;if(n)if(r=e.split(/[.[]/)[0],i){const u=e.indexOf("]");if(u>-1){const c=e.indexOf(".",u+1);c>-1?t=e.substring(c+1):t=void 0}else s&&(t=e.substring(e.indexOf(".")+1))}else s&&(t=e.substring(e.indexOf(".")+1));const a={attribute:e,isDeepQuery:n};return r&&(a.reference=r),typeof t<"u"&&t!==""&&(a.referenceAttribute=t),this.parseCache.set(e,a),a}detectCircular(e){return e.length===0?!1:new Set(e).size!==e.length?!0:this.circularRefDetector.hasCycle(e)}validatePath(e,t=10){const r=[];if(!e||e.trim().length===0)return r.push("Attribute path cannot be empty"),{valid:!1,errors:r};(e.startsWith(".")||e.endsWith("."))&&r.push(`Invalid path: Leading or trailing dots are not allowed: ${e}`),e.includes("..")&&r.push(`Invalid path: Consecutive dots are not allowed: ${e}`);const s=(e.match(/\[/g)||[]).length,i=(e.match(/]/g)||[]).length;s!==i&&r.push(`Invalid bracket notation: Mismatched brackets in ${e}`),e.includes("[]")&&r.push(`Invalid bracket notation: Empty brackets not allowed: ${e}`);const n=/\[([^\]]+)\]/g;let a;for(;(a=n.exec(e))!==null;){const f=a[1];f&&f!=="*"&&!/^\d+$/.test(f)&&r.push(`Invalid bracket content: Must be a number or '*', got '${f}' in ${e}`)}const u=(e.match(/\./g)||[]).length+1;u>t&&r.push(`Path too deep: Maximum depth is ${t}, got ${u} in ${e}`);const c=e.match(/[^a-zA-Z0-9._[\]*-]/g);return c&&r.push(`Invalid characters in path: ${c.join(", ")} in ${e}`),{valid:r.length===0,errors:r.length>0?r:void 0}}clearCache(){this.parseCache.clear(),this.cacheHits=0,this.cacheMisses=0}clearCircularDetector(){this.circularRefDetector.clear()}getCacheStats(){const e=this.parseCache.getStats(),t=this.cacheHits+this.cacheMisses,r=t>0?this.cacheHits/t:0;return{...e,hits:this.cacheHits,misses:this.cacheMisses,hitRate:r}}getPathSegments(e){return e.replace(/\[[^\]]+\]/g,"").split(".").filter(r=>r.length>0)}getPathDepth(e){return this.getPathSegments(e).length}}const y=new W;function v(o,e){if(e.includes("[*]")){const i=e.indexOf("[*]"),n=e.substring(0,i),a=e.substring(i+3),u=n?p.get(o,n):o;if(!Array.isArray(u))return[];const c=[];for(const f of u)!a||a===""?f!==void 0&&c.push(f):a.startsWith(".")&&c.push(...v(f,a.slice(1)));return c}const t=e.split(".");let r=[o];for(const i of t){const n=[];for(const a of r)if(a!=null)if(Array.isArray(a))for(const u of a){if(u==null)continue;const c=u[i];c!==void 0&&n.push(c)}else{const u=a[i];u!==void 0&&n.push(u)}if(r=n,r.length===0)return[]}const s=[];for(const i of r)if(Array.isArray(i))for(const n of i)n!==void 0&&s.push(n);else i!==void 0&&s.push(i);return s}function D(o){let e=0;for(let t of o){const r=t.toString().split(".")[1];r&&(e=Math.max(e,r.length))}return Math.pow(10,e)}function F(o,e,t){return(o*t+e*t)/t}function Ae(o,e,t){return o*t/(e*t)}const b=(o,e,t,r)=>{if(!r)throw new Error("Attribute not found");const s={attribute:r,types:o.types};let i;(s.types.includes("sum")||s.types.includes("avg"))&&(i=Ke(r,e));let n;return(s.types.includes("min")||s.types.includes("max"))&&(n=De(r,e)),o.types.forEach(a=>{a==="sum"?s.sum=i?.sum:a==="avg"?s.avg=i?.average:a==="count"?s.count=be(r,e):a==="min"?s.min=n&&n[0]:a==="max"?s.max=n&&n[1]:a==="distinct"?s.distinct=L(o,e,t):a==="group"&&(s.group=Se(o,e))}),s},be=(o,e)=>{const r=y.parse(o).isDeepQuery;let s=0;for(const i of e.values())if(i)if(r)s+=v(i,o).filter(n=>n!=null).length;else{const n=i[o];if(n==null)continue;Array.isArray(n)?s+=n.filter(a=>a!=null).length:s++}return s},De=(o,e)=>{let t,r;const i=y.parse(o).isDeepQuery;for(const n of e.values()){if(!n)continue;let a;if(i)a=v(n,o);else{const u=n[o];u===void 0?a=[]:Array.isArray(u)?a=u.filter(c=>c!==void 0):a=[u]}for(const u of a)u==null||typeof u=="object"||((t===void 0||u<t)&&(t=u),(r===void 0||u>r)&&(r=u))}if(!(t===void 0||r===void 0))return[t,r]},Se=(o,e)=>{const t=[];o.groupOptions?.groups?.forEach(n=>{t.push({option:n,count:0,keys:[]})});const r={option:{value:["$dcupl_not_found"]},count:0,keys:[]},i=y.parse(o.attribute).isDeepQuery;for(const n of e.values()){let a;i?a=v(n,o.attribute):a=[n[o.attribute]];let u=!1;for(const c of a)for(const f of t)(typeof f.option.value<"u"&&f.option.value.includes(c)||typeof f.option.from<"u"&&f.option.from<c&&typeof f.option.to<"u"&&f.option.to>c)&&(f.keys.includes(n.key)||(f.count++,f.keys.push(n.key)),u=!0);!u&&o?.groupOptions?.calculateNotFound&&(r.count++,r.keys.push(n.key))}return o?.groupOptions?.calculateNotFound&&t.push(r),t},Ke=(o,e)=>{let t=0,r=0;const i=y.parse(o).isDeepQuery;for(const a of e.values()){if(!a)continue;let u;if(i)u=v(a,o);else{const c=a[o];c===void 0?u=[]:Array.isArray(c)?u=c:u=[c]}for(const c of u)if(Array.isArray(c))for(const f of c)typeof f=="number"&&(t=F(t,f,D([t,f])),r++);else typeof c=="number"&&(t=F(t,c,D([t,c])),r++)}return r===0?void 0:{average:Ae(t,r,D([t,r])),count:r,sum:t}},L=(o,e,t)=>{const r=[];for(const[s,i]of t)if(!(o.excludeUndefineds&&typeof s>"u")&&Array.from(i).find(n=>e.has(n))){const n={value:s,count:i.size};if(o.distinctOptions?.skipKeys||(n.keys=Array.from(i)),r.push(n),o.distinctOptions?.limit&&r.length>=o.distinctOptions.limit)break}return r};class A extends Error{query;constructor(e,t){const r=`Query Error: ${e} in ${JSON.stringify(t,null,2)}`;super(r),this.query=t,this.name="DcuplQueryError"}}class N{_defaultQueryOptions={modelKey:"",groupKey:"root",groupType:"and",queries:[]};_initOptions;currentQuery=p.cloneDeep(this._defaultQueryOptions);deepQueryService;constructor(e){this.deepQueryService=e||y}init(e){this._initOptions=p.cloneDeep(e),this.currentQuery=p.cloneDeep(this._defaultQueryOptions),this.currentQuery.modelKey=e.modelKey,"queries"in e&&Array.isArray(e.queries)&&(e.groupType&&(this.currentQuery.groupType=e.groupType),e.queries&&(this.currentQuery.queries=p.cloneDeep(e.queries)),e.count!==void 0&&(this.currentQuery.count=e.count),e.start!==void 0&&(this.currentQuery.start=e.start),e.sort&&(this.currentQuery.sort=e.sort),e.projection&&(this.currentQuery.projection=e.projection))}reset(){return this.init(this._initOptions),this.getQuery()}isQuery(e){return"attribute"in e}isQueryGroup(e){return"groupKey"in e}isRootQueryGroup(e){return this.isQueryGroup(e)&&e.groupKey==="root"}getQueryGroup(e){return this.currentQuery.queries.find(t=>this.isQueryGroup(t)&&t.groupKey===e)}getQuery(){return p.cloneDeep(this.currentQuery)}hasQueryGroup(e){return this.currentQuery.queries.some(t=>this.isQueryGroup(t)&&t.groupKey===e)}has(e){if(e.groupKey&&e.queryKey){const t=this.getQueryGroup(e.groupKey);if(t)return t.queries.some(r=>this.isQuery(r)&&r.queryKey===e.queryKey)}else if(e.groupKey)return this.hasQueryGroup(e.groupKey);return!1}validate(e){const t=e.queries.map(s=>this.validateQuery(s));return{valid:p.every(t,s=>s.valid),errors:t.map(s=>s.errors).flat()}}applyOptions(e,t="update"){return t==="set"?(this.currentQuery.count=e.count,this.currentQuery.start=e.start,this.currentQuery.sort=e.sort,this.currentQuery.projection=e.projection):(typeof e?.sort<"u"&&(this.currentQuery.sort=e.sort),typeof e?.count<"u"&&(this.currentQuery.count=e.count),typeof e?.start<"u"&&(this.currentQuery.start=e?.start),typeof e?.projection<"u"&&(this.currentQuery.projection=e?.projection)),this.getQuery()}applyQuery(e,t,r){if(r||(r=this.currentQuery),Array.isArray(e))for(const s of e)this.applyQuery(s,t,r);else if(this.isRootQueryGroup(e))e.groupType&&(r.groupType=e.groupType),t?.mode==="set"?r.queries=e.queries:r.queries=[...r.queries,...e.queries],this.applyOptions(e,"set");else if(this.isQuery(e)){const s=r.queries.findIndex(i=>this.isQueryGroup(i)&&i.groupKey===e.attribute);if(s>-1){const i=r.queries[s];t?.mode==="set"?i.queries=[e]:i.queries.push(e)}else r.queries.push({groupKey:e.attribute,groupType:"or",queries:[e]})}else if(this.isQueryGroup(e)){const s=r.queries.findIndex(i=>this.isQueryGroup(i)&&i.groupKey===e.groupKey);if(s>-1){const i=r.queries[s];e.groupType&&(i.groupType=e.groupType),t?.mode==="set"?r.queries[s]=e:i.queries=[...i.queries,...e.queries]}else r.queries.push({groupKey:e.groupKey,groupType:e.groupType||"or",queries:e.queries})}return r}removeAllQueries(){return this.currentQuery.queries=[],this.getQuery()}removeQuery(e,t){if(t||(t=this.currentQuery),this.isQuery(e)){const r=t.queries.findIndex(s=>this.isQueryGroup(s)&&s.groupKey===e.attribute);if(r>-1){const s=t.queries[r],i=p.findIndex(s.queries,e);i>-1&&s.queries.splice(i,1),s.queries.length===0&&t.queries.splice(r,1)}}else if(this.isQueryGroup(e)){const r=t.queries.findIndex(s=>this.isQueryGroup(s)&&s.groupKey===e.groupKey);if(r>-1)if(!e.queries)t.queries.splice(r,1);else{const s=t.queries[r];for(const i of e.queries){const n=p.findIndex(s.queries,i);n>-1&&s.queries.splice(n,1)}s.queries.length===0&&t.queries.splice(r,1)}}return t}validateQuery(e){const t=[];if(this.isQuery(e))return e.attribute||t.push(new A("Missing attribute",e)),e.operator||t.push(new A("Missing operator",e)),typeof e.value>"u"&&t.push(new A("Missing value",e)),e.operator==="find"&&Array.isArray(e.value)&&t.push(new A("find operator cannot have array value",e)),t.length>0?{valid:!1,errors:t}:{valid:!0};if(this.isQueryGroup(e)){const i=e.queries.map(n=>this.validateQuery(n)).filter(n=>!n.valid).map(n=>n.errors).flat();return i.length>0?{valid:!1,errors:i}:{valid:!0}}return t.push(new A("Invalid query definition",e)),{valid:!1,errors:t}}getQueryAttributes(e){const t=[],r=new Set,s=i=>{for(const n of i)this.isQuery(n)?n.attribute&&!r.has(n.attribute)&&(t.push(n.attribute),r.add(n.attribute)):this.isQueryGroup(n)&&s(n.queries)};return s(e?.queries||this.currentQuery.queries),t}extractQueryAttributes(e){const t=[],r=new Set,s=i=>{for(const n of i)if(this.isQuery(n)){if(n.attribute&&!r.has(n.attribute)){const a=this.getQueryAttributeForString(n.attribute);t.push(a),r.add(n.attribute)}}else this.isQueryGroup(n)&&s(n.queries)};return s(e?.queries||this.currentQuery.queries),t}getQueryAttributeForString(e){return this.deepQueryService.parse(e)}getDeepQueryService(){return this.deepQueryService}getProjectionForAttributes(e){const t={};return e.forEach(r=>{t[r]=!0}),t}getProjectionForAttributeEntries(e){const t={$:!0};return e.forEach(r=>{if(r.isDeepQuery){if(r.reference)if(r.referenceAttribute&&r.referenceAttribute.length>0){t[r.reference]||(t[r.reference]={$:!0});const s=this.deepQueryService.parse(r.referenceAttribute);if(s.isDeepQuery&&r.reference){const i=this.getProjectionForAttributeEntries([s]);Object.keys(i).forEach(n=>{n!=="$"&&r.reference&&(t[r.reference][n]=i[n])})}else r.reference&&(t[r.reference][r.referenceAttribute]=!0)}else t[r.reference]=!0}else t[r.attribute]=!0}),t}getAttributeNames(e){return this.getQueryAttributes(e)}getAttributeDetails(e){return this.extractQueryAttributes(e||this.currentQuery)}getCurrentAttributeNames(){return this.getAttributeNames(this.currentQuery)}getCurrentAttributeDetails(){return this.getAttributeDetails(this.currentQuery)}addCondition(e){return this.applyQuery(e,{mode:"add"})}addGroup(e){return this.applyQuery(e,{mode:"add"})}setCondition(e){return this.applyQuery(e,{mode:"set"})}setGroup(e){return this.applyQuery(e,{mode:"set"})}mergeQuery(e){if(e.queries&&Array.isArray(e.queries))for(const t of e.queries)this.applyQuery(t,{mode:"add"});return this.currentQuery}replaceQuery(e){return this.currentQuery.queries=[],e.groupType&&(this.currentQuery.groupType=e.groupType),e.queries&&Array.isArray(e.queries)&&(this.currentQuery.queries=e.queries),this.currentQuery}clear(){return this.reset()}clearConditions(){return this.removeAllQueries()}getCurrentQuery(){return this.getQuery()}isEmpty(){return this.currentQuery.queries.length===0}hasCondition(e){const t=r=>{for(const s of r)if(this.isQuery(s)){let i=!0;for(const n in e)if(s[n]!==e[n]){i=!1;break}if(i)return!0}else if(this.isQueryGroup(s)&&t(s.queries))return!0;return!1};return t(this.currentQuery.queries)}hasGroup(e){return this.hasQueryGroup(e)}getUsedAttributes(){return this.getAttributeNames()}getDeepQueryAttributes(){return this.getAttributeDetails().filter(t=>t.isDeepQuery)}getGroups(){return this.currentQuery.queries.filter(e=>this.isQueryGroup(e))}getTopLevelConditions(){return this.currentQuery.queries.filter(e=>this.isQuery(e))}getGroup(e){return this.getQueryGroup(e)}getConditionCount(){const e=t=>{let r=0;for(const s of t)this.isQuery(s)?r++:this.isQueryGroup(s)&&(r+=e(s.queries));return r};return e(this.currentQuery.queries)}}const Q=new N;function Qe(o,e,t,r,s,i,n){const a=[],u=Q.removeQuery({groupKey:s},p.cloneDeep(r)),c=n.queryData(o,u,!1,i),f=e?[...e.keys()]:[],l=new Set(f),d=i.get(s);if(!t.excludeUnresolved)for(const h of d.keys())l.add(h);t.excludeUndefineds?l.delete(void 0):l.add(void 0);for(const h of l.values()){const m=new Map,Y=d.get(h)||new Set;for(const E of Y){const q=c.get(E);if(q&&(m.set(E,q),!t?.calculateFacets))break}const k={key:String(h),value:h,selected:Ie(s,h,r),enabled:m.size>0,size:m.size,entry:e.get(h),resultKeys:Array.from(m.keys())};if(!(t?.excludeZeros&&k.size===0)){if(t?.count&&a.length===t?.count)return a;a.push(k)}}return a}const Ie=(o,e,t)=>{const r=t.queries.findIndex(s=>Q.isQueryGroup(s)&&s.groupKey===o);return r>-1?!!t.queries[r].queries.find(i=>{if(Q.isQuery(i)){const n=i.value?.key||i.value;return i.attribute===o&&n===e}return!1}):!1};class V{indexMap=new Map;dataMap=new Map;indexMetadata=new Map;constructor(){}reset(e){e?(this.indexMap.delete(e),this.dataMap.delete(e),this.indexMetadata.delete(e)):(this.indexMap.clear(),this.dataMap.clear(),this.indexMetadata.clear())}fillDataMap(e,t){let r=this.dataMap.get(e);r||(r=new Map,this.dataMap.set(e,r));for(const s of t){let i;if(typeof s=="object"&&s&&s.key)i=s.key;else if(Array.isArray(s)){for(const a of s)this.fillDataMap(e,[a]);return}else s instanceof Date?i=s.toISOString():i=s;let n=r.get(i);n||(n={key:i},this.dataMap.get(e)?.set(i,n))}}fillInverseIndex(e,t,r){if(!e||!t||!r||!Array.isArray(r))return;const s=this.indexMap.get(e)||new Map;for(const i of r){let n;if(typeof i=="object"&&i&&i.key)n=i.key;else if(Array.isArray(i)){for(const u of i)this.fillInverseIndex(e,t,[u]);return}else i instanceof Date?n=i.toISOString():n=i;let a=s.get(n);a||(a=new Set,s.set(n,a)),a.add(t)}this.indexMap.set(e,s)}getIndex(e,t){const r=this.getIndexName(e,t);return this.indexMap.get(r)}getData(e,t){const r=this.getIndexName(e,t);return this.dataMap.get(r)}getOrCreateIndex(e,t,r){const s=this.getIndexName(e,r);let i=this.getIndex(s);const n=this.indexMetadata.get(s);if(n)n.lastAccessedAt=Date.now();else if(!i){const u=y.parse(e).isDeepQuery??!1;this.indexMetadata.set(s,{createdAt:Date.now(),lastAccessedAt:Date.now(),context:r,type:u?"deep":"shallow"})}if(!i){this.reset(s),this.indexMap.set(s,new Map);const u=y.parse(e).isDeepQuery;for(const c of t.values()){let f;u?(f=v(c,e),f.length===0&&(f=[void 0])):f=[c[e]],this.fillInverseIndex(s,c.key,f),this.fillDataMap(s,f)}i=this.getIndex(s)||new Map}return i}getIndexName(e,t){return t?e+"_"+I(t):e}removeFromInverseIndex(e,t,r){const s=this.indexMap.get(e);if(s)for(const i of r){let n;if(typeof i=="object"&&i&&i.key)n=i.key;else if(Array.isArray(i)){for(const u of i)this.removeFromInverseIndex(e,t,[u]);return}else i instanceof Date?n=i.toISOString():n=i;const a=s.get(n);a&&(a.delete(t),a.size===0&&s.delete(n))}}updateInverseIndex(e,t,r,s){this.removeFromInverseIndex(e,t,r),this.fillInverseIndex(e,t,s)}removeFromDataMap(e,t){const r=this.dataMap.get(e);if(r)for(const s of t){let i;if(typeof s=="object"&&s&&s.key)i=s.key;else if(Array.isArray(s)){for(const n of s)this.removeFromDataMap(e,[n]);return}else s instanceof Date?i=s.toISOString():i=s;r.delete(i)}}updateDataMap(e,t,r){this.removeFromDataMap(e,t),this.fillDataMap(e,r)}removeItemFromAllIndices(e){for(const t of this.indexMap.values())for(const[r,s]of t)s.delete(e)&&s.size===0&&t.delete(r);for(const t of this.dataMap.values())t.has(e)&&t.delete(e)}resetAttributes(e){for(const t of e)this.reset(t)}isDeepQueryIndex(e){const t=e.includes("_")?e.split("_")[0]:e;try{return y.parse(t).isDeepQuery??!1}catch{return!1}}getDeepIndexKeys(){const e=[];for(const t of this.indexMap.keys())this.isDeepQueryIndex(t)&&e.push(t);return e}resetAllDeepIndices(){const e=this.getDeepIndexKeys();for(const t of e)this.indexMap.delete(t),this.dataMap.delete(t)}getIndexCount(){let e=0,t=0;for(const r of this.indexMap.keys())this.isDeepQueryIndex(r)?t++:e++;return{shallow:e,deep:t,total:e+t}}cleanupStaleIndices(e=300*1e3){const t=Date.now();let r=0;for(const[s,i]of this.indexMetadata)t-i.lastAccessedAt>e&&(this.reset(s),r++);return r}getStats(){const e=this.getIndexCount(),t=Date.now();let r=0,s=0;for(const n of this.indexMetadata.values()){const a=t-n.createdAt;r+=a,a>s&&(s=a)}const i=this.indexMetadata.size>0?r/this.indexMetadata.size:0;return{shallow:e.shallow,deep:e.deep,total:e.total,oldestAge:s,avgAge:i}}}const w="__";function C(o,e,t={key:"root"},r="root",s=new V,i){const n=i||o;for(const a of e.columns)a.attribute&&(y.parse(a.attribute),s.getOrCreateIndex(a.attribute,n));for(const a of e.rows)a.attribute&&(y.parse(a.attribute),s.getOrCreateIndex(a.attribute,n));for(const a of e.values)a.attribute&&(y.parse(a.attribute),s.getOrCreateIndex(a.attribute,n));if(e.rows&&e.rows.length>0){t.rows=t.rows||[];const a=Me(o,e.rows[0],e,s,r,i);t.rows.push(a)}if(e.columns&&e.columns.length>0){t.columns=t.columns||[];const a=H(o,e.columns[0],e,s,r,i);t.columns.push(a)}if(t.key==="root")for(const a of e.values){if(t.values=t.values||[],r==="root"&&e.options?.calculateTotals===!1)continue;const u=b(a,o,s.getIndex(a.attribute),a.attribute);t.values.push(u)}return t}function Me(o,e,t,r,s="",i){const n={key:e.attribute},a=r.getIndex(e.attribute);if(!a)return n;for(const[u,c]of a.entries()){const f={key:u,value:u},l=new Map;for(const d of c)o.has(d)&&l.set(d,o.get(d));if(l.size){for(const d of t.values){if(f.values=f.values||[],s==="root"&&e?.calculateTotals===!1)continue;const h=b(d,l,r.getIndex(d.attribute),d.attribute);f.values.push(h)}if(n.rows=n.rows||[],n.rows.push(f),t.rows.length>1){const d={...t,rows:t.rows.slice(1)};C(l,d,f,s+w+e.attribute+w+u,r,i)}else if(t.columns)for(const d of t.columns){f.columns=f.columns||[];const h=H(l,d,t,r,s+w+e.attribute+w+u,i);f.columns.push(h)}}}return n}function H(o,e,t,r,s="",i){const n={key:e.attribute},a=r.getIndex(e.attribute);if(!a)return n;for(const[u,c]of a.entries()){const f={key:u,value:u},l=new Map;for(const d of c)o.has(d)&&l.set(d,o.get(d));if(l.size){for(const d of t.values){if(f.values=f.values||[],s==="root"&&e?.calculateTotals===!1)continue;const h=b(d,l,r.getIndex(d.attribute),d.attribute);f.values.push(h)}if(n.columns=n.columns||[],n.columns.push(f),t.columns.length>1){const d={...t,columns:t.columns.slice(1)};C(l,d,f,s+w+e.attribute+w+u,r,i)}}}return n}const Ne=o=>o==null||o==="",Ce=(o,e=!1)=>{const t=typeof e=="boolean"?{deep:e}:e,s=t.deep??(t.sampleSize!==void 0&&t.sampleSize>1)?t.sampleSize??1/0:1,i=t.ignoreEmpty??s>1,n=[],a=Math.min(o.length,s);for(let u=0;u<a;u++){const c=o[u];if(c)for(const[f,l]of Object.entries(c)){if(i&&Ne(l))continue;const d=Z(l),h=n.find(m=>m.key===f);if(h)h.type!==d&&(h.type="any");else{const m={key:f,type:d};n.push(m)}}}return n},U=o=>Number(o)===o&&o%1===0,J=o=>Number(o)===o&&o%1!==0,Z=o=>{switch(typeof o){case"string":return"string";case"number":return U(o)?"int":J(o)?"float":"any";case"boolean":return"boolean";case"object":return z(o)?"date":"json";default:return"any"}},ke=(o,e)=>{const t=j(o.text||""),r=e?.attributeKey||o.filterKey;let s;const i=e?.comparisonType||"containsIgnoreCase";return i==="containsIgnoreCase"?s={groupKey:o.filterKey,queries:[{queryKey:o.text,attribute:r,value:`/${t}/`,operator:"find",options:{transform:["lowercase"]}}]}:i==="containsIgnoreCaseAndWhitespace"?s={groupKey:o.filterKey,queries:[{queryKey:o.text,attribute:r,value:`/${t}/`,operator:"find",options:{transform:["removeWhitespace","lowercase"]}}]}:i==="contains"?s={groupKey:o.filterKey,queries:[{queryKey:o.text,attribute:r,value:`/${t}/`,operator:"find"}]}:i==="equal"?s={groupKey:o.filterKey,queries:[{queryKey:o.text,attribute:r,value:o.text,operator:"eq"}]}:i==="equalIgnoreCase"&&(s={groupKey:o.filterKey,queries:[{queryKey:o.text,attribute:r,value:o.text,operator:"eq",options:{transform:["lowercase"]}}]}),s},Ee=(o,e)=>{const t=e?.attributeKey||o.filterKey;return{groupKey:o.filterKey,queries:[{queryKey:o.value,attribute:t,value:o.value,operator:"eq"}]}},qe=(o,e)=>{const t=e?.attributeKey||o.filterKey,r={groupKey:o.filterKey,queries:[]};return typeof o.eq<"u"&&(r.groupType="or",Array.isArray(o.eq)?o.eq.forEach(s=>{r.queries.push({attribute:t,value:s,operator:"eq"})}):r.queries.push({attribute:t,value:o.eq,operator:"eq"})),typeof o.ne<"u"&&(r.groupType="and",Array.isArray(o.ne)?o.ne.forEach(s=>{r.queries.push({attribute:t,value:s,operator:"eq",options:{invert:!0}})}):r.queries.push({attribute:t,value:o.ne,operator:"eq",options:{invert:!0}})),typeof o.gt<"u"&&(r.groupType="and",r.queries.push({attribute:t,value:o.gt,operator:"gt"})),typeof o.lt<"u"&&(r.groupType="and",r.queries.push({attribute:t,value:o.lt,operator:"lt"})),typeof o.gte<"u"&&(r.groupType="and",r.queries.push({attribute:t,value:o.gte,operator:"gte"})),typeof o.lte<"u"&&(r.groupType="and",r.queries.push({attribute:t,value:o.lte,operator:"lte"})),r},Oe=(o,e)=>{const t=e?.attributeKey||o.filterKey,r={groupKey:o.filterKey,queries:[]};return o.itemKeys.forEach(s=>{r.queries.push({queryKey:s,attribute:t,value:{key:s},operator:"eq"})}),r},$e=o=>!(typeof o.modelKey!="string"||!Array.isArray(o.queries));class Fe{constructor(e,t,r){this.scriptController=e,this.globalItemService=t,this.modelParser=r}registeredCustomOperator=new Map;queryBuilder=new N;registerCustomOperator(e,t){this.registeredCustomOperator.set(e,t)}transformValue(e,t){if(Array.isArray(e))return e.map(r=>this.transformValue(r,t));if(typeof e!="string")return e;for(const r of t)r==="lowercase"?e=e.toLowerCase():r==="trim"?e=e.trim():r==="removeWhitespace"&&(e=e.replace(/\s/g,""));return e}evaluateQuery(e,t){let r,s=e.value;const i=e.options?.arrayValueHandling||"some";if(Array.isArray(e.options?.transform)&&e.options.transform.length>0&&(s=this.transformValue(s,e.options.transform)),e.attribute.includes(".")||e.attribute.includes("[")?r=p.get(t,e.attribute):r=t[e.attribute],Array.isArray(e.options?.transform)&&e.options.transform.length>0&&(r=this.transformValue(r,e.options.transform)),(typeof r>"u"||r===null)&&!["typeof","isTruthy","eq"].includes(e.operator))return!1;switch(e.operator){case"eq":return e.options?.invert?!p.isEqual(r,s):p.isEqual(r,s);case"find":return e.options?.invert?!this.queryFind(r,s,i):this.queryFind(r,s,i);case"lt":return Array.isArray(r)?i==="some"?r.some(n=>n<s):r.every(n=>n<s):r<s;case"gt":return Array.isArray(r)?i==="some"?r.some(n=>n>s):r.every(n=>n>s):r>s;case"lte":return Array.isArray(r)?i==="some"?r.some(n=>n<=s):r.every(n=>n<=s):r<=s;case"gte":return Array.isArray(r)?i==="some"?r.some(n=>n>=s):r.every(n=>n>=s):r>=s;case"typeof":return e.options?.invert?typeof r!==s:Array.isArray(r)?i==="some"?r.some(n=>typeof n===s):r.every(n=>typeof n===s):typeof r===s;case"isTruthy":return s===!0?Array.isArray(r)?i==="some"?r.some(n=>typeof!!n):r.every(n=>typeof!!n):!!r:!r;case"size":return typeof r=="string"?r.length===s:p.size(r)===s;default:if(this.scriptController.hasScript(e.operator))return this.scriptController.executeScript(e.operator,"operator",{query:e,item:t});if(this.registeredCustomOperator.has(e.operator)){const n=this.registeredCustomOperator.get(e.operator);if(typeof n=="function")return n(e,t)}}return!1}evaluateEqOperator(e,t,r,s){const i=new Map,n=s.get(t.attribute);if(n){let a;if(typeof t.value=="string"?a=t.value:t.value?.key&&Object.keys(t.value).length===1&&(a=t.value.key),typeof a<"u"){const u=n.get(a);if(u)if(u.forEach(c=>{r.has(c)&&i.set(c,r.get(c))}),t.options?.invert){const c=p.differenceBy(Array.from(r.values()),Array.from(i.values()),"key"),f=new Map;return c.forEach(l=>{f.set(l.key,l)}),f}else return i}}for(let[a,u]of r){const c=this.queryBuilder.extractQueryAttributes({queries:[t]});if(c.some(f=>f.isDeepQuery)){const f=this.queryBuilder.getProjectionForAttributeEntries(c.filter(l=>l.isDeepQuery));u=this.globalItemService.getProjectedData(f,this.modelParser.models.get(e.modelKey),u)}this.evaluateQuery(t,u)&&i.set(a,u)}return i}equalRegexFn(e,t){if(typeof t=="string"&&p.startsWith(t,"/")&&p.endsWith(t,"/"))try{return new RegExp(t.slice(1,-1)).test(e)}catch{return!1}else return Array.isArray(e)?!!e.find(r=>p.isEqualWith(r,t,this.equalRegexFn)):typeof t=="object"?p.isMatch(e,t):e===t}queryFind(e,t,r){return Array.isArray(e)?typeof t=="string"||typeof t=="number"||typeof t=="boolean"?r==="some"?e.some(s=>p.isEqualWith(s,t,this.equalRegexFn)):e.every(s=>p.isEqualWith(s,t,this.equalRegexFn)):!!p.find(e,t):p.isEqualWith(e,t,this.equalRegexFn)}validateQuery(e){if(this.queryBuilder.isQuery(e)){if(!e.attribute||!e.operator)throw new Error("invalid query - missing attribute or operator");if(e.operator==="find"&&Array.isArray(e.value))throw new Error("invalid query - find operator cannot have array value");return!0}else{if(this.queryBuilder.isQueryGroup(e))return p.every(e.queries,t=>this.validateQuery(t));throw new Error("invalid query - missing query or attribute")}}getEvaluatedQueryDataset(e,t,r,s){const i=new Map;if(t.attribute.includes("[*]")){const n=t.options?.invert===!0,a=new Set;for(let u of r.values()){const c=this.queryBuilder.extractQueryAttributes({queries:[t]});if(c.some(d=>d.isDeepQuery)){const d=this.queryBuilder.getProjectionForAttributeEntries(c.filter(h=>h.isDeepQuery));u=this.globalItemService.getProjectedData(d,this.modelParser.models.get(e.modelKey),u)}const f=this.handleArrayStarQuery(t,u);let l=!1;for(const d of f.queries){const h={...d,options:{...d.options,invert:!1}};if(this.evaluateQuery(h,u)){l=!0;break}}l&&(a.add(u.key),n||i.set(u.key,u))}if(n)for(const[u,c]of r)a.has(u)||i.set(u,c)}else{if(t.operator==="eq")return this.evaluateEqOperator(e,t,r,s);for(let[n,a]of r){const u=this.queryBuilder.extractQueryAttributes({queries:[t]});if(u.some(c=>c.isDeepQuery)){const c=this.queryBuilder.getProjectionForAttributeEntries(u.filter(f=>f.isDeepQuery));a=this.globalItemService.getProjectedData(c,this.modelParser.models.get(e.modelKey),a)}this.evaluateQuery(t,a)&&i.set(n,a)}}return i}handleArrayStarQuery(e,t){const r=e.attribute.indexOf("[*]"),s={groupKey:e.queryKey||e.attribute+"[*]",groupType:"or",queries:[]};if(r!==-1){const i=e.attribute.substring(0,r),n=i.includes(".")?p.get(t,i):t[i];if(Array.isArray(n))for(let a=0;a<n.length;a++){const u=e.attribute.replace("[*]",`[${a}]`);s.queries.push({attribute:u,operator:e.operator,value:e.value,options:e.options})}}return s}evaluateQueryGroup(e,t,r,s,i){let n=new Map,a=r;if(!t.queries||t.queries?.length===0)return a;for(const u of t.queries){let c=new Map;if(this.queryBuilder.isQuery(u)?c=this.getEvaluatedQueryDataset(e,u,a,i):c=this.evaluateQueryGroup(e,u,a,s,i),n.size===0&&(n=c),t.groupType==="or")c.forEach(f=>{n.set(f.key,f)});else{const f=p.differenceBy(Array.from(n.values()),Array.from(c.values()),"key");for(const l of f)n.delete(l.key)}t.groupType==="and"?a=n:a=r}return n}queryData(e,t,r,s){const i=new Map(e);return t.queries.length===0?e:(t.groupKey||(t.groupKey="root"),t.groupType||(t.groupType="and"),t.queries||(t.queries=[]),this.validateQuery(t),this.evaluateQueryGroup(t,t,i,r,s))}}class Te{scripts=new Map;scriptFunctions=new Map;constructor(){}keys(){return Array.from(this.scripts.keys())}setScript(e,t){this.scripts.set(e,t)}removeScript(e){this.scripts.delete(e)}getScript(e){return this.scripts.get(e)}hasScript(e){return this.scripts.has(e)}getScriptAsFn(e,t){if(this.scriptFunctions.has(e))return this.scriptFunctions.get(e);const r=this.getScript(e);if(!r)throw new Error(`Script ${e} not found`);const s=this.getWrapperScript(r),i=new Function("script_type",...t,s);return this.scriptFunctions.set(e,i),i}getWrapperScript(e){return`
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const p=require("lodash-es");function N(n){const e=Q(n);return te(e)}function Q(n){if(typeof n!="object"||n===null)return String(n);if(Array.isArray(n))return"["+n.map(Q).join(",")+"]";const e=Object.keys(n).sort();let t="{";for(let r=0;r<e.length;r++){const s=e[r];t+=s+":"+Q(n[s]),r<e.length-1&&(t+=",")}return t+="}",t}function te(n){let e=0;for(let t=0;t<n.length;t++){const r=n.charCodeAt(t);e=(e<<5)-e+r,e|=0}return e.toString(16)}const A={now:()=>typeof performance<"u"&&performance.now?performance.now():new Date().getTime(),mark:n=>{typeof performance<"u"&&performance.mark&&performance.mark(n)},measure:(n,e,t)=>{typeof performance<"u"&&performance.measure&&performance.measure(n,e,t)},getEntriesByName(n){if(typeof performance<"u"&&performance.getEntriesByName)return performance.getEntriesByName(n)},getEntriesByType(n){if(typeof performance<"u"&&performance.getEntriesByType)return performance.getEntriesByType(n)}};class re{data;enabled=!1;constructor(){}init(e){this.data=new Map,this.enabled=e}set(e){if(!this.enabled)return e.value;const t=this.getKey(e.value.name,e.context);return this.data.set(t,e.value),this.data.get(t)}mark(e){if(!this.enabled)return;const t=this.getKey(e.name,e.context),r={name:e.name,type:"mark",value:A.now(),createdAt:Date.now()};return this.data.set(t,r),r}measure(e){if(!this.enabled)return;const t=this.getKey(e.name,e.context),r=this.data.get(this.getKey(e.start,e.context)),s=this.data.get(this.getKey(e.end,e.context));if(!r||!s)return;const o=s.value-r.value,i=Math.round(o*100)/100,a=this.data.get(t);if(a&&e.sum){const c=a.value+i,f={...a,value:c};return this.data.set(t,f),f}const u={name:e.name,type:"measure",value:i,createdAt:Date.now()};return e.detail&&(u.detail=e.detail),this.data.set(t,u),u}update(e){if(!this.enabled)return e.value;const t=this.getKey(e.value.name,e.context),r=this.data.get(t);if(r){const s={...r,...e.value};this.data.set(t,s)}else this.data.set(t,e.value);return this.data.get(t)}getResourceInfosFromPerformanceAPI(){return typeof performance>"u"?[]:A.getEntriesByType("resource")}get(e){const t=this.getKey(e.name,e.context);return this.data.get(t)}getByType(e){return Array.from(this.data.values()).filter(t=>t.type===e)}getByName(e){return Array.from(this.data.values()).filter(t=>t.name===e)}clear(){this.data.clear()}getKey(e,t){if(!t)return e;const r=N(t);return e+"_"+r}}let F=class G{nodes;edges;nodeKinds=new Map;nodeMeta=new Map;edgePolicy;constructor(){this.nodes=new Set,this.edges=new Map}addNode(e,t){this.nodes.has(e)||(this.nodes.add(e),this.edges.set(e,new Set)),t?.kind!==void 0&&this.nodeKinds.set(e,t.kind),t?.meta!==void 0&&this.nodeMeta.set(e,t.meta)}addDependency(e,t){if(!this.nodes.has(e)||!this.nodes.has(t))throw new Error("Both nodes must exist before adding a dependency.");if(this.edgePolicy&&!this.edgePolicy({name:e,kind:this.nodeKinds.get(e)},{name:t,kind:this.nodeKinds.get(t)}))throw new Error(`Edge policy rejected dependency from "${e}" to "${t}".`);this.edges.get(e).add(t)}setEdgePolicy(e){this.edgePolicy=e}setNodeKind(e,t){if(!this.nodes.has(e))throw new Error("Node does not exist.");t===void 0?this.nodeKinds.delete(e):this.nodeKinds.set(e,t)}getNodeKind(e){return this.nodeKinds.get(e)}setNodeMeta(e,t){if(!this.nodes.has(e))throw new Error("Node does not exist.");this.nodeMeta.set(e,t)}getNodeMeta(e){return this.nodeMeta.get(e)}removeNode(e){if(!this.nodes.has(e))throw new Error("Node does not exist.");this.nodes.delete(e),this.edges.delete(e);for(let t of this.edges.values())t.delete(e)}removeDependency(e,t){if(!this.edges.has(e))throw new Error("From node does not exist.");this.edges.get(e).delete(t)}hasNode(e){return this.nodes.has(e)}hasDependency(e,t){return this.edges.has(e)?this.edges.get(e).has(t):!1}getDependencies(e){if(!this.edges.has(e))throw new Error("Node does not exist.");return Array.from(this.edges.get(e))}getDependents(e){const t=[];for(let[r,s]of this.edges)s.has(e)&&t.push(r);return t}isCyclic(){const e=new Set,t=new Set,r=s=>{if(e.has(s))return!1;if(t.has(s))return!0;t.add(s);const o=this.edges.get(s);if(o){for(let i of o)if(r(i))return!0}return t.delete(s),e.add(s),!1};for(let s of this.nodes)if(r(s))return!0;return!1}validateNoCycles(){const e=new Set,t=new Set,r=[],s=o=>{if(e.has(o))return null;if(t.has(o)){const a=r.indexOf(o);return r.slice(a).concat([o])}t.add(o),r.push(o);const i=this.edges.get(o);if(i)for(let a of i){const u=s(a);if(u)return u}return r.pop(),t.delete(o),e.add(o),null};for(let o of this.nodes){const i=s(o);if(i)return{hasCycle:!0,path:i}}return{hasCycle:!1}}order(e){const t=new Set,r=new Set,s=[],o=e?.allowCycles??!1,i=a=>{if(t.has(a))return;if(r.has(a)){if(o)return;throw new Error("Graph has a cycle.")}r.add(a);const u=this.edges.get(a);if(u)for(let c of u)i(c);r.delete(a),t.add(a),s.push(a)};for(let a of this.nodes)t.has(a)||i(a);return s}clear(){this.nodes.clear(),this.edges.clear()}getNodes(){return Array.from(this.nodes)}getAllEdges(){const e=[];for(let[t,r]of this.edges)for(let s of r)e.push([t,s]);return e}getNodesWithNoDependants(){if(this.nodes.size===0)return[];const e=new Set;for(const r of this.edges.values())for(const s of r)e.add(s);const t=[];for(const r of this.nodes)e.has(r)||t.push(r);return t}getNodesByKind(e){const t=[];for(const r of this.nodes)this.nodeKinds.get(r)===e&&t.push(r);return t}getRootsByKind(e){const t=new Set(this.getNodesWithNoDependants()),r=Array.from(t);return e?r.filter(s=>this.nodeKinds.get(s)===e):r}getLeavesByKind(e){const t=[];for(const r of this.nodes){const s=this.edges.get(r);(!s||s.size===0)&&(!e||this.nodeKinds.get(r)===e)&&t.push(r)}return t}getDependenciesOfKind(e,t){return this.getDependencies(e).filter(s=>this.nodeKinds.get(s)===t)}getDependentsOfKind(e,t){return this.getDependents(e).filter(s=>this.nodeKinds.get(s)===t)}plan(e){const t=new Map;for(const i of this.nodes)t.set(i,0);for(const i of this.edges.values())for(const a of i)t.set(a,(t.get(a)||0)+1);const r=[];let s=Array.from(this.nodes).filter(i=>(t.get(i)||0)===0);const o=new Set;for(;s.length>0;){const i=s.slice();r.push(i),s=[];for(const a of i){if(o.has(a))continue;o.add(a);const u=this.edges.get(a);if(u)for(const c of u)t.set(c,(t.get(c)||0)-1),(t.get(c)||0)===0&&s.push(c)}}if(o.size!==this.nodes.size)throw new Error("Graph has a cycle.");if(e?.filterKinds&&e.filterKinds.length>0){const i=new Set(e.filterKinds);return{batches:r.map(a=>a.filter(u=>i.has(this.nodeKinds.get(u))))}}return{batches:r}}getImpactedNodes(e,t="downstream",r){const s=new Set(e),o=c=>!r||r.length===0||r.includes(this.nodeKinds.get(c)??void 0),i=()=>{const c=new Set,f=Array.from(s);for(;f.length;){const l=f.shift();for(const[d,h]of this.edges)h.has(l)&&!c.has(d)&&(c.add(d),f.push(d))}return c},a=()=>{const c=new Set,f=Array.from(s);for(;f.length;){const l=f.shift(),d=this.edges.get(l);if(d)for(const h of d)c.has(h)||(c.add(h),f.push(h))}return c};let u;return t==="both"?u=new Set([...i(),...a()]):t==="upstream"?u=a():u=i(),Array.from(u).filter(o)}toJSON(){const e=Array.from(this.nodes).map(r=>({name:r,kind:this.nodeKinds.get(r),meta:this.nodeMeta.get(r)})),t=this.getAllEdges().map(([r,s])=>({from:r,to:s}));return{nodes:e,edges:t}}static fromJSON(e){const t=new G;for(const r of e.nodes)t.addNode(r.name,{kind:r.kind,meta:r.meta});for(const r of e.edges)t.addDependency(r.from,r.to);return t}diff(e){const t=new Set(this.getNodes()),r=new Set(e.getNodes()),s=Array.from(r).filter(l=>!t.has(l)),o=Array.from(t).filter(l=>!r.has(l)),i=new Set(this.getAllEdges().map(l=>l.join("→"))),a=new Set(e.getAllEdges().map(l=>l.join("→"))),u=Array.from(a).filter(l=>!i.has(l)).map(l=>l.split("→")),c=Array.from(i).filter(l=>!a.has(l)).map(l=>l.split("→")),f=[];for(const l of new Set([...t,...r])){const d=this.nodeKinds.get(l),h=e.nodeKinds.get(l);d!==h&&f.push({name:l,from:d,to:h})}return{addedNodes:s,removedNodes:o,addedEdges:u,removedEdges:c,kindChanges:f}}};class se{graph;nodeIndex;constructor(){this.graph=new F,this.nodeIndex=new Map}getNodeId(e,t){return`${e}.${t}`}parseNodeId(e){const t=e.split(".");return{modelKey:t[0],attributeKey:t.slice(1).join(".")}}addAttribute(e){const t=this.getNodeId(e.modelKey,e.attributeKey);this.nodeIndex.has(t)||(this.graph.addNode(t,{meta:e}),this.nodeIndex.set(t,e))}addAttributeDependency(e,t){this.addAttribute(e),this.addAttribute(t);const r=this.getNodeId(e.modelKey,e.attributeKey),s=this.getNodeId(t.modelKey,t.attributeKey);this.graph.hasDependency(r,s)||this.graph.addDependency(r,s)}getImpactedAttributes(e){const t=e.map(a=>this.getNodeId(a.modelKey,a.attributeKey)),s=this.graph.getImpactedNodes(t,"downstream").map(a=>this.nodeIndex.get(a)).filter(a=>a!==void 0),o=[...e,...s],i=new Set;return o.filter(a=>{const u=this.getNodeId(a.modelKey,a.attributeKey);return i.has(u)?!1:(i.add(u),!0)})}getProcessingOrder(e){const t=new Map,r=[...e].sort((s,o)=>s.processingStep-o.processingStep);for(const s of r){const{modelKey:o,attributeKey:i,processingStep:a}=s;t.has(o)||t.set(o,new Map);const u=t.get(o);u.has(a)||u.set(a,new Set),u.get(a).add(i)}return t}getAttributesForModel(e){const t=[];for(const r of this.nodeIndex.values())r.modelKey===e&&t.push(r);return t}getDependencies(e){const t=this.getNodeId(e.modelKey,e.attributeKey);return this.graph.hasNode(t)?this.graph.getDependencies(t).map(s=>this.nodeIndex.get(s)).filter(s=>s!==void 0):[]}getDependents(e){const t=this.getNodeId(e.modelKey,e.attributeKey);return this.graph.hasNode(t)?this.graph.getDependents(t).map(s=>this.nodeIndex.get(s)).filter(s=>s!==void 0):[]}hasDependencies(e){const t=this.getNodeId(e.modelKey,e.attributeKey);return this.graph.hasNode(t)?this.graph.getDependencies(t).length>0:!1}hasNode(e){return this.nodeIndex.has(e)}getAllAttributes(){return Array.from(this.nodeIndex.values())}getMaxDepth(){let e=0;const t=(r,s=new Set)=>{if(s.has(r))return 0;s.add(r);const o=this.graph.getDependencies(r);if(o.length===0)return 1;let i=0;for(const a of o){const u=t(a,new Set(s));i=Math.max(i,u)}return i+1};for(const r of this.graph.getNodes()){const s=t(r);e=Math.max(e,s)}return e}validateCompleteness(e){const t=[];for(const[r,s]of e)for(const o of s){const i=this.getNodeId(r,o);this.hasNode(i)||t.push({modelKey:r,attributeKey:o})}return{isComplete:t.length===0,missing:t}}clear(){this.graph.clear(),this.nodeIndex.clear()}getStats(){const e=new Map,t=new Map;for(const r of this.nodeIndex.values())e.set(r.modelKey,(e.get(r.modelKey)||0)+1),t.set(r.processingStep,(t.get(r.processingStep)||0)+1);return{totalAttributes:this.nodeIndex.size,totalDependencies:this.graph.getAllEdges().length,maxDepth:this.getMaxDepth(),attributesByModel:e,attributesByStep:t}}toJSON(){return{nodes:Array.from(this.nodeIndex.values()),edges:this.graph.getAllEdges().map(([e,t])=>{const r=this.parseNodeId(e),s=this.parseNodeId(t);return{from:r,to:s}})}}}const q={silent:0,error:1,warn:2,info:3,debug:4};class g{config;static globalConfig={};constructor(e={}){this.config={level:e.level??g.globalConfig.level??this.getDefaultLevel(),format:e.format??g.globalConfig.format??this.getDefaultFormat(),prefix:e.prefix,onLog:e.onLog??g.globalConfig.onLog,onTrackError:e.onTrackError??g.globalConfig.onTrackError}}static setGlobalConfig(e){g.globalConfig={...g.globalConfig,...e}}static getGlobalConfig(){return{...g.globalConfig}}static setModuleLevel(e,t){g.globalConfig.onLog||(g.globalConfig.onLog=void 0),g._moduleOverrides||(g._moduleOverrides=new Map),g._moduleOverrides.set(e,t)}static getModuleLevel(e){if(!(!e||!g._moduleOverrides))return g._moduleOverrides.get(e)}getDefaultLevel(){return"info"}getDefaultFormat(){return"pretty"}getEffectiveLevel(){if(this.config.prefix){const e=g.getModuleLevel(this.config.prefix);if(e)return e}return this.config.level}shouldLog(e){const t=this.getEffectiveLevel();return q[e]<=q[t]}formatMessage(e){if(this.config.format==="json"){const i={timestamp:new Date(e.timestamp).toISOString(),level:e.level,message:e.message};return e.prefix&&(i.module=e.prefix),e.context&&(i.context=e.context),e.error&&(i.error={name:e.error.name,message:e.error.message,stack:e.error.stack}),JSON.stringify(i)}const t=new Date(e.timestamp).toISOString().substring(11,23),r=e.prefix?`[${e.prefix}]`:"",s=this.getLevelIcon(e.level),o=e.context?` ${JSON.stringify(e.context)}`:"";return`${t} ${s} ${r} ${e.message}${o}`.trim()}getLevelIcon(e){switch(e){case"error":return"✖";case"warn":return"⚠";case"info":return"ℹ";case"debug":return"⚙";default:return" "}}log(e,t,r,s){if(!this.shouldLog(e))return;const o={level:e,message:t,timestamp:Date.now(),prefix:this.config.prefix,context:r,error:s};if(this.config.onLog){this.config.onLog(o);return}const i=this.formatMessage(o);if(typeof console<"u")switch(e){case"error":s?console.error(i,s):console.error(i);break;case"warn":console.warn(i);break;case"debug":console.debug?console.debug(i):console.log(i);break;default:console.log(i)}}error(e,t,r){const s=t instanceof Error?t:void 0,o=t instanceof Error?r:t;this.log("error",e,o,s)}trackError(e,t,r){if(this.error(e,t,r?.context),this.config.onTrackError){const s={level:"error",message:e,timestamp:Date.now(),prefix:this.config.prefix,context:r?.context,error:t,errorType:r?.errorType,errorGroup:r?.errorGroup};this.config.onTrackError(s)}}warn(e,t){this.log("warn",e,t)}info(e,t){this.log("info",e,t)}debug(e,t){this.log("debug",e,t)}child(e){const t={...this.config,...e,prefix:e.prefix?this.config.prefix?`${this.config.prefix}:${e.prefix}`:e.prefix:this.config.prefix};return new g(t)}configure(e){Object.assign(this.config,e)}}const B=new g;class ne{constructor(e){this.enabled=e,this.cache=new Map,this.cacheDependencies=new Map}cache;cacheDependencies;hitCount=0;missCount=0;log=B.child({prefix:"CacheController"});get(e,t){if(!this.enabled)return;const r=this.getCacheName(e,t);return this.cache.has(r)?this.hitCount++:this.missCount++,this.cache.get(r)}set(e,t,r,s){if(!this.enabled)return;const o=this.getCacheName(e,t);this.cache.set(o,r),s?this.cacheDependencies.set(o,s):this.log.debug(`Cache entry '${e}' stored without dependencies. This prevents granular invalidation and may cause stale data.`)}has(e,t){return this.cache.has(this.getCacheName(e,t))}clear(){this.cache.clear(),this.cacheDependencies.clear(),this.hitCount=0,this.missCount=0}invalidateByDependencies(e){if(!this.enabled)return;const t=[];for(const[r,s]of this.cacheDependencies){let o=!1;for(const[i,a]of e){if(s.models.has(i))if(s.modelAttributes.has(i)){const u=s.modelAttributes.get(i);for(const c of a)if(u.has(c)){o=!0;break}}else o=!0;if(o)break}o&&t.push(r)}for(const r of t)this.cache.delete(r),this.cacheDependencies.delete(r)}invalidateByModels(e){if(!this.enabled)return;const t=new Set(e),r=[];for(const[s,o]of this.cacheDependencies)for(const i of t)if(o.models.has(i)){r.push(s);break}for(const s of r)this.cache.delete(s),this.cacheDependencies.delete(s)}invalidateByKeyPrefix(e){if(!this.enabled)return;const t=[];for(const r of this.cache.keys())r.startsWith(e+"_")&&t.push(r);for(const r of t)this.cache.delete(r),this.cacheDependencies.delete(r)}invalidateForModel(e){this.invalidateByModels([e])}invalidateForAttribute(e,t){if(!this.enabled)return;const r=new Map;r.set(e,new Set([t])),this.invalidateByDependencies(r)}invalidateMatching(e){if(!this.enabled)return;const t=[];for(const r of this.cache.keys())e(r)&&t.push(r);for(const r of t)this.cache.delete(r),this.cacheDependencies.delete(r)}generateContext(e){try{return p.cloneDeep(e)}catch(t){return this.log.error("Error in cache generateContext",t),e}}getCacheName(e,t){const r=N(t);return e+"_"+r}getStats(){const e=this.hitCount+this.missCount,t=e>0?this.hitCount/e:0;return{size:this.cache.size,hitRate:t,totalEntries:this.cache.size,entriesWithDependencies:this.cacheDependencies.size,hits:this.hitCount,misses:this.missCount}}}const ie=(n,e="")=>`${n}#${e}`,oe=n=>`${n.gt}_${n.gte}_${n.lt}_${n.lte}_${n.eq}_${n.ne}`,ae=n=>`${n.gt}_${n.gte}_${n.lt}_${n.lte}_${n.eq}_${n.ne}`,ue=(n,e)=>{const t=typeof e=="function"?e:r=>r[e];return[...n.reduce((r,s)=>{const o=s==null?s:t(s);return r.has(o)||r.set(o,s),r},new Map).values()]},ce=(n,e)=>n.reduce(function(t,r){const s=typeof e=="function"?e(r):r[e];return Object.prototype.hasOwnProperty.call(t,s)||(t[s]=[]),t[s].push(r),t},{});function z(n=10){let e="";const t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";for(let r=0;r<n;r++)e+=t.charAt(Math.floor(Math.random()*t.length));return e}const fe=n=>n.replace(/\/+$/,""),P=n=>typeof n!="string"?"":n.replace(/[[\]{}()*+?.,\\^$|#]/g,"\\$&"),le=n=>typeof n!="string"?"":n.replace(/\\([[\]{}()*+?.,\\^$|#])/g,"$1"),de=(n,e)=>{try{return R(n,e)>=0}catch{return!1}},R=(n,e)=>{if(!K(n)||!K(e))throw new Error(`Invalid version format: v1="${n}", v2="${e}". Expected format: "x.y.z"`);const t=n.split(".").map(Number),r=e.split(".").map(Number);for(let s=0;s<3;s++){const o=t[s]||0,i=r[s]||0;if(o>i)return 1;if(o<i)return-1}return 0},K=n=>/^\d+(\.\d+){0,2}$/.test(n);class he{key;parentCd;dcuplInitOptions;analyticsController;off;updateListener=new Set;counter=0;constructor(){}_init(e){this.key=e.cdRefKey,this.analyticsController=e.analyticsController,this.parentCd=e.parentCd,this.dcuplInitOptions=e.dcuplInitOptions,this.parentCd&&(this.off=this.parentCd.on(t=>{t.action==="update"&&t.originCdRefKey===this.parentCd?.key&&(t.connectMessage=!1,this.trigger(t))}))}getCounter(){return this.parentCd?this.parentCd.getCounter():this.counter}increaseCounter(){this.parentCd?this.parentCd.increaseCounter():this.counter++}destroy(){this.off&&this.off()}trigger(e){e.originCdRefKey||(e.originCdRefKey=this.key),e.key||(this.increaseCounter(),e.key=this.getCounter()),e.end||(e.end=A.now(),e.duration=e.start-e.end),this.updateListener.forEach(t=>{t(e)})}on(e){return this.updateListener.add(e),()=>{this.updateListener.delete(e)}}}const k=(n,e)=>e?typeof structuredClone<"u"?structuredClone(n):p.cloneDeep(n):n,O=(n,e,t,r,s,o)=>{try{const i=!!e.dcuplInitOptions.performance?.clone?.enabled&&!!t.cloneResult,a=k(o,i);if(t.scope==="list"&&(t.listKey=n.cdRef?.key||n.key,t.modelKey=n.model?.key||n.modelKey),t.type==="list_created"&&t.args[0].listKey.startsWith("__global_list__")||t.listKey?.startsWith("__global_list__"))return a;const u=A.now(),c=u-r,f=Math.round(c*1e3)/1e3;t.duration=f,t.start=r,t.end=u;const l={duration:t.duration};return t.modelKey&&(l.model=t.modelKey),t.connectMessageResult&&(t.result=a),t.args&&(l.args=t.args),e?.trigger(t),e.analyticsController.mark({name:`${t.type}:end`,context:s}),e.analyticsController.measure({name:t.type,start:`${t.type}:start`,end:`${t.type}:end`,context:s,detail:l}),a}catch{return o}},pe=n=>(t,r,s)=>{const o=s.value;return s.value=function(...i){const a=A.now(),u=this.cdRef,c=k(n,!0);c.key||(u.increaseCounter(),c.key=u.getCounter());const f=z();u.analyticsController.mark({name:`${c.type}:start`,context:f});const l=this.model?.key;!c.originCdRefKey&&u.key&&(c.originCdRefKey=u.key),l&&(c.modelKey=l);const d=o.apply(this,i);return c.method=r,c.args=i,d&&typeof d=="object"&&"then"in d?d.then(h=>O(this,u,c,a,f,h)):O(this,u,c,a,f,d)},s};function ge(n,e,t,r){t.max||(t.max=20);const s=[],o=t.transform?r.transformValue(t.value,t.transform):t.value;for(const[i,a]of e.entries()){const u=Array.from(a).some(f=>n.has(f)),c=t.transform?r.transformValue(i,t.transform):i;if(!(t.excludeUndefineds&&typeof i>"u")&&!(t.excludeNulls&&i===null)){if(u&&(o===""||o==="//")){const f={value:i,keys:t.calculateResultKeys?Array.from(a):[]};s.push(f)}else if(u&&typeof o=="string"&&o.startsWith("/")&&o.endsWith("/")){if(r.queryFind(c,o,"some")){const f={value:i,keys:t.calculateResultKeys?Array.from(a):[]};s.push(f)}}else if(u&&typeof o=="string"){const f=String(c??""),l=o;if(f.toLowerCase().startsWith(l.toLowerCase())){const d={value:i,keys:t.calculateResultKeys?Array.from(a):[]};s.push(d)}}else if(u&&r.queryFind(c,o,"some")){const f={value:i,keys:t.calculateResultKeys?Array.from(a):[]};s.push(f)}if(s.length===t.max)break}}return s}function j(n){return n instanceof Date}function _(n){return n instanceof Date&&!isNaN(n.getTime())}const ye={yyyy:{type:"year",pattern:"yyyy",regex:"(\\d{4})"},yy:{type:"year",pattern:"yy",regex:"(\\d{2})"},MM:{type:"month",pattern:"MM",regex:"(\\d{2})"},M:{type:"month",pattern:"M",regex:"(\\d{1,2})"},dd:{type:"day",pattern:"dd",regex:"(\\d{2})"},d:{type:"day",pattern:"d",regex:"(\\d{1,2})"},HH:{type:"hour",pattern:"HH",regex:"(\\d{2})"},H:{type:"hour",pattern:"H",regex:"(\\d{1,2})"},mm:{type:"minute",pattern:"mm",regex:"(\\d{2})"},m:{type:"minute",pattern:"m",regex:"(\\d{1,2})"},ss:{type:"second",pattern:"ss",regex:"(\\d{2})"},s:{type:"second",pattern:"s",regex:"(\\d{1,2})"},SSS:{type:"millisecond",pattern:"SSS",regex:"(\\d{3})"}};function me(n){let e="^";const t=[];let r=n;const s=Object.entries(ye).sort((o,i)=>i[0].length-o[0].length);for(;r.length>0;){let o=!1;for(const[i,a]of s)if(r.startsWith(i)){e+=a.regex,t.push({type:a.type,pattern:i}),r=r.slice(i.length),o=!0;break}if(!o){const i=r[0];if(!i)break;e+=i.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),r=r.slice(1)}}return e+="$",{regex:new RegExp(e),tokenOrder:t}}function ve(n,e){const t={year:1970,month:1,day:1,hour:0,minute:0,second:0,millisecond:0};for(let r=0;r<e.length;r++){const s=n[r+1];if(!s)continue;const o=parseInt(s,10),i=e[r];i&&(i.type==="year"&&i.pattern==="yy"?t.year=2e3+o:t[i.type]=o)}return t}function we(n){if(n.month<1||n.month>12)return new Date(NaN);if(n.day<1||n.day>31)return new Date(NaN);if(n.hour<0||n.hour>23)return new Date(NaN);if(n.minute<0||n.minute>59)return new Date(NaN);if(n.second<0||n.second>59)return new Date(NaN);if(n.millisecond<0||n.millisecond>999)return new Date(NaN);const e=new Date(n.year,n.month-1,n.day,n.hour,n.minute,n.second,n.millisecond);return _(e)?e.getFullYear()!==n.year||e.getMonth()!==n.month-1||e.getDate()!==n.day?new Date(NaN):e:new Date(NaN)}function xe(n,e,t){if(n=n.trim(),e==="t"){const a=Number(n);return isNaN(a)?new Date(NaN):new Date(a*1e3)}if(e==="T"){const a=Number(n);return isNaN(a)?new Date(NaN):new Date(a)}const{regex:r,tokenOrder:s}=me(e),o=n.match(r);if(!o)return new Date(NaN);const i=ve(o,s);return we(i)}class Ae{cache;maxSize;accessOrder;constructor(e){this.cache=new Map,this.maxSize=e,this.accessOrder=[]}get(e){const t=this.cache.get(e);return t!==void 0&&this.updateAccessOrder(e),t}set(e,t){if(this.cache.has(e))this.cache.set(e,t),this.updateAccessOrder(e);else{if(this.cache.size>=this.maxSize){const r=this.accessOrder.shift();r!==void 0&&this.cache.delete(r)}this.cache.set(e,t),this.accessOrder.push(e)}}has(e){return this.cache.has(e)}clear(){this.cache.clear(),this.accessOrder=[]}get size(){return this.cache.size}updateAccessOrder(e){const t=this.accessOrder.indexOf(e);t>-1&&this.accessOrder.splice(t,1),this.accessOrder.push(e)}getStats(){return{size:this.cache.size,maxSize:this.maxSize}}}class be{graph;constructor(){this.graph=new Map}addDependency(e,t){this.graph.has(e)||this.graph.set(e,new Set),this.graph.get(e).add(t)}hasCycle(e){if(e.length===0)return!1;const t=new Set,r=new Set,s=o=>{t.add(o),r.add(o);const i=this.graph.get(o);if(i){for(const a of i)if(t.has(a)){if(r.has(a))return!0}else if(s(a))return!0}return r.delete(o),!1};for(let o=0;o<e.length-1;o++){const i=e[o],a=e[o+1];i&&a&&this.addDependency(i,a)}for(const o of e)if(!t.has(o)&&s(o))return!0;return!1}clear(){this.graph.clear()}}class W{parseCache;circularRefDetector;cacheHits=0;cacheMisses=0;constructor(e=1e3){this.parseCache=new Ae(e),this.circularRefDetector=new be}parse(e){if(this.parseCache.has(e))return this.cacheHits++,this.parseCache.get(e);this.cacheMisses++;let t,r;const s=e.includes("."),o=e.includes("["),i=s||o;if(i)if(r=e.split(/[.[]/)[0],o){const u=e.indexOf("]");if(u>-1){const c=e.indexOf(".",u+1);c>-1?t=e.substring(c+1):t=void 0}else s&&(t=e.substring(e.indexOf(".")+1))}else s&&(t=e.substring(e.indexOf(".")+1));const a={attribute:e,isDeepQuery:i};return r&&(a.reference=r),typeof t<"u"&&t!==""&&(a.referenceAttribute=t),this.parseCache.set(e,a),a}detectCircular(e){return e.length===0?!1:new Set(e).size!==e.length?!0:this.circularRefDetector.hasCycle(e)}validatePath(e,t=10){const r=[];if(!e||e.trim().length===0)return r.push("Attribute path cannot be empty"),{valid:!1,errors:r};(e.startsWith(".")||e.endsWith("."))&&r.push(`Invalid path: Leading or trailing dots are not allowed: ${e}`),e.includes("..")&&r.push(`Invalid path: Consecutive dots are not allowed: ${e}`);const s=(e.match(/\[/g)||[]).length,o=(e.match(/]/g)||[]).length;s!==o&&r.push(`Invalid bracket notation: Mismatched brackets in ${e}`),e.includes("[]")&&r.push(`Invalid bracket notation: Empty brackets not allowed: ${e}`);const i=/\[([^\]]+)\]/g;let a;for(;(a=i.exec(e))!==null;){const f=a[1];f&&f!=="*"&&!/^\d+$/.test(f)&&r.push(`Invalid bracket content: Must be a number or '*', got '${f}' in ${e}`)}const u=(e.match(/\./g)||[]).length+1;u>t&&r.push(`Path too deep: Maximum depth is ${t}, got ${u} in ${e}`);const c=e.match(/[^a-zA-Z0-9._[\]*-]/g);return c&&r.push(`Invalid characters in path: ${c.join(", ")} in ${e}`),{valid:r.length===0,errors:r.length>0?r:void 0}}clearCache(){this.parseCache.clear(),this.cacheHits=0,this.cacheMisses=0}clearCircularDetector(){this.circularRefDetector.clear()}getCacheStats(){const e=this.parseCache.getStats(),t=this.cacheHits+this.cacheMisses,r=t>0?this.cacheHits/t:0;return{...e,hits:this.cacheHits,misses:this.cacheMisses,hitRate:r}}getPathSegments(e){return e.replace(/\[[^\]]+\]/g,"").split(".").filter(r=>r.length>0)}getPathDepth(e){return this.getPathSegments(e).length}}const m=new W;function w(n,e){if(e.includes("[*]")){const o=e.indexOf("[*]"),i=e.substring(0,o),a=e.substring(o+3),u=i?p.get(n,i):n;if(!Array.isArray(u))return[];const c=[];for(const f of u)!a||a===""?f!==void 0&&c.push(f):a.startsWith(".")&&c.push(...w(f,a.slice(1)));return c}const t=e.split(".");let r=[n];for(const o of t){const i=[];for(const a of r)if(a!=null)if(Array.isArray(a))for(const u of a){if(u==null)continue;const c=u[o];c!==void 0&&i.push(c)}else{const u=a[o];u!==void 0&&i.push(u)}if(r=i,r.length===0)return[]}const s=[];for(const o of r)if(Array.isArray(o))for(const i of o)i!==void 0&&s.push(i);else o!==void 0&&s.push(o);return s}function I(n){let e=0;for(let t of n){const r=t.toString().split(".")[1];r&&(e=Math.max(e,r.length))}return Math.pow(10,e)}function $(n,e,t){return(n*t+e*t)/t}function De(n,e,t){return n*t/(e*t)}const S=(n,e,t,r)=>{if(!r)throw new Error("Attribute not found");const s={attribute:r,types:n.types};let o;(s.types.includes("sum")||s.types.includes("avg"))&&(o=Ke(r,e));let i;return(s.types.includes("min")||s.types.includes("max"))&&(i=Ie(r,e)),n.types.forEach(a=>{a==="sum"?s.sum=o?.sum:a==="avg"?s.avg=o?.average:a==="count"?s.count=Se(r,e):a==="min"?s.min=i&&i[0]:a==="max"?s.max=i&&i[1]:a==="distinct"?s.distinct=L(n,e,t):a==="group"&&(s.group=Qe(n,e))}),s},Se=(n,e)=>{const r=m.parse(n).isDeepQuery;let s=0;for(const o of e.values())if(o)if(r)s+=w(o,n).filter(i=>i!=null).length;else{const i=o[n];if(i==null)continue;Array.isArray(i)?s+=i.filter(a=>a!=null).length:s++}return s},Ie=(n,e)=>{let t,r;const o=m.parse(n).isDeepQuery;for(const i of e.values()){if(!i)continue;let a;if(o)a=w(i,n);else{const u=i[n];u===void 0?a=[]:Array.isArray(u)?a=u.filter(c=>c!==void 0):a=[u]}for(const u of a)u==null||typeof u=="object"||((t===void 0||u<t)&&(t=u),(r===void 0||u>r)&&(r=u))}if(!(t===void 0||r===void 0))return[t,r]},Qe=(n,e)=>{const t=[];n.groupOptions?.groups?.forEach(i=>{t.push({option:i,count:0,keys:[]})});const r={option:{value:["$dcupl_not_found"]},count:0,keys:[]},o=m.parse(n.attribute).isDeepQuery;for(const i of e.values()){let a;o?a=w(i,n.attribute):a=[i[n.attribute]];let u=!1;for(const c of a)for(const f of t)(typeof f.option.value<"u"&&f.option.value.includes(c)||typeof f.option.from<"u"&&f.option.from<c&&typeof f.option.to<"u"&&f.option.to>c)&&(f.keys.includes(i.key)||(f.count++,f.keys.push(i.key)),u=!0);!u&&n?.groupOptions?.calculateNotFound&&(r.count++,r.keys.push(i.key))}return n?.groupOptions?.calculateNotFound&&t.push(r),t},Ke=(n,e)=>{let t=0,r=0;const o=m.parse(n).isDeepQuery;for(const a of e.values()){if(!a)continue;let u;if(o)u=w(a,n);else{const c=a[n];c===void 0?u=[]:Array.isArray(c)?u=c:u=[c]}for(const c of u)if(Array.isArray(c))for(const f of c)typeof f=="number"&&(t=$(t,f,I([t,f])),r++);else typeof c=="number"&&(t=$(t,c,I([t,c])),r++)}return r===0?void 0:{average:De(t,r,I([t,r])),count:r,sum:t}},L=(n,e,t)=>{const r=[];for(const[s,o]of t)if(!(n.excludeUndefineds&&typeof s>"u")&&Array.from(o).find(i=>e.has(i))){const i={value:s,count:o.size};if(n.distinctOptions?.skipKeys||(i.keys=Array.from(o)),r.push(i),n.distinctOptions?.limit&&r.length>=n.distinctOptions.limit)break}return r};class b extends Error{query;constructor(e,t){const r=`Query Error: ${e} in ${JSON.stringify(t,null,2)}`;super(r),this.query=t,this.name="DcuplQueryError"}}class C{_defaultQueryOptions={modelKey:"",groupKey:"root",groupType:"and",queries:[]};_initOptions;currentQuery=p.cloneDeep(this._defaultQueryOptions);deepQueryService;constructor(e){this.deepQueryService=e||m}init(e){this._initOptions=p.cloneDeep(e),this.currentQuery=p.cloneDeep(this._defaultQueryOptions),this.currentQuery.modelKey=e.modelKey,"queries"in e&&Array.isArray(e.queries)&&(e.groupType&&(this.currentQuery.groupType=e.groupType),e.queries&&(this.currentQuery.queries=p.cloneDeep(e.queries)),e.count!==void 0&&(this.currentQuery.count=e.count),e.start!==void 0&&(this.currentQuery.start=e.start),e.sort&&(this.currentQuery.sort=e.sort),e.projection&&(this.currentQuery.projection=e.projection))}reset(){return this.init(this._initOptions),this.getQuery()}isQuery(e){return"attribute"in e}isQueryGroup(e){return"groupKey"in e}isRootQueryGroup(e){return this.isQueryGroup(e)&&e.groupKey==="root"}getQueryGroup(e){return this.currentQuery.queries.find(t=>this.isQueryGroup(t)&&t.groupKey===e)}getQuery(){return p.cloneDeep(this.currentQuery)}hasQueryGroup(e){return this.currentQuery.queries.some(t=>this.isQueryGroup(t)&&t.groupKey===e)}has(e){if(e.groupKey&&e.queryKey){const t=this.getQueryGroup(e.groupKey);if(t)return t.queries.some(r=>this.isQuery(r)&&r.queryKey===e.queryKey)}else if(e.groupKey)return this.hasQueryGroup(e.groupKey);return!1}validate(e){const t=e.queries.map(s=>this.validateQuery(s));return{valid:p.every(t,s=>s.valid),errors:t.map(s=>s.errors).flat()}}applyOptions(e,t="update"){return t==="set"?(this.currentQuery.count=e.count,this.currentQuery.start=e.start,this.currentQuery.sort=e.sort,this.currentQuery.projection=e.projection):(typeof e?.sort<"u"&&(this.currentQuery.sort=e.sort),typeof e?.count<"u"&&(this.currentQuery.count=e.count),typeof e?.start<"u"&&(this.currentQuery.start=e?.start),typeof e?.projection<"u"&&(this.currentQuery.projection=e?.projection)),this.getQuery()}applyQuery(e,t,r){if(r||(r=this.currentQuery),Array.isArray(e))for(const s of e)this.applyQuery(s,t,r);else if(this.isRootQueryGroup(e))e.groupType&&(r.groupType=e.groupType),t?.mode==="set"?r.queries=e.queries:r.queries=[...r.queries,...e.queries],this.applyOptions(e,"set");else if(this.isQuery(e)){const s=r.queries.findIndex(o=>this.isQueryGroup(o)&&o.groupKey===e.attribute);if(s>-1){const o=r.queries[s];t?.mode==="set"?o.queries=[e]:o.queries.push(e)}else r.queries.push({groupKey:e.attribute,groupType:"or",queries:[e]})}else if(this.isQueryGroup(e)){const s=r.queries.findIndex(o=>this.isQueryGroup(o)&&o.groupKey===e.groupKey);if(s>-1){const o=r.queries[s];e.groupType&&(o.groupType=e.groupType),t?.mode==="set"?r.queries[s]=e:o.queries=[...o.queries,...e.queries]}else r.queries.push({groupKey:e.groupKey,groupType:e.groupType||"or",queries:e.queries})}return r}removeAllQueries(){return this.currentQuery.queries=[],this.getQuery()}removeQuery(e,t){if(t||(t=this.currentQuery),this.isQuery(e)){const r=t.queries.findIndex(s=>this.isQueryGroup(s)&&s.groupKey===e.attribute);if(r>-1){const s=t.queries[r],o=p.findIndex(s.queries,e);o>-1&&s.queries.splice(o,1),s.queries.length===0&&t.queries.splice(r,1)}}else if(this.isQueryGroup(e)){const r=t.queries.findIndex(s=>this.isQueryGroup(s)&&s.groupKey===e.groupKey);if(r>-1)if(!e.queries)t.queries.splice(r,1);else{const s=t.queries[r];for(const o of e.queries){const i=p.findIndex(s.queries,o);i>-1&&s.queries.splice(i,1)}s.queries.length===0&&t.queries.splice(r,1)}}return t}validateQuery(e){const t=[];if(this.isQuery(e))return e.attribute||t.push(new b("Missing attribute",e)),e.operator||t.push(new b("Missing operator",e)),typeof e.value>"u"&&t.push(new b("Missing value",e)),e.operator==="find"&&Array.isArray(e.value)&&t.push(new b("find operator cannot have array value",e)),t.length>0?{valid:!1,errors:t}:{valid:!0};if(this.isQueryGroup(e)){const o=e.queries.map(i=>this.validateQuery(i)).filter(i=>!i.valid).map(i=>i.errors).flat();return o.length>0?{valid:!1,errors:o}:{valid:!0}}return t.push(new b("Invalid query definition",e)),{valid:!1,errors:t}}getQueryAttributes(e){const t=[],r=new Set,s=o=>{for(const i of o)this.isQuery(i)?i.attribute&&!r.has(i.attribute)&&(t.push(i.attribute),r.add(i.attribute)):this.isQueryGroup(i)&&s(i.queries)};return s(e?.queries||this.currentQuery.queries),t}extractQueryAttributes(e){const t=[],r=new Set,s=o=>{for(const i of o)if(this.isQuery(i)){if(i.attribute&&!r.has(i.attribute)){const a=this.getQueryAttributeForString(i.attribute);t.push(a),r.add(i.attribute)}}else this.isQueryGroup(i)&&s(i.queries)};return s(e?.queries||this.currentQuery.queries),t}getQueryAttributeForString(e){return this.deepQueryService.parse(e)}getDeepQueryService(){return this.deepQueryService}getProjectionForAttributes(e){const t={};return e.forEach(r=>{t[r]=!0}),t}getProjectionForAttributeEntries(e){const t={$:!0};return e.forEach(r=>{if(r.isDeepQuery){if(r.reference)if(r.referenceAttribute&&r.referenceAttribute.length>0){t[r.reference]||(t[r.reference]={$:!0});const s=this.deepQueryService.parse(r.referenceAttribute);if(s.isDeepQuery&&r.reference){const o=this.getProjectionForAttributeEntries([s]);Object.keys(o).forEach(i=>{i!=="$"&&r.reference&&(t[r.reference][i]=o[i])})}else r.reference&&(t[r.reference][r.referenceAttribute]=!0)}else t[r.reference]=!0}else t[r.attribute]=!0}),t}getAttributeNames(e){return this.getQueryAttributes(e)}getAttributeDetails(e){return this.extractQueryAttributes(e||this.currentQuery)}getCurrentAttributeNames(){return this.getAttributeNames(this.currentQuery)}getCurrentAttributeDetails(){return this.getAttributeDetails(this.currentQuery)}addCondition(e){return this.applyQuery(e,{mode:"add"})}addGroup(e){return this.applyQuery(e,{mode:"add"})}setCondition(e){return this.applyQuery(e,{mode:"set"})}setGroup(e){return this.applyQuery(e,{mode:"set"})}mergeQuery(e){if(e.queries&&Array.isArray(e.queries))for(const t of e.queries)this.applyQuery(t,{mode:"add"});return this.currentQuery}replaceQuery(e){return this.currentQuery.queries=[],e.groupType&&(this.currentQuery.groupType=e.groupType),e.queries&&Array.isArray(e.queries)&&(this.currentQuery.queries=e.queries),this.currentQuery}clear(){return this.reset()}clearConditions(){return this.removeAllQueries()}getCurrentQuery(){return this.getQuery()}isEmpty(){return this.currentQuery.queries.length===0}hasCondition(e){const t=r=>{for(const s of r)if(this.isQuery(s)){let o=!0;for(const i in e)if(s[i]!==e[i]){o=!1;break}if(o)return!0}else if(this.isQueryGroup(s)&&t(s.queries))return!0;return!1};return t(this.currentQuery.queries)}hasGroup(e){return this.hasQueryGroup(e)}getUsedAttributes(){return this.getAttributeNames()}getDeepQueryAttributes(){return this.getAttributeDetails().filter(t=>t.isDeepQuery)}getGroups(){return this.currentQuery.queries.filter(e=>this.isQueryGroup(e))}getTopLevelConditions(){return this.currentQuery.queries.filter(e=>this.isQuery(e))}getGroup(e){return this.getQueryGroup(e)}getConditionCount(){const e=t=>{let r=0;for(const s of t)this.isQuery(s)?r++:this.isQueryGroup(s)&&(r+=e(s.queries));return r};return e(this.currentQuery.queries)}}const M=new C;function Me(n,e,t,r,s,o,i){const a=M.removeQuery({groupKey:s},p.cloneDeep(r)),u=i.queryData(n,a,!1,o),c=e?[...e.keys()]:[],f=new Set(c),l=o.get(s);if(!t.excludeUnresolved)for(const h of l.keys())f.add(h);if(t.excludeUndefineds?f.delete(void 0):f.add(void 0),t.sort){const h=[];for(const v of f.values())h.push(T(v,l,u,e,s,r,!0));const y=t.excludeZeros?h.filter(v=>v.size>0):h;return y.sort(Ne(t.sort)),t.count?y.slice(0,t.count):y}const d=[];for(const h of f.values()){const y=T(h,l,u,e,s,r,!!t?.calculateFacets);if(!(t?.excludeZeros&&y.size===0)){if(t?.count&&d.length===t?.count)return d;d.push(y)}}return d}function T(n,e,t,r,s,o,i){const a=new Map,u=e.get(n)||new Set;for(const c of u){const f=t.get(c);if(f&&(a.set(c,f),!i))break}return{key:String(n),value:n,selected:ke(s,n,o),enabled:a.size>0,size:a.size,entry:r.get(n),resultKeys:Array.from(a.keys())}}function D(n,e){if(n===void 0&&e===void 0)return 0;if(n===void 0)return 1;if(e===void 0)return-1;const t=typeof n,r=typeof e;if(t!==r)return t<r?-1:1;if(t==="number")return n-e;if(t==="string")return n.localeCompare(e);const s=String(n),o=String(e);return s<o?-1:s>o?1:0}function Ne(n){switch(n){case"size-desc":return(e,t)=>t.size-e.size||D(e.value,t.value);case"size-asc":return(e,t)=>e.size-t.size||D(e.value,t.value);case"value-asc":return(e,t)=>D(e.value,t.value);case"value-desc":return(e,t)=>e.value===void 0&&t.value===void 0?0:e.value===void 0?1:t.value===void 0?-1:-D(e.value,t.value)}}const ke=(n,e,t)=>{const r=t.queries.findIndex(s=>M.isQueryGroup(s)&&s.groupKey===n);return r>-1?!!t.queries[r].queries.find(o=>{if(M.isQuery(o)){const i=o.value?.key||o.value;return o.attribute===n&&i===e}return!1}):!1};class V{indexMap=new Map;dataMap=new Map;indexMetadata=new Map;constructor(){}reset(e){e?(this.indexMap.delete(e),this.dataMap.delete(e),this.indexMetadata.delete(e)):(this.indexMap.clear(),this.dataMap.clear(),this.indexMetadata.clear())}fillDataMap(e,t){let r=this.dataMap.get(e);r||(r=new Map,this.dataMap.set(e,r));for(const s of t){let o;if(typeof s=="object"&&s&&s.key)o=s.key;else if(Array.isArray(s)){for(const a of s)this.fillDataMap(e,[a]);return}else s instanceof Date?o=s.toISOString():o=s;let i=r.get(o);i||(i={key:o},this.dataMap.get(e)?.set(o,i))}}fillInverseIndex(e,t,r){if(!e||!t||!r||!Array.isArray(r))return;const s=this.indexMap.get(e)||new Map;for(const o of r){let i;if(typeof o=="object"&&o&&o.key)i=o.key;else if(Array.isArray(o)){for(const u of o)this.fillInverseIndex(e,t,[u]);return}else o instanceof Date?i=o.toISOString():i=o;let a=s.get(i);a||(a=new Set,s.set(i,a)),a.add(t)}this.indexMap.set(e,s)}getIndex(e,t){const r=this.getIndexName(e,t);return this.indexMap.get(r)}getData(e,t){const r=this.getIndexName(e,t);return this.dataMap.get(r)}getOrCreateIndex(e,t,r){const s=this.getIndexName(e,r);let o=this.getIndex(s);const i=this.indexMetadata.get(s);if(i)i.lastAccessedAt=Date.now();else if(!o){const u=m.parse(e).isDeepQuery??!1;this.indexMetadata.set(s,{createdAt:Date.now(),lastAccessedAt:Date.now(),context:r,type:u?"deep":"shallow"})}if(!o){this.reset(s),this.indexMap.set(s,new Map);const u=m.parse(e).isDeepQuery;for(const c of t.values()){let f;u?(f=w(c,e),f.length===0&&(f=[void 0])):f=[c[e]],this.fillInverseIndex(s,c.key,f),this.fillDataMap(s,f)}o=this.getIndex(s)||new Map}return o}getIndexName(e,t){return t?e+"_"+N(t):e}removeFromInverseIndex(e,t,r){const s=this.indexMap.get(e);if(s)for(const o of r){let i;if(typeof o=="object"&&o&&o.key)i=o.key;else if(Array.isArray(o)){for(const u of o)this.removeFromInverseIndex(e,t,[u]);return}else o instanceof Date?i=o.toISOString():i=o;const a=s.get(i);a&&(a.delete(t),a.size===0&&s.delete(i))}}updateInverseIndex(e,t,r,s){this.removeFromInverseIndex(e,t,r),this.fillInverseIndex(e,t,s)}removeFromDataMap(e,t){const r=this.dataMap.get(e);if(r)for(const s of t){let o;if(typeof s=="object"&&s&&s.key)o=s.key;else if(Array.isArray(s)){for(const i of s)this.removeFromDataMap(e,[i]);return}else s instanceof Date?o=s.toISOString():o=s;r.delete(o)}}updateDataMap(e,t,r){this.removeFromDataMap(e,t),this.fillDataMap(e,r)}removeItemFromAllIndices(e){for(const t of this.indexMap.values())for(const[r,s]of t)s.delete(e)&&s.size===0&&t.delete(r);for(const t of this.dataMap.values())t.has(e)&&t.delete(e)}resetAttributes(e){for(const t of e)this.reset(t)}isDeepQueryIndex(e){const t=e.includes("_")?e.split("_")[0]:e;try{return m.parse(t).isDeepQuery??!1}catch{return!1}}getDeepIndexKeys(){const e=[];for(const t of this.indexMap.keys())this.isDeepQueryIndex(t)&&e.push(t);return e}resetAllDeepIndices(){const e=this.getDeepIndexKeys();for(const t of e)this.indexMap.delete(t),this.dataMap.delete(t)}getIndexCount(){let e=0,t=0;for(const r of this.indexMap.keys())this.isDeepQueryIndex(r)?t++:e++;return{shallow:e,deep:t,total:e+t}}cleanupStaleIndices(e=300*1e3){const t=Date.now();let r=0;for(const[s,o]of this.indexMetadata)t-o.lastAccessedAt>e&&(this.reset(s),r++);return r}getStats(){const e=this.getIndexCount(),t=Date.now();let r=0,s=0;for(const i of this.indexMetadata.values()){const a=t-i.createdAt;r+=a,a>s&&(s=a)}const o=this.indexMetadata.size>0?r/this.indexMetadata.size:0;return{shallow:e.shallow,deep:e.deep,total:e.total,oldestAge:s,avgAge:o}}}const x="__";function E(n,e,t={key:"root"},r="root",s=new V,o){const i=o||n;for(const a of e.columns)a.attribute&&(m.parse(a.attribute),s.getOrCreateIndex(a.attribute,i));for(const a of e.rows)a.attribute&&(m.parse(a.attribute),s.getOrCreateIndex(a.attribute,i));for(const a of e.values)a.attribute&&(m.parse(a.attribute),s.getOrCreateIndex(a.attribute,i));if(e.rows&&e.rows.length>0){t.rows=t.rows||[];const a=Ce(n,e.rows[0],e,s,r,o);t.rows.push(a)}if(e.columns&&e.columns.length>0){t.columns=t.columns||[];const a=H(n,e.columns[0],e,s,r,o);t.columns.push(a)}if(t.key==="root")for(const a of e.values){if(t.values=t.values||[],r==="root"&&e.options?.calculateTotals===!1)continue;const u=S(a,n,s.getIndex(a.attribute),a.attribute);t.values.push(u)}return t}function Ce(n,e,t,r,s="",o){const i={key:e.attribute},a=r.getIndex(e.attribute);if(!a)return i;for(const[u,c]of a.entries()){const f={key:u,value:u},l=new Map;for(const d of c)n.has(d)&&l.set(d,n.get(d));if(l.size){for(const d of t.values){if(f.values=f.values||[],s==="root"&&e?.calculateTotals===!1)continue;const h=S(d,l,r.getIndex(d.attribute),d.attribute);f.values.push(h)}if(i.rows=i.rows||[],i.rows.push(f),t.rows.length>1){const d={...t,rows:t.rows.slice(1)};E(l,d,f,s+x+e.attribute+x+u,r,o)}else if(t.columns)for(const d of t.columns){f.columns=f.columns||[];const h=H(l,d,t,r,s+x+e.attribute+x+u,o);f.columns.push(h)}}}return i}function H(n,e,t,r,s="",o){const i={key:e.attribute},a=r.getIndex(e.attribute);if(!a)return i;for(const[u,c]of a.entries()){const f={key:u,value:u},l=new Map;for(const d of c)n.has(d)&&l.set(d,n.get(d));if(l.size){for(const d of t.values){if(f.values=f.values||[],s==="root"&&e?.calculateTotals===!1)continue;const h=S(d,l,r.getIndex(d.attribute),d.attribute);f.values.push(h)}if(i.columns=i.columns||[],i.columns.push(f),t.columns.length>1){const d={...t,columns:t.columns.slice(1)};E(l,d,f,s+x+e.attribute+x+u,r,o)}}}return i}const Ee=/^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}(:\d{2}(\.\d+)?)?(Z|[+-]\d{2}:\d{2})?)?$/,qe=/^-?\d+$/,Oe=/^-?\d+\.\d+$/,$e=/^\d{1,2}([/.-])\d{1,2}\1\d{2,4}$/,U=n=>n==="true"||n==="false"?"boolean":qe.test(n)?"int":Oe.test(n)?"float":Ee.test(n)&&!Number.isNaN(Date.parse(n))?"date":"string",J=n=>$e.test(n),Te=n=>n==null||n==="",Fe=n=>{const e=[...n];return e.length<=1?{type:e[0]??"any",conflict:!1}:e.every(t=>t==="int"||t==="float")?{type:"float",conflict:!1}:{type:"any",conflict:!0}},Z=(n,e={})=>{const r=e.deep??(e.sampleSize!==void 0&&e.sampleSize>1)?e.sampleSize??1/0:1,s=e.coerceStrings??!0,o=new Map,i=[],a=Math.min(n.length,r);for(let f=0;f<a;f++){const l=n[f];if(l)for(const[d,h]of Object.entries(l)){let y=o.get(d);if(y||(y={observed:new Set,empty:0,scanned:0},o.set(d,y),i.push(d)),y.scanned++,Te(h)){y.empty++;continue}let v;typeof h=="string"&&s?(v=U(h),v==="string"&&!y.hint&&J(h)&&(y.hint="column looks date-like (non-ISO) — review manually")):v=ee(h),y.observed.add(v)}}const u=[],c=[];for(const f of i){const l=o.get(f),{type:d,conflict:h}=Fe(l.observed.size?l.observed:new Set(["string"]));u.push({key:f,type:d}),c.push({column:f,inferredType:d,observedTypes:[...l.observed].sort(),emptyRate:l.scanned===0?0:l.empty/l.scanned,conflict:h,hint:l.hint})}return{properties:u,diagnostics:c}},Ge=(n,e=!1)=>Z(n,typeof e=="boolean"?{deep:e}:e).properties,Y=n=>Number(n)===n&&n%1===0,X=n=>Number(n)===n&&n%1!==0,ee=n=>{switch(typeof n){case"string":return"string";case"number":return Y(n)?"int":X(n)?"float":"any";case"boolean":return"boolean";case"object":return j(n)?"date":"json";default:return"any"}},Be=(n,e)=>{const t=P(n.text||""),r=e?.attributeKey||n.filterKey;let s;const o=e?.comparisonType||"containsIgnoreCase";return o==="containsIgnoreCase"?s={groupKey:n.filterKey,queries:[{queryKey:n.text,attribute:r,value:`/${t}/`,operator:"find",options:{transform:["lowercase"]}}]}:o==="containsIgnoreCaseAndWhitespace"?s={groupKey:n.filterKey,queries:[{queryKey:n.text,attribute:r,value:`/${t}/`,operator:"find",options:{transform:["removeWhitespace","lowercase"]}}]}:o==="contains"?s={groupKey:n.filterKey,queries:[{queryKey:n.text,attribute:r,value:`/${t}/`,operator:"find"}]}:o==="equal"?s={groupKey:n.filterKey,queries:[{queryKey:n.text,attribute:r,value:n.text,operator:"eq"}]}:o==="equalIgnoreCase"&&(s={groupKey:n.filterKey,queries:[{queryKey:n.text,attribute:r,value:n.text,operator:"eq",options:{transform:["lowercase"]}}]}),s},ze=(n,e)=>{const t=e?.attributeKey||n.filterKey;return{groupKey:n.filterKey,queries:[{queryKey:n.value,attribute:t,value:n.value,operator:"eq"}]}},Pe=(n,e)=>{const t=e?.attributeKey||n.filterKey,r={groupKey:n.filterKey,queries:[]};return typeof n.eq<"u"&&(r.groupType="or",Array.isArray(n.eq)?n.eq.forEach(s=>{r.queries.push({attribute:t,value:s,operator:"eq"})}):r.queries.push({attribute:t,value:n.eq,operator:"eq"})),typeof n.ne<"u"&&(r.groupType="and",Array.isArray(n.ne)?n.ne.forEach(s=>{r.queries.push({attribute:t,value:s,operator:"eq",options:{invert:!0}})}):r.queries.push({attribute:t,value:n.ne,operator:"eq",options:{invert:!0}})),typeof n.gt<"u"&&(r.groupType="and",r.queries.push({attribute:t,value:n.gt,operator:"gt"})),typeof n.lt<"u"&&(r.groupType="and",r.queries.push({attribute:t,value:n.lt,operator:"lt"})),typeof n.gte<"u"&&(r.groupType="and",r.queries.push({attribute:t,value:n.gte,operator:"gte"})),typeof n.lte<"u"&&(r.groupType="and",r.queries.push({attribute:t,value:n.lte,operator:"lte"})),r},Re=(n,e)=>{const t=e?.attributeKey||n.filterKey,r={groupKey:n.filterKey,queries:[]};return n.itemKeys.forEach(s=>{r.queries.push({queryKey:s,attribute:t,value:{key:s},operator:"eq"})}),r},je=n=>!(typeof n.modelKey!="string"||!Array.isArray(n.queries));class _e{constructor(e,t,r){this.scriptController=e,this.globalItemService=t,this.modelParser=r}registeredCustomOperator=new Map;queryBuilder=new C;registerCustomOperator(e,t){this.registeredCustomOperator.set(e,t)}transformValue(e,t){if(Array.isArray(e))return e.map(r=>this.transformValue(r,t));if(typeof e!="string")return e;for(const r of t)r==="lowercase"?e=e.toLowerCase():r==="trim"?e=e.trim():r==="removeWhitespace"&&(e=e.replace(/\s/g,""));return e}evaluateQuery(e,t){let r,s=e.value;const o=e.options?.arrayValueHandling||"some";if(Array.isArray(e.options?.transform)&&e.options.transform.length>0&&(s=this.transformValue(s,e.options.transform)),e.attribute.includes(".")||e.attribute.includes("[")?r=p.get(t,e.attribute):r=t[e.attribute],Array.isArray(e.options?.transform)&&e.options.transform.length>0&&(r=this.transformValue(r,e.options.transform)),(typeof r>"u"||r===null)&&!["typeof","isTruthy","eq"].includes(e.operator))return!1;switch(e.operator){case"eq":return e.options?.invert?!p.isEqual(r,s):p.isEqual(r,s);case"find":return e.options?.invert?!this.queryFind(r,s,o):this.queryFind(r,s,o);case"lt":return Array.isArray(r)?o==="some"?r.some(i=>i<s):r.every(i=>i<s):r<s;case"gt":return Array.isArray(r)?o==="some"?r.some(i=>i>s):r.every(i=>i>s):r>s;case"lte":return Array.isArray(r)?o==="some"?r.some(i=>i<=s):r.every(i=>i<=s):r<=s;case"gte":return Array.isArray(r)?o==="some"?r.some(i=>i>=s):r.every(i=>i>=s):r>=s;case"typeof":return e.options?.invert?typeof r!==s:Array.isArray(r)?o==="some"?r.some(i=>typeof i===s):r.every(i=>typeof i===s):typeof r===s;case"isTruthy":return s===!0?Array.isArray(r)?o==="some"?r.some(i=>typeof!!i):r.every(i=>typeof!!i):!!r:!r;case"size":return typeof r=="string"?r.length===s:p.size(r)===s;default:if(this.scriptController.hasScript(e.operator))return this.scriptController.executeScript(e.operator,"operator",{query:e,item:t});if(this.registeredCustomOperator.has(e.operator)){const i=this.registeredCustomOperator.get(e.operator);if(typeof i=="function")return i(e,t)}}return!1}evaluateEqOperator(e,t,r,s){const o=new Map,i=s.get(t.attribute);if(i){let a;if(typeof t.value=="string"?a=t.value:t.value?.key&&Object.keys(t.value).length===1&&(a=t.value.key),typeof a<"u"){const u=i.get(a);if(u)if(u.forEach(c=>{r.has(c)&&o.set(c,r.get(c))}),t.options?.invert){const c=p.differenceBy(Array.from(r.values()),Array.from(o.values()),"key"),f=new Map;return c.forEach(l=>{f.set(l.key,l)}),f}else return o}}for(let[a,u]of r){const c=this.queryBuilder.extractQueryAttributes({queries:[t]});if(c.some(f=>f.isDeepQuery)){const f=this.queryBuilder.getProjectionForAttributeEntries(c.filter(l=>l.isDeepQuery));u=this.globalItemService.getProjectedData(f,this.modelParser.models.get(e.modelKey),u)}this.evaluateQuery(t,u)&&o.set(a,u)}return o}equalRegexFn(e,t){if(typeof t=="string"&&p.startsWith(t,"/")&&p.endsWith(t,"/"))try{return new RegExp(t.slice(1,-1)).test(e)}catch{return!1}else return Array.isArray(e)?!!e.find(r=>p.isEqualWith(r,t,this.equalRegexFn)):typeof t=="object"?p.isMatch(e,t):e===t}queryFind(e,t,r){return Array.isArray(e)?typeof t=="string"||typeof t=="number"||typeof t=="boolean"?r==="some"?e.some(s=>p.isEqualWith(s,t,this.equalRegexFn)):e.every(s=>p.isEqualWith(s,t,this.equalRegexFn)):!!p.find(e,t):p.isEqualWith(e,t,this.equalRegexFn)}validateQuery(e){if(this.queryBuilder.isQuery(e)){if(!e.attribute||!e.operator)throw new Error("invalid query - missing attribute or operator");if(e.operator==="find"&&Array.isArray(e.value))throw new Error("invalid query - find operator cannot have array value");return!0}else{if(this.queryBuilder.isQueryGroup(e))return p.every(e.queries,t=>this.validateQuery(t));throw new Error("invalid query - missing query or attribute")}}getEvaluatedQueryDataset(e,t,r,s){const o=new Map;if(t.attribute.includes("[*]")){const i=t.options?.invert===!0,a=new Set;for(let u of r.values()){const c=this.queryBuilder.extractQueryAttributes({queries:[t]});if(c.some(d=>d.isDeepQuery)){const d=this.queryBuilder.getProjectionForAttributeEntries(c.filter(h=>h.isDeepQuery));u=this.globalItemService.getProjectedData(d,this.modelParser.models.get(e.modelKey),u)}const f=this.handleArrayStarQuery(t,u);let l=!1;for(const d of f.queries){const h={...d,options:{...d.options,invert:!1}};if(this.evaluateQuery(h,u)){l=!0;break}}l&&(a.add(u.key),i||o.set(u.key,u))}if(i)for(const[u,c]of r)a.has(u)||o.set(u,c)}else{if(t.operator==="eq")return this.evaluateEqOperator(e,t,r,s);for(let[i,a]of r){const u=this.queryBuilder.extractQueryAttributes({queries:[t]});if(u.some(c=>c.isDeepQuery)){const c=this.queryBuilder.getProjectionForAttributeEntries(u.filter(f=>f.isDeepQuery));a=this.globalItemService.getProjectedData(c,this.modelParser.models.get(e.modelKey),a)}this.evaluateQuery(t,a)&&o.set(i,a)}}return o}handleArrayStarQuery(e,t){const r=e.attribute.indexOf("[*]"),s={groupKey:e.queryKey||e.attribute+"[*]",groupType:"or",queries:[]};if(r!==-1){const o=e.attribute.substring(0,r),i=o.includes(".")?p.get(t,o):t[o];if(Array.isArray(i))for(let a=0;a<i.length;a++){const u=e.attribute.replace("[*]",`[${a}]`);s.queries.push({attribute:u,operator:e.operator,value:e.value,options:e.options})}}return s}evaluateQueryGroup(e,t,r,s,o){let i=new Map,a=r;if(!t.queries||t.queries?.length===0)return a;for(const u of t.queries){let c=new Map;if(this.queryBuilder.isQuery(u)?c=this.getEvaluatedQueryDataset(e,u,a,o):c=this.evaluateQueryGroup(e,u,a,s,o),i.size===0&&(i=c),t.groupType==="or")c.forEach(f=>{i.set(f.key,f)});else{const f=p.differenceBy(Array.from(i.values()),Array.from(c.values()),"key");for(const l of f)i.delete(l.key)}t.groupType==="and"?a=i:a=r}return i}queryData(e,t,r,s){const o=new Map(e);return t.queries.length===0?e:(t.groupKey||(t.groupKey="root"),t.groupType||(t.groupType="and"),t.queries||(t.queries=[]),this.validateQuery(t),this.evaluateQueryGroup(t,t,o,r,s))}}class We{scripts=new Map;scriptFunctions=new Map;constructor(){}keys(){return Array.from(this.scripts.keys())}setScript(e,t){this.scripts.set(e,t)}removeScript(e){this.scripts.delete(e)}getScript(e){return this.scripts.get(e)}hasScript(e){return this.scripts.has(e)}getScriptAsFn(e,t){if(this.scriptFunctions.has(e))return this.scriptFunctions.get(e);const r=this.getScript(e);if(!r)throw new Error(`Script ${e} not found`);const s=this.getWrapperScript(r),o=new Function("script_type",...t,s);return this.scriptFunctions.set(e,o),o}getWrapperScript(e){return`
|
|
2
2
|
"use strict";
|
|
3
3
|
${e}
|
|
4
|
-
`}executeScript(e,t,r){if(!this.getScript(e))throw new Error(`Script ${e} not found`);r.context||(r.context=r.options||{});const
|
|
4
|
+
`}executeScript(e,t,r){if(!this.getScript(e))throw new Error(`Script ${e} not found`);r.context||(r.context=r.options||{});const o=Object.keys(r),i=Object.values(r);return this.getScriptAsFn(e,o)(t,...i)}}const Le=(n,e)=>n?(e||(e={}),n.replace(/\$\{(.*?)\}/g,(t,r)=>p.get(e,r.trim(),""))):"",Ve=n=>{const e=new Set;return n.replace(/\$\{(.*?)\}/g,(r,s)=>(e.add(s.trim()),"")),{variables:Array.from(e).map(r=>({name:r}))}},He=["any","Array<date>","Array<float>","Array<int>","Array<string>","boolean","date","float","int","json","string"],Ue=["int","float","Array<int>","Array<float>"],Je=["date","Array<date>"],Ze=["eq","find","gt","gte","lt","lte","typeof","isTruthy","size"];exports.AnalyticsController=re;exports.AttributeDependencyGraph=se;exports.CacheController=ne;exports.ChangeDetector=he;exports.DatePropertyTypes=Je;exports.DcuplQueryBuilder=C;exports.DcuplQueryOperatorsAsArray=Ze;exports.DeepQueryService=W;exports.DependencyGraph=F;exports.IndicesController=V;exports.Logger=g;exports.NumberPropertyTypes=Ue;exports.PropertyTypesAsArray=He;exports.QueryManager=_e;exports.ScriptController=We;exports.clone=k;exports.coerceStringType=U;exports.compareVersions=R;exports.computeSuggestions=ge;exports.deepQueryService=m;exports.escapeRegExp=P;exports.evaluateTemplate=Le;exports.generateBooleanQuery=ze;exports.generateKey=z;exports.generateNumberAndDateQuery=Pe;exports.generateReferenceQuery=Re;exports.generateTextQuery=Be;exports.getAggregation=S;exports.getDateConstraintUid=ae;exports.getDcuplPropertyTypeForNativeType=ee;exports.getDeepPathValues=w;exports.getDistinct=L;exports.getFacets=Me;exports.getFilterEntryId=ie;exports.getNumberConstraintUid=oe;exports.getPropertiesForData=Ge;exports.groupBy=ce;exports.hasMinimumVersion=de;exports.inferModel=Z;exports.isDateInstance=j;exports.isFloat=X;exports.isInt=Y;exports.isValidDate=_;exports.isValidQueryStatement=je;exports.isValidVersion=K;exports.logger=B;exports.looksDateLike=J;exports.parseDate=xe;exports.parseTemplate=Ve;exports.perf=A;exports.pivot=E;exports.removeTrailingSlash=fe;exports.trigger=pe;exports.unescapeRegExp=le;exports.uniqBy=ue;
|
|
5
5
|
//# sourceMappingURL=index.cjs.map
|