@relq/orm 0.1.0

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 (254) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +236 -0
  3. package/dist/cjs/__test-types.cjs +17 -0
  4. package/dist/cjs/addon/cursor.cjs +1473 -0
  5. package/dist/cjs/addon/pg.cjs +4969 -0
  6. package/dist/cjs/cache/index.cjs +9 -0
  7. package/dist/cjs/cache/query-cache.cjs +311 -0
  8. package/dist/cjs/condition/array-condition-builder.cjs +527 -0
  9. package/dist/cjs/condition/array-numeric-condition-builder.cjs +186 -0
  10. package/dist/cjs/condition/array-specialized-condition-builder.cjs +206 -0
  11. package/dist/cjs/condition/array-string-condition-builder.cjs +146 -0
  12. package/dist/cjs/condition/base-condition-builder.cjs +2 -0
  13. package/dist/cjs/condition/condition-collector.cjs +461 -0
  14. package/dist/cjs/condition/fulltext-condition-builder.cjs +61 -0
  15. package/dist/cjs/condition/geometric-condition-builder.cjs +228 -0
  16. package/dist/cjs/condition/index.cjs +29 -0
  17. package/dist/cjs/condition/jsonb-condition-builder.cjs +448 -0
  18. package/dist/cjs/condition/network-condition-builder.cjs +237 -0
  19. package/dist/cjs/condition/postgis-condition-builder.cjs +188 -0
  20. package/dist/cjs/condition/range-condition-builder.cjs +98 -0
  21. package/dist/cjs/core/helpers/ConnectedAggregateBuilder.cjs +132 -0
  22. package/dist/cjs/core/helpers/ConnectedCTEBuilder.cjs +53 -0
  23. package/dist/cjs/core/helpers/ConnectedCountBuilder.cjs +73 -0
  24. package/dist/cjs/core/helpers/ConnectedDeleteBuilder.cjs +65 -0
  25. package/dist/cjs/core/helpers/ConnectedInsertBuilder.cjs +112 -0
  26. package/dist/cjs/core/helpers/ConnectedInsertFromSelectBuilder.cjs +66 -0
  27. package/dist/cjs/core/helpers/ConnectedQueryBuilder.cjs +146 -0
  28. package/dist/cjs/core/helpers/ConnectedRawQueryBuilder.cjs +46 -0
  29. package/dist/cjs/core/helpers/ConnectedSelectBuilder.cjs +331 -0
  30. package/dist/cjs/core/helpers/ConnectedTransactionBuilder.cjs +105 -0
  31. package/dist/cjs/core/helpers/ConnectedUpdateBuilder.cjs +79 -0
  32. package/dist/cjs/core/helpers/PaginateBuilder.cjs +178 -0
  33. package/dist/cjs/core/helpers/ReturningExecutor.cjs +70 -0
  34. package/dist/cjs/core/helpers/capability-guard.cjs +10 -0
  35. package/dist/cjs/core/helpers/index.cjs +31 -0
  36. package/dist/cjs/core/helpers/methods.cjs +10 -0
  37. package/dist/cjs/core/helpers/query-convenience.cjs +238 -0
  38. package/dist/cjs/core/helpers/select-joins.cjs +251 -0
  39. package/dist/cjs/core/helpers/select-pagination.cjs +233 -0
  40. package/dist/cjs/core/helpers/select-types.cjs +2 -0
  41. package/dist/cjs/core/pg-family/cockroachdb-client/capabilities.cjs +31 -0
  42. package/dist/cjs/core/pg-family/cockroachdb-client/index.cjs +7 -0
  43. package/dist/cjs/core/pg-family/cockroachdb-client/relq-cockroach.cjs +16 -0
  44. package/dist/cjs/core/pg-family/dsql-client/capabilities.cjs +31 -0
  45. package/dist/cjs/core/pg-family/dsql-client/index.cjs +7 -0
  46. package/dist/cjs/core/pg-family/dsql-client/relq-dsql.cjs +16 -0
  47. package/dist/cjs/core/pg-family/index.cjs +19 -0
  48. package/dist/cjs/core/pg-family/nile-client/capabilities.cjs +31 -0
  49. package/dist/cjs/core/pg-family/nile-client/index.cjs +7 -0
  50. package/dist/cjs/core/pg-family/nile-client/relq-nile.cjs +36 -0
  51. package/dist/cjs/core/pg-family/nile-client/tenant-context.cjs +44 -0
  52. package/dist/cjs/core/pg-family/pg-client/capabilities.cjs +31 -0
  53. package/dist/cjs/core/pg-family/pg-client/index.cjs +7 -0
  54. package/dist/cjs/core/pg-family/pg-client/relq-postgres.cjs +43 -0
  55. package/dist/cjs/core/pg-family/shared/pg-base.cjs +385 -0
  56. package/dist/cjs/core/pg-family/shared/pg-dialect.cjs +67 -0
  57. package/dist/cjs/core/pg-family/shared/pg-error-parser.cjs +34 -0
  58. package/dist/cjs/core/pg-family/shared/pg-type-coercion.cjs +14 -0
  59. package/dist/cjs/core/relq-base.cjs +307 -0
  60. package/dist/cjs/core/relq-client.cjs +56 -0
  61. package/dist/cjs/core/shared/cleanup.cjs +36 -0
  62. package/dist/cjs/core/shared/column-mapping.cjs +97 -0
  63. package/dist/cjs/core/shared/errors.cjs +17 -0
  64. package/dist/cjs/core/shared/index.cjs +24 -0
  65. package/dist/cjs/core/shared/table-accessor.cjs +22 -0
  66. package/dist/cjs/core/shared/transform.cjs +35 -0
  67. package/dist/cjs/core/shared/types.cjs +2 -0
  68. package/dist/cjs/core/shared/validation.cjs +140 -0
  69. package/dist/cjs/core/types/core.types.cjs +2 -0
  70. package/dist/cjs/count/count-builder.cjs +88 -0
  71. package/dist/cjs/count/index.cjs +5 -0
  72. package/dist/cjs/delete/delete-builder.cjs +176 -0
  73. package/dist/cjs/delete/index.cjs +5 -0
  74. package/dist/cjs/explain/explain-builder.cjs +99 -0
  75. package/dist/cjs/explain/index.cjs +5 -0
  76. package/dist/cjs/index.cjs +26 -0
  77. package/dist/cjs/insert/conflict-builder.cjs +213 -0
  78. package/dist/cjs/insert/index.cjs +5 -0
  79. package/dist/cjs/insert/insert-builder.cjs +320 -0
  80. package/dist/cjs/insert/insert-from-select-builder.cjs +86 -0
  81. package/dist/cjs/pubsub/index.cjs +7 -0
  82. package/dist/cjs/pubsub/listen-notify-builder.cjs +57 -0
  83. package/dist/cjs/pubsub/listener-connection.cjs +180 -0
  84. package/dist/cjs/raw/index.cjs +8 -0
  85. package/dist/cjs/raw/raw-query-builder.cjs +27 -0
  86. package/dist/cjs/raw/sql-template.cjs +73 -0
  87. package/dist/cjs/select/aggregate-builder.cjs +179 -0
  88. package/dist/cjs/select/index.cjs +16 -0
  89. package/dist/cjs/select/join-builder.cjs +192 -0
  90. package/dist/cjs/select/join-condition-builder.cjs +189 -0
  91. package/dist/cjs/select/join-internals.cjs +5 -0
  92. package/dist/cjs/select/join-many-condition-builder.cjs +159 -0
  93. package/dist/cjs/select/scalar-query-builder.cjs +134 -0
  94. package/dist/cjs/select/scalar-select-builder.cjs +78 -0
  95. package/dist/cjs/select/select-builder.cjs +426 -0
  96. package/dist/cjs/select/sql-expression.cjs +38 -0
  97. package/dist/cjs/select/table-proxy.cjs +99 -0
  98. package/dist/cjs/shared/aws-dsql.cjs +181 -0
  99. package/dist/cjs/shared/errors/relq-errors.cjs +361 -0
  100. package/dist/cjs/shared/pg-format.cjs +383 -0
  101. package/dist/cjs/shared/types/config-types.cjs +51 -0
  102. package/dist/cjs/transaction/index.cjs +6 -0
  103. package/dist/cjs/transaction/transaction-builder.cjs +78 -0
  104. package/dist/cjs/types/aggregate-types.cjs +2 -0
  105. package/dist/cjs/types/inference-types.cjs +18 -0
  106. package/dist/cjs/types/pagination-types.cjs +7 -0
  107. package/dist/cjs/types/result-types.cjs +2 -0
  108. package/dist/cjs/types/scalar-types.cjs +2 -0
  109. package/dist/cjs/types/schema-types.cjs +2 -0
  110. package/dist/cjs/types/subscription-types.cjs +2 -0
  111. package/dist/cjs/types.cjs +2 -0
  112. package/dist/cjs/update/array-update-builder.cjs +232 -0
  113. package/dist/cjs/update/index.cjs +16 -0
  114. package/dist/cjs/update/jsonb-update-builder.cjs +219 -0
  115. package/dist/cjs/update/update-builder.cjs +274 -0
  116. package/dist/cjs/utils/addon/pg/cursor.cjs +8 -0
  117. package/dist/cjs/utils/addon/pg/pg.cjs +23 -0
  118. package/dist/cjs/utils/case-converter.cjs +58 -0
  119. package/dist/cjs/utils/env-resolver.cjs +226 -0
  120. package/dist/cjs/utils/environment-detection.cjs +124 -0
  121. package/dist/cjs/utils/fk-resolver.cjs +186 -0
  122. package/dist/cjs/utils/index.cjs +25 -0
  123. package/dist/cjs/utils/pool-defaults.cjs +91 -0
  124. package/dist/cjs/utils/type-coercion.cjs +120 -0
  125. package/dist/cjs/window/index.cjs +5 -0
  126. package/dist/cjs/window/window-builder.cjs +80 -0
  127. package/dist/esm/__test-types.js +15 -0
  128. package/dist/esm/addon/cursor.js +1440 -0
  129. package/dist/esm/addon/pg.js +4931 -0
  130. package/dist/esm/cache/index.js +1 -0
  131. package/dist/esm/cache/query-cache.js +303 -0
  132. package/dist/esm/condition/array-condition-builder.js +519 -0
  133. package/dist/esm/condition/array-numeric-condition-builder.js +182 -0
  134. package/dist/esm/condition/array-specialized-condition-builder.js +200 -0
  135. package/dist/esm/condition/array-string-condition-builder.js +142 -0
  136. package/dist/esm/condition/base-condition-builder.js +1 -0
  137. package/dist/esm/condition/condition-collector.js +452 -0
  138. package/dist/esm/condition/fulltext-condition-builder.js +53 -0
  139. package/dist/esm/condition/geometric-condition-builder.js +220 -0
  140. package/dist/esm/condition/index.js +8 -0
  141. package/dist/esm/condition/jsonb-condition-builder.js +439 -0
  142. package/dist/esm/condition/network-condition-builder.js +229 -0
  143. package/dist/esm/condition/postgis-condition-builder.js +180 -0
  144. package/dist/esm/condition/range-condition-builder.js +90 -0
  145. package/dist/esm/core/helpers/ConnectedAggregateBuilder.js +128 -0
  146. package/dist/esm/core/helpers/ConnectedCTEBuilder.js +49 -0
  147. package/dist/esm/core/helpers/ConnectedCountBuilder.js +69 -0
  148. package/dist/esm/core/helpers/ConnectedDeleteBuilder.js +61 -0
  149. package/dist/esm/core/helpers/ConnectedInsertBuilder.js +108 -0
  150. package/dist/esm/core/helpers/ConnectedInsertFromSelectBuilder.js +62 -0
  151. package/dist/esm/core/helpers/ConnectedQueryBuilder.js +142 -0
  152. package/dist/esm/core/helpers/ConnectedRawQueryBuilder.js +42 -0
  153. package/dist/esm/core/helpers/ConnectedSelectBuilder.js +327 -0
  154. package/dist/esm/core/helpers/ConnectedTransactionBuilder.js +100 -0
  155. package/dist/esm/core/helpers/ConnectedUpdateBuilder.js +75 -0
  156. package/dist/esm/core/helpers/PaginateBuilder.js +174 -0
  157. package/dist/esm/core/helpers/ReturningExecutor.js +66 -0
  158. package/dist/esm/core/helpers/capability-guard.js +7 -0
  159. package/dist/esm/core/helpers/index.js +13 -0
  160. package/dist/esm/core/helpers/methods.js +6 -0
  161. package/dist/esm/core/helpers/query-convenience.js +194 -0
  162. package/dist/esm/core/helpers/select-joins.js +246 -0
  163. package/dist/esm/core/helpers/select-pagination.js +226 -0
  164. package/dist/esm/core/helpers/select-types.js +1 -0
  165. package/dist/esm/core/pg-family/cockroachdb-client/capabilities.js +28 -0
  166. package/dist/esm/core/pg-family/cockroachdb-client/index.js +2 -0
  167. package/dist/esm/core/pg-family/cockroachdb-client/relq-cockroach.js +12 -0
  168. package/dist/esm/core/pg-family/dsql-client/capabilities.js +28 -0
  169. package/dist/esm/core/pg-family/dsql-client/index.js +2 -0
  170. package/dist/esm/core/pg-family/dsql-client/relq-dsql.js +12 -0
  171. package/dist/esm/core/pg-family/index.js +6 -0
  172. package/dist/esm/core/pg-family/nile-client/capabilities.js +28 -0
  173. package/dist/esm/core/pg-family/nile-client/index.js +2 -0
  174. package/dist/esm/core/pg-family/nile-client/relq-nile.js +32 -0
  175. package/dist/esm/core/pg-family/nile-client/tenant-context.js +40 -0
  176. package/dist/esm/core/pg-family/pg-client/capabilities.js +28 -0
  177. package/dist/esm/core/pg-family/pg-client/index.js +2 -0
  178. package/dist/esm/core/pg-family/pg-client/relq-postgres.js +39 -0
  179. package/dist/esm/core/pg-family/shared/pg-base.js +347 -0
  180. package/dist/esm/core/pg-family/shared/pg-dialect.js +63 -0
  181. package/dist/esm/core/pg-family/shared/pg-error-parser.js +29 -0
  182. package/dist/esm/core/pg-family/shared/pg-type-coercion.js +6 -0
  183. package/dist/esm/core/relq-base.js +270 -0
  184. package/dist/esm/core/relq-client.js +48 -0
  185. package/dist/esm/core/shared/cleanup.js +27 -0
  186. package/dist/esm/core/shared/column-mapping.js +90 -0
  187. package/dist/esm/core/shared/errors.js +13 -0
  188. package/dist/esm/core/shared/index.js +6 -0
  189. package/dist/esm/core/shared/table-accessor.js +19 -0
  190. package/dist/esm/core/shared/transform.js +30 -0
  191. package/dist/esm/core/shared/types.js +1 -0
  192. package/dist/esm/core/shared/validation.js +136 -0
  193. package/dist/esm/core/types/core.types.js +1 -0
  194. package/dist/esm/count/count-builder.js +81 -0
  195. package/dist/esm/count/index.js +1 -0
  196. package/dist/esm/delete/delete-builder.js +169 -0
  197. package/dist/esm/delete/index.js +1 -0
  198. package/dist/esm/explain/explain-builder.js +95 -0
  199. package/dist/esm/explain/index.js +1 -0
  200. package/dist/esm/index.js +7 -0
  201. package/dist/esm/insert/conflict-builder.js +202 -0
  202. package/dist/esm/insert/index.js +1 -0
  203. package/dist/esm/insert/insert-builder.js +313 -0
  204. package/dist/esm/insert/insert-from-select-builder.js +79 -0
  205. package/dist/esm/pubsub/index.js +1 -0
  206. package/dist/esm/pubsub/listen-notify-builder.js +48 -0
  207. package/dist/esm/pubsub/listener-connection.js +173 -0
  208. package/dist/esm/raw/index.js +2 -0
  209. package/dist/esm/raw/raw-query-builder.js +20 -0
  210. package/dist/esm/raw/sql-template.js +66 -0
  211. package/dist/esm/select/aggregate-builder.js +172 -0
  212. package/dist/esm/select/index.js +4 -0
  213. package/dist/esm/select/join-builder.js +184 -0
  214. package/dist/esm/select/join-condition-builder.js +181 -0
  215. package/dist/esm/select/join-internals.js +2 -0
  216. package/dist/esm/select/join-many-condition-builder.js +151 -0
  217. package/dist/esm/select/scalar-query-builder.js +126 -0
  218. package/dist/esm/select/scalar-select-builder.js +70 -0
  219. package/dist/esm/select/select-builder.js +419 -0
  220. package/dist/esm/select/sql-expression.js +33 -0
  221. package/dist/esm/select/table-proxy.js +91 -0
  222. package/dist/esm/shared/aws-dsql.js +140 -0
  223. package/dist/esm/shared/errors/relq-errors.js +339 -0
  224. package/dist/esm/shared/pg-format.js +375 -0
  225. package/dist/esm/shared/types/config-types.js +46 -0
  226. package/dist/esm/transaction/index.js +1 -0
  227. package/dist/esm/transaction/transaction-builder.js +70 -0
  228. package/dist/esm/types/aggregate-types.js +1 -0
  229. package/dist/esm/types/inference-types.js +12 -0
  230. package/dist/esm/types/pagination-types.js +4 -0
  231. package/dist/esm/types/result-types.js +1 -0
  232. package/dist/esm/types/scalar-types.js +1 -0
  233. package/dist/esm/types/schema-types.js +1 -0
  234. package/dist/esm/types/subscription-types.js +1 -0
  235. package/dist/esm/types.js +1 -0
  236. package/dist/esm/update/array-update-builder.js +219 -0
  237. package/dist/esm/update/index.js +3 -0
  238. package/dist/esm/update/jsonb-update-builder.js +211 -0
  239. package/dist/esm/update/update-builder.js +267 -0
  240. package/dist/esm/utils/addon/pg/cursor.js +1 -0
  241. package/dist/esm/utils/addon/pg/pg.js +2 -0
  242. package/dist/esm/utils/case-converter.js +55 -0
  243. package/dist/esm/utils/env-resolver.js +213 -0
  244. package/dist/esm/utils/environment-detection.js +114 -0
  245. package/dist/esm/utils/fk-resolver.js +178 -0
  246. package/dist/esm/utils/index.js +4 -0
  247. package/dist/esm/utils/pool-defaults.js +85 -0
  248. package/dist/esm/utils/type-coercion.js +112 -0
  249. package/dist/esm/window/index.js +1 -0
  250. package/dist/esm/window/window-builder.js +73 -0
  251. package/dist/index.cjs +1 -0
  252. package/dist/index.d.ts +7281 -0
  253. package/dist/index.js +1 -0
  254. package/package.json +52 -0
@@ -0,0 +1,307 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.RelqBase = void 0;
37
+ const node_events_1 = require("node:events");
38
+ const relq_errors_1 = require("../shared/errors/relq-errors.cjs");
39
+ const condition_collector_1 = require("../condition/condition-collector.cjs");
40
+ const helpers_1 = require("./helpers/index.cjs");
41
+ const scalar_select_builder_1 = require("../select/scalar-select-builder.cjs");
42
+ const column_mapping_1 = require("./shared/column-mapping.cjs");
43
+ const validation_1 = require("./shared/validation.cjs");
44
+ const table_accessor_1 = require("./shared/table-accessor.cjs");
45
+ const cleanup_1 = require("./shared/cleanup.cjs");
46
+ class RelqBase {
47
+ config;
48
+ schema;
49
+ emitter = new node_events_1.EventEmitter();
50
+ _defaultErrorHandler = () => { };
51
+ columnMappings = new Map();
52
+ initialized = false;
53
+ initPromise;
54
+ _isClosed = false;
55
+ constructor(schema, config) {
56
+ this.config = config;
57
+ this.schema = schema;
58
+ this.emitter.on('error', this._defaultErrorHandler);
59
+ if (schema) {
60
+ const log = config.logLevel === 'debug'
61
+ ? (...args) => (0, helpers_1.debugLog)(config, ...args)
62
+ : undefined;
63
+ (0, column_mapping_1.buildColumnMappings)(schema, this.columnMappings, log);
64
+ }
65
+ (0, cleanup_1.registerInstance)(this);
66
+ }
67
+ async ensureInitialized() {
68
+ if (this.initialized)
69
+ return;
70
+ if (this.initPromise)
71
+ return this.initPromise;
72
+ this.initPromise = (async () => {
73
+ await this._initialize();
74
+ this.initialized = true;
75
+ })();
76
+ return this.initPromise;
77
+ }
78
+ _transformToDbColumns(tableName, data) {
79
+ return (0, column_mapping_1.transformToDbColumns)(tableName, data, this.columnMappings);
80
+ }
81
+ _transformFromDbColumns(tableName, data) {
82
+ return (0, column_mapping_1.transformFromDbColumns)(tableName, data, this.columnMappings);
83
+ }
84
+ _transformResultsFromDb(tableName, rows) {
85
+ return (0, column_mapping_1.transformResultsFromDb)(tableName, rows, this.columnMappings);
86
+ }
87
+ _hasColumnMapping() {
88
+ return (0, column_mapping_1.hasColumnMapping)(this.columnMappings);
89
+ }
90
+ _validateData(tableName, data, operation) {
91
+ (0, validation_1.validateData)(tableName, data, operation, this.columnMappings, this.config);
92
+ }
93
+ _getSchema() {
94
+ if (!this.schema)
95
+ return undefined;
96
+ return this.schema.tables || this.schema;
97
+ }
98
+ _getRelations() {
99
+ return this.config.relations;
100
+ }
101
+ _getTableDef(tableKey) {
102
+ const schema = this._getSchema();
103
+ if (!schema)
104
+ return undefined;
105
+ return schema[tableKey];
106
+ }
107
+ get [helpers_1.INTERNAL]() {
108
+ return {
109
+ executeSelect: this._executeSelect.bind(this),
110
+ executeSelectOne: this._executeSelectOne.bind(this),
111
+ executeCount: this._executeCount.bind(this),
112
+ executeRun: this._executeRun.bind(this),
113
+ executeQuery: this._executeQuery.bind(this),
114
+ transformToDbColumns: this._transformToDbColumns.bind(this),
115
+ transformFromDbColumns: this._transformFromDbColumns.bind(this),
116
+ transformResultsFromDb: this._transformResultsFromDb.bind(this),
117
+ hasColumnMapping: this._hasColumnMapping.bind(this),
118
+ getClientForCursor: this._acquireClient.bind(this),
119
+ validateData: this._validateData.bind(this),
120
+ getSchema: this._getSchema.bind(this),
121
+ getRelations: this._getRelations.bind(this),
122
+ getTableDef: this._getTableDef.bind(this)
123
+ };
124
+ }
125
+ async _executeQuery(sql) {
126
+ if (!sql || typeof sql !== 'string' || sql.trim() === '') {
127
+ throw new relq_errors_1.RelqConnectionError(`Invalid SQL query: ${sql === null ? 'null' : sql === undefined ? 'undefined' : 'empty string'}`);
128
+ }
129
+ await this.ensureInitialized();
130
+ const startTime = performance.now();
131
+ const retryConfig = this.config.retry;
132
+ if (!retryConfig) {
133
+ const result = await this._query(sql);
134
+ return { result, duration: performance.now() - startTime };
135
+ }
136
+ const opts = typeof retryConfig === 'object'
137
+ ? { maxRetries: retryConfig.maxRetries ?? 3, initialDelayMs: retryConfig.initialDelayMs ?? 250, maxDelayMs: retryConfig.maxDelayMs ?? 5000 }
138
+ : { maxRetries: 3, initialDelayMs: 250, maxDelayMs: 5000 };
139
+ let lastError;
140
+ for (let attempt = 0; attempt <= opts.maxRetries; attempt++) {
141
+ try {
142
+ const result = await this._query(sql);
143
+ return { result, duration: performance.now() - startTime };
144
+ }
145
+ catch (error) {
146
+ lastError = error;
147
+ if (attempt < opts.maxRetries && isTransientError(error)) {
148
+ const delay = Math.min(opts.initialDelayMs * 2 ** attempt, opts.maxDelayMs);
149
+ (0, helpers_1.debugLog)(this.config, `Transient error (attempt ${attempt + 1}/${opts.maxRetries}), retrying in ${delay}ms: ${error.code || error.message}`);
150
+ await sleep(delay);
151
+ continue;
152
+ }
153
+ throw error;
154
+ }
155
+ }
156
+ throw lastError;
157
+ }
158
+ buildMetadata(result, duration) {
159
+ return {
160
+ rowCount: result.rowCount,
161
+ command: result.command,
162
+ duration,
163
+ fields: result.fields
164
+ };
165
+ }
166
+ async _executeSelect(sql, tableName) {
167
+ const { result, duration } = await this._executeQuery(sql);
168
+ const rows = tableName
169
+ ? this._transformResultsFromDb(tableName, result.rows)
170
+ : result.rows;
171
+ return {
172
+ data: rows,
173
+ metadata: this.buildMetadata(result, duration)
174
+ };
175
+ }
176
+ async _executeSelectOne(sql, tableName) {
177
+ const { result, duration } = await this._executeQuery(sql);
178
+ const row = result.rows[0]
179
+ ? (tableName ? this._transformFromDbColumns(tableName, result.rows[0]) : result.rows[0])
180
+ : null;
181
+ return {
182
+ data: row,
183
+ metadata: this.buildMetadata(result, duration)
184
+ };
185
+ }
186
+ async _executeCount(sql) {
187
+ const { result, duration } = await this._executeQuery(sql);
188
+ const count = result.rows[0]?.count
189
+ ? parseInt(result.rows[0].count, 10)
190
+ : 0;
191
+ return {
192
+ count,
193
+ metadata: this.buildMetadata(result, duration)
194
+ };
195
+ }
196
+ async _executeRun(sql) {
197
+ const { result, duration } = await this._executeQuery(sql);
198
+ return {
199
+ success: true,
200
+ metadata: this.buildMetadata(result, duration)
201
+ };
202
+ }
203
+ get table() {
204
+ return (0, table_accessor_1.createTableAccessor)(this, this.schema);
205
+ }
206
+ raw(query, ...params) {
207
+ return new helpers_1.ConnectedRawQueryBuilder(query, params, this);
208
+ }
209
+ async transaction(callback) {
210
+ const { executeTransaction } = await Promise.resolve().then(() => __importStar(require("./helpers/ConnectedTransactionBuilder.cjs")));
211
+ return executeTransaction(this, callback);
212
+ }
213
+ with(name, query) {
214
+ return new helpers_1.ConnectedCTEBuilder(this).with(name, query);
215
+ }
216
+ async ctAs(tableName, query, options = {}) {
217
+ const queryStr = typeof query === 'string' ? query : query.toString();
218
+ const temp = options.temporary ? 'TEMPORARY ' : '';
219
+ const ifNotExists = options.ifNotExists ? 'IF NOT EXISTS ' : '';
220
+ const sql = `CREATE ${temp}TABLE ${ifNotExists}"${tableName}" AS ${queryStr}`;
221
+ await this[helpers_1.INTERNAL].executeQuery(sql);
222
+ }
223
+ async explain(query, options = {}) {
224
+ const queryStr = typeof query === 'string' ? query : query.toString();
225
+ const parts = ['EXPLAIN'];
226
+ if (options.format)
227
+ parts.push(`(FORMAT ${options.format.toUpperCase()}`);
228
+ if (options.analyze)
229
+ parts.push(options.format ? ', ANALYZE' : '(ANALYZE');
230
+ if (options.verbose)
231
+ parts.push(options.format || options.analyze ? ', VERBOSE' : '(VERBOSE');
232
+ if (options.format || options.analyze || options.verbose)
233
+ parts.push(')');
234
+ const sql = `${parts.join(' ')} ${queryStr}`;
235
+ const { result } = await this._executeQuery(sql);
236
+ if (options.format === 'json') {
237
+ return result.rows;
238
+ }
239
+ return result.rows.map((r) => r['QUERY PLAN'] || Object.values(r)[0]).join('\n');
240
+ }
241
+ scalar(scalars) {
242
+ const schema = this._getSchema();
243
+ return new scalar_select_builder_1.ConnectedScalarSelectBuilder(scalars, schema, {
244
+ executeSelectOne: this[helpers_1.INTERNAL].executeSelect.bind(this),
245
+ hasColumnMapping: this._hasColumnMapping.bind(this),
246
+ transformToDbColumns: this._transformToDbColumns.bind(this)
247
+ });
248
+ }
249
+ where(_tableName) {
250
+ return new condition_collector_1.ConditionCollector();
251
+ }
252
+ on(event, listener) {
253
+ this.emitter.on(event, listener);
254
+ return this;
255
+ }
256
+ once(event, listener) {
257
+ this.emitter.once(event, listener);
258
+ return this;
259
+ }
260
+ off(event, listener) {
261
+ this.emitter.off(event, listener);
262
+ return this;
263
+ }
264
+ async close() {
265
+ if (!this.initialized || this._isClosed)
266
+ return;
267
+ try {
268
+ await this._close();
269
+ this._isClosed = true;
270
+ (0, cleanup_1.unregisterInstance)(this);
271
+ }
272
+ catch (error) {
273
+ console.error('Error closing database connection:', error);
274
+ throw error;
275
+ }
276
+ }
277
+ get closed() {
278
+ return this._isClosed;
279
+ }
280
+ }
281
+ exports.RelqBase = RelqBase;
282
+ const TRANSIENT_NETWORK_CODES = new Set([
283
+ 'ECONNRESET', 'ECONNREFUSED', 'ENOTFOUND', 'ESERVFAIL',
284
+ 'ETIMEDOUT', 'EPIPE', 'EAI_AGAIN', 'EHOSTUNREACH',
285
+ 'CONNECTION_LOST', 'PROTOCOL_CONNECTION_LOST',
286
+ ]);
287
+ const TRANSIENT_PG_CODES = new Set([
288
+ '40P01',
289
+ '40001',
290
+ '08006',
291
+ '08001',
292
+ '08004',
293
+ '57P01',
294
+ '57P03',
295
+ ]);
296
+ function isTransientError(error) {
297
+ if (TRANSIENT_NETWORK_CODES.has(error.code))
298
+ return true;
299
+ if (error.cause && TRANSIENT_NETWORK_CODES.has(error.cause.code))
300
+ return true;
301
+ if (TRANSIENT_PG_CODES.has(error.code))
302
+ return true;
303
+ return false;
304
+ }
305
+ function sleep(ms) {
306
+ return new Promise(resolve => setTimeout(resolve, ms));
307
+ }
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RelqBase = exports.RelqCockroachDB = exports.RelqDsql = exports.RelqNile = exports.RelqPostgres = exports.Relq = void 0;
4
+ const pg_client_1 = require("./pg-family/pg-client/index.cjs");
5
+ const nile_client_1 = require("./pg-family/nile-client/index.cjs");
6
+ const dsql_client_1 = require("./pg-family/dsql-client/index.cjs");
7
+ const cockroachdb_client_1 = require("./pg-family/cockroachdb-client/index.cjs");
8
+ const relq_errors_1 = require("../shared/errors/relq-errors.cjs");
9
+ class RelqImpl {
10
+ constructor(schema, dialect, options) {
11
+ const opts = options ?? {};
12
+ switch (dialect) {
13
+ case 'postgres':
14
+ return new pg_client_1.RelqPostgres(schema, { ...opts, dialect: 'postgres' });
15
+ case 'nile':
16
+ return new nile_client_1.RelqNile(schema, { ...opts, dialect: 'nile' });
17
+ case 'cockroachdb':
18
+ return new cockroachdb_client_1.RelqCockroachDB(schema, { ...opts, dialect: 'cockroachdb' });
19
+ case 'awsdsql':
20
+ return new dsql_client_1.RelqDsql(schema, { ...opts, dialect: 'awsdsql' });
21
+ case 'sqlite':
22
+ throw new relq_errors_1.RelqConfigError(`Dialect "sqlite" is not yet implemented. ` +
23
+ `Currently supported: postgres, nile, cockroachdb, awsdsql`, { field: 'dialect', value: dialect });
24
+ case 'turso':
25
+ throw new relq_errors_1.RelqConfigError(`Dialect "turso" is not yet implemented. ` +
26
+ `Currently supported: postgres, nile, cockroachdb, awsdsql`, { field: 'dialect', value: dialect });
27
+ case 'mysql':
28
+ throw new relq_errors_1.RelqConfigError(`Dialect "mysql" is not yet implemented. ` +
29
+ `Currently supported: postgres, nile, cockroachdb, awsdsql`, { field: 'dialect', value: dialect });
30
+ case 'mariadb':
31
+ throw new relq_errors_1.RelqConfigError(`Dialect "mariadb" is not yet implemented. ` +
32
+ `Currently supported: postgres, nile, cockroachdb, awsdsql`, { field: 'dialect', value: dialect });
33
+ case 'planetscale':
34
+ throw new relq_errors_1.RelqConfigError(`Dialect "planetscale" is not yet implemented. ` +
35
+ `Currently supported: postgres, nile, cockroachdb, awsdsql`, { field: 'dialect', value: dialect });
36
+ case 'xata':
37
+ throw new relq_errors_1.RelqConfigError(`Dialect "xata" is not yet implemented. ` +
38
+ `Currently supported: postgres, nile, cockroachdb, awsdsql`, { field: 'dialect', value: dialect });
39
+ default:
40
+ throw new relq_errors_1.RelqConfigError(`Unknown dialect: "${dialect}". ` +
41
+ `Supported dialects: postgres, nile, cockroachdb, awsdsql, sqlite, turso, mysql, mariadb, planetscale, xata`, { field: 'dialect', value: dialect });
42
+ }
43
+ }
44
+ }
45
+ exports.Relq = RelqImpl;
46
+ var pg_client_2 = require("./pg-family/pg-client/index.cjs");
47
+ Object.defineProperty(exports, "RelqPostgres", { enumerable: true, get: function () { return pg_client_2.RelqPostgres; } });
48
+ var nile_client_2 = require("./pg-family/nile-client/index.cjs");
49
+ Object.defineProperty(exports, "RelqNile", { enumerable: true, get: function () { return nile_client_2.RelqNile; } });
50
+ var dsql_client_2 = require("./pg-family/dsql-client/index.cjs");
51
+ Object.defineProperty(exports, "RelqDsql", { enumerable: true, get: function () { return dsql_client_2.RelqDsql; } });
52
+ var cockroachdb_client_2 = require("./pg-family/cockroachdb-client/index.cjs");
53
+ Object.defineProperty(exports, "RelqCockroachDB", { enumerable: true, get: function () { return cockroachdb_client_2.RelqCockroachDB; } });
54
+ var relq_base_1 = require("./relq-base.cjs");
55
+ Object.defineProperty(exports, "RelqBase", { enumerable: true, get: function () { return relq_base_1.RelqBase; } });
56
+ exports.default = exports.Relq;
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.activeInstances = void 0;
7
+ exports.registerGlobalCleanupHandlers = registerGlobalCleanupHandlers;
8
+ exports.registerInstance = registerInstance;
9
+ exports.unregisterInstance = unregisterInstance;
10
+ const node_process_1 = __importDefault(require("node:process"));
11
+ exports.activeInstances = new Set();
12
+ let cleanupHandlersRegistered = false;
13
+ function registerGlobalCleanupHandlers() {
14
+ if (cleanupHandlersRegistered)
15
+ return;
16
+ if (typeof node_process_1.default === 'undefined' || !node_process_1.default.on)
17
+ return;
18
+ try {
19
+ if (typeof navigator !== 'undefined' && navigator.userAgent === 'Cloudflare-Workers')
20
+ return;
21
+ }
22
+ catch { }
23
+ node_process_1.default.on('beforeExit', async () => {
24
+ if (exports.activeInstances.size === 0)
25
+ return;
26
+ await Promise.all(Array.from(exports.activeInstances).map(instance => instance.close().catch(err => console.error('Error closing database connection:', err))));
27
+ });
28
+ cleanupHandlersRegistered = true;
29
+ }
30
+ function registerInstance(instance) {
31
+ exports.activeInstances.add(instance);
32
+ registerGlobalCleanupHandlers();
33
+ }
34
+ function unregisterInstance(instance) {
35
+ exports.activeInstances.delete(instance);
36
+ }
@@ -0,0 +1,97 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildColumnMappings = buildColumnMappings;
4
+ exports.transformToDbColumns = transformToDbColumns;
5
+ exports.transformFromDbColumns = transformFromDbColumns;
6
+ exports.transformResultsFromDb = transformResultsFromDb;
7
+ exports.hasColumnMapping = hasColumnMapping;
8
+ const type_coercion_1 = require("../../utils/type-coercion.cjs");
9
+ function buildColumnMappings(schema, mappings, debugLog) {
10
+ if (!schema || typeof schema !== 'object')
11
+ return;
12
+ const tables = schema.tables || schema;
13
+ for (const [tableName, tableDef] of Object.entries(tables)) {
14
+ if (!tableDef || typeof tableDef !== 'object')
15
+ continue;
16
+ const columns = tableDef.$columns;
17
+ if (!columns || typeof columns !== 'object')
18
+ continue;
19
+ const propToDb = new Map();
20
+ const dbToProp = new Map();
21
+ const propToType = new Map();
22
+ const propToCheckValues = new Map();
23
+ const propToValidate = new Map();
24
+ const propToFields = new Map();
25
+ for (const [propName, colDef] of Object.entries(columns)) {
26
+ const dbColName = colDef?.$columnName ?? propName;
27
+ const colType = colDef?.$sqlType || (typeof colDef?.$type === 'string' ? colDef.$type : undefined) || 'TEXT';
28
+ propToDb.set(propName, dbColName);
29
+ dbToProp.set(dbColName, propName);
30
+ propToType.set(propName, colType);
31
+ if (debugLog) {
32
+ debugLog(`buildColumnMappings: ${tableName}.${propName} -> type=${colType}, $validate=${!!colDef?.$validate}, $fields=${!!colDef?.$fields}, $checkValues=${!!colDef?.$checkValues}`);
33
+ }
34
+ if (colDef?.$checkValues && Array.isArray(colDef.$checkValues)) {
35
+ propToCheckValues.set(propName, colDef.$checkValues);
36
+ }
37
+ if (colDef?.$validate && typeof colDef.$validate === 'function') {
38
+ propToValidate.set(propName, colDef.$validate);
39
+ }
40
+ if (colDef?.$fields && typeof colDef.$fields === 'object') {
41
+ propToFields.set(propName, colDef.$fields);
42
+ }
43
+ }
44
+ const dbTableName = tableDef.$name ?? tableName;
45
+ mappings.set(dbTableName, {
46
+ propToDb,
47
+ dbToProp,
48
+ propToType,
49
+ propToCheckValues,
50
+ propToValidate,
51
+ propToFields
52
+ });
53
+ }
54
+ }
55
+ function transformToDbColumns(tableName, data, mappings) {
56
+ const mapping = mappings.get(tableName);
57
+ if (!mapping)
58
+ return data;
59
+ const result = {};
60
+ for (const [key, value] of Object.entries(data)) {
61
+ const dbColName = mapping.propToDb.get(key) ?? key;
62
+ const colType = mapping.propToType.get(key);
63
+ if (colType && typeof colType === 'string') {
64
+ result[dbColName] = (0, type_coercion_1.serializeValue)(value, colType);
65
+ }
66
+ else {
67
+ result[dbColName] = value;
68
+ }
69
+ }
70
+ return result;
71
+ }
72
+ function transformFromDbColumns(tableName, data, mappings) {
73
+ const mapping = mappings.get(tableName);
74
+ if (!mapping)
75
+ return data;
76
+ const result = {};
77
+ for (const [key, value] of Object.entries(data)) {
78
+ const propName = mapping.dbToProp.get(key) ?? key;
79
+ const colType = mapping.propToType.get(propName);
80
+ if (colType && typeof colType === 'string') {
81
+ result[propName] = (0, type_coercion_1.deserializeValue)(value, colType);
82
+ }
83
+ else {
84
+ result[propName] = value;
85
+ }
86
+ }
87
+ return result;
88
+ }
89
+ function transformResultsFromDb(tableName, rows, mappings) {
90
+ const mapping = mappings.get(tableName);
91
+ if (!mapping)
92
+ return rows;
93
+ return rows.map(row => transformFromDbColumns(tableName, row, mappings));
94
+ }
95
+ function hasColumnMapping(mappings) {
96
+ return mappings.size > 0;
97
+ }
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RelqDialectError = void 0;
4
+ const relq_errors_1 = require("../../../shared/errors/relq-errors.cjs");
5
+ class RelqDialectError extends relq_errors_1.RelqConfigError {
6
+ dialect;
7
+ suggestion;
8
+ constructor(message, dialect, suggestion) {
9
+ super(`${message}\n` +
10
+ ` Dialect: ${dialect}\n` +
11
+ (suggestion ? ` Suggestion: ${suggestion}` : ''));
12
+ this.name = 'RelqDialectError';
13
+ this.dialect = dialect;
14
+ this.suggestion = suggestion;
15
+ }
16
+ }
17
+ exports.RelqDialectError = RelqDialectError;
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.activeInstances = exports.unregisterInstance = exports.registerInstance = exports.createTableAccessor = exports.buildColumnTypeMap = exports.transformSerializeRow = exports.transformDeserializeRow = exports.validateComposite = exports.validateData = exports.hasColumnMapping = exports.transformResultsFromDb = exports.transformFromDbColumns = exports.transformToDbColumns = exports.buildColumnMappings = exports.RelqDialectError = void 0;
4
+ var errors_1 = require("./errors.cjs");
5
+ Object.defineProperty(exports, "RelqDialectError", { enumerable: true, get: function () { return errors_1.RelqDialectError; } });
6
+ var column_mapping_1 = require("./column-mapping.cjs");
7
+ Object.defineProperty(exports, "buildColumnMappings", { enumerable: true, get: function () { return column_mapping_1.buildColumnMappings; } });
8
+ Object.defineProperty(exports, "transformToDbColumns", { enumerable: true, get: function () { return column_mapping_1.transformToDbColumns; } });
9
+ Object.defineProperty(exports, "transformFromDbColumns", { enumerable: true, get: function () { return column_mapping_1.transformFromDbColumns; } });
10
+ Object.defineProperty(exports, "transformResultsFromDb", { enumerable: true, get: function () { return column_mapping_1.transformResultsFromDb; } });
11
+ Object.defineProperty(exports, "hasColumnMapping", { enumerable: true, get: function () { return column_mapping_1.hasColumnMapping; } });
12
+ var validation_1 = require("./validation.cjs");
13
+ Object.defineProperty(exports, "validateData", { enumerable: true, get: function () { return validation_1.validateData; } });
14
+ Object.defineProperty(exports, "validateComposite", { enumerable: true, get: function () { return validation_1.validateComposite; } });
15
+ var transform_1 = require("./transform.cjs");
16
+ Object.defineProperty(exports, "transformDeserializeRow", { enumerable: true, get: function () { return transform_1.deserializeRow; } });
17
+ Object.defineProperty(exports, "transformSerializeRow", { enumerable: true, get: function () { return transform_1.serializeRow; } });
18
+ Object.defineProperty(exports, "buildColumnTypeMap", { enumerable: true, get: function () { return transform_1.buildColumnTypeMap; } });
19
+ var table_accessor_1 = require("./table-accessor.cjs");
20
+ Object.defineProperty(exports, "createTableAccessor", { enumerable: true, get: function () { return table_accessor_1.createTableAccessor; } });
21
+ var cleanup_1 = require("./cleanup.cjs");
22
+ Object.defineProperty(exports, "registerInstance", { enumerable: true, get: function () { return cleanup_1.registerInstance; } });
23
+ Object.defineProperty(exports, "unregisterInstance", { enumerable: true, get: function () { return cleanup_1.unregisterInstance; } });
24
+ Object.defineProperty(exports, "activeInstances", { enumerable: true, get: function () { return cleanup_1.activeInstances; } });
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createTableAccessor = createTableAccessor;
4
+ const ConnectedQueryBuilder_1 = require("../helpers/ConnectedQueryBuilder.cjs");
5
+ function createTableAccessor(relq, schema) {
6
+ const tableFunction = (tableName) => {
7
+ return new ConnectedQueryBuilder_1.ConnectedQueryBuilder(tableName, relq);
8
+ };
9
+ return new Proxy(tableFunction, {
10
+ get(target, prop, receiver) {
11
+ if (prop in target) {
12
+ return Reflect.get(target, prop, receiver);
13
+ }
14
+ if (typeof prop === 'string' && schema && prop in schema) {
15
+ const tableDef = schema[prop];
16
+ const sqlTableName = tableDef?.$name || prop;
17
+ return new ConnectedQueryBuilder_1.ConnectedQueryBuilder(sqlTableName, relq, prop);
18
+ }
19
+ return undefined;
20
+ }
21
+ });
22
+ }
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.deserializeRow = deserializeRow;
4
+ exports.serializeRow = serializeRow;
5
+ exports.buildColumnTypeMap = buildColumnTypeMap;
6
+ function deserializeRow(row, columnTypes, coercion) {
7
+ const result = {};
8
+ for (const [key, value] of Object.entries(row)) {
9
+ const dbType = columnTypes.get(key);
10
+ result[key] = dbType ? coercion.deserializeValue(value, dbType) : value;
11
+ }
12
+ return result;
13
+ }
14
+ function serializeRow(row, columnTypes, coercion) {
15
+ const result = {};
16
+ for (const [key, value] of Object.entries(row)) {
17
+ const dbType = columnTypes.get(key);
18
+ result[key] = dbType ? coercion.serializeValue(value, dbType) : value;
19
+ }
20
+ return result;
21
+ }
22
+ function buildColumnTypeMap(tableDef) {
23
+ const typeMap = new Map();
24
+ const columns = tableDef.$columns || tableDef;
25
+ for (const [key, colDef] of Object.entries(columns)) {
26
+ if (colDef && typeof colDef === 'object') {
27
+ const col = colDef;
28
+ const sqlType = col.$sqlType || (typeof col.$type === 'string' ? col.$type : undefined);
29
+ if (sqlType) {
30
+ typeMap.set(key, sqlType);
31
+ }
32
+ }
33
+ }
34
+ return typeMap;
35
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });