angular-odata 0.95.0 → 0.99.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2020/lib/resources/query/expressions/base.mjs +20 -0
- package/esm2020/lib/resources/query/expressions/compute.mjs +38 -0
- package/esm2020/lib/resources/query/expressions/expand.mjs +57 -0
- package/esm2020/lib/resources/query/expressions/filter.mjs +154 -0
- package/esm2020/lib/resources/query/expressions/index.mjs +7 -0
- package/esm2020/lib/resources/query/expressions/orderby.mjs +54 -0
- package/esm2020/lib/resources/query/expressions/search.mjs +113 -0
- package/esm2020/lib/resources/query/expressions/select.mjs +32 -0
- package/esm2020/lib/resources/query/expressions/syntax.mjs +371 -0
- package/esm2020/lib/resources/query/handlers.mjs +16 -14
- package/esm2020/lib/resources/query/options.mjs +2 -2
- package/esm2020/lib/resources/resource.mjs +2 -2
- package/esm2020/lib/resources/types/batch.mjs +31 -10
- package/fesm2015/angular-odata.mjs +359 -123
- package/fesm2015/angular-odata.mjs.map +1 -1
- package/fesm2020/angular-odata.mjs +359 -123
- package/fesm2020/angular-odata.mjs.map +1 -1
- package/lib/resources/query/expressions/base.d.ts +19 -0
- package/lib/resources/query/expressions/compute.d.ts +26 -0
- package/lib/resources/query/expressions/expand.d.ts +40 -0
- package/lib/resources/query/expressions/filter.d.ts +58 -0
- package/lib/resources/query/expressions/index.d.ts +6 -0
- package/lib/resources/query/expressions/orderby.d.ts +37 -0
- package/lib/resources/query/expressions/search.d.ts +47 -0
- package/lib/resources/query/expressions/select.d.ts +21 -0
- package/lib/resources/query/{syntax.d.ts → expressions/syntax.d.ts} +8 -6
- package/lib/resources/query/handlers.d.ts +24 -9
- package/lib/resources/types/batch.d.ts +9 -0
- package/package.json +1 -1
- package/esm2020/lib/resources/query/expressions.mjs +0 -207
- package/esm2020/lib/resources/query/syntax.mjs +0 -406
- package/lib/resources/query/expressions.d.ts +0 -63
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { QueryCustomType } from '../builder';
|
|
2
|
+
import { Renderable } from './syntax';
|
|
3
|
+
export declare abstract class Expression<T> implements Renderable {
|
|
4
|
+
protected _children: Renderable[];
|
|
5
|
+
constructor({ children, }?: {
|
|
6
|
+
children?: Renderable[];
|
|
7
|
+
});
|
|
8
|
+
get [Symbol.toStringTag](): string;
|
|
9
|
+
abstract render({ aliases, escape, prefix, }: {
|
|
10
|
+
aliases?: QueryCustomType[] | undefined;
|
|
11
|
+
escape?: boolean | undefined;
|
|
12
|
+
prefix?: string | undefined;
|
|
13
|
+
}): string;
|
|
14
|
+
children(): Renderable[];
|
|
15
|
+
length(): number;
|
|
16
|
+
toJSON(): {
|
|
17
|
+
children: any[];
|
|
18
|
+
};
|
|
19
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { QueryCustomType } from '../builder';
|
|
2
|
+
import { Expression } from './base';
|
|
3
|
+
import { ODataFunctions, ODataOperators, Renderable } from './syntax';
|
|
4
|
+
export declare class ComputeExpression<T> extends Expression<T> {
|
|
5
|
+
names: string[];
|
|
6
|
+
constructor({ children, names, }?: {
|
|
7
|
+
children?: Renderable[];
|
|
8
|
+
names?: string[];
|
|
9
|
+
});
|
|
10
|
+
static e<T>(): ComputeExpression<T>;
|
|
11
|
+
static s<T extends object>(): T;
|
|
12
|
+
static compute<T extends object>(opts: (e: {
|
|
13
|
+
s: T;
|
|
14
|
+
e: () => ComputeExpression<T>;
|
|
15
|
+
}) => ComputeExpression<T>): ComputeExpression<T>;
|
|
16
|
+
render({ aliases, escape, prefix, }?: {
|
|
17
|
+
aliases?: QueryCustomType[] | undefined;
|
|
18
|
+
escape?: boolean | undefined;
|
|
19
|
+
prefix?: string | undefined;
|
|
20
|
+
}): string;
|
|
21
|
+
private _add;
|
|
22
|
+
field<T extends object>(name: string, opts: (e: {
|
|
23
|
+
o: ODataOperators<T>;
|
|
24
|
+
f: ODataFunctions<T>;
|
|
25
|
+
}) => Renderable): ComputeExpression<T>;
|
|
26
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { QueryCustomType } from '../builder';
|
|
2
|
+
import { Expression } from './base';
|
|
3
|
+
import { Renderable } from './syntax';
|
|
4
|
+
export declare class ExpandField<T> implements Renderable {
|
|
5
|
+
protected field: Renderable;
|
|
6
|
+
constructor(field: Renderable);
|
|
7
|
+
get [Symbol.toStringTag](): string;
|
|
8
|
+
toJSON(): {
|
|
9
|
+
field: any;
|
|
10
|
+
};
|
|
11
|
+
render({ aliases, escape, prefix, }: {
|
|
12
|
+
aliases?: QueryCustomType[];
|
|
13
|
+
escape?: boolean;
|
|
14
|
+
prefix?: string;
|
|
15
|
+
}): string;
|
|
16
|
+
select(): void;
|
|
17
|
+
filter(): void;
|
|
18
|
+
levels(): void;
|
|
19
|
+
orderBy(): void;
|
|
20
|
+
top(): void;
|
|
21
|
+
skip(): void;
|
|
22
|
+
}
|
|
23
|
+
export declare class ExpandExpression<T> extends Expression<T> {
|
|
24
|
+
constructor({ children, }?: {
|
|
25
|
+
children?: Renderable[];
|
|
26
|
+
});
|
|
27
|
+
static e<T>(): ExpandExpression<T>;
|
|
28
|
+
static s<T extends object>(): T;
|
|
29
|
+
static expand<T extends object>(opts: (e: {
|
|
30
|
+
s: T;
|
|
31
|
+
e: () => ExpandExpression<T>;
|
|
32
|
+
}) => ExpandExpression<T>): ExpandExpression<T>;
|
|
33
|
+
render({ aliases, escape, prefix, }?: {
|
|
34
|
+
aliases?: QueryCustomType[] | undefined;
|
|
35
|
+
escape?: boolean | undefined;
|
|
36
|
+
prefix?: string | undefined;
|
|
37
|
+
}): string;
|
|
38
|
+
private _add;
|
|
39
|
+
field<T extends object>(field: any, opts?: (e: ExpandField<keyof T>) => void): ExpandExpression<T>;
|
|
40
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import type { QueryCustomType } from '../builder';
|
|
2
|
+
import { Expression } from './base';
|
|
3
|
+
import { ODataFunctions, ODataOperators, Renderable } from './syntax';
|
|
4
|
+
export declare type FilterConnector = 'and' | 'or';
|
|
5
|
+
export declare class FilterExpression<T> extends Expression<T> {
|
|
6
|
+
private _connector;
|
|
7
|
+
private _negated;
|
|
8
|
+
constructor({ children, connector, negated, }?: {
|
|
9
|
+
children?: Renderable[];
|
|
10
|
+
connector?: FilterConnector;
|
|
11
|
+
negated?: boolean;
|
|
12
|
+
});
|
|
13
|
+
static s<T extends object>(): T;
|
|
14
|
+
static e<T>(connector?: FilterConnector): FilterExpression<T>;
|
|
15
|
+
static filter<T extends object>(opts: (e: {
|
|
16
|
+
s: T;
|
|
17
|
+
e: (connector?: FilterConnector) => FilterExpression<T>;
|
|
18
|
+
o: ODataOperators<T>;
|
|
19
|
+
f: ODataFunctions<T>;
|
|
20
|
+
}) => FilterExpression<T>): FilterExpression<T>;
|
|
21
|
+
toJSON(): {
|
|
22
|
+
children: any[];
|
|
23
|
+
connector: FilterConnector;
|
|
24
|
+
negated: boolean;
|
|
25
|
+
};
|
|
26
|
+
connector(): FilterConnector;
|
|
27
|
+
negated(): boolean;
|
|
28
|
+
render({ aliases, escape, prefix, }?: {
|
|
29
|
+
aliases?: QueryCustomType[];
|
|
30
|
+
escape?: boolean;
|
|
31
|
+
prefix?: string;
|
|
32
|
+
}): string;
|
|
33
|
+
private _add;
|
|
34
|
+
or(exp: FilterExpression<T>): FilterExpression<T>;
|
|
35
|
+
and(exp: FilterExpression<T>): FilterExpression<T>;
|
|
36
|
+
not(exp: FilterExpression<T>): FilterExpression<T>;
|
|
37
|
+
eq(left: any, right: any, normalize?: boolean): FilterExpression<T>;
|
|
38
|
+
ne(left: any, right: any, normalize?: boolean): FilterExpression<T>;
|
|
39
|
+
gt(left: any, right: any, normalize?: boolean): FilterExpression<T>;
|
|
40
|
+
ge(left: any, right: any, normalize?: boolean): FilterExpression<T>;
|
|
41
|
+
lt(left: any, right: any, normalize?: boolean): FilterExpression<T>;
|
|
42
|
+
le(left: any, right: any, normalize?: boolean): FilterExpression<T>;
|
|
43
|
+
has(left: any, right: any, normalize?: boolean): FilterExpression<T>;
|
|
44
|
+
in(left: any, right: any, normalize?: boolean): FilterExpression<T>;
|
|
45
|
+
contains(left: any, right: any, normalize?: boolean): FilterExpression<T>;
|
|
46
|
+
startsWith(left: any, right: any, normalize?: boolean): FilterExpression<T>;
|
|
47
|
+
endsWith(left: any, right: any, normalize?: boolean): FilterExpression<T>;
|
|
48
|
+
any<N extends object>(left: N[], opts: (e: {
|
|
49
|
+
s: N;
|
|
50
|
+
e: (connector?: FilterConnector) => FilterExpression<N>;
|
|
51
|
+
}) => FilterExpression<N>, alias?: string): FilterExpression<T>;
|
|
52
|
+
all<N extends object>(left: N[], opts: (e: {
|
|
53
|
+
s: N;
|
|
54
|
+
e: (connector?: FilterConnector) => FilterExpression<N>;
|
|
55
|
+
}) => FilterExpression<N>, alias?: string): FilterExpression<T>;
|
|
56
|
+
isof(type: string): FilterExpression<T>;
|
|
57
|
+
isof(left: T, type: string): FilterExpression<T>;
|
|
58
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { QueryCustomType } from '../builder';
|
|
2
|
+
import { Expression } from './base';
|
|
3
|
+
import { Renderable } from './syntax';
|
|
4
|
+
export declare class OrderByField implements Renderable {
|
|
5
|
+
protected field: Renderable;
|
|
6
|
+
protected order: 'asc' | 'desc';
|
|
7
|
+
constructor(field: Renderable, order: 'asc' | 'desc');
|
|
8
|
+
get [Symbol.toStringTag](): string;
|
|
9
|
+
toJSON(): {
|
|
10
|
+
field: any;
|
|
11
|
+
order: "desc" | "asc";
|
|
12
|
+
};
|
|
13
|
+
render({ aliases, escape, prefix, }: {
|
|
14
|
+
aliases?: QueryCustomType[];
|
|
15
|
+
escape?: boolean;
|
|
16
|
+
prefix?: string;
|
|
17
|
+
}): string;
|
|
18
|
+
}
|
|
19
|
+
export declare class OrderByExpression<T> extends Expression<T> {
|
|
20
|
+
constructor({ children, }?: {
|
|
21
|
+
children?: Renderable[];
|
|
22
|
+
});
|
|
23
|
+
static e<T>(): OrderByExpression<T>;
|
|
24
|
+
static s<T extends object>(): T;
|
|
25
|
+
static orderBy<T extends object>(opts: (e: {
|
|
26
|
+
s: T;
|
|
27
|
+
e: () => OrderByExpression<T>;
|
|
28
|
+
}) => OrderByExpression<T>): OrderByExpression<T>;
|
|
29
|
+
private _add;
|
|
30
|
+
render({ aliases, escape, prefix, }?: {
|
|
31
|
+
aliases?: QueryCustomType[] | undefined;
|
|
32
|
+
escape?: boolean | undefined;
|
|
33
|
+
prefix?: string | undefined;
|
|
34
|
+
}): string;
|
|
35
|
+
ascending(field: any): OrderByExpression<T>;
|
|
36
|
+
descending(field: any): OrderByExpression<T>;
|
|
37
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import type { QueryCustomType } from '../builder';
|
|
2
|
+
import { Expression } from './base';
|
|
3
|
+
import { Renderable } from './syntax';
|
|
4
|
+
export declare type SearchConnector = 'AND' | 'OR';
|
|
5
|
+
export declare class SearchTerm implements Renderable {
|
|
6
|
+
protected value: string;
|
|
7
|
+
constructor(value: string);
|
|
8
|
+
get [Symbol.toStringTag](): string;
|
|
9
|
+
toJSON(): {
|
|
10
|
+
value: string;
|
|
11
|
+
};
|
|
12
|
+
render({ aliases, escape, prefix, }: {
|
|
13
|
+
aliases?: QueryCustomType[];
|
|
14
|
+
escape?: boolean;
|
|
15
|
+
prefix?: string;
|
|
16
|
+
}): string;
|
|
17
|
+
}
|
|
18
|
+
export declare class SearchExpression<T> extends Expression<T> {
|
|
19
|
+
private _connector;
|
|
20
|
+
private _negated;
|
|
21
|
+
constructor({ children, connector, negated, }?: {
|
|
22
|
+
children?: Renderable[];
|
|
23
|
+
connector?: SearchConnector;
|
|
24
|
+
negated?: boolean;
|
|
25
|
+
});
|
|
26
|
+
static e<T>(connector?: SearchConnector): SearchExpression<T>;
|
|
27
|
+
static search<T extends object>(opts: (e: {
|
|
28
|
+
e: (connector?: SearchConnector) => SearchExpression<T>;
|
|
29
|
+
}) => SearchExpression<T>): SearchExpression<T>;
|
|
30
|
+
private _add;
|
|
31
|
+
render({ aliases, escape, prefix, }?: {
|
|
32
|
+
aliases?: QueryCustomType[] | undefined;
|
|
33
|
+
escape?: boolean | undefined;
|
|
34
|
+
prefix?: string | undefined;
|
|
35
|
+
}): string;
|
|
36
|
+
toJSON(): {
|
|
37
|
+
children: any[];
|
|
38
|
+
connector: SearchConnector;
|
|
39
|
+
negated: boolean;
|
|
40
|
+
};
|
|
41
|
+
connector(): SearchConnector;
|
|
42
|
+
negated(): boolean;
|
|
43
|
+
or(exp: SearchExpression<T>): SearchExpression<T>;
|
|
44
|
+
and(exp: SearchExpression<T>): SearchExpression<T>;
|
|
45
|
+
not(exp: SearchExpression<T>): SearchExpression<T>;
|
|
46
|
+
term(value: any): SearchExpression<T>;
|
|
47
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { QueryCustomType } from '../builder';
|
|
2
|
+
import { Expression } from './base';
|
|
3
|
+
import { Renderable } from './syntax';
|
|
4
|
+
export declare class SelectExpression<T> extends Expression<T> {
|
|
5
|
+
constructor({ children, }?: {
|
|
6
|
+
children?: Renderable[];
|
|
7
|
+
});
|
|
8
|
+
static e<T>(): SelectExpression<T>;
|
|
9
|
+
static s<T extends object>(): T;
|
|
10
|
+
static select<T extends object>(opts: (e: {
|
|
11
|
+
s: T;
|
|
12
|
+
e: () => SelectExpression<T>;
|
|
13
|
+
}) => SelectExpression<T>): SelectExpression<T>;
|
|
14
|
+
render({ aliases, escape, prefix, }?: {
|
|
15
|
+
aliases?: QueryCustomType[] | undefined;
|
|
16
|
+
escape?: boolean | undefined;
|
|
17
|
+
prefix?: string | undefined;
|
|
18
|
+
}): string;
|
|
19
|
+
private _add;
|
|
20
|
+
field(field: any): SelectExpression<T>;
|
|
21
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { QueryCustomType } from '
|
|
1
|
+
import type { QueryCustomType } from '../builder';
|
|
2
2
|
export interface Renderable {
|
|
3
3
|
render({ aliases, escape, prefix, }: {
|
|
4
4
|
aliases?: QueryCustomType[];
|
|
@@ -8,13 +8,18 @@ export interface Renderable {
|
|
|
8
8
|
toString(): string;
|
|
9
9
|
toJSON(): any;
|
|
10
10
|
}
|
|
11
|
-
export declare type Funcs<T> = (x: ODataSyntax<T>) => Function<T> | Operator<T> | Grouping<T>;
|
|
12
11
|
export declare class Field<T extends object> implements ProxyHandler<T> {
|
|
13
12
|
name: string;
|
|
14
13
|
constructor(name?: string);
|
|
15
14
|
static factory<T extends object>(): T;
|
|
16
15
|
get(target: T, p: string | symbol): any;
|
|
17
16
|
}
|
|
17
|
+
export declare function render(value: any, { aliases, normalize, escape, prefix, }?: {
|
|
18
|
+
aliases?: QueryCustomType[];
|
|
19
|
+
normalize?: boolean;
|
|
20
|
+
escape?: boolean;
|
|
21
|
+
prefix?: string;
|
|
22
|
+
}): string | number | boolean | null;
|
|
18
23
|
export declare class Function<T> implements Renderable {
|
|
19
24
|
protected name: string;
|
|
20
25
|
protected values: any[];
|
|
@@ -134,9 +139,6 @@ export declare class Grouping<T> implements Renderable {
|
|
|
134
139
|
prefix?: string;
|
|
135
140
|
}): string;
|
|
136
141
|
}
|
|
137
|
-
export declare class GroupingOperators<T> {
|
|
138
|
-
grouping(value: any): Grouping<unknown>;
|
|
139
|
-
}
|
|
140
142
|
export declare class Lambda<T> implements Renderable {
|
|
141
143
|
protected op: string;
|
|
142
144
|
protected values: any[];
|
|
@@ -160,7 +162,7 @@ export declare class LambdaOperators<T> {
|
|
|
160
162
|
}
|
|
161
163
|
export declare class ODataOperators<T> {
|
|
162
164
|
}
|
|
163
|
-
export interface ODataOperators<T> extends LogicalOperators<T>, ArithmeticOperators<T>,
|
|
165
|
+
export interface ODataOperators<T> extends LogicalOperators<T>, ArithmeticOperators<T>, LambdaOperators<T> {
|
|
164
166
|
}
|
|
165
167
|
export declare const operators: ODataOperators<any>;
|
|
166
168
|
export declare class ODataFunctions<T> {
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { QueryOptionNames } from '../../types';
|
|
2
2
|
import { Expand, Filter, OrderBy, Select, Transform } from './builder';
|
|
3
|
-
import {
|
|
3
|
+
import { ComputeExpression, FilterConnector, FilterExpression, OrderByExpression, SearchConnector, SearchExpression, ODataFunctions, ODataOperators } from './expressions';
|
|
4
|
+
import { ExpandExpression } from './expressions/expand';
|
|
5
|
+
import { SelectExpression } from './expressions/select';
|
|
4
6
|
import type { ODataQueryArguments, ODataQueryOptions } from './options';
|
|
5
|
-
import { ODataFunctions, ODataOperators } from './syntax';
|
|
6
7
|
export declare class ODataQueryOptionHandler<T> {
|
|
7
8
|
private o;
|
|
8
9
|
private n;
|
|
@@ -38,16 +39,27 @@ export declare class ODataQueryOptionsHandler<T> {
|
|
|
38
39
|
* @returns The alias
|
|
39
40
|
*/
|
|
40
41
|
alias(value: any, name?: string): import("./builder").QueryCustomType;
|
|
42
|
+
select(opts: (e: {
|
|
43
|
+
s: T;
|
|
44
|
+
e: () => SelectExpression<T>;
|
|
45
|
+
}) => SelectExpression<T>): SelectExpression<T>;
|
|
41
46
|
select(opts: Select<T>): ODataQueryOptionHandler<T>;
|
|
42
47
|
select(): ODataQueryOptionHandler<T>;
|
|
48
|
+
expand(opts: (e: {
|
|
49
|
+
s: T;
|
|
50
|
+
e: () => ExpandExpression<T>;
|
|
51
|
+
}) => ExpandExpression<T>): ExpandExpression<T>;
|
|
43
52
|
expand(opts: Expand<T>): ODataQueryOptionHandler<T>;
|
|
44
53
|
expand(): ODataQueryOptionHandler<T>;
|
|
45
54
|
/**
|
|
46
55
|
* @link https://docs.oasis-open.org/odata/odata/v4.01/odata-v4.01-part2-url-conventions.html#sec_SystemQueryOptioncompute
|
|
47
56
|
*/
|
|
48
57
|
compute(opts: (e: {
|
|
49
|
-
|
|
50
|
-
|
|
58
|
+
s: T;
|
|
59
|
+
e: () => ComputeExpression<T>;
|
|
60
|
+
o: ODataOperators<T>;
|
|
61
|
+
f: ODataFunctions<T>;
|
|
62
|
+
}) => ComputeExpression<T>): ComputeExpression<T>;
|
|
51
63
|
compute(opts: string): ODataQueryOptionHandler<T>;
|
|
52
64
|
compute(): ODataQueryOptionHandler<T>;
|
|
53
65
|
/**
|
|
@@ -57,20 +69,23 @@ export declare class ODataQueryOptionsHandler<T> {
|
|
|
57
69
|
format(): ODataQueryOptionHandler<T>;
|
|
58
70
|
transform(opts: Transform<T>): ODataQueryOptionHandler<T>;
|
|
59
71
|
transform(): ODataQueryOptionHandler<T>;
|
|
72
|
+
search(opts: (e: {
|
|
73
|
+
e: (connector: SearchConnector) => SearchExpression<T>;
|
|
74
|
+
}) => SearchExpression<T>): SearchExpression<T>;
|
|
60
75
|
search(opts: string): ODataQueryOptionHandler<T>;
|
|
61
76
|
search(): ODataQueryOptionHandler<T>;
|
|
62
77
|
filter(opts: (e: {
|
|
63
78
|
s: T;
|
|
64
|
-
e: (connector?:
|
|
79
|
+
e: (connector?: FilterConnector) => FilterExpression<T>;
|
|
65
80
|
o: ODataOperators<T>;
|
|
66
81
|
f: ODataFunctions<T>;
|
|
67
|
-
}) =>
|
|
82
|
+
}) => FilterExpression<T>): FilterExpression<T>;
|
|
68
83
|
filter(opts: Filter<T>): ODataQueryOptionHandler<T>;
|
|
69
84
|
filter(): ODataQueryOptionHandler<T>;
|
|
70
85
|
orderBy(opts: (e: {
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
}) =>
|
|
86
|
+
s: T;
|
|
87
|
+
e: () => OrderByExpression<T>;
|
|
88
|
+
}) => OrderByExpression<T>): OrderByExpression<T>;
|
|
74
89
|
orderBy(opts: OrderBy<T>): ODataQueryOptionHandler<T>;
|
|
75
90
|
orderBy(): ODataQueryOptionHandler<T>;
|
|
76
91
|
top(opts: number): ODataQueryOptionHandler<T>;
|
|
@@ -25,6 +25,15 @@ export declare class ODataBatchResource extends ODataResource<any> {
|
|
|
25
25
|
private _requests;
|
|
26
26
|
requests(): ODataRequest<any>[];
|
|
27
27
|
static factory(api: ODataApi): ODataBatchResource;
|
|
28
|
+
private storeRequester;
|
|
29
|
+
private restoreRequester;
|
|
30
|
+
/**
|
|
31
|
+
* Add to batch request
|
|
32
|
+
* @param ctx The context for the request
|
|
33
|
+
* @returns The result of execute the context
|
|
34
|
+
*/
|
|
35
|
+
add<R>(ctx: (batch: this) => Observable<R>): Observable<R>;
|
|
36
|
+
send(options?: ODataOptions): void;
|
|
28
37
|
/**
|
|
29
38
|
* Execute the batch request
|
|
30
39
|
* @param ctx The context for the request
|
package/package.json
CHANGED
|
@@ -1,207 +0,0 @@
|
|
|
1
|
-
import { Field, functions, operators, } from './syntax';
|
|
2
|
-
import { syntax } from './syntax';
|
|
3
|
-
export class Expression {
|
|
4
|
-
constructor({ children, connector, negated, } = {}) {
|
|
5
|
-
this._children = children || [];
|
|
6
|
-
this._connector = connector || 'and';
|
|
7
|
-
this._negated = negated || false;
|
|
8
|
-
}
|
|
9
|
-
get [Symbol.toStringTag]() {
|
|
10
|
-
return 'Expression';
|
|
11
|
-
}
|
|
12
|
-
static s() {
|
|
13
|
-
return Field.factory();
|
|
14
|
-
}
|
|
15
|
-
static e(connector = 'and') {
|
|
16
|
-
return new Expression({ connector });
|
|
17
|
-
}
|
|
18
|
-
static o() {
|
|
19
|
-
return operators;
|
|
20
|
-
}
|
|
21
|
-
static f() {
|
|
22
|
-
return functions;
|
|
23
|
-
}
|
|
24
|
-
static filter(opts) {
|
|
25
|
-
return opts({
|
|
26
|
-
s: Expression.s(),
|
|
27
|
-
e: Expression.e,
|
|
28
|
-
o: Expression.o(),
|
|
29
|
-
f: Expression.f(),
|
|
30
|
-
});
|
|
31
|
-
}
|
|
32
|
-
toJSON() {
|
|
33
|
-
return {
|
|
34
|
-
children: this._children.map((c) => c.toJSON()),
|
|
35
|
-
connector: this._connector,
|
|
36
|
-
negated: this._negated,
|
|
37
|
-
};
|
|
38
|
-
}
|
|
39
|
-
children() {
|
|
40
|
-
return this._children;
|
|
41
|
-
}
|
|
42
|
-
connector() {
|
|
43
|
-
return this._connector;
|
|
44
|
-
}
|
|
45
|
-
negated() {
|
|
46
|
-
return this._negated;
|
|
47
|
-
}
|
|
48
|
-
length() {
|
|
49
|
-
return this._children.length;
|
|
50
|
-
}
|
|
51
|
-
render({ aliases, escape, prefix, } = {}) {
|
|
52
|
-
let content = this._children
|
|
53
|
-
.map((n) => n.render({ aliases, escape, prefix }))
|
|
54
|
-
.join(` ${this._connector} `);
|
|
55
|
-
if (this._negated) {
|
|
56
|
-
content = `not (${content})`;
|
|
57
|
-
}
|
|
58
|
-
return content;
|
|
59
|
-
}
|
|
60
|
-
_add(node, connector) {
|
|
61
|
-
if (connector !== undefined && this._connector !== connector) {
|
|
62
|
-
let children = [];
|
|
63
|
-
if (this._children.length > 0) {
|
|
64
|
-
if (this._children.length === 1) {
|
|
65
|
-
children = [...this._children];
|
|
66
|
-
}
|
|
67
|
-
else {
|
|
68
|
-
let exp = new Expression({
|
|
69
|
-
children: this._children,
|
|
70
|
-
connector: this._connector,
|
|
71
|
-
negated: this._negated,
|
|
72
|
-
});
|
|
73
|
-
if (exp.length() > 1) {
|
|
74
|
-
children.push(syntax.grouping(exp));
|
|
75
|
-
}
|
|
76
|
-
else {
|
|
77
|
-
children.push(exp);
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
if (node instanceof Expression &&
|
|
82
|
-
(node.connector() === connector || node.length() === 1)) {
|
|
83
|
-
children = [...children, ...node.children()];
|
|
84
|
-
}
|
|
85
|
-
else {
|
|
86
|
-
children.push(syntax.grouping(node));
|
|
87
|
-
}
|
|
88
|
-
this._connector = connector;
|
|
89
|
-
this._children = children;
|
|
90
|
-
}
|
|
91
|
-
else if (node instanceof Expression &&
|
|
92
|
-
!node.negated() &&
|
|
93
|
-
(node.connector() === connector || node.length() === 1)) {
|
|
94
|
-
this._children = [...this._children, ...node.children()];
|
|
95
|
-
}
|
|
96
|
-
else {
|
|
97
|
-
this._children.push(node instanceof Expression && !node.negated()
|
|
98
|
-
? syntax.grouping(node)
|
|
99
|
-
: node);
|
|
100
|
-
}
|
|
101
|
-
return this;
|
|
102
|
-
}
|
|
103
|
-
or(exp) {
|
|
104
|
-
return this._add(exp, 'or');
|
|
105
|
-
}
|
|
106
|
-
and(exp) {
|
|
107
|
-
return this._add(exp, 'and');
|
|
108
|
-
}
|
|
109
|
-
not(exp) {
|
|
110
|
-
const notExp = new Expression({
|
|
111
|
-
children: exp.children(),
|
|
112
|
-
connector: exp.connector(),
|
|
113
|
-
negated: true,
|
|
114
|
-
});
|
|
115
|
-
return this._add(notExp, this._connector);
|
|
116
|
-
}
|
|
117
|
-
eq(left, right, normalize) {
|
|
118
|
-
return this._add(operators.eq(left, right, normalize));
|
|
119
|
-
}
|
|
120
|
-
ne(left, right, normalize) {
|
|
121
|
-
return this._add(operators.ne(left, right, normalize));
|
|
122
|
-
}
|
|
123
|
-
gt(left, right, normalize) {
|
|
124
|
-
return this._add(operators.gt(left, right, normalize));
|
|
125
|
-
}
|
|
126
|
-
ge(left, right, normalize) {
|
|
127
|
-
return this._add(operators.ge(left, right, normalize));
|
|
128
|
-
}
|
|
129
|
-
lt(left, right, normalize) {
|
|
130
|
-
return this._add(operators.lt(left, right, normalize));
|
|
131
|
-
}
|
|
132
|
-
le(left, right, normalize) {
|
|
133
|
-
return this._add(operators.le(left, right, normalize));
|
|
134
|
-
}
|
|
135
|
-
has(left, right, normalize) {
|
|
136
|
-
return this._add(operators.has(left, right, normalize));
|
|
137
|
-
}
|
|
138
|
-
in(left, right, normalize) {
|
|
139
|
-
return this._add(operators.in(left, right, normalize));
|
|
140
|
-
}
|
|
141
|
-
contains(left, right, normalize) {
|
|
142
|
-
return this._add(functions.contains(left, right, normalize));
|
|
143
|
-
}
|
|
144
|
-
startsWith(left, right, normalize) {
|
|
145
|
-
return this._add(functions.startsWith(left, right, normalize));
|
|
146
|
-
}
|
|
147
|
-
endsWith(left, right, normalize) {
|
|
148
|
-
return this._add(functions.endsWith(left, right, normalize));
|
|
149
|
-
}
|
|
150
|
-
any(left, opts, alias) {
|
|
151
|
-
const exp = opts({
|
|
152
|
-
s: Field.factory(),
|
|
153
|
-
e: Expression.e,
|
|
154
|
-
});
|
|
155
|
-
return this._add(syntax.any(left, exp, alias));
|
|
156
|
-
}
|
|
157
|
-
all(left, opts, alias) {
|
|
158
|
-
const exp = opts({
|
|
159
|
-
s: Field.factory(),
|
|
160
|
-
e: Expression.e,
|
|
161
|
-
});
|
|
162
|
-
return this._add(syntax.all(left, exp, alias));
|
|
163
|
-
}
|
|
164
|
-
isof(left, type) {
|
|
165
|
-
return this._add(syntax.isof(left, type));
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
/*
|
|
169
|
-
export class FilterExpression<T> extends Expression<T> {
|
|
170
|
-
constructor({
|
|
171
|
-
children,
|
|
172
|
-
connector,
|
|
173
|
-
negated,
|
|
174
|
-
}: {
|
|
175
|
-
children?: Renderable[];
|
|
176
|
-
connector?: Connector;
|
|
177
|
-
negated?: boolean;
|
|
178
|
-
} = {}) {
|
|
179
|
-
super({ children, connector, negated });
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
get [Symbol.toStringTag]() {
|
|
183
|
-
return 'FilterExpression';
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
static e<T>() {
|
|
187
|
-
return new FilterExpression<T>({ connector: Connector.AND });
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
static and<T>() {
|
|
191
|
-
return new FilterExpression<T>({ connector: Connector.AND });
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
static or<T>() {
|
|
195
|
-
return new FilterExpression<T>({ connector: Connector.OR });
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
static not<T>(exp: FilterExpression<T>) {
|
|
199
|
-
return new FilterExpression<T>({
|
|
200
|
-
children: exp.children(),
|
|
201
|
-
connector: exp.connector(),
|
|
202
|
-
negated: true,
|
|
203
|
-
});
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
*/
|
|
207
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwcmVzc2lvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLW9kYXRhL3NyYy9saWIvcmVzb3VyY2VzL3F1ZXJ5L2V4cHJlc3Npb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFDTCxLQUFLLEVBQ0wsU0FBUyxFQUdULFNBQVMsR0FFVixNQUFNLFVBQVUsQ0FBQztBQUNsQixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBSWxDLE1BQU0sT0FBTyxVQUFVO0lBSXJCLFlBQVksRUFDVixRQUFRLEVBQ1IsU0FBUyxFQUNULE9BQU8sTUFLTCxFQUFFO1FBQ0osSUFBSSxDQUFDLFNBQVMsR0FBRyxRQUFRLElBQUksRUFBRSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxVQUFVLEdBQUcsU0FBUyxJQUFJLEtBQUssQ0FBQztRQUNyQyxJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sSUFBSSxLQUFLLENBQUM7SUFDbkMsQ0FBQztJQUVELElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDO1FBQ3RCLE9BQU8sWUFBWSxDQUFDO0lBQ3RCLENBQUM7SUFFRCxNQUFNLENBQUMsQ0FBQztRQUNOLE9BQU8sS0FBSyxDQUFDLE9BQU8sRUFBSyxDQUFDO0lBQzVCLENBQUM7SUFFRCxNQUFNLENBQUMsQ0FBQyxDQUFJLFlBQXVCLEtBQUs7UUFDdEMsT0FBTyxJQUFJLFVBQVUsQ0FBSSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVELE1BQU0sQ0FBQyxDQUFDO1FBQ04sT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVELE1BQU0sQ0FBQyxDQUFDO1FBQ04sT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVELE1BQU0sQ0FBQyxNQUFNLENBQ1gsSUFLbUI7UUFFbkIsT0FBTyxJQUFJLENBQUM7WUFDVixDQUFDLEVBQUUsVUFBVSxDQUFD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Q0FBQyxVQUFVLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRUQsRUFBRSxDQUFDLElBQVMsRUFBRSxLQUFVLEVBQUUsU0FBbUI7UUFDM0MsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFFRCxFQUFFLENBQUMsSUFBUyxFQUFFLEtBQVUsRUFBRSxTQUFtQjtRQUMzQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVELEVBQUUsQ0FBQyxJQUFTLEVBQUUsS0FBVSxFQUFFLFNBQW1CO1FBQzNDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRUQsRUFBRSxDQUFDLElBQVMsRUFBRSxLQUFVLEVBQUUsU0FBbUI7UUFDM0MsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFFRCxFQUFFLENBQUMsSUFBUyxFQUFFLEtBQVUsRUFBRSxTQUFtQjtRQUMzQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVELEVBQUUsQ0FBQyxJQUFTLEVBQUUsS0FBVSxFQUFFLFNBQW1CO1FBQzNDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRUQsR0FBRyxDQUFDLElBQVMsRUFBRSxLQUFVLEVBQUUsU0FBbUI7UUFDNUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQzFELENBQUM7SUFFRCxFQUFFLENBQUMsSUFBUyxFQUFFLEtBQVUsRUFBRSxTQUFtQjtRQUMzQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVELFFBQVEsQ0FBQyxJQUFTLEVBQUUsS0FBVSxFQUFFLFNBQW1CO1FBQ2pELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQztJQUMvRCxDQUFDO0lBRUQsVUFBVSxDQUFDLElBQVMsRUFBRSxLQUFVLEVBQUUsU0FBbUI7UUFDbkQsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQ2pFLENBQUM7SUFFRCxRQUFRLENBQUMsSUFBUyxFQUFFLEtBQVUsRUFBRSxTQUFtQjtRQUNqRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7SUFDL0QsQ0FBQztJQUVELEdBQUcsQ0FDRCxJQUFTLEVBQ1QsSUFHbUIsRUFDbkIsS0FBYztRQUVkLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQztZQUNmLENBQUMsRUFBRSxLQUFLLENBQUMsT0FBTyxFQUFLO1lBQ3JCLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQztTQUNoQixDQUFrQixDQUFDO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRUQsR0FBRyxDQUNELElBQVMsRUFDVCxJQUdtQixFQUNuQixLQUFjO1FBRWQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDO1lBQ2YsQ0FBQyxFQUFFLEtBQUssQ0FBQyxPQUFPLEVBQUs7WUFDckIsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1NBQ2hCLENBQWtCLENBQUM7UUFDcEIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFJRCxJQUFJLENBQUMsSUFBUyxFQUFFLElBQWE7UUFDM0IsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDNUMsQ0FBQztDQUNGO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBc0NFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBRdWVyeUN1c3RvbVR5cGUgfSBmcm9tICcuL2J1aWxkZXInO1xuaW1wb3J0IHtcbiAgRmllbGQsXG4gIGZ1bmN0aW9ucyxcbiAgT0RhdGFGdW5jdGlvbnMsXG4gIE9EYXRhT3BlcmF0b3JzLFxuICBvcGVyYXRvcnMsXG4gIFJlbmRlcmFibGUsXG59IGZyb20gJy4vc3ludGF4JztcbmltcG9ydCB7IHN5bnRheCB9IGZyb20gJy4vc3ludGF4JztcblxuZXhwb3J0IHR5cGUgQ29ubmVjdG9yID0gJ2FuZCcgfCAnb3InO1xuXG5leHBvcnQgY2xhc3MgRXhwcmVzc2lvbjxUPiBpbXBsZW1lbnRzIFJlbmRlcmFibGUge1xuICBwcml2YXRlIF9jb25uZWN0b3I6IENvbm5lY3RvcjtcbiAgcHJpdmF0ZSBfbmVnYXRlZDogYm9vbGVhbjtcbiAgcHJpdmF0ZSBfY2hpbGRyZW46IFJlbmRlcmFibGVbXTtcbiAgY29uc3RydWN0b3Ioe1xuICAgIGNoaWxkcmVuLFxuICAgIGNvbm5lY3RvcixcbiAgICBuZWdhdGVkLFxuICB9OiB7XG4gICAgY2hpbGRyZW4/OiBSZW5kZXJhYmxlW107XG4gICAgY29ubmVjdG9yPzogQ29ubmVjdG9yO1xuICAgIG5lZ2F0ZWQ/OiBib29sZWFuO1xuICB9ID0ge30pIHtcbiAgICB0aGlzLl9jaGlsZHJlbiA9IGNoaWxkcmVuIHx8IFtdO1xuICAgIHRoaXMuX2Nvbm5lY3RvciA9IGNvbm5lY3RvciB8fCAnYW5kJztcbiAgICB0aGlzLl9uZWdhdGVkID0gbmVnYXRlZCB8fCBmYWxzZTtcbiAgfVxuXG4gIGdldCBbU3ltYm9sLnRvU3RyaW5nVGFnXSgpIHtcbiAgICByZXR1cm4gJ0V4cHJlc3Npb24nO1xuICB9XG5cbiAgc3RhdGljIHM8VCBleHRlbmRzIG9iamVjdD4oKTogVCB7XG4gICAgcmV0dXJuIEZpZWxkLmZhY3Rvcnk8VD4oKTtcbiAgfVxuXG4gIHN0YXRpYyBlPFQ+KGNvbm5lY3RvcjogQ29ubmVjdG9yID0gJ2FuZCcpIHtcbiAgICByZXR1cm4gbmV3IEV4cHJlc3Npb248VD4oeyBjb25uZWN0b3IgfSk7XG4gIH1cblxuICBzdGF0aWMgbzxUPigpOiBPRGF0YU9wZXJhdG9yczxUPiB7XG4gICAgcmV0dXJuIG9wZXJhdG9ycztcbiAgfVxuXG4gIHN0YXRpYyBmPFQ+KCk6IE9EYXRhRnVuY3Rpb25zPFQ+IHtcbiAgICByZXR1cm4gZnVuY3Rpb25zO1xuICB9XG5cbiAgc3RhdGljIGZpbHRlcjxUIGV4dGVuZHMgb2JqZWN0PihcbiAgICBvcHRzOiAoZToge1xuICAgICAgczogVDtcbiAgICAgIGU6IChjb25uZWN0b3I/OiBDb25uZWN0b3IpID0+IEV4cHJlc3Npb248VD47XG4gICAgICBvOiBPRGF0YU9wZXJhdG9yczxUPjtcbiAgICAgIGY6IE9EYXRhRnVuY3Rpb25zPFQ+O1xuICAgIH0pID0+IEV4cHJlc3Npb248VD5cbiAgKTogRXhwcmVzc2lvbjxUPiB7XG4gICAgcmV0dXJuIG9wdHMoe1xuICAgICAgczogRXhwcmVzc2lvbi5zPFQ+KCksXG4gICAgICBlOiBFeHByZXNzaW9uLmUsXG4gICAgICBvOiBFeHByZXNzaW9uLm88VD4oKSxcbiAgICAgIGY6IEV4cHJlc3Npb24uZjxUPigpLFxuICAgIH0pIGFzIEV4cHJlc3Npb248VD47XG4gIH1cblxuICB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNoaWxkcmVuOiB0aGlzLl9jaGlsZHJlbi5tYXAoKGMpID0+IGMudG9KU09OKCkpLFxuICAgICAgY29ubmVjdG9yOiB0aGlzLl9jb25uZWN0b3IsXG4gICAgICBuZWdhdGVkOiB0aGlzLl9uZWdhdGVkLFxuICAgIH07XG4gIH1cblxuICBjaGlsZHJlbigpIHtcbiAgICByZXR1cm4gdGhpcy5fY2hpbGRyZW47XG4gIH1cblxuICBjb25uZWN0b3IoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Nvbm5lY3RvcjtcbiAgfVxuXG4gIG5lZ2F0ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX25lZ2F0ZWQ7XG4gIH1cblxuICBsZW5ndGgoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NoaWxkcmVuLmxlbmd0aDtcbiAgfVxuXG4gIHJlbmRlcih7XG4gICAgYWxpYXNlcyxcbiAgICBlc2NhcGUsXG4gICAgcHJlZml4LFxuICB9OiB7XG4gICAgYWxpYXNlcz86IFF1ZXJ5Q3VzdG9tVHlwZVtdO1xuICAgIGVzY2FwZT86IGJvb2xlYW47XG4gICAgcHJlZml4Pzogc3RyaW5nO1xuICB9ID0ge30pOiBzdHJpbmcge1xuICAgIGxldCBjb250ZW50ID0gdGhpcy5fY2hpbGRyZW5cbiAgICAgIC5tYXAoKG4pID0+IG4ucmVuZGVyKHsgYWxpYXNlcywgZXNjYXBlLCBwcmVmaXggfSkpXG4gICAgICAuam9pbihgICR7dGhpcy5fY29ubmVjdG9yfSBgKTtcbiAgICBpZiAodGhpcy5fbmVnYXRlZCkge1xuICAgICAgY29udGVudCA9IGBub3QgKCR7Y29udGVudH0pYDtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnRlbnQ7XG4gIH1cblxuICBwcml2YXRlIF9hZGQobm9kZTogUmVuZGVyYWJsZSwgY29ubmVjdG9yPzogQ29ubmVjdG9yKTogRXhwcmVzc2lvbjxUPiB7XG4gICAgaWYgKGNvbm5lY3RvciAhPT0gdW5kZWZpbmVkICYmIHRoaXMuX2Nvbm5lY3RvciAhPT0gY29ubmVjdG9yKSB7XG4gICAgICBsZXQgY2hpbGRyZW46IFJlbmRlcmFibGVbXSA9IFtdO1xuICAgICAgaWYgKHRoaXMuX2NoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgaWYgKHRoaXMuX2NoaWxkcmVuLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgIGNoaWxkcmVuID0gWy4uLnRoaXMuX2NoaWxkcmVuXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsZXQgZXhwID0gbmV3IEV4cHJlc3Npb248VD4oe1xuICAgICAgICAgICAgY2hpbGRyZW46IHRoaXMuX2NoaWxkcmVuLFxuICAgICAgICAgICAgY29ubmVjdG9yOiB0aGlzLl9jb25uZWN0b3IsXG4gICAgICAgICAgICBuZWdhdGVkOiB0aGlzLl9uZWdhdGVkLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmIChleHAubGVuZ3RoKCkgPiAxKSB7XG4gICAgICAgICAgICBjaGlsZHJlbi5wdXNoKHN5bnRheC5ncm91cGluZyhleHApKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2hpbGRyZW4ucHVzaChleHApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICBub2RlIGluc3RhbmNlb2YgRXhwcmVzc2lvbiAmJlxuICAgICAgICAobm9kZS5jb25uZWN0b3IoKSA9PT0gY29ubmVjdG9yIHx8IG5vZGUubGVuZ3RoKCkgPT09IDEpXG4gICAgICApIHtcbiAgICAgICAgY2hpbGRyZW4gPSBbLi4uY2hpbGRyZW4sIC4uLm5vZGUuY2hpbGRyZW4oKV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjaGlsZHJlbi5wdXNoKHN5bnRheC5ncm91cGluZyhub2RlKSk7XG4gICAgICB9XG4gICAgICB0aGlzLl9jb25uZWN0b3IgPSBjb25uZWN0b3I7XG4gICAgICB0aGlzLl9jaGlsZHJlbiA9IGNoaWxkcmVuO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICBub2RlIGluc3RhbmNlb2YgRXhwcmVzc2lvbiAmJlxuICAgICAgIW5vZGUubmVnYXRlZCgpICYmXG4gICAgICAobm9kZS5jb25uZWN0b3IoKSA9PT0gY29ubmVjdG9yIHx8IG5vZGUubGVuZ3RoKCkgPT09IDEpXG4gICAgKSB7XG4gICAgICB0aGlzLl9jaGlsZHJlbiA9IFsuLi50aGlzLl9jaGlsZHJlbiwgLi4ubm9kZS5jaGlsZHJlbigpXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fY2hpbGRyZW4ucHVzaChcbiAgICAgICAgbm9kZSBpbnN0YW5jZW9mIEV4cHJlc3Npb24gJiYgIW5vZGUubmVnYXRlZCgpXG4gICAgICAgICAgPyBzeW50YXguZ3JvdXBpbmcobm9kZSlcbiAgICAgICAgICA6IG5vZGVcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgb3IoZXhwOiBFeHByZXNzaW9uPFQ+KTogRXhwcmVzc2lvbjxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FkZChleHAsICdvcicpO1xuICB9XG5cbiAgYW5kKGV4cDogRXhwcmVzc2lvbjxUPik6IEV4cHJlc3Npb248VD4ge1xuICAgIHJldHVybiB0aGlzLl9hZGQoZXhwLCAnYW5kJyk7XG4gIH1cblxuICBub3QoZXhwOiBFeHByZXNzaW9uPFQ+KTogRXhwcmVzc2lvbjxUPiB7XG4gICAgY29uc3Qgbm90RXhwID0gbmV3IEV4cHJlc3Npb248VD4oe1xuICAgICAgY2hpbGRyZW46IGV4cC5jaGlsZHJlbigpLFxuICAgICAgY29ubmVjdG9yOiBleHAuY29ubmVjdG9yKCksXG4gICAgICBuZWdhdGVkOiB0cnVlLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMuX2FkZChub3RFeHAsIHRoaXMuX2Nvbm5lY3Rvcik7XG4gIH1cblxuICBlcShsZWZ0OiBhbnksIHJpZ2h0OiBhbnksIG5vcm1hbGl6ZT86IGJvb2xlYW4pIHtcbiAgICByZXR1cm4gdGhpcy5fYWRkKG9wZXJhdG9ycy5lcShsZWZ0LCByaWdodCwgbm9ybWFsaXplKSk7XG4gIH1cblxuICBuZShsZWZ0OiBhbnksIHJpZ2h0OiBhbnksIG5vcm1hbGl6ZT86IGJvb2xlYW4pIHtcbiAgICByZXR1cm4gdGhpcy5fYWRkKG9wZXJhdG9ycy5uZShsZWZ0LCByaWdodCwgbm9ybWFsaXplKSk7XG4gIH1cblxuICBndChsZWZ0OiBhbnksIHJpZ2h0OiBhbnksIG5vcm1hbGl6ZT86IGJvb2xlYW4pIHtcbiAgICByZXR1cm4gdGhpcy5fYWRkKG9wZXJhdG9ycy5ndChsZWZ0LCByaWdodCwgbm9ybWFsaXplKSk7XG4gIH1cblxuICBnZShsZWZ0OiBhbnksIHJpZ2h0OiBhbnksIG5vcm1hbGl6ZT86IGJvb2xlYW4pIHtcbiAgICByZXR1cm4gdGhpcy5fYWRkKG9wZXJhdG9ycy5nZShsZWZ0LCByaWdodCwgbm9ybWFsaXplKSk7XG4gIH1cblxuICBsdChsZWZ0OiBhbnksIHJpZ2h0OiBhbnksIG5vcm1hbGl6ZT86IGJvb2xlYW4pIHtcbiAgICByZXR1cm4gdGhpcy5fYWRkKG9wZXJhdG9ycy5sdChsZWZ0LCByaWdodCwgbm9ybWFsaXplKSk7XG4gIH1cblxuICBsZShsZWZ0OiBhbnksIHJpZ2h0OiBhbnksIG5vcm1hbGl6ZT86IGJvb2xlYW4pIHtcbiAgICByZXR1cm4gdGhpcy5fYWRkKG9wZXJhdG9ycy5sZShsZWZ0LCByaWdodCwgbm9ybWFsaXplKSk7XG4gIH1cblxuICBoYXMobGVmdDogYW55LCByaWdodDogYW55LCBub3JtYWxpemU/OiBib29sZWFuKSB7XG4gICAgcmV0dXJuIHRoaXMuX2FkZChvcGVyYXRvcnMuaGFzKGxlZnQsIHJpZ2h0LCBub3JtYWxpemUpKTtcbiAgfVxuXG4gIGluKGxlZnQ6IGFueSwgcmlnaHQ6IGFueSwgbm9ybWFsaXplPzogYm9vbGVhbikge1xuICAgIHJldHVybiB0aGlzLl9hZGQob3BlcmF0b3JzLmluKGxlZnQsIHJpZ2h0LCBub3JtYWxpemUpKTtcbiAgfVxuXG4gIGNvbnRhaW5zKGxlZnQ6IGFueSwgcmlnaHQ6IGFueSwgbm9ybWFsaXplPzogYm9vbGVhbikge1xuICAgIHJldHVybiB0aGlzLl9hZGQoZnVuY3Rpb25zLmNvbnRhaW5zKGxlZnQsIHJpZ2h0LCBub3JtYWxpemUpKTtcbiAgfVxuXG4gIHN0YXJ0c1dpdGgobGVmdDogYW55LCByaWdodDogYW55LCBub3JtYWxpemU/OiBib29sZWFuKSB7XG4gICAgcmV0dXJuIHRoaXMuX2FkZChmdW5jdGlvbnMuc3RhcnRzV2l0aChsZWZ0LCByaWdodCwgbm9ybWFsaXplKSk7XG4gIH1cblxuICBlbmRzV2l0aChsZWZ0OiBhbnksIHJpZ2h0OiBhbnksIG5vcm1hbGl6ZT86IGJvb2xlYW4pIHtcbiAgICByZXR1cm4gdGhpcy5fYWRkKGZ1bmN0aW9ucy5lbmRzV2l0aChsZWZ0LCByaWdodCwgbm9ybWFsaXplKSk7XG4gIH1cblxuICBhbnk8TiBleHRlbmRzIG9iamVjdD4oXG4gICAgbGVmdDogTltdLFxuICAgIG9wdHM6IChlOiB7XG4gICAgICBzOiBOO1xuICAgICAgZTogKGNvbm5lY3Rvcj86IENvbm5lY3RvcikgPT4gRXhwcmVzc2lvbjxOPjtcbiAgICB9KSA9PiBFeHByZXNzaW9uPE4+LFxuICAgIGFsaWFzPzogc3RyaW5nXG4gICk6IEV4cHJlc3Npb248VD4ge1xuICAgIGNvbnN0IGV4cCA9IG9wdHMoe1xuICAgICAgczogRmllbGQuZmFjdG9yeTxOPigpLFxuICAgICAgZTogRXhwcmVzc2lvbi5lLFxuICAgIH0pIGFzIEV4cHJlc3Npb248Tj47XG4gICAgcmV0dXJuIHRoaXMuX2FkZChzeW50YXguYW55KGxlZnQsIGV4cCwgYWxpYXMpKTtcbiAgfVxuXG4gIGFsbDxOIGV4dGVuZHMgb2JqZWN0PihcbiAgICBsZWZ0OiBOW10sXG4gICAgb3B0czogKGU6IHtcbiAgICAgIHM6IE47XG4gICAgICBlOiAoY29ubmVjdG9yPzogQ29ubmVjdG9yKSA9PiBFeHByZXNzaW9uPE4+O1xuICAgIH0pID0+IEV4cHJlc3Npb248Tj4sXG4gICAgYWxpYXM/OiBzdHJpbmdcbiAgKTogRXhwcmVzc2lvbjxUPiB7XG4gICAgY29uc3QgZXhwID0gb3B0cyh7XG4gICAgICBzOiBGaWVsZC5mYWN0b3J5PE4+KCksXG4gICAgICBlOiBFeHByZXNzaW9uLmUsXG4gICAgfSkgYXMgRXhwcmVzc2lvbjxOPjtcbiAgICByZXR1cm4gdGhpcy5fYWRkKHN5bnRheC5hbGwobGVmdCwgZXhwLCBhbGlhcykpO1xuICB9XG5cbiAgaXNvZih0eXBlOiBzdHJpbmcpOiBFeHByZXNzaW9uPFQ+O1xuICBpc29mKGxlZnQ6IFQsIHR5cGU6IHN0cmluZyk6IEV4cHJlc3Npb248VD47XG4gIGlzb2YobGVmdDogYW55LCB0eXBlPzogc3RyaW5nKTogRXhwcmVzc2lvbjxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FkZChzeW50YXguaXNvZihsZWZ0LCB0eXBlKSk7XG4gIH1cbn1cblxuLypcbmV4cG9ydCBjbGFzcyBGaWx0ZXJFeHByZXNzaW9uPFQ+IGV4dGVuZHMgRXhwcmVzc2lvbjxUPiB7XG4gIGNvbnN0cnVjdG9yKHtcbiAgICBjaGlsZHJlbixcbiAgICBjb25uZWN0b3IsXG4gICAgbmVnYXRlZCxcbiAgfToge1xuICAgIGNoaWxkcmVuPzogUmVuZGVyYWJsZVtdO1xuICAgIGNvbm5lY3Rvcj86IENvbm5lY3RvcjtcbiAgICBuZWdhdGVkPzogYm9vbGVhbjtcbiAgfSA9IHt9KSB7XG4gICAgc3VwZXIoeyBjaGlsZHJlbiwgY29ubmVjdG9yLCBuZWdhdGVkIH0pO1xuICB9XG5cbiAgZ2V0IFtTeW1ib2wudG9TdHJpbmdUYWddKCkge1xuICAgIHJldHVybiAnRmlsdGVyRXhwcmVzc2lvbic7XG4gIH1cblxuICBzdGF0aWMgZTxUPigpIHtcbiAgICByZXR1cm4gbmV3IEZpbHRlckV4cHJlc3Npb248VD4oeyBjb25uZWN0b3I6IENvbm5lY3Rvci5BTkQgfSk7XG4gIH1cblxuICBzdGF0aWMgYW5kPFQ+KCkge1xuICAgIHJldHVybiBuZXcgRmlsdGVyRXhwcmVzc2lvbjxUPih7IGNvbm5lY3RvcjogQ29ubmVjdG9yLkFORCB9KTtcbiAgfVxuXG4gIHN0YXRpYyBvcjxUPigpIHtcbiAgICByZXR1cm4gbmV3IEZpbHRlckV4cHJlc3Npb248VD4oeyBjb25uZWN0b3I6IENvbm5lY3Rvci5PUiB9KTtcbiAgfVxuXG4gIHN0YXRpYyBub3Q8VD4oZXhwOiBGaWx0ZXJFeHByZXNzaW9uPFQ+KSB7XG4gICAgcmV0dXJuIG5ldyBGaWx0ZXJFeHByZXNzaW9uPFQ+KHtcbiAgICAgIGNoaWxkcmVuOiBleHAuY2hpbGRyZW4oKSxcbiAgICAgIGNvbm5lY3RvcjogZXhwLmNvbm5lY3RvcigpLFxuICAgICAgbmVnYXRlZDogdHJ1ZSxcbiAgICB9KTtcbiAgfVxufVxuKi9cbiJdfQ==
|