@budibase/backend-core 2.27.4 → 2.27.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/dist/index.js +1399 -160
  2. package/dist/index.js.map +4 -4
  3. package/dist/index.js.meta.json +1 -1
  4. package/dist/package.json +5 -4
  5. package/dist/plugins.js.meta.json +1 -1
  6. package/dist/src/constants/db.d.ts +6 -0
  7. package/dist/src/constants/db.js +7 -1
  8. package/dist/src/constants/db.js.map +1 -1
  9. package/dist/src/environment.d.ts +2 -0
  10. package/dist/src/environment.js +2 -0
  11. package/dist/src/environment.js.map +1 -1
  12. package/dist/src/index.d.ts +1 -0
  13. package/dist/src/index.js +2 -1
  14. package/dist/src/index.js.map +1 -1
  15. package/dist/src/sql/designDoc.d.ts +2 -0
  16. package/dist/src/sql/designDoc.js +20 -0
  17. package/dist/src/sql/designDoc.js.map +1 -0
  18. package/dist/src/sql/index.d.ts +4 -0
  19. package/dist/src/sql/index.js +36 -0
  20. package/dist/src/sql/index.js.map +1 -0
  21. package/dist/src/sql/sql.d.ts +21 -0
  22. package/dist/src/sql/sql.js +752 -0
  23. package/dist/src/sql/sql.js.map +1 -0
  24. package/dist/src/sql/sqlStatements.d.ts +14 -0
  25. package/dist/src/sql/sqlStatements.js +60 -0
  26. package/dist/src/sql/sqlStatements.js.map +1 -0
  27. package/dist/src/sql/sqlTable.d.ts +13 -0
  28. package/dist/src/sql/sqlTable.js +231 -0
  29. package/dist/src/sql/sqlTable.js.map +1 -0
  30. package/dist/src/sql/utils.d.ts +22 -0
  31. package/dist/src/sql/utils.js +133 -0
  32. package/dist/src/sql/utils.js.map +1 -0
  33. package/dist/tests/core/utilities/mocks/licenses.d.ts +1 -0
  34. package/dist/tests/core/utilities/mocks/licenses.js +5 -1
  35. package/dist/tests/core/utilities/mocks/licenses.js.map +1 -1
  36. package/package.json +5 -4
  37. package/src/constants/db.ts +6 -0
  38. package/src/environment.ts +3 -0
  39. package/src/index.ts +1 -0
  40. package/src/sql/designDoc.ts +17 -0
  41. package/src/sql/index.ts +5 -0
  42. package/src/sql/sql.ts +852 -0
  43. package/src/sql/sqlStatements.ts +79 -0
  44. package/src/sql/sqlTable.ts +289 -0
  45. package/src/sql/utils.ts +134 -0
  46. package/tests/core/utilities/mocks/licenses.ts +4 -0
package/dist/index.js CHANGED
@@ -1045,11 +1045,11 @@ var require_Condition = __commonJS({
1045
1045
  return schema.concat(branch.resolve(options3));
1046
1046
  };
1047
1047
  }
