@xata.io/client 0.0.0-beta.09892c4 → 0.0.0-beta.09bfef8

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.
Files changed (41) hide show
  1. package/.eslintrc.cjs +13 -0
  2. package/CHANGELOG.md +27 -0
  3. package/dist/api/client.d.ts +1 -1
  4. package/dist/api/client.js +11 -9
  5. package/dist/api/fetcher.d.ts +15 -0
  6. package/dist/api/fetcher.js +23 -22
  7. package/dist/api/providers.js +3 -2
  8. package/dist/api/responses.d.ts +6 -0
  9. package/dist/schema/config.d.ts +4 -0
  10. package/dist/schema/config.js +83 -0
  11. package/dist/schema/filters.d.ts +93 -17
  12. package/dist/schema/filters.js +0 -22
  13. package/dist/schema/filters.spec.d.ts +1 -0
  14. package/dist/schema/filters.spec.js +175 -0
  15. package/dist/schema/index.d.ts +1 -0
  16. package/dist/schema/index.js +4 -1
  17. package/dist/schema/operators.d.ts +17 -27
  18. package/dist/schema/operators.js +1 -14
  19. package/dist/schema/pagination.d.ts +13 -13
  20. package/dist/schema/pagination.js +0 -1
  21. package/dist/schema/query.d.ts +39 -50
  22. package/dist/schema/query.js +25 -37
  23. package/dist/schema/record.d.ts +25 -3
  24. package/dist/schema/record.js +11 -0
  25. package/dist/schema/repository.d.ts +79 -35
  26. package/dist/schema/repository.js +208 -114
  27. package/dist/schema/selection.d.ts +24 -11
  28. package/dist/schema/selection.spec.d.ts +1 -0
  29. package/dist/schema/selection.spec.js +203 -0
  30. package/dist/schema/sorting.d.ts +17 -0
  31. package/dist/schema/sorting.js +28 -0
  32. package/dist/schema/sorting.spec.d.ts +1 -0
  33. package/dist/schema/sorting.spec.js +9 -0
  34. package/dist/util/environment.d.ts +5 -0
  35. package/dist/util/environment.js +68 -0
  36. package/dist/util/fetch.d.ts +2 -0
  37. package/dist/util/fetch.js +13 -0
  38. package/dist/util/lang.d.ts +3 -0
  39. package/dist/util/lang.js +13 -1
  40. package/dist/util/types.d.ts +22 -1
  41. package/package.json +2 -2
package/.eslintrc.cjs ADDED
@@ -0,0 +1,13 @@
1
+ module.exports = {
2
+ ignorePatterns: ["dist"],
3
+ parserOptions: {
4
+ ecmaVersion: 2020,
5
+ sourceType: 'module',
6
+ project: 'client/tsconfig.json'
7
+ },
8
+ rules: {
9
+ '@typescript-eslint/no-explicit-any': 'off',
10
+ '@typescript-eslint/ban-types': 'off',
11
+ '@typescript-eslint/no-floating-promises': 'error',
12
+ }
13
+ };
package/CHANGELOG.md CHANGED
@@ -1,5 +1,32 @@
1
1
  # @xata.io/client
2
2
 
3
+ ## 0.7.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 6ce5512: Add bulk operations for all methods
8
+ - 2a1fa4f: Introduced automatic branch resolution mechanism
9
+
10
+ ### Patch Changes
11
+
12
+ - d033f3a: Improve column selection output type with non-nullable columns
13
+ - b1e92db: Include stack trace with errors
14
+ - deed570: Improve sorting with multiple properties
15
+ - 80b5417: Improve filtering types
16
+
17
+ ## 0.6.0
18
+
19
+ ### Minor Changes
20
+
21
+ - 084f5df: Add type inference for columns
22
+ - bb73c89: Unify create and insert in a single method overload
23
+
24
+ ### Patch Changes
25
+
26
+ - 716c487: Forward nullable types on links
27
+ - bb66bb2: Fix error handling with createMany
28
+ - 084f5df: Fix circular dependencies on selectable column
29
+
3
30
  ## 0.5.1
4
31
 
5
32
  ### Patch Changes
@@ -5,7 +5,7 @@ import type * as Responses from './responses';
5
5
  import type * as Schemas from './schemas';
6
6
  export interface XataApiClientOptions {
7
7
  fetch?: FetchImpl;
8
- apiKey: string;
8
+ apiKey?: string;
9
9
  host?: HostProvider;
10
10
  }
