@xata.io/client 0.6.0 → 0.7.2
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/CHANGELOG.md +31 -0
- package/dist/api/client.d.ts +1 -1
- package/dist/api/client.js +32 -17
- package/dist/api/components.d.ts +7 -6
- package/dist/api/components.js +7 -6
- package/dist/api/fetcher.d.ts +15 -0
- package/dist/api/fetcher.js +19 -13
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/schema/filters.d.ts +93 -19
- package/dist/schema/filters.js +0 -23
- package/dist/schema/filters.spec.d.ts +1 -0
- package/dist/schema/filters.spec.js +175 -0
- package/dist/schema/operators.d.ts +26 -24
- package/dist/schema/operators.js +13 -11
- package/dist/schema/query.d.ts +8 -8
- package/dist/schema/record.d.ts +1 -1
- package/dist/schema/repository.d.ts +80 -15
- package/dist/schema/repository.js +220 -119
- package/dist/schema/selection.d.ts +5 -4
- package/dist/schema/selection.spec.js +152 -58
- package/dist/schema/sorting.d.ts +17 -0
- package/dist/schema/sorting.js +28 -0
- package/dist/schema/sorting.spec.d.ts +1 -0
- package/dist/schema/sorting.spec.js +9 -0
- package/dist/util/config.d.ts +11 -0
- package/dist/util/config.js +121 -0
- package/dist/util/environment.d.ts +5 -0
- package/dist/util/environment.js +68 -0
- package/dist/util/fetch.d.ts +2 -0
- package/dist/util/fetch.js +13 -0
- package/dist/util/lang.d.ts +1 -1
- package/dist/util/lang.js +1 -1
- package/dist/util/types.d.ts +12 -0
- package/package.json +5 -2
package/CHANGELOG.md
CHANGED
@@ -1,5 +1,36 @@
|
|
1
1
|
# @xata.io/client
|
2
2
|
|
3
|
+
## 0.7.2
|
4
|
+
|
5
|
+
### Patch Changes
|
6
|
+
|
7
|
+
- 4803b6f: Memoize ApiClient namespaces
|
8
|
+
- 1f268d7: Add search in XataClient
|
9
|
+
- d58c3d9: Hide private helper utilities
|
10
|
+
- f3b731b: Expose branch resolution API
|
11
|
+
|
12
|
+
## 0.7.1
|
13
|
+
|
14
|
+
### Patch Changes
|
15
|
+
|
16
|
+
- 01aef78: Fix bundle for browsers
|
17
|
+
- 56be1fd: Allow sending updates with link object
|
18
|
+
- fc51771: Add includes operator helper methods
|
19
|
+
|
20
|
+
## 0.7.0
|
21
|
+
|
22
|
+
### Minor Changes
|
23
|
+
|
24
|
+
- 6ce5512: Add bulk operations for all methods
|
25
|
+
- 2a1fa4f: Introduced automatic branch resolution mechanism
|
26
|
+
|
27
|
+
### Patch Changes
|
28
|
+
|
29
|
+
- d033f3a: Improve column selection output type with non-nullable columns
|
30
|
+
- b1e92db: Include stack trace with errors
|
31
|
+
- deed570: Improve sorting with multiple properties
|
32
|
+
- 80b5417: Improve filtering types
|
33
|
+
|
3
34
|
## 0.6.0
|
4
35
|
|
5
36
|
### Minor Changes
|
package/dist/api/client.d.ts
CHANGED
package/dist/api/client.js
CHANGED
@@ -10,50 +10,63 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
|
|
10
10
|
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
11
11
|
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
12
12
|
};
|
13
|
-
var _XataApiClient_extraProps;
|
13
|
+
var _XataApiClient_extraProps, _XataApiClient_namespaces;
|
14
14
|
Object.defineProperty(exports, "__esModule", { value: true });
|
15
15
|
exports.XataApiClient = void 0;
|
16
|
+
const config_1 = require("../util/config");
|
17
|
+
const fetch_1 = require("../util/fetch");
|
16
18
|
const components_1 = require("./components");
|
17
19
|
const providers_1 = require("./providers");
|
18
20
|
class XataApiClient {
|
19
21
|
constructor(options) {
|
20
22
|
var _a, _b;
|
21
23
|
_XataApiClient_extraProps.set(this, void 0);
|
22
|
-
|
23
|
-
const
|
24
|
-
|
25
|
-
|
26
|
-
throw new Error(
|
24
|
+
_XataApiClient_namespaces.set(this, {});
|
25
|
+
const provider = (_a = options.host) !== null && _a !== void 0 ? _a : 'production';
|
26
|
+
const apiKey = (_b = options === null || options === void 0 ? void 0 : options.apiKey) !== null && _b !== void 0 ? _b : (0, config_1.getAPIKey)();
|
27
|
+
if (!apiKey) {
|
28
|
+
throw new Error('Could not resolve a valid apiKey');
|
27
29
|
}
|
28
|
-
const provider = (_b = options.host) !== null && _b !== void 0 ? _b : 'production';
|
29
30
|
__classPrivateFieldSet(this, _XataApiClient_extraProps, {
|
30
31
|
apiUrl: (0, providers_1.getHostUrl)(provider, 'main'),
|
31
32
|
workspacesApiUrl: (0, providers_1.getHostUrl)(provider, 'workspaces'),
|
32
|
-
fetchImpl,
|
33
|
-
apiKey
|
33
|
+
fetchImpl: (0, fetch_1.getFetchImplementation)(options.fetch),
|
34
|
+
apiKey
|
34
35
|
}, "f");
|
35
36
|
}
|
36
37
|
get user() {
|
37
|
-
|
38
|
+
if (!__classPrivateFieldGet(this, _XataApiClient_namespaces, "f").user)
|
39
|
+
__classPrivateFieldGet(this, _XataApiClient_namespaces, "f").user = new UserApi(__classPrivateFieldGet(this, _XataApiClient_extraProps, "f"));
|
40
|
+
return __classPrivateFieldGet(this, _XataApiClient_namespaces, "f").user;
|
38
41
|
}
|
39
42
|
get workspaces() {
|
40
|
-
|
43
|
+
if (!__classPrivateFieldGet(this, _XataApiClient_namespaces, "f").workspaces)
|
44
|
+
__classPrivateFieldGet(this, _XataApiClient_namespaces, "f").workspaces = new WorkspaceApi(__classPrivateFieldGet(this, _XataApiClient_extraProps, "f"));
|
45
|
+
return __classPrivateFieldGet(this, _XataApiClient_namespaces, "f").workspaces;
|
41
46
|
}
|
42
47
|
get databases() {
|
43
|
-
|
48
|
+
if (!__classPrivateFieldGet(this, _XataApiClient_namespaces, "f").databases)
|
49
|
+
__classPrivateFieldGet(this, _XataApiClient_namespaces, "f").databases = new DatabaseApi(__classPrivateFieldGet(this, _XataApiClient_extraProps, "f"));
|
50
|
+
return __classPrivateFieldGet(this, _XataApiClient_namespaces, "f").databases;
|
44
51
|
}
|
45
52
|
get branches() {
|
46
|
-
|
53
|
+
if (!__classPrivateFieldGet(this, _XataApiClient_namespaces, "f").branches)
|
54
|
+
__classPrivateFieldGet(this, _XataApiClient_namespaces, "f").branches = new BranchApi(__classPrivateFieldGet(this, _XataApiClient_extraProps, "f"));
|
55
|
+
return __classPrivateFieldGet(this, _XataApiClient_namespaces, "f").branches;
|
47
56
|
}
|
48
57
|
get tables() {
|
49
|
-
|
58
|
+
if (!__classPrivateFieldGet(this, _XataApiClient_namespaces, "f").tables)
|
59
|
+
__classPrivateFieldGet(this, _XataApiClient_namespaces, "f").tables = new TableApi(__classPrivateFieldGet(this, _XataApiClient_extraProps, "f"));
|
60
|
+
return __classPrivateFieldGet(this, _XataApiClient_namespaces, "f").tables;
|
50
61
|
}
|
51
62
|
get records() {
|
52
|
-
|
63
|
+
if (!__classPrivateFieldGet(this, _XataApiClient_namespaces, "f").records)
|
64
|
+
__classPrivateFieldGet(this, _XataApiClient_namespaces, "f").records = new RecordsApi(__classPrivateFieldGet(this, _XataApiClient_extraProps, "f"));
|
65
|
+
return __classPrivateFieldGet(this, _XataApiClient_namespaces, "f").records;
|
53
66
|
}
|
54
67
|
}
|
55
68
|
exports.XataApiClient = XataApiClient;
|
56
|
-
_XataApiClient_extraProps = new WeakMap();
|
69
|
+
_XataApiClient_extraProps = new WeakMap(), _XataApiClient_namespaces = new WeakMap();
|
57
70
|
class UserApi {
|
58
71
|
constructor(extraProps) {
|
59
72
|
this.extraProps = extraProps;
|
@@ -221,7 +234,9 @@ class RecordsApi {
|
|
221
234
|
deleteRecord(workspace, database, branch, tableName, recordId) {
|
222
235
|
return components_1.operationsByTag.records.deleteRecord(Object.assign({ pathParams: { workspace, dbBranchName: `${database}:${branch}`, tableName, recordId } }, this.extraProps));
|
223
236
|
}
|
224
|
-
getRecord(workspace, database, branch, tableName, recordId,
|
237
|
+
getRecord(workspace, database, branch, tableName, recordId,
|
238
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
239
|
+
options = {}) {
|
225
240
|
return components_1.operationsByTag.records.getRecord(Object.assign({ pathParams: { workspace, dbBranchName: `${database}:${branch}`, tableName, recordId } }, this.extraProps));
|
226
241
|
}
|
227
242
|
bulkInsertTableRecords(workspace, database, branch, tableName, records) {
|
package/dist/api/components.d.ts
CHANGED
@@ -990,8 +990,9 @@ export declare type QueryTableVariables = {
|
|
990
990
|
* },
|
991
991
|
* {
|
992
992
|
* "name": "r2",
|
993
|
-
* }
|
994
|
-
* ]
|
993
|
+
* }
|
994
|
+
* ]
|
995
|
+
* }
|
995
996
|
* }
|
996
997
|
* ```
|
997
998
|
*
|
@@ -1001,7 +1002,7 @@ export declare type QueryTableVariables = {
|
|
1001
1002
|
* {
|
1002
1003
|
* "filter": {
|
1003
1004
|
* "$exists": "settings",
|
1004
|
-
* }
|
1005
|
+
* }
|
1005
1006
|
* }
|
1006
1007
|
* ```
|
1007
1008
|
*
|
@@ -1016,8 +1017,8 @@ export declare type QueryTableVariables = {
|
|
1016
1017
|
* },
|
1017
1018
|
* {
|
1018
1019
|
* "$exists": "name",
|
1019
|
-
* }
|
1020
|
-
* ]
|
1020
|
+
* }
|
1021
|
+
* ]
|
1021
1022
|
* }
|
1022
1023
|
* }
|
1023
1024
|
* ```
|
@@ -1028,7 +1029,7 @@ export declare type QueryTableVariables = {
|
|
1028
1029
|
* {
|
1029
1030
|
* "filter": {
|
1030
1031
|
* "$notExists": "settings",
|
1031
|
-
* }
|
1032
|
+
* }
|
1032
1033
|
* }
|
1033
1034
|
* ```
|
1034
1035
|
*
|
package/dist/api/components.js
CHANGED
@@ -573,8 +573,9 @@ exports.bulkInsertTableRecords = bulkInsertTableRecords;
|
|
573
573
|
* },
|
574
574
|
* {
|
575
575
|
* "name": "r2",
|
576
|
-
* }
|
577
|
-
* ]
|
576
|
+
* }
|
577
|
+
* ]
|
578
|
+
* }
|
578
579
|
* }
|
579
580
|
* ```
|
580
581
|
*
|
@@ -584,7 +585,7 @@ exports.bulkInsertTableRecords = bulkInsertTableRecords;
|
|
584
585
|
* {
|
585
586
|
* "filter": {
|
586
587
|
* "$exists": "settings",
|
587
|
-
* }
|
588
|
+
* }
|
588
589
|
* }
|
589
590
|
* ```
|
590
591
|
*
|
@@ -599,8 +600,8 @@ exports.bulkInsertTableRecords = bulkInsertTableRecords;
|
|
599
600
|
* },
|
600
601
|
* {
|
601
602
|
* "$exists": "name",
|
602
|
-
* }
|
603
|
-
* ]
|
603
|
+
* }
|
604
|
+
* ]
|
604
605
|
* }
|
605
606
|
* }
|
606
607
|
* ```
|
@@ -611,7 +612,7 @@ exports.bulkInsertTableRecords = bulkInsertTableRecords;
|
|
611
612
|
* {
|
612
613
|
* "filter": {
|
613
614
|
* "$notExists": "settings",
|
614
|
-
* }
|
615
|
+
* }
|
615
616
|
* }
|
616
617
|
* ```
|
617
618
|
*
|
package/dist/api/fetcher.d.ts
CHANGED
@@ -23,3 +23,18 @@ export declare type FetcherOptions<TBody, THeaders, TQueryParams, TPathParams> =
|
|
23
23
|
pathParams?: TPathParams;
|
24
24
|
};
|
25
25
|
export declare function fetch<TData, TBody extends Record<string, unknown> | undefined, THeaders extends Record<string, unknown>, TQueryParams extends Record<string, unknown>, TPathParams extends Record<string, string>>({ url: path, method, body, headers, pathParams, queryParams, fetchImpl, apiKey, apiUrl, workspacesApiUrl }: FetcherOptions<TBody, THeaders, TQueryParams, TPathParams> & FetcherExtraProps): Promise<TData>;
|
26
|
+
export declare class FetcherError extends Error {
|
27
|
+
status: number;
|
28
|
+
errors: Array<{
|
29
|
+
status: number;
|
30
|
+
message?: string;
|
31
|
+
}> | undefined;
|
32
|
+
constructor(data: {
|
33
|
+
message: string;
|
34
|
+
status: number;
|
35
|
+
errors?: Array<{
|
36
|
+
status: number;
|
37
|
+
message?: string;
|
38
|
+
}>;
|
39
|
+
}, parent?: Error);
|
40
|
+
}
|
package/dist/api/fetcher.js
CHANGED
@@ -9,9 +9,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
9
9
|
});
|
10
10
|
};
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
12
|
-
exports.fetch = void 0;
|
13
|
-
/* eslint-disable @typescript-eslint/no-throw-literal */
|
14
|
-
/* eslint-disable @typescript-eslint/ban-types */
|
12
|
+
exports.FetcherError = exports.fetch = void 0;
|
15
13
|
const lang_1 = require("../util/lang");
|
16
14
|
const resolveUrl = (url, queryParams = {}, pathParams = {}) => {
|
17
15
|
const query = new URLSearchParams(queryParams).toString();
|
@@ -54,20 +52,28 @@ function fetch({ url: path, method, body, headers, pathParams, queryParams, fetc
|
|
54
52
|
return jsonResponse;
|
55
53
|
}
|
56
54
|
const { message = 'Unknown error', errors } = jsonResponse;
|
57
|
-
throw
|
55
|
+
throw new FetcherError({ message, status: response.status, errors });
|
58
56
|
}
|
59
|
-
catch (
|
60
|
-
|
61
|
-
|
62
|
-
}
|
63
|
-
else {
|
64
|
-
throw withStatus({ message: 'Network response was not ok' }, response.status);
|
65
|
-
}
|
57
|
+
catch (error) {
|
58
|
+
const message = hasMessage(error) ? error.message : 'Unknown network error';
|
59
|
+
const parent = error instanceof Error ? error : undefined;
|
60
|
+
throw new FetcherError({ message, status: response.status }, parent);
|
66
61
|
}
|
67
62
|
});
|
68
63
|
}
|
69
64
|
exports.fetch = fetch;
|
70
|
-
const
|
65
|
+
const hasMessage = (error) => {
|
71
66
|
return (0, lang_1.isObject)(error) && (0, lang_1.isString)(error.message);
|
72
67
|
};
|
73
|
-
|
68
|
+
class FetcherError extends Error {
|
69
|
+
constructor(data, parent) {
|
70
|
+
super(data.message);
|
71
|
+
this.status = data.status;
|
72
|
+
this.errors = data.errors;
|
73
|
+
if (parent) {
|
74
|
+
this.stack = parent.stack;
|
75
|
+
this.cause = parent.cause;
|
76
|
+
}
|
77
|
+
}
|
78
|
+
}
|
79
|
+
exports.FetcherError = FetcherError;
|
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
package/dist/schema/filters.d.ts
CHANGED
@@ -1,22 +1,96 @@
|
|
1
|
-
import {
|
2
|
-
import { SelectableColumn } from './selection';
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
1
|
+
import { SingleOrArray } from '../util/types';
|
2
|
+
import { SelectableColumn, ValueAtColumn } from './selection';
|
3
|
+
/**
|
4
|
+
* PropertyMatchFilter
|
5
|
+
* Example:
|
6
|
+
{
|
7
|
+
"filter": {
|
8
|
+
"name": "value",
|
9
|
+
"name": {
|
10
|
+
"$is": "value",
|
11
|
+
"$any": [ "value1", "value2" ],
|
12
|
+
},
|
13
|
+
"settings.plan": {"$any": ["free", "paid"]},
|
14
|
+
"settings.plan": "free",
|
15
|
+
"settings": {
|
16
|
+
"plan": "free"
|
17
|
+
},
|
18
|
+
}
|
19
|
+
}
|
20
|
+
*/
|
21
|
+
declare type PropertyAccessFilter<Record> = {
|
22
|
+
[key in SelectableColumn<Record>]?: NestedApiFilter<ValueAtColumn<Record, key>> | PropertyFilter<ValueAtColumn<Record, key>>;
|
7
23
|
};
|
8
|
-
export declare type
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
[
|
24
|
+
export declare type PropertyFilter<T> = T | {
|
25
|
+
$is: T;
|
26
|
+
} | {
|
27
|
+
$isNot: T;
|
28
|
+
} | {
|
29
|
+
$any: T[];
|
30
|
+
} | {
|
31
|
+
$none: T[];
|
32
|
+
} | ValueTypeFilters<T>;
|
33
|
+
declare type IncludesFilter<T> = PropertyFilter<T> | {
|
34
|
+
[key in '$all' | '$none' | '$any']?: IncludesFilter<T> | Array<IncludesFilter<T> | {
|
35
|
+
$not: IncludesFilter<T>;
|
36
|
+
}>;
|
16
37
|
};
|
17
|
-
export declare type
|
18
|
-
[key in
|
19
|
-
} : Constraint<T>;
|
20
|
-
export declare type FilterConstraints<T> = {
|
21
|
-
[key in keyof T]?: T[key] extends Record<string, any> ? FilterConstraints<T[key]> : T[key] | DeepConstraint<T[key]>;
|
38
|
+
export declare type StringTypeFilter = {
|
39
|
+
[key in '$contains' | '$pattern' | '$startsWith' | '$endsWith']?: string;
|
22
40
|
};
|
41
|
+
export declare type ComparableType = number | Date;
|
42
|
+
export declare type ComparableTypeFilter<T extends ComparableType> = {
|
43
|
+
[key in '$gt' | '$lt' | '$ge' | '$le']?: T;
|
44
|
+
};
|
45
|
+
export declare type ArrayFilter<T> = {
|
46
|
+
[key in '$includes']?: SingleOrArray<PropertyFilter<T> | ValueTypeFilters<T>> | IncludesFilter<T>;
|
47
|
+
} | {
|
48
|
+
[key in '$includesAll' | '$includesNone' | '$includesAny']?: T | Array<PropertyFilter<T> | {
|
49
|
+
$not: PropertyFilter<T>;
|
50
|
+
}>;
|
51
|
+
};
|
52
|
+
declare type ValueTypeFilters<T> = T | T extends string ? StringTypeFilter : T extends number ? ComparableTypeFilter<number> : T extends Date ? ComparableTypeFilter<Date> : T extends Array<infer T> ? ArrayFilter<T> : never;
|
53
|
+
/**
|
54
|
+
* AggregatorFilter
|
55
|
+
* Example:
|
56
|
+
{
|
57
|
+
"filter": {
|
58
|
+
"$any": {
|
59
|
+
"settings.dark": true,
|
60
|
+
"settings.plan": "free"
|
61
|
+
}
|
62
|
+
},
|
63
|
+
}
|
64
|
+
{
|
65
|
+
"filter": {
|
66
|
+
"$any": [
|
67
|
+
{
|
68
|
+
"name": "r1",
|
69
|
+
},
|
70
|
+
{
|
71
|
+
"name": "r2",
|
72
|
+
},
|
73
|
+
],
|
74
|
+
}
|
75
|
+
*/
|
76
|
+
declare type AggregatorFilter<Record> = {
|
77
|
+
[key in '$all' | '$any' | '$not' | '$none']?: SingleOrArray<Filter<Record>>;
|
78
|
+
};
|
79
|
+
/**
|
80
|
+
* Existance filter
|
81
|
+
* Example: { filter: { $exists: "settings" } }
|
82
|
+
*/
|
83
|
+
export declare type ExistanceFilter<Record> = {
|
84
|
+
[key in '$exists' | '$notExists']?: SelectableColumn<Record>;
|
85
|
+
};
|
86
|
+
declare type BaseApiFilter<Record> = PropertyAccessFilter<Record> | AggregatorFilter<Record> | ExistanceFilter<Record>;
|
87
|
+
/**
|
88
|
+
* Nested filter
|
89
|
+
* Injects the Api filters on nested properties
|
90
|
+
* Example: { filter: { settings: { plan: { $any: ['free', 'trial'] } } } }
|
91
|
+
*/
|
92
|
+
declare type NestedApiFilter<T> = T extends Record<string, any> ? {
|
93
|
+
[key in keyof T]?: T[key] extends Record<string, any> ? SingleOrArray<Filter<T[key]>> : PropertyFilter<T[key]>;
|
94
|
+
} : PropertyFilter<T>;
|
95
|
+
export declare type Filter<Record> = BaseApiFilter<Record> | NestedApiFilter<Record>;
|
96
|
+
export {};
|
package/dist/schema/filters.js
CHANGED
@@ -1,25 +1,2 @@
|
|
1
1
|
"use strict";
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
-
exports.buildSortFilter = exports.isSortFilterObject = void 0;
|
4
|
-
const lang_1 = require("../util/lang");
|
5
|
-
function isSortFilterObject(filter) {
|
6
|
-
return (0, lang_1.isObject)(filter) && filter.column !== undefined;
|
7
|
-
}
|
8
|
-
exports.isSortFilterObject = isSortFilterObject;
|
9
|
-
function buildSortFilter(filter) {
|
10
|
-
if (!filter)
|
11
|
-
return undefined;
|
12
|
-
const filters = Array.isArray(filter) ? filter : [filter];
|
13
|
-
return filters.reduce((acc, item) => {
|
14
|
-
if (typeof item === 'string') {
|
15
|
-
return Object.assign(Object.assign({}, acc), { [item]: 'asc' });
|
16
|
-
}
|
17
|
-
else if (isSortFilterObject(item)) {
|
18
|
-
return Object.assign(Object.assign({}, acc), { [item.column]: item.direction });
|
19
|
-
}
|
20
|
-
else {
|
21
|
-
return acc;
|
22
|
-
}
|
23
|
-
}, {});
|
24
|
-
}
|
25
|
-
exports.buildSortFilter = buildSortFilter;
|
@@ -0,0 +1 @@
|
|
1
|
+
export {};
|
@@ -0,0 +1,175 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
// Single column with implicit is
|
4
|
+
const singleColumnWithImplicitIs = { name: 'r2' };
|
5
|
+
// Single column with explicit is
|
6
|
+
const singleColumnWithExplicitIs = { name: { $is: 'r2' } };
|
7
|
+
// Is string
|
8
|
+
const isString = { string: 'string' };
|
9
|
+
// Is true
|
10
|
+
const isTrue = { boolean: true };
|
11
|
+
// Is false
|
12
|
+
const isFalse = { boolean: false };
|
13
|
+
// Is pos int
|
14
|
+
const isPosInt = { number: 1234567 };
|
15
|
+
// Is neg int
|
16
|
+
const isNegInt = { number: -42 };
|
17
|
+
// Is float
|
18
|
+
const isFloat = { number: 3.14 };
|
19
|
+
// with dots
|
20
|
+
const withDots = { 'settings.plan': 'free' };
|
21
|
+
// Nested columns
|
22
|
+
const nestedColumns = { settings: { plan: 'free' } };
|
23
|
+
// Nested columns array
|
24
|
+
const nestedColumnsArray = { settings: [{ dark: false }, { plan: 'free' }] };
|
25
|
+
// Nested columns any
|
26
|
+
const nestedColumnsAny = { settings: { $any: [{ plan: 'free' }, { plan: 'trial' }] } };
|
27
|
+
// Nested columns any value
|
28
|
+
const nestedColumnsAnyValue = { settings: { plan: { $any: ['free', 'trial'] } } };
|
29
|
+
// Or with $any
|
30
|
+
const orWithAny = { 'settings.plan': { $any: ['free', 'paid'] } };
|
31
|
+
// Multiple columns implicit and
|
32
|
+
const multipleColumnsImplicitAnd = { 'settings.dark': true, 'settings.plan': 'free' };
|
33
|
+
// Explicit $all with multi-key filter list
|
34
|
+
const explicitAllWithMultiKeyFilterList = {
|
35
|
+
$all: { 'settings.dark': true, 'settings.plan': 'free' }
|
36
|
+
};
|
37
|
+
// Explicit $all with filter list
|
38
|
+
const explicitAllWithFilterList = {
|
39
|
+
$all: [{ 'settings.dark': true }, { 'settings.plan': 'free' }]
|
40
|
+
};
|
41
|
+
// Explicit $any with multi-key filter list
|
42
|
+
const explicitAnyWithMultiKeyFilterList = {
|
43
|
+
$all: { 'settings.dark': true, 'settings.plan': 'free' }
|
44
|
+
};
|
45
|
+
// Explicit $any with filter list
|
46
|
+
const explicitAnyWithFilterList = {
|
47
|
+
$any: [{ 'settings.dark': true }, { 'settings.plan': 'free' }]
|
48
|
+
};
|
49
|
+
// $any with multiple values
|
50
|
+
const anyWithMultipleValues = { number: { $any: [1, 2, 3] } };
|
51
|
+
// $none with multiple values
|
52
|
+
const noneWithMultipleValues = { number: { $none: [1, 2, 3] } };
|
53
|
+
// Exists filter
|
54
|
+
const existsFilter = { $exists: 'test' };
|
55
|
+
// Not exists filter
|
56
|
+
const notExistsFilter = { $notExists: 'test' };
|
57
|
+
// Exists with all
|
58
|
+
const existsWithAll = { $all: [{ $exists: 'settings' }, { $exists: 'name' }] };
|
59
|
+
// Nest any with not
|
60
|
+
const nestAnyWithNot = { $not: { $any: { 'settings.dark': true, 'settings.plan': 'free' } } };
|
61
|
+
// Mix $all and $any with extra keys
|
62
|
+
const mixAllAndAnyWithExtraKeys = {
|
63
|
+
$all: { $any: { 'settings.dark': false, 'settings.plan': 'free' }, name: 'r1' }
|
64
|
+
};
|
65
|
+
// Range query with less first
|
66
|
+
const rangeQueryWithLessFirst = { age: { $lt: 30, $ge: 20 } };
|
67
|
+
// Range query with greater first
|
68
|
+
const rangeQueryWithGreaterFirst = { age: { $ge: 20, $lt: 30 } };
|
69
|
+
// Ordered op
|
70
|
+
const orderedOp = { age: { $lt: 30 } };
|
71
|
+
// Simple includes
|
72
|
+
const simpleIncludes = { labels: { $includes: 'test' } };
|
73
|
+
// Simple includes with op
|
74
|
+
const simpleIncludesWithOp = { labels: { $includes: { $contains: 'test' } } };
|
75
|
+
// Simple includes multiple
|
76
|
+
const simpleIncludesMultiple = { labels: { $includes: ['a', 'b', 'c'] } };
|
77
|
+
// Simple includes multiple with op
|
78
|
+
const simpleIncludesMultipleWithOp = {
|
79
|
+
labels: { $includes: [{ $is: 'a' }, { $is: 'b' }, { $is: 'c' }] }
|
80
|
+
};
|
81
|
+
// Includes with many comparisons
|
82
|
+
const includesWithManyComparisons = {
|
83
|
+
labels: { $includes: { $all: [{ $contains: 'a' }, { $contains: 'b' }] } }
|
84
|
+
};
|
85
|
+
// Simple includes multiple op and value
|
86
|
+
const simpleIncludesMultipleOpAndValue = { labels: { $includes: [{ $contains: 'a' }, 'b'] } };
|
87
|
+
// Includes with mode and array of filters
|
88
|
+
const includesWithModeAndArrayOfFilters = {
|
89
|
+
labels: { $includesNone: [{ $contains: 'test' }, 'abc', { $endsWith: 'bad' }] }
|
90
|
+
};
|
91
|
+
// Includes with mix of any and all in predicate position
|
92
|
+
const includesWithMixOfAnyAndAllInPredicatePosition = {
|
93
|
+
labels: { $includes: { $any: { $all: [{ $startsWith: 'test' }, { $contains: 'x' }], $any: ['a', 'b'] } } }
|
94
|
+
};
|
95
|
+
// Simple $includesany
|
96
|
+
const simpleIncludesAny = { labels: { $includesAny: 'test' } };
|
97
|
+
// Simple $includesall
|
98
|
+
const simpleIncludesAll = { labels: { $includesAll: 'test' } };
|
99
|
+
// Simple $includesnone
|
100
|
+
const simpleIncludesNone = { labels: { $includesNone: 'test' } };
|
101
|
+
// Exists value must be string not int
|
102
|
+
// @ts-expect-error
|
103
|
+
const existsValueMustBeStringNotInt = { $exists: 42 };
|
104
|
+
// Exists value must be string not objct
|
105
|
+
// @ts-expect-error
|
106
|
+
const existsValueMustBeStringNotObject = { $exists: { field: 'settings.unknown' } };
|
107
|
+
// Filter by one column
|
108
|
+
const filterByOneColumn = { name: 'r1' };
|
109
|
+
// Filter with the $is operator
|
110
|
+
const filterWithTheIsOperator = { name: { $is: 'r1' } };
|
111
|
+
// Filter with dot notation
|
112
|
+
const filterWithDotNotation = { 'settings.plan': 'free' };
|
113
|
+
// Filter with nested object
|
114
|
+
const filterWithNestedObject = { 'settings.plan': { $is: 'free' } };
|
115
|
+
// Filter with $any operation
|
116
|
+
const filterWithAnyOperation = { 'settings.plan': { $any: ['free', 'paid'] } };
|
117
|
+
// Filter with and operations
|
118
|
+
const filterWithAndOperations = { 'settings.dark': true, 'settings.plan': 'free' };
|
119
|
+
// Filter with both and and any operations
|
120
|
+
const filterWithBothAndAndAnyOperations = {
|
121
|
+
$any: { 'settings.dark': true, 'settings.plan': 'free' }
|
122
|
+
};
|
123
|
+
// Filter with both and and any operations in array
|
124
|
+
const filterWithBothAndAndAnyOperationsInArray = { $any: [{ name: 'r1' }, { name: 'r2' }] };
|
125
|
+
// Filter with exists operation
|
126
|
+
const filterWithExistsOperation = { $exists: 'settings' };
|
127
|
+
// Filter with exists, and and any operations
|
128
|
+
const filterWithExistsAndAndAnyOperations = {
|
129
|
+
$all: [{ $exists: 'settings' }, { $exists: 'name' }]
|
130
|
+
};
|
131
|
+
// Filter with not exists operation
|
132
|
+
const filterWithNotExistsOperation = { $notExists: 'settings' };
|
133
|
+
// Filter with partial match
|
134
|
+
const filterWithPartialMatch = { name: { $contains: 'value' } };
|
135
|
+
// Filter with pattern operator
|
136
|
+
const filterWithPatternOperator = { name: { $pattern: 'value' } };
|
137
|
+
// Filter with $startsWith and $endsWith operators
|
138
|
+
const filterWithStartsWithAndEndsWithOperators = {
|
139
|
+
name: { $startsWith: 'value', $endsWith: 'value' }
|
140
|
+
};
|
141
|
+
// Filter with numeric ranges
|
142
|
+
const filterWithNumericRanges = { age: { $lt: 30, $ge: 20 } };
|
143
|
+
// Filter with negations
|
144
|
+
const filterWithNegations = { $not: { name: 'r1' } };
|
145
|
+
// Filter with complex negations
|
146
|
+
const filterWithComplexNegations = { $not: { $any: [{ name: 'r1' }, { name: 'r2' }] } };
|
147
|
+
// Filter with arrays complex negations
|
148
|
+
const filterWithArraysComplexNegations = {
|
149
|
+
labels: {
|
150
|
+
$includes: {
|
151
|
+
$all: [{ $contains: 'label' }, { $not: { $endsWith: '-debug' } }]
|
152
|
+
}
|
153
|
+
}
|
154
|
+
};
|
155
|
+
// Filters with $includesAll
|
156
|
+
const filtersWithIncludesAll = {
|
157
|
+
'settings.labels': {
|
158
|
+
$includesAll: [{ $contains: 'label' }]
|
159
|
+
}
|
160
|
+
};
|
161
|
+
// Filter with invalid property type
|
162
|
+
// @ts-expect-error
|
163
|
+
const filterWithInvalidPropertyType = { name: 42 };
|
164
|
+
// Filter with invalid dot notation property type
|
165
|
+
// @ts-expect-error
|
166
|
+
const filterWithInvalidNestedPropertyType = { 'settings.plan': 42 };
|
167
|
+
// Filter with invalid nested object property type
|
168
|
+
// @ts-expect-error
|
169
|
+
const filterWithInvalidNestedObjectPropertyType = { settings: { plan: 42 } };
|
170
|
+
// Filter with invalid property $is type
|
171
|
+
// @ts-expect-error
|
172
|
+
const filterWithInvalidOperator = { name: { $is: 42 } };
|
173
|
+
test('fake test', () => {
|
174
|
+
// This is a fake test to make sure that the type definitions in this file are working
|
175
|
+
});
|