1048
- resolve(base, options2) {
1048
+ resolve(base2, options2) {
1049
1049
  let values2 = this.refs.map((ref) => ref.getValue(options2 == null ? void 0 : options2.value, options2 == null ? void 0 : options2.parent, options2 == null ? void 0 : options2.context));
1050
- let schema = this.fn.apply(base, values2.concat(base, options2));
1051
- if (schema === void 0 || schema === base)
1052
- return base;
1050
+ let schema = this.fn.apply(base2, values2.concat(base2, options2));
1051
+ if (schema === void 0 || schema === base2)
1052
+ return base2;
1053
1053
  if (!(0, _isSchema.default)(schema))
1054
1054
  throw new TypeError("conditions must return a schema object");
1055
1055
  return schema.resolve(options2);
@@ -1439,7 +1439,7 @@ var require_createValidation = __commonJS({
1439
1439
  return target;
1440
1440
  }
1441
1441
  function createValidation(config) {
1442
- function validate3(_ref, cb) {
1442
+ function validate4(_ref, cb) {
1443
1443
  let {
1444
1444
  value,
1445
1445
  path: path3 = "",
@@ -1514,8 +1514,8 @@ var require_createValidation = __commonJS({
1514
1514
  else
1515
1515
  cb(null, result);
1516
1516
  }
1517
- validate3.OPTIONS = config;
1518
- return validate3;
1517
+ validate4.OPTIONS = config;
1518
+ return validate4;
1519
1519
  }
1520
1520
  }
1521
1521
  });
@@ -1759,17 +1759,17 @@ var require_schema = __commonJS({
1759
1759
  return this;
1760
1760
  if (schema.type !== this.type && this.type !== "mixed")
1761
1761
  throw new TypeError(`You cannot \`concat()\` schema's of different types: ${this.type} and ${schema.type}`);
1762
- let base = this;
1762
+ let base2 = this;
1763
1763
  let combined = schema.clone();
1764
- const mergedSpec = _extends({}, base.spec, combined.spec);
1764
+ const mergedSpec = _extends({}, base2.spec, combined.spec);
1765
1765
  combined.spec = mergedSpec;
1766
- combined._typeError || (combined._typeError = base._typeError);
1767
- combined._whitelistError || (combined._whitelistError = base._whitelistError);
1768
- combined._blacklistError || (combined._blacklistError = base._blacklistError);
1769
- combined._whitelist = base._whitelist.merge(schema._whitelist, schema._blacklist);
1770
- combined._blacklist = base._blacklist.merge(schema._blacklist, schema._whitelist);
1771
- combined.tests = base.tests;
1772
- combined.exclusiveTests = base.exclusiveTests;
1766
+ combined._typeError || (combined._typeError = base2._typeError);
1767
+ combined._whitelistError || (combined._whitelistError = base2._whitelistError);
1768
+ combined._blacklistError || (combined._blacklistError = base2._blacklistError);
1769
+ combined._whitelist = base2._whitelist.merge(schema._whitelist, schema._blacklist);
1770
+ combined._blacklist = base2._blacklist.merge(schema._blacklist, schema._whitelist);
1771
+ combined.tests = base2.tests;
1772
+ combined.exclusiveTests = base2.exclusiveTests;
1773
1773
  combined.withMutation((next) => {
1774
1774
  schema.tests.forEach((fn) => {
1775
1775
  next.test(fn.OPTIONS);
@@ -2024,7 +2024,7 @@ attempted value: ${formattedValue}
2024
2024
  if (typeof opts.test !== "function")
2025
2025
  throw new TypeError("`test` is a required parameters");
2026
2026
  let next = this.clone();
2027
- let validate3 = (0, _createValidation.default)(opts);
2027
+ let validate4 = (0, _createValidation.default)(opts);
2028
2028
  let isExclusive = opts.exclusive || opts.name && next.exclusiveTests[opts.name] === true;
2029
2029
  if (opts.exclusive) {
2030
2030
  if (!opts.name)
@@ -2036,12 +2036,12 @@ attempted value: ${formattedValue}
2036
2036
  if (fn.OPTIONS.name === opts.name) {
2037
2037
  if (isExclusive)
2038
2038
  return false;
2039
- if (fn.OPTIONS.test === validate3.OPTIONS.test)
2039
+ if (fn.OPTIONS.test === validate4.OPTIONS.test)
2040
2040
  return false;
2041
2041
  }
2042
2042
  return true;
2043
2043
  });
2044
- next.tests.push(validate3);
2044
+ next.tests.push(validate4);
2045
2045
  return next;
2046
2046
  }
2047
2047
  when(keys2, options2) {
@@ -3145,9 +3145,9 @@ var require_object = __commonJS({
3145
3145
  return this.transformKeys((key) => (0, _snakeCase.default)(key).toUpperCase());
3146
3146
  }
3147
3147
  describe() {
3148
- let base = super.describe();
3149
- base.fields = (0, _mapValues.default)(this.fields, (value) => value.describe());
3150
- return base;
3148
+ let base2 = super.describe();
3149
+ base2.fields = (0, _mapValues.default)(this.fields, (value) => value.describe());
3150
+ return base2;
3151
3151
  }
3152
3152
  };
3153
3153
  exports.default = ObjectSchema;
@@ -3354,10 +3354,10 @@ var require_array = __commonJS({
3354
3354
  return this.transform((values2) => values2 != null ? values2.filter(reject) : values2);
3355
3355
  }
3356
3356
  describe() {
3357
- let base = super.describe();
3357
+ let base2 = super.describe();
3358
3358
  if (this.innerType)
3359
- base.innerType = this.innerType.describe();
3360
- return base;
3359
+ base2.innerType = this.innerType.describe();
3360
+ return base2;
3361
3361
  }
3362
3362
  nullable(isNullable = true) {
3363
3363
  return super.nullable(isNullable);
@@ -15440,7 +15440,7 @@ var require_cookie = __commonJS({
15440
15440
  c.value = cookieValue;
15441
15441
  return c;
15442
15442
  }
15443
- function parse(str, options2) {
15443
+ function parse2(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 = parse;
15625
+ Cookie2.parse = parse2;
15626
15626
  Cookie2.fromJSON = fromJSON;
15627
15627
  Cookie2.prototype.key = "";
15628
15628
  Cookie2.prototype.value = "";
@@ -15685,7 +15685,7 @@ var require_cookie = __commonJS({
15685
15685
  Cookie2.prototype.clone = function() {
15686
15686
  return fromJSON(this.toJSON());
15687
15687
  };
15688
- Cookie2.prototype.validate = function validate3() {
15688
+ Cookie2.prototype.validate = function validate4() {
15689
15689
  if (!COOKIE_OCTETS.test(this.value)) {
15690
15690
  return false;
15691
15691
  }
@@ -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 = parse;
16182
+ exports.parse = parse2;
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 parse = require("url").parse;
16384
+ var parse2 = 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 = parse(resource, true), path3 = url.pathname, buf = [];
16450
+ var url = parse2(resource, true), path3 = url.pathname, buf = [];
16451
16451
  Object.keys(url.query).forEach(function(key) {
16452
16452
  if (!~keys2.indexOf(key))
16453
16453
  return;
@@ -29966,7 +29966,7 @@ var require_validate = __commonJS({
29966
29966
  root.jsonSchema = factory();
29967
29967
  }
29968
29968
  })(exports, function() {
29969
- var exports2 = validate3;
29969
+ var exports2 = validate4;
29970
29970
  exports2.Integer = { type: "integer" };
29971
29971
  var primitiveConstructors = {
29972
29972
  String,
@@ -29976,15 +29976,15 @@ var require_validate = __commonJS({
29976
29976
  Array,
29977
29977
  Date
29978
29978
  };
29979
- exports2.validate = validate3;
29980
- function validate3(instance, schema) {
29981
- return validate3(instance, schema, { changing: false });
29979
+ exports2.validate = validate4;
29980
+ function validate4(instance, schema) {
29981
+ return validate4(instance, schema, { changing: false });
29982
29982
  }
29983
29983
  ;
29984
29984
  exports2.checkPropertyChange = function(value, schema, property) {
29985
- return validate3(value, schema, { changing: property || "property" });
29985
+ return validate4(value, schema, { changing: property || "property" });
29986
29986
  };
29987
- var validate3 = exports2._validate = function(instance, schema, options2) {
29987
+ var validate4 = exports2._validate = function(instance, schema, options2) {
29988
29988
  if (!options2)
29989
29989
  options2 = {};
29990
29990
  var _changing = options2.changing;
@@ -30460,7 +30460,7 @@ var require_jsprim = __commonJS({
30460
30460
  }
30461
30461
  var c;
30462
30462
  var pbase = -1;
30463
- var base = options2.base;
30463
+ var base2 = options2.base;
30464
30464
  var start2;
30465
30465
  var mult = 1;
30466
30466
  var value = 0;
@@ -30482,19 +30482,19 @@ var require_jsprim = __commonJS({
30482
30482
  if (str[idx] === "0") {
30483
30483
  if (options2.allowPrefix) {
30484
30484
  pbase = prefixToBase(str.charCodeAt(idx + 1));
30485
- if (pbase !== -1 && (!baseOverride || pbase === base)) {
30486
- base = pbase;
30485
+ if (pbase !== -1 && (!baseOverride || pbase === base2)) {
30486
+ base2 = pbase;
30487
30487
  idx += 2;
30488
30488
  }
30489
30489
  }
30490
30490
  if (pbase === -1 && options2.leadingZeroIsOctal) {
30491
- base = 8;
30491
+ base2 = 8;
30492
30492
  }
30493
30493
  }
30494
30494
  for (start2 = idx; idx < len; ++idx) {
30495
30495
  c = translateDigit(str.charCodeAt(idx));
30496
- if (c !== -1 && c < base) {
30497
- value *= base;
30496
+ if (c !== -1 && c < base2) {
30497
+ value *= base2;
30498
30498
  value += c;
30499
30499
  } else {
30500
30500
  break;
@@ -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 parse = require_parse();
41277
+ var parse2 = require_parse();
41278
41278
  var formats2 = require_formats();
41279
41279
  module2.exports = {
41280
41280
  formats: formats2,
41281
- parse,
41281
+ parse: parse2,
41282
41282
  stringify
41283
41283
  };
41284
41284
  }
@@ -41444,7 +41444,7 @@ var require_uri_all = __commonJS({
41444
41444
  }
41445
41445
  };
41446
41446
  var maxInt = 2147483647;
41447
- var base = 36;
41447
+ var base2 = 36;
41448
41448
  var tMin = 1;
41449
41449
  var tMax = 26;
41450
41450
  var skew = 38;
@@ -41460,7 +41460,7 @@ var require_uri_all = __commonJS({
41460
41460
  "not-basic": "Illegal input >= 0x80 (not a basic code point)",
41461
41461
  "invalid-input": "Invalid input"
41462
41462
  };
41463
- var baseMinusTMin = base - tMin;
41463
+ var baseMinusTMin = base2 - tMin;
41464
41464
  var floor = Math.floor;
41465
41465
  var stringFromCharCode = String.fromCharCode;
41466
41466
  function error$1(type) {
@@ -41519,7 +41519,7 @@ var require_uri_all = __commonJS({
41519
41519
  if (codePoint - 97 < 26) {
41520
41520
  return codePoint - 97;
41521
41521
  }
41522
- return base;
41522
+ return base2;
41523
41523
  };
41524
41524
  var digitToBasic = function digitToBasic2(digit, flag) {
41525
41525
  return digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5);
@@ -41532,7 +41532,7 @@ var require_uri_all = __commonJS({
41532
41532
  ;
41533
41533
  /* no initialization */
41534
41534
  delta > baseMinusTMin * tMax >> 1;
41535
- k += base
41535
+ k += base2
41536
41536
  ) {
41537
41537
  delta = floor(delta / baseMinusTMin);
41538
41538
  }
@@ -41557,16 +41557,16 @@ var require_uri_all = __commonJS({
41557
41557
  for (var index2 = basic > 0 ? basic + 1 : 0; index2 < inputLength; ) {
41558
41558
  var oldi = i;
41559
41559
  for (
41560
- var w = 1, k = base;
41560
+ var w = 1, k = base2;
41561
41561
  ;
41562
41562
  /* no condition */
41563
- k += base
41563
+ k += base2
41564
41564
  ) {
41565
41565
  if (index2 >= inputLength) {
41566
41566
  error$1("invalid-input");
41567
41567
  }
41568
41568
  var digit = basicToDigit(input.charCodeAt(index2++));
41569
- if (digit >= base || digit > floor((maxInt - i) / w)) {
41569
+ if (digit >= base2 || digit > floor((maxInt - i) / w)) {
41570
41570
  error$1("overflow");
41571
41571
  }
41572
41572
  i += digit * w;
@@ -41574,7 +41574,7 @@ var require_uri_all = __commonJS({
41574
41574
  if (digit < t) {
41575
41575
  break;
41576
41576
  }
41577
- var baseMinusT = base - t;
41577
+ var baseMinusT = base2 - t;
41578
41578
  if (w > floor(maxInt / baseMinusT)) {
41579
41579
  error$1("overflow");
41580
41580
  }
@@ -41671,17 +41671,17 @@ var require_uri_all = __commonJS({
41671
41671
  if (_currentValue == n) {
41672
41672
  var q2 = delta;
41673
41673
  for (
41674
- var k = base;
41674
+ var k = base2;
41675
41675
  ;
41676
41676
  /* no condition */
41677
- k += base
41677
+ k += base2
41678
41678
  ) {
41679
41679
  var t = k <= bias ? tMin : k >= bias + tMax ? tMax : k - bias;
41680
41680
  if (q2 < t) {
41681
41681
  break;
41682
41682
  }
41683
41683
  var qMinusT = q2 - t;
41684
- var baseMinusT = base - t;
41684
+ var baseMinusT = base2 - t;
41685
41685
  output.push(stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0)));
41686
41686
  q2 = floor(qMinusT / baseMinusT);
41687
41687
  }
@@ -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 parse(uriString) {
41873
+ function parse2(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;
@@ -42036,13 +42036,13 @@ var require_uri_all = __commonJS({
42036
42036
  }
42037
42037
  return uriTokens.join("");
42038
42038
  }
42039
- function resolveComponents(base2, relative) {
42039
+ function resolveComponents(base3, relative) {
42040
42040
  var options2 = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : {};
42041
42041
  var skipNormalization = arguments[3];
42042
42042
  var target = {};
42043
42043
  if (!skipNormalization) {
42044
- base2 = parse(serialize(base2, options2), options2);
42045
- relative = parse(serialize(relative, options2), options2);
42044
+ base3 = parse2(serialize(base3, options2), options2);
42045
+ relative = parse2(serialize(relative, options2), options2);
42046
42046
  }
42047
42047
  options2 = options2 || {};
42048
42048
  if (!options2.tolerant && relative.scheme) {
@@ -42061,56 +42061,56 @@ var require_uri_all = __commonJS({
42061
42061
  target.query = relative.query;
42062
42062
  } else {
42063
42063
  if (!relative.path) {
42064
- target.path = base2.path;
42064
+ target.path = base3.path;
42065
42065
  if (relative.query !== void 0) {
42066
42066
  target.query = relative.query;
42067
42067
  } else {
42068
- target.query = base2.query;
42068
+ target.query = base3.query;
42069
42069
  }
42070
42070
  } else {
42071
42071
  if (relative.path.charAt(0) === "/") {
42072
42072
  target.path = removeDotSegments(relative.path);
42073
42073
  } else {
42074
- if ((base2.userinfo !== void 0 || base2.host !== void 0 || base2.port !== void 0) && !base2.path) {
42074
+ if ((base3.userinfo !== void 0 || base3.host !== void 0 || base3.port !== void 0) && !base3.path) {
42075
42075
  target.path = "/" + relative.path;
42076
- } else if (!base2.path) {
42076
+ } else if (!base3.path) {
42077
42077
  target.path = relative.path;
42078
42078
  } else {
42079
- target.path = base2.path.slice(0, base2.path.lastIndexOf("/") + 1) + relative.path;
42079
+ target.path = base3.path.slice(0, base3.path.lastIndexOf("/") + 1) + relative.path;
42080
42080
  }
42081
42081
  target.path = removeDotSegments(target.path);
42082
42082
  }
42083
42083
  target.query = relative.query;
42084
42084
  }
42085
- target.userinfo = base2.userinfo;
42086
- target.host = base2.host;
42087
- target.port = base2.port;
42085
+ target.userinfo = base3.userinfo;
42086
+ target.host = base3.host;
42087
+ target.port = base3.port;
42088
42088
  }
42089
- target.scheme = base2.scheme;
42089
+ target.scheme = base3.scheme;
42090
42090
  }
42091
42091
  target.fragment = relative.fragment;
42092
42092
  return target;
42093
42093
  }
42094
42094
  function resolve(baseURI, relativeURI, options2) {
42095
42095
  var schemelessOptions = assign({ scheme: "null" }, options2);
42096
- return serialize(resolveComponents(parse(baseURI, schemelessOptions), parse(relativeURI, schemelessOptions), schemelessOptions, true), schemelessOptions);
42096
+ return serialize(resolveComponents(parse2(baseURI, schemelessOptions), parse2(relativeURI, schemelessOptions), schemelessOptions, true), schemelessOptions);
42097
42097
  }
42098
42098
  function normalize(uri, options2) {
42099
42099
  if (typeof uri === "string") {
42100
- uri = serialize(parse(uri, options2), options2);
42100
+ uri = serialize(parse2(uri, options2), options2);
42101
42101
  } else if (typeOf(uri) === "object") {
42102
- uri = parse(serialize(uri, options2), options2);
42102
+ uri = parse2(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(parse(uriA, options2), options2);
42108
+ uriA = serialize(parse2(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(parse(uriB, options2), options2);
42113
+ uriB = serialize(parse2(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 parse2(components, options2) {
42128
+ parse: function parse3(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 parse2(components, options2) {
42157
+ parse: function parse3(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 parse2(urnComponents, options2) {
42333
+ parse: function parse3(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 = parse;
42358
+ exports2.parse = parse2;
42359
42359
  exports2.removeDotSegments = removeDotSegments;
42360
42360
  exports2.serialize = serialize;
42361
42361
  exports2.resolveComponents = resolveComponents;
@@ -43588,9 +43588,9 @@ var require_compile = __commonJS({
43588
43588
  endCompiling.call(this, schema, root, baseId);
43589
43589
  }
43590
43590
  function callValidate() {
43591
- var validate3 = compilation.validate;
43592
- var result = validate3.apply(this, arguments);
43593
- callValidate.errors = validate3.errors;
43591
+ var validate4 = compilation.validate;
43592
+ var result = validate4.apply(this, arguments);
43593
+ callValidate.errors = validate4.errors;
43594
43594
  return result;
43595
43595
  }
43596
43596
  function localCompile(_schema, _root, localRefs2, baseId2) {
@@ -43624,7 +43624,7 @@ var require_compile = __commonJS({
43624
43624
  sourceCode = vars(refVal, refValCode) + vars(patterns, patternCode) + vars(defaults, defaultCode) + vars(customRules, customRuleCode) + sourceCode;
43625
43625
  if (opts.processCode)
43626
43626
  sourceCode = opts.processCode(sourceCode, _schema);
43627
- var validate3;
43627
+ var validate4;
43628
43628
  try {
43629
43629
  var makeValidate = new Function(
43630
43630
  "self",
@@ -43639,7 +43639,7 @@ var require_compile = __commonJS({
43639
43639
  "ValidationError",
43640
43640
  sourceCode
43641
43641
  );
43642
- validate3 = makeValidate(
43642
+ validate4 = makeValidate(
43643
43643
  self2,
43644
43644
  RULES,
43645
43645
  formats2,
@@ -43651,26 +43651,26 @@ var require_compile = __commonJS({
43651
43651
  ucs2length,
43652
43652
  ValidationError
43653
43653
  );
43654
- refVal[0] = validate3;
43654
+ refVal[0] = validate4;
43655
43655
  } catch (e) {
43656
43656
  self2.logger.error("Error compiling schema, function code:", sourceCode);
43657
43657
  throw e;
43658
43658
  }
43659
- validate3.schema = _schema;
43660
- validate3.errors = null;
43661
- validate3.refs = refs;
43662
- validate3.refVal = refVal;
43663
- validate3.root = isRoot ? validate3 : _root;
43659
+ validate4.schema = _schema;
43660
+ validate4.errors = null;
43661
+ validate4.refs = refs;
43662
+ validate4.refVal = refVal;
43663
+ validate4.root = isRoot ? validate4 : _root;
43664
43664
  if ($async)
43665
- validate3.$async = true;
43665
+ validate4.$async = true;
43666
43666
  if (opts.sourceCode === true) {
43667
- validate3.source = {
43667
+ validate4.source = {
43668
43668
  code: sourceCode,
43669
43669
  patterns,
43670
43670
  defaults
43671
43671
  };
43672
43672
  }
43673
- return validate3;
43673
+ return validate4;
43674
43674
  }
43675
43675
  function resolveRef(baseId2, ref, isRoot) {
43676
43676
  ref = resolve.url(baseId2, ref);
@@ -43767,27 +43767,27 @@ var require_compile = __commonJS({
43767
43767
  }
43768
43768
  }
43769
43769
  var compile2 = rule.definition.compile, inline = rule.definition.inline, macro = rule.definition.macro;
43770
- var validate3;
43770
+ var validate4;
43771
43771
  if (compile2) {
43772
- validate3 = compile2.call(self2, schema2, parentSchema, it);
43772
+ validate4 = compile2.call(self2, schema2, parentSchema, it);
43773
43773
  } else if (macro) {
43774
- validate3 = macro.call(self2, schema2, parentSchema, it);
43774
+ validate4 = macro.call(self2, schema2, parentSchema, it);
43775
43775
  if (opts.validateSchema !== false)
43776
- self2.validateSchema(validate3, true);
43776
+ self2.validateSchema(validate4, true);
43777
43777
  } else if (inline) {
43778
- validate3 = inline.call(self2, it, rule.keyword, schema2, parentSchema);
43778
+ validate4 = inline.call(self2, it, rule.keyword, schema2, parentSchema);
43779
43779
  } else {
43780
- validate3 = rule.definition.validate;
43781
- if (!validate3)
43780
+ validate4 = rule.definition.validate;
43781
+ if (!validate4)
43782
43782
  return;
43783
43783
  }
43784
- if (validate3 === void 0)
43784
+ if (validate4 === void 0)
43785
43785
  throw new Error('custom keyword "' + rule.keyword + '"failed to compile');
43786
43786
  var index2 = customRules.length;
43787
- customRules[index2] = validate3;
43787
+ customRules[index2] = validate4;
43788
43788
  return {
43789
43789
  code: "customRule" + index2,
43790
- validate: validate3
43790
+ validate: validate4
43791
43791
  };
43792
43792
  }
43793
43793
  }
@@ -47338,7 +47338,7 @@ var require_ajv = __commonJS({
47338
47338
  var $dataMetaSchema = require_data();
47339
47339
  var util = require_util2();
47340
47340
  module2.exports = Ajv;
47341
- Ajv.prototype.validate = validate3;
47341
+ Ajv.prototype.validate = validate4;
47342
47342
  Ajv.prototype.compile = compile;
47343
47343
  Ajv.prototype.addSchema = addSchema;
47344
47344
  Ajv.prototype.addMetaSchema = addMetaSchema;
@@ -47393,7 +47393,7 @@ var require_ajv = __commonJS({
47393
47393
  this.addKeyword("nullable", { metaSchema: { type: "boolean" } });
47394
47394
  addInitialSchemas(this);
47395
47395
  }
47396
- function validate3(schemaKeyRef, data) {
47396
+ function validate4(schemaKeyRef, data) {
47397
47397
  var v;
47398
47398
  if (typeof schemaKeyRef == "string") {
47399
47399
  v = this.getSchema(schemaKeyRef);
@@ -48611,68 +48611,68 @@ var require_promise = __commonJS({
48611
48611
  ajv2.addSchema(schemas);
48612
48612
  return ajv2;
48613
48613
  }
48614
- function validate3(name, data) {
48614
+ function validate4(name, data) {
48615
48615
  data = data || {};
48616
48616
  ajv = ajv || createAjvInstance();
48617
- var validate4 = ajv.getSchema(name + ".json");
48617
+ var validate5 = ajv.getSchema(name + ".json");
48618
48618
  return new Promise(function(resolve, reject) {
48619
- var valid = validate4(data);
48620
- !valid ? reject(new HARError(validate4.errors)) : resolve(data);
48619
+ var valid = validate5(data);
48620
+ !valid ? reject(new HARError(validate5.errors)) : resolve(data);
48621
48621
  });
48622
48622
  }
48623
48623
  exports.afterRequest = function(data) {
48624
- return validate3("afterRequest", data);
48624
+ return validate4("afterRequest", data);
48625
48625
  };
48626
48626
  exports.beforeRequest = function(data) {
48627
- return validate3("beforeRequest", data);
48627
+ return validate4("beforeRequest", data);
48628
48628
  };
48629
48629
  exports.browser = function(data) {
48630
- return validate3("browser", data);
48630
+ return validate4("browser", data);
48631
48631
  };
48632
48632
  exports.cache = function(data) {
48633
- return validate3("cache", data);
48633
+ return validate4("cache", data);
48634
48634
  };
48635
48635
  exports.content = function(data) {
48636
- return validate3("content", data);
48636
+ return validate4("content", data);
48637
48637
  };
48638
48638
  exports.cookie = function(data) {
48639
- return validate3("cookie", data);
48639
+ return validate4("cookie", data);
48640
48640
  };
48641
48641
  exports.creator = function(data) {
48642
- return validate3("creator", data);
48642
+ return validate4("creator", data);
48643
48643
  };
48644
48644
  exports.entry = function(data) {
48645
- return validate3("entry", data);
48645
+ return validate4("entry", data);
48646
48646
  };
48647
48647
  exports.har = function(data) {
48648
- return validate3("har", data);
48648
+ return validate4("har", data);
48649
48649
  };
48650
48650
  exports.header = function(data) {
48651
- return validate3("header", data);
48651
+ return validate4("header", data);
48652
48652
  };
48653
48653
  exports.log = function(data) {
48654
- return validate3("log", data);
48654
+ return validate4("log", data);
48655
48655
  };
48656
48656
  exports.page = function(data) {
48657
- return validate3("page", data);
48657
+ return validate4("page", data);
48658
48658
  };
48659
48659
  exports.pageTimings = function(data) {
48660
- return validate3("pageTimings", data);
48660
+ return validate4("pageTimings", data);
48661
48661
  };
48662
48662
  exports.postData = function(data) {
48663
- return validate3("postData", data);
48663
+ return validate4("postData", data);
48664
48664
  };
48665
48665
  exports.query = function(data) {
48666
- return validate3("query", data);
48666
+ return validate4("query", data);
48667
48667
  };
48668
48668
  exports.request = function(data) {
48669
- return validate3("request", data);
48669
+ return validate4("request", data);
48670
48670
  };
48671
48671
  exports.response = function(data) {
48672
- return validate3("response", data);
48672
+ return validate4("response", data);
48673
48673
  };
48674
48674
  exports.timings = function(data) {
48675
- return validate3("timings", data);
48675
+ return validate4("timings", data);
48676
48676
  };
48677
48677
  }
48678
48678
  });
@@ -48683,7 +48683,7 @@ var require_har2 = __commonJS({
48683
48683
  "use strict";
48684
48684
  var fs5 = require("fs");
48685
48685
  var qs2 = require("querystring");
48686
- var validate3 = require_promise();
48686
+ var validate4 = require_promise();
48687
48687
  var extend = require_extend();
48688
48688
  function Har(request) {
48689
48689
  this.request = request;
@@ -48780,7 +48780,7 @@ var require_har2 = __commonJS({
48780
48780
  har.bodySize = 0;
48781
48781
  har.headersSize = 0;
48782
48782
  har.postData.size = 0;
48783
- if (!validate3.request(har)) {
48783
+ if (!validate4.request(har)) {
48784
48784
  return options2;
48785
48785
  }
48786
48786
  var req = this.prep(har);
@@ -49012,33 +49012,33 @@ var require_oauth_sign = __commonJS({
49012
49012
  }).map(function(p) {
49013
49013
  return p.join("=");
49014
49014
  }).join("&");
49015
- var base = [
49015
+ var base2 = [
49016
49016
  rfc3986(httpMethod ? httpMethod.toUpperCase() : "GET"),
49017
49017
  rfc3986(base_uri),
49018
49018
  rfc3986(normalized)
49019
49019
  ].join("&");
49020
- return base;
49020
+ return base2;
49021
49021
  }
49022
49022
  function hmacsign(httpMethod, base_uri, params2, consumer_secret, token_secret) {
49023
- var base = generateBase(httpMethod, base_uri, params2);
49023
+ var base2 = generateBase(httpMethod, base_uri, params2);
49024
49024
  var key = [
49025
49025
  consumer_secret || "",
49026
49026
  token_secret || ""
49027
49027
  ].map(rfc3986).join("&");
49028
- return sha(key, base, "sha1");
49028
+ return sha(key, base2, "sha1");
49029
49029
  }
49030
49030
  function hmacsign256(httpMethod, base_uri, params2, consumer_secret, token_secret) {
49031
- var base = generateBase(httpMethod, base_uri, params2);
49031
+ var base2 = generateBase(httpMethod, base_uri, params2);
49032
49032
  var key = [
49033
49033
  consumer_secret || "",
49034
49034
  token_secret || ""
49035
49035
  ].map(rfc3986).join("&");
49036
- return sha(key, base, "sha256");
49036
+ return sha(key, base2, "sha256");
49037
49037
  }
49038
49038
  function rsasign(httpMethod, base_uri, params2, private_key, token_secret) {
49039
- var base = generateBase(httpMethod, base_uri, params2);
49039
+ var base2 = generateBase(httpMethod, base_uri, params2);
49040
49040
  var key = private_key || "";
49041
- return rsa(key, base);
49041
+ return rsa(key, base2);
49042
49042
  }
49043
49043
  function plaintext(consumer_secret, token_secret) {
49044
49044
  var key = [
@@ -50836,16 +50836,16 @@ var require_request2 = __commonJS({
50836
50836
  };
50837
50837
  Request.prototype.qs = function(q2, clobber) {
50838
50838
  var self2 = this;
50839
- var base;
50839
+ var base2;
50840
50840
  if (!clobber && self2.uri.query) {
50841
- base = self2._qs.parse(self2.uri.query);
50841
+ base2 = self2._qs.parse(self2.uri.query);
50842
50842
  } else {
50843
- base = {};
50843
+ base2 = {};
50844
50844
  }
50845
50845
  for (var i in q2) {
50846
- base[i] = q2[i];
50846
+ base2[i] = q2[i];
50847
50847
  }
50848
- var qs2 = self2._qs.stringify(base);
50848
+ var qs2 = self2._qs.stringify(base2);
50849
50849
  if (qs2 === "") {
50850
50850
  return self2;
50851
50851
  }
@@ -54139,6 +54139,11 @@ __export(src_exports, {
54139
54139
  BudibaseError: () => BudibaseError,
54140
54140
  Config: () => Config,
54141
54141
  Cookie: () => Cookie,
54142
+ DEFAULT_BB_DATASOURCE_ID: () => DEFAULT_BB_DATASOURCE_ID,
54143
+ DEFAULT_EMPLOYEE_TABLE_ID: () => DEFAULT_EMPLOYEE_TABLE_ID,
54144
+ DEFAULT_EXPENSES_TABLE_ID: () => DEFAULT_EXPENSES_TABLE_ID,
54145
+ DEFAULT_INVENTORY_TABLE_ID: () => DEFAULT_INVENTORY_TABLE_ID,
54146
+ DEFAULT_JOBS_TABLE_ID: () => DEFAULT_JOBS_TABLE_ID,
54142
54147
  DEFAULT_TENANT_ID: () => DEFAULT_TENANT_ID,
54143
54148
  DeprecatedViews: () => DeprecatedViews,
54144
54149
  DocumentType: () => DocumentType,
@@ -54158,6 +54163,7 @@ __export(src_exports, {
54158
54163
  RedisClient: () => redis_default,
54159
54164
  SEPARATOR: () => SEPARATOR,
54160
54165
  SQLITE_DESIGN_DOC_ID: () => SQLITE_DESIGN_DOC_ID,
54166
+ SQS_DATASOURCE_INTERNAL: () => SQS_DATASOURCE_INTERNAL,
54161
54167
  StaticDatabases: () => StaticDatabases,
54162
54168
  UNICODE_MAX: () => UNICODE_MAX,
54163
54169
  UsageLimitError: () => UsageLimitError,
@@ -54195,6 +54201,7 @@ __export(src_exports, {
54195
54201
  roles: () => roles_exports,
54196
54202
  security: () => security_exports,
54197
54203
  sessions: () => sessions_exports,
54204
+ sql: () => sql_exports,
54198
54205
  tenancy: () => tenancy,
54199
54206
  timers: () => timers_exports,
54200
54207
  userUtils: () => utils_exports4,
@@ -54563,6 +54570,19 @@ var AutomationStepIdArray = [
54563
54570
  ...Object.values(AutomationTriggerStepId)
54564
54571
  ];
54565
54572
 
54573
+ // ../types/src/documents/app/table/table.ts
54574
+ var INTERNAL_TABLE_SOURCE_ID = "bb_internal";
54575
+
54576
+ // ../types/src/documents/app/row.ts
54577
+ var JsonTypes = [
54578
+ "attachment_single" /* ATTACHMENT_SINGLE */,
54579
+ "attachment" /* ATTACHMENTS */,
54580
+ // only BB_REFERENCE is JSON, it's an array, BB_REFERENCE_SINGLE is a string type
54581
+ "bb_reference" /* BB_REFERENCE */,
54582
+ "json" /* JSON */,
54583
+ "array" /* ARRAY */
54584
+ ];
54585
+
54566
54586
  // ../types/src/documents/document.ts
54567
54587
  var SEPARATOR = "_";
54568
54588
  var UNICODE_MAX = "\uFFF0";
@@ -54645,6 +54665,11 @@ __export(constants_exports2, {
54645
54665
  BUDIBASE_DATASOURCE_TYPE: () => BUDIBASE_DATASOURCE_TYPE,
54646
54666
  Config: () => Config,
54647
54667
  Cookie: () => Cookie,
54668
+ DEFAULT_BB_DATASOURCE_ID: () => DEFAULT_BB_DATASOURCE_ID,
54669
+ DEFAULT_EMPLOYEE_TABLE_ID: () => DEFAULT_EMPLOYEE_TABLE_ID,
54670
+ DEFAULT_EXPENSES_TABLE_ID: () => DEFAULT_EXPENSES_TABLE_ID,
54671
+ DEFAULT_INVENTORY_TABLE_ID: () => DEFAULT_INVENTORY_TABLE_ID,
54672
+ DEFAULT_JOBS_TABLE_ID: () => DEFAULT_JOBS_TABLE_ID,
54648
54673
  DEFAULT_TENANT_ID: () => DEFAULT_TENANT_ID,
54649
54674
  DeprecatedViews: () => DeprecatedViews,
54650
54675
  DocumentType: () => DocumentType,
@@ -54655,6 +54680,7 @@ __export(constants_exports2, {
54655
54680
  MIN_VALID_DATE: () => MIN_VALID_DATE,
54656
54681
  SEPARATOR: () => SEPARATOR,
54657
54682
  SQLITE_DESIGN_DOC_ID: () => SQLITE_DESIGN_DOC_ID,
54683
+ SQS_DATASOURCE_INTERNAL: () => SQS_DATASOURCE_INTERNAL,
54658
54684
  StaticDatabases: () => StaticDatabases,
54659
54685
  UNICODE_MAX: () => UNICODE_MAX,
54660
54686
  UserStatus: () => UserStatus,
@@ -54715,8 +54741,14 @@ var StaticDatabases = {
54715
54741
  var APP_PREFIX = prefixed("app" /* APP */);
54716
54742
  var APP_DEV = prefixed("app_dev" /* APP_DEV */);
54717
54743
  var APP_DEV_PREFIX = APP_DEV;
54744
+ var SQS_DATASOURCE_INTERNAL = "internal";
54718
54745
  var BUDIBASE_DATASOURCE_TYPE = "budibase";
54719
54746
  var SQLITE_DESIGN_DOC_ID = "_design/sqlite";
54747
+ var DEFAULT_JOBS_TABLE_ID = "ta_bb_jobs";
54748
+ var DEFAULT_INVENTORY_TABLE_ID = "ta_bb_inventory";
54749
+ var DEFAULT_EXPENSES_TABLE_ID = "ta_bb_expenses";
54750
+ var DEFAULT_EMPLOYEE_TABLE_ID = "ta_bb_employee";
54751
+ var DEFAULT_BB_DATASOURCE_ID = "datasource_internal_bb_default";
54720
54752
 
54721
54753
  // ../shared-core/src/constants/api.ts
54722
54754
  var Header = /* @__PURE__ */ ((Header2) => {
@@ -54854,6 +54886,19 @@ __export(filters_exports, {
54854
54886
  });
54855
54887
  var import_dayjs = __toESM(require_dayjs_min());
54856
54888
 
54889
+ // ../shared-core/src/helpers/index.ts
54890
+ var helpers_exports = {};
54891
+ __export(helpers_exports, {
54892
+ cron: () => cron_exports,
54893
+ deepGet: () => deepGet,
54894
+ getUserColor: () => getUserColor,
54895
+ getUserInitials: () => getUserInitials,
54896
+ getUserLabel: () => getUserLabel,
54897
+ isGoogleSheets: () => isGoogleSheets,
54898
+ isSQL: () => isSQL,
54899
+ schema: () => schema_exports
54900
+ });
54901
+
54857
54902
  // ../shared-core/src/helpers/helpers.ts
54858
54903
  var deepGet = (obj, key) => {
54859
54904
  if (!obj || !key) {
@@ -54868,9 +54913,110 @@ var deepGet = (obj, key) => {
54868
54913
  }
54869
54914
  return obj;
54870
54915
  };
54916
+ var getUserInitials = (user) => {
54917
+ if (!user) {
54918
+ return "?";
54919
+ }
54920
+ let initials = "";
54921
+ initials += user.firstName ? user.firstName[0] : "";
54922
+ initials += user.lastName ? user.lastName[0] : "";
54923
+ if (initials !== "") {
54924
+ return initials;
54925
+ }
54926
+ return user.email?.[0] || "U";
54927
+ };
54928
+ var getUserColor = (user) => {
54929
+ let id = user?._id;
54930
+ if (!id) {
54931
+ return "var(--spectrum-global-color-blue-400)";
54932
+ }
54933
+ id = id.replace("ro_ta_users_", "");
54934
+ let hue = 1;
54935
+ for (let i = 0; i < id.length; i++) {
54936
+ hue += id.charCodeAt(i);
54937
+ hue = hue % 36;
54938
+ }
54939
+ return `hsl(${hue * 10}, 50%, 40%)`;
54940
+ };
54941
+ var getUserLabel = (user) => {
54942
+ if (!user) {
54943
+ return "";
54944
+ }
54945
+ const { firstName, lastName, email } = user;
54946
+ if (firstName && lastName) {
54947
+ return `${firstName} ${lastName}`;
54948
+ } else if (firstName) {
54949
+ return firstName;
54950
+ } else if (lastName) {
54951
+ return lastName;
54952
+ } else {
54953
+ return email;
54954
+ }
54955
+ };
54956
+
54957
+ // ../shared-core/src/helpers/integrations.ts
54958
+ function isGoogleSheets(type) {
54959
+ return type === "GOOGLE_SHEETS" /* GOOGLE_SHEETS */;
54960
+ }
54961
+ function isSQL(datasource2) {
54962
+ if (!datasource2 || !datasource2.source) {
54963
+ return false;
54964
+ }
54965
+ const SQL = [
54966
+ "POSTGRES" /* POSTGRES */,
54967
+ "SQL_SERVER" /* SQL_SERVER */,
54968
+ "MYSQL" /* MYSQL */,
54969
+ "ORACLE" /* ORACLE */
54970
+ ];
54971
+ return SQL.indexOf(datasource2.source) !== -1 || datasource2.isSQL === true;
54972
+ }
54871
54973
 
54872
54974
  // ../shared-core/src/helpers/cron.ts
54975
+ var cron_exports = {};
54976
+ __export(cron_exports, {
54977
+ validate: () => validate
54978
+ });
54873
54979
  var import_cron_validate = __toESM(require_lib2());
54980
+ var INPUT_CRON_START = "(Input cron: ";
54981
+ var ERROR_SWAPS = {
54982
+ "smaller than lower limit": "less than",
54983
+ "bigger than upper limit": "greater than",
54984
+ daysOfMonth: "'days of the month'",
54985
+ daysOfWeek: "'days of the week'",
54986
+ years: "'years'",
54987
+ months: "'months'",
54988
+ hours: "'hours'",
54989
+ minutes: "'minutes'",
54990
+ seconds: "'seconds'"
54991
+ };
54992
+ function improveErrors(errors) {
54993
+ const finalErrors = [];
54994
+ for (let error of errors) {
54995
+ if (error.includes(INPUT_CRON_START)) {
54996
+ error = error.split(INPUT_CRON_START)[0].trim();
54997
+ }
54998
+ for (let [oldErr, newErr] of Object.entries(ERROR_SWAPS)) {
54999
+ if (error.includes(oldErr)) {
55000
+ error = error.replace(new RegExp(oldErr, "g"), newErr);
55001
+ }
55002
+ }
55003
+ finalErrors.push(error);
55004
+ }
55005
+ return finalErrors;
55006
+ }
55007
+ function validate(cronExpression) {
55008
+ const result = (0, import_cron_validate.default)(cronExpression, {
55009
+ preset: "npm-node-cron",
55010
+ override: {
55011
+ useSeconds: false
55012
+ }
55013
+ });
55014
+ if (!result.isValid()) {
55015
+ return { valid: false, err: improveErrors(result.getError()) };
55016
+ } else {
55017
+ return { valid: true };
55018
+ }
55019
+ }
54874
55020
 
54875
55021
  // ../shared-core/src/helpers/schema.ts
54876
55022
  var schema_exports = {};
@@ -55191,10 +55337,10 @@ var luceneSort = (docs, sort, sortOrder, sortType = "string" /* STRING */) => {
55191
55337
  if (!sort || !sortOrder || !sortType) {
55192
55338
  return docs;
55193
55339
  }
55194
- const parse = sortType === "string" ? (x) => `${x}` : (x) => parseFloat(x);
55340
+ const parse2 = sortType === "string" ? (x) => `${x}` : (x) => parseFloat(x);
55195
55341
  return docs.slice().sort((a, b) => {
55196
- const colA = parse(a[sort]);
55197
- const colB = parse(b[sort]);
55342
+ const colA = parse2(a[sort]);
55343
+ const colB = parse2(b[sort]);
55198
55344
  if (sortOrder.toLowerCase() === "descending") {
55199
55345
  return colA > colB ? -1 : 1;
55200
55346
  } else {
@@ -55749,6 +55895,9 @@ var environment = {
55749
55895
  DEPLOYMENT_ENVIRONMENT: process.env.DEPLOYMENT_ENVIRONMENT || "docker-compose",
55750
55896
  HTTP_LOGGING: httpLogging(),
55751
55897
  ENABLE_AUDIT_LOG_IP_ADDR: process.env.ENABLE_AUDIT_LOG_IP_ADDR,
55898
+ // Couch/search
55899
+ SQL_LOGGING_ENABLE: process.env.SQL_LOGGING_ENABLE,
55900
+ SQL_MAX_ROWS: process.env.SQL_MAX_ROWS,
55752
55901
  // smtp
55753
55902
  SMTP_FALLBACK_ENABLED: process.env.SMTP_FALLBACK_ENABLED,
55754
55903
  SMTP_USER: process.env.SMTP_USER,
@@ -57089,6 +57238,11 @@ __export(db_exports, {
57089
57238
  BUDIBASE_DATASOURCE_TYPE: () => BUDIBASE_DATASOURCE_TYPE,
57090
57239
  CONSTANT_EXTERNAL_ROW_COLS: () => CONSTANT_EXTERNAL_ROW_COLS,
57091
57240
  CONSTANT_INTERNAL_ROW_COLS: () => CONSTANT_INTERNAL_ROW_COLS,
57241
+ DEFAULT_BB_DATASOURCE_ID: () => DEFAULT_BB_DATASOURCE_ID,
57242
+ DEFAULT_EMPLOYEE_TABLE_ID: () => DEFAULT_EMPLOYEE_TABLE_ID,
57243
+ DEFAULT_EXPENSES_TABLE_ID: () => DEFAULT_EXPENSES_TABLE_ID,
57244
+ DEFAULT_INVENTORY_TABLE_ID: () => DEFAULT_INVENTORY_TABLE_ID,
57245
+ DEFAULT_JOBS_TABLE_ID: () => DEFAULT_JOBS_TABLE_ID,
57092
57246
  DatabaseImpl: () => DatabaseImpl,
57093
57247
  DatabaseWithConnection: () => DatabaseWithConnection,
57094
57248
  DeprecatedViews: () => DeprecatedViews,
@@ -57098,6 +57252,7 @@ __export(db_exports, {
57098
57252
  Replication: () => Replication_default,
57099
57253
  SEPARATOR: () => SEPARATOR,
57100
57254
  SQLITE_DESIGN_DOC_ID: () => SQLITE_DESIGN_DOC_ID,
57255
+ SQS_DATASOURCE_INTERNAL: () => SQS_DATASOURCE_INTERNAL,
57101
57256
  StaticDatabases: () => StaticDatabases,
57102
57257
  UNICODE_MAX: () => UNICODE_MAX,
57103
57258
  ViewName: () => ViewName,
@@ -57798,7 +57953,7 @@ var QueryBuilder = class _QueryBuilder {
57798
57953
  static {
57799
57954
  this.maxLimit = 200;
57800
57955
  }
57801
- constructor(dbName, index2, base) {
57956
+ constructor(dbName, index2, base2) {
57802
57957
  this.#dbName = dbName;
57803
57958
  this.#index = index2;
57804
57959
  this.#query = {
@@ -57815,7 +57970,7 @@ var QueryBuilder = class _QueryBuilder {
57815
57970
  contains: {},
57816
57971
  notContains: {},
57817
57972
  containsAny: {},
57818
- ...base
57973
+ ...base2
57819
57974
  };
57820
57975
  this.#limit = 50;
57821
57976
  this.#sortOrder = "ascending";
@@ -64577,14 +64732,14 @@ function removePortalUserPermissions(user) {
64577
64732
  delete user.builder;
64578
64733
  return user;
64579
64734
  }
64580
- function cleanseUserObject(user, base) {
64735
+ function cleanseUserObject(user, base2) {
64581
64736
  delete user.admin;
64582
64737
  delete user.builder;
64583
64738
  delete user.roles;
64584
- if (base) {
64585
- user.admin = base.admin;
64586
- user.builder = base.builder;
64587
- user.roles = base.roles;
64739
+ if (base2) {
64740
+ user.admin = base2.admin;
64741
+ user.builder = base2.builder;
64742
+ user.roles = base2.roles;
64588
64743
  }
64589
64744
  return user;
64590
64745
  }
@@ -65835,9 +65990,9 @@ function encrypt(input, secretOption = "api" /* API */) {
65835
65990
  const salt = import_crypto.default.randomBytes(SALT_LENGTH);
65836
65991
  const stretched = stretchString(getSecret(secretOption), salt);
65837
65992
  const cipher = import_crypto.default.createCipheriv(ALGO, stretched, salt);
65838
- const base = cipher.update(input);
65993
+ const base2 = cipher.update(input);
65839
65994
  const final = cipher.final();
65840
- const encrypted = Buffer.concat([base, final]).toString("hex");
65995
+ const encrypted = Buffer.concat([base2, final]).toString("hex");
65841
65996
  return `${salt.toString("hex")}${SEPARATOR3}${encrypted}`;
65842
65997
  }
65843
65998
  function decrypt(input, secretOption = "api" /* API */) {
@@ -65845,9 +66000,9 @@ function decrypt(input, secretOption = "api" /* API */) {
65845
66000
  const saltBuffer = Buffer.from(salt, "hex");
65846
66001
  const stretched = stretchString(getSecret(secretOption), saltBuffer);
65847
66002
  const decipher = import_crypto.default.createDecipheriv(ALGO, stretched, saltBuffer);
65848
- const base = decipher.update(Buffer.from(encrypted, "hex"));
66003
+ const base2 = decipher.update(Buffer.from(encrypted, "hex"));
65849
66004
  const final = decipher.final();
65850
- return Buffer.concat([base, final]).toString();
66005
+ return Buffer.concat([base2, final]).toString();
65851
66006
  }
65852
66007
  async function encryptFile({ dir, filename }, secret) {
65853
66008
  const outputFileName = `${filename}.enc`;
@@ -66299,7 +66454,7 @@ __export(joi_validator_exports, {
66299
66454
  params: () => params
66300
66455
  });
66301
66456
  var import_joi = __toESM(require("joi"));
66302
- function validate(schema, property) {
66457
+ function validate2(schema, property) {
66303
66458
  return (ctx, next) => {
66304
66459
  if (!schema) {
66305
66460
  return next();
@@ -66325,10 +66480,10 @@ function validate(schema, property) {
66325
66480
  };
66326
66481
  }
66327
66482
  function body(schema) {
66328
- return validate(schema, "body");
66483
+ return validate2(schema, "body");
66329
66484
  }
66330
66485
  function params(schema) {
66331
- return validate(schema, "params");
66486
+ return validate2(schema, "params");
66332
66487
  }
66333
66488
 
66334
66489
  // src/middleware/index.ts
@@ -66464,7 +66619,7 @@ async function platformLogout(opts) {
66464
66619
  // src/plugin/index.ts
66465
66620
  var plugin_exports = {};
66466
66621
  __export(plugin_exports, {
66467
- validate: () => validate2
66622
+ validate: () => validate3
66468
66623
  });
66469
66624
 
66470
66625
  // src/plugin/utils.ts
@@ -66581,7 +66736,7 @@ function validateAutomation(schema) {
66581
66736
  });
66582
66737
  runJoi(validator, schema);
66583
66738
  }
66584
- function validate2(schema) {
66739
+ function validate3(schema) {
66585
66740
  switch (schema?.type) {
66586
66741
  case "component" /* COMPONENT */:
66587
66742
  validateComponent(schema);
@@ -66738,6 +66893,1083 @@ function init8(processors2) {
66738
66893
  }
66739
66894
  }
66740
66895
 
66896
+ // src/sql/index.ts
66897
+ var sql_exports = {};
66898
+ __export(sql_exports, {
66899
+ Sql: () => sql_default,
66900
+ SqlTable: () => sqlTable_default,
66901
+ designDoc: () => designDoc_exports,
66902
+ utils: () => utils_exports5
66903
+ });
66904
+
66905
+ // src/sql/utils.ts
66906
+ var utils_exports5 = {};
66907
+ __export(utils_exports5, {
66908
+ breakExternalTableId: () => breakExternalTableId,
66909
+ breakRowIdField: () => breakRowIdField,
66910
+ buildExternalTableId: () => buildExternalTableId,
66911
+ convertRowId: () => convertRowId,
66912
+ generateRowIdField: () => generateRowIdField,
66913
+ getNativeSql: () => getNativeSql,
66914
+ isExternalTable: () => isExternalTable,
66915
+ isExternalTableID: () => isExternalTableID,
66916
+ isInternalTableID: () => isInternalTableID,
66917
+ isIsoDateString: () => isIsoDateString,
66918
+ isRowId: () => isRowId,
66919
+ isValidFilter: () => isValidFilter
66920
+ });
66921
+ var DOUBLE_SEPARATOR = `${SEPARATOR}${SEPARATOR}`;
66922
+ var ROW_ID_REGEX = /^\[.*]$/g;
66923
+ var ENCODED_SPACE = encodeURIComponent(" ");
66924
+ function isExternalTableID(tableId) {
66925
+ return tableId.startsWith("datasource" /* DATASOURCE */ + SEPARATOR);
66926
+ }
66927
+ function isInternalTableID(tableId) {
66928
+ return !isExternalTableID(tableId);
66929
+ }
66930
+ function getNativeSql(query) {
66931
+ let sql = query.toSQL();
66932
+ if (Array.isArray(sql)) {
66933
+ return sql;
66934
+ }
66935
+ let native;
66936
+ if (sql.toNative) {
66937
+ native = sql.toNative();
66938
+ }
66939
+ return {
66940
+ sql: native?.sql || sql.sql,
66941
+ bindings: native?.bindings || sql.bindings
66942
+ };
66943
+ }
66944
+ function isExternalTable(table) {
66945
+ if (table?.sourceId && table.sourceId.includes("datasource" /* DATASOURCE */ + SEPARATOR) && table?.sourceId !== DEFAULT_BB_DATASOURCE_ID) {
66946
+ return true;
66947
+ } else if (table?.sourceType === "external" /* EXTERNAL */) {
66948
+ return true;
66949
+ } else if (table?._id && isExternalTableID(table._id)) {
66950
+ return true;
66951
+ }
66952
+ return false;
66953
+ }
66954
+ function buildExternalTableId(datasourceId, tableName) {
66955
+ if (tableName.includes(" ")) {
66956
+ tableName = encodeURIComponent(tableName);
66957
+ }
66958
+ return `${datasourceId}${DOUBLE_SEPARATOR}${tableName}`;
66959
+ }
66960
+ function breakExternalTableId(tableId) {
66961
+ if (!tableId) {
66962
+ return {};
66963
+ }
66964
+ const parts = tableId.split(DOUBLE_SEPARATOR);
66965
+ let datasourceId = parts.shift();
66966
+ let tableName = parts.join(DOUBLE_SEPARATOR);
66967
+ if (tableName.includes(ENCODED_SPACE)) {
66968
+ tableName = decodeURIComponent(tableName);
66969
+ }
66970
+ return { datasourceId, tableName };
66971
+ }
66972
+ function generateRowIdField(keyProps = []) {
66973
+ if (!Array.isArray(keyProps)) {
66974
+ keyProps = [keyProps];
66975
+ }
66976
+ for (let index2 in keyProps) {
66977
+ if (keyProps[index2] instanceof Buffer) {
66978
+ keyProps[index2] = keyProps[index2].toString();
66979
+ }
66980
+ }
66981
+ return encodeURIComponent(JSON.stringify(keyProps).replace(/"/g, "'"));
66982
+ }
66983
+ function isRowId(field) {
66984
+ return Array.isArray(field) || typeof field === "string" && field.match(ROW_ID_REGEX) != null;
66985
+ }
66986
+ function convertRowId(field) {
66987
+ if (Array.isArray(field)) {
66988
+ return field[0];
66989
+ }
66990
+ if (typeof field === "string" && field.match(ROW_ID_REGEX) != null) {
66991
+ return field.substring(1, field.length - 1);
66992
+ }
66993
+ return field;
66994
+ }
66995
+ function breakRowIdField(_id) {
66996
+ if (!_id) {
66997
+ return [];
66998
+ }
66999
+ const id = typeof _id === "string" ? _id : _id._id;
67000
+ const decoded = decodeURIComponent(id).replace(/'/g, '"');
67001
+ try {
67002
+ const parsed = JSON.parse(decoded);
67003
+ return Array.isArray(parsed) ? parsed : [parsed];
67004
+ } catch (err) {
67005
+ return [_id];
67006
+ }
67007
+ }
67008
+ function isIsoDateString(str) {
67009
+ const trimmedValue = str.trim();
67010
+ if (!/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{3}Z$/.test(trimmedValue)) {
67011
+ return false;
67012
+ }
67013
+ let d = new Date(trimmedValue);
67014
+ return d.toISOString() === trimmedValue;
67015
+ }
67016
+ function isValidFilter(value) {
67017
+ return value != null && value !== "";
67018
+ }
67019
+
67020
+ // src/sql/sql.ts
67021
+ var import_knex2 = require("knex");
67022
+
67023
+ // src/sql/sqlStatements.ts
67024
+ var SqlStatements = class {
67025
+ constructor(client, table, { allOr } = {}) {
67026
+ this.client = client;
67027
+ this.table = table;
67028
+ this.allOr = allOr;
67029
+ }
67030
+ getField(key) {
67031
+ const fieldName = key.split(".")[1];
67032
+ return this.table.schema[fieldName];
67033
+ }
67034
+ between(query, key, low, high) {
67035
+ const field = this.getField(key);
67036
+ if (field?.type === "bigint" /* BIGINT */ && this.client === "sqlite3" /* SQL_LITE */) {
67037
+ query = query.whereRaw(
67038
+ `CAST(${key} AS INTEGER) BETWEEN CAST(? AS INTEGER) AND CAST(? AS INTEGER)`,
67039
+ [low, high]
67040
+ );
67041
+ } else {
67042
+ const fnc = this.allOr ? "orWhereBetween" : "whereBetween";
67043
+ query = query[fnc](key, [low, high]);
67044
+ }
67045
+ return query;
67046
+ }
67047
+ lte(query, key, low) {
67048
+ const field = this.getField(key);
67049
+ if (field?.type === "bigint" /* BIGINT */ && this.client === "sqlite3" /* SQL_LITE */) {
67050
+ query = query.whereRaw(`CAST(${key} AS INTEGER) >= CAST(? AS INTEGER)`, [
67051
+ low
67052
+ ]);
67053
+ } else {
67054
+ const fnc = this.allOr ? "orWhere" : "where";
67055
+ query = query[fnc](key, ">=", low);
67056
+ }
67057
+ return query;
67058
+ }
67059
+ gte(query, key, high) {
67060
+ const field = this.getField(key);
67061
+ if (field?.type === "bigint" /* BIGINT */ && this.client === "sqlite3" /* SQL_LITE */) {
67062
+ query = query.whereRaw(`CAST(${key} AS INTEGER) <= CAST(? AS INTEGER)`, [
67063
+ high
67064
+ ]);
67065
+ } else {
67066
+ const fnc = this.allOr ? "orWhere" : "where";
67067
+ query = query[fnc](key, "<=", high);
67068
+ }
67069
+ return query;
67070
+ }
67071
+ };
67072
+
67073
+ // src/sql/sqlTable.ts
67074
+ var import_knex = require("knex");
67075
+ function isIgnoredType(type) {
67076
+ const ignored = ["link" /* LINK */, "formula" /* FORMULA */];
67077
+ return ignored.indexOf(type) !== -1;
67078
+ }
67079
+ function generateSchema(schema, table, tables, oldTable = null, renamed) {
67080
+ let primaryKey = table && table.primary ? table.primary[0] : null;
67081
+ const columns = Object.values(table.schema);
67082
+ let metaCols = columns.filter((col) => col.meta);
67083
+ let isJunction = metaCols.length === columns.length;
67084
+ if (primaryKey && !oldTable && !isJunction) {
67085
+ schema.increments(primaryKey).primary();
67086
+ } else if (!oldTable && isJunction) {
67087
+ schema.primary(metaCols.map((col) => col.name));
67088
+ }
67089
+ const foreignKeys = Object.values(table.schema).map(
67090
+ (col) => col.foreignKey
67091
+ );
67092
+ for (let [key, column] of Object.entries(table.schema)) {
67093
+ const oldColumn = oldTable ? oldTable.schema[key] : null;
67094
+ if (oldColumn && oldColumn.type || primaryKey === key && !isJunction || renamed?.updated === key) {
67095
+ continue;
67096
+ }
67097
+ const columnType = column.type;
67098
+ switch (columnType) {
67099
+ case "string" /* STRING */:
67100
+ case "options" /* OPTIONS */:
67101
+ case "longform" /* LONGFORM */:
67102
+ case "barcodeqr" /* BARCODEQR */:
67103
+ case "bb_reference_single" /* BB_REFERENCE_SINGLE */:
67104
+ schema.text(key);
67105
+ break;
67106
+ case "number" /* NUMBER */:
67107
+ if (column.meta && column.meta.toKey && column.meta.toTable) {
67108
+ const { toKey, toTable } = column.meta;
67109
+ schema.integer(key).unsigned();
67110
+ schema.foreign(key).references(`${toTable}.${toKey}`);
67111
+ } else if (foreignKeys.indexOf(key) === -1) {
67112
+ schema.float(key);
67113
+ }
67114
+ break;
67115
+ case "bigint" /* BIGINT */:
67116
+ schema.bigint(key);
67117
+ break;
67118
+ case "boolean" /* BOOLEAN */:
67119
+ schema.boolean(key);
67120
+ break;
67121
+ case "datetime" /* DATETIME */:
67122
+ if (!column.timeOnly) {
67123
+ schema.datetime(key, {
67124
+ useTz: !column.ignoreTimezones
67125
+ });
67126
+ } else {
67127
+ schema.time(key);
67128
+ }
67129
+ break;
67130
+ case "array" /* ARRAY */:
67131
+ case "bb_reference" /* BB_REFERENCE */:
67132
+ if (helpers_exports.schema.isDeprecatedSingleUserColumn(column)) {
67133
+ schema.text(key);
67134
+ } else {
67135
+ schema.json(key);
67136
+ }
67137
+ break;
67138
+ case "link" /* LINK */:
67139
+ if (column.relationshipType !== "many-to-one" /* MANY_TO_ONE */ && column.relationshipType !== "many-to-many" /* MANY_TO_MANY */) {
67140
+ if (!column.foreignKey || !column.tableId) {
67141
+ throw new Error("Invalid relationship schema");
67142
+ }
67143
+ const { tableName } = breakExternalTableId(column.tableId);
67144
+ const relatedTable = tables[tableName];
67145
+ if (!relatedTable) {
67146
+ throw new Error("Referenced table doesn't exist");
67147
+ }
67148
+ const relatedPrimary = relatedTable.primary[0];
67149
+ const externalType = relatedTable.schema[relatedPrimary].externalType;
67150
+ if (externalType) {
67151
+ schema.specificType(column.foreignKey, externalType);
67152
+ } else {
67153
+ schema.integer(column.foreignKey).unsigned();
67154
+ }
67155
+ schema.foreign(column.foreignKey).references(`${tableName}.${relatedPrimary}`);
67156
+ }
67157
+ break;
67158
+ case "formula" /* FORMULA */:
67159
+ break;
67160
+ case "attachment" /* ATTACHMENTS */:
67161
+ case "attachment_single" /* ATTACHMENT_SINGLE */:
67162
+ case "signature_single" /* SIGNATURE_SINGLE */:
67163
+ case "auto" /* AUTO */:
67164
+ case "json" /* JSON */:
67165
+ case "internal" /* INTERNAL */:
67166
+ throw `${column.type} is not a valid SQL type`;
67167
+ default:
67168
+ utils_exports.unreachable(columnType);
67169
+ }
67170
+ }
67171
+ const oldType = renamed ? oldTable?.schema[renamed.old].type : void 0;
67172
+ if (renamed && oldType && !isIgnoredType(oldType)) {
67173
+ schema.renameColumn(renamed.old, renamed.updated);
67174
+ }
67175
+ if (oldTable) {
67176
+ const deletedColumns = Object.entries(oldTable.schema).filter(
67177
+ ([key, column]) => !isIgnoredType(column.type) && table.schema[key] == null
67178
+ );
67179
+ deletedColumns.forEach(([key, column]) => {
67180
+ if (renamed?.old === key || isIgnoredType(column.type)) {
67181
+ return;
67182
+ }
67183
+ if (oldTable.constrained && oldTable.constrained.indexOf(key) !== -1) {
67184
+ schema.dropForeign(key);
67185
+ }
67186
+ schema.dropColumn(key);
67187
+ });
67188
+ }
67189
+ return schema;
67190
+ }
67191
+ function buildCreateTable(knex3, table, tables) {
67192
+ return knex3.createTable(table.name, (schema) => {
67193
+ generateSchema(schema, table, tables);
67194
+ });
67195
+ }
67196
+ function buildUpdateTable(knex3, table, tables, oldTable, renamed) {
67197
+ return knex3.alterTable(table.name, (schema) => {
67198
+ generateSchema(schema, table, tables, oldTable, renamed);
67199
+ });
67200
+ }
67201
+ function buildDeleteTable(knex3, table) {
67202
+ return knex3.dropTable(table.name);
67203
+ }
67204
+ var SqlTableQueryBuilder = class {
67205
+ // pass through client to get flavour of SQL
67206
+ constructor(client) {
67207
+ this.sqlClient = client;
67208
+ }
67209
+ getSqlClient() {
67210
+ return this.sqlClient;
67211
+ }
67212
+ /**
67213
+ * @param json the input JSON structure from which an SQL query will be built.
67214
+ * @return the operation that was found in the JSON.
67215
+ */
67216
+ _operation(json) {
67217
+ return json.endpoint.operation;
67218
+ }
67219
+ _tableQuery(json) {
67220
+ let client = (0, import_knex.knex)({ client: this.sqlClient }).schema;
67221
+ let schemaName = json?.endpoint?.schema;
67222
+ if (schemaName) {
67223
+ client = client.withSchema(schemaName);
67224
+ }
67225
+ let query;
67226
+ if (!json.table || !json.meta || !json.meta.tables) {
67227
+ throw new Error("Cannot execute without table being specified");
67228
+ }
67229
+ if (json.table.sourceType === "internal" /* INTERNAL */) {
67230
+ throw new Error("Cannot perform table actions for SQS.");
67231
+ }
67232
+ switch (this._operation(json)) {
67233
+ case "CREATE_TABLE" /* CREATE_TABLE */:
67234
+ query = buildCreateTable(client, json.table, json.meta.tables);
67235
+ break;
67236
+ case "UPDATE_TABLE" /* UPDATE_TABLE */:
67237
+ if (!json.meta || !json.meta.table) {
67238
+ throw new Error("Must specify old table for update");
67239
+ }
67240
+ if (this.sqlClient === "mysql2" /* MY_SQL */ && json.meta.renamed) {
67241
+ const updatedColumn = json.meta.renamed.updated;
67242
+ const tableName = schemaName ? `\`${schemaName}\`.\`${json.table.name}\`` : `\`${json.table.name}\``;
67243
+ return {
67244
+ sql: `alter table ${tableName} rename column \`${json.meta.renamed.old}\` to \`${updatedColumn}\`;`,
67245
+ bindings: []
67246
+ };
67247
+ }
67248
+ query = buildUpdateTable(
67249
+ client,
67250
+ json.table,
67251
+ json.meta.tables,
67252
+ json.meta.table,
67253
+ json.meta.renamed
67254
+ );
67255
+ if (this.sqlClient === "mssql" /* MS_SQL */ && json.meta.renamed) {
67256
+ const oldColumn = json.meta.renamed.old;
67257
+ const updatedColumn = json.meta.renamed.updated;
67258
+ const tableName = schemaName ? `${schemaName}.${json.table.name}` : `${json.table.name}`;
67259
+ const sql = getNativeSql(query);
67260
+ if (Array.isArray(sql)) {
67261
+ for (const query2 of sql) {
67262
+ if (query2.sql.startsWith("exec sp_rename")) {
67263
+ query2.sql = `exec sp_rename '${tableName}.${oldColumn}', '${updatedColumn}', 'COLUMN'`;
67264
+ query2.bindings = [];
67265
+ }
67266
+ }
67267
+ }
67268
+ return sql;
67269
+ }
67270
+ break;
67271
+ case "DELETE_TABLE" /* DELETE_TABLE */:
67272
+ query = buildDeleteTable(client, json.table);
67273
+ break;
67274
+ default:
67275
+ throw new Error("Table operation is of unknown type");
67276
+ }
67277
+ return getNativeSql(query);
67278
+ }
67279
+ };
67280
+ var sqlTable_default = SqlTableQueryBuilder;
67281
+
67282
+ // src/sql/sql.ts
67283
+ var envLimit = environment_default.SQL_MAX_ROWS ? parseInt(environment_default.SQL_MAX_ROWS) : null;
67284
+ var BASE_LIMIT = envLimit || 5e3;
67285
+ var MIN_ISO_DATE = "0000-00-00T00:00:00.000Z";
67286
+ var MAX_ISO_DATE = "9999-00-00T00:00:00.000Z";
67287
+ function likeKey(client, key) {
67288
+ let start2, end2;
67289
+ switch (client) {
67290
+ case "mysql2" /* MY_SQL */:
67291
+ start2 = end2 = "`";
67292
+ break;
67293
+ case "sqlite3" /* SQL_LITE */:
67294
+ case "oracledb" /* ORACLE */:
67295
+ case "pg" /* POSTGRES */:
67296
+ start2 = end2 = '"';
67297
+ break;
67298
+ case "mssql" /* MS_SQL */:
67299
+ start2 = "[";
67300
+ end2 = "]";
67301
+ break;
67302
+ default:
67303
+ throw new Error("Unknown client generating like key");
67304
+ }
67305
+ const parts = key.split(".");
67306
+ key = parts.map((part) => `${start2}${part}${end2}`).join(".");
67307
+ return key;
67308
+ }
67309
+ function parse(input) {
67310
+ if (Array.isArray(input)) {
67311
+ return JSON.stringify(input);
67312
+ }
67313
+ if (input == void 0) {
67314
+ return null;
67315
+ }
67316
+ if (typeof input !== "string") {
67317
+ return input;
67318
+ }
67319
+ if (input === MAX_ISO_DATE || input === MIN_ISO_DATE) {
67320
+ return null;
67321
+ }
67322
+ if (isIsoDateString(input)) {
67323
+ return new Date(input.trim());
67324
+ }
67325
+ return input;
67326
+ }
67327
+ function parseBody(body2) {
67328
+ for (let [key, value] of Object.entries(body2)) {
67329
+ body2[key] = parse(value);
67330
+ }
67331
+ return body2;
67332
+ }
67333
+ function parseFilters(filters) {
67334
+ if (!filters) {
67335
+ return {};
67336
+ }
67337
+ for (let [key, value] of Object.entries(filters)) {
67338
+ let parsed;
67339
+ if (typeof value === "object") {
67340
+ parsed = parseFilters(value);
67341
+ } else {
67342
+ parsed = parse(value);
67343
+ }
67344
+ filters[key] = parsed;
67345
+ }
67346
+ return filters;
67347
+ }
67348
+ function generateSelectStatement(json, knex3) {
67349
+ const { resource, meta } = json;
67350
+ if (!resource) {
67351
+ return "*";
67352
+ }
67353
+ const schema = meta?.table?.schema;
67354
+ return resource.fields.map((field) => {
67355
+ const fieldNames = field.split(/\./g);
67356
+ const tableName = fieldNames[0];
67357
+ const columnName = fieldNames[1];
67358
+ const columnSchema = schema?.[columnName];
67359
+ if (columnSchema && knex3.client.config.client === "pg" /* POSTGRES */) {
67360
+ const externalType = schema[columnName].externalType;
67361
+ if (externalType?.includes("money")) {
67362
+ return knex3.raw(
67363
+ `"${tableName}"."${columnName}"::money::numeric as "${field}"`
67364
+ );
67365
+ }
67366
+ }
67367
+ if (knex3.client.config.client === "mssql" /* MS_SQL */ && columnSchema?.type === "datetime" /* DATETIME */ && columnSchema.timeOnly) {
67368
+ return knex3.raw(`CONVERT(varchar, ${field}, 108) as "${field}"`);
67369
+ }
67370
+ return `${field} as ${field}`;
67371
+ });
67372
+ }
67373
+ function getTableName(table) {
67374
+ if (table?.sourceType === "internal" /* INTERNAL */ || table?.sourceId === INTERNAL_TABLE_SOURCE_ID) {
67375
+ return table?._id;
67376
+ } else {
67377
+ return table?.name;
67378
+ }
67379
+ }
67380
+ function convertBooleans(query) {
67381
+ if (Array.isArray(query)) {
67382
+ return query.map((q2) => convertBooleans(q2));
67383
+ } else {
67384
+ if (query.bindings) {
67385
+ query.bindings = query.bindings.map((binding) => {
67386
+ if (typeof binding === "boolean") {
67387
+ return binding ? 1 : 0;
67388
+ }
67389
+ return binding;
67390
+ });
67391
+ }
67392
+ }
67393
+ return query;
67394
+ }
67395
+ var InternalBuilder = class {
67396
+ constructor(client) {
67397
+ this.client = client;
67398
+ }
67399
+ // right now we only do filters on the specific table being queried
67400
+ addFilters(query, filters, table, opts) {
67401
+ if (!filters) {
67402
+ return query;
67403
+ }
67404
+ filters = parseFilters(filters);
67405
+ const allOr = filters.allOr;
67406
+ const sqlStatements = new SqlStatements(this.client, table, { allOr });
67407
+ const tableName = this.client === "sqlite3" /* SQL_LITE */ ? table._id : table.name;
67408
+ function getTableAlias(name) {
67409
+ const alias = opts.aliases?.[name];
67410
+ return alias || name;
67411
+ }
67412
+ function iterate(structure, fn) {
67413
+ for (let [key, value] of Object.entries(structure)) {
67414
+ const updatedKey = removeKeyNumbering2(key);
67415
+ const isRelationshipField = updatedKey.includes(".");
67416
+ if (!opts.relationship && !isRelationshipField) {
67417
+ const alias = getTableAlias(tableName);
67418
+ fn(alias ? `${alias}.${updatedKey}` : updatedKey, value);
67419
+ }
67420
+ if (opts.relationship && isRelationshipField) {
67421
+ const [filterTableName, property] = updatedKey.split(".");
67422
+ const alias = getTableAlias(filterTableName);
67423
+ fn(alias ? `${alias}.${property}` : property, value);
67424
+ }
67425
+ }
67426
+ }
67427
+ const like = (key, value) => {
67428
+ const fuzzyOr = filters?.fuzzyOr;
67429
+ const fnc = fuzzyOr || allOr ? "orWhere" : "where";
67430
+ if (this.client === "pg" /* POSTGRES */) {
67431
+ query = query[fnc](key, "ilike", `%${value}%`);
67432
+ } else {
67433
+ const rawFnc = `${fnc}Raw`;
67434
+ query = query[rawFnc](`LOWER(${likeKey(this.client, key)}) LIKE ?`, [
67435
+ `%${value.toLowerCase()}%`
67436
+ ]);
67437
+ }
67438
+ };
67439
+ const contains = (mode, any = false) => {
67440
+ const rawFnc = allOr ? "orWhereRaw" : "whereRaw";
67441
+ const not = mode === filters?.notContains ? "NOT " : "";
67442
+ function stringifyArray(value, quoteStyle = '"') {
67443
+ for (let i in value) {
67444
+ if (typeof value[i] === "string") {
67445
+ value[i] = `${quoteStyle}${value[i]}${quoteStyle}`;
67446
+ }
67447
+ }
67448
+ return `[${value.join(",")}]`;
67449
+ }
67450
+ if (this.client === "pg" /* POSTGRES */) {
67451
+ iterate(mode, (key, value) => {
67452
+ const wrap = any ? "" : "'";
67453
+ const op = any ? "\\?| array" : "@>";
67454
+ const fieldNames = key.split(/\./g);
67455
+ const table2 = fieldNames[0];
67456
+ const col = fieldNames[1];
67457
+ query = query[rawFnc](
67458
+ `${not}COALESCE("${table2}"."${col}"::jsonb ${op} ${wrap}${stringifyArray(
67459
+ value,
67460
+ any ? "'" : '"'
67461
+ )}${wrap}, FALSE)`
67462
+ );
67463
+ });
67464
+ } else if (this.client === "mysql2" /* MY_SQL */) {
67465
+ const jsonFnc = any ? "JSON_OVERLAPS" : "JSON_CONTAINS";
67466
+ iterate(mode, (key, value) => {
67467
+ query = query[rawFnc](
67468
+ `${not}COALESCE(${jsonFnc}(${key}, '${stringifyArray(
67469
+ value
67470
+ )}'), FALSE)`
67471
+ );
67472
+ });
67473
+ } else {
67474
+ const andOr = mode === filters?.containsAny ? " OR " : " AND ";
67475
+ iterate(mode, (key, value) => {
67476
+ let statement = "";
67477
+ for (let i in value) {
67478
+ if (typeof value[i] === "string") {
67479
+ value[i] = `%"${value[i].toLowerCase()}"%`;
67480
+ } else {
67481
+ value[i] = `%${value[i]}%`;
67482
+ }
67483
+ statement += (statement ? andOr : "") + `COALESCE(LOWER(${likeKey(this.client, key)}), '') LIKE ?`;
67484
+ }
67485
+ if (statement === "") {
67486
+ return;
67487
+ }
67488
+ query = query[rawFnc](`${not}(${statement})`, value);
67489
+ });
67490
+ }
67491
+ };
67492
+ if (filters.oneOf) {
67493
+ iterate(filters.oneOf, (key, array) => {
67494
+ const fnc = allOr ? "orWhereIn" : "whereIn";
67495
+ query = query[fnc](key, Array.isArray(array) ? array : [array]);
67496
+ });
67497
+ }
67498
+ if (filters.string) {
67499
+ iterate(filters.string, (key, value) => {
67500
+ const fnc = allOr ? "orWhere" : "where";
67501
+ if (this.client === "pg" /* POSTGRES */) {
67502
+ query = query[fnc](key, "ilike", `${value}%`);
67503
+ } else {
67504
+ const rawFnc = `${fnc}Raw`;
67505
+ query = query[rawFnc](`LOWER(${likeKey(this.client, key)}) LIKE ?`, [
67506
+ `${value.toLowerCase()}%`
67507
+ ]);
67508
+ }
67509
+ });
67510
+ }
67511
+ if (filters.fuzzy) {
67512
+ iterate(filters.fuzzy, like);
67513
+ }
67514
+ if (filters.range) {
67515
+ iterate(filters.range, (key, value) => {
67516
+ const isEmptyObject = (val) => {
67517
+ return val && Object.keys(val).length === 0 && Object.getPrototypeOf(val) === Object.prototype;
67518
+ };
67519
+ if (isEmptyObject(value.low)) {
67520
+ value.low = "";
67521
+ }
67522
+ if (isEmptyObject(value.high)) {
67523
+ value.high = "";
67524
+ }
67525
+ const lowValid = isValidFilter(value.low), highValid = isValidFilter(value.high);
67526
+ if (lowValid && highValid) {
67527
+ query = sqlStatements.between(query, key, value.low, value.high);
67528
+ } else if (lowValid) {
67529
+ query = sqlStatements.lte(query, key, value.low);
67530
+ } else if (highValid) {
67531
+ query = sqlStatements.gte(query, key, value.high);
67532
+ }
67533
+ });
67534
+ }
67535
+ if (filters.equal) {
67536
+ iterate(filters.equal, (key, value) => {
67537
+ const fnc = allOr ? "orWhereRaw" : "whereRaw";
67538
+ if (this.client === "mssql" /* MS_SQL */) {
67539
+ query = query[fnc](
67540
+ `CASE WHEN ${likeKey(this.client, key)} = ? THEN 1 ELSE 0 END = 1`,
67541
+ [value]
67542
+ );
67543
+ } else {
67544
+ query = query[fnc](
67545
+ `COALESCE(${likeKey(this.client, key)} = ?, FALSE)`,
67546
+ [value]
67547
+ );
67548
+ }
67549
+ });
67550
+ }
67551
+ if (filters.notEqual) {
67552
+ iterate(filters.notEqual, (key, value) => {
67553
+ const fnc = allOr ? "orWhereRaw" : "whereRaw";
67554
+ if (this.client === "mssql" /* MS_SQL */) {
67555
+ query = query[fnc](
67556
+ `CASE WHEN ${likeKey(this.client, key)} = ? THEN 1 ELSE 0 END = 0`,
67557
+ [value]
67558
+ );
67559
+ } else {
67560
+ query = query[fnc](
67561
+ `COALESCE(${likeKey(this.client, key)} != ?, TRUE)`,
67562
+ [value]
67563
+ );
67564
+ }
67565
+ });
67566
+ }
67567
+ if (filters.empty) {
67568
+ iterate(filters.empty, (key) => {
67569
+ const fnc = allOr ? "orWhereNull" : "whereNull";
67570
+ query = query[fnc](key);
67571
+ });
67572
+ }
67573
+ if (filters.notEmpty) {
67574
+ iterate(filters.notEmpty, (key) => {
67575
+ const fnc = allOr ? "orWhereNotNull" : "whereNotNull";
67576
+ query = query[fnc](key);
67577
+ });
67578
+ }
67579
+ if (filters.contains) {
67580
+ contains(filters.contains);
67581
+ }
67582
+ if (filters.notContains) {
67583
+ contains(filters.notContains);
67584
+ }
67585
+ if (filters.containsAny) {
67586
+ contains(filters.containsAny, true);
67587
+ }
67588
+ if (filters.documentType && !isExternalTable(table)) {
67589
+ const tableRef = opts?.aliases?.[table._id] || table._id;
67590
+ query.andWhereLike(
67591
+ `${tableRef}._id`,
67592
+ `${prefixed(filters.documentType)}%`
67593
+ );
67594
+ }
67595
+ return query;
67596
+ }
67597
+ addSorting(query, json) {
67598
+ let { sort, paginate } = json;
67599
+ const table = json.meta.table;
67600
+ const tableName = getTableName(table);
67601
+ const aliases = json.tableAliases;
67602
+ const aliased = tableName && aliases?.[tableName] ? aliases[tableName] : table?.name;
67603
+ if (sort && Object.keys(sort || {}).length > 0) {
67604
+ for (let [key, value] of Object.entries(sort)) {
67605
+ const direction = value.direction === "ASCENDING" /* ASCENDING */ ? "asc" : "desc";
67606
+ let nulls;
67607
+ if (this.client === "pg" /* POSTGRES */) {
67608
+ nulls = value.direction === "ASCENDING" /* ASCENDING */ ? "first" : "last";
67609
+ }
67610
+ query = query.orderBy(`${aliased}.${key}`, direction, nulls);
67611
+ }
67612
+ } else if (this.client === "mssql" /* MS_SQL */ && paginate?.limit) {
67613
+ query = query.orderBy(`${aliased}.${table?.primary[0]}`);
67614
+ }
67615
+ return query;
67616
+ }
67617
+ tableNameWithSchema(tableName, opts) {
67618
+ let withSchema = opts?.schema ? `${opts.schema}.${tableName}` : tableName;
67619
+ if (opts?.alias) {
67620
+ withSchema += ` as ${opts.alias}`;
67621
+ }
67622
+ return withSchema;
67623
+ }
67624
+ addRelationships(query, fromTable, relationships, schema, aliases) {
67625
+ if (!relationships) {
67626
+ return query;
67627
+ }
67628
+ const tableSets = {};
67629
+ for (let relationship of relationships) {
67630
+ const keyObj = {
67631
+ toTable: relationship.tableName,
67632
+ throughTable: void 0
67633
+ };
67634
+ if (relationship.through) {
67635
+ keyObj.throughTable = relationship.through;
67636
+ }
67637
+ const key = JSON.stringify(keyObj);
67638
+ if (tableSets[key]) {
67639
+ tableSets[key].push(relationship);
67640
+ } else {
67641
+ tableSets[key] = [relationship];
67642
+ }
67643
+ }
67644
+ for (let [key, relationships2] of Object.entries(tableSets)) {
67645
+ const { toTable, throughTable } = JSON.parse(key);
67646
+ const toAlias = aliases?.[toTable] || toTable, throughAlias = aliases?.[throughTable] || throughTable, fromAlias = aliases?.[fromTable] || fromTable;
67647
+ let toTableWithSchema = this.tableNameWithSchema(toTable, {
67648
+ alias: toAlias,
67649
+ schema
67650
+ });
67651
+ let throughTableWithSchema = this.tableNameWithSchema(throughTable, {
67652
+ alias: throughAlias,
67653
+ schema
67654
+ });
67655
+ if (!throughTable) {
67656
+ query = query.leftJoin(toTableWithSchema, function() {
67657
+ for (let relationship of relationships2) {
67658
+ const from = relationship.from, to = relationship.to;
67659
+ this.orOn(`${fromAlias}.${from}`, "=", `${toAlias}.${to}`);
67660
+ }
67661
+ });
67662
+ } else {
67663
+ query = query.leftJoin(throughTableWithSchema, function() {
67664
+ for (let relationship of relationships2) {
67665
+ const fromPrimary = relationship.fromPrimary;
67666
+ const from = relationship.from;
67667
+ this.orOn(
67668
+ `${fromAlias}.${fromPrimary}`,
67669
+ "=",
67670
+ `${throughAlias}.${from}`
67671
+ );
67672
+ }
67673
+ }).leftJoin(toTableWithSchema, function() {
67674
+ for (let relationship of relationships2) {
67675
+ const toPrimary = relationship.toPrimary;
67676
+ const to = relationship.to;
67677
+ this.orOn(`${toAlias}.${toPrimary}`, `${throughAlias}.${to}`);
67678
+ }
67679
+ });
67680
+ }
67681
+ }
67682
+ return query.limit(BASE_LIMIT);
67683
+ }
67684
+ knexWithAlias(knex3, endpoint, aliases) {
67685
+ const tableName = endpoint.entityId;
67686
+ const tableAlias = aliases?.[tableName];
67687
+ const query = knex3(
67688
+ this.tableNameWithSchema(tableName, {
67689
+ alias: tableAlias,
67690
+ schema: endpoint.schema
67691
+ })
67692
+ );
67693
+ return query;
67694
+ }
67695
+ create(knex3, json, opts) {
67696
+ const { endpoint, body: body2 } = json;
67697
+ let query = this.knexWithAlias(knex3, endpoint);
67698
+ const parsedBody = parseBody(body2);
67699
+ for (let [key, value] of Object.entries(parsedBody)) {
67700
+ if (value == null) {
67701
+ delete parsedBody[key];
67702
+ }
67703
+ }
67704
+ if (opts.disableReturning) {
67705
+ return query.insert(parsedBody);
67706
+ } else {
67707
+ return query.insert(parsedBody).returning("*");
67708
+ }
67709
+ }
67710
+ bulkCreate(knex3, json) {
67711
+ const { endpoint, body: body2 } = json;
67712
+ let query = this.knexWithAlias(knex3, endpoint);
67713
+ if (!Array.isArray(body2)) {
67714
+ return query;
67715
+ }
67716
+ const parsedBody = body2.map((row) => parseBody(row));
67717
+ return query.insert(parsedBody);
67718
+ }
67719
+ read(knex3, json, limit) {
67720
+ let { endpoint, resource, filters, paginate, relationships, tableAliases } = json;
67721
+ const tableName = endpoint.entityId;
67722
+ if (!resource) {
67723
+ resource = { fields: [] };
67724
+ }
67725
+ let selectStatement = "*";
67726
+ if (resource.fields && resource.fields.length > 0) {
67727
+ selectStatement = generateSelectStatement(json, knex3);
67728
+ }
67729
+ let foundLimit = limit || BASE_LIMIT;
67730
+ let foundOffset = null;
67731
+ if (paginate && paginate.page && paginate.limit) {
67732
+ const page = paginate.page <= 1 ? 0 : paginate.page - 1;
67733
+ const offset = page * paginate.limit;
67734
+ foundLimit = paginate.limit;
67735
+ foundOffset = offset;
67736
+ } else if (paginate && paginate.limit) {
67737
+ foundLimit = paginate.limit;
67738
+ }
67739
+ let query = this.knexWithAlias(knex3, endpoint, tableAliases);
67740
+ query = query.limit(foundLimit);
67741
+ if (foundOffset) {
67742
+ query = query.offset(foundOffset);
67743
+ }
67744
+ query = this.addFilters(query, filters, json.meta.table, {
67745
+ aliases: tableAliases
67746
+ });
67747
+ query = this.addSorting(query, json);
67748
+ const alias = tableAliases?.[tableName] || tableName;
67749
+ let preQuery = knex3({
67750
+ [alias]: query
67751
+ }).select(selectStatement);
67752
+ if (this.client !== "mssql" /* MS_SQL */) {
67753
+ preQuery = this.addSorting(preQuery, json);
67754
+ }
67755
+ query = this.addRelationships(
67756
+ preQuery,
67757
+ tableName,
67758
+ relationships,
67759
+ endpoint.schema,
67760
+ tableAliases
67761
+ );
67762
+ return this.addFilters(query, filters, json.meta.table, {
67763
+ relationship: true,
67764
+ aliases: tableAliases
67765
+ });
67766
+ }
67767
+ update(knex3, json, opts) {
67768
+ const { endpoint, body: body2, filters, tableAliases } = json;
67769
+ let query = this.knexWithAlias(knex3, endpoint, tableAliases);
67770
+ const parsedBody = parseBody(body2);
67771
+ query = this.addFilters(query, filters, json.meta.table, {
67772
+ aliases: tableAliases
67773
+ });
67774
+ if (opts.disableReturning) {
67775
+ return query.update(parsedBody);
67776
+ } else {
67777
+ return query.update(parsedBody).returning("*");
67778
+ }
67779
+ }
67780
+ delete(knex3, json, opts) {
67781
+ const { endpoint, filters, tableAliases } = json;
67782
+ let query = this.knexWithAlias(knex3, endpoint, tableAliases);
67783
+ query = this.addFilters(query, filters, json.meta.table, {
67784
+ aliases: tableAliases
67785
+ });
67786
+ if (opts.disableReturning) {
67787
+ return query.delete();
67788
+ } else {
67789
+ return query.delete().returning(generateSelectStatement(json, knex3));
67790
+ }
67791
+ }
67792
+ };
67793
+ var SqlQueryBuilder = class extends sqlTable_default {
67794
+ // pass through client to get flavour of SQL
67795
+ constructor(client, limit = BASE_LIMIT) {
67796
+ super(client);
67797
+ this.limit = limit;
67798
+ }
67799
+ /**
67800
+ * @param json The JSON query DSL which is to be converted to SQL.
67801
+ * @param opts extra options which are to be passed into the query builder, e.g. disableReturning
67802
+ * which for the sake of mySQL stops adding the returning statement to inserts, updates and deletes.
67803
+ * @return the query ready to be passed to the driver.
67804
+ */
67805
+ _query(json, opts = {}) {
67806
+ const sqlClient = this.getSqlClient();
67807
+ const config = {
67808
+ client: sqlClient
67809
+ };
67810
+ if (sqlClient === "sqlite3" /* SQL_LITE */) {
67811
+ config.useNullAsDefault = true;
67812
+ }
67813
+ const client = (0, import_knex2.knex)(config);
67814
+ let query;
67815
+ const builder = new InternalBuilder(sqlClient);
67816
+ switch (this._operation(json)) {
67817
+ case "CREATE" /* CREATE */:
67818
+ query = builder.create(client, json, opts);
67819
+ break;
67820
+ case "READ" /* READ */:
67821
+ query = builder.read(client, json, this.limit);
67822
+ break;
67823
+ case "UPDATE" /* UPDATE */:
67824
+ query = builder.update(client, json, opts);
67825
+ break;
67826
+ case "DELETE" /* DELETE */:
67827
+ query = builder.delete(client, json, opts);
67828
+ break;
67829
+ case "BULK_CREATE" /* BULK_CREATE */:
67830
+ query = builder.bulkCreate(client, json);
67831
+ break;
67832
+ case "CREATE_TABLE" /* CREATE_TABLE */:
67833
+ case "UPDATE_TABLE" /* UPDATE_TABLE */:
67834
+ case "DELETE_TABLE" /* DELETE_TABLE */:
67835
+ return this._tableQuery(json);
67836
+ default:
67837
+ throw `Operation type is not supported by SQL query builder`;
67838
+ }
67839
+ if (opts?.disableBindings) {
67840
+ return { sql: query.toString() };
67841
+ } else {
67842
+ let native = getNativeSql(query);
67843
+ if (sqlClient === "sqlite3" /* SQL_LITE */) {
67844
+ native = convertBooleans(native);
67845
+ }
67846
+ return native;
67847
+ }
67848
+ }
67849
+ async getReturningRow(queryFn, json) {
67850
+ if (!json.extra || !json.extra.idFilter) {
67851
+ return {};
67852
+ }
67853
+ const input = this._query({
67854
+ endpoint: {
67855
+ ...json.endpoint,
67856
+ operation: "READ" /* READ */
67857
+ },
67858
+ resource: {
67859
+ fields: []
67860
+ },
67861
+ filters: json.extra?.idFilter,
67862
+ paginate: {
67863
+ limit: 1
67864
+ },
67865
+ meta: json.meta
67866
+ });
67867
+ return queryFn(input, "READ" /* READ */);
67868
+ }
67869
+ // when creating if an ID has been inserted need to make sure
67870
+ // the id filter is enriched with it before trying to retrieve the row
67871
+ checkLookupKeys(id, json) {
67872
+ if (!id || !json.meta.table || !json.meta.table.primary) {
67873
+ return json;
67874
+ }
67875
+ const primaryKey = json.meta.table.primary?.[0];
67876
+ json.extra = {
67877
+ idFilter: {
67878
+ equal: {
67879
+ [primaryKey]: id
67880
+ }
67881
+ }
67882
+ };
67883
+ return json;
67884
+ }
67885
+ // this function recreates the returning functionality of postgres
67886
+ async queryWithReturning(json, queryFn, processFn = (result) => result) {
67887
+ const sqlClient = this.getSqlClient();
67888
+ const operation = this._operation(json);
67889
+ const input = this._query(json, { disableReturning: true });
67890
+ if (Array.isArray(input)) {
67891
+ const responses = [];
67892
+ for (let query of input) {
67893
+ responses.push(await queryFn(query, operation));
67894
+ }
67895
+ return responses;
67896
+ }
67897
+ let row;
67898
+ if (operation === "DELETE" /* DELETE */) {
67899
+ row = processFn(await this.getReturningRow(queryFn, json));
67900
+ }
67901
+ const response = await queryFn(input, operation);
67902
+ const results = processFn(response);
67903
+ if (operation === "CREATE" /* CREATE */ || operation === "UPDATE" /* UPDATE */) {
67904
+ let id;
67905
+ if (sqlClient === "mssql" /* MS_SQL */) {
67906
+ id = results?.[0].id;
67907
+ } else if (sqlClient === "mysql2" /* MY_SQL */) {
67908
+ id = results?.insertId;
67909
+ }
67910
+ row = processFn(
67911
+ await this.getReturningRow(queryFn, this.checkLookupKeys(id, json))
67912
+ );
67913
+ }
67914
+ if (operation !== "READ" /* READ */) {
67915
+ return row;
67916
+ }
67917
+ return results.length ? results : [{ [operation.toLowerCase()]: true }];
67918
+ }
67919
+ convertJsonStringColumns(table, results, aliases) {
67920
+ const tableName = getTableName(table);
67921
+ for (const [name, field] of Object.entries(table.schema)) {
67922
+ if (!this._isJsonColumn(field)) {
67923
+ continue;
67924
+ }
67925
+ const aliasedTableName = tableName && aliases?.[tableName] || tableName;
67926
+ const fullName = `${aliasedTableName}.${name}`;
67927
+ for (let row of results) {
67928
+ if (typeof row[fullName] === "string") {
67929
+ row[fullName] = JSON.parse(row[fullName]);
67930
+ }
67931
+ if (typeof row[name] === "string") {
67932
+ row[name] = JSON.parse(row[name]);
67933
+ }
67934
+ }
67935
+ }
67936
+ return results;
67937
+ }
67938
+ _isJsonColumn(field) {
67939
+ return JsonTypes.includes(field.type) && !helpers_exports.schema.isDeprecatedSingleUserColumn(field);
67940
+ }
67941
+ log(query, values2) {
67942
+ if (!environment_default.SQL_LOGGING_ENABLE) {
67943
+ return;
67944
+ }
67945
+ const sqlClient = this.getSqlClient();
67946
+ let string = `[SQL] [${sqlClient.toUpperCase()}] query="${query}"`;
67947
+ if (values2) {
67948
+ string += ` values="${values2.join(", ")}"`;
67949
+ }
67950
+ console.log(string);
67951
+ }
67952
+ };
67953
+ var sql_default = SqlQueryBuilder;
67954
+
67955
+ // src/sql/designDoc.ts
67956
+ var designDoc_exports = {};
67957
+ __export(designDoc_exports, {
67958
+ base: () => base
67959
+ });
67960
+ function base(tableIdProp) {
67961
+ return {
67962
+ _id: SQLITE_DESIGN_DOC_ID,
67963
+ language: "sqlite",
67964
+ sql: {
67965
+ tables: {},
67966
+ options: {
67967
+ table_name: tableIdProp
67968
+ }
67969
+ }
67970
+ };
67971
+ }
67972
+
66741
67973
  // src/index.ts
66742
67974
  var tenancy = {
66743
67975
  ...tenancy_exports,
@@ -66757,6 +67989,11 @@ var init9 = (opts = {}) => {
66757
67989
  BudibaseError,
66758
67990
  Config,
66759
67991
  Cookie,
67992
+ DEFAULT_BB_DATASOURCE_ID,
67993
+ DEFAULT_EMPLOYEE_TABLE_ID,
67994
+ DEFAULT_EXPENSES_TABLE_ID,
67995
+ DEFAULT_INVENTORY_TABLE_ID,
67996
+ DEFAULT_JOBS_TABLE_ID,
66760
67997
  DEFAULT_TENANT_ID,
66761
67998
  DeprecatedViews,
66762
67999
  DocumentType,
@@ -66776,6 +68013,7 @@ var init9 = (opts = {}) => {
66776
68013
  RedisClient,
66777
68014
  SEPARATOR,
66778
68015
  SQLITE_DESIGN_DOC_ID,
68016
+ SQS_DATASOURCE_INTERNAL,
66779
68017
  StaticDatabases,
66780
68018
  UNICODE_MAX,
66781
68019
  UsageLimitError,
@@ -66813,6 +68051,7 @@ var init9 = (opts = {}) => {
66813
68051
  roles,
66814
68052
  security,
66815
68053
  sessions,
68054
+ sql,
66816
68055
  tenancy,
66817
68056
  timers,
66818
68057
  userUtils,