11
11
  export declare class XataApiClient {
@@ -13,24 +13,24 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
13
13
  var _XataApiClient_extraProps;
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
15
  exports.XataApiClient = void 0;
16
+ const config_1 = require("../schema/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
- const globalFetch = typeof fetch !== 'undefined' ? fetch : undefined;
23
- const fetchImpl = (_a = options.fetch) !== null && _a !== void 0 ? _a : globalFetch;
24
- if (!fetchImpl) {
25
- /** @todo add a link after docs exist */
26
- throw new Error(`The \`fetch\` option passed to the Xata client is resolving to a falsy value and may not be correctly imported.`);
24
+ const provider = (_a = options.host) !== null && _a !== void 0 ? _a : 'production';
25
+ const apiKey = (_b = options === null || options === void 0 ? void 0 : options.apiKey) !== null && _b !== void 0 ? _b : (0, config_1.getAPIKey)();
26
+ if (!apiKey) {
27
+ throw new Error('Could not resolve a valid apiKey');
27
28
  }
28
- const provider = (_b = options.host) !== null && _b !== void 0 ? _b : 'production';
29
29
  __classPrivateFieldSet(this, _XataApiClient_extraProps, {
30
30
  apiUrl: (0, providers_1.getHostUrl)(provider, 'main'),
31
31
  workspacesApiUrl: (0, providers_1.getHostUrl)(provider, 'workspaces'),
32
- fetchImpl,
33
- apiKey: options.apiKey
32
+ fetchImpl: (0, fetch_1.getFetchImplementation)(options.fetch),
33
+ apiKey
34
34
  }, "f");
35
35
  }
36
36
  get user() {
@@ -221,7 +221,9 @@ class RecordsApi {
221
221
  deleteRecord(workspace, database, branch, tableName, recordId) {
222
222
  return components_1.operationsByTag.records.deleteRecord(Object.assign({ pathParams: { workspace, dbBranchName: `${database}:${branch}`, tableName, recordId } }, this.extraProps));
223
223
  }
224
- getRecord(workspace, database, branch, tableName, recordId, options = {}) {
224
+ getRecord(workspace, database, branch, tableName, recordId,
225
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
226
+ options = {}) {
225
227
  return components_1.operationsByTag.records.getRecord(Object.assign({ pathParams: { workspace, dbBranchName: `${database}:${branch}`, tableName, recordId } }, this.extraProps));
226
228
  }
227
229
  bulkInsertTableRecords(workspace, database, branch, tableName, records) {
@@ -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
+ }
@@ -9,13 +9,13 @@ 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;
12
+ exports.FetcherError = exports.fetch = void 0;
13
+ const lang_1 = require("../util/lang");
13
14
  const resolveUrl = (url, queryParams = {}, pathParams = {}) => {
14
15
  const query = new URLSearchParams(queryParams).toString();
15
16
  const queryString = query.length > 0 ? `?${query}` : '';
16
17
  return url.replace(/\{\w*\}/g, (key) => pathParams[key.slice(1, -1)]) + queryString;
17
18
  };
18
- const fallbackError = { message: 'Network response was not ok' };
19
19
  function buildBaseUrl({ path, workspacesApiUrl, apiUrl, pathParams }) {
20
20
  if (!(pathParams === null || pathParams === void 0 ? void 0 : pathParams.workspace))
21
21
  return `${apiUrl}${path}`;
@@ -51,28 +51,29 @@ function fetch({ url: path, method, body, headers, pathParams, queryParams, fetc
51
51
  if (response.ok) {
52
52
  return jsonResponse;
53
53
  }
54
- if (jsonResponse.message) {
55
- throw withStatus({ message: jsonResponse.message }, response.status);
56
- }
57
- else {
58
- throw withStatus(fallbackError, response.status);
59
- }
54
+ const { message = 'Unknown error', errors } = jsonResponse;
55
+ throw new FetcherError({ message, status: response.status, errors });
60
56
  }
61
- catch (e) {
62
- if (e instanceof Error) {
63
- const error = {
64
- message: e.message
65
- };
66
- throw withStatus(error, response.status);
67
- }
68
- else if (typeof e === 'object' && typeof e.message === 'string') {
69
- throw withStatus(e, response.status);
70
- }
71
- else {
72
- throw withStatus(fallbackError, response.status);
73
- }
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);
74
61
  }
75
62
  });
76
63
  }
77
64
  exports.fetch = fetch;
78
- const withStatus = (error, status) => (Object.assign(Object.assign({}, error), { status }));
65
+ const hasMessage = (error) => {
66
+ return (0, lang_1.isObject)(error) && (0, lang_1.isString)(error.message);
67
+ };
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;
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getHostUrl = void 0;
4
+ const lang_1 = require("../util/lang");
4
5
  function getHostUrl(provider, type) {
5
6
  if (isValidAlias(provider)) {
6
7
  return providers[provider][type];
@@ -22,8 +23,8 @@ const providers = {
22
23
  }
23
24
  };
24
25
  function isValidAlias(alias) {
25
- return typeof alias === 'string' && Object.keys(providers).includes(alias);
26
+ return (0, lang_1.isString)(alias) && Object.keys(providers).includes(alias);
26
27
  }
27
28
  function isValidBuilder(builder) {
28
- return typeof builder === 'object' && typeof builder.main === 'string' && typeof builder.workspaces === 'string';
29
+ return (0, lang_1.isObject)(builder) && (0, lang_1.isString)(builder.main) && (0, lang_1.isString)(builder.workspaces);
29
30
  }
@@ -19,6 +19,12 @@ export declare type AuthError = {
19
19
  id?: string;
20
20
  message: string;
21
21
  };
22
+ export declare type BulkError = {
23
+ errors: {
24
+ message?: string;
25
+ status?: number;
26
+ }[];
27
+ };
22
28
  export declare type BranchMigrationPlan = {
23
29
  version: number;
24
30
  migration: Schemas.BranchMigration;
@@ -0,0 +1,4 @@
1
+ import { FetcherExtraProps } from '../api/fetcher';
2
+ export declare function getBranch(fetchProps: Omit<FetcherExtraProps, 'workspacesApiUrl'>): Promise<string | undefined>;
3
+ export declare function getDatabaseUrl(): string | undefined;
4
+ export declare function getAPIKey(): string | undefined;
@@ -0,0 +1,83 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.getAPIKey = exports.getDatabaseUrl = exports.getBranch = void 0;
13
+ const api_1 = require("../api");
14
+ const environment_1 = require("../util/environment");
15
+ const lang_1 = require("../util/lang");
16
+ const envBranchNames = [
17
+ 'XATA_BRANCH',
18
+ 'VERCEL_GIT_COMMIT_REF',
19
+ 'CF_PAGES_BRANCH',
20
+ 'BRANCH' // Netlify. Putting it the last one because it is more ambiguous
21
+ ];
22
+ function getBranch(fetchProps) {
23
+ return __awaiter(this, void 0, void 0, function* () {
24
+ const env = getBranchByEnvVariable();
25
+ if (env)
26
+ return env;
27
+ const branch = yield (0, environment_1.getGitBranch)();
28
+ if (!branch)
29
+ return undefined;
30
+ // TODO: in the future, call /resolve endpoint
31
+ // For now, call API to see if the branch exists. If not, use a default value.
32
+ const [protocol, , host, , database] = fetchProps.apiUrl.split('/');
33
+ const [workspace] = host.split('.');
34
+ const dbBranchName = `${database}:${branch}`;
35
+ try {
36
+ yield (0, api_1.getBranchDetails)(Object.assign(Object.assign({}, fetchProps), { workspacesApiUrl: `${protocol}//${host}`, pathParams: {
37
+ dbBranchName,
38
+ workspace
39
+ } }));
40
+ }
41
+ catch (err) {
42
+ if ((0, lang_1.isObject)(err) && err.status === 404)
43
+ return 'main';
44
+ throw err;
45
+ }
46
+ return branch;
47
+ });
48
+ }
49
+ exports.getBranch = getBranch;
50
+ function getBranchByEnvVariable() {
51
+ for (const name of envBranchNames) {
52
+ const value = (0, environment_1.getEnvVariable)(name);
53
+ if (value) {
54
+ return value;
55
+ }
56
+ }
57
+ try {
58
+ return XATA_BRANCH;
59
+ }
60
+ catch (err) {
61
+ // Ignore ReferenceError. Only CloudFlare workers set env variables as global variables
62
+ }
63
+ }
64
+ function getDatabaseUrl() {
65
+ var _a;
66
+ try {
67
+ return (_a = (0, environment_1.getEnvVariable)('XATA_DATABASE_URL')) !== null && _a !== void 0 ? _a : XATA_DATABASE_URL;
68
+ }
69
+ catch (err) {
70
+ return undefined;
71
+ }
72
+ }
73
+ exports.getDatabaseUrl = getDatabaseUrl;
74
+ function getAPIKey() {
75
+ var _a;
76
+ try {
77
+ return (_a = (0, environment_1.getEnvVariable)('XATA_API_KEY')) !== null && _a !== void 0 ? _a : XATA_API_KEY;
78
+ }
79
+ catch (err) {
80
+ return undefined;
81
+ }
82
+ }
83
+ exports.getAPIKey = getAPIKey;
@@ -1,20 +1,96 @@
1
- export declare type SortDirection = 'asc' | 'desc';
2
- export declare type SortFilterExtended<T> = {
3
- column: keyof T;
4
- direction?: SortDirection;
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>>;
5
23
  };
6
- export declare type SortFilter<T> = SortFilterExtended<T> | keyof T;
7
- export declare function isSortFilterObject<T>(filter: SortFilter<T>): filter is SortFilterExtended<T>;
8
- export declare type FilterOperator = '$gt' | '$lt' | '$ge' | '$le' | '$exists' | '$notExists' | '$endsWith' | '$startsWith' | '$pattern' | '$is' | '$isNot' | '$contains' | '$includes' | '$includesSubstring' | '$includesPattern' | '$includesAll';
9
- export declare function buildSortFilter<T>(filter?: SortFilter<T> | SortFilter<T>[]): {
10
- [key: string]: SortDirection;
11
- } | undefined;
12
- export declare type Constraint<T> = {
13
- [key in FilterOperator]?: T;
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
+ }>;
14
37
  };
15
- export declare type DeepConstraint<T> = T extends Record<string, any> ? {
16
- [key in keyof T]?: T[key] | DeepConstraint<T[key]>;
17
- } : Constraint<T>;
18
- export declare type FilterConstraints<T> = {
19
- [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;
20
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 {};
@@ -1,24 +1,2 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.buildSortFilter = exports.isSortFilterObject = void 0;
4
- function isSortFilterObject(filter) {
5
- return typeof filter === 'object' && filter.column !== undefined;
6
- }
7
- exports.isSortFilterObject = isSortFilterObject;
8
- function buildSortFilter(filter) {
9
- if (!filter)
10
- return undefined;
11
- const filters = Array.isArray(filter) ? filter : [filter];
12
- return filters.reduce((acc, item) => {
13
- if (typeof item === 'string') {
14
- return Object.assign(Object.assign({}, acc), { [item]: 'asc' });
15
- }
16
- else if (isSortFilterObject(item)) {
17
- return Object.assign(Object.assign({}, acc), { [item.column]: item.direction });
18
- }
19
- else {
20
- return acc;
21
- }
22
- }, {});
23
- }
24
- 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
+ });
@@ -1,6 +1,7 @@
1
1
  export * from './operators';
2
2
  export * from './pagination';
3
3
  export { Query } from './query';
4
+ export { isIdentifiable, isXataRecord } from './record';
4
5
  export type { Identifiable, XataRecord } from './record';
5
6
  export { BaseClient, Repository, RestRepository, RestRespositoryFactory } from './repository';
6
7
  export type { XataClientOptions } from './repository';
@@ -14,11 +14,14 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- exports.RestRespositoryFactory = exports.RestRepository = exports.Repository = exports.BaseClient = exports.Query = void 0;
17
+ exports.RestRespositoryFactory = exports.RestRepository = exports.Repository = exports.BaseClient = exports.isXataRecord = exports.isIdentifiable = exports.Query = void 0;
18
18
  __exportStar(require("./operators"), exports);
19
19
  __exportStar(require("./pagination"), exports);
20
20
  var query_1 = require("./query");
21
21
  Object.defineProperty(exports, "Query", { enumerable: true, get: function () { return query_1.Query; } });
22
+ var record_1 = require("./record");
23
+ Object.defineProperty(exports, "isIdentifiable", { enumerable: true, get: function () { return record_1.isIdentifiable; } });
24
+ Object.defineProperty(exports, "isXataRecord", { enumerable: true, get: function () { return record_1.isXataRecord; } });
22
25
  var repository_1 = require("./repository");
23
26
  Object.defineProperty(exports, "BaseClient", { enumerable: true, get: function () { return repository_1.BaseClient; } });
24
27
  Object.defineProperty(exports, "Repository", { enumerable: true, get: function () { return repository_1.Repository; } });