@xata.io/client 0.0.0-alpha.vf7b5320 → 0.0.0-alpha.vf7fccd9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.mjs CHANGED
@@ -1,3 +1,25 @@
1
+ const defaultTrace = async (_name, fn, _options) => {
2
+ return await fn({
3
+ setAttributes: () => {
4
+ return;
5
+ }
6
+ });
7
+ };
8
+ const TraceAttributes = {
9
+ KIND: "xata.trace.kind",
10
+ VERSION: "xata.sdk.version",
11
+ TABLE: "xata.table",
12
+ HTTP_REQUEST_ID: "http.request_id",
13
+ HTTP_STATUS_CODE: "http.status_code",
14
+ HTTP_HOST: "http.host",
15
+ HTTP_SCHEME: "http.scheme",
16
+ HTTP_USER_AGENT: "http.user_agent",
17
+ HTTP_METHOD: "http.method",
18
+ HTTP_URL: "http.url",
19
+ HTTP_ROUTE: "http.route",
20
+ HTTP_TARGET: "http.target"
21
+ };
22
+
1
23
  function notEmpty(value) {
2
24
  return value !== null && value !== void 0;
3
25
  }
@@ -7,46 +29,101 @@ function compact(arr) {
7
29
  function isObject(value) {
8
30
  return Boolean(value) && typeof value === "object" && !Array.isArray(value);
9
31
  }
32
+ function isDefined(value) {
33
+ return value !== null && value !== void 0;
34
+ }
10
35
  function isString(value) {
11
- return value !== void 0 && value !== null && typeof value === "string";
36
+ return isDefined(value) && typeof value === "string";
37
+ }
38
+ function isStringArray(value) {
39
+ return isDefined(value) && Array.isArray(value) && value.every(isString);
12
40
  }
13
41
  function toBase64(value) {
14
42
  try {
15
43
  return btoa(value);
16
44
  } catch (err) {
17
- return Buffer.from(value).toString("base64");
45
+ const buf = Buffer;
46
+ return buf.from(value).toString("base64");
18
47
  }
19
48
  }
20
49
 
21
- function getEnvVariable(name) {
50
+ function getEnvironment() {
22
51
  try {
23
- if (isObject(process) && isString(process?.env?.[name])) {
24
- return process.env[name];
52
+ if (isObject(process) && isObject(process.env)) {
53
+ return {
54
+ apiKey: process.env.XATA_API_KEY ?? getGlobalApiKey(),
55
+ databaseURL: process.env.XATA_DATABASE_URL ?? getGlobalDatabaseURL(),
56
+ branch: process.env.XATA_BRANCH ?? getGlobalBranch(),
57
+ envBranch: process.env.VERCEL_GIT_COMMIT_REF ?? process.env.CF_PAGES_BRANCH ?? process.env.BRANCH,
58
+ fallbackBranch: process.env.XATA_FALLBACK_BRANCH ?? getGlobalFallbackBranch()
59
+ };
25
60
  }
26
61
  } catch (err) {
27
62
  }
28
63
  try {
29
- if (isObject(Deno) && isString(Deno?.env?.get(name))) {
30
- return Deno.env.get(name);
64
+ if (isObject(Deno) && isObject(Deno.env)) {
65
+ return {
66
+ apiKey: Deno.env.get("XATA_API_KEY") ?? getGlobalApiKey(),
67
+ databaseURL: Deno.env.get("XATA_DATABASE_URL") ?? getGlobalDatabaseURL(),
68
+ branch: Deno.env.get("XATA_BRANCH") ?? getGlobalBranch(),
69
+ envBranch: Deno.env.get("VERCEL_GIT_COMMIT_REF") ?? Deno.env.get("CF_PAGES_BRANCH") ?? Deno.env.get("BRANCH"),
70
+ fallbackBranch: Deno.env.get("XATA_FALLBACK_BRANCH") ?? getGlobalFallbackBranch()
71
+ };
31
72
  }
32
73
  } catch (err) {
33
74
  }
75
+ return {
76
+ apiKey: getGlobalApiKey(),
77
+ databaseURL: getGlobalDatabaseURL(),
78
+ branch: getGlobalBranch(),
79
+ envBranch: void 0,
80
+ fallbackBranch: getGlobalFallbackBranch()
81
+ };
82
+ }
83
+ function getGlobalApiKey() {
84
+ try {
85
+ return XATA_API_KEY;
86
+ } catch (err) {
87
+ return void 0;
88
+ }
89
+ }
90
+ function getGlobalDatabaseURL() {
91
+ try {
92
+ return XATA_DATABASE_URL;
93
+ } catch (err) {
94
+ return void 0;
95
+ }
96
+ }
97
+ function getGlobalBranch() {
98
+ try {
99
+ return XATA_BRANCH;
100
+ } catch (err) {
101
+ return void 0;
102
+ }
103
+ }
104
+ function getGlobalFallbackBranch() {
105
+ try {
106
+ return XATA_FALLBACK_BRANCH;
107
+ } catch (err) {
108
+ return void 0;
109
+ }
34
110
  }
35
111
  async function getGitBranch() {
112
+ const cmd = ["git", "branch", "--show-current"];
113
+ const fullCmd = cmd.join(" ");
114
+ const nodeModule = ["child", "process"].join("_");
115
+ const execOptions = { encoding: "utf-8", stdio: ["ignore", "pipe", "ignore"] };
36
116
  try {
37
117
  if (typeof require === "function") {
38
- const req = require;
39
- return req("child_process").execSync("git branch --show-current", { encoding: "utf-8" }).trim();
118
+ return require(nodeModule).execSync(fullCmd, execOptions).trim();
40
119
  }
120
+ const { execSync } = await import(nodeModule);
121
+ return execSync(fullCmd, execOptions).toString().trim();
41
122
  } catch (err) {
42
123
  }
43
124
  try {
44
125
  if (isObject(Deno)) {
45
- const process2 = Deno.run({
46
- cmd: ["git", "branch", "--show-current"],
47
- stdout: "piped",
48
- stderr: "piped"
49
- });
126
+ const process2 = Deno.run({ cmd, stdout: "piped", stderr: "null" });
50
127
  return new TextDecoder().decode(await process2.output()).trim();
51
128
  }
52
129
  } catch (err) {
@@ -55,7 +132,8 @@ async function getGitBranch() {
55
132
 
56
133
  function getAPIKey() {
57
134
  try {
58
- return getEnvVariable("XATA_API_KEY") ?? XATA_API_KEY;
135
+ const { apiKey } = getEnvironment();
136
+ return apiKey;
59
137
  } catch (err) {
60
138
  return void 0;
61
139
  }
@@ -65,21 +143,35 @@ function getFetchImplementation(userFetch) {
65
143
  const globalFetch = typeof fetch !== "undefined" ? fetch : void 0;
66
144
  const fetchImpl = userFetch ?? globalFetch;
67
145
  if (!fetchImpl) {
68
- throw new Error(`The \`fetch\` option passed to the Xata client is resolving to a falsy value and may not be correctly imported.`);
146
+ throw new Error(
147
+ `Couldn't find \`fetch\`. Install a fetch implementation such as \`node-fetch\` and pass it explicitly.`
148
+ );
69
149
  }
70
150
  return fetchImpl;
71
151
  }
72
152
 
73
- class FetcherError extends Error {
74
- constructor(status, data) {
153
+ const VERSION = "0.0.0-alpha.vf7fccd9";
154
+
155
+ class ErrorWithCause extends Error {
156
+ constructor(message, options) {
157
+ super(message, options);
158
+ }
159
+ }
160
+ class FetcherError extends ErrorWithCause {
161
+ constructor(status, data, requestId) {
75
162
  super(getMessage(data));
76
163
  this.status = status;
77
164
  this.errors = isBulkError(data) ? data.errors : void 0;
165
+ this.requestId = requestId;
78
166
  if (data instanceof Error) {
79
167
  this.stack = data.stack;
80
168
  this.cause = data.cause;
81
169
  }
82
170
  }
171
+ toString() {
172
+ const error = super.toString();
173
+ return `[${this.status}] (${this.requestId ?? "Unknown"}): ${error}`;
174
+ }
83
175
  }
84
176
  function isBulkError(error) {
85
177
  return isObject(error) && Array.isArray(error.errors);
@@ -102,9 +194,17 @@ function getMessage(data) {
102
194
  }
103
195
 
104
196
  const resolveUrl = (url, queryParams = {}, pathParams = {}) => {
105
- const query = new URLSearchParams(queryParams).toString();
197
+ const cleanQueryParams = Object.entries(queryParams).reduce((acc, [key, value]) => {
198
+ if (value === void 0 || value === null)
199
+ return acc;
200
+ return { ...acc, [key]: value };
201
+ }, {});
202
+ const query = new URLSearchParams(cleanQueryParams).toString();
106
203
  const queryString = query.length > 0 ? `?${query}` : "";
107
- return url.replace(/\{\w*\}/g, (key) => pathParams[key.slice(1, -1)]) + queryString;
204
+ const cleanPathParams = Object.entries(pathParams).reduce((acc, [key, value]) => {
205
+ return { ...acc, [key]: encodeURIComponent(String(value ?? "")).replace("%3A", ":") };
206
+ }, {});
207
+ return url.replace(/\{\w*\}/g, (key) => cleanPathParams[key.slice(1, -1)]) + queryString;
108
208
  };
109
209
  function buildBaseUrl({
110
210
  path,
@@ -112,10 +212,10 @@ function buildBaseUrl({
112
212
  apiUrl,
113
213
  pathParams
114
214
  }) {
115
- if (!pathParams?.workspace)
215
+ if (pathParams?.workspace === void 0)
116
216
  return `${apiUrl}${path}`;
117
217
  const url = typeof workspacesApiUrl === "string" ? `${workspacesApiUrl}${path}` : workspacesApiUrl(path, pathParams);
118
- return url.replace("{workspaceId}", pathParams.workspace);
218
+ return url.replace("{workspaceId}", String(pathParams.workspace));
119
219
  }
120
220
  function hostHeader(url) {
121
221
  const pattern = /.*:\/\/(?<host>[^/]+).*/;
@@ -132,32 +232,61 @@ async function fetch$1({
132
232
  fetchImpl,
133
233
  apiKey,
134
234
  apiUrl,
135
- workspacesApiUrl
235
+ workspacesApiUrl,
236
+ trace
136
237
  }) {
137
- const baseUrl = buildBaseUrl({ path, workspacesApiUrl, pathParams, apiUrl });
138
- const fullUrl = resolveUrl(baseUrl, queryParams, pathParams);
139
- const url = fullUrl.includes("localhost") ? fullUrl.replace(/^[^.]+\./, "http://") : fullUrl;
140
- const response = await fetchImpl(url, {
141
- method: method.toUpperCase(),
142
- body: body ? JSON.stringify(body) : void 0,
143
- headers: {
144
- "Content-Type": "application/json",
145
- ...headers,
146
- ...hostHeader(fullUrl),
147
- Authorization: `Bearer ${apiKey}`
148
- }
149
- });
150
- if (response.status === 204) {
151
- return {};
152
- }
238
+ return trace(
239
+ `${method.toUpperCase()} ${path}`,
240
+ async ({ setAttributes }) => {
241
+ const baseUrl = buildBaseUrl({ path, workspacesApiUrl, pathParams, apiUrl });
242
+ const fullUrl = resolveUrl(baseUrl, queryParams, pathParams);
243
+ const url = fullUrl.includes("localhost") ? fullUrl.replace(/^[^.]+\./, "http://") : fullUrl;
244
+ setAttributes({
245
+ [TraceAttributes.HTTP_URL]: url,
246
+ [TraceAttributes.HTTP_TARGET]: resolveUrl(path, queryParams, pathParams)
247
+ });
248
+ const response = await fetchImpl(url, {
249
+ method: method.toUpperCase(),
250
+ body: body ? JSON.stringify(body) : void 0,
251
+ headers: {
252
+ "Content-Type": "application/json",
253
+ "User-Agent": `Xata client-ts/${VERSION}`,
254
+ ...headers,
255
+ ...hostHeader(fullUrl),
256
+ Authorization: `Bearer ${apiKey}`
257
+ }
258
+ });
259
+ if (response.status === 204) {
260
+ return {};
261
+ }
262
+ const { host, protocol } = parseUrl(response.url);
263
+ const requestId = response.headers?.get("x-request-id") ?? void 0;
264
+ setAttributes({
265
+ [TraceAttributes.KIND]: "http",
266
+ [TraceAttributes.HTTP_REQUEST_ID]: requestId,
267
+ [TraceAttributes.HTTP_STATUS_CODE]: response.status,
268
+ [TraceAttributes.HTTP_HOST]: host,
269
+ [TraceAttributes.HTTP_SCHEME]: protocol?.replace(":", "")
270
+ });
271
+ try {
272
+ const jsonResponse = await response.json();
273
+ if (response.ok) {
274
+ return jsonResponse;
275
+ }
276
+ throw new FetcherError(response.status, jsonResponse, requestId);
277
+ } catch (error) {
278
+ throw new FetcherError(response.status, error, requestId);
279
+ }
280
+ },
281
+ { [TraceAttributes.HTTP_METHOD]: method.toUpperCase(), [TraceAttributes.HTTP_ROUTE]: path }
282
+ );
283
+ }
284
+ function parseUrl(url) {
153
285
  try {
154
- const jsonResponse = await response.json();
155
- if (response.ok) {
156
- return jsonResponse;
157
- }
158
- throw new FetcherError(response.status, jsonResponse);
286
+ const { host, protocol } = new URL(url);
287
+ return { host, protocol };
159
288
  } catch (error) {
160
- throw new FetcherError(response.status, error);
289
+ return {};
161
290
  }
162
291
  }
163
292
 
@@ -216,6 +345,7 @@ const removeWorkspaceMember = (variables) => fetch$1({
216
345
  ...variables
217
346
  });
218
347
  const inviteWorkspaceMember = (variables) => fetch$1({ url: "/workspaces/{workspaceId}/invites", method: "post", ...variables });
348
+ const updateWorkspaceMemberInvite = (variables) => fetch$1({ url: "/workspaces/{workspaceId}/invites/{inviteId}", method: "patch", ...variables });
219
349
  const cancelWorkspaceMemberInvite = (variables) => fetch$1({
220
350
  url: "/workspaces/{workspaceId}/invites/{inviteId}",
221
351
  method: "delete",
@@ -251,6 +381,12 @@ const deleteDatabase = (variables) => fetch$1({
251
381
  method: "delete",
252
382
  ...variables
253
383
  });
384
+ const getDatabaseMetadata = (variables) => fetch$1({
385
+ url: "/dbs/{dbName}/metadata",
386
+ method: "get",
387
+ ...variables
388
+ });
389
+ const updateDatabaseMetadata = (variables) => fetch$1({ url: "/dbs/{dbName}/metadata", method: "patch", ...variables });
254
390
  const getGitBranchesMapping = (variables) => fetch$1({ url: "/dbs/{dbName}/gitBranches", method: "get", ...variables });
255
391
  const addGitBranchesEntry = (variables) => fetch$1({ url: "/dbs/{dbName}/gitBranches", method: "post", ...variables });
256
392
  const removeGitBranchesEntry = (variables) => fetch$1({ url: "/dbs/{dbName}/gitBranches", method: "delete", ...variables });
@@ -259,16 +395,28 @@ const resolveBranch = (variables) => fetch$1({
259
395
  method: "get",
260
396
  ...variables
261
397
  });
262
- const getBranchDetails = (variables) => fetch$1({
263
- url: "/db/{dbBranchName}",
398
+ const listMigrationRequests = (variables) => fetch$1({ url: "/dbs/{dbName}/migrations/list", method: "post", ...variables });
399
+ const createMigrationRequest = (variables) => fetch$1({ url: "/dbs/{dbName}/migrations", method: "post", ...variables });
400
+ const getMigrationRequest = (variables) => fetch$1({
401
+ url: "/dbs/{dbName}/migrations/{mrNumber}",
264
402
  method: "get",
265
403
  ...variables
266
404
  });
267
- const createBranch = (variables) => fetch$1({
405
+ const updateMigrationRequest = (variables) => fetch$1({ url: "/dbs/{dbName}/migrations/{mrNumber}", method: "patch", ...variables });
406
+ const listMigrationRequestsCommits = (variables) => fetch$1({ url: "/dbs/{dbName}/migrations/{mrNumber}/commits", method: "post", ...variables });
407
+ const compareMigrationRequest = (variables) => fetch$1({ url: "/dbs/{dbName}/migrations/{mrNumber}/compare", method: "post", ...variables });
408
+ const getMigrationRequestIsMerged = (variables) => fetch$1({ url: "/dbs/{dbName}/migrations/{mrNumber}/merge", method: "get", ...variables });
409
+ const mergeMigrationRequest = (variables) => fetch$1({
410
+ url: "/dbs/{dbName}/migrations/{mrNumber}/merge",
411
+ method: "post",
412
+ ...variables
413
+ });
414
+ const getBranchDetails = (variables) => fetch$1({
268
415
  url: "/db/{dbBranchName}",
269
- method: "put",
416
+ method: "get",
270
417
  ...variables
271
418
  });
419
+ const createBranch = (variables) => fetch$1({ url: "/db/{dbBranchName}", method: "put", ...variables });
272
420
  const deleteBranch = (variables) => fetch$1({
273
421
  url: "/db/{dbBranchName}",
274
422
  method: "delete",
@@ -287,6 +435,16 @@ const getBranchMetadata = (variables) => fetch$1({
287
435
  const getBranchMigrationHistory = (variables) => fetch$1({ url: "/db/{dbBranchName}/migrations", method: "get", ...variables });
288
436
  const executeBranchMigrationPlan = (variables) => fetch$1({ url: "/db/{dbBranchName}/migrations/execute", method: "post", ...variables });
289
437
  const getBranchMigrationPlan = (variables) => fetch$1({ url: "/db/{dbBranchName}/migrations/plan", method: "post", ...variables });
438
+ const compareBranchWithUserSchema = (variables) => fetch$1({ url: "/db/{dbBranchName}/schema/compare", method: "post", ...variables });
439
+ const compareBranchSchemas = (variables) => fetch$1({ url: "/db/{dbBranchName}/schema/compare/{branchName}", method: "post", ...variables });
440
+ const updateBranchSchema = (variables) => fetch$1({
441
+ url: "/db/{dbBranchName}/schema/update",
442
+ method: "post",
443
+ ...variables
444
+ });
445
+ const previewBranchSchemaEdit = (variables) => fetch$1({ url: "/db/{dbBranchName}/schema/preview", method: "post", ...variables });
446
+ const applyBranchSchemaEdit = (variables) => fetch$1({ url: "/db/{dbBranchName}/schema/apply", method: "post", ...variables });
447
+ const getBranchSchemaHistory = (variables) => fetch$1({ url: "/db/{dbBranchName}/schema/history", method: "post", ...variables });
290
448
  const getBranchStats = (variables) => fetch$1({
291
449
  url: "/db/{dbBranchName}/stats",
292
450
  method: "get",
@@ -342,11 +500,7 @@ const updateColumn = (variables) => fetch$1({
342
500
  method: "patch",
343
501
  ...variables
344
502
  });
345
- const insertRecord = (variables) => fetch$1({
346
- url: "/db/{dbBranchName}/tables/{tableName}/data",
347
- method: "post",
348
- ...variables
349
- });
503
+ const insertRecord = (variables) => fetch$1({ url: "/db/{dbBranchName}/tables/{tableName}/data", method: "post", ...variables });
350
504
  const insertRecordWithID = (variables) => fetch$1({ url: "/db/{dbBranchName}/tables/{tableName}/data/{recordId}", method: "put", ...variables });
351
505
  const updateRecordWithID = (variables) => fetch$1({ url: "/db/{dbBranchName}/tables/{tableName}/data/{recordId}", method: "patch", ...variables });
352
506
  const upsertRecordWithID = (variables) => fetch$1({ url: "/db/{dbBranchName}/tables/{tableName}/data/{recordId}", method: "post", ...variables });
@@ -366,11 +520,21 @@ const queryTable = (variables) => fetch$1({
366
520
  method: "post",
367
521
  ...variables
368
522
  });
523
+ const searchTable = (variables) => fetch$1({
524
+ url: "/db/{dbBranchName}/tables/{tableName}/search",
525
+ method: "post",
526
+ ...variables
527
+ });
369
528
  const searchBranch = (variables) => fetch$1({
370
529
  url: "/db/{dbBranchName}/search",
371
530
  method: "post",
372
531
  ...variables
373
532
  });
533
+ const summarizeTable = (variables) => fetch$1({
534
+ url: "/db/{dbBranchName}/tables/{tableName}/summarize",
535
+ method: "post",
536
+ ...variables
537
+ });
374
538
  const operationsByTag = {
375
539
  users: { getUser, updateUser, deleteUser, getUserAPIKeys, createUserAPIKey, deleteUserAPIKey },
376
540
  workspaces: {
@@ -383,6 +547,7 @@ const operationsByTag = {
383
547
  updateWorkspaceMemberRole,
384
548
  removeWorkspaceMember,
385
549
  inviteWorkspaceMember,
550
+ updateWorkspaceMemberInvite,
386
551
  cancelWorkspaceMemberInvite,
387
552
  resendWorkspaceMemberInvite,
388
553
  acceptWorkspaceMemberInvite
@@ -391,6 +556,8 @@ const operationsByTag = {
391
556
  getDatabaseList,
392
557
  createDatabase,
393
558
  deleteDatabase,
559
+ getDatabaseMetadata,
560
+ updateDatabaseMetadata,
394
561
  getGitBranchesMapping,
395
562
  addGitBranchesEntry,
396
563
  removeGitBranchesEntry,
@@ -403,10 +570,28 @@ const operationsByTag = {
403
570
  deleteBranch,
404
571
  updateBranchMetadata,
405
572
  getBranchMetadata,
573
+ getBranchStats
574
+ },
575
+ migrationRequests: {
576
+ listMigrationRequests,
577
+ createMigrationRequest,
578
+ getMigrationRequest,
579
+ updateMigrationRequest,
580
+ listMigrationRequestsCommits,
581
+ compareMigrationRequest,
582
+ getMigrationRequestIsMerged,
583
+ mergeMigrationRequest
584
+ },
585
+ branchSchema: {
406
586
  getBranchMigrationHistory,
407
587
  executeBranchMigrationPlan,
408
588
  getBranchMigrationPlan,
409
- getBranchStats
589
+ compareBranchWithUserSchema,
590
+ compareBranchSchemas,
591
+ updateBranchSchema,
592
+ previewBranchSchemaEdit,
593
+ applyBranchSchemaEdit,
594
+ getBranchSchemaHistory
410
595
  },
411
596
  table: {
412
597
  createTable,
@@ -429,14 +614,16 @@ const operationsByTag = {
429
614
  getRecord,
430
615
  bulkInsertTableRecords,
431
616
  queryTable,
432
- searchBranch
617
+ searchTable,
618
+ searchBranch,
619
+ summarizeTable
433
620
  }
434
621
  };
435
622
 
436
623
  function getHostUrl(provider, type) {
437
- if (isValidAlias(provider)) {
624
+ if (isHostProviderAlias(provider)) {
438
625
  return providers[provider][type];
439
- } else if (isValidBuilder(provider)) {
626
+ } else if (isHostProviderBuilder(provider)) {
440
627
  return provider[type];
441
628
  }
442
629
  throw new Error("Invalid API provider");
@@ -451,10 +638,10 @@ const providers = {
451
638
  workspaces: "https://{workspaceId}.staging.xatabase.co"
452
639
  }
453
640
  };
454
- function isValidAlias(alias) {
641
+ function isHostProviderAlias(alias) {
455
642
  return isString(alias) && Object.keys(providers).includes(alias);
456
643
  }
457
- function isValidBuilder(builder) {
644
+ function isHostProviderBuilder(builder) {
458
645
  return isObject(builder) && isString(builder.main) && isString(builder.workspaces);
459
646
  }
460
647
 
@@ -471,7 +658,7 @@ var __privateAdd$7 = (obj, member, value) => {
471
658
  throw TypeError("Cannot add the same private member more than once");
472
659
  member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
473
660
  };
474
- var __privateSet$6 = (obj, member, value, setter) => {
661
+ var __privateSet$7 = (obj, member, value, setter) => {
475
662
  __accessCheck$7(obj, member, "write to private field");
476
663
  setter ? setter.call(obj, value) : member.set(obj, value);
477
664
  return value;
@@ -482,15 +669,17 @@ class XataApiClient {
482
669
  __privateAdd$7(this, _extraProps, void 0);
483
670
  __privateAdd$7(this, _namespaces, {});
484
671
  const provider = options.host ?? "production";
485
- const apiKey = options?.apiKey ?? getAPIKey();
672
+ const apiKey = options.apiKey ?? getAPIKey();
673
+ const trace = options.trace ?? defaultTrace;
486
674
  if (!apiKey) {
487
675
  throw new Error("Could not resolve a valid apiKey");
488
676
  }
489
- __privateSet$6(this, _extraProps, {
677
+ __privateSet$7(this, _extraProps, {
490
678
  apiUrl: getHostUrl(provider, "main"),
491
679
  workspacesApiUrl: getHostUrl(provider, "workspaces"),
492
680
  fetchImpl: getFetchImplementation(options.fetch),
493
- apiKey
681
+ apiKey,
682
+ trace
494
683
  });
495
684
  }
496
685
  get user() {
@@ -523,6 +712,16 @@ class XataApiClient {
523
712
  __privateGet$7(this, _namespaces).records = new RecordsApi(__privateGet$7(this, _extraProps));
524
713
  return __privateGet$7(this, _namespaces).records;
525
714
  }
715
+ get migrationRequests() {
716
+ if (!__privateGet$7(this, _namespaces).migrationRequests)
717
+ __privateGet$7(this, _namespaces).migrationRequests = new MigrationRequestsApi(__privateGet$7(this, _extraProps));
718
+ return __privateGet$7(this, _namespaces).migrationRequests;
719
+ }
720
+ get branchSchema() {
721
+ if (!__privateGet$7(this, _namespaces).branchSchema)
722
+ __privateGet$7(this, _namespaces).branchSchema = new BranchSchemaApi(__privateGet$7(this, _extraProps));
723
+ return __privateGet$7(this, _namespaces).branchSchema;
724
+ }
526
725
  }
527
726
  _extraProps = new WeakMap();
528
727
  _namespaces = new WeakMap();
@@ -613,6 +812,13 @@ class WorkspaceApi {
613
812
  ...this.extraProps
614
813
  });
615
814
  }
815
+ updateWorkspaceMemberInvite(workspaceId, inviteId, role) {
816
+ return operationsByTag.workspaces.updateWorkspaceMemberInvite({
817
+ pathParams: { workspaceId, inviteId },
818
+ body: { role },
819
+ ...this.extraProps
820
+ });
821
+ }
616
822
  cancelWorkspaceMemberInvite(workspaceId, inviteId) {
617
823
  return operationsByTag.workspaces.cancelWorkspaceMemberInvite({
618
824
  pathParams: { workspaceId, inviteId },
@@ -655,6 +861,19 @@ class DatabaseApi {
655
861
  ...this.extraProps
656
862
  });
657
863
  }
864
+ getDatabaseMetadata(workspace, dbName) {
865
+ return operationsByTag.database.getDatabaseMetadata({
866
+ pathParams: { workspace, dbName },
867
+ ...this.extraProps
868
+ });
869
+ }
870
+ updateDatabaseMetadata(workspace, dbName, options = {}) {
871
+ return operationsByTag.database.updateDatabaseMetadata({
872
+ pathParams: { workspace, dbName },
873
+ body: options,
874
+ ...this.extraProps
875
+ });
876
+ }
658
877
  getGitBranchesMapping(workspace, dbName) {
659
878
  return operationsByTag.database.getGitBranchesMapping({
660
879
  pathParams: { workspace, dbName },
@@ -675,10 +894,10 @@ class DatabaseApi {
675
894
  ...this.extraProps
676
895
  });
677
896
  }
678
- resolveBranch(workspace, dbName, gitBranch) {
897
+ resolveBranch(workspace, dbName, gitBranch, fallbackBranch) {
679
898
  return operationsByTag.database.resolveBranch({
680
899
  pathParams: { workspace, dbName },
681
- queryParams: { gitBranch },
900
+ queryParams: { gitBranch, fallbackBranch },
682
901
  ...this.extraProps
683
902
  });
684
903
  }
@@ -699,10 +918,10 @@ class BranchApi {
699
918
  ...this.extraProps
700
919
  });
701
920
  }
702
- createBranch(workspace, database, branch, from = "", options = {}) {
921
+ createBranch(workspace, database, branch, from, options = {}) {
703
922
  return operationsByTag.branch.createBranch({
704
923
  pathParams: { workspace, dbBranchName: `${database}:${branch}` },
705
- queryParams: { from },
924
+ queryParams: isString(from) ? { from } : void 0,
706
925
  body: options,
707
926
  ...this.extraProps
708
927
  });
@@ -726,27 +945,6 @@ class BranchApi {
726
945
  ...this.extraProps
727
946
  });
728
947
  }
729
- getBranchMigrationHistory(workspace, database, branch, options = {}) {
730
- return operationsByTag.branch.getBranchMigrationHistory({
731
- pathParams: { workspace, dbBranchName: `${database}:${branch}` },
732
- body: options,
733
- ...this.extraProps
734
- });
735
- }
736
- executeBranchMigrationPlan(workspace, database, branch, migrationPlan) {
737
- return operationsByTag.branch.executeBranchMigrationPlan({
738
- pathParams: { workspace, dbBranchName: `${database}:${branch}` },
739
- body: migrationPlan,
740
- ...this.extraProps
741
- });
742
- }
743
- getBranchMigrationPlan(workspace, database, branch, schema) {
744
- return operationsByTag.branch.getBranchMigrationPlan({
745
- pathParams: { workspace, dbBranchName: `${database}:${branch}` },
746
- body: schema,
747
- ...this.extraProps
748
- });
749
- }
750
948
  getBranchStats(workspace, database, branch) {
751
949
  return operationsByTag.branch.getBranchStats({
752
950
  pathParams: { workspace, dbBranchName: `${database}:${branch}` },
@@ -827,9 +1025,10 @@ class RecordsApi {
827
1025
  constructor(extraProps) {
828
1026
  this.extraProps = extraProps;
829
1027
  }
830
- insertRecord(workspace, database, branch, tableName, record) {
1028
+ insertRecord(workspace, database, branch, tableName, record, options = {}) {
831
1029
  return operationsByTag.records.insertRecord({
832
1030
  pathParams: { workspace, dbBranchName: `${database}:${branch}`, tableName },
1031
+ queryParams: options,
833
1032
  body: record,
834
1033
  ...this.extraProps
835
1034
  });
@@ -858,21 +1057,24 @@ class RecordsApi {
858
1057
  ...this.extraProps
859
1058
  });
860
1059
  }
861
- deleteRecord(workspace, database, branch, tableName, recordId) {
1060
+ deleteRecord(workspace, database, branch, tableName, recordId, options = {}) {
862
1061
  return operationsByTag.records.deleteRecord({
863
1062
  pathParams: { workspace, dbBranchName: `${database}:${branch}`, tableName, recordId },
1063
+ queryParams: options,
864
1064
  ...this.extraProps
865
1065
  });
866
1066
  }
867
1067
  getRecord(workspace, database, branch, tableName, recordId, options = {}) {
868
1068
  return operationsByTag.records.getRecord({
869
1069
  pathParams: { workspace, dbBranchName: `${database}:${branch}`, tableName, recordId },
1070
+ queryParams: options,
870
1071
  ...this.extraProps
871
1072
  });
872
1073
  }
873
- bulkInsertTableRecords(workspace, database, branch, tableName, records) {
1074
+ bulkInsertTableRecords(workspace, database, branch, tableName, records, options = {}) {
874
1075
  return operationsByTag.records.bulkInsertTableRecords({
875
1076
  pathParams: { workspace, dbBranchName: `${database}:${branch}`, tableName },
1077
+ queryParams: options,
876
1078
  body: { records },
877
1079
  ...this.extraProps
878
1080
  });
@@ -884,6 +1086,13 @@ class RecordsApi {
884
1086
  ...this.extraProps
885
1087
  });
886
1088
  }
1089
+ searchTable(workspace, database, branch, tableName, query) {
1090
+ return operationsByTag.records.searchTable({
1091
+ pathParams: { workspace, dbBranchName: `${database}:${branch}`, tableName },
1092
+ body: query,
1093
+ ...this.extraProps
1094
+ });
1095
+ }
887
1096
  searchBranch(workspace, database, branch, query) {
888
1097
  return operationsByTag.records.searchBranch({
889
1098
  pathParams: { workspace, dbBranchName: `${database}:${branch}` },
@@ -891,6 +1100,138 @@ class RecordsApi {
891
1100
  ...this.extraProps
892
1101
  });
893
1102
  }
1103
+ summarizeTable(workspace, database, branch, tableName, query) {
1104
+ return operationsByTag.records.summarizeTable({
1105
+ pathParams: { workspace, dbBranchName: `${database}:${branch}`, tableName },
1106
+ body: query,
1107
+ ...this.extraProps
1108
+ });
1109
+ }
1110
+ }
1111
+ class MigrationRequestsApi {
1112
+ constructor(extraProps) {
1113
+ this.extraProps = extraProps;
1114
+ }
1115
+ listMigrationRequests(workspace, database, options = {}) {
1116
+ return operationsByTag.migrationRequests.listMigrationRequests({
1117
+ pathParams: { workspace, dbName: database },
1118
+ body: options,
1119
+ ...this.extraProps
1120
+ });
1121
+ }
1122
+ createMigrationRequest(workspace, database, options) {
1123
+ return operationsByTag.migrationRequests.createMigrationRequest({
1124
+ pathParams: { workspace, dbName: database },
1125
+ body: options,
1126
+ ...this.extraProps
1127
+ });
1128
+ }
1129
+ getMigrationRequest(workspace, database, migrationRequest) {
1130
+ return operationsByTag.migrationRequests.getMigrationRequest({
1131
+ pathParams: { workspace, dbName: database, mrNumber: migrationRequest },
1132
+ ...this.extraProps
1133
+ });
1134
+ }
1135
+ updateMigrationRequest(workspace, database, migrationRequest, options) {
1136
+ return operationsByTag.migrationRequests.updateMigrationRequest({
1137
+ pathParams: { workspace, dbName: database, mrNumber: migrationRequest },
1138
+ body: options,
1139
+ ...this.extraProps
1140
+ });
1141
+ }
1142
+ listMigrationRequestsCommits(workspace, database, migrationRequest, options = {}) {
1143
+ return operationsByTag.migrationRequests.listMigrationRequestsCommits({
1144
+ pathParams: { workspace, dbName: database, mrNumber: migrationRequest },
1145
+ body: options,
1146
+ ...this.extraProps
1147
+ });
1148
+ }
1149
+ compareMigrationRequest(workspace, database, migrationRequest) {
1150
+ return operationsByTag.migrationRequests.compareMigrationRequest({
1151
+ pathParams: { workspace, dbName: database, mrNumber: migrationRequest },
1152
+ ...this.extraProps
1153
+ });
1154
+ }
1155
+ getMigrationRequestIsMerged(workspace, database, migrationRequest) {
1156
+ return operationsByTag.migrationRequests.getMigrationRequestIsMerged({
1157
+ pathParams: { workspace, dbName: database, mrNumber: migrationRequest },
1158
+ ...this.extraProps
1159
+ });
1160
+ }
1161
+ mergeMigrationRequest(workspace, database, migrationRequest) {
1162
+ return operationsByTag.migrationRequests.mergeMigrationRequest({
1163
+ pathParams: { workspace, dbName: database, mrNumber: migrationRequest },
1164
+ ...this.extraProps
1165
+ });
1166
+ }
1167
+ }
1168
+ class BranchSchemaApi {
1169
+ constructor(extraProps) {
1170
+ this.extraProps = extraProps;
1171
+ }
1172
+ getBranchMigrationHistory(workspace, database, branch, options = {}) {
1173
+ return operationsByTag.branchSchema.getBranchMigrationHistory({
1174
+ pathParams: { workspace, dbBranchName: `${database}:${branch}` },
1175
+ body: options,
1176
+ ...this.extraProps
1177
+ });
1178
+ }
1179
+ executeBranchMigrationPlan(workspace, database, branch, migrationPlan) {
1180
+ return operationsByTag.branchSchema.executeBranchMigrationPlan({
1181
+ pathParams: { workspace, dbBranchName: `${database}:${branch}` },
1182
+ body: migrationPlan,
1183
+ ...this.extraProps
1184
+ });
1185
+ }
1186
+ getBranchMigrationPlan(workspace, database, branch, schema) {
1187
+ return operationsByTag.branchSchema.getBranchMigrationPlan({
1188
+ pathParams: { workspace, dbBranchName: `${database}:${branch}` },
1189
+ body: schema,
1190
+ ...this.extraProps
1191
+ });
1192
+ }
1193
+ compareBranchWithUserSchema(workspace, database, branch, schema) {
1194
+ return operationsByTag.branchSchema.compareBranchWithUserSchema({
1195
+ pathParams: { workspace, dbBranchName: `${database}:${branch}` },
1196
+ body: { schema },
1197
+ ...this.extraProps
1198
+ });
1199
+ }
1200
+ compareBranchSchemas(workspace, database, branch, branchName, schema) {
1201
+ return operationsByTag.branchSchema.compareBranchSchemas({
1202
+ pathParams: { workspace, dbBranchName: `${database}:${branch}`, branchName },
1203
+ body: { schema },
1204
+ ...this.extraProps
1205
+ });
1206
+ }
1207
+ updateBranchSchema(workspace, database, branch, migration) {
1208
+ return operationsByTag.branchSchema.updateBranchSchema({
1209
+ pathParams: { workspace, dbBranchName: `${database}:${branch}` },
1210
+ body: migration,
1211
+ ...this.extraProps
1212
+ });
1213
+ }
1214
+ previewBranchSchemaEdit(workspace, database, branch, migration) {
1215
+ return operationsByTag.branchSchema.previewBranchSchemaEdit({
1216
+ pathParams: { workspace, dbBranchName: `${database}:${branch}` },
1217
+ body: migration,
1218
+ ...this.extraProps
1219
+ });
1220
+ }
1221
+ applyBranchSchemaEdit(workspace, database, branch, edits) {
1222
+ return operationsByTag.branchSchema.applyBranchSchemaEdit({
1223
+ pathParams: { workspace, dbBranchName: `${database}:${branch}` },
1224
+ body: { edits },
1225
+ ...this.extraProps
1226
+ });
1227
+ }
1228
+ getBranchSchemaHistory(workspace, database, branch, options = {}) {
1229
+ return operationsByTag.branchSchema.getBranchSchemaHistory({
1230
+ pathParams: { workspace, dbBranchName: `${database}:${branch}` },
1231
+ body: options,
1232
+ ...this.extraProps
1233
+ });
1234
+ }
894
1235
  }
895
1236
 
896
1237
  class XataApiPlugin {
@@ -916,18 +1257,18 @@ var __privateAdd$6 = (obj, member, value) => {
916
1257
  throw TypeError("Cannot add the same private member more than once");
917
1258
  member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
918
1259
  };
919
- var __privateSet$5 = (obj, member, value, setter) => {
1260
+ var __privateSet$6 = (obj, member, value, setter) => {
920
1261
  __accessCheck$6(obj, member, "write to private field");
921
1262
  setter ? setter.call(obj, value) : member.set(obj, value);
922
1263
  return value;
923
1264
  };
924
- var _query;
1265
+ var _query, _page;
925
1266
  class Page {
926
1267
  constructor(query, meta, records = []) {
927
1268
  __privateAdd$6(this, _query, void 0);
928
- __privateSet$5(this, _query, query);
1269
+ __privateSet$6(this, _query, query);
929
1270
  this.meta = meta;
930
- this.records = records;
1271
+ this.records = new RecordArray(this, records);
931
1272
  }
932
1273
  async nextPage(size, offset) {
933
1274
  return __privateGet$6(this, _query).getPaginated({ pagination: { size, offset, after: this.meta.page.cursor } });
@@ -947,9 +1288,56 @@ class Page {
947
1288
  }
948
1289
  _query = new WeakMap();
949
1290
  const PAGINATION_MAX_SIZE = 200;
950
- const PAGINATION_DEFAULT_SIZE = 200;
1291
+ const PAGINATION_DEFAULT_SIZE = 20;
951
1292
  const PAGINATION_MAX_OFFSET = 800;
952
1293
  const PAGINATION_DEFAULT_OFFSET = 0;
1294
+ function isCursorPaginationOptions(options) {
1295
+ return isDefined(options) && (isDefined(options.first) || isDefined(options.last) || isDefined(options.after) || isDefined(options.before));
1296
+ }
1297
+ const _RecordArray = class extends Array {
1298
+ constructor(...args) {
1299
+ super(..._RecordArray.parseConstructorParams(...args));
1300
+ __privateAdd$6(this, _page, void 0);
1301
+ __privateSet$6(this, _page, isObject(args[0]?.meta) ? args[0] : { meta: { page: { cursor: "", more: false } }, records: [] });
1302
+ }
1303
+ static parseConstructorParams(...args) {
1304
+ if (args.length === 1 && typeof args[0] === "number") {
1305
+ return new Array(args[0]);
1306
+ }
1307
+ if (args.length <= 2 && isObject(args[0]?.meta) && Array.isArray(args[1] ?? [])) {
1308
+ const result = args[1] ?? args[0].records ?? [];
1309
+ return new Array(...result);
1310
+ }
1311
+ return new Array(...args);
1312
+ }
1313
+ toArray() {
1314
+ return new Array(...this);
1315
+ }
1316
+ map(callbackfn, thisArg) {
1317
+ return this.toArray().map(callbackfn, thisArg);
1318
+ }
1319
+ async nextPage(size, offset) {
1320
+ const newPage = await __privateGet$6(this, _page).nextPage(size, offset);
1321
+ return new _RecordArray(newPage);
1322
+ }
1323
+ async previousPage(size, offset) {
1324
+ const newPage = await __privateGet$6(this, _page).previousPage(size, offset);
1325
+ return new _RecordArray(newPage);
1326
+ }
1327
+ async firstPage(size, offset) {
1328
+ const newPage = await __privateGet$6(this, _page).firstPage(size, offset);
1329
+ return new _RecordArray(newPage);
1330
+ }
1331
+ async lastPage(size, offset) {
1332
+ const newPage = await __privateGet$6(this, _page).lastPage(size, offset);
1333
+ return new _RecordArray(newPage);
1334
+ }
1335
+ hasNextPage() {
1336
+ return __privateGet$6(this, _page).meta.page.more;
1337
+ }
1338
+ };
1339
+ let RecordArray = _RecordArray;
1340
+ _page = new WeakMap();
953
1341
 
954
1342
  var __accessCheck$5 = (obj, member, msg) => {
955
1343
  if (!member.has(obj))
@@ -964,25 +1352,26 @@ var __privateAdd$5 = (obj, member, value) => {
964
1352
  throw TypeError("Cannot add the same private member more than once");
965
1353
  member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
966
1354
  };
967
- var __privateSet$4 = (obj, member, value, setter) => {
1355
+ var __privateSet$5 = (obj, member, value, setter) => {
968
1356
  __accessCheck$5(obj, member, "write to private field");
969
1357
  setter ? setter.call(obj, value) : member.set(obj, value);
970
1358
  return value;
971
1359
  };
972
1360
  var _table$1, _repository, _data;
973
1361
  const _Query = class {
974
- constructor(repository, table, data, parent) {
1362
+ constructor(repository, table, data, rawParent) {
975
1363
  __privateAdd$5(this, _table$1, void 0);
976
1364
  __privateAdd$5(this, _repository, void 0);
977
1365
  __privateAdd$5(this, _data, { filter: {} });
978
1366
  this.meta = { page: { cursor: "start", more: true } };
979
- this.records = [];
980
- __privateSet$4(this, _table$1, table);
1367
+ this.records = new RecordArray(this, []);
1368
+ __privateSet$5(this, _table$1, table);
981
1369
  if (repository) {
982
- __privateSet$4(this, _repository, repository);
1370
+ __privateSet$5(this, _repository, repository);
983
1371
  } else {
984
- __privateSet$4(this, _repository, this);
1372
+ __privateSet$5(this, _repository, this);
985
1373
  }
1374
+ const parent = cleanParent(data, rawParent);
986
1375
  __privateGet$5(this, _data).filter = data.filter ?? parent?.filter ?? {};
987
1376
  __privateGet$5(this, _data).filter.$any = data.filter?.$any ?? parent?.filter?.$any;
988
1377
  __privateGet$5(this, _data).filter.$all = data.filter?.$all ?? parent?.filter?.$all;
@@ -1027,55 +1416,93 @@ const _Query = class {
1027
1416
  }
1028
1417
  filter(a, b) {
1029
1418
  if (arguments.length === 1) {
1030
- const constraints = Object.entries(a).map(([column, constraint]) => ({ [column]: constraint }));
1419
+ const constraints = Object.entries(a ?? {}).map(([column, constraint]) => ({
1420
+ [column]: this.cleanFilterConstraint(column, constraint)
1421
+ }));
1031
1422
  const $all = compact([__privateGet$5(this, _data).filter?.$all].flat().concat(constraints));
1032
1423
  return new _Query(__privateGet$5(this, _repository), __privateGet$5(this, _table$1), { filter: { $all } }, __privateGet$5(this, _data));
1033
1424
  } else {
1034
- const $all = compact([__privateGet$5(this, _data).filter?.$all].flat().concat([{ [a]: b }]));
1425
+ const constraints = isDefined(a) && isDefined(b) ? [{ [a]: this.cleanFilterConstraint(a, b) }] : void 0;
1426
+ const $all = compact([__privateGet$5(this, _data).filter?.$all].flat().concat(constraints));
1035
1427
  return new _Query(__privateGet$5(this, _repository), __privateGet$5(this, _table$1), { filter: { $all } }, __privateGet$5(this, _data));
1036
1428
  }
1037
1429
  }
1038
- sort(column, direction) {
1430
+ cleanFilterConstraint(column, value) {
1431
+ const columnType = __privateGet$5(this, _table$1).schema?.columns.find(({ name }) => name === column)?.type;
1432
+ if (columnType === "multiple" && (isString(value) || isStringArray(value))) {
1433
+ return { $includes: value };
1434
+ }
1435
+ if (columnType === "link" && isObject(value) && isString(value.id)) {
1436
+ return value.id;
1437
+ }
1438
+ return value;
1439
+ }
1440
+ sort(column, direction = "asc") {
1039
1441
  const originalSort = [__privateGet$5(this, _data).sort ?? []].flat();
1040
1442
  const sort = [...originalSort, { column, direction }];
1041
1443
  return new _Query(__privateGet$5(this, _repository), __privateGet$5(this, _table$1), { sort }, __privateGet$5(this, _data));
1042
1444
  }
1043
1445
  select(columns) {
1044
- return new _Query(__privateGet$5(this, _repository), __privateGet$5(this, _table$1), { columns }, __privateGet$5(this, _data));
1446
+ return new _Query(
1447
+ __privateGet$5(this, _repository),
1448
+ __privateGet$5(this, _table$1),
1449
+ { columns },
1450
+ __privateGet$5(this, _data)
1451
+ );
1045
1452
  }
1046
1453
  getPaginated(options = {}) {
1047
1454
  const query = new _Query(__privateGet$5(this, _repository), __privateGet$5(this, _table$1), options, __privateGet$5(this, _data));
1048
1455
  return __privateGet$5(this, _repository).query(query);
1049
1456
  }
1050
1457
  async *[Symbol.asyncIterator]() {
1051
- for await (const [record] of this.getIterator(1)) {
1458
+ for await (const [record] of this.getIterator({ batchSize: 1 })) {
1052
1459
  yield record;
1053
1460
  }
1054
1461
  }
1055
- async *getIterator(chunk, options = {}) {
1056
- let offset = 0;
1057
- let end = false;
1058
- while (!end) {
1059
- const { records, meta } = await this.getPaginated({ ...options, pagination: { size: chunk, offset } });
1060
- yield records;
1061
- offset += chunk;
1062
- end = !meta.page.more;
1462
+ async *getIterator(options = {}) {
1463
+ const { batchSize = 1 } = options;
1464
+ let page = await this.getPaginated({ ...options, pagination: { size: batchSize, offset: 0 } });
1465
+ let more = page.hasNextPage();
1466
+ yield page.records;
1467
+ while (more) {
1468
+ page = await page.nextPage();
1469
+ more = page.hasNextPage();
1470
+ yield page.records;
1063
1471
  }
1064
1472
  }
1065
1473
  async getMany(options = {}) {
1066
- const { records } = await this.getPaginated(options);
1067
- return records;
1474
+ const { pagination = {}, ...rest } = options;
1475
+ const { size = PAGINATION_DEFAULT_SIZE, offset } = pagination;
1476
+ const batchSize = size <= PAGINATION_MAX_SIZE ? size : PAGINATION_MAX_SIZE;
1477
+ let page = await this.getPaginated({ ...rest, pagination: { size: batchSize, offset } });
1478
+ const results = [...page.records];
1479
+ while (page.hasNextPage() && results.length < size) {
1480
+ page = await page.nextPage();
1481
+ results.push(...page.records);
1482
+ }
1483
+ if (page.hasNextPage() && options.pagination?.size === void 0) {
1484
+ console.trace("Calling getMany does not return all results. Paginate to get all results or call getAll.");
1485
+ }
1486
+ const array = new RecordArray(page, results.slice(0, size));
1487
+ return array;
1068
1488
  }
1069
- async getAll(chunk = PAGINATION_MAX_SIZE, options = {}) {
1489
+ async getAll(options = {}) {
1490
+ const { batchSize = PAGINATION_MAX_SIZE, ...rest } = options;
1070
1491
  const results = [];
1071
- for await (const page of this.getIterator(chunk, options)) {
1492
+ for await (const page of this.getIterator({ ...rest, batchSize })) {
1072
1493
  results.push(...page);
1073
1494
  }
1074
1495
  return results;
1075
1496
  }
1076
1497
  async getFirst(options = {}) {
1077
1498
  const records = await this.getMany({ ...options, pagination: { size: 1 } });
1078
- return records[0] || null;
1499
+ return records[0] ?? null;
1500
+ }
1501
+ async getFirstOrThrow(options = {}) {
1502
+ const records = await this.getMany({ ...options, pagination: { size: 1 } });
1503
+ if (records[0] === void 0)
1504
+ throw new Error("No results found.");
1505
+ return records[0];
1079
1506
  }
1080
1507
  cache(ttl) {
1081
1508
  return new _Query(__privateGet$5(this, _repository), __privateGet$5(this, _table$1), { cache: ttl }, __privateGet$5(this, _data));
@@ -1100,12 +1527,20 @@ let Query = _Query;
1100
1527
  _table$1 = new WeakMap();
1101
1528
  _repository = new WeakMap();
1102
1529
  _data = new WeakMap();
1530
+ function cleanParent(data, parent) {
1531
+ if (isCursorPaginationOptions(data.pagination)) {
1532
+ return { ...parent, sorting: void 0, filter: void 0 };
1533
+ }
1534
+ return parent;
1535
+ }
1103
1536
 
1104
1537
  function isIdentifiable(x) {
1105
1538
  return isObject(x) && isString(x?.id);
1106
1539
  }
1107
1540
  function isXataRecord(x) {
1108
- return isIdentifiable(x) && typeof x?.xata === "object" && typeof x?.xata?.version === "number";
1541
+ const record = x;
1542
+ const metadata = record?.getMetadata();
1543
+ return isIdentifiable(x) && isObject(metadata) && typeof metadata.version === "number";
1109
1544
  }
1110
1545
 
1111
1546
  function isSortFilterString(value) {
@@ -1144,7 +1579,7 @@ var __privateAdd$4 = (obj, member, value) => {
1144
1579
  throw TypeError("Cannot add the same private member more than once");
1145
1580
  member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
1146
1581
  };
1147
- var __privateSet$3 = (obj, member, value, setter) => {
1582
+ var __privateSet$4 = (obj, member, value, setter) => {
1148
1583
  __accessCheck$4(obj, member, "write to private field");
1149
1584
  setter ? setter.call(obj, value) : member.set(obj, value);
1150
1585
  return value;
@@ -1153,180 +1588,284 @@ var __privateMethod$2 = (obj, member, method) => {
1153
1588
  __accessCheck$4(obj, member, "access private method");
1154
1589
  return method;
1155
1590
  };
1156
- var _table, _getFetchProps, _cache, _schema$1, _insertRecordWithoutId, insertRecordWithoutId_fn, _insertRecordWithId, insertRecordWithId_fn, _bulkInsertTableRecords, bulkInsertTableRecords_fn, _updateRecordWithID, updateRecordWithID_fn, _upsertRecordWithID, upsertRecordWithID_fn, _deleteRecord, deleteRecord_fn, _invalidateCache, invalidateCache_fn, _setCacheRecord, setCacheRecord_fn, _getCacheRecord, getCacheRecord_fn, _setCacheQuery, setCacheQuery_fn, _getCacheQuery, getCacheQuery_fn, _getSchema$1, getSchema_fn$1;
1591
+ var _table, _getFetchProps, _db, _cache, _schemaTables$2, _trace, _insertRecordWithoutId, insertRecordWithoutId_fn, _insertRecordWithId, insertRecordWithId_fn, _bulkInsertTableRecords, bulkInsertTableRecords_fn, _updateRecordWithID, updateRecordWithID_fn, _upsertRecordWithID, upsertRecordWithID_fn, _deleteRecord, deleteRecord_fn, _setCacheQuery, setCacheQuery_fn, _getCacheQuery, getCacheQuery_fn, _getSchemaTables$1, getSchemaTables_fn$1;
1157
1592
  class Repository extends Query {
1158
1593
  }
1159
1594
  class RestRepository extends Query {
1160
1595
  constructor(options) {
1161
- super(null, options.table, {});
1596
+ super(
1597
+ null,
1598
+ { name: options.table, schema: options.schemaTables?.find((table) => table.name === options.table) },
1599
+ {}
1600
+ );
1162
1601
  __privateAdd$4(this, _insertRecordWithoutId);
1163
1602
  __privateAdd$4(this, _insertRecordWithId);
1164
1603
  __privateAdd$4(this, _bulkInsertTableRecords);
1165
1604
  __privateAdd$4(this, _updateRecordWithID);
1166
1605
  __privateAdd$4(this, _upsertRecordWithID);
1167
1606
  __privateAdd$4(this, _deleteRecord);
1168
- __privateAdd$4(this, _invalidateCache);
1169
- __privateAdd$4(this, _setCacheRecord);
1170
- __privateAdd$4(this, _getCacheRecord);
1171
1607
  __privateAdd$4(this, _setCacheQuery);
1172
1608
  __privateAdd$4(this, _getCacheQuery);
1173
- __privateAdd$4(this, _getSchema$1);
1609
+ __privateAdd$4(this, _getSchemaTables$1);
1174
1610
  __privateAdd$4(this, _table, void 0);
1175
1611
  __privateAdd$4(this, _getFetchProps, void 0);
1612
+ __privateAdd$4(this, _db, void 0);
1176
1613
  __privateAdd$4(this, _cache, void 0);
1177
- __privateAdd$4(this, _schema$1, void 0);
1178
- __privateSet$3(this, _table, options.table);
1179
- __privateSet$3(this, _getFetchProps, options.pluginOptions.getFetchProps);
1180
- this.db = options.db;
1181
- __privateSet$3(this, _cache, options.pluginOptions.cache);
1182
- }
1183
- async create(a, b) {
1184
- if (Array.isArray(a)) {
1185
- const records = await __privateMethod$2(this, _bulkInsertTableRecords, bulkInsertTableRecords_fn).call(this, a);
1186
- await Promise.all(records.map((record) => __privateMethod$2(this, _setCacheRecord, setCacheRecord_fn).call(this, record)));
1187
- return records;
1188
- }
1189
- if (isString(a) && isObject(b)) {
1190
- if (a === "")
1191
- throw new Error("The id can't be empty");
1192
- const record = await __privateMethod$2(this, _insertRecordWithId, insertRecordWithId_fn).call(this, a, b);
1193
- await __privateMethod$2(this, _setCacheRecord, setCacheRecord_fn).call(this, record);
1194
- return record;
1195
- }
1196
- if (isObject(a) && isString(a.id)) {
1197
- if (a.id === "")
1198
- throw new Error("The id can't be empty");
1199
- const record = await __privateMethod$2(this, _insertRecordWithId, insertRecordWithId_fn).call(this, a.id, { ...a, id: void 0 });
1200
- await __privateMethod$2(this, _setCacheRecord, setCacheRecord_fn).call(this, record);
1201
- return record;
1202
- }
1203
- if (isObject(a)) {
1204
- const record = await __privateMethod$2(this, _insertRecordWithoutId, insertRecordWithoutId_fn).call(this, a);
1205
- await __privateMethod$2(this, _setCacheRecord, setCacheRecord_fn).call(this, record);
1206
- return record;
1207
- }
1208
- throw new Error("Invalid arguments for create method");
1209
- }
1210
- async read(recordId) {
1211
- const cacheRecord = await __privateMethod$2(this, _getCacheRecord, getCacheRecord_fn).call(this, recordId);
1212
- if (cacheRecord)
1213
- return cacheRecord;
1214
- const fetchProps = await __privateGet$4(this, _getFetchProps).call(this);
1215
- try {
1216
- const response = await getRecord({
1217
- pathParams: { workspace: "{workspaceId}", dbBranchName: "{dbBranch}", tableName: __privateGet$4(this, _table), recordId },
1218
- ...fetchProps
1614
+ __privateAdd$4(this, _schemaTables$2, void 0);
1615
+ __privateAdd$4(this, _trace, void 0);
1616
+ __privateSet$4(this, _table, options.table);
1617
+ __privateSet$4(this, _getFetchProps, options.pluginOptions.getFetchProps);
1618
+ __privateSet$4(this, _db, options.db);
1619
+ __privateSet$4(this, _cache, options.pluginOptions.cache);
1620
+ __privateSet$4(this, _schemaTables$2, options.schemaTables);
1621
+ const trace = options.pluginOptions.trace ?? defaultTrace;
1622
+ __privateSet$4(this, _trace, async (name, fn, options2 = {}) => {
1623
+ return trace(name, fn, {
1624
+ ...options2,
1625
+ [TraceAttributes.TABLE]: __privateGet$4(this, _table),
1626
+ [TraceAttributes.KIND]: "sdk-operation",
1627
+ [TraceAttributes.VERSION]: VERSION
1219
1628
  });
1220
- const schema = await __privateMethod$2(this, _getSchema$1, getSchema_fn$1).call(this);
1221
- return initObject(this.db, schema, __privateGet$4(this, _table), response);
1222
- } catch (e) {
1223
- if (isObject(e) && e.status === 404) {
1224
- return null;
1629
+ });
1630
+ }
1631
+ async create(a, b, c) {
1632
+ return __privateGet$4(this, _trace).call(this, "create", async () => {
1633
+ if (Array.isArray(a)) {
1634
+ if (a.length === 0)
1635
+ return [];
1636
+ const columns = isStringArray(b) ? b : void 0;
1637
+ return __privateMethod$2(this, _bulkInsertTableRecords, bulkInsertTableRecords_fn).call(this, a, columns);
1225
1638
  }
1226
- throw e;
1227
- }
1639
+ if (isString(a) && isObject(b)) {
1640
+ if (a === "")
1641
+ throw new Error("The id can't be empty");
1642
+ const columns = isStringArray(c) ? c : void 0;
1643
+ return __privateMethod$2(this, _insertRecordWithId, insertRecordWithId_fn).call(this, a, b, columns);
1644
+ }
1645
+ if (isObject(a) && isString(a.id)) {
1646
+ if (a.id === "")
1647
+ throw new Error("The id can't be empty");
1648
+ const columns = isStringArray(b) ? b : void 0;
1649
+ return __privateMethod$2(this, _insertRecordWithId, insertRecordWithId_fn).call(this, a.id, { ...a, id: void 0 }, columns);
1650
+ }
1651
+ if (isObject(a)) {
1652
+ const columns = isStringArray(b) ? b : void 0;
1653
+ return __privateMethod$2(this, _insertRecordWithoutId, insertRecordWithoutId_fn).call(this, a, columns);
1654
+ }
1655
+ throw new Error("Invalid arguments for create method");
1656
+ });
1228
1657
  }
1229
- async update(a, b) {
1230
- if (Array.isArray(a)) {
1231
- if (a.length > 100) {
1232
- console.warn("Bulk update operation is not optimized in the Xata API yet, this request might be slow");
1658
+ async read(a, b) {
1659
+ return __privateGet$4(this, _trace).call(this, "read", async () => {
1660
+ const columns = isStringArray(b) ? b : ["*"];
1661
+ if (Array.isArray(a)) {
1662
+ if (a.length === 0)
1663
+ return [];
1664
+ const ids = a.map((item) => extractId(item));
1665
+ const finalObjects = await this.getAll({ filter: { id: { $any: compact(ids) } }, columns });
1666
+ const dictionary = finalObjects.reduce((acc, object) => {
1667
+ acc[object.id] = object;
1668
+ return acc;
1669
+ }, {});
1670
+ return ids.map((id2) => dictionary[id2 ?? ""] ?? null);
1233
1671
  }
1234
- return Promise.all(a.map((object) => this.update(object)));
1235
- }
1236
- if (isString(a) && isObject(b)) {
1237
- await __privateMethod$2(this, _invalidateCache, invalidateCache_fn).call(this, a);
1238
- const record = await __privateMethod$2(this, _updateRecordWithID, updateRecordWithID_fn).call(this, a, b);
1239
- await __privateMethod$2(this, _setCacheRecord, setCacheRecord_fn).call(this, record);
1240
- return record;
1241
- }
1242
- if (isObject(a) && isString(a.id)) {
1243
- await __privateMethod$2(this, _invalidateCache, invalidateCache_fn).call(this, a.id);
1244
- const record = await __privateMethod$2(this, _updateRecordWithID, updateRecordWithID_fn).call(this, a.id, { ...a, id: void 0 });
1245
- await __privateMethod$2(this, _setCacheRecord, setCacheRecord_fn).call(this, record);
1246
- return record;
1247
- }
1248
- throw new Error("Invalid arguments for update method");
1672
+ const id = extractId(a);
1673
+ if (id) {
1674
+ const fetchProps = await __privateGet$4(this, _getFetchProps).call(this);
1675
+ try {
1676
+ const response = await getRecord({
1677
+ pathParams: {
1678
+ workspace: "{workspaceId}",
1679
+ dbBranchName: "{dbBranch}",
1680
+ tableName: __privateGet$4(this, _table),
1681
+ recordId: id
1682
+ },
1683
+ queryParams: { columns },
1684
+ ...fetchProps
1685
+ });
1686
+ const schemaTables = await __privateMethod$2(this, _getSchemaTables$1, getSchemaTables_fn$1).call(this);
1687
+ return initObject(__privateGet$4(this, _db), schemaTables, __privateGet$4(this, _table), response);
1688
+ } catch (e) {
1689
+ if (isObject(e) && e.status === 404) {
1690
+ return null;
1691
+ }
1692
+ throw e;
1693
+ }
1694
+ }
1695
+ return null;
1696
+ });
1249
1697
  }
1250
- async createOrUpdate(a, b) {
1251
- if (Array.isArray(a)) {
1252
- if (a.length > 100) {
1253
- console.warn("Bulk update operation is not optimized in the Xata API yet, this request might be slow");
1698
+ async readOrThrow(a, b) {
1699
+ return __privateGet$4(this, _trace).call(this, "readOrThrow", async () => {
1700
+ const result = await this.read(a, b);
1701
+ if (Array.isArray(result)) {
1702
+ const missingIds = compact(
1703
+ a.filter((_item, index) => result[index] === null).map((item) => extractId(item))
1704
+ );
1705
+ if (missingIds.length > 0) {
1706
+ throw new Error(`Could not find records with ids: ${missingIds.join(", ")}`);
1707
+ }
1708
+ return result;
1254
1709
  }
1255
- return Promise.all(a.map((object) => this.createOrUpdate(object)));
1256
- }
1257
- if (isString(a) && isObject(b)) {
1258
- await __privateMethod$2(this, _invalidateCache, invalidateCache_fn).call(this, a);
1259
- const record = await __privateMethod$2(this, _upsertRecordWithID, upsertRecordWithID_fn).call(this, a, b);
1260
- await __privateMethod$2(this, _setCacheRecord, setCacheRecord_fn).call(this, record);
1261
- return record;
1262
- }
1263
- if (isObject(a) && isString(a.id)) {
1264
- await __privateMethod$2(this, _invalidateCache, invalidateCache_fn).call(this, a.id);
1265
- const record = await __privateMethod$2(this, _upsertRecordWithID, upsertRecordWithID_fn).call(this, a.id, { ...a, id: void 0 });
1266
- await __privateMethod$2(this, _setCacheRecord, setCacheRecord_fn).call(this, record);
1267
- return record;
1268
- }
1269
- throw new Error("Invalid arguments for createOrUpdate method");
1710
+ if (result === null) {
1711
+ const id = extractId(a) ?? "unknown";
1712
+ throw new Error(`Record with id ${id} not found`);
1713
+ }
1714
+ return result;
1715
+ });
1270
1716
  }
1271
- async delete(a) {
1272
- if (Array.isArray(a)) {
1273
- if (a.length > 100) {
1274
- console.warn("Bulk delete operation is not optimized in the Xata API yet, this request might be slow");
1717
+ async update(a, b, c) {
1718
+ return __privateGet$4(this, _trace).call(this, "update", async () => {
1719
+ if (Array.isArray(a)) {
1720
+ if (a.length === 0)
1721
+ return [];
1722
+ if (a.length > 100) {
1723
+ console.warn("Bulk update operation is not optimized in the Xata API yet, this request might be slow");
1724
+ }
1725
+ const columns = isStringArray(b) ? b : ["*"];
1726
+ return Promise.all(a.map((object) => this.update(object, columns)));
1275
1727
  }
1276
- await Promise.all(a.map((id) => this.delete(id)));
1277
- return;
1278
- }
1279
- if (isString(a)) {
1280
- await __privateMethod$2(this, _deleteRecord, deleteRecord_fn).call(this, a);
1281
- await __privateMethod$2(this, _invalidateCache, invalidateCache_fn).call(this, a);
1282
- return;
1283
- }
1284
- if (isObject(a) && isString(a.id)) {
1285
- await __privateMethod$2(this, _deleteRecord, deleteRecord_fn).call(this, a.id);
1286
- await __privateMethod$2(this, _invalidateCache, invalidateCache_fn).call(this, a.id);
1287
- return;
1288
- }
1289
- throw new Error("Invalid arguments for delete method");
1728
+ if (isString(a) && isObject(b)) {
1729
+ const columns = isStringArray(c) ? c : void 0;
1730
+ return __privateMethod$2(this, _updateRecordWithID, updateRecordWithID_fn).call(this, a, b, columns);
1731
+ }
1732
+ if (isObject(a) && isString(a.id)) {
1733
+ const columns = isStringArray(b) ? b : void 0;
1734
+ return __privateMethod$2(this, _updateRecordWithID, updateRecordWithID_fn).call(this, a.id, { ...a, id: void 0 }, columns);
1735
+ }
1736
+ throw new Error("Invalid arguments for update method");
1737
+ });
1738
+ }
1739
+ async updateOrThrow(a, b, c) {
1740
+ return __privateGet$4(this, _trace).call(this, "updateOrThrow", async () => {
1741
+ const result = await this.update(a, b, c);
1742
+ if (Array.isArray(result)) {
1743
+ const missingIds = compact(
1744
+ a.filter((_item, index) => result[index] === null).map((item) => extractId(item))
1745
+ );
1746
+ if (missingIds.length > 0) {
1747
+ throw new Error(`Could not find records with ids: ${missingIds.join(", ")}`);
1748
+ }
1749
+ return result;
1750
+ }
1751
+ if (result === null) {
1752
+ const id = extractId(a) ?? "unknown";
1753
+ throw new Error(`Record with id ${id} not found`);
1754
+ }
1755
+ return result;
1756
+ });
1757
+ }
1758
+ async createOrUpdate(a, b, c) {
1759
+ return __privateGet$4(this, _trace).call(this, "createOrUpdate", async () => {
1760
+ if (Array.isArray(a)) {
1761
+ if (a.length === 0)
1762
+ return [];
1763
+ if (a.length > 100) {
1764
+ console.warn("Bulk update operation is not optimized in the Xata API yet, this request might be slow");
1765
+ }
1766
+ const columns = isStringArray(b) ? b : ["*"];
1767
+ return Promise.all(a.map((object) => this.createOrUpdate(object, columns)));
1768
+ }
1769
+ if (isString(a) && isObject(b)) {
1770
+ const columns = isStringArray(c) ? c : void 0;
1771
+ return __privateMethod$2(this, _upsertRecordWithID, upsertRecordWithID_fn).call(this, a, b, columns);
1772
+ }
1773
+ if (isObject(a) && isString(a.id)) {
1774
+ const columns = isStringArray(c) ? c : void 0;
1775
+ return __privateMethod$2(this, _upsertRecordWithID, upsertRecordWithID_fn).call(this, a.id, { ...a, id: void 0 }, columns);
1776
+ }
1777
+ throw new Error("Invalid arguments for createOrUpdate method");
1778
+ });
1779
+ }
1780
+ async delete(a, b) {
1781
+ return __privateGet$4(this, _trace).call(this, "delete", async () => {
1782
+ if (Array.isArray(a)) {
1783
+ if (a.length === 0)
1784
+ return [];
1785
+ if (a.length > 100) {
1786
+ console.warn("Bulk delete operation is not optimized in the Xata API yet, this request might be slow");
1787
+ }
1788
+ return Promise.all(a.map((id) => this.delete(id, b)));
1789
+ }
1790
+ if (isString(a)) {
1791
+ return __privateMethod$2(this, _deleteRecord, deleteRecord_fn).call(this, a, b);
1792
+ }
1793
+ if (isObject(a) && isString(a.id)) {
1794
+ return __privateMethod$2(this, _deleteRecord, deleteRecord_fn).call(this, a.id, b);
1795
+ }
1796
+ throw new Error("Invalid arguments for delete method");
1797
+ });
1798
+ }
1799
+ async deleteOrThrow(a, b) {
1800
+ return __privateGet$4(this, _trace).call(this, "deleteOrThrow", async () => {
1801
+ const result = await this.delete(a, b);
1802
+ if (Array.isArray(result)) {
1803
+ const missingIds = compact(
1804
+ a.filter((_item, index) => result[index] === null).map((item) => extractId(item))
1805
+ );
1806
+ if (missingIds.length > 0) {
1807
+ throw new Error(`Could not find records with ids: ${missingIds.join(", ")}`);
1808
+ }
1809
+ return result;
1810
+ } else if (result === null) {
1811
+ const id = extractId(a) ?? "unknown";
1812
+ throw new Error(`Record with id ${id} not found`);
1813
+ }
1814
+ return result;
1815
+ });
1290
1816
  }
1291
1817
  async search(query, options = {}) {
1292
- const fetchProps = await __privateGet$4(this, _getFetchProps).call(this);
1293
- const { records } = await searchBranch({
1294
- pathParams: { workspace: "{workspaceId}", dbBranchName: "{dbBranch}" },
1295
- body: { tables: [__privateGet$4(this, _table)], query, fuzziness: options.fuzziness },
1296
- ...fetchProps
1818
+ return __privateGet$4(this, _trace).call(this, "search", async () => {
1819
+ const fetchProps = await __privateGet$4(this, _getFetchProps).call(this);
1820
+ const { records } = await searchTable({
1821
+ pathParams: { workspace: "{workspaceId}", dbBranchName: "{dbBranch}", tableName: __privateGet$4(this, _table) },
1822
+ body: {
1823
+ query,
1824
+ fuzziness: options.fuzziness,
1825
+ prefix: options.prefix,
1826
+ highlight: options.highlight,
1827
+ filter: options.filter,
1828
+ boosters: options.boosters
1829
+ },
1830
+ ...fetchProps
1831
+ });
1832
+ const schemaTables = await __privateMethod$2(this, _getSchemaTables$1, getSchemaTables_fn$1).call(this);
1833
+ return records.map((item) => initObject(__privateGet$4(this, _db), schemaTables, __privateGet$4(this, _table), item));
1297
1834
  });
1298
- const schema = await __privateMethod$2(this, _getSchema$1, getSchema_fn$1).call(this);
1299
- return records.map((item) => initObject(this.db, schema, __privateGet$4(this, _table), item));
1300
1835
  }
1301
1836
  async query(query) {
1302
- const cacheQuery = await __privateMethod$2(this, _getCacheQuery, getCacheQuery_fn).call(this, query);
1303
- if (cacheQuery)
1304
- return new Page(query, cacheQuery.meta, cacheQuery.records);
1305
- const data = query.getQueryOptions();
1306
- const body = {
1307
- filter: Object.values(data.filter ?? {}).some(Boolean) ? data.filter : void 0,
1308
- sort: data.sort ? buildSortFilter(data.sort) : void 0,
1309
- page: data.pagination,
1310
- columns: data.columns
1311
- };
1312
- const fetchProps = await __privateGet$4(this, _getFetchProps).call(this);
1313
- const { meta, records: objects } = await queryTable({
1314
- pathParams: { workspace: "{workspaceId}", dbBranchName: "{dbBranch}", tableName: __privateGet$4(this, _table) },
1315
- body,
1316
- ...fetchProps
1837
+ return __privateGet$4(this, _trace).call(this, "query", async () => {
1838
+ const cacheQuery = await __privateMethod$2(this, _getCacheQuery, getCacheQuery_fn).call(this, query);
1839
+ if (cacheQuery)
1840
+ return new Page(query, cacheQuery.meta, cacheQuery.records);
1841
+ const data = query.getQueryOptions();
1842
+ const body = {
1843
+ filter: cleanFilter(data.filter),
1844
+ sort: data.sort !== void 0 ? buildSortFilter(data.sort) : void 0,
1845
+ page: data.pagination,
1846
+ columns: data.columns
1847
+ };
1848
+ const fetchProps = await __privateGet$4(this, _getFetchProps).call(this);
1849
+ const { meta, records: objects } = await queryTable({
1850
+ pathParams: { workspace: "{workspaceId}", dbBranchName: "{dbBranch}", tableName: __privateGet$4(this, _table) },
1851
+ body,
1852
+ ...fetchProps
1853
+ });
1854
+ const schemaTables = await __privateMethod$2(this, _getSchemaTables$1, getSchemaTables_fn$1).call(this);
1855
+ const records = objects.map((record) => initObject(__privateGet$4(this, _db), schemaTables, __privateGet$4(this, _table), record));
1856
+ await __privateMethod$2(this, _setCacheQuery, setCacheQuery_fn).call(this, query, meta, records);
1857
+ return new Page(query, meta, records);
1317
1858
  });
1318
- const schema = await __privateMethod$2(this, _getSchema$1, getSchema_fn$1).call(this);
1319
- const records = objects.map((record) => initObject(this.db, schema, __privateGet$4(this, _table), record));
1320
- await __privateMethod$2(this, _setCacheQuery, setCacheQuery_fn).call(this, query, meta, records);
1321
- return new Page(query, meta, records);
1322
1859
  }
1323
1860
  }
1324
1861
  _table = new WeakMap();
1325
1862
  _getFetchProps = new WeakMap();
1863
+ _db = new WeakMap();
1326
1864
  _cache = new WeakMap();
1327
- _schema$1 = new WeakMap();
1865
+ _schemaTables$2 = new WeakMap();
1866
+ _trace = new WeakMap();
1328
1867
  _insertRecordWithoutId = new WeakSet();
1329
- insertRecordWithoutId_fn = async function(object) {
1868
+ insertRecordWithoutId_fn = async function(object, columns = ["*"]) {
1330
1869
  const fetchProps = await __privateGet$4(this, _getFetchProps).call(this);
1331
1870
  const record = transformObjectLinks(object);
1332
1871
  const response = await insertRecord({
@@ -1335,17 +1874,15 @@ insertRecordWithoutId_fn = async function(object) {
1335
1874
  dbBranchName: "{dbBranch}",
1336
1875
  tableName: __privateGet$4(this, _table)
1337
1876
  },
1877
+ queryParams: { columns },
1338
1878
  body: record,
1339
1879
  ...fetchProps
1340
1880
  });
1341
- const finalObject = await this.read(response.id);
1342
- if (!finalObject) {
1343
- throw new Error("The server failed to save the record");
1344
- }
1345
- return finalObject;
1881
+ const schemaTables = await __privateMethod$2(this, _getSchemaTables$1, getSchemaTables_fn$1).call(this);
1882
+ return initObject(__privateGet$4(this, _db), schemaTables, __privateGet$4(this, _table), response);
1346
1883
  };
1347
1884
  _insertRecordWithId = new WeakSet();
1348
- insertRecordWithId_fn = async function(recordId, object) {
1885
+ insertRecordWithId_fn = async function(recordId, object, columns = ["*"]) {
1349
1886
  const fetchProps = await __privateGet$4(this, _getFetchProps).call(this);
1350
1887
  const record = transformObjectLinks(object);
1351
1888
  const response = await insertRecordWithID({
@@ -1356,88 +1893,78 @@ insertRecordWithId_fn = async function(recordId, object) {
1356
1893
  recordId
1357
1894
  },
1358
1895
  body: record,
1359
- queryParams: { createOnly: true },
1896
+ queryParams: { createOnly: true, columns },
1360
1897
  ...fetchProps
1361
1898
  });
1362
- const finalObject = await this.read(response.id);
1363
- if (!finalObject) {
1364
- throw new Error("The server failed to save the record");
1365
- }
1366
- return finalObject;
1899
+ const schemaTables = await __privateMethod$2(this, _getSchemaTables$1, getSchemaTables_fn$1).call(this);
1900
+ return initObject(__privateGet$4(this, _db), schemaTables, __privateGet$4(this, _table), response);
1367
1901
  };
1368
1902
  _bulkInsertTableRecords = new WeakSet();
1369
- bulkInsertTableRecords_fn = async function(objects) {
1903
+ bulkInsertTableRecords_fn = async function(objects, columns = ["*"]) {
1370
1904
  const fetchProps = await __privateGet$4(this, _getFetchProps).call(this);
1371
1905
  const records = objects.map((object) => transformObjectLinks(object));
1372
1906
  const response = await bulkInsertTableRecords({
1373
1907
  pathParams: { workspace: "{workspaceId}", dbBranchName: "{dbBranch}", tableName: __privateGet$4(this, _table) },
1908
+ queryParams: { columns },
1374
1909
  body: { records },
1375
1910
  ...fetchProps
1376
1911
  });
1377
- const finalObjects = await this.any(...response.recordIDs.map((id) => this.filter("id", id))).getAll();
1378
- if (finalObjects.length !== objects.length) {
1379
- throw new Error("The server failed to save some records");
1912
+ if (!isResponseWithRecords(response)) {
1913
+ throw new Error("Request included columns but server didn't include them");
1380
1914
  }
1381
- return finalObjects;
1915
+ const schemaTables = await __privateMethod$2(this, _getSchemaTables$1, getSchemaTables_fn$1).call(this);
1916
+ return response.records?.map((item) => initObject(__privateGet$4(this, _db), schemaTables, __privateGet$4(this, _table), item));
1382
1917
  };
1383
1918
  _updateRecordWithID = new WeakSet();
1384
- updateRecordWithID_fn = async function(recordId, object) {
1919
+ updateRecordWithID_fn = async function(recordId, object, columns = ["*"]) {
1385
1920
  const fetchProps = await __privateGet$4(this, _getFetchProps).call(this);
1386
1921
  const record = transformObjectLinks(object);
1387
- const response = await updateRecordWithID({
1388
- pathParams: { workspace: "{workspaceId}", dbBranchName: "{dbBranch}", tableName: __privateGet$4(this, _table), recordId },
1389
- body: record,
1390
- ...fetchProps
1391
- });
1392
- const item = await this.read(response.id);
1393
- if (!item)
1394
- throw new Error("The server failed to save the record");
1395
- return item;
1922
+ try {
1923
+ const response = await updateRecordWithID({
1924
+ pathParams: { workspace: "{workspaceId}", dbBranchName: "{dbBranch}", tableName: __privateGet$4(this, _table), recordId },
1925
+ queryParams: { columns },
1926
+ body: record,
1927
+ ...fetchProps
1928
+ });
1929
+ const schemaTables = await __privateMethod$2(this, _getSchemaTables$1, getSchemaTables_fn$1).call(this);
1930
+ return initObject(__privateGet$4(this, _db), schemaTables, __privateGet$4(this, _table), response);
1931
+ } catch (e) {
1932
+ if (isObject(e) && e.status === 404) {
1933
+ return null;
1934
+ }
1935
+ throw e;
1936
+ }
1396
1937
  };
1397
1938
  _upsertRecordWithID = new WeakSet();
1398
- upsertRecordWithID_fn = async function(recordId, object) {
1939
+ upsertRecordWithID_fn = async function(recordId, object, columns = ["*"]) {
1399
1940
  const fetchProps = await __privateGet$4(this, _getFetchProps).call(this);
1400
1941
  const response = await upsertRecordWithID({
1401
1942
  pathParams: { workspace: "{workspaceId}", dbBranchName: "{dbBranch}", tableName: __privateGet$4(this, _table), recordId },
1943
+ queryParams: { columns },
1402
1944
  body: object,
1403
1945
  ...fetchProps
1404
1946
  });
1405
- const item = await this.read(response.id);
1406
- if (!item)
1407
- throw new Error("The server failed to save the record");
1408
- return item;
1947
+ const schemaTables = await __privateMethod$2(this, _getSchemaTables$1, getSchemaTables_fn$1).call(this);
1948
+ return initObject(__privateGet$4(this, _db), schemaTables, __privateGet$4(this, _table), response);
1409
1949
  };
1410
1950
  _deleteRecord = new WeakSet();
1411
- deleteRecord_fn = async function(recordId) {
1951
+ deleteRecord_fn = async function(recordId, columns = ["*"]) {
1412
1952
  const fetchProps = await __privateGet$4(this, _getFetchProps).call(this);
1413
- await deleteRecord({
1414
- pathParams: { workspace: "{workspaceId}", dbBranchName: "{dbBranch}", tableName: __privateGet$4(this, _table), recordId },
1415
- ...fetchProps
1416
- });
1417
- };
1418
- _invalidateCache = new WeakSet();
1419
- invalidateCache_fn = async function(recordId) {
1420
- await __privateGet$4(this, _cache).delete(`rec_${__privateGet$4(this, _table)}:${recordId}`);
1421
- const cacheItems = await __privateGet$4(this, _cache).getAll();
1422
- const queries = Object.entries(cacheItems).filter(([key]) => key.startsWith("query_"));
1423
- for (const [key, value] of queries) {
1424
- const ids = getIds(value);
1425
- if (ids.includes(recordId))
1426
- await __privateGet$4(this, _cache).delete(key);
1953
+ try {
1954
+ const response = await deleteRecord({
1955
+ pathParams: { workspace: "{workspaceId}", dbBranchName: "{dbBranch}", tableName: __privateGet$4(this, _table), recordId },
1956
+ queryParams: { columns },
1957
+ ...fetchProps
1958
+ });
1959
+ const schemaTables = await __privateMethod$2(this, _getSchemaTables$1, getSchemaTables_fn$1).call(this);
1960
+ return initObject(__privateGet$4(this, _db), schemaTables, __privateGet$4(this, _table), response);
1961
+ } catch (e) {
1962
+ if (isObject(e) && e.status === 404) {
1963
+ return null;
1964
+ }
1965
+ throw e;
1427
1966
  }
1428
1967
  };
1429
- _setCacheRecord = new WeakSet();
1430
- setCacheRecord_fn = async function(record) {
1431
- if (!__privateGet$4(this, _cache).cacheRecords)
1432
- return;
1433
- await __privateGet$4(this, _cache).set(`rec_${__privateGet$4(this, _table)}:${record.id}`, record);
1434
- };
1435
- _getCacheRecord = new WeakSet();
1436
- getCacheRecord_fn = async function(recordId) {
1437
- if (!__privateGet$4(this, _cache).cacheRecords)
1438
- return null;
1439
- return __privateGet$4(this, _cache).get(`rec_${__privateGet$4(this, _table)}:${recordId}`);
1440
- };
1441
1968
  _setCacheQuery = new WeakSet();
1442
1969
  setCacheQuery_fn = async function(query, meta, records) {
1443
1970
  await __privateGet$4(this, _cache).set(`query_${__privateGet$4(this, _table)}:${query.key()}`, { date: new Date(), meta, records });
@@ -1449,22 +1976,22 @@ getCacheQuery_fn = async function(query) {
1449
1976
  if (!result)
1450
1977
  return null;
1451
1978
  const { cache: ttl = __privateGet$4(this, _cache).defaultQueryTTL } = query.getQueryOptions();
1452
- if (!ttl || ttl < 0)
1453
- return result;
1979
+ if (ttl < 0)
1980
+ return null;
1454
1981
  const hasExpired = result.date.getTime() + ttl < Date.now();
1455
1982
  return hasExpired ? null : result;
1456
1983
  };
1457
- _getSchema$1 = new WeakSet();
1458
- getSchema_fn$1 = async function() {
1459
- if (__privateGet$4(this, _schema$1))
1460
- return __privateGet$4(this, _schema$1);
1984
+ _getSchemaTables$1 = new WeakSet();
1985
+ getSchemaTables_fn$1 = async function() {
1986
+ if (__privateGet$4(this, _schemaTables$2))
1987
+ return __privateGet$4(this, _schemaTables$2);
1461
1988
  const fetchProps = await __privateGet$4(this, _getFetchProps).call(this);
1462
1989
  const { schema } = await getBranchDetails({
1463
1990
  pathParams: { workspace: "{workspaceId}", dbBranchName: "{dbBranch}" },
1464
1991
  ...fetchProps
1465
1992
  });
1466
- __privateSet$3(this, _schema$1, schema);
1467
- return schema;
1993
+ __privateSet$4(this, _schemaTables$2, schema.tables);
1994
+ return schema.tables;
1468
1995
  };
1469
1996
  const transformObjectLinks = (object) => {
1470
1997
  return Object.entries(object).reduce((acc, [key, value]) => {
@@ -1473,20 +2000,21 @@ const transformObjectLinks = (object) => {
1473
2000
  return { ...acc, [key]: isIdentifiable(value) ? value.id : value };
1474
2001
  }, {});
1475
2002
  };
1476
- const initObject = (db, schema, table, object) => {
2003
+ const initObject = (db, schemaTables, table, object) => {
1477
2004
  const result = {};
1478
- Object.assign(result, object);
1479
- const { columns } = schema.tables.find(({ name }) => name === table) ?? {};
2005
+ const { xata, ...rest } = object ?? {};
2006
+ Object.assign(result, rest);
2007
+ const { columns } = schemaTables.find(({ name }) => name === table) ?? {};
1480
2008
  if (!columns)
1481
2009
  console.error(`Table ${table} not found in schema`);
1482
2010
  for (const column of columns ?? []) {
1483
2011
  const value = result[column.name];
1484
2012
  switch (column.type) {
1485
2013
  case "datetime": {
1486
- const date = new Date(value);
1487
- if (isNaN(date.getTime())) {
2014
+ const date = value !== void 0 ? new Date(value) : void 0;
2015
+ if (date && isNaN(date.getTime())) {
1488
2016
  console.error(`Failed to parse date ${value} for field ${column.name}`);
1489
- } else {
2017
+ } else if (date) {
1490
2018
  result[column.name] = date;
1491
2019
  }
1492
2020
  break;
@@ -1495,36 +2023,54 @@ const initObject = (db, schema, table, object) => {
1495
2023
  const linkTable = column.link?.table;
1496
2024
  if (!linkTable) {
1497
2025
  console.error(`Failed to parse link for field ${column.name}`);
1498
- } else if (value && isObject(value)) {
1499
- result[column.name] = initObject(db, schema, linkTable, value);
2026
+ } else if (isObject(value)) {
2027
+ result[column.name] = initObject(db, schemaTables, linkTable, value);
2028
+ } else {
2029
+ result[column.name] = null;
1500
2030
  }
1501
2031
  break;
1502
2032
  }
2033
+ default:
2034
+ result[column.name] = value ?? null;
2035
+ if (column.notNull === true && value === null) {
2036
+ console.error(`Parse error, column ${column.name} is non nullable and value resolves null`);
2037
+ }
2038
+ break;
1503
2039
  }
1504
2040
  }
1505
- result.read = function() {
1506
- return db[table].read(result["id"]);
2041
+ result.read = function(columns2) {
2042
+ return db[table].read(result["id"], columns2);
1507
2043
  };
1508
- result.update = function(data) {
1509
- return db[table].update(result["id"], data);
2044
+ result.update = function(data, columns2) {
2045
+ return db[table].update(result["id"], data, columns2);
1510
2046
  };
1511
2047
  result.delete = function() {
1512
2048
  return db[table].delete(result["id"]);
1513
2049
  };
1514
- for (const prop of ["read", "update", "delete"]) {
2050
+ result.getMetadata = function() {
2051
+ return xata;
2052
+ };
2053
+ for (const prop of ["read", "update", "delete", "getMetadata"]) {
1515
2054
  Object.defineProperty(result, prop, { enumerable: false });
1516
2055
  }
1517
2056
  Object.freeze(result);
1518
2057
  return result;
1519
2058
  };
1520
- function getIds(value) {
1521
- if (Array.isArray(value)) {
1522
- return value.map((item) => getIds(item)).flat();
1523
- }
1524
- if (!isObject(value))
1525
- return [];
1526
- const nestedIds = Object.values(value).map((item) => getIds(item)).flat();
1527
- return isString(value.id) ? [value.id, ...nestedIds] : nestedIds;
2059
+ function isResponseWithRecords(value) {
2060
+ return isObject(value) && Array.isArray(value.records);
2061
+ }
2062
+ function extractId(value) {
2063
+ if (isString(value))
2064
+ return value;
2065
+ if (isObject(value) && isString(value.id))
2066
+ return value.id;
2067
+ return void 0;
2068
+ }
2069
+ function cleanFilter(filter) {
2070
+ if (!filter)
2071
+ return void 0;
2072
+ const values = Object.values(filter).filter(Boolean).filter((value) => Array.isArray(value) ? value.length > 0 : true);
2073
+ return values.length > 0 ? filter : void 0;
1528
2074
  }
1529
2075
 
1530
2076
  var __accessCheck$3 = (obj, member, msg) => {
@@ -1540,7 +2086,7 @@ var __privateAdd$3 = (obj, member, value) => {
1540
2086
  throw TypeError("Cannot add the same private member more than once");
1541
2087
  member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
1542
2088
  };
1543
- var __privateSet$2 = (obj, member, value, setter) => {
2089
+ var __privateSet$3 = (obj, member, value, setter) => {
1544
2090
  __accessCheck$3(obj, member, "write to private field");
1545
2091
  setter ? setter.call(obj, value) : member.set(obj, value);
1546
2092
  return value;
@@ -1549,9 +2095,8 @@ var _map;
1549
2095
  class SimpleCache {
1550
2096
  constructor(options = {}) {
1551
2097
  __privateAdd$3(this, _map, void 0);
1552
- __privateSet$2(this, _map, /* @__PURE__ */ new Map());
2098
+ __privateSet$3(this, _map, /* @__PURE__ */ new Map());
1553
2099
  this.capacity = options.max ?? 500;
1554
- this.cacheRecords = options.cacheRecords ?? true;
1555
2100
  this.defaultQueryTTL = options.defaultQueryTTL ?? 60 * 1e3;
1556
2101
  }
1557
2102
  async getAll() {
@@ -1577,18 +2122,25 @@ class SimpleCache {
1577
2122
  }
1578
2123
  _map = new WeakMap();
1579
2124
 
1580
- const gt = (value) => ({ $gt: value });
1581
- const ge = (value) => ({ $ge: value });
1582
- const gte = (value) => ({ $ge: value });
1583
- const lt = (value) => ({ $lt: value });
1584
- const lte = (value) => ({ $le: value });
1585
- const le = (value) => ({ $le: value });
2125
+ const greaterThan = (value) => ({ $gt: value });
2126
+ const gt = greaterThan;
2127
+ const greaterThanEquals = (value) => ({ $ge: value });
2128
+ const greaterEquals = greaterThanEquals;
2129
+ const gte = greaterThanEquals;
2130
+ const ge = greaterThanEquals;
2131
+ const lessThan = (value) => ({ $lt: value });
2132
+ const lt = lessThan;
2133
+ const lessThanEquals = (value) => ({ $le: value });
2134
+ const lessEquals = lessThanEquals;
2135
+ const lte = lessThanEquals;
2136
+ const le = lessThanEquals;
1586
2137
  const exists = (column) => ({ $exists: column });
1587
2138
  const notExists = (column) => ({ $notExists: column });
1588
2139
  const startsWith = (value) => ({ $startsWith: value });
1589
2140
  const endsWith = (value) => ({ $endsWith: value });
1590
2141
  const pattern = (value) => ({ $pattern: value });
1591
2142
  const is = (value) => ({ $is: value });
2143
+ const equals = is;
1592
2144
  const isNot = (value) => ({ $isNot: value });
1593
2145
  const contains = (value) => ({ $contains: value });
1594
2146
  const includes = (value) => ({ $includes: value });
@@ -1609,31 +2161,42 @@ var __privateAdd$2 = (obj, member, value) => {
1609
2161
  throw TypeError("Cannot add the same private member more than once");
1610
2162
  member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
1611
2163
  };
1612
- var _tables;
2164
+ var __privateSet$2 = (obj, member, value, setter) => {
2165
+ __accessCheck$2(obj, member, "write to private field");
2166
+ setter ? setter.call(obj, value) : member.set(obj, value);
2167
+ return value;
2168
+ };
2169
+ var _tables, _schemaTables$1;
1613
2170
  class SchemaPlugin extends XataPlugin {
1614
- constructor(tableNames) {
2171
+ constructor(schemaTables) {
1615
2172
  super();
1616
- this.tableNames = tableNames;
1617
2173
  __privateAdd$2(this, _tables, {});
2174
+ __privateAdd$2(this, _schemaTables$1, void 0);
2175
+ __privateSet$2(this, _schemaTables$1, schemaTables);
1618
2176
  }
1619
2177
  build(pluginOptions) {
1620
- const db = new Proxy({}, {
1621
- get: (_target, table) => {
1622
- if (!isString(table))
1623
- throw new Error("Invalid table name");
1624
- if (!__privateGet$2(this, _tables)[table]) {
1625
- __privateGet$2(this, _tables)[table] = new RestRepository({ db, pluginOptions, table });
2178
+ const db = new Proxy(
2179
+ {},
2180
+ {
2181
+ get: (_target, table) => {
2182
+ if (!isString(table))
2183
+ throw new Error("Invalid table name");
2184
+ if (__privateGet$2(this, _tables)[table] === void 0) {
2185
+ __privateGet$2(this, _tables)[table] = new RestRepository({ db, pluginOptions, table, schemaTables: __privateGet$2(this, _schemaTables$1) });
2186
+ }
2187
+ return __privateGet$2(this, _tables)[table];
1626
2188
  }
1627
- return __privateGet$2(this, _tables)[table];
1628
2189
  }
1629
- });
1630
- for (const table of this.tableNames ?? []) {
1631
- db[table] = new RestRepository({ db, pluginOptions, table });
2190
+ );
2191
+ const tableNames = __privateGet$2(this, _schemaTables$1)?.map(({ name }) => name) ?? [];
2192
+ for (const table of tableNames) {
2193
+ db[table] = new RestRepository({ db, pluginOptions, table, schemaTables: __privateGet$2(this, _schemaTables$1) });
1632
2194
  }
1633
2195
  return db;
1634
2196
  }
1635
2197
  }
1636
2198
  _tables = new WeakMap();
2199
+ _schemaTables$1 = new WeakMap();
1637
2200
 
1638
2201
  var __accessCheck$1 = (obj, member, msg) => {
1639
2202
  if (!member.has(obj))
@@ -1657,105 +2220,119 @@ var __privateMethod$1 = (obj, member, method) => {
1657
2220
  __accessCheck$1(obj, member, "access private method");
1658
2221
  return method;
1659
2222
  };
1660
- var _schema, _search, search_fn, _getSchema, getSchema_fn;
2223
+ var _schemaTables, _search, search_fn, _getSchemaTables, getSchemaTables_fn;
1661
2224
  class SearchPlugin extends XataPlugin {
1662
- constructor(db) {
2225
+ constructor(db, schemaTables) {
1663
2226
  super();
1664
2227
  this.db = db;
1665
2228
  __privateAdd$1(this, _search);
1666
- __privateAdd$1(this, _getSchema);
1667
- __privateAdd$1(this, _schema, void 0);
2229
+ __privateAdd$1(this, _getSchemaTables);
2230
+ __privateAdd$1(this, _schemaTables, void 0);
2231
+ __privateSet$1(this, _schemaTables, schemaTables);
1668
2232
  }
1669
2233
  build({ getFetchProps }) {
1670
2234
  return {
1671
2235
  all: async (query, options = {}) => {
1672
2236
  const records = await __privateMethod$1(this, _search, search_fn).call(this, query, options, getFetchProps);
1673
- const schema = await __privateMethod$1(this, _getSchema, getSchema_fn).call(this, getFetchProps);
2237
+ const schemaTables = await __privateMethod$1(this, _getSchemaTables, getSchemaTables_fn).call(this, getFetchProps);
1674
2238
  return records.map((record) => {
1675
2239
  const { table = "orphan" } = record.xata;
1676
- return { table, record: initObject(this.db, schema, table, record) };
2240
+ return { table, record: initObject(this.db, schemaTables, table, record) };
1677
2241
  });
1678
2242
  },
1679
2243
  byTable: async (query, options = {}) => {
1680
2244
  const records = await __privateMethod$1(this, _search, search_fn).call(this, query, options, getFetchProps);
1681
- const schema = await __privateMethod$1(this, _getSchema, getSchema_fn).call(this, getFetchProps);
2245
+ const schemaTables = await __privateMethod$1(this, _getSchemaTables, getSchemaTables_fn).call(this, getFetchProps);
1682
2246
  return records.reduce((acc, record) => {
1683
2247
  const { table = "orphan" } = record.xata;
1684
2248
  const items = acc[table] ?? [];
1685
- const item = initObject(this.db, schema, table, record);
2249
+ const item = initObject(this.db, schemaTables, table, record);
1686
2250
  return { ...acc, [table]: [...items, item] };
1687
2251
  }, {});
1688
2252
  }
1689
2253
  };
1690
2254
  }
1691
2255
  }
1692
- _schema = new WeakMap();
2256
+ _schemaTables = new WeakMap();
1693
2257
  _search = new WeakSet();
1694
2258
  search_fn = async function(query, options, getFetchProps) {
1695
2259
  const fetchProps = await getFetchProps();
1696
- const { tables, fuzziness } = options ?? {};
2260
+ const { tables, fuzziness, highlight, prefix } = options ?? {};
1697
2261
  const { records } = await searchBranch({
1698
2262
  pathParams: { workspace: "{workspaceId}", dbBranchName: "{dbBranch}" },
1699
- body: { tables, query, fuzziness },
2263
+ body: { tables, query, fuzziness, prefix, highlight },
1700
2264
  ...fetchProps
1701
2265
  });
1702
2266
  return records;
1703
2267
  };
1704
- _getSchema = new WeakSet();
1705
- getSchema_fn = async function(getFetchProps) {
1706
- if (__privateGet$1(this, _schema))
1707
- return __privateGet$1(this, _schema);
2268
+ _getSchemaTables = new WeakSet();
2269
+ getSchemaTables_fn = async function(getFetchProps) {
2270
+ if (__privateGet$1(this, _schemaTables))
2271
+ return __privateGet$1(this, _schemaTables);
1708
2272
  const fetchProps = await getFetchProps();
1709
2273
  const { schema } = await getBranchDetails({
1710
2274
  pathParams: { workspace: "{workspaceId}", dbBranchName: "{dbBranch}" },
1711
2275
  ...fetchProps
1712
2276
  });
1713
- __privateSet$1(this, _schema, schema);
1714
- return schema;
2277
+ __privateSet$1(this, _schemaTables, schema.tables);
2278
+ return schema.tables;
1715
2279
  };
1716
2280
 
1717
2281
  const isBranchStrategyBuilder = (strategy) => {
1718
2282
  return typeof strategy === "function";
1719
2283
  };
1720
2284
 
1721
- const envBranchNames = [
1722
- "XATA_BRANCH",
1723
- "VERCEL_GIT_COMMIT_REF",
1724
- "CF_PAGES_BRANCH",
1725
- "BRANCH"
1726
- ];
1727
- const defaultBranch = "main";
1728
2285
  async function getCurrentBranchName(options) {
1729
- const env = await getBranchByEnvVariable();
1730
- if (env)
1731
- return env;
1732
- const branch = await getGitBranch();
1733
- if (!branch)
1734
- return defaultBranch;
1735
- const details = await getDatabaseBranch(branch, options);
1736
- if (details)
1737
- return branch;
1738
- return defaultBranch;
2286
+ const { branch, envBranch } = getEnvironment();
2287
+ if (branch) {
2288
+ const details = await getDatabaseBranch(branch, options);
2289
+ if (details)
2290
+ return branch;
2291
+ console.warn(`Branch ${branch} not found in Xata. Ignoring...`);
2292
+ }
2293
+ const gitBranch = envBranch || await getGitBranch();
2294
+ return resolveXataBranch(gitBranch, options);
1739
2295
  }
1740
2296
  async function getCurrentBranchDetails(options) {
1741
- const env = await getBranchByEnvVariable();
1742
- if (env)
1743
- return getDatabaseBranch(env, options);
1744
- const branch = await getGitBranch();
1745
- if (!branch)
1746
- return getDatabaseBranch(defaultBranch, options);
1747
- const details = await getDatabaseBranch(branch, options);
1748
- if (details)
1749
- return details;
1750
- return getDatabaseBranch(defaultBranch, options);
2297
+ const branch = await getCurrentBranchName(options);
2298
+ return getDatabaseBranch(branch, options);
2299
+ }
2300
+ async function resolveXataBranch(gitBranch, options) {
2301
+ const databaseURL = options?.databaseURL || getDatabaseURL();
2302
+ const apiKey = options?.apiKey || getAPIKey();
2303
+ if (!databaseURL)
2304
+ throw new Error(
2305
+ "A databaseURL was not defined. Either set the XATA_DATABASE_URL env variable or pass the argument explicitely"
2306
+ );
2307
+ if (!apiKey)
2308
+ throw new Error(
2309
+ "An API key was not defined. Either set the XATA_API_KEY env variable or pass the argument explicitely"
2310
+ );
2311
+ const [protocol, , host, , dbName] = databaseURL.split("/");
2312
+ const [workspace] = host.split(".");
2313
+ const { fallbackBranch } = getEnvironment();
2314
+ const { branch } = await resolveBranch({
2315
+ apiKey,
2316
+ apiUrl: databaseURL,
2317
+ fetchImpl: getFetchImplementation(options?.fetchImpl),
2318
+ workspacesApiUrl: `${protocol}//${host}`,
2319
+ pathParams: { dbName, workspace },
2320
+ queryParams: { gitBranch, fallbackBranch },
2321
+ trace: defaultTrace
2322
+ });
2323
+ return branch;
1751
2324
  }
1752
2325
  async function getDatabaseBranch(branch, options) {
1753
2326
  const databaseURL = options?.databaseURL || getDatabaseURL();
1754
2327
  const apiKey = options?.apiKey || getAPIKey();
1755
2328
  if (!databaseURL)
1756
- throw new Error("A databaseURL was not defined. Either set the XATA_DATABASE_URL env variable or pass the argument explicitely");
2329
+ throw new Error(
2330
+ "A databaseURL was not defined. Either set the XATA_DATABASE_URL env variable or pass the argument explicitely"
2331
+ );
1757
2332
  if (!apiKey)
1758
- throw new Error("An API key was not defined. Either set the XATA_API_KEY env variable or pass the argument explicitely");
2333
+ throw new Error(
2334
+ "An API key was not defined. Either set the XATA_API_KEY env variable or pass the argument explicitely"
2335
+ );
1759
2336
  const [protocol, , host, , database] = databaseURL.split("/");
1760
2337
  const [workspace] = host.split(".");
1761
2338
  const dbBranchName = `${database}:${branch}`;
@@ -1765,10 +2342,8 @@ async function getDatabaseBranch(branch, options) {
1765
2342
  apiUrl: databaseURL,
1766
2343
  fetchImpl: getFetchImplementation(options?.fetchImpl),
1767
2344
  workspacesApiUrl: `${protocol}//${host}`,
1768
- pathParams: {
1769
- dbBranchName,
1770
- workspace
1771
- }
2345
+ pathParams: { dbBranchName, workspace },
2346
+ trace: defaultTrace
1772
2347
  });
1773
2348
  } catch (err) {
1774
2349
  if (isObject(err) && err.status === 404)
@@ -1776,21 +2351,10 @@ async function getDatabaseBranch(branch, options) {
1776
2351
  throw err;
1777
2352
  }
1778
2353
  }
1779
- function getBranchByEnvVariable() {
1780
- for (const name of envBranchNames) {
1781
- const value = getEnvVariable(name);
1782
- if (value) {
1783
- return value;
1784
- }
1785
- }
1786
- try {
1787
- return XATA_BRANCH;
1788
- } catch (err) {
1789
- }
1790
- }
1791
2354
  function getDatabaseURL() {
1792
2355
  try {
1793
- return getEnvVariable("XATA_DATABASE_URL") ?? XATA_DATABASE_URL;
2356
+ const { databaseURL } = getEnvironment();
2357
+ return databaseURL;
1794
2358
  } catch (err) {
1795
2359
  return void 0;
1796
2360
  }
@@ -1819,24 +2383,27 @@ var __privateMethod = (obj, member, method) => {
1819
2383
  return method;
1820
2384
  };
1821
2385
  const buildClient = (plugins) => {
1822
- var _branch, _parseOptions, parseOptions_fn, _getFetchProps, getFetchProps_fn, _evaluateBranch, evaluateBranch_fn, _a;
2386
+ var _branch, _options, _parseOptions, parseOptions_fn, _getFetchProps, getFetchProps_fn, _evaluateBranch, evaluateBranch_fn, _a;
1823
2387
  return _a = class {
1824
- constructor(options = {}, tables) {
2388
+ constructor(options = {}, schemaTables) {
1825
2389
  __privateAdd(this, _parseOptions);
1826
2390
  __privateAdd(this, _getFetchProps);
1827
2391
  __privateAdd(this, _evaluateBranch);
1828
2392
  __privateAdd(this, _branch, void 0);
2393
+ __privateAdd(this, _options, void 0);
1829
2394
  const safeOptions = __privateMethod(this, _parseOptions, parseOptions_fn).call(this, options);
2395
+ __privateSet(this, _options, safeOptions);
1830
2396
  const pluginOptions = {
1831
2397
  getFetchProps: () => __privateMethod(this, _getFetchProps, getFetchProps_fn).call(this, safeOptions),
1832
- cache: safeOptions.cache
2398
+ cache: safeOptions.cache,
2399
+ trace: safeOptions.trace
1833
2400
  };
1834
- const db = new SchemaPlugin(tables).build(pluginOptions);
1835
- const search = new SearchPlugin(db).build(pluginOptions);
2401
+ const db = new SchemaPlugin(schemaTables).build(pluginOptions);
2402
+ const search = new SearchPlugin(db, schemaTables).build(pluginOptions);
1836
2403
  this.db = db;
1837
2404
  this.search = search;
1838
2405
  for (const [key, namespace] of Object.entries(plugins ?? {})) {
1839
- if (!namespace)
2406
+ if (namespace === void 0)
1840
2407
  continue;
1841
2408
  const result = namespace.build(pluginOptions);
1842
2409
  if (result instanceof Promise) {
@@ -1848,22 +2415,26 @@ const buildClient = (plugins) => {
1848
2415
  }
1849
2416
  }
1850
2417
  }
1851
- }, _branch = new WeakMap(), _parseOptions = new WeakSet(), parseOptions_fn = function(options) {
2418
+ async getConfig() {
2419
+ const databaseURL = __privateGet(this, _options).databaseURL;
2420
+ const branch = await __privateGet(this, _options).branch();
2421
+ return { databaseURL, branch };
2422
+ }
2423
+ }, _branch = new WeakMap(), _options = new WeakMap(), _parseOptions = new WeakSet(), parseOptions_fn = function(options) {
1852
2424
  const fetch = getFetchImplementation(options?.fetch);
1853
2425
  const databaseURL = options?.databaseURL || getDatabaseURL();
1854
2426
  const apiKey = options?.apiKey || getAPIKey();
1855
- const cache = options?.cache ?? new SimpleCache({ cacheRecords: false, defaultQueryTTL: 0 });
1856
- const branch = async () => options?.branch ? await __privateMethod(this, _evaluateBranch, evaluateBranch_fn).call(this, options.branch) : await getCurrentBranchName({ apiKey, databaseURL, fetchImpl: options?.fetch });
1857
- if (!databaseURL || !apiKey) {
1858
- throw new Error("Options databaseURL and apiKey are required");
2427
+ const cache = options?.cache ?? new SimpleCache({ defaultQueryTTL: 0 });
2428
+ const trace = options?.trace ?? defaultTrace;
2429
+ const branch = async () => options?.branch !== void 0 ? await __privateMethod(this, _evaluateBranch, evaluateBranch_fn).call(this, options.branch) : await getCurrentBranchName({ apiKey, databaseURL, fetchImpl: options?.fetch });
2430
+ if (!apiKey) {
2431
+ throw new Error("Option apiKey is required");
1859
2432
  }
1860
- return { fetch, databaseURL, apiKey, branch, cache };
1861
- }, _getFetchProps = new WeakSet(), getFetchProps_fn = async function({
1862
- fetch,
1863
- apiKey,
1864
- databaseURL,
1865
- branch
1866
- }) {
2433
+ if (!databaseURL) {
2434
+ throw new Error("Option databaseURL is required");
2435
+ }
2436
+ return { fetch, databaseURL, apiKey, branch, cache, trace };
2437
+ }, _getFetchProps = new WeakSet(), getFetchProps_fn = async function({ fetch, apiKey, databaseURL, branch, trace }) {
1867
2438
  const branchValue = await __privateMethod(this, _evaluateBranch, evaluateBranch_fn).call(this, branch);
1868
2439
  if (!branchValue)
1869
2440
  throw new Error("Unable to resolve branch value");
@@ -1873,14 +2444,15 @@ const buildClient = (plugins) => {
1873
2444
  apiUrl: "",
1874
2445
  workspacesApiUrl: (path, params) => {
1875
2446
  const hasBranch = params.dbBranchName ?? params.branch;
1876
- const newPath = path.replace(/^\/db\/[^/]+/, hasBranch ? `:${branchValue}` : "");
2447
+ const newPath = path.replace(/^\/db\/[^/]+/, hasBranch !== void 0 ? `:${branchValue}` : "");
1877
2448
  return databaseURL + newPath;
1878
- }
2449
+ },
2450
+ trace
1879
2451
  };
1880
2452
  }, _evaluateBranch = new WeakSet(), evaluateBranch_fn = async function(param) {
1881
2453
  if (__privateGet(this, _branch))
1882
2454
  return __privateGet(this, _branch);
1883
- if (!param)
2455
+ if (param === void 0)
1884
2456
  return void 0;
1885
2457
  const strategies = Array.isArray(param) ? [...param] : [param];
1886
2458
  const evaluateBranch = async (strategy) => {
@@ -1898,6 +2470,88 @@ const buildClient = (plugins) => {
1898
2470
  class BaseClient extends buildClient() {
1899
2471
  }
1900
2472
 
2473
+ const META = "__";
2474
+ const VALUE = "___";
2475
+ class Serializer {
2476
+ constructor() {
2477
+ this.classes = {};
2478
+ }
2479
+ add(clazz) {
2480
+ this.classes[clazz.name] = clazz;
2481
+ }
2482
+ toJSON(data) {
2483
+ function visit(obj) {
2484
+ if (Array.isArray(obj))
2485
+ return obj.map(visit);
2486
+ const type = typeof obj;
2487
+ if (type === "undefined")
2488
+ return { [META]: "undefined" };
2489
+ if (type === "bigint")
2490
+ return { [META]: "bigint", [VALUE]: obj.toString() };
2491
+ if (obj === null || type !== "object")
2492
+ return obj;
2493
+ const constructor = obj.constructor;
2494
+ const o = { [META]: constructor.name };
2495
+ for (const [key, value] of Object.entries(obj)) {
2496
+ o[key] = visit(value);
2497
+ }
2498
+ if (constructor === Date)
2499
+ o[VALUE] = obj.toISOString();
2500
+ if (constructor === Map)
2501
+ o[VALUE] = Object.fromEntries(obj);
2502
+ if (constructor === Set)
2503
+ o[VALUE] = [...obj];
2504
+ return o;
2505
+ }
2506
+ return JSON.stringify(visit(data));
2507
+ }
2508
+ fromJSON(json) {
2509
+ return JSON.parse(json, (key, value) => {
2510
+ if (value && typeof value === "object" && !Array.isArray(value)) {
2511
+ const { [META]: clazz, [VALUE]: val, ...rest } = value;
2512
+ const constructor = this.classes[clazz];
2513
+ if (constructor) {
2514
+ return Object.assign(Object.create(constructor.prototype), rest);
2515
+ }
2516
+ if (clazz === "Date")
2517
+ return new Date(val);
2518
+ if (clazz === "Set")
2519
+ return new Set(val);
2520
+ if (clazz === "Map")
2521
+ return new Map(Object.entries(val));
2522
+ if (clazz === "bigint")
2523
+ return BigInt(val);
2524
+ if (clazz === "undefined")
2525
+ return void 0;
2526
+ return rest;
2527
+ }
2528
+ return value;
2529
+ });
2530
+ }
2531
+ }
2532
+ const defaultSerializer = new Serializer();
2533
+ const serialize = (data) => {
2534
+ return defaultSerializer.toJSON(data);
2535
+ };
2536
+ const deserialize = (json) => {
2537
+ return defaultSerializer.fromJSON(json);
2538
+ };
2539
+
2540
+ function buildWorkerRunner(config) {
2541
+ return function xataWorker(name, _worker) {
2542
+ return async (...args) => {
2543
+ const url = process.env.NODE_ENV === "development" ? `http://localhost:64749/${name}` : `https://dispatcher.xata.workers.dev/${config.workspace}/${config.worker}/${name}`;
2544
+ const result = await fetch(url, {
2545
+ method: "POST",
2546
+ headers: { "Content-Type": "application/json" },
2547
+ body: serialize({ args })
2548
+ });
2549
+ const text = await result.text();
2550
+ return deserialize(text);
2551
+ };
2552
+ };
2553
+ }
2554
+
1901
2555
  class XataError extends Error {
1902
2556
  constructor(message, status) {
1903
2557
  super(message);
@@ -1905,5 +2559,5 @@ class XataError extends Error {
1905
2559
  }
1906
2560
  }
1907
2561
 
1908
- export { BaseClient, operationsByTag as Operations, PAGINATION_DEFAULT_OFFSET, PAGINATION_DEFAULT_SIZE, PAGINATION_MAX_OFFSET, PAGINATION_MAX_SIZE, Page, Query, Repository, RestRepository, SchemaPlugin, SearchPlugin, SimpleCache, XataApiClient, XataApiPlugin, XataError, XataPlugin, acceptWorkspaceMemberInvite, addGitBranchesEntry, addTableColumn, buildClient, bulkInsertTableRecords, cancelWorkspaceMemberInvite, contains, createBranch, createDatabase, createTable, createUserAPIKey, createWorkspace, deleteBranch, deleteColumn, deleteDatabase, deleteRecord, deleteTable, deleteUser, deleteUserAPIKey, deleteWorkspace, endsWith, executeBranchMigrationPlan, exists, ge, getAPIKey, getBranchDetails, getBranchList, getBranchMetadata, getBranchMigrationHistory, getBranchMigrationPlan, getBranchStats, getColumn, getCurrentBranchDetails, getCurrentBranchName, getDatabaseList, getDatabaseURL, getGitBranchesMapping, getRecord, getTableColumns, getTableSchema, getUser, getUserAPIKeys, getWorkspace, getWorkspaceMembersList, getWorkspacesList, gt, gte, includes, includesAll, includesAny, includesNone, insertRecord, insertRecordWithID, inviteWorkspaceMember, is, isIdentifiable, isNot, isXataRecord, le, lt, lte, notExists, operationsByTag, pattern, queryTable, removeGitBranchesEntry, removeWorkspaceMember, resendWorkspaceMemberInvite, resolveBranch, searchBranch, setTableSchema, startsWith, updateBranchMetadata, updateColumn, updateRecordWithID, updateTable, updateUser, updateWorkspace, updateWorkspaceMemberRole, upsertRecordWithID };
2562
+ export { BaseClient, operationsByTag as Operations, PAGINATION_DEFAULT_OFFSET, PAGINATION_DEFAULT_SIZE, PAGINATION_MAX_OFFSET, PAGINATION_MAX_SIZE, Page, Query, RecordArray, Repository, RestRepository, SchemaPlugin, SearchPlugin, Serializer, SimpleCache, XataApiClient, XataApiPlugin, XataError, XataPlugin, acceptWorkspaceMemberInvite, addGitBranchesEntry, addTableColumn, applyBranchSchemaEdit, buildClient, buildWorkerRunner, bulkInsertTableRecords, cancelWorkspaceMemberInvite, compareBranchSchemas, compareBranchWithUserSchema, compareMigrationRequest, contains, createBranch, createDatabase, createMigrationRequest, createTable, createUserAPIKey, createWorkspace, deleteBranch, deleteColumn, deleteDatabase, deleteRecord, deleteTable, deleteUser, deleteUserAPIKey, deleteWorkspace, deserialize, endsWith, equals, executeBranchMigrationPlan, exists, ge, getAPIKey, getBranchDetails, getBranchList, getBranchMetadata, getBranchMigrationHistory, getBranchMigrationPlan, getBranchSchemaHistory, getBranchStats, getColumn, getCurrentBranchDetails, getCurrentBranchName, getDatabaseList, getDatabaseMetadata, getDatabaseURL, getGitBranchesMapping, getMigrationRequest, getMigrationRequestIsMerged, getRecord, getTableColumns, getTableSchema, getUser, getUserAPIKeys, getWorkspace, getWorkspaceMembersList, getWorkspacesList, greaterEquals, greaterThan, greaterThanEquals, gt, gte, includes, includesAll, includesAny, includesNone, insertRecord, insertRecordWithID, inviteWorkspaceMember, is, isCursorPaginationOptions, isIdentifiable, isNot, isXataRecord, le, lessEquals, lessThan, lessThanEquals, listMigrationRequests, listMigrationRequestsCommits, lt, lte, mergeMigrationRequest, notExists, operationsByTag, pattern, previewBranchSchemaEdit, queryTable, removeGitBranchesEntry, removeWorkspaceMember, resendWorkspaceMemberInvite, resolveBranch, searchBranch, searchTable, serialize, setTableSchema, startsWith, summarizeTable, updateBranchMetadata, updateBranchSchema, updateColumn, updateDatabaseMetadata, updateMigrationRequest, updateRecordWithID, updateTable, updateUser, updateWorkspace, updateWorkspaceMemberInvite, updateWorkspaceMemberRole, upsertRecordWithID };
1909
2563
  //# sourceMappingURL=index.mjs.map