@budibase/backend-core 2.29.27 → 2.29.29

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.js CHANGED
@@ -15440,7 +15440,7 @@ var require_cookie = __commonJS({
15440
15440
  c.value = cookieValue;
15441
15441
  return c;
15442
15442
  }
15443
- function parse2(str, options2) {
15443
+ function parse(str, options2) {
15444
15444
  if (!options2 || typeof options2 !== "object") {
15445
15445
  options2 = {};
15446
15446
  }
@@ -15622,7 +15622,7 @@ var require_cookie = __commonJS({
15622
15622
  });
15623
15623
  }
15624
15624
  Cookie2.cookiesCreated = 0;
15625
- Cookie2.parse = parse2;
15625
+ Cookie2.parse = parse;
15626
15626
  Cookie2.fromJSON = fromJSON;
15627
15627
  Cookie2.prototype.key = "";
15628
15628
  Cookie2.prototype.value = "";
@@ -16179,7 +16179,7 @@ var require_cookie = __commonJS({
16179
16179
  exports.MemoryCookieStore = MemoryCookieStore;
16180
16180
  exports.parseDate = parseDate;
16181
16181
  exports.formatDate = formatDate;
16182
- exports.parse = parse2;
16182
+ exports.parse = parse;
16183
16183
  exports.fromJSON = fromJSON;
16184
16184
  exports.domainMatch = domainMatch;
16185
16185
  exports.defaultPath = defaultPath;
@@ -16381,7 +16381,7 @@ var require_aws_sign2 = __commonJS({
16381
16381
  "../../node_modules/aws-sign2/index.js"(exports, module2) {
16382
16382
  "use strict";
16383
16383
  var crypto2 = require("crypto");
16384
- var parse2 = require("url").parse;
16384
+ var parse = require("url").parse;
16385
16385
  var keys2 = [
16386
16386
  "acl",
16387
16387
  "location",
@@ -16447,7 +16447,7 @@ var require_aws_sign2 = __commonJS({
16447
16447
  }
16448
16448
  module2.exports.canonicalizeHeaders = canonicalizeHeaders;
16449
16449
  function canonicalizeResource(resource) {
16450
- var url = parse2(resource, true), path3 = url.pathname, buf = [];
16450
+ var url = parse(resource, true), path3 = url.pathname, buf = [];
16451
16451
  Object.keys(url.query).forEach(function(key) {
16452
16452
  if (!~keys2.indexOf(key))
16453
16453
  return;
@@ -41274,11 +41274,11 @@ var require_lib7 = __commonJS({
41274
41274
  "../../node_modules/request/node_modules/qs/lib/index.js"(exports, module2) {
41275
41275
  "use strict";
41276
41276
  var stringify = require_stringify2();
41277
- var parse2 = require_parse();
41277
+ var parse = require_parse();
41278
41278
  var formats2 = require_formats();
41279
41279
  module2.exports = {
41280
41280
  formats: formats2,
41281
- parse: parse2,
41281
+ parse,
41282
41282
  stringify
41283
41283
  };
41284
41284
  }
@@ -41870,7 +41870,7 @@ var require_uri_all = __commonJS({
41870
41870
  }
41871
41871
  var URI_PARSE = /^(?:([^:\/?#]+):)?(?:\/\/((?:([^\/?#@]*)@)?(\[[^\/?#\]]+\]|[^\/?#:]*)(?:\:(\d*))?))?([^?#]*)(?:\?([^#]*))?(?:#((?:.|\n|\r)*))?/i;
41872
41872
  var NO_MATCH_IS_UNDEFINED = "".match(/(){0}/)[1] === void 0;
41873
- function parse2(uriString) {
41873
+ function parse(uriString) {
41874
41874
  var options2 = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};
41875
41875
  var components = {};
41876
41876
  var protocol = options2.iri !== false ? IRI_PROTOCOL : URI_PROTOCOL;
@@ -42041,8 +42041,8 @@ var require_uri_all = __commonJS({
42041
42041
  var skipNormalization = arguments[3];
42042
42042
  var target = {};
42043
42043
  if (!skipNormalization) {
42044
- base3 = parse2(serialize(base3, options2), options2);
42045
- relative = parse2(serialize(relative, options2), options2);
42044
+ base3 = parse(serialize(base3, options2), options2);
42045
+ relative = parse(serialize(relative, options2), options2);
42046
42046
  }
42047
42047
  options2 = options2 || {};
42048
42048
  if (!options2.tolerant && relative.scheme) {
@@ -42093,24 +42093,24 @@ var require_uri_all = __commonJS({
42093
42093
  }
42094
42094
  function resolve(baseURI, relativeURI, options2) {
42095
42095
  var schemelessOptions = assign({ scheme: "null" }, options2);
42096
- return serialize(resolveComponents(parse2(baseURI, schemelessOptions), parse2(relativeURI, schemelessOptions), schemelessOptions, true), schemelessOptions);
42096
+ return serialize(resolveComponents(parse(baseURI, schemelessOptions), parse(relativeURI, schemelessOptions), schemelessOptions, true), schemelessOptions);
42097
42097
  }
42098
42098
  function normalize(uri, options2) {
42099
42099
  if (typeof uri === "string") {
42100
- uri = serialize(parse2(uri, options2), options2);
42100
+ uri = serialize(parse(uri, options2), options2);
42101
42101
  } else if (typeOf(uri) === "object") {
42102
- uri = parse2(serialize(uri, options2), options2);
42102
+ uri = parse(serialize(uri, options2), options2);
42103
42103
  }
42104
42104
  return uri;
42105
42105
  }
42106
42106
  function equal(uriA, uriB, options2) {
42107
42107
  if (typeof uriA === "string") {
42108
- uriA = serialize(parse2(uriA, options2), options2);
42108
+ uriA = serialize(parse(uriA, options2), options2);
42109
42109
  } else if (typeOf(uriA) === "object") {
42110
42110
  uriA = serialize(uriA, options2);
42111
42111
  }
42112
42112
  if (typeof uriB === "string") {
42113
- uriB = serialize(parse2(uriB, options2), options2);
42113
+ uriB = serialize(parse(uriB, options2), options2);
42114
42114
  } else if (typeOf(uriB) === "object") {
42115
42115
  uriB = serialize(uriB, options2);
42116
42116
  }
@@ -42125,7 +42125,7 @@ var require_uri_all = __commonJS({
42125
42125
  var handler = {
42126
42126
  scheme: "http",
42127
42127
  domainHost: true,
42128
- parse: function parse3(components, options2) {
42128
+ parse: function parse2(components, options2) {
42129
42129
  if (!components.host) {
42130
42130
  components.error = components.error || "HTTP URIs must have a host.";
42131
42131
  }
@@ -42154,7 +42154,7 @@ var require_uri_all = __commonJS({
42154
42154
  var handler$2 = {
42155
42155
  scheme: "ws",
42156
42156
  domainHost: true,
42157
- parse: function parse3(components, options2) {
42157
+ parse: function parse2(components, options2) {
42158
42158
  var wsComponents = components;
42159
42159
  wsComponents.secure = isSecure(wsComponents);
42160
42160
  wsComponents.resourceName = (wsComponents.path || "/") + (wsComponents.query ? "?" + wsComponents.query : "");
@@ -42330,7 +42330,7 @@ var require_uri_all = __commonJS({
42330
42330
  var UUID = /^[0-9A-Fa-f]{8}(?:\-[0-9A-Fa-f]{4}){3}\-[0-9A-Fa-f]{12}$/;
42331
42331
  var handler$6 = {
42332
42332
  scheme: "urn:uuid",
42333
- parse: function parse3(urnComponents, options2) {
42333
+ parse: function parse2(urnComponents, options2) {
42334
42334
  var uuidComponents = urnComponents;
42335
42335
  uuidComponents.uuid = uuidComponents.nss;
42336
42336
  uuidComponents.nss = void 0;
@@ -42355,7 +42355,7 @@ var require_uri_all = __commonJS({
42355
42355
  exports2.SCHEMES = SCHEMES;
42356
42356
  exports2.pctEncChar = pctEncChar;
42357
42357
  exports2.pctDecChars = pctDecChars;
42358
- exports2.parse = parse2;
42358
+ exports2.parse = parse;
42359
42359
  exports2.removeDotSegments = removeDotSegments;
42360
42360
  exports2.serialize = serialize;
42361
42361
  exports2.resolveComponents = resolveComponents;
@@ -54462,6 +54462,15 @@ var DatasourceFeature = /* @__PURE__ */ ((DatasourceFeature2) => {
54462
54462
  })(DatasourceFeature || {});
54463
54463
 
54464
54464
  // ../types/src/sdk/search.ts
54465
+ var BasicOperator = /* @__PURE__ */ ((BasicOperator2) => {
54466
+ BasicOperator2["EQUAL"] = "equal";
54467
+ BasicOperator2["NOT_EQUAL"] = "notEqual";
54468
+ BasicOperator2["EMPTY"] = "empty";
54469
+ BasicOperator2["NOT_EMPTY"] = "notEmpty";
54470
+ BasicOperator2["FUZZY"] = "fuzzy";
54471
+ BasicOperator2["STRING"] = "string";
54472
+ return BasicOperator2;
54473
+ })(BasicOperator || {});
54465
54474
  var ArrayOperator = /* @__PURE__ */ ((ArrayOperator2) => {
54466
54475
  ArrayOperator2["CONTAINS"] = "contains";
54467
54476
  ArrayOperator2["NOT_CONTAINS"] = "notContains";
@@ -54469,6 +54478,10 @@ var ArrayOperator = /* @__PURE__ */ ((ArrayOperator2) => {
54469
54478
  ArrayOperator2["ONE_OF"] = "oneOf";
54470
54479
  return ArrayOperator2;
54471
54480
  })(ArrayOperator || {});
54481
+ var RangeOperator = /* @__PURE__ */ ((RangeOperator2) => {
54482
+ RangeOperator2["RANGE"] = "range";
54483
+ return RangeOperator2;
54484
+ })(RangeOperator || {});
54472
54485
 
54473
54486
  // ../types/src/sdk/db.ts
54474
54487
  var isDocument = (doc) => {
@@ -54520,7 +54533,7 @@ var PermissionType = /* @__PURE__ */ ((PermissionType2) => {
54520
54533
  var isCloudAccount = (account) => account.hosting === "cloud" /* CLOUD */;
54521
54534
  var isSSOAccount = (account) => account.authType === "sso" /* SSO */;
54522
54535
 
54523
- // ../types/src/documents/app/automation.ts
54536
+ // ../types/src/documents/app/automation/automation.ts
54524
54537
  var AutomationIOType = /* @__PURE__ */ ((AutomationIOType2) => {
54525
54538
  AutomationIOType2["OBJECT"] = "object";
54526
54539
  AutomationIOType2["STRING"] = "string";
@@ -54988,6 +55001,8 @@ function validate(cronExpression) {
54988
55001
  // ../shared-core/src/helpers/schema.ts
54989
55002
  var schema_exports = {};
54990
55003
  __export(schema_exports, {
55004
+ decodeNonAscii: () => decodeNonAscii,
55005
+ encodeNonAscii: () => encodeNonAscii,
54991
55006
  isDeprecatedSingleUserColumn: () => isDeprecatedSingleUserColumn,
54992
55007
  isRequired: () => isRequired
54993
55008
  });
@@ -54999,6 +55014,17 @@ function isRequired(constraints) {
54999
55014
  const isRequired2 = !!constraints && (typeof constraints.presence !== "boolean" && constraints.presence?.allowEmpty === false || constraints.presence === true);
55000
55015
  return isRequired2;
55001
55016
  }
55017
+ function encodeNonAscii(str) {
55018
+ return str.split("").map((char) => {
55019
+ return char.charCodeAt(0) > 127 ? "\\u" + char.charCodeAt(0).toString(16).padStart(4, "0") : char;
55020
+ }).join("");
55021
+ }
55022
+ function decodeNonAscii(str) {
55023
+ return str.replace(
55024
+ /\\u([0-9a-fA-F]{4})/g,
55025
+ (match, p1) => String.fromCharCode(parseInt(p1, 16))
55026
+ );
55027
+ }
55002
55028
 
55003
55029
  // ../shared-core/src/filters.ts
55004
55030
  var import_lodash = require("lodash");
@@ -55102,7 +55128,7 @@ var getKeyNumbering = (key) => {
55102
55128
  }
55103
55129
  };
55104
55130
  var ColumnSplitter = class {
55105
- constructor(tables) {
55131
+ constructor(tables, opts) {
55106
55132
  this.tableNames = tables.map((table) => table.name);
55107
55133
  this.tableIds = tables.map((table) => table._id);
55108
55134
  this.relationshipColumnNames = tables.flatMap(
@@ -55111,11 +55137,28 @@ var ColumnSplitter = class {
55111
55137
  )
55112
55138
  );
55113
55139
  this.relationships = this.tableNames.concat(this.tableIds).concat(this.relationshipColumnNames).sort((a, b) => b.length - a.length);
55140
+ if (opts?.aliases) {
55141
+ this.aliases = {};
55142
+ for (const [key, value] of Object.entries(opts.aliases)) {
55143
+ this.aliases[value] = key;
55144
+ }
55145
+ }
55146
+ this.columnPrefix = opts?.columnPrefix;
55114
55147
  }
55115
55148
  run(key) {
55116
55149
  let { prefix, key: splitKey } = getKeyNumbering(key);
55150
+ let tableName = void 0;
55151
+ if (this.aliases) {
55152
+ for (const possibleAlias of Object.keys(this.aliases || {})) {
55153
+ const withDot = `${possibleAlias}.`;
55154
+ if (splitKey.startsWith(withDot)) {
55155
+ tableName = this.aliases[possibleAlias];
55156
+ splitKey = splitKey.slice(withDot.length);
55157
+ }
55158
+ }
55159
+ }
55117
55160
  let relationship;
55118
- for (let possibleRelationship of this.relationships) {
55161
+ for (const possibleRelationship of this.relationships) {
55119
55162
  const withDot = `${possibleRelationship}.`;
55120
55163
  if (splitKey.startsWith(withDot)) {
55121
55164
  const finalKeyParts = splitKey.split(withDot);
@@ -55125,7 +55168,13 @@ var ColumnSplitter = class {
55125
55168
  break;
55126
55169
  }
55127
55170
  }
55171
+ if (this.columnPrefix) {
55172
+ if (splitKey.startsWith(this.columnPrefix)) {
55173
+ splitKey = decodeNonAscii(splitKey.slice(this.columnPrefix.length));
55174
+ }
55175
+ }
55128
55176
  return {
55177
+ tableName,
55129
55178
  numberPrefix: prefix,
55130
55179
  relationshipPrefix: relationship,
55131
55180
  column: splitKey
@@ -55466,7 +55515,7 @@ var sort = (docs, sort2, sortOrder, sortType = "string" /* STRING */) => {
55466
55515
  if (!sort2 || !sortOrder || !sortType) {
55467
55516
  return docs;
55468
55517
  }
55469
- const parse2 = (x) => {
55518
+ const parse = (x) => {
55470
55519
  if (x == null) {
55471
55520
  return x;
55472
55521
  }
@@ -55476,8 +55525,8 @@ var sort = (docs, sort2, sortOrder, sortType = "string" /* STRING */) => {
55476
55525
  return parseFloat(x);
55477
55526
  };
55478
55527
  return docs.slice().sort((a, b) => {
55479
- const colA = parse2(a[sort2]);
55480
- const colB = parse2(b[sort2]);
55528
+ const colA = parse(a[sort2]);
55529
+ const colB = parse(b[sort2]);
55481
55530
  const result = colB == null || colA > colB ? 1 : -1;
55482
55531
  if (sortOrder.toLowerCase() === "descending") {
55483
55532
  return result * -1;
@@ -55514,6 +55563,7 @@ __export(utils_exports, {
55514
55563
  filterValueToLabel: () => filterValueToLabel,
55515
55564
  hasSchema: () => hasSchema,
55516
55565
  parallelForeach: () => parallelForeach,
55566
+ trimOtherProps: () => trimOtherProps,
55517
55567
  unreachable: () => unreachable
55518
55568
  });
55519
55569
  function unreachable(value, message = `No such case in exhaustive switch: ${value}`) {
@@ -55560,6 +55610,13 @@ function filterValueToLabel() {
55560
55610
  function hasSchema(test) {
55561
55611
  return typeof test === "object" && !Array.isArray(test) && test !== null && !(test instanceof Date) && Object.keys(test).length > 0;
55562
55612
  }
55613
+ function trimOtherProps(object, allowedProps) {
55614
+ const result = Object.keys(object).filter((key) => allowedProps.includes(key)).reduce(
55615
+ (acc, key) => ({ ...acc, [key]: object[key] }),
55616
+ {}
55617
+ );
55618
+ return result;
55619
+ }
55563
55620
 
55564
55621
  // ../shared-core/src/sdk/index.ts
55565
55622
  var sdk_exports = {};
@@ -67424,62 +67481,6 @@ __export(sql_exports, {
67424
67481
  // src/sql/sql.ts
67425
67482
  var import_knex2 = require("knex");
67426
67483
 
67427
- // src/sql/sqlStatements.ts
67428
- var SqlStatements = class {
67429
- constructor(client, table, { allOr, columnPrefix } = {}) {
67430
- this.client = client;
67431
- this.table = table;
67432
- this.allOr = allOr;
67433
- this.columnPrefix = columnPrefix;
67434
- }
67435
- getField(key) {
67436
- const fieldName = key.split(".")[1];
67437
- let found = this.table.schema[fieldName];
67438
- if (!found && this.columnPrefix) {
67439
- const prefixRemovedFieldName = fieldName.replace(this.columnPrefix, "");
67440
- found = this.table.schema[prefixRemovedFieldName];
67441
- }
67442
- return found;
67443
- }
67444
- between(query, key, low, high) {
67445
- const field = this.getField(key);
67446
- if (field?.type === "bigint" /* BIGINT */ && this.client === "sqlite3" /* SQL_LITE */) {
67447
- query = query.whereRaw(
67448
- `CAST(${key} AS INTEGER) BETWEEN CAST(? AS INTEGER) AND CAST(? AS INTEGER)`,
67449
- [low, high]
67450
- );
67451
- } else {
67452
- const fnc = this.allOr ? "orWhereBetween" : "whereBetween";
67453
- query = query[fnc](key, [low, high]);
67454
- }
67455
- return query;
67456
- }
67457
- lte(query, key, low) {
67458
- const field = this.getField(key);
67459
- if (field?.type === "bigint" /* BIGINT */ && this.client === "sqlite3" /* SQL_LITE */) {
67460
- query = query.whereRaw(`CAST(${key} AS INTEGER) >= CAST(? AS INTEGER)`, [
67461
- low
67462
- ]);
67463
- } else {
67464
- const fnc = this.allOr ? "orWhere" : "where";
67465
- query = query[fnc](key, ">=", low);
67466
- }
67467
- return query;
67468
- }
67469
- gte(query, key, high) {
67470
- const field = this.getField(key);
67471
- if (field?.type === "bigint" /* BIGINT */ && this.client === "sqlite3" /* SQL_LITE */) {
67472
- query = query.whereRaw(`CAST(${key} AS INTEGER) <= CAST(? AS INTEGER)`, [
67473
- high
67474
- ]);
67475
- } else {
67476
- const fnc = this.allOr ? "orWhere" : "where";
67477
- query = query[fnc](key, "<=", high);
67478
- }
67479
- return query;
67480
- }
67481
- };
67482
-
67483
67484
  // src/sql/sqlTable.ts
67484
67485
  var import_knex = require("knex");
67485
67486
  function isIgnoredType(type) {
@@ -67692,110 +67693,9 @@ var SqlTableQueryBuilder = class {
67692
67693
  var sqlTable_default = SqlTableQueryBuilder;
67693
67694
 
67694
67695
  // src/sql/sql.ts
67695
- var envLimit = environment_default.SQL_MAX_ROWS ? parseInt(environment_default.SQL_MAX_ROWS) : null;
67696
- var BASE_LIMIT = envLimit || 5e3;
67697
- function quote(client, str) {
67698
- switch (client) {
67699
- case "sqlite3" /* SQL_LITE */:
67700
- case "oracledb" /* ORACLE */:
67701
- case "pg" /* POSTGRES */:
67702
- return `"${str}"`;
67703
- case "mssql" /* MS_SQL */:
67704
- return `[${str}]`;
67705
- case "mysql2" /* MY_SQL */:
67706
- return `\`${str}\``;
67707
- }
67708
- }
67709
- function quotedIdentifier(client, key) {
67710
- return key.split(".").map((part) => quote(client, part)).join(".");
67711
- }
67712
- function parse(input) {
67713
- if (Array.isArray(input)) {
67714
- return JSON.stringify(input);
67715
- }
67716
- if (input == void 0) {
67717
- return null;
67718
- }
67719
- if (typeof input !== "string") {
67720
- return input;
67721
- }
67722
- if (isInvalidISODateString(input)) {
67723
- return null;
67724
- }
67725
- if (isValidISODateString(input)) {
67726
- return new Date(input.trim());
67727
- }
67728
- return input;
67729
- }
67730
- function parseBody(body2) {
67731
- for (let [key, value] of Object.entries(body2)) {
67732
- body2[key] = parse(value);
67733
- }
67734
- return body2;
67735
- }
67736
- function parseFilters(filters) {
67737
- if (!filters) {
67738
- return {};
67739
- }
67740
- for (let [key, value] of Object.entries(filters)) {
67741
- let parsed;
67742
- if (typeof value === "object") {
67743
- parsed = parseFilters(value);
67744
- } else {
67745
- parsed = parse(value);
67746
- }
67747
- filters[key] = parsed;
67748
- }
67749
- return filters;
67750
- }
67751
- function generateSelectStatement(json, knex3) {
67752
- const { resource, meta } = json;
67753
- const client = knex3.client.config.client;
67754
- if (!resource || !resource.fields || resource.fields.length === 0) {
67755
- return "*";
67756
- }
67757
- const schema = meta.table.schema;
67758
- return resource.fields.map((field) => {
67759
- const parts = field.split(/\./g);
67760
- let table = void 0;
67761
- let column = void 0;
67762
- if (parts.length === 1) {
67763
- column = parts[0];
67764
- }
67765
- if (parts.length === 2) {
67766
- table = parts[0];
67767
- column = parts[1];
67768
- }
67769
- if (parts.length > 2) {
67770
- table = parts[0];
67771
- column = parts.slice(1).join(".");
67772
- }
67773
- if (!column) {
67774
- throw new Error(`Invalid field name: ${field}`);
67775
- }
67776
- const columnSchema = schema[column];
67777
- if (client === "pg" /* POSTGRES */ && columnSchema?.externalType?.includes("money")) {
67778
- return knex3.raw(
67779
- `${quotedIdentifier(
67780
- client,
67781
- [table, column].join(".")
67782
- )}::money::numeric as ${quote(client, field)}`
67783
- );
67784
- }
67785
- if (client === "mssql" /* MS_SQL */ && columnSchema?.type === "datetime" /* DATETIME */ && columnSchema.timeOnly) {
67786
- return knex3.raw(`CONVERT(varchar, ${field}, 108) as "${field}"`);
67787
- }
67788
- if (table) {
67789
- return knex3.raw(
67790
- `${quote(client, table)}.${quote(client, column)} as ${quote(
67791
- client,
67792
- field
67793
- )}`
67794
- );
67795
- } else {
67796
- return knex3.raw(`${quote(client, field)} as ${quote(client, field)}`);
67797
- }
67798
- });
67696
+ function getBaseLimit() {
67697
+ const envLimit = environment_default.SQL_MAX_ROWS ? parseInt(environment_default.SQL_MAX_ROWS) : null;
67698
+ return envLimit || 5e3;
67799
67699
  }
67800
67700
  function getTableName(table) {
67801
67701
  if (table?.sourceType === "internal" /* INTERNAL */ || table?.sourceId === INTERNAL_TABLE_SOURCE_ID) {
@@ -67820,23 +67720,203 @@ function convertBooleans(query) {
67820
67720
  return query;
67821
67721
  }
67822
67722
  var InternalBuilder = class {
67823
- constructor(client) {
67723
+ constructor(client, knex3, query) {
67824
67724
  this.client = client;
67725
+ this.query = query;
67726
+ this.knex = knex3;
67727
+ this.splitter = new filters_exports.ColumnSplitter([this.table], {
67728
+ aliases: this.query.tableAliases,
67729
+ columnPrefix: this.query.meta.columnPrefix
67730
+ });
67731
+ }
67732
+ get table() {
67733
+ return this.query.meta.table;
67734
+ }
67735
+ getFieldSchema(key) {
67736
+ const { column } = this.splitter.run(key);
67737
+ return this.table.schema[column];
67738
+ }
67739
+ // Takes a string like foo and returns a quoted string like [foo] for SQL Server
67740
+ // and "foo" for Postgres.
67741
+ quote(str) {
67742
+ switch (this.client) {
67743
+ case "sqlite3" /* SQL_LITE */:
67744
+ case "oracledb" /* ORACLE */:
67745
+ case "pg" /* POSTGRES */:
67746
+ return `"${str}"`;
67747
+ case "mssql" /* MS_SQL */:
67748
+ return `[${str}]`;
67749
+ case "mysql2" /* MY_SQL */:
67750
+ return `\`${str}\``;
67751
+ }
67752
+ }
67753
+ // Takes a string like a.b.c and returns a quoted identifier like [a].[b].[c]
67754
+ // for SQL Server and `a`.`b`.`c` for MySQL.
67755
+ quotedIdentifier(key) {
67756
+ return key.split(".").map((part) => this.quote(part)).join(".");
67757
+ }
67758
+ generateSelectStatement() {
67759
+ const { resource, meta } = this.query;
67760
+ if (!resource || !resource.fields || resource.fields.length === 0) {
67761
+ return "*";
67762
+ }
67763
+ const schema = meta.table.schema;
67764
+ return resource.fields.map((field) => {
67765
+ const parts = field.split(/\./g);
67766
+ let table = void 0;
67767
+ let column = void 0;
67768
+ if (parts.length === 1) {
67769
+ column = parts[0];
67770
+ }
67771
+ if (parts.length === 2) {
67772
+ table = parts[0];
67773
+ column = parts[1];
67774
+ }
67775
+ if (parts.length > 2) {
67776
+ table = parts[0];
67777
+ column = parts.slice(1).join(".");
67778
+ }
67779
+ if (!column) {
67780
+ throw new Error(`Invalid field name: ${field}`);
67781
+ }
67782
+ const columnSchema = schema[column];
67783
+ if (this.client === "pg" /* POSTGRES */ && columnSchema?.externalType?.includes("money")) {
67784
+ return this.knex.raw(
67785
+ `${this.quotedIdentifier(
67786
+ [table, column].join(".")
67787
+ )}::money::numeric as ${this.quote(field)}`
67788
+ );
67789
+ }
67790
+ if (this.client === "mssql" /* MS_SQL */ && columnSchema?.type === "datetime" /* DATETIME */ && columnSchema.timeOnly) {
67791
+ return this.knex.raw(`CONVERT(varchar, ${field}, 108) as "${field}"`);
67792
+ }
67793
+ if (table) {
67794
+ return this.knex.raw(
67795
+ `${this.quote(table)}.${this.quote(column)} as ${this.quote(field)}`
67796
+ );
67797
+ } else {
67798
+ return this.knex.raw(`${this.quote(field)} as ${this.quote(field)}`);
67799
+ }
67800
+ });
67801
+ }
67802
+ // OracleDB can't use character-large-objects (CLOBs) in WHERE clauses,
67803
+ // so when we use them we need to wrap them in to_char(). This function
67804
+ // converts a field name to the appropriate identifier.
67805
+ convertClobs(field) {
67806
+ const parts = field.split(".");
67807
+ const col = parts.pop();
67808
+ const schema = this.table.schema[col];
67809
+ let identifier = this.quotedIdentifier(field);
67810
+ if (schema.type === "string" /* STRING */ || schema.type === "longform" /* LONGFORM */ || schema.type === "bb_reference_single" /* BB_REFERENCE_SINGLE */ || schema.type === "bb_reference" /* BB_REFERENCE */ || schema.type === "options" /* OPTIONS */ || schema.type === "barcodeqr" /* BARCODEQR */) {
67811
+ identifier = `to_char(${identifier})`;
67812
+ }
67813
+ return identifier;
67814
+ }
67815
+ parse(input, schema) {
67816
+ if (Array.isArray(input)) {
67817
+ return JSON.stringify(input);
67818
+ }
67819
+ if (input == void 0) {
67820
+ return null;
67821
+ }
67822
+ if (this.client === "oracledb" /* ORACLE */ && schema.type === "datetime" /* DATETIME */ && schema.timeOnly) {
67823
+ if (input instanceof Date) {
67824
+ const hours = input.getHours().toString().padStart(2, "0");
67825
+ const minutes = input.getMinutes().toString().padStart(2, "0");
67826
+ const seconds = input.getSeconds().toString().padStart(2, "0");
67827
+ return `${hours}:${minutes}:${seconds}`;
67828
+ }
67829
+ if (typeof input === "string") {
67830
+ return /* @__PURE__ */ new Date(`1970-01-01T${input}Z`);
67831
+ }
67832
+ }
67833
+ if (typeof input === "string") {
67834
+ if (isInvalidISODateString(input)) {
67835
+ return null;
67836
+ }
67837
+ if (isValidISODateString(input)) {
67838
+ return new Date(input.trim());
67839
+ }
67840
+ }
67841
+ return input;
67842
+ }
67843
+ parseBody(body2) {
67844
+ for (let [key, value] of Object.entries(body2)) {
67845
+ const { column } = this.splitter.run(key);
67846
+ const schema = this.table.schema[column];
67847
+ if (!schema) {
67848
+ continue;
67849
+ }
67850
+ body2[key] = this.parse(value, schema);
67851
+ }
67852
+ return body2;
67853
+ }
67854
+ parseFilters(filters) {
67855
+ for (const op of Object.values(BasicOperator)) {
67856
+ const filter = filters[op];
67857
+ if (!filter) {
67858
+ continue;
67859
+ }
67860
+ for (const key of Object.keys(filter)) {
67861
+ if (Array.isArray(filter[key])) {
67862
+ filter[key] = JSON.stringify(filter[key]);
67863
+ continue;
67864
+ }
67865
+ const { column } = this.splitter.run(key);
67866
+ const schema = this.table.schema[column];
67867
+ if (!schema) {
67868
+ continue;
67869
+ }
67870
+ filter[key] = this.parse(filter[key], schema);
67871
+ }
67872
+ }
67873
+ for (const op of Object.values(ArrayOperator)) {
67874
+ const filter = filters[op];
67875
+ if (!filter) {
67876
+ continue;
67877
+ }
67878
+ for (const key of Object.keys(filter)) {
67879
+ const { column } = this.splitter.run(key);
67880
+ const schema = this.table.schema[column];
67881
+ if (!schema) {
67882
+ continue;
67883
+ }
67884
+ filter[key] = filter[key].map((v) => this.parse(v, schema));
67885
+ }
67886
+ }
67887
+ for (const op of Object.values(RangeOperator)) {
67888
+ const filter = filters[op];
67889
+ if (!filter) {
67890
+ continue;
67891
+ }
67892
+ for (const key of Object.keys(filter)) {
67893
+ const { column } = this.splitter.run(key);
67894
+ const schema = this.table.schema[column];
67895
+ if (!schema) {
67896
+ continue;
67897
+ }
67898
+ const value = filter[key];
67899
+ if ("low" in value) {
67900
+ value.low = this.parse(value.low, schema);
67901
+ }
67902
+ if ("high" in value) {
67903
+ value.high = this.parse(value.high, schema);
67904
+ }
67905
+ }
67906
+ }
67907
+ return filters;
67825
67908
  }
67826
67909
  // right now we only do filters on the specific table being queried
67827
- addFilters(query, filters, table, opts) {
67910
+ addFilters(query, filters, opts) {
67828
67911
  if (!filters) {
67829
67912
  return query;
67830
67913
  }
67831
- filters = parseFilters(filters);
67914
+ filters = this.parseFilters(filters);
67915
+ const aliases = this.query.tableAliases;
67832
67916
  const allOr = filters.allOr;
67833
- const sqlStatements = new SqlStatements(this.client, table, {
67834
- allOr,
67835
- columnPrefix: opts.columnPrefix
67836
- });
67837
- const tableName = this.client === "sqlite3" /* SQL_LITE */ ? table._id : table.name;
67917
+ const tableName = this.client === "sqlite3" /* SQL_LITE */ ? this.table._id : this.table.name;
67838
67918
  function getTableAlias(name) {
67839
- const alias = opts.aliases?.[name];
67919
+ const alias = aliases?.[name];
67840
67920
  return alias || name;
67841
67921
  }
67842
67922
  function iterate(structure, fn, complexKeyFn) {
@@ -67853,10 +67933,10 @@ var InternalBuilder = class {
67853
67933
  ),
67854
67934
  castedTypeValue.values
67855
67935
  );
67856
- } else if (!opts.relationship && !isRelationshipField) {
67936
+ } else if (!opts?.relationship && !isRelationshipField) {
67857
67937
  const alias = getTableAlias(tableName);
67858
67938
  fn(alias ? `${alias}.${updatedKey}` : updatedKey, value);
67859
- } else if (opts.relationship && isRelationshipField) {
67939
+ } else if (opts?.relationship && isRelationshipField) {
67860
67940
  const [filterTableName, property] = updatedKey.split(".");
67861
67941
  const alias = getTableAlias(filterTableName);
67862
67942
  fn(alias ? `${alias}.${property}` : property, value);
@@ -67870,10 +67950,9 @@ var InternalBuilder = class {
67870
67950
  query = query[fnc](key, "ilike", `%${value}%`);
67871
67951
  } else {
67872
67952
  const rawFnc = `${fnc}Raw`;
67873
- query = query[rawFnc](
67874
- `LOWER(${quotedIdentifier(this.client, key)}) LIKE ?`,
67875
- [`%${value.toLowerCase()}%`]
67876
- );
67953
+ query = query[rawFnc](`LOWER(${this.quotedIdentifier(key)}) LIKE ?`, [
67954
+ `%${value.toLowerCase()}%`
67955
+ ]);
67877
67956
  }
67878
67957
  };
67879
67958
  const contains = (mode, any = false) => {
@@ -67892,10 +67971,10 @@ var InternalBuilder = class {
67892
67971
  const wrap = any ? "" : "'";
67893
67972
  const op = any ? "\\?| array" : "@>";
67894
67973
  const fieldNames = key.split(/\./g);
67895
- const table2 = fieldNames[0];
67974
+ const table = fieldNames[0];
67896
67975
  const col = fieldNames[1];
67897
67976
  query = query[rawFnc](
67898
- `${not}COALESCE("${table2}"."${col}"::jsonb ${op} ${wrap}${stringifyArray(
67977
+ `${not}COALESCE("${table}"."${col}"::jsonb ${op} ${wrap}${stringifyArray(
67899
67978
  value,
67900
67979
  any ? "'" : '"'
67901
67980
  )}${wrap}, FALSE)`
@@ -67914,21 +67993,26 @@ var InternalBuilder = class {
67914
67993
  const andOr = mode === filters?.containsAny ? " OR " : " AND ";
67915
67994
  iterate(mode, (key, value) => {
67916
67995
  let statement = "";
67996
+ const identifier = this.quotedIdentifier(key);
67917
67997
  for (let i in value) {
67918
67998
  if (typeof value[i] === "string") {
67919
67999
  value[i] = `%"${value[i].toLowerCase()}"%`;
67920
68000
  } else {
67921
68001
  value[i] = `%${value[i]}%`;
67922
68002
  }
67923
- statement += (statement ? andOr : "") + `COALESCE(LOWER(${quotedIdentifier(
67924
- this.client,
67925
- key
67926
- )}), '') LIKE ?`;
68003
+ statement += `${statement ? andOr : ""}COALESCE(LOWER(${identifier}), '') LIKE ?`;
67927
68004
  }
67928
68005
  if (statement === "") {
67929
68006
  return;
67930
68007
  }
67931
- query = query[rawFnc](`${not}(${statement})`, value);
68008
+ if (not) {
68009
+ query = query[rawFnc](
68010
+ `(NOT (${statement}) OR ${identifier} IS NULL)`,
68011
+ value
68012
+ );
68013
+ } else {
68014
+ query = query[rawFnc](statement, value);
68015
+ }
67932
68016
  });
67933
68017
  }
67934
68018
  };
@@ -67937,10 +68021,23 @@ var InternalBuilder = class {
67937
68021
  iterate(
67938
68022
  filters.oneOf,
67939
68023
  (key, array) => {
67940
- query = query[fnc](key, Array.isArray(array) ? array : [array]);
68024
+ if (this.client === "oracledb" /* ORACLE */) {
68025
+ key = this.convertClobs(key);
68026
+ array = Array.isArray(array) ? array : [array];
68027
+ const binding = new Array(array.length).fill("?").join(",");
68028
+ query = query.whereRaw(`${key} IN (${binding})`, array);
68029
+ } else {
68030
+ query = query[fnc](key, Array.isArray(array) ? array : [array]);
68031
+ }
67941
68032
  },
67942
68033
  (key, array) => {
67943
- query = query[fnc](key, Array.isArray(array) ? array : [array]);
68034
+ if (this.client === "oracledb" /* ORACLE */) {
68035
+ const keyStr = `(${key.map((k) => this.convertClobs(k)).join(",")})`;
68036
+ const binding = `(${array.map((a) => `(${new Array(a.length).fill("?").join(",")})`).join(",")})`;
68037
+ query = query.whereRaw(`${keyStr} IN ${binding}`, array.flat());
68038
+ } else {
68039
+ query = query[fnc](key, Array.isArray(array) ? array : [array]);
68040
+ }
67944
68041
  }
67945
68042
  );
67946
68043
  }
@@ -67951,10 +68048,9 @@ var InternalBuilder = class {
67951
68048
  query = query[fnc](key, "ilike", `${value}%`);
67952
68049
  } else {
67953
68050
  const rawFnc = `${fnc}Raw`;
67954
- query = query[rawFnc](
67955
- `LOWER(${quotedIdentifier(this.client, key)}) LIKE ?`,
67956
- [`${value.toLowerCase()}%`]
67957
- );
68051
+ query = query[rawFnc](`LOWER(${this.quotedIdentifier(key)}) LIKE ?`, [
68052
+ `${value.toLowerCase()}%`
68053
+ ]);
67958
68054
  }
67959
68055
  });
67960
68056
  }
@@ -67973,12 +68069,40 @@ var InternalBuilder = class {
67973
68069
  value.high = "";
67974
68070
  }
67975
68071
  const lowValid = isValidFilter(value.low), highValid = isValidFilter(value.high);
68072
+ const schema = this.getFieldSchema(key);
68073
+ if (this.client === "oracledb" /* ORACLE */) {
68074
+ key = this.knex.raw(this.convertClobs(key));
68075
+ }
67976
68076
  if (lowValid && highValid) {
67977
- query = sqlStatements.between(query, key, value.low, value.high);
68077
+ if (schema?.type === "bigint" /* BIGINT */ && this.client === "sqlite3" /* SQL_LITE */) {
68078
+ query = query.whereRaw(
68079
+ `CAST(${key} AS INTEGER) BETWEEN CAST(? AS INTEGER) AND CAST(? AS INTEGER)`,
68080
+ [value.low, value.high]
68081
+ );
68082
+ } else {
68083
+ const fnc = allOr ? "orWhereBetween" : "whereBetween";
68084
+ query = query[fnc](key, [value.low, value.high]);
68085
+ }
67978
68086
  } else if (lowValid) {
67979
- query = sqlStatements.lte(query, key, value.low);
68087
+ if (schema?.type === "bigint" /* BIGINT */ && this.client === "sqlite3" /* SQL_LITE */) {
68088
+ query = query.whereRaw(
68089
+ `CAST(${key} AS INTEGER) >= CAST(? AS INTEGER)`,
68090
+ [value.low]
68091
+ );
68092
+ } else {
68093
+ const fnc = allOr ? "orWhere" : "where";
68094
+ query = query[fnc](key, ">=", value.low);
68095
+ }
67980
68096
  } else if (highValid) {
67981
- query = sqlStatements.gte(query, key, value.high);
68097
+ if (schema?.type === "bigint" /* BIGINT */ && this.client === "sqlite3" /* SQL_LITE */) {
68098
+ query = query.whereRaw(
68099
+ `CAST(${key} AS INTEGER) <= CAST(? AS INTEGER)`,
68100
+ [value.high]
68101
+ );
68102
+ } else {
68103
+ const fnc = allOr ? "orWhere" : "where";
68104
+ query = query[fnc](key, "<=", value.high);
68105
+ }
67982
68106
  }
67983
68107
  });
67984
68108
  }
@@ -67987,20 +68111,18 @@ var InternalBuilder = class {
67987
68111
  const fnc = allOr ? "orWhereRaw" : "whereRaw";
67988
68112
  if (this.client === "mssql" /* MS_SQL */) {
67989
68113
  query = query[fnc](
67990
- `CASE WHEN ${quotedIdentifier(
67991
- this.client,
67992
- key
67993
- )} = ? THEN 1 ELSE 0 END = 1`,
68114
+ `CASE WHEN ${this.quotedIdentifier(key)} = ? THEN 1 ELSE 0 END = 1`,
67994
68115
  [value]
67995
68116
  );
67996
68117
  } else if (this.client === "oracledb" /* ORACLE */) {
68118
+ const identifier = this.convertClobs(key);
67997
68119
  query = query[fnc](
67998
- `COALESCE(${quotedIdentifier(this.client, key)}, -1) = ?`,
68120
+ `(${identifier} IS NOT NULL AND ${identifier} = ?)`,
67999
68121
  [value]
68000
68122
  );
68001
68123
  } else {
68002
68124
  query = query[fnc](
68003
- `COALESCE(${quotedIdentifier(this.client, key)} = ?, FALSE)`,
68125
+ `COALESCE(${this.quotedIdentifier(key)} = ?, FALSE)`,
68004
68126
  [value]
68005
68127
  );
68006
68128
  }
@@ -68011,20 +68133,18 @@ var InternalBuilder = class {
68011
68133
  const fnc = allOr ? "orWhereRaw" : "whereRaw";
68012
68134
  if (this.client === "mssql" /* MS_SQL */) {
68013
68135
  query = query[fnc](
68014
- `CASE WHEN ${quotedIdentifier(
68015
- this.client,
68016
- key
68017
- )} = ? THEN 1 ELSE 0 END = 0`,
68136
+ `CASE WHEN ${this.quotedIdentifier(key)} = ? THEN 1 ELSE 0 END = 0`,
68018
68137
  [value]
68019
68138
  );
68020
68139
  } else if (this.client === "oracledb" /* ORACLE */) {
68140
+ const identifier = this.convertClobs(key);
68021
68141
  query = query[fnc](
68022
- `COALESCE(${quotedIdentifier(this.client, key)}, -1) != ?`,
68142
+ `(${identifier} IS NOT NULL AND ${identifier} != ?) OR ${identifier} IS NULL`,
68023
68143
  [value]
68024
68144
  );
68025
68145
  } else {
68026
68146
  query = query[fnc](
68027
- `COALESCE(${quotedIdentifier(this.client, key)} != ?, TRUE)`,
68147
+ `COALESCE(${this.quotedIdentifier(key)} != ?, TRUE)`,
68028
68148
  [value]
68029
68149
  );
68030
68150
  }
@@ -68051,8 +68171,8 @@ var InternalBuilder = class {
68051
68171
  if (filters.containsAny) {
68052
68172
  contains(filters.containsAny, true);
68053
68173
  }
68054
- const tableRef = opts?.aliases?.[table._id] || table._id;
68055
- if (filters.documentType && !isExternalTable(table) && tableRef) {
68174
+ const tableRef = aliases?.[this.table._id] || this.table._id;
68175
+ if (filters.documentType && !isExternalTable(this.table) && tableRef) {
68056
68176
  query.andWhereLike(
68057
68177
  `${tableRef}._id`,
68058
68178
  `${prefixed(filters.documentType)}%`
@@ -68060,34 +68180,39 @@ var InternalBuilder = class {
68060
68180
  }
68061
68181
  return query;
68062
68182
  }
68063
- addDistinctCount(query, json) {
68064
- const table = json.meta.table;
68065
- const primary = table.primary;
68066
- const aliases = json.tableAliases;
68067
- const aliased = table.name && aliases?.[table.name] ? aliases[table.name] : table.name;
68183
+ addDistinctCount(query) {
68184
+ const primary = this.table.primary;
68185
+ const aliases = this.query.tableAliases;
68186
+ const aliased = this.table.name && aliases?.[this.table.name] ? aliases[this.table.name] : this.table.name;
68068
68187
  if (!primary) {
68069
68188
  throw new Error("SQL counting requires primary key to be supplied");
68070
68189
  }
68071
68190
  return query.countDistinct(`${aliased}.${primary[0]} as total`);
68072
68191
  }
68073
- addSorting(query, json) {
68074
- let { sort: sort2 } = json;
68075
- const table = json.meta.table;
68076
- const primaryKey = table.primary;
68077
- const tableName = getTableName(table);
68078
- const aliases = json.tableAliases;
68079
- const aliased = tableName && aliases?.[tableName] ? aliases[tableName] : table?.name;
68192
+ addSorting(query) {
68193
+ let { sort: sort2 } = this.query;
68194
+ const primaryKey = this.table.primary;
68195
+ const tableName = getTableName(this.table);
68196
+ const aliases = this.query.tableAliases;
68197
+ const aliased = tableName && aliases?.[tableName] ? aliases[tableName] : this.table?.name;
68080
68198
  if (!Array.isArray(primaryKey)) {
68081
68199
  throw new Error("Sorting requires primary key to be specified for table");
68082
68200
  }
68083
68201
  if (sort2 && Object.keys(sort2 || {}).length > 0) {
68084
68202
  for (let [key, value] of Object.entries(sort2)) {
68085
68203
  const direction = value.direction === "ascending" /* ASCENDING */ ? "asc" : "desc";
68086
- let nulls;
68087
- if (this.client === "pg" /* POSTGRES */) {
68204
+ let nulls = void 0;
68205
+ if (this.client === "pg" /* POSTGRES */ || this.client === "oracledb" /* ORACLE */) {
68088
68206
  nulls = value.direction === "ascending" /* ASCENDING */ ? "first" : "last";
68089
68207
  }
68090
- query = query.orderBy(`${aliased}.${key}`, direction, nulls);
68208
+ let composite = `${aliased}.${key}`;
68209
+ if (this.client === "oracledb" /* ORACLE */) {
68210
+ query = query.orderByRaw(
68211
+ `${this.convertClobs(composite)} ${direction} nulls ${nulls}`
68212
+ );
68213
+ } else {
68214
+ query = query.orderBy(composite, direction, nulls);
68215
+ }
68091
68216
  }
68092
68217
  }
68093
68218
  if (!sort2 || sort2[primaryKey[0]] === void 0) {
@@ -68162,23 +68287,41 @@ var InternalBuilder = class {
68162
68287
  }
68163
68288
  return query;
68164
68289
  }
68165
- knexWithAlias(knex3, endpoint, aliases) {
68166
- const tableName = endpoint.entityId;
68167
- const tableAlias = aliases?.[tableName];
68168
- return knex3(
68169
- this.tableNameWithSchema(tableName, {
68170
- alias: tableAlias,
68171
- schema: endpoint.schema
68290
+ qualifiedKnex(opts) {
68291
+ let alias = this.query.tableAliases?.[this.query.endpoint.entityId];
68292
+ if (opts?.alias === false) {
68293
+ alias = void 0;
68294
+ } else if (typeof opts?.alias === "string") {
68295
+ alias = opts.alias;
68296
+ }
68297
+ return this.knex(
68298
+ this.tableNameWithSchema(this.query.endpoint.entityId, {
68299
+ alias,
68300
+ schema: this.query.endpoint.schema
68172
68301
  })
68173
68302
  );
68174
68303
  }
68175
- create(knex3, json, opts) {
68176
- const { endpoint, body: body2 } = json;
68177
- let query = this.knexWithAlias(knex3, endpoint);
68178
- const parsedBody = parseBody(body2);
68179
- for (let [key, value] of Object.entries(parsedBody)) {
68180
- if (value == null) {
68181
- delete parsedBody[key];
68304
+ create(opts) {
68305
+ const { body: body2 } = this.query;
68306
+ let query = this.qualifiedKnex({ alias: false });
68307
+ const parsedBody = this.parseBody(body2);
68308
+ if (this.client === "oracledb" /* ORACLE */) {
68309
+ for (const [column, schema] of Object.entries(
68310
+ this.query.meta.table.schema
68311
+ )) {
68312
+ if (schema.constraints?.presence === true || schema.type === "formula" /* FORMULA */ || schema.type === "auto" /* AUTO */ || schema.type === "link" /* LINK */) {
68313
+ continue;
68314
+ }
68315
+ const value = parsedBody[column];
68316
+ if (value == null) {
68317
+ parsedBody[column] = null;
68318
+ }
68319
+ }
68320
+ } else {
68321
+ for (let [key, value] of Object.entries(parsedBody)) {
68322
+ if (value == null) {
68323
+ delete parsedBody[key];
68324
+ }
68182
68325
  }
68183
68326
  }
68184
68327
  if (opts.disableReturning) {
@@ -68187,40 +68330,40 @@ var InternalBuilder = class {
68187
68330
  return query.insert(parsedBody).returning("*");
68188
68331
  }
68189
68332
  }
68190
- bulkCreate(knex3, json) {
68191
- const { endpoint, body: body2 } = json;
68192
- let query = this.knexWithAlias(knex3, endpoint);
68333
+ bulkCreate() {
68334
+ const { body: body2 } = this.query;
68335
+ let query = this.qualifiedKnex({ alias: false });
68193
68336
  if (!Array.isArray(body2)) {
68194
68337
  return query;
68195
68338
  }
68196
- const parsedBody = body2.map((row) => parseBody(row));
68339
+ const parsedBody = body2.map((row) => this.parseBody(row));
68197
68340
  return query.insert(parsedBody);
68198
68341
  }
68199
- bulkUpsert(knex3, json) {
68200
- const { endpoint, body: body2 } = json;
68201
- let query = this.knexWithAlias(knex3, endpoint);
68342
+ bulkUpsert() {
68343
+ const { body: body2 } = this.query;
68344
+ let query = this.qualifiedKnex({ alias: false });
68202
68345
  if (!Array.isArray(body2)) {
68203
68346
  return query;
68204
68347
  }
68205
- const parsedBody = body2.map((row) => parseBody(row));
68348
+ const parsedBody = body2.map((row) => this.parseBody(row));
68206
68349
  if (this.client === "pg" /* POSTGRES */ || this.client === "sqlite3" /* SQL_LITE */ || this.client === "mysql2" /* MY_SQL */) {
68207
- const primary = json.meta.table.primary;
68350
+ const primary = this.table.primary;
68208
68351
  if (!primary) {
68209
68352
  throw new Error("Primary key is required for upsert");
68210
68353
  }
68211
68354
  const ret = query.insert(parsedBody).onConflict(primary).merge();
68212
68355
  return ret;
68213
- } else if (this.client === "mssql" /* MS_SQL */) {
68356
+ } else if (this.client === "mssql" /* MS_SQL */ || this.client === "oracledb" /* ORACLE */) {
68214
68357
  return query.insert(parsedBody);
68215
68358
  }
68216
68359
  return query.upsert(parsedBody);
68217
68360
  }
68218
- read(knex3, json, opts = {}) {
68219
- let { endpoint, filters, paginate, relationships, tableAliases } = json;
68361
+ read(opts = {}) {
68362
+ let { endpoint, filters, paginate, relationships, tableAliases } = this.query;
68220
68363
  const { limits } = opts;
68221
68364
  const counting = endpoint.operation === "COUNT" /* COUNT */;
68222
68365
  const tableName = endpoint.entityId;
68223
- let query = this.knexWithAlias(knex3, endpoint, tableAliases);
68366
+ let query = this.qualifiedKnex();
68224
68367
  let foundOffset = null;
68225
68368
  let foundLimit = limits?.query || limits?.base;
68226
68369
  if (paginate && paginate.page && paginate.limit) {
@@ -68241,23 +68384,20 @@ var InternalBuilder = class {
68241
68384
  if (foundOffset != null) {
68242
68385
  query = query.offset(foundOffset);
68243
68386
  }
68244
- query = this.addSorting(query, json);
68387
+ query = this.addSorting(query);
68245
68388
  }
68246
- query = this.addFilters(query, filters, json.meta.table, {
68247
- columnPrefix: json.meta.columnPrefix,
68248
- aliases: tableAliases
68249
- });
68389
+ query = this.addFilters(query, filters);
68250
68390
  const alias = tableAliases?.[tableName] || tableName;
68251
- let preQuery = knex3({
68391
+ let preQuery = this.knex({
68252
68392
  // the typescript definition for the knex constructor doesn't support this
68253
68393
  // syntax, but it is the only way to alias a pre-query result as part of
68254
68394
  // a query - there is an alias dictionary type, but it assumes it can only
68255
68395
  // be a table name, not a pre-query
68256
68396
  [alias]: query
68257
68397
  });
68258
- preQuery = !counting ? preQuery.select(generateSelectStatement(json, knex3)) : this.addDistinctCount(preQuery, json);
68398
+ preQuery = !counting ? preQuery.select(this.generateSelectStatement()) : this.addDistinctCount(preQuery);
68259
68399
  if (this.client !== "mssql" /* MS_SQL */ && !counting) {
68260
- preQuery = this.addSorting(preQuery, json);
68400
+ preQuery = this.addSorting(preQuery);
68261
68401
  }
68262
68402
  query = this.addRelationships(
68263
68403
  preQuery,
@@ -68269,43 +68409,33 @@ var InternalBuilder = class {
68269
68409
  if (limits?.base) {
68270
68410
  query = query.limit(limits.base);
68271
68411
  }
68272
- return this.addFilters(query, filters, json.meta.table, {
68273
- columnPrefix: json.meta.columnPrefix,
68274
- relationship: true,
68275
- aliases: tableAliases
68276
- });
68412
+ return this.addFilters(query, filters, { relationship: true });
68277
68413
  }
68278
- update(knex3, json, opts) {
68279
- const { endpoint, body: body2, filters, tableAliases } = json;
68280
- let query = this.knexWithAlias(knex3, endpoint, tableAliases);
68281
- const parsedBody = parseBody(body2);
68282
- query = this.addFilters(query, filters, json.meta.table, {
68283
- columnPrefix: json.meta.columnPrefix,
68284
- aliases: tableAliases
68285
- });
68414
+ update(opts) {
68415
+ const { body: body2, filters } = this.query;
68416
+ let query = this.qualifiedKnex();
68417
+ const parsedBody = this.parseBody(body2);
68418
+ query = this.addFilters(query, filters);
68286
68419
  if (opts.disableReturning) {
68287
68420
  return query.update(parsedBody);
68288
68421
  } else {
68289
68422
  return query.update(parsedBody).returning("*");
68290
68423
  }
68291
68424
  }
68292
- delete(knex3, json, opts) {
68293
- const { endpoint, filters, tableAliases } = json;
68294
- let query = this.knexWithAlias(knex3, endpoint, tableAliases);
68295
- query = this.addFilters(query, filters, json.meta.table, {
68296
- columnPrefix: json.meta.columnPrefix,
68297
- aliases: tableAliases
68298
- });
68425
+ delete(opts) {
68426
+ const { filters } = this.query;
68427
+ let query = this.qualifiedKnex();
68428
+ query = this.addFilters(query, filters);
68299
68429
  if (opts.disableReturning) {
68300
68430
  return query.delete();
68301
68431
  } else {
68302
- return query.delete().returning(generateSelectStatement(json, knex3));
68432
+ return query.delete().returning(this.generateSelectStatement());
68303
68433
  }
68304
68434
  }
68305
68435
  };
68306
68436
  var SqlQueryBuilder = class extends sqlTable_default {
68307
68437
  // pass through client to get flavour of SQL
68308
- constructor(client, limit2 = BASE_LIMIT) {
68438
+ constructor(client, limit2 = getBaseLimit()) {
68309
68439
  super(client);
68310
68440
  this.limit = limit2;
68311
68441
  }
@@ -68332,38 +68462,38 @@ var SqlQueryBuilder = class extends sqlTable_default {
68332
68462
  const config = {
68333
68463
  client: sqlClient
68334
68464
  };
68335
- if (sqlClient === "sqlite3" /* SQL_LITE */) {
68465
+ if (sqlClient === "sqlite3" /* SQL_LITE */ || sqlClient === "oracledb" /* ORACLE */) {
68336
68466
  config.useNullAsDefault = true;
68337
68467
  }
68338
68468
  const client = (0, import_knex2.knex)(config);
68339
68469
  let query;
68340
- const builder = new InternalBuilder(sqlClient);
68470
+ const builder = new InternalBuilder(sqlClient, client, json);
68341
68471
  switch (this._operation(json)) {
68342
68472
  case "CREATE" /* CREATE */:
68343
- query = builder.create(client, json, opts);
68473
+ query = builder.create(opts);
68344
68474
  break;
68345
68475
  case "READ" /* READ */:
68346
- query = builder.read(client, json, {
68476
+ query = builder.read({
68347
68477
  limits: {
68348
68478
  query: this.limit,
68349
- base: BASE_LIMIT
68479
+ base: getBaseLimit()
68350
68480
  }
68351
68481
  });
68352
68482
  break;
68353
68483
  case "COUNT" /* COUNT */:
68354
- query = builder.read(client, json);
68484
+ query = builder.read();
68355
68485
  break;
68356
68486
  case "UPDATE" /* UPDATE */:
68357
- query = builder.update(client, json, opts);
68487
+ query = builder.update(opts);
68358
68488
  break;
68359
68489
  case "DELETE" /* DELETE */:
68360
- query = builder.delete(client, json, opts);
68490
+ query = builder.delete(opts);
68361
68491
  break;
68362
68492
  case "BULK_CREATE" /* BULK_CREATE */:
68363
- query = builder.bulkCreate(client, json);
68493
+ query = builder.bulkCreate();
68364
68494
  break;
68365
68495
  case "BULK_UPSERT" /* BULK_UPSERT */:
68366
- query = builder.bulkUpsert(client, json);
68496
+ query = builder.bulkUpsert();
68367
68497
  break;
68368
68498
  case "CREATE_TABLE" /* CREATE_TABLE */:
68369
68499
  case "UPDATE_TABLE" /* UPDATE_TABLE